@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
package/docs/codebase-summary.md
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
# PPM Codebase Summary
|
|
2
2
|
|
|
3
|
-
**Last Updated:** 2026-
|
|
4
|
-
**Version:** 0.
|
|
3
|
+
**Last Updated:** 2026-09-05
|
|
4
|
+
**Version:** 0.18.x
|
|
5
5
|
**Repository:** PPM (Project & Process Manager) — Multi-provider web IDE/project manager with Claude Agent SDK
|
|
6
6
|
|
|
7
7
|
**Core Statistics:**
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
- **
|
|
11
|
-
|
|
8
|
+
- **~1,300 tracked files** — 897 under `src/`, 379 under `tests/`, 24 under `packages/`
|
|
9
|
+
- **~2,600 passing tests** (run in Docker; the host Bun build segfaults on the suite)
|
|
10
|
+
- **Tech Stack:** Bun (runtime), Hono (HTTP), React (UI), Claude Agent SDK + Codex + Cursor (AI)
|
|
11
|
+
|
|
12
|
+
> Subsystem deep dives (multi-provider, extensions, ext-git-graph, slash-discovery) live in
|
|
13
|
+
> [codebase-subsystems.md](codebase-subsystems.md).
|
|
12
14
|
|
|
13
15
|
---
|
|
14
16
|
|
|
@@ -308,9 +310,8 @@ src/
|
|
|
308
310
|
│ └── web/ # Frontend bundle
|
|
309
311
|
├── node_modules/
|
|
310
312
|
├── .env.example # Environment template
|
|
311
|
-
├── ppm.yaml # Auto-generated project config
|
|
312
313
|
├── tsconfig.json # TS config (strict mode, path aliases)
|
|
313
|
-
├── vite.config.ts # Vite config (React, PWA, proxy to :
|
|
314
|
+
├── vite.config.ts # Vite config (React, PWA, proxy to dev server :8081)
|
|
314
315
|
├── tailwind.config.ts # Tailwind (dark mode, custom colors)
|
|
315
316
|
├── package.json # Dependencies
|
|
316
317
|
├── bunfig.toml # Bun config (root directory)
|
|
@@ -322,10 +323,10 @@ src/
|
|
|
322
323
|
### CLI Layer (src/cli/)
|
|
323
324
|
- **Responsibility:** Command-line interface for managing PPM
|
|
324
325
|
- **Key Functions:**
|
|
325
|
-
- `start` — Start
|
|
326
|
-
- `stop` — Stop
|
|
326
|
+
- `start` — Start the server as a supervised background daemon (the only mode); tunnel always enabled. Flags: `-p/--port`, `--profile`, deprecated `-s/--share`
|
|
327
|
+
- `stop` / `down` — Stop the server keeping the supervisor + tunnel alive / full shutdown (reads status.json, falls back to ppm.pid)
|
|
327
328
|
- `open` — Launch browser to active server
|
|
328
|
-
- `init` — Scan filesystem for git repos,
|
|
329
|
+
- `init` — Scan filesystem for git repos, write config to `~/.ppm/ppm.db`
|
|
329
330
|
- `projects` — Add/remove/list projects in config
|
|
330
331
|
- `config` — View/edit config values
|
|
331
332
|
- `git` — Run git operations on active project
|
|
@@ -347,8 +348,8 @@ src/
|
|
|
347
348
|
- **Responsibility:** Business logic, data operations, infrastructure (tunneling, database connections)
|
|
348
349
|
- **Services:**
|
|
349
350
|
- **ChatService** — Session lifecycle, message queueing, streaming
|
|
350
|
-
- **ConfigService** — Config
|
|
351
|
-
- **DbService** — SQLite persistence (
|
|
351
|
+
- **ConfigService** — Config in SQLite (dotted keys, typed cache)
|
|
352
|
+
- **DbService** — SQLite persistence (WAL mode, schema v41, connection/account CRUD, table cache)
|
|
352
353
|
- **AccountService** — Multi-account management, token encryption/decryption
|
|
353
354
|
- **AccountSelectorService** — Select active account based on config
|
|
354
355
|
- **GitService** — Git commands via simple-git
|
|
@@ -363,6 +364,23 @@ src/
|
|
|
363
364
|
- **SessionLogService** — Audit logs with sensitive data redaction
|
|
364
365
|
- **CloudflaredService** — Download/cache cloudflared binary (platform-aware)
|
|
365
366
|
- **TunnelService** — Spawn tunnel, extract URL, cleanup on exit
|
|
367
|
+
- **named-tunnel/** (ADDED) — Named-tunnel (stable custom-domain) setup + runtime, orchestrated from
|
|
368
|
+
the server, spawned/probed by the supervisor: `cloudflared-cert.ts` (parse-based `~/.cloudflared/cert.pem`
|
|
369
|
+
state, never a bare `existsSync`), `cloudflared-login.service.ts` (login session state machine —
|
|
370
|
+
60s slow banner, 5min kill, uncapped retry), `named-tunnel-setup.service.ts` (zone → precheck →
|
|
371
|
+
create → route → token → persist, background-confirmed via `retunnel`), `named-tunnel-args.ts`
|
|
372
|
+
(argv builders — run token via `--token-file` only, never argv), `named-tunnel-probe-state.ts`
|
|
373
|
+
(pure restart-once-then-warn decision function for the supervisor's health probe),
|
|
374
|
+
`hostname-rules.ts` (one label above the zone, no apex/`www`), `cloudflare-zone-api.ts` /
|
|
375
|
+
`cloudflare-dns-api.ts` (Cloudflare REST lookups for zone name + DNS collision precheck).
|
|
376
|
+
Routes: `src/server/routes/named-tunnel.ts` (`/api/tunnel/named/*`; mutations 403 unless PPM auth
|
|
377
|
+
is enabled). UI: `src/web/components/tunnels/named-tunnel/` (first-run popup + permanent Tunnel
|
|
378
|
+
Manager section, sharing one step-reducer-driven flow).
|
|
379
|
+
- **fs-credential-path-guard.ts** (ADDED) — Refuses `~/.cloudflared` (Cloudflare login cert)
|
|
380
|
+
alongside the PPM dir on every fs read/write/transfer door, symlink-resolved
|
|
381
|
+
- **config-secret-keys.ts** (ADDED) — Denylist + deep redaction for config-dump surfaces
|
|
382
|
+
(`ppm config get`, extension RPC `workspace:config:get`) — masks a secret leaf even when the
|
|
383
|
+
caller asked for an ancestor object (e.g. `get tunnel` still masks `namedTunnelToken`)
|
|
366
384
|
- **TableCacheService** — Cache table metadata across connections, search tables by name
|
|
367
385
|
- **DatabaseAdapterRegistry** — Register/retrieve DatabaseAdapter implementations (extensible pattern)
|
|
368
386
|
- **SQLiteAdapter** — SQLite connection/query execution with readonly checks
|
|
@@ -526,9 +544,9 @@ All tab routing and rendering components now include fallback guards for unknown
|
|
|
526
544
|
| hono | HTTP framework | 4.12.8 |
|
|
527
545
|
| simple-git | Git CLI wrapper | 3.33 |
|
|
528
546
|
| @monaco-editor/react | Code editor | 4.7.0 |
|
|
529
|
-
| xterm | Terminal emulator | 6.0 |
|
|
547
|
+
| @xterm/xterm | Terminal emulator | 6.1.0-beta.285 |
|
|
530
548
|
| zustand | State management | 5.0.11 |
|
|
531
|
-
| @anthropic-ai/claude-agent-sdk | AI provider | 0.
|
|
549
|
+
| @anthropic-ai/claude-agent-sdk | AI provider | 0.3.251 (pinned) |
|
|
532
550
|
| vite | Frontend bundler | 8.0 |
|
|
533
551
|
| tailwindcss | Utility CSS | 4.2 |
|
|
534
552
|
| radix-ui | Accessible components | 1.4.3 |
|
|
@@ -548,143 +566,6 @@ All tab routing and rendering components now include fallback guards for unknown
|
|
|
548
566
|
- PWA manifest, service worker
|
|
549
567
|
- Assets (~500KB gzipped)
|
|
550
568
|
|
|
551
|
-
## Multi-Provider Architecture (v0.8.60)
|
|
552
|
-
|
|
553
|
-
### Dynamic Model Listing Feature
|
|
554
|
-
|
|
555
|
-
**Problem:** Different AI providers expose different models. Claude has hardcoded models, but CLI-based providers (e.g., Cursor) discover models at runtime.
|
|
556
|
-
|
|
557
|
-
**Solution:** Optional `listModels()` method on `AIProvider` interface
|
|
558
|
-
|
|
559
|
-
### Provider Interface
|
|
560
|
-
|
|
561
|
-
```typescript
|
|
562
|
-
// src/types/chat.ts
|
|
563
|
-
export interface ModelOption {
|
|
564
|
-
value: string; // Model ID (e.g., "claude-fable-5")
|
|
565
|
-
label: string; // Display name (e.g., "Claude Fable 5 (flagship)")
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
interface AIProvider {
|
|
569
|
-
// Required methods
|
|
570
|
-
createSession(): Promise<Session>;
|
|
571
|
-
sendMessage(sessionId, message, context?): AsyncIterable<ChatEvent>;
|
|
572
|
-
|
|
573
|
-
// Optional methods
|
|
574
|
-
listModels?(): Promise<ModelOption[]>;
|
|
575
|
-
isAvailable?(): Promise<boolean>;
|
|
576
|
-
// ... (5 other optional methods)
|
|
577
|
-
}
|
|
578
|
-
```
|
|
579
|
-
|
|
580
|
-
### Provider Implementations
|
|
581
|
-
|
|
582
|
-
#### Claude (agent-sdk.ts)
|
|
583
|
-
- `listModels()` returns hardcoded models, power-sorted: Fable 5, Opus 4.8/4.7/4.6, Sonnet 4.6, Haiku 4.5
|
|
584
|
-
- Direct implementation (no subprocess)
|
|
585
|
-
|
|
586
|
-
#### Cursor (cursor-provider.ts)
|
|
587
|
-
- `listModels()` runs `cursor-agent --list-models` subprocess
|
|
588
|
-
- 5-minute TTL cache (prevents repeated subprocess calls)
|
|
589
|
-
- 10-second timeout (graceful fallback to empty list)
|
|
590
|
-
- Extends `CliProvider` abstract base
|
|
591
|
-
|
|
592
|
-
#### Mock (mock-provider.ts)
|
|
593
|
-
- For testing; returns canned models
|
|
594
|
-
|
|
595
|
-
### API Endpoints
|
|
596
|
-
|
|
597
|
-
**Global Models Endpoint** (`GET /api/settings/ai/providers/:id/models`)
|
|
598
|
-
```typescript
|
|
599
|
-
// Used in Settings UI (no project context needed)
|
|
600
|
-
settingsRoutes.get("/ai/providers/:id/models", async (c) => {
|
|
601
|
-
const provider = providerRegistry.get(c.req.param("id"));
|
|
602
|
-
const models = await provider.listModels?.() ?? [];
|
|
603
|
-
return c.json(ok(models));
|
|
604
|
-
});
|
|
605
|
-
```
|
|
606
|
-
|
|
607
|
-
**Project-Scoped Models Endpoint** (`GET /api/project/:name/chat/providers/:providerId/models`)
|
|
608
|
-
```typescript
|
|
609
|
-
// Used in Chat tab (scoped to project for consistency)
|
|
610
|
-
chatRoutes.get("/providers/:providerId/models", async (c) => {
|
|
611
|
-
const provider = providerRegistry.get(c.req.param("providerId"));
|
|
612
|
-
const models = await provider.listModels?.() ?? [];
|
|
613
|
-
return c.json(ok(models));
|
|
614
|
-
});
|
|
615
|
-
```
|
|
616
|
-
|
|
617
|
-
### Provider Registry Pattern
|
|
618
|
-
|
|
619
|
-
**list() — User-facing providers:**
|
|
620
|
-
```typescript
|
|
621
|
-
list(): ProviderInfo[] {
|
|
622
|
-
return [
|
|
623
|
-
{ id: "claude", name: "Claude" },
|
|
624
|
-
{ id: "cursor", name: "Cursor" }
|
|
625
|
-
// mock excluded
|
|
626
|
-
];
|
|
627
|
-
}
|
|
628
|
-
```
|
|
629
|
-
|
|
630
|
-
**listAll() — All providers (internal):**
|
|
631
|
-
```typescript
|
|
632
|
-
listAll(): ProviderInfo[] {
|
|
633
|
-
return [..., { id: "mock", name: "Mock" }];
|
|
634
|
-
}
|
|
635
|
-
```
|
|
636
|
-
|
|
637
|
-
**Auto-Bootstrap:**
|
|
638
|
-
```typescript
|
|
639
|
-
// On startup, detect CLI providers
|
|
640
|
-
async bootstrapProviders() {
|
|
641
|
-
const cursor = this.providers.get("cursor");
|
|
642
|
-
if (cursor && await cursor.isAvailable?.()) {
|
|
643
|
-
// Auto-create config entry if detected
|
|
644
|
-
// Save config (only if new)
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
```
|
|
648
|
-
|
|
649
|
-
### UI Components
|
|
650
|
-
|
|
651
|
-
#### AI Settings Section (ai-settings-section.tsx) — UPDATED
|
|
652
|
-
- Per-provider tabs (Claude, Cursor, etc.)
|
|
653
|
-
- Dynamic model dropdowns fetched from `/api/settings/ai/providers/:id/models`
|
|
654
|
-
- Fallback to hardcoded models if API call fails
|
|
655
|
-
- Provider-aware settings (SDK vs CLI options)
|
|
656
|
-
|
|
657
|
-
#### Chat History Bar (chat-history-bar.tsx) — ADDED
|
|
658
|
-
- Provider badges showing active provider for each session
|
|
659
|
-
- Provider-aware usage display:
|
|
660
|
-
- **Claude:** Full stats `(tokens_in:X, tokens_out:Y, cost: $Z)`
|
|
661
|
-
- **Other:** Context-only `(tokens: X)`
|
|
662
|
-
|
|
663
|
-
### Configuration
|
|
664
|
-
|
|
665
|
-
```yaml
|
|
666
|
-
ai:
|
|
667
|
-
default_provider: claude
|
|
668
|
-
providers:
|
|
669
|
-
claude:
|
|
670
|
-
type: agent-sdk
|
|
671
|
-
model: claude-opus-4-8 # default; see listModels() for full list
|
|
672
|
-
effort: high
|
|
673
|
-
max_turns: 100
|
|
674
|
-
cursor:
|
|
675
|
-
type: cli
|
|
676
|
-
model: cursor-fast # from listModels()
|
|
677
|
-
```
|
|
678
|
-
|
|
679
|
-
### Testing
|
|
680
|
-
|
|
681
|
-
**New Integration Tests (13 tests):**
|
|
682
|
-
- `provider-models-api.test.ts` — Model API endpoints
|
|
683
|
-
- `chat-service-multi-provider.test.ts` — Multi-provider flows
|
|
684
|
-
- `cursor-provider.test.ts` — Subprocess TTL cache, timeout handling
|
|
685
|
-
|
|
686
|
-
---
|
|
687
|
-
|
|
688
569
|
## Testing Strategy
|
|
689
570
|
|
|
690
571
|
| Test Type | Location | Coverage |
|
|
@@ -701,233 +582,6 @@ ai:
|
|
|
701
582
|
|
|
702
583
|
---
|
|
703
584
|
|
|
704
|
-
## Extension System (v0.9.0+)
|
|
705
|
-
|
|
706
|
-
### Core Architecture
|
|
707
|
-
|
|
708
|
-
**Installation Directory:** `~/.ppm/extensions/node_modules/`
|
|
709
|
-
**State Storage:** SQLite `extension_storage` table (globalState + workspaceState)
|
|
710
|
-
**Worker Isolation:** Bun Worker threads per activated extension
|
|
711
|
-
**RPC Protocol:** Typed request/response/event messaging
|
|
712
|
-
|
|
713
|
-
### New Files & Services
|
|
714
|
-
- `src/types/extension.ts` — ExtensionManifest, ExtensionContext, RpcMessage types
|
|
715
|
-
- `src/server/routes/extensions.ts` — REST API (GET/POST/DELETE/PATCH)
|
|
716
|
-
- `src/services/extension.service.ts` — Lifecycle, activation, state management (120 LOC)
|
|
717
|
-
- `src/services/extension-installer.ts` — npm install, symlink, removal (100 LOC)
|
|
718
|
-
- `src/services/extension-manifest.ts` — Parse + discover manifests (70 LOC)
|
|
719
|
-
- `src/services/extension-rpc.ts` — RPC channel implementation (120 LOC)
|
|
720
|
-
- `src/services/extension-host-worker.ts` — Worker-side extension loading (150 LOC)
|
|
721
|
-
- `src/services/contribution-registry.ts` — Central command/view/config registry (80 LOC)
|
|
722
|
-
- `src/cli/commands/ext-cmd.ts` — Extension CLI commands (121 LOC)
|
|
723
|
-
|
|
724
|
-
### Manifest Example (package.json)
|
|
725
|
-
```json
|
|
726
|
-
{
|
|
727
|
-
"name": "@ppm/ext-database",
|
|
728
|
-
"ppm": {
|
|
729
|
-
"displayName": "Database Browser",
|
|
730
|
-
"main": "dist/extension.js",
|
|
731
|
-
"activationEvents": ["onView:databases"],
|
|
732
|
-
"contributes": {
|
|
733
|
-
"commands": [{"command": "ppm.database.openConnection", "title": "..."}],
|
|
734
|
-
"views": {"explorer": [{"id": "databases", "name": "Databases"}]},
|
|
735
|
-
"configuration": {"properties": {"ppm.database.maxRows": {"type": "number"}}}
|
|
736
|
-
}
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
```
|
|
740
|
-
|
|
741
|
-
### REST API Endpoints
|
|
742
|
-
- `GET /api/extensions` — List installed
|
|
743
|
-
- `POST /api/extensions` — Install from npm
|
|
744
|
-
- `DELETE /api/extensions/:id` — Remove
|
|
745
|
-
- `PATCH /api/extensions/:id` — Enable/disable
|
|
746
|
-
- `GET /api/extensions/contributions` — List all contributions
|
|
747
|
-
|
|
748
|
-
### CLI Commands
|
|
749
|
-
```
|
|
750
|
-
ppm ext list # List extensions
|
|
751
|
-
ppm ext install @ppm/ext-db # Install
|
|
752
|
-
ppm ext remove @ppm/ext-db # Uninstall
|
|
753
|
-
ppm ext enable @ppm/ext-db # Enable
|
|
754
|
-
ppm ext disable @ppm/ext-db # Disable
|
|
755
|
-
ppm ext dev /path/to/src # Dev symlink
|
|
756
|
-
```
|
|
757
|
-
|
|
758
|
-
### Bundled Extensions (v0.9.85+)
|
|
759
|
-
|
|
760
|
-
PPM ships with pre-built extensions in `packages/ext-*` that are auto-discovered and available out-of-the-box:
|
|
761
|
-
|
|
762
|
-
**Discovery:**
|
|
763
|
-
- `discoverBundledManifests()` scans `packages/` for directories matching `ext-*`
|
|
764
|
-
- Bundled extensions loaded during `discover()` before user-installed extensions
|
|
765
|
-
- User-installed extensions override bundled if same ID (user takes precedence)
|
|
766
|
-
|
|
767
|
-
**Behavior:**
|
|
768
|
-
- `ppm ext list` shows "Source" column: `bundled` (cyan) vs `user`
|
|
769
|
-
- Bundled extensions cannot be removed (`ppm ext remove` rejected with helpful message)
|
|
770
|
-
- Use `ppm ext disable` to turn off bundled extensions
|
|
771
|
-
- Removal protection prevents accidental deletion of core extensions
|
|
772
|
-
|
|
773
|
-
**Current Bundled Extensions:**
|
|
774
|
-
- `@ppm/ext-git-graph` — Interactive git history visualization with workflow actions
|
|
775
|
-
|
|
776
|
-
**Architecture:**
|
|
777
|
-
- Extension paths tracked in `extensionService.extensionPaths` (ID → directory)
|
|
778
|
-
- Bundled IDs tracked in `extensionService.bundledIds` Set
|
|
779
|
-
- `isBundled(id)` public method for checking extension source
|
|
780
|
-
|
|
781
|
-
---
|
|
782
|
-
|
|
783
|
-
## ext-git-graph Extension (Git History Visualization)
|
|
784
|
-
|
|
785
|
-
### Overview
|
|
786
|
-
The git-graph extension provides an interactive SVG visualization of repository commit history with comprehensive git workflow support. Implements the vscode-git-graph deterministic layout algorithm with faithful branch path rendering.
|
|
787
|
-
|
|
788
|
-
### Key Features
|
|
789
|
-
|
|
790
|
-
**Graph Visualization:**
|
|
791
|
-
- Single SVG model with continuous Bézier branch paths for smooth merge visualization
|
|
792
|
-
- Deterministic lane assignment algorithm with greedy color reuse for branch lanes
|
|
793
|
-
- Shadow lines for visual depth and branch continuity
|
|
794
|
-
- Proper HEAD/stash node rendering (hollow circle for HEAD, nested circles for stash)
|
|
795
|
-
- Mobile SVG alignment: gridY matches 44px CSS row height for responsive layouts
|
|
796
|
-
|
|
797
|
-
**Git Workflow Actions:**
|
|
798
|
-
- **File Operations:** Stage/unstage files, open in editor, discard changes
|
|
799
|
-
- **Commits:** Create commits directly from webview with message and file selection
|
|
800
|
-
- **Branch Operations:** Stash/reset/clean with context menu and safety warnings
|
|
801
|
-
- **Repository:** Auto-fetch with configurable interval, manual fetch button
|
|
802
|
-
- **Filters:** Branch/tag/remote filters, tree/list view toggle
|
|
803
|
-
|
|
804
|
-
**UI Components:**
|
|
805
|
-
- Resizable graph column for flexible workspace adjustment
|
|
806
|
-
- Branch filter dropdown for quick navigation
|
|
807
|
-
- Tree/list view toggle for different visualization modes
|
|
808
|
-
- Commit detail panel with file diffs and action buttons
|
|
809
|
-
- Context menus with destructive operation warnings
|
|
810
|
-
|
|
811
|
-
### Architecture
|
|
812
|
-
|
|
813
|
-
**Location:** `packages/ext-git-graph/`
|
|
814
|
-
|
|
815
|
-
**Files:**
|
|
816
|
-
- `extension.ts` (370 LOC) — RPC handlers, git operations, settings management
|
|
817
|
-
- `webview-html.ts` (443 additions) — Faithful SVG graph rendering with deterministic layout
|
|
818
|
-
- `types.ts` — Extension settings, message types, git operation definitions
|
|
819
|
-
- `git-log-parser.ts` — Parse git log with branches, tags, remotes, stashes
|
|
820
|
-
- `extension.test.ts` (230+ lines) — Integration tests for RPC handlers
|
|
821
|
-
- `webview-html.test.ts` — Graph rendering and layout tests
|
|
822
|
-
|
|
823
|
-
**RPC Protocol:**
|
|
824
|
-
- `gitStatus()` — Get current repo state
|
|
825
|
-
- `gitLog()` — Fetch commit history
|
|
826
|
-
- `stage(path)` / `unstage(path)` — File staging
|
|
827
|
-
- `commit(message, files)` — Create commit
|
|
828
|
-
- `stash()` / `reset(ref)` / `clean()` — Branch operations
|
|
829
|
-
- `openFile(path)` — Open in editor (IPC to main window)
|
|
830
|
-
|
|
831
|
-
**Settings:**
|
|
832
|
-
- `autoFetchInterval: number` — Seconds between auto-fetches (0 = disabled)
|
|
833
|
-
|
|
834
|
-
### Security
|
|
835
|
-
|
|
836
|
-
**Path Validation:**
|
|
837
|
-
- `assertSafePath()` in extension-rpc-handlers ensures git operations only on registered project paths
|
|
838
|
-
- Prevents directory traversal attacks
|
|
839
|
-
- Cross-project workspace safety via RPC sandboxing
|
|
840
|
-
|
|
841
|
-
**XSS Prevention:**
|
|
842
|
-
- `escHtml()` applied to parent hashes and file status in detail panel
|
|
843
|
-
- Sanitized commit messages and metadata display
|
|
844
|
-
|
|
845
|
-
### Mobile & Responsive
|
|
846
|
-
|
|
847
|
-
- Long-press support for context menus on touch devices
|
|
848
|
-
- Responsive CSS with flexible column sizing
|
|
849
|
-
- Dark/light theme support via CSS variables
|
|
850
|
-
- Touch-friendly button sizing (44px minimum)
|
|
851
|
-
|
|
852
|
-
### Testing
|
|
853
|
-
|
|
854
|
-
**62 unit tests** covering:
|
|
855
|
-
- Git log parsing (commits, branches, tags, stashes)
|
|
856
|
-
- Parser edge cases (merge commits, rebases, detached HEAD)
|
|
857
|
-
- RPC handler validation and error cases
|
|
858
|
-
- Webview HTML rendering and layout algorithms
|
|
859
|
-
- Integration with main extension lifecycle
|
|
860
|
-
|
|
861
|
-
---
|
|
862
|
-
|
|
863
|
-
## Slash-Discovery Module (Modular Command Engine)
|
|
864
|
-
|
|
865
|
-
### Overview
|
|
866
|
-
Modular discovery engine for slash commands and skills. Replaces monolithic `slash-items.service.ts` with composable, testable modules. Supports:
|
|
867
|
-
- Skill roots: user-global (`~/.claude/skills/`), env vars, bundled assets
|
|
868
|
-
- SKILL.md parsing + loose `.md` files + command registry
|
|
869
|
-
- Shadowing resolution (project > user > bundled)
|
|
870
|
-
- Fuzzy search via Levenshtein distance
|
|
871
|
-
- Built-in commands (9 commands: /skills, /version, /help, etc.)
|
|
872
|
-
- Server-side + client-side search
|
|
873
|
-
|
|
874
|
-
### Architecture
|
|
875
|
-
**Location:** `src/services/slash-discovery/`
|
|
876
|
-
|
|
877
|
-
**Core Modules:**
|
|
878
|
-
- `types.ts` — DefinitionSource, SkillRoot, SlashItem, DiscoveryResult
|
|
879
|
-
- `definition-source.ts` — Priority ranking (project > user > bundled), scope mapping
|
|
880
|
-
- `discover-skill-roots.ts` — Ancestor walking, env var expansion, root discovery
|
|
881
|
-
- `skill-loader.ts` — SKILL.md extraction, loose .md + commands parsing
|
|
882
|
-
- `resolve-overrides.ts` — Shadowing resolution logic
|
|
883
|
-
- `fuzzy-search.ts` — Levenshtein-based matching with configurable threshold
|
|
884
|
-
- `builtin-commands.ts` — 9 built-in commands + descriptions
|
|
885
|
-
- `builtin-handlers.ts` — PPM-side handlers (/skills list, /version)
|
|
886
|
-
- `index.ts` — Main pipeline, exports
|
|
887
|
-
|
|
888
|
-
### Key Features
|
|
889
|
-
**Skill Discovery:**
|
|
890
|
-
```
|
|
891
|
-
~/.claude/skills/ppm-guide/SKILL.md → Parse [ppm-guide] commands
|
|
892
|
-
$CLAUDE_SKILLS_PATH/custom/ → Env-var roots
|
|
893
|
-
assets/skills/bundled/ → Built-in (ppm-guide)
|
|
894
|
-
```
|
|
895
|
-
|
|
896
|
-
**Shadowing Resolution:**
|
|
897
|
-
- Project-level overrides user-level overrides bundled defaults
|
|
898
|
-
- Prevents duplicate entries, maintains priority order
|
|
899
|
-
|
|
900
|
-
**Fuzzy Matching:**
|
|
901
|
-
- Levenshtein distance algorithm
|
|
902
|
-
- Configurable tolerance for typo handling
|
|
903
|
-
- Powers `/skills search <query>`
|
|
904
|
-
|
|
905
|
-
### API & CLI
|
|
906
|
-
|
|
907
|
-
**REST API:**
|
|
908
|
-
- `GET /chat/slash-items?q=<query>` — Optional server-side fuzzy search
|
|
909
|
-
- Response includes `type: "builtin"` items
|
|
910
|
-
|
|
911
|
-
**CLI Commands:**
|
|
912
|
-
```
|
|
913
|
-
ppm skills list # List discovered skills with source info
|
|
914
|
-
ppm skills search <query> # Fuzzy search skills
|
|
915
|
-
ppm skills info <name> # Detail view (name, description, source)
|
|
916
|
-
ppm skills --json # Machine-readable output
|
|
917
|
-
ppm skills --project <path> # Custom project scope
|
|
918
|
-
```
|
|
919
|
-
|
|
920
|
-
**WebSocket Interception:**
|
|
921
|
-
- Messages starting with `/skills` or `/version` intercepted by PPM before SDK
|
|
922
|
-
- Builtin handlers execute locally, reducing SDK subprocess overhead
|
|
923
|
-
|
|
924
|
-
### Bundled Guide Skill
|
|
925
|
-
- `assets/skills/ppm-guide/SKILL.md` — Auto-generated from `docs/`
|
|
926
|
-
- `scripts/generate-ppm-guide.ts` — Generator script
|
|
927
|
-
- `bun run generate:guide` — npm script to regenerate
|
|
928
|
-
|
|
929
|
-
---
|
|
930
|
-
|
|
931
585
|
## Recent Changes (v0.9.0+)
|
|
932
586
|
|
|
933
587
|
### v0.9.11 (PPMBot Coordinator Redesign)
|
|
@@ -992,3 +646,4 @@ ppm skills --project <path> # Custom project scope
|
|
|
992
646
|
|
|
993
647
|
---
|
|
994
648
|
|
|
649
|
+
|