@hienlh/ppm 0.23.12 → 0.23.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +186 -0
- package/CLAUDE.md +41 -6
- package/THIRD-PARTY-NOTICES.md +2 -2
- package/assets/skills/ppm/SKILL.md +5 -4
- package/assets/skills/ppm/references/cli-reference.md +34 -8
- package/assets/skills/ppm/references/common-tasks.md +8 -4
- package/assets/skills/ppm/references/http-api.md +65 -17
- package/bun.lock +53 -41
- package/dist/web/assets/_basePickBy-CPcPjurU.js +1 -0
- package/dist/web/assets/_basePickBy-CPcPjurU.js.br +0 -0
- package/dist/web/assets/_basePickBy-CPcPjurU.js.gz +0 -0
- package/dist/web/assets/_baseUniq-DI0z-mx3.js +1 -0
- package/dist/web/assets/_baseUniq-DI0z-mx3.js.br +0 -0
- package/dist/web/assets/_baseUniq-DI0z-mx3.js.gz +0 -0
- package/dist/web/assets/accounts-settings-section-DU-lTifs.js +1 -0
- package/dist/web/assets/accounts-settings-section-DU-lTifs.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-DU-lTifs.js.gz +0 -0
- package/dist/web/assets/adaptive-context-menu-Cq7ynvIn.js +1 -0
- package/dist/web/assets/adaptive-context-menu-Cq7ynvIn.js.br +0 -0
- package/dist/web/assets/adaptive-context-menu-Cq7ynvIn.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-At6Rt-Yf.js +2 -0
- package/dist/web/assets/agent-session-sheet-At6Rt-Yf.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-At6Rt-Yf.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-store-BoBrAw5i.js +1 -0
- package/dist/web/assets/agent-session-window-content-CB_uvabH.js +1 -0
- package/dist/web/assets/agent-session-window-content-CB_uvabH.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-CB_uvabH.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-Czearm3I.js +1 -0
- package/dist/web/assets/ai-resource-editor-Czearm3I.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-Czearm3I.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-AOgAUCgH.js +1 -0
- package/dist/web/assets/ai-settings-section-B_OFMlrt.js +1 -0
- package/dist/web/assets/ai-settings-section-B_OFMlrt.js.br +0 -0
- package/dist/web/assets/ai-settings-section-B_OFMlrt.js.gz +0 -0
- package/dist/web/assets/android-tab-L7DmLfHG.js +2 -0
- package/dist/web/assets/android-tab-L7DmLfHG.js.br +0 -0
- package/dist/web/assets/android-tab-L7DmLfHG.js.gz +0 -0
- package/dist/web/assets/angular-html-DUhpSne7.js +1 -0
- package/dist/web/assets/angular-html-DUhpSne7.js.br +0 -0
- package/dist/web/assets/angular-html-DUhpSne7.js.gz +0 -0
- package/dist/web/assets/angular-ts-_PmhBAvx.js +1 -0
- package/dist/web/assets/angular-ts-_PmhBAvx.js.br +0 -0
- package/dist/web/assets/angular-ts-_PmhBAvx.js.gz +0 -0
- package/dist/web/assets/api-client-DAQfiXg0.js +1 -0
- package/dist/web/assets/api-client-OiA8Ida1.js +1 -0
- package/dist/web/assets/api-client-OiA8Ida1.js.br +0 -0
- package/dist/web/assets/api-client-OiA8Ida1.js.gz +0 -0
- package/dist/web/assets/api-settings-D2H6gjen.js +1 -0
- package/dist/web/assets/api-settings-D2H6gjen.js.br +0 -0
- package/dist/web/assets/api-settings-D2H6gjen.js.gz +0 -0
- package/dist/web/assets/api-settings-DHhcUHtx.js +1 -0
- package/dist/web/assets/api-themes-CE8gPZ3X.js +1 -0
- package/dist/web/assets/apl-Qu0ab_nv.js +1 -0
- package/dist/web/assets/apl-Qu0ab_nv.js.br +0 -0
- package/dist/web/assets/apl-Qu0ab_nv.js.gz +0 -0
- package/dist/web/assets/appearance-settings-section-s3KWKTBm.js +1 -0
- package/dist/web/assets/appearance-settings-section-s3KWKTBm.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-s3KWKTBm.js.gz +0 -0
- package/dist/web/assets/apps-panel-DaojtUvh.js +1 -0
- package/dist/web/assets/apps-panel-DaojtUvh.js.br +0 -0
- package/dist/web/assets/apps-panel-DaojtUvh.js.gz +0 -0
- package/dist/web/assets/arc-Cbj2MTZU.js +1 -0
- package/dist/web/assets/arc-Cbj2MTZU.js.br +0 -0
- package/dist/web/assets/arc-Cbj2MTZU.js.gz +0 -0
- package/dist/web/assets/architecture-PBZL5I3N-BsjZHebV.js +1 -0
- package/dist/web/assets/architectureDiagram-2XIMDMQ5-B5N-uzUB.js +36 -0
- package/dist/web/assets/architectureDiagram-2XIMDMQ5-B5N-uzUB.js.br +0 -0
- package/dist/web/assets/architectureDiagram-2XIMDMQ5-B5N-uzUB.js.gz +0 -0
- package/dist/web/assets/astro-6xSNo-2E.js +1 -0
- package/dist/web/assets/astro-6xSNo-2E.js.br +0 -0
- package/dist/web/assets/astro-6xSNo-2E.js.gz +0 -0
- package/dist/web/assets/audio-preview-CWcPZqTA.js +1 -0
- package/dist/web/assets/audio-preview-CWcPZqTA.js.br +4 -0
- package/dist/web/assets/audio-preview-CWcPZqTA.js.gz +0 -0
- package/dist/web/assets/blade-p7SMjkdK.js +1 -0
- package/dist/web/assets/blade-p7SMjkdK.js.br +0 -0
- package/dist/web/assets/blade-p7SMjkdK.js.gz +0 -0
- package/dist/web/assets/blockDiagram-WCTKOSBZ-CNZJl-ap.js +132 -0
- package/dist/web/assets/blockDiagram-WCTKOSBZ-CNZJl-ap.js.br +0 -0
- package/dist/web/assets/blockDiagram-WCTKOSBZ-CNZJl-ap.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-9UB4ccpF.js +1 -0
- package/dist/web/assets/branch-review-tab-9UB4ccpF.js.br +0 -0
- package/dist/web/assets/branch-review-tab-9UB4ccpF.js.gz +0 -0
- package/dist/web/assets/bsl-D0bT3Wjp.js +1 -0
- package/dist/web/assets/bsl-D0bT3Wjp.js.br +0 -0
- package/dist/web/assets/bsl-D0bT3Wjp.js.gz +0 -0
- package/dist/web/assets/button-Br60hGkw.js +1 -0
- package/dist/web/assets/button-Br60hGkw.js.br +0 -0
- package/dist/web/assets/button-Br60hGkw.js.gz +0 -0
- package/dist/web/assets/c4Diagram-IC4MRINW-hDrfu-4_.js +10 -0
- package/dist/web/assets/c4Diagram-IC4MRINW-hDrfu-4_.js.br +0 -0
- package/dist/web/assets/c4Diagram-IC4MRINW-hDrfu-4_.js.gz +0 -0
- package/dist/web/assets/cairo-DTuGb2w7.js +1 -0
- package/dist/web/assets/cairo-DTuGb2w7.js.br +0 -0
- package/dist/web/assets/cairo-DTuGb2w7.js.gz +0 -0
- package/dist/web/assets/channel-BYWG7Wl4.js +1 -0
- package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js +1 -0
- package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js.br +0 -0
- package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js.gz +0 -0
- package/dist/web/assets/chat-tab-DMVb_mgx.js +1 -0
- package/dist/web/assets/chat-tab-DMVb_mgx.js.br +0 -0
- package/dist/web/assets/chat-tab-DMVb_mgx.js.gz +0 -0
- package/dist/web/assets/chat-tab-s7uAnh-h.js +17 -0
- package/dist/web/assets/chat-tab-s7uAnh-h.js.br +0 -0
- package/dist/web/assets/chat-tab-s7uAnh-h.js.gz +0 -0
- package/dist/web/assets/chunk-4BX2VUAB-hVAt6yvs.js +1 -0
- package/dist/web/assets/chunk-55IACEB6-C01pkYAe.js +1 -0
- package/dist/web/assets/chunk-7E7YKBS2-DzI9lMJG.js +1 -0
- package/dist/web/assets/chunk-7R4GIKGN-vQspoIwd.js +80 -0
- package/dist/web/assets/chunk-7R4GIKGN-vQspoIwd.js.br +0 -0
- package/dist/web/assets/chunk-7R4GIKGN-vQspoIwd.js.gz +0 -0
- package/dist/web/assets/chunk-C72U2L5F-B6xz3XVo.js +1 -0
- package/dist/web/assets/chunk-EGIJ26TM-piMHBD4l.js +1 -0
- package/dist/web/assets/chunk-FMBD7UC4-e6MPEMRh.js +15 -0
- package/dist/web/assets/chunk-GEFDOKGD-DnsnpeGb.js +2 -0
- package/dist/web/assets/chunk-GEFDOKGD-DnsnpeGb.js.br +0 -0
- package/dist/web/assets/chunk-GEFDOKGD-DnsnpeGb.js.gz +0 -0
- package/dist/web/assets/chunk-GLR3WWYH-Co8QL50g.js +2 -0
- package/dist/web/assets/chunk-GLR3WWYH-Co8QL50g.js.br +0 -0
- package/dist/web/assets/chunk-GLR3WWYH-Co8QL50g.js.gz +0 -0
- package/dist/web/assets/chunk-HHEYEP7N-CErk3LHZ.js +1 -0
- package/dist/web/assets/chunk-JSJVCQXG-B8pwPgsI.js +1 -0
- package/dist/web/assets/chunk-JSJVCQXG-B8pwPgsI.js.br +0 -0
- package/dist/web/assets/chunk-JSJVCQXG-B8pwPgsI.js.gz +0 -0
- package/dist/web/assets/chunk-KX2RTZJC-DeYfi-Vl.js +1 -0
- package/dist/web/assets/chunk-KYZI473N-B6LAvX90.js +53 -0
- package/dist/web/assets/chunk-KYZI473N-B6LAvX90.js.br +0 -0
- package/dist/web/assets/chunk-KYZI473N-B6LAvX90.js.gz +0 -0
- package/dist/web/assets/chunk-L3YUKLVL-BM-EQ2IR.js +1 -0
- package/dist/web/assets/chunk-MX3YWQON-EGGLXe7u.js +1 -0
- package/dist/web/assets/chunk-MX3YWQON-EGGLXe7u.js.br +0 -0
- package/dist/web/assets/chunk-MX3YWQON-EGGLXe7u.js.gz +0 -0
- package/dist/web/assets/chunk-NQ4KR5QH-BHn5FEPA.js +220 -0
- package/dist/web/assets/chunk-NQ4KR5QH-BHn5FEPA.js.br +0 -0
- package/dist/web/assets/chunk-NQ4KR5QH-BHn5FEPA.js.gz +0 -0
- package/dist/web/assets/chunk-O4XLMI2P-DeFJl-l6.js +7 -0
- package/dist/web/assets/chunk-O4XLMI2P-DeFJl-l6.js.br +0 -0
- package/dist/web/assets/chunk-O4XLMI2P-DeFJl-l6.js.gz +0 -0
- package/dist/web/assets/chunk-OZEHJAEY-BwMHWpJ8.js +1 -0
- package/dist/web/assets/chunk-OZEHJAEY-BwMHWpJ8.js.br +0 -0
- package/dist/web/assets/chunk-OZEHJAEY-BwMHWpJ8.js.gz +0 -0
- package/dist/web/assets/chunk-PQ6SQG4A-B9GHRcOM.js +1 -0
- package/dist/web/assets/chunk-PQ6SQG4A-B9GHRcOM.js.br +0 -0
- package/dist/web/assets/chunk-PQ6SQG4A-B9GHRcOM.js.gz +0 -0
- package/dist/web/assets/chunk-PU5JKC2W-DJY3yjhJ.js +11 -0
- package/dist/web/assets/chunk-PU5JKC2W-DJY3yjhJ.js.br +0 -0
- package/dist/web/assets/chunk-PU5JKC2W-DJY3yjhJ.js.gz +0 -0
- package/dist/web/assets/chunk-QZHKN3VN--KxlfM05.js +1 -0
- package/dist/web/assets/chunk-R5LLSJPH-B8fEAHWI.js +1 -0
- package/dist/web/assets/chunk-WL4C6EOR-CTOYdnLV.js +189 -0
- package/dist/web/assets/chunk-WL4C6EOR-CTOYdnLV.js.br +0 -0
- package/dist/web/assets/chunk-WL4C6EOR-CTOYdnLV.js.gz +0 -0
- package/dist/web/assets/chunk-XIRO2GV7-CzjzQGr1.js +1 -0
- package/dist/web/assets/chunk-XPW4576I-CYBtYKPi.js +32 -0
- package/dist/web/assets/chunk-XPW4576I-CYBtYKPi.js.br +0 -0
- package/dist/web/assets/chunk-XPW4576I-CYBtYKPi.js.gz +0 -0
- package/dist/web/assets/chunk-XZSTWKYB-CkPHeT47.js +94 -0
- package/dist/web/assets/chunk-XZSTWKYB-CkPHeT47.js.br +0 -0
- package/dist/web/assets/chunk-XZSTWKYB-CkPHeT47.js.gz +0 -0
- package/dist/web/assets/chunk-YBOYWFTD-DVV5zPYi.js +1 -0
- package/dist/web/assets/classDiagram-VBA2DB6C-fXft2ivd.js +1 -0
- package/dist/web/assets/classDiagram-v2-RAHNMMFH-3Pc0szA4.js +1 -0
- package/dist/web/assets/clipboard-D3XnL7CB.js +1 -0
- package/dist/web/assets/clipboard-D3XnL7CB.js.br +0 -0
- package/dist/web/assets/clipboard-D3XnL7CB.js.gz +0 -0
- package/dist/web/assets/clone-BbqYojVU.js +1 -0
- package/dist/web/assets/cobol-N66t9bre.js +1 -0
- package/dist/web/assets/cobol-N66t9bre.js.br +0 -0
- package/dist/web/assets/cobol-N66t9bre.js.gz +0 -0
- package/dist/web/assets/code-editor-JK49X9EX.js +10 -0
- package/dist/web/assets/code-editor-JK49X9EX.js.br +0 -0
- package/dist/web/assets/code-editor-JK49X9EX.js.gz +0 -0
- package/dist/web/assets/code-fence-vHZyBehL.js +1 -0
- package/dist/web/assets/codex-reset-credit-button-CxJsBnff.js +1 -0
- package/dist/web/assets/codex-reset-credit-button-CxJsBnff.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-CxJsBnff.js.gz +0 -0
- package/dist/web/assets/coffee-DH4EPzT2.js +1 -0
- package/dist/web/assets/coffee-DH4EPzT2.js.br +0 -0
- package/dist/web/assets/coffee-DH4EPzT2.js.gz +0 -0
- package/dist/web/assets/conflict-editor-rOpVkK9P.js +19 -0
- package/dist/web/assets/conflict-editor-rOpVkK9P.js.br +0 -0
- package/dist/web/assets/conflict-editor-rOpVkK9P.js.gz +0 -0
- package/dist/web/assets/connection-form-tab-BGmb918E.js +4 -0
- package/dist/web/assets/connection-form-tab-BGmb918E.js.br +0 -0
- package/dist/web/assets/connection-form-tab-BGmb918E.js.gz +0 -0
- package/dist/web/assets/context-menu-BoQ6lxte.js +1 -0
- package/dist/web/assets/context-menu-BoQ6lxte.js.br +0 -0
- package/dist/web/assets/context-menu-BoQ6lxte.js.gz +0 -0
- package/dist/web/assets/cose-bilkent-S5V4N54A-mB8HA52z.js +1 -0
- package/dist/web/assets/cose-bilkent-S5V4N54A-mB8HA52z.js.br +0 -0
- package/dist/web/assets/cose-bilkent-S5V4N54A-mB8HA52z.js.gz +0 -0
- package/dist/web/assets/cpp-D9qUQN_l.js +1 -0
- package/dist/web/assets/cpp-D9qUQN_l.js.br +0 -0
- package/dist/web/assets/cpp-D9qUQN_l.js.gz +0 -0
- package/dist/web/assets/crystal-BbeV_Mwx.js +1 -0
- package/dist/web/assets/crystal-BbeV_Mwx.js.br +0 -0
- package/dist/web/assets/crystal-BbeV_Mwx.js.gz +0 -0
- package/dist/web/assets/csv-preview-CM7su92m.js +10 -0
- package/dist/web/assets/csv-preview-CM7su92m.js.br +0 -0
- package/dist/web/assets/csv-preview-CM7su92m.js.gz +0 -0
- package/dist/web/assets/dagre-DCmRVAkd.js +1 -0
- package/dist/web/assets/dagre-DCmRVAkd.js.br +0 -0
- package/dist/web/assets/dagre-DCmRVAkd.js.gz +0 -0
- package/dist/web/assets/dagre-KLK3FWXG-BbiZfyLJ.js +4 -0
- package/dist/web/assets/dagre-KLK3FWXG-BbiZfyLJ.js.br +0 -0
- package/dist/web/assets/dagre-KLK3FWXG-BbiZfyLJ.js.gz +0 -0
- package/dist/web/assets/database-drivers-section-C6ZKPWaE.js +1 -0
- package/dist/web/assets/database-drivers-section-C6ZKPWaE.js.br +0 -0
- package/dist/web/assets/database-drivers-section-C6ZKPWaE.js.gz +0 -0
- package/dist/web/assets/db-explorer-store-BcLxq-X0.js +1 -0
- package/dist/web/assets/db-explorer-store-BcLxq-X0.js.br +0 -0
- package/dist/web/assets/db-explorer-store-BcLxq-X0.js.gz +0 -0
- package/dist/web/assets/db-tab-parts-DvmnlA6V.js +1 -0
- package/dist/web/assets/db-tab-parts-DvmnlA6V.js.br +0 -0
- package/dist/web/assets/db-tab-parts-DvmnlA6V.js.gz +0 -0
- package/dist/web/assets/db-types-9ac-eYxf.js +1 -0
- package/dist/web/assets/db-types-9ac-eYxf.js.br +0 -0
- package/dist/web/assets/db-types-9ac-eYxf.js.gz +0 -0
- package/dist/web/assets/design-canvas-check-Bo76Q6Qr.js +1 -0
- package/dist/web/assets/design-canvas-check-Bo76Q6Qr.js.br +0 -0
- package/dist/web/assets/design-canvas-check-Bo76Q6Qr.js.gz +0 -0
- package/dist/web/assets/design-export-client-ClwRg798.js +1 -0
- package/dist/web/assets/design-export-client-ClwRg798.js.br +0 -0
- package/dist/web/assets/design-export-client-ClwRg798.js.gz +0 -0
- package/dist/web/assets/design-responsive-dialog-Cdccv3Nw.js +1 -0
- package/dist/web/assets/design-responsive-dialog-Cdccv3Nw.js.br +0 -0
- package/dist/web/assets/design-responsive-dialog-Cdccv3Nw.js.gz +0 -0
- package/dist/web/assets/design-settings-section-CuxZSLAr.js +2 -0
- package/dist/web/assets/design-settings-section-CuxZSLAr.js.br +0 -0
- package/dist/web/assets/design-settings-section-CuxZSLAr.js.gz +0 -0
- package/dist/web/assets/design-skill-suggestion-DZQjG8FV.js +3 -0
- package/dist/web/assets/design-skill-suggestion-DZQjG8FV.js.br +0 -0
- package/dist/web/assets/design-skill-suggestion-DZQjG8FV.js.gz +0 -0
- package/dist/web/assets/design-tab-JlKmHVkd.js +57 -0
- package/dist/web/assets/design-tab-JlKmHVkd.js.br +0 -0
- package/dist/web/assets/design-tab-JlKmHVkd.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-C1EwWf4Z.js +1 -0
- package/dist/web/assets/designs-sidebar-panel-C1EwWf4Z.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-C1EwWf4Z.js.gz +0 -0
- package/dist/web/assets/diagram-E7M64L7V-DqWzOwQy.js +24 -0
- package/dist/web/assets/diagram-E7M64L7V-DqWzOwQy.js.br +0 -0
- package/dist/web/assets/diagram-E7M64L7V-DqWzOwQy.js.gz +0 -0
- package/dist/web/assets/diagram-IFDJBPK2-Dxmm5YBr.js +43 -0
- package/dist/web/assets/diagram-IFDJBPK2-Dxmm5YBr.js.br +0 -0
- package/dist/web/assets/diagram-IFDJBPK2-Dxmm5YBr.js.gz +0 -0
- package/dist/web/assets/diagram-P4PSJMXO-D1gJGa3M.js +24 -0
- package/dist/web/assets/diagram-P4PSJMXO-D1gJGa3M.js.br +0 -0
- package/dist/web/assets/diagram-P4PSJMXO-D1gJGa3M.js.gz +0 -0
- package/dist/web/assets/dialog-DOaEX6AK.js +1 -0
- package/dist/web/assets/dialog-DOaEX6AK.js.br +0 -0
- package/dist/web/assets/dialog-DOaEX6AK.js.gz +0 -0
- package/dist/web/assets/diff-viewer-FidH7Nsq.js +4 -0
- package/dist/web/assets/diff-viewer-FidH7Nsq.js.br +0 -0
- package/dist/web/assets/diff-viewer-FidH7Nsq.js.gz +0 -0
- package/dist/web/assets/docx-preview-ENiLGqzy.js +12 -0
- package/dist/web/assets/docx-preview-ENiLGqzy.js.br +0 -0
- package/dist/web/assets/docx-preview-ENiLGqzy.js.gz +0 -0
- package/dist/web/assets/dropdown-menu-DB3yyoVz.js +1 -0
- package/dist/web/assets/dropdown-menu-DB3yyoVz.js.br +0 -0
- package/dist/web/assets/dropdown-menu-DB3yyoVz.js.gz +0 -0
- package/dist/web/assets/edge-vA_btsvt.js +1 -0
- package/dist/web/assets/edge-vA_btsvt.js.br +0 -0
- package/dist/web/assets/edge-vA_btsvt.js.gz +0 -0
- package/dist/web/assets/edit-diff-preview-D4EqC86X.js +7 -0
- package/dist/web/assets/edit-diff-preview-D4EqC86X.js.br +0 -0
- package/dist/web/assets/edit-diff-preview-D4EqC86X.js.gz +0 -0
- package/dist/web/assets/editor-dialog-DC7dUWAX.js +1 -0
- package/dist/web/assets/editor-dialog-DC7dUWAX.js.br +0 -0
- package/dist/web/assets/editor-dialog-DC7dUWAX.js.gz +0 -0
- package/dist/web/assets/editor-language-service-0pN0TxYN.js +1 -0
- package/dist/web/assets/editor-language-service-0pN0TxYN.js.br +0 -0
- package/dist/web/assets/editor-language-service-0pN0TxYN.js.gz +0 -0
- package/dist/web/assets/elixir-jDRKDZoF.js +1 -0
- package/dist/web/assets/elixir-jDRKDZoF.js.br +0 -0
- package/dist/web/assets/elixir-jDRKDZoF.js.gz +0 -0
- package/dist/web/assets/elm-DAS3eMJt.js +1 -0
- package/dist/web/assets/elm-DAS3eMJt.js.br +0 -0
- package/dist/web/assets/elm-DAS3eMJt.js.gz +0 -0
- package/dist/web/assets/erDiagram-INFDFZHY-DU44Y1XS.js +70 -0
- package/dist/web/assets/erDiagram-INFDFZHY-DU44Y1XS.js.br +0 -0
- package/dist/web/assets/erDiagram-INFDFZHY-DU44Y1XS.js.gz +0 -0
- package/dist/web/assets/erb-C7IJmpH8.js +1 -0
- package/dist/web/assets/erb-C7IJmpH8.js.br +0 -0
- package/dist/web/assets/erb-C7IJmpH8.js.gz +0 -0
- package/dist/web/assets/erlang-DW-GAdmv.js +1 -0
- package/dist/web/assets/erlang-DW-GAdmv.js.br +0 -0
- package/dist/web/assets/erlang-DW-GAdmv.js.gz +0 -0
- package/dist/web/assets/explorer-body-tFaUp9_Q.js +2 -0
- package/dist/web/assets/explorer-body-tFaUp9_Q.js.br +0 -0
- package/dist/web/assets/explorer-body-tFaUp9_Q.js.gz +0 -0
- package/dist/web/assets/explorer-model-BmgFEsj1.js +1 -0
- package/dist/web/assets/explorer-model-BmgFEsj1.js.br +0 -0
- package/dist/web/assets/explorer-model-BmgFEsj1.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-XnRTZT_X.js +1 -0
- package/dist/web/assets/explorer-window-content-XnRTZT_X.js.br +0 -0
- package/dist/web/assets/explorer-window-content-XnRTZT_X.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-DEbwRPf1.js +1 -0
- package/dist/web/assets/extension-manager-section-DEbwRPf1.js.br +0 -0
- package/dist/web/assets/extension-manager-section-DEbwRPf1.js.gz +0 -0
- package/dist/web/assets/extension-webview-C9ApceLU.js +12 -0
- package/dist/web/assets/extension-webview-C9ApceLU.js.br +0 -0
- package/dist/web/assets/extension-webview-C9ApceLU.js.gz +0 -0
- package/dist/web/assets/file-diff-lX1a7RLF.js +1 -0
- package/dist/web/assets/file-icons-DpwcJLL4.js +1 -0
- package/dist/web/assets/file-icons-DpwcJLL4.js.br +0 -0
- package/dist/web/assets/file-icons-DpwcJLL4.js.gz +0 -0
- package/dist/web/assets/file-icons.generated-BTxvyD8L.css +1 -0
- package/dist/web/assets/file-icons.generated-BTxvyD8L.css.br +0 -0
- package/dist/web/assets/file-icons.generated-BTxvyD8L.css.gz +0 -0
- package/dist/web/assets/file-store-Bk1WYfdy.js +1 -0
- package/dist/web/assets/file-store-Bk1WYfdy.js.br +0 -0
- package/dist/web/assets/file-store-Bk1WYfdy.js.gz +0 -0
- package/dist/web/assets/files-settings-section-C8MacVFQ.js +1 -0
- package/dist/web/assets/files-settings-section-C8MacVFQ.js.br +0 -0
- package/dist/web/assets/files-settings-section-C8MacVFQ.js.gz +0 -0
- package/dist/web/assets/filter-dialog-frame-CoWlaNRy.js +1 -0
- package/dist/web/assets/filter-dialog-frame-CoWlaNRy.js.br +0 -0
- package/dist/web/assets/filter-dialog-frame-CoWlaNRy.js.gz +0 -0
- package/dist/web/assets/flowDiagram-PKNHOUZH-XzNJSFMz.js +162 -0
- package/dist/web/assets/flowDiagram-PKNHOUZH-XzNJSFMz.js.br +0 -0
- package/dist/web/assets/flowDiagram-PKNHOUZH-XzNJSFMz.js.gz +0 -0
- package/dist/web/assets/format-file-meta-C0LKHE3e.js +1 -0
- package/dist/web/assets/format-file-meta-C0LKHE3e.js.br +0 -0
- package/dist/web/assets/format-file-meta-C0LKHE3e.js.gz +0 -0
- package/dist/web/assets/fortran-fixed-form-DrQbMSkt.js +1 -0
- package/dist/web/assets/fortran-fixed-form-DrQbMSkt.js.br +0 -0
- package/dist/web/assets/fortran-fixed-form-DrQbMSkt.js.gz +0 -0
- package/dist/web/assets/fs-api-BQrIEcvo.js +1 -0
- package/dist/web/assets/fs-api-BQrIEcvo.js.br +0 -0
- package/dist/web/assets/fs-api-BQrIEcvo.js.gz +0 -0
- package/dist/web/assets/fsharp-DvDj84Ys.js +1 -0
- package/dist/web/assets/fsharp-DvDj84Ys.js.br +0 -0
- package/dist/web/assets/fsharp-DvDj84Ys.js.gz +0 -0
- package/dist/web/assets/ganttDiagram-A5KZAMGK-5AL8Egrk.js +292 -0
- package/dist/web/assets/ganttDiagram-A5KZAMGK-5AL8Egrk.js.br +0 -0
- package/dist/web/assets/ganttDiagram-A5KZAMGK-5AL8Egrk.js.gz +0 -0
- package/dist/web/assets/gdresource-CPgY7R2s.js +1 -0
- package/dist/web/assets/gdresource-CPgY7R2s.js.br +0 -0
- package/dist/web/assets/gdresource-CPgY7R2s.js.gz +0 -0
- package/dist/web/assets/general-settings-section-DZRRGdlQ.js +1 -0
- package/dist/web/assets/general-settings-section-DZRRGdlQ.js.br +0 -0
- package/dist/web/assets/general-settings-section-DZRRGdlQ.js.gz +0 -0
- package/dist/web/assets/git-commit-NJ9iGbTd.js +1 -0
- package/dist/web/assets/git-commit-NJ9iGbTd.js.br +4 -0
- package/dist/web/assets/git-commit-NJ9iGbTd.js.gz +0 -0
- package/dist/web/assets/git-commit-horizontal-BVihXafd.js +1 -0
- package/dist/web/assets/git-log-panel-g2pBnu6r.js +1 -0
- package/dist/web/assets/git-log-panel-g2pBnu6r.js.br +0 -0
- package/dist/web/assets/git-log-panel-g2pBnu6r.js.gz +0 -0
- package/dist/web/assets/git-rebase-Cm4Uf8Bj.js +1 -0
- package/dist/web/assets/git-repo-store-BOYLnV67.js +1 -0
- package/dist/web/assets/git-repo-store-BOYLnV67.js.br +0 -0
- package/dist/web/assets/git-repo-store-BOYLnV67.js.gz +0 -0
- package/dist/web/assets/git-review-tab-BzI5mxWd.js +3 -0
- package/dist/web/assets/git-review-tab-BzI5mxWd.js.br +0 -0
- package/dist/web/assets/git-review-tab-BzI5mxWd.js.gz +0 -0
- package/dist/web/assets/gitGraph-HDMCJU4V-6AuIeDPs.js +1 -0
- package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-DzKvk1bR.js +65 -0
- package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-DzKvk1bR.js.br +0 -0
- package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-DzKvk1bR.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-BxvI3ehr.js +177 -0
- package/dist/web/assets/glide-data-grid-BxvI3ehr.js.br +0 -0
- package/dist/web/assets/glide-data-grid-BxvI3ehr.js.gz +0 -0
- package/dist/web/assets/glimmer-js-BrXGdFD2.js +1 -0
- package/dist/web/assets/glimmer-js-BrXGdFD2.js.br +0 -0
- package/dist/web/assets/glimmer-js-BrXGdFD2.js.gz +0 -0
- package/dist/web/assets/glimmer-ts-V0NFutRE.js +1 -0
- package/dist/web/assets/glimmer-ts-V0NFutRE.js.br +0 -0
- package/dist/web/assets/glimmer-ts-V0NFutRE.js.gz +0 -0
- package/dist/web/assets/glsl-DtvoVBT2.js +1 -0
- package/dist/web/assets/glsl-DtvoVBT2.js.br +0 -0
- package/dist/web/assets/glsl-DtvoVBT2.js.gz +0 -0
- package/dist/web/assets/graphlib-BpGCrXCx.js +1 -0
- package/dist/web/assets/graphlib-BpGCrXCx.js.br +0 -0
- package/dist/web/assets/graphlib-BpGCrXCx.js.gz +0 -0
- package/dist/web/assets/graphql-BM_SRktm.js +1 -0
- package/dist/web/assets/graphql-BM_SRktm.js.br +0 -0
- package/dist/web/assets/graphql-BM_SRktm.js.gz +0 -0
- package/dist/web/assets/grid-save-dialog-D55Po6Vu.js +2 -0
- package/dist/web/assets/grid-save-dialog-D55Po6Vu.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-D55Po6Vu.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-CoMC-Fx1.js +1 -0
- package/dist/web/assets/group-chat-tab-CoMC-Fx1.js.br +0 -0
- package/dist/web/assets/group-chat-tab-CoMC-Fx1.js.gz +0 -0
- package/dist/web/assets/hack-Ban3lpvB.js +1 -0
- package/dist/web/assets/hack-Ban3lpvB.js.br +0 -0
- package/dist/web/assets/hack-Ban3lpvB.js.gz +0 -0
- package/dist/web/assets/haml-CmZRp0VI.js +1 -0
- package/dist/web/assets/haml-CmZRp0VI.js.br +0 -0
- package/dist/web/assets/haml-CmZRp0VI.js.gz +0 -0
- package/dist/web/assets/handlebars-BTEDAMAb.js +1 -0
- package/dist/web/assets/handlebars-BTEDAMAb.js.br +0 -0
- package/dist/web/assets/handlebars-BTEDAMAb.js.gz +0 -0
- package/dist/web/assets/html-ItWVe1s-.js +1 -0
- package/dist/web/assets/html-ItWVe1s-.js.br +0 -0
- package/dist/web/assets/html-ItWVe1s-.js.gz +0 -0
- package/dist/web/assets/html-derivative-D_5yGE7d.js +1 -0
- package/dist/web/assets/http-7C1QiRf1.js +1 -0
- package/dist/web/assets/http-7C1QiRf1.js.br +0 -0
- package/dist/web/assets/http-7C1QiRf1.js.gz +0 -0
- package/dist/web/assets/hurl-Pypp_tSf.js +1 -0
- package/dist/web/assets/hurl-Pypp_tSf.js.br +0 -0
- package/dist/web/assets/hurl-Pypp_tSf.js.gz +0 -0
- package/dist/web/assets/hxml-C2EdtM37.js +1 -0
- package/dist/web/assets/hxml-C2EdtM37.js.br +0 -0
- package/dist/web/assets/hxml-C2EdtM37.js.gz +0 -0
- package/dist/web/assets/icons-JMA45Ifw.js +1 -0
- package/dist/web/assets/icons-JMA45Ifw.js.br +0 -0
- package/dist/web/assets/icons-JMA45Ifw.js.gz +0 -0
- package/dist/web/assets/image-preview-D7KR11Xo.js +1 -0
- package/dist/web/assets/impexp-state-BWKOuRGj.js +4 -0
- package/dist/web/assets/impexp-state-BWKOuRGj.js.br +0 -0
- package/dist/web/assets/impexp-state-BWKOuRGj.js.gz +0 -0
- package/dist/web/assets/impexp-tab-JF6JF8eO.js +1 -0
- package/dist/web/assets/impexp-tab-JF6JF8eO.js.br +0 -0
- package/dist/web/assets/impexp-tab-JF6JF8eO.js.gz +0 -0
- package/dist/web/assets/index-DyYGWFVa.css +1 -0
- package/dist/web/assets/index-DyYGWFVa.css.br +0 -0
- package/dist/web/assets/index-DyYGWFVa.css.gz +0 -0
- package/dist/web/assets/index-ItT-dTPV.js +59 -0
- package/dist/web/assets/index-ItT-dTPV.js.br +0 -0
- package/dist/web/assets/index-ItT-dTPV.js.gz +0 -0
- package/dist/web/assets/info-3K5VOQVL-CE88wNg6.js +1 -0
- package/dist/web/assets/infoDiagram-LFFYTUFH-BCnHmp4F.js +2 -0
- package/dist/web/assets/input-CKGoVpYv.js +1 -0
- package/dist/web/assets/isEmpty-dcb0OVvj.js +1 -0
- package/dist/web/assets/isEmpty-dcb0OVvj.js.br +0 -0
- package/dist/web/assets/isEmpty-dcb0OVvj.js.gz +0 -0
- package/dist/web/assets/ishikawaDiagram-PHBUUO56-gS3UZ04x.js +70 -0
- package/dist/web/assets/ishikawaDiagram-PHBUUO56-gS3UZ04x.js.br +0 -0
- package/dist/web/assets/ishikawaDiagram-PHBUUO56-gS3UZ04x.js.gz +0 -0
- package/dist/web/assets/jinja-CUU2G4qS.js +1 -0
- package/dist/web/assets/jinja-CUU2G4qS.js.br +0 -0
- package/dist/web/assets/jinja-CUU2G4qS.js.gz +0 -0
- package/dist/web/assets/jira-watcher-section-CvyXLyjO.js +1 -0
- package/dist/web/assets/jison-Cafe7d1m.js +1 -0
- package/dist/web/assets/jison-Cafe7d1m.js.br +0 -0
- package/dist/web/assets/jison-Cafe7d1m.js.gz +0 -0
- package/dist/web/assets/journeyDiagram-4ABVD52K-COVa2Vge.js +139 -0
- package/dist/web/assets/journeyDiagram-4ABVD52K-COVa2Vge.js.br +0 -0
- package/dist/web/assets/journeyDiagram-4ABVD52K-COVa2Vge.js.gz +0 -0
- package/dist/web/assets/julia-6B24A_s4.js +1 -0
- package/dist/web/assets/julia-6B24A_s4.js.br +0 -0
- package/dist/web/assets/julia-6B24A_s4.js.gz +0 -0
- package/dist/web/assets/just-B-sDN3xg.js +1 -0
- package/dist/web/assets/just-B-sDN3xg.js.br +0 -0
- package/dist/web/assets/just-B-sDN3xg.js.gz +0 -0
- package/dist/web/assets/kanban-definition-K7BYSVSG-CtqP4i48.js +89 -0
- package/dist/web/assets/kanban-definition-K7BYSVSG-CtqP4i48.js.br +0 -0
- package/dist/web/assets/kanban-definition-K7BYSVSG-CtqP4i48.js.gz +0 -0
- package/dist/web/assets/keybindings-store-CeEtx6js.js +1 -0
- package/dist/web/assets/keyboard-shortcuts-section-MUIE0Rvf.js +1 -0
- package/dist/web/assets/keyboard-shortcuts-section-MUIE0Rvf.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-MUIE0Rvf.js.gz +0 -0
- package/dist/web/assets/language-servers-section-DiYURB24.js +2 -0
- package/dist/web/assets/language-servers-section-DiYURB24.js.br +0 -0
- package/dist/web/assets/language-servers-section-DiYURB24.js.gz +0 -0
- package/dist/web/assets/latex-BRjk2Rtm.js +1 -0
- package/dist/web/assets/latex-BRjk2Rtm.js.br +0 -0
- package/dist/web/assets/latex-BRjk2Rtm.js.gz +0 -0
- package/dist/web/assets/line-DXN3CJk7.js +1 -0
- package/dist/web/assets/linear-A-Z2llI9.js +1 -0
- package/dist/web/assets/linear-A-Z2llI9.js.br +0 -0
- package/dist/web/assets/linear-A-Z2llI9.js.gz +0 -0
- package/dist/web/assets/liquid-C5GHq6B-.js +1 -0
- package/dist/web/assets/liquid-C5GHq6B-.js.br +0 -0
- package/dist/web/assets/liquid-C5GHq6B-.js.gz +0 -0
- package/dist/web/assets/logs-app-C4OVSXwd.css +1 -0
- package/dist/web/assets/logs-app-C4OVSXwd.css.br +0 -0
- package/dist/web/assets/logs-app-C4OVSXwd.css.gz +0 -0
- package/dist/web/assets/logs-app-CJlNqOdc.js +13 -0
- package/dist/web/assets/logs-app-CJlNqOdc.js.br +0 -0
- package/dist/web/assets/logs-app-CJlNqOdc.js.gz +0 -0
- package/dist/web/assets/logs-tab-BoAlm_8H.js +1 -0
- package/dist/web/assets/logs-window-content-nNm4jl1s.js +1 -0
- package/dist/web/assets/lsp-client-LnKiMWeG.js +1 -0
- package/dist/web/assets/lsp-client-LnKiMWeG.js.br +0 -0
- package/dist/web/assets/lsp-client-LnKiMWeG.js.gz +0 -0
- package/dist/web/assets/lua-CREU2Cg5.js +1 -0
- package/dist/web/assets/lua-CREU2Cg5.js.br +0 -0
- package/dist/web/assets/lua-CREU2Cg5.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-8Hef5MLx.js +1 -0
- package/dist/web/assets/markdown-renderer-BH_CFPJw.js +5 -0
- package/dist/web/assets/markdown-renderer-BH_CFPJw.js.br +0 -0
- package/dist/web/assets/markdown-renderer-BH_CFPJw.js.gz +0 -0
- package/dist/web/assets/marko-A01nJSfd.js +1 -0
- package/dist/web/assets/marko-A01nJSfd.js.br +0 -0
- package/dist/web/assets/marko-A01nJSfd.js.gz +0 -0
- package/dist/web/assets/mdc-coGBHeYV.js +1 -0
- package/dist/web/assets/mdc-coGBHeYV.js.br +0 -0
- package/dist/web/assets/mdc-coGBHeYV.js.gz +0 -0
- package/dist/web/assets/media-url-CsdZ6q_T.js +1 -0
- package/dist/web/assets/mermaid-parser.core-BwbMfUJY.js +4 -0
- package/dist/web/assets/mermaid-parser.core-BwbMfUJY.js.br +0 -0
- package/dist/web/assets/mermaid-parser.core-BwbMfUJY.js.gz +0 -0
- package/dist/web/assets/mermaid.core-DNHX7DSU.js +11 -0
- package/dist/web/assets/mermaid.core-DNHX7DSU.js.br +0 -0
- package/dist/web/assets/mermaid.core-DNHX7DSU.js.gz +0 -0
- package/dist/web/assets/mindmap-definition-YRQLILUH-B7las60M.js +68 -0
- package/dist/web/assets/mindmap-definition-YRQLILUH-B7las60M.js.br +0 -0
- package/dist/web/assets/mindmap-definition-YRQLILUH-B7las60M.js.gz +0 -0
- package/dist/web/assets/mobile-bottom-sheet-CGmmdp_5.js +1 -0
- package/dist/web/assets/mobile-bottom-sheet-CGmmdp_5.js.br +0 -0
- package/dist/web/assets/mobile-bottom-sheet-CGmmdp_5.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Dh2ZECzL.js +1 -0
- package/dist/web/assets/mobile-explorer-sheet-Dh2ZECzL.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Dh2ZECzL.js.gz +0 -0
- package/dist/web/assets/monaco-dotenv-language-IZxwhtNA.js +1 -0
- package/dist/web/assets/new-design-dialog-CgBUrVFx.js +1 -0
- package/dist/web/assets/new-design-dialog-CgBUrVFx.js.br +0 -0
- package/dist/web/assets/new-design-dialog-CgBUrVFx.js.gz +0 -0
- package/dist/web/assets/nextflow-DKFYidyC.js +1 -0
- package/dist/web/assets/nextflow-DKFYidyC.js.br +0 -0
- package/dist/web/assets/nextflow-DKFYidyC.js.gz +0 -0
- package/dist/web/assets/nginx-B9Y4fsja.js +1 -0
- package/dist/web/assets/nginx-B9Y4fsja.js.br +0 -0
- package/dist/web/assets/nginx-B9Y4fsja.js.gz +0 -0
- package/dist/web/assets/nim-BEDyxLED.js +1 -0
- package/dist/web/assets/nim-BEDyxLED.js.br +0 -0
- package/dist/web/assets/nim-BEDyxLED.js.gz +0 -0
- package/dist/web/assets/notification-store-CXC7u6MW.js +1 -0
- package/dist/web/assets/notifications-settings-section-CPbx23nU.js +1 -0
- package/dist/web/assets/notifications-settings-section-CPbx23nU.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-CPbx23nU.js.gz +0 -0
- package/dist/web/assets/onboarding-entry--MWe4amV.js +1 -0
- package/dist/web/assets/onboarding-entry--MWe4amV.js.br +0 -0
- package/dist/web/assets/onboarding-entry--MWe4amV.js.gz +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DZYQekRt.js +1 -0
- package/dist/web/assets/onboarding-quick-orientation-DZYQekRt.js.br +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DZYQekRt.js.gz +0 -0
- package/dist/web/assets/open-db-tabs-CkQe49j_.js +1 -0
- package/dist/web/assets/open-db-tabs-CkQe49j_.js.br +0 -0
- package/dist/web/assets/open-db-tabs-CkQe49j_.js.gz +0 -0
- package/dist/web/assets/open-settings-DsGBn73g.js +1 -0
- package/dist/web/assets/ordinal-U3GzwL7N.js +1 -0
- package/dist/web/assets/ordinal-U3GzwL7N.js.br +0 -0
- package/dist/web/assets/ordinal-U3GzwL7N.js.gz +0 -0
- package/dist/web/assets/overview-panel-CcUGDvnt.js +1 -0
- package/dist/web/assets/overview-panel-CcUGDvnt.js.br +0 -0
- package/dist/web/assets/overview-panel-CcUGDvnt.js.gz +0 -0
- package/dist/web/assets/packet-RMMSAZCW-m_QfwO7e.js +1 -0
- package/dist/web/assets/panel-store-DmP16Fo0.js +1 -0
- package/dist/web/assets/panel-store-DmP16Fo0.js.br +0 -0
- package/dist/web/assets/panel-store-DmP16Fo0.js.gz +0 -0
- package/dist/web/assets/patch-tab-metadata-B-jH5svY.js +1 -0
- package/dist/web/assets/pdf-preview-DMUIWb9B.js +1 -0
- package/dist/web/assets/pdf-preview-DMUIWb9B.js.br +0 -0
- package/dist/web/assets/pdf-preview-DMUIWb9B.js.gz +0 -0
- package/dist/web/assets/performance-panel-CJDLUwrs.js +3 -0
- package/dist/web/assets/performance-panel-CJDLUwrs.js.br +0 -0
- package/dist/web/assets/performance-panel-CJDLUwrs.js.gz +0 -0
- package/dist/web/assets/perl-CSnMi18C.js +1 -0
- package/dist/web/assets/perl-CSnMi18C.js.br +0 -0
- package/dist/web/assets/perl-CSnMi18C.js.gz +0 -0
- package/dist/web/assets/php-BXzT2401.js +1 -0
- package/dist/web/assets/php-BXzT2401.js.br +0 -0
- package/dist/web/assets/php-BXzT2401.js.gz +0 -0
- package/dist/web/assets/pie-UPGHQEXC-CLkXafuF.js +1 -0
- package/dist/web/assets/pieDiagram-SKSYHLDU-BO4P6Wpl.js +30 -0
- package/dist/web/assets/pieDiagram-SKSYHLDU-BO4P6Wpl.js.br +0 -0
- package/dist/web/assets/pieDiagram-SKSYHLDU-BO4P6Wpl.js.gz +0 -0
- package/dist/web/assets/ppmbot-settings-section-DTCTPQ-R.js +1 -0
- package/dist/web/assets/ppmbot-settings-section-DTCTPQ-R.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-DTCTPQ-R.js.gz +0 -0
- package/dist/web/assets/pptx-export-BxmgltJ4.js +111 -0
- package/dist/web/assets/pptx-export-BxmgltJ4.js.br +0 -0
- package/dist/web/assets/pptx-export-BxmgltJ4.js.gz +0 -0
- package/dist/web/assets/problems-panel-DX32QDH_.js +1 -0
- package/dist/web/assets/problems-panel-DX32QDH_.js.br +0 -0
- package/dist/web/assets/problems-panel-DX32QDH_.js.gz +0 -0
- package/dist/web/assets/process-row-format-CBw-CQCx.js +1 -0
- package/dist/web/assets/process-table-CX-NhOg6.js +1 -0
- package/dist/web/assets/process-table-CX-NhOg6.js.br +0 -0
- package/dist/web/assets/process-table-CX-NhOg6.js.gz +0 -0
- package/dist/web/assets/project-framework-store-Bi5dyHdx.js +1 -0
- package/dist/web/assets/project-store-CEGoLMOl.js +1 -0
- package/dist/web/assets/project-store-CEGoLMOl.js.br +0 -0
- package/dist/web/assets/project-store-CEGoLMOl.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-BGNvFe7e.js +1 -0
- package/dist/web/assets/proxy-settings-section-BGNvFe7e.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-BGNvFe7e.js.gz +0 -0
- package/dist/web/assets/pug-Bv9xupen.js +1 -0
- package/dist/web/assets/pug-Bv9xupen.js.br +0 -0
- package/dist/web/assets/pug-Bv9xupen.js.gz +0 -0
- package/dist/web/assets/qml-C3E1ICV4.js +1 -0
- package/dist/web/assets/qml-C3E1ICV4.js.br +0 -0
- package/dist/web/assets/qml-C3E1ICV4.js.gz +0 -0
- package/dist/web/assets/quadrantDiagram-337W2JSQ-B4TWXN8P.js +7 -0
- package/dist/web/assets/quadrantDiagram-337W2JSQ-B4TWXN8P.js.br +0 -0
- package/dist/web/assets/quadrantDiagram-337W2JSQ-B4TWXN8P.js.gz +0 -0
- package/dist/web/assets/query-audit-section-DTHI5GP7.js +1 -0
- package/dist/web/assets/query-audit-section-DTHI5GP7.js.br +0 -0
- package/dist/web/assets/query-audit-section-DTHI5GP7.js.gz +0 -0
- package/dist/web/assets/query-tab-qMlIkHRk.js +22 -0
- package/dist/web/assets/query-tab-qMlIkHRk.js.br +0 -0
- package/dist/web/assets/query-tab-qMlIkHRk.js.gz +0 -0
- package/dist/web/assets/radar-KQ55EAFF-BMCQVm9g.js +1 -0
- package/dist/web/assets/razor-wo4lUwpU.js +1 -0
- package/dist/web/assets/razor-wo4lUwpU.js.br +0 -0
- package/dist/web/assets/razor-wo4lUwpU.js.gz +0 -0
- package/dist/web/assets/remote-access-settings-section-t2BYAA9g.js +1 -0
- package/dist/web/assets/remote-access-settings-section-t2BYAA9g.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-t2BYAA9g.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-ChUU6Jts.js +1 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-ChUU6Jts.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-ChUU6Jts.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-_bopEtCa.js +2 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-_bopEtCa.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-_bopEtCa.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-D9G4kDfa.js +1 -0
- package/dist/web/assets/remote-desktop-mobile-view-D9G4kDfa.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-D9G4kDfa.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-Yz9eVB3-.js +1 -0
- package/dist/web/assets/remote-desktop-readiness-gate-Yz9eVB3-.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-Yz9eVB3-.js.gz +0 -0
- package/dist/web/assets/remote-desktop-settings-section-BTGGSjZY.js +1 -0
- package/dist/web/assets/remote-desktop-settings-section-BTGGSjZY.js.br +0 -0
- package/dist/web/assets/remote-desktop-settings-section-BTGGSjZY.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-B8ZaG2bL.js +1 -0
- package/dist/web/assets/remote-desktop-window-content-B8ZaG2bL.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-B8ZaG2bL.js.gz +0 -0
- package/dist/web/assets/rename-object-dialog-FSlcdUoB.js +1 -0
- package/dist/web/assets/rename-object-dialog-FSlcdUoB.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-FSlcdUoB.js.gz +0 -0
- package/dist/web/assets/requirementDiagram-Z7DCOOCP-C3bEBd6h.js +73 -0
- package/dist/web/assets/requirementDiagram-Z7DCOOCP-C3bEBd6h.js.br +0 -0
- package/dist/web/assets/requirementDiagram-Z7DCOOCP-C3bEBd6h.js.gz +0 -0
- package/dist/web/assets/review-code-CfuJeLYd.js +5 -0
- package/dist/web/assets/review-code-CfuJeLYd.js.br +0 -0
- package/dist/web/assets/review-code-CfuJeLYd.js.gz +0 -0
- package/dist/web/assets/rst-BP6JFRY2.js +1 -0
- package/dist/web/assets/rst-BP6JFRY2.js.br +0 -0
- package/dist/web/assets/rst-BP6JFRY2.js.gz +0 -0
- package/dist/web/assets/ruby-EPVx8l1i.js +1 -0
- package/dist/web/assets/ruby-EPVx8l1i.js.br +0 -0
- package/dist/web/assets/ruby-EPVx8l1i.js.gz +0 -0
- package/dist/web/assets/run-in-terminal-Bk9Bw7G1.js +1 -0
- package/dist/web/assets/run-in-terminal-button-DFPQUlZs.js +1 -0
- package/dist/web/assets/sankeyDiagram-WA2Y5GQK-BxAKhnHw.js +10 -0
- package/dist/web/assets/sankeyDiagram-WA2Y5GQK-BxAKhnHw.js.br +0 -0
- package/dist/web/assets/sankeyDiagram-WA2Y5GQK-BxAKhnHw.js.gz +0 -0
- package/dist/web/assets/sas-NhxEMTOf.js +1 -0
- package/dist/web/assets/sas-NhxEMTOf.js.br +0 -0
- package/dist/web/assets/sas-NhxEMTOf.js.gz +0 -0
- package/dist/web/assets/save-as-dialog-Bj9VpGYf.js +1 -0
- package/dist/web/assets/save-as-dialog-Bj9VpGYf.js.br +0 -0
- package/dist/web/assets/save-as-dialog-Bj9VpGYf.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-DNJ4K7zS.js +1 -0
- package/dist/web/assets/schedules-settings-section-DNJ4K7zS.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-DNJ4K7zS.js.gz +0 -0
- package/dist/web/assets/scroll-area-6Am1KMiB.js +1 -0
- package/dist/web/assets/scroll-area-6Am1KMiB.js.br +0 -0
- package/dist/web/assets/scroll-area-6Am1KMiB.js.gz +0 -0
- package/dist/web/assets/scss-DdAMYXTJ.js +1 -0
- package/dist/web/assets/scss-DdAMYXTJ.js.br +0 -0
- package/dist/web/assets/scss-DdAMYXTJ.js.gz +0 -0
- package/dist/web/assets/send-to-chat-Bcm_Lcog.js +1 -0
- package/dist/web/assets/send-to-chat-Bcm_Lcog.js.br +0 -0
- package/dist/web/assets/send-to-chat-Bcm_Lcog.js.gz +0 -0
- package/dist/web/assets/separator-BOYUIPkH.js +1 -0
- package/dist/web/assets/sequenceDiagram-2WXFIKYE-Dfq9uyFD.js +145 -0
- package/dist/web/assets/sequenceDiagram-2WXFIKYE-Dfq9uyFD.js.br +0 -0
- package/dist/web/assets/sequenceDiagram-2WXFIKYE-Dfq9uyFD.js.gz +0 -0
- package/dist/web/assets/services-panel-CBRTsROB.js +1 -0
- package/dist/web/assets/services-panel-CBRTsROB.js.br +0 -0
- package/dist/web/assets/services-panel-CBRTsROB.js.gz +0 -0
- package/dist/web/assets/session-changes-bar-BRopa3Dh.js +1 -0
- package/dist/web/assets/session-changes-bar-BRopa3Dh.js.br +0 -0
- package/dist/web/assets/session-changes-bar-BRopa3Dh.js.gz +0 -0
- package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js +1 -0
- package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js.br +0 -0
- package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js.gz +0 -0
- package/dist/web/assets/session-review-tab--kNB_FKQ.js +6 -0
- package/dist/web/assets/session-review-tab--kNB_FKQ.js.br +0 -0
- package/dist/web/assets/session-review-tab--kNB_FKQ.js.gz +0 -0
- package/dist/web/assets/session-turns-gmrmXzeg.js +9 -0
- package/dist/web/assets/session-turns-gmrmXzeg.js.br +0 -0
- package/dist/web/assets/session-turns-gmrmXzeg.js.gz +0 -0
- package/dist/web/assets/settings-body-B-s0fEjc.js +1 -0
- package/dist/web/assets/settings-body-B-s0fEjc.js.br +0 -0
- package/dist/web/assets/settings-body-B-s0fEjc.js.gz +0 -0
- package/dist/web/assets/settings-categories-CcR9eL3x.js +1 -0
- package/dist/web/assets/settings-categories-CcR9eL3x.js.br +0 -0
- package/dist/web/assets/settings-categories-CcR9eL3x.js.gz +0 -0
- package/dist/web/assets/settings-section-content-BJ35dy5r.js +1 -0
- package/dist/web/assets/settings-section-content-DckksvTg.js +2 -0
- package/dist/web/assets/settings-section-content-DckksvTg.js.br +0 -0
- package/dist/web/assets/settings-section-content-DckksvTg.js.gz +0 -0
- package/dist/web/assets/settings-store-WeJyQVL8.js +2 -0
- package/dist/web/assets/settings-store-WeJyQVL8.js.br +0 -0
- package/dist/web/assets/settings-store-WeJyQVL8.js.gz +0 -0
- package/dist/web/assets/settings-tab-BlX33GEN.js +1 -0
- package/dist/web/assets/settings-window-content-B-7yV1_q.js +1 -0
- package/dist/web/assets/shaderlab-Cv3mWofL.js +1 -0
- package/dist/web/assets/shaderlab-Cv3mWofL.js.br +0 -0
- package/dist/web/assets/shaderlab-Cv3mWofL.js.gz +0 -0
- package/dist/web/assets/shellsession-47z2x_c2.js +1 -0
- package/dist/web/assets/slash-command-picker-BBcy6w6m.js +1 -0
- package/dist/web/assets/slash-command-picker-BBcy6w6m.js.br +0 -0
- package/dist/web/assets/slash-command-picker-BBcy6w6m.js.gz +0 -0
- package/dist/web/assets/sortable-header-B9gfWik4.js +1 -0
- package/dist/web/assets/sortable-header-B9gfWik4.js.br +0 -0
- package/dist/web/assets/sortable-header-B9gfWik4.js.gz +0 -0
- package/dist/web/assets/soy-DbMmewuy.js +1 -0
- package/dist/web/assets/soy-DbMmewuy.js.br +0 -0
- package/dist/web/assets/soy-DbMmewuy.js.gz +0 -0
- package/dist/web/assets/sparql-TvnQmFDh.js +1 -0
- package/dist/web/assets/sparql-TvnQmFDh.js.br +0 -0
- package/dist/web/assets/sparql-TvnQmFDh.js.gz +0 -0
- package/dist/web/assets/sql-completion-provider-CaTHVr1l.js +5 -0
- package/dist/web/assets/sql-completion-provider-CaTHVr1l.js.br +0 -0
- package/dist/web/assets/sql-completion-provider-CaTHVr1l.js.gz +0 -0
- package/dist/web/assets/sql-identifiers-DDISwQor.js +1 -0
- package/dist/web/assets/sql-identifiers-DDISwQor.js.br +0 -0
- package/dist/web/assets/sql-identifiers-DDISwQor.js.gz +0 -0
- package/dist/web/assets/sql-object-tab-DVo4bxRI.js +1 -0
- package/dist/web/assets/sql-object-tab-DVo4bxRI.js.br +0 -0
- package/dist/web/assets/sql-object-tab-DVo4bxRI.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-BGfIpl5x.js +1 -0
- package/dist/web/assets/sqlite-viewer-BGfIpl5x.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-BGfIpl5x.js.gz +0 -0
- package/dist/web/assets/start-ellipsis-rBh37k0n.js +1 -0
- package/dist/web/assets/stata-ColYzPoX.js +1 -0
- package/dist/web/assets/stata-ColYzPoX.js.br +0 -0
- package/dist/web/assets/stata-ColYzPoX.js.gz +0 -0
- package/dist/web/assets/stateDiagram-RAJIS63D-B8YqGq27.js +1 -0
- package/dist/web/assets/stateDiagram-RAJIS63D-B8YqGq27.js.br +0 -0
- package/dist/web/assets/stateDiagram-RAJIS63D-B8YqGq27.js.gz +0 -0
- package/dist/web/assets/stateDiagram-v2-FVOUBMTO-U76Fcmmw.js +1 -0
- package/dist/web/assets/structure-save-dialog-STK_RFCK.js +1 -0
- package/dist/web/assets/structure-save-dialog-STK_RFCK.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-STK_RFCK.js.gz +0 -0
- package/dist/web/assets/structure-tab-DuLnsTC4.js +3 -0
- package/dist/web/assets/structure-tab-DuLnsTC4.js.br +0 -0
- package/dist/web/assets/structure-tab-DuLnsTC4.js.gz +0 -0
- package/dist/web/assets/surrealql-Bq6PTSr5.js +1 -0
- package/dist/web/assets/surrealql-Bq6PTSr5.js.br +0 -0
- package/dist/web/assets/surrealql-Bq6PTSr5.js.gz +0 -0
- package/dist/web/assets/svelte-QMQkUlOI.js +1 -0
- package/dist/web/assets/svelte-QMQkUlOI.js.br +0 -0
- package/dist/web/assets/svelte-QMQkUlOI.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-BIjW16Pb.js +2 -0
- package/dist/web/assets/system-monitor-body-BIjW16Pb.js.br +0 -0
- package/dist/web/assets/system-monitor-body-BIjW16Pb.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-B6_tC9LO.js +1 -0
- package/dist/web/assets/system-monitor-window-content-CwBzqMUe.js +1 -0
- package/dist/web/assets/tab-host-window-content-CpdEjkZd.js +1 -0
- package/dist/web/assets/tab-host-window-content-CpdEjkZd.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-CpdEjkZd.js.gz +0 -0
- package/dist/web/assets/tab-store-nNzRNfVV.js +1 -0
- package/dist/web/assets/table-tab-B5asfTBP.js +2 -0
- package/dist/web/assets/table-tab-B5asfTBP.js.br +0 -0
- package/dist/web/assets/table-tab-B5asfTBP.js.gz +0 -0
- package/dist/web/assets/telegram-bot-token-field-BiqKbXwE.js +1 -0
- package/dist/web/assets/telegram-bot-token-field-BiqKbXwE.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-BiqKbXwE.js.gz +0 -0
- package/dist/web/assets/templ-C1kESo-I.js +1 -0
- package/dist/web/assets/templ-C1kESo-I.js.br +0 -0
- package/dist/web/assets/templ-C1kESo-I.js.gz +0 -0
- package/dist/web/assets/terminal-tab-DpMONMVB.js +3 -0
- package/dist/web/assets/terminal-tab-DpMONMVB.js.br +0 -0
- package/dist/web/assets/terminal-tab-DpMONMVB.js.gz +0 -0
- package/dist/web/assets/tex-B0snethp.js +1 -0
- package/dist/web/assets/tex-B0snethp.js.br +0 -0
- package/dist/web/assets/tex-B0snethp.js.gz +0 -0
- package/dist/web/assets/timeline-definition-YZTLITO2-3U3p-lPX.js +61 -0
- package/dist/web/assets/timeline-definition-YZTLITO2-3U3p-lPX.js.br +0 -0
- package/dist/web/assets/timeline-definition-YZTLITO2-3U3p-lPX.js.gz +0 -0
- package/dist/web/assets/tool-cards-DoDKxqN4.js +14 -0
- package/dist/web/assets/tool-cards-DoDKxqN4.js.br +0 -0
- package/dist/web/assets/tool-cards-DoDKxqN4.js.gz +0 -0
- package/dist/web/assets/treemap-KZPCXAKY-X6uv-HhJ.js +1 -0
- package/dist/web/assets/ts-tags-XXdX0qhp.js +1 -0
- package/dist/web/assets/ts-tags-XXdX0qhp.js.br +0 -0
- package/dist/web/assets/ts-tags-XXdX0qhp.js.gz +0 -0
- package/dist/web/assets/twig-DIZPhfGq.js +1 -0
- package/dist/web/assets/twig-DIZPhfGq.js.br +0 -0
- package/dist/web/assets/twig-DIZPhfGq.js.gz +0 -0
- package/dist/web/assets/use-at-most-wide-BQFi1Sjv.js +1 -0
- package/dist/web/assets/use-blob-url-D7ElNPnW.js +1 -0
- package/dist/web/assets/use-db-driver-installed-BscdI-wS.js +1 -0
- package/dist/web/assets/use-db-read-DYuyNA5i.js +1 -0
- package/dist/web/assets/use-db-read-DYuyNA5i.js.br +0 -0
- package/dist/web/assets/use-db-read-DYuyNA5i.js.gz +0 -0
- package/dist/web/assets/use-db-tab-Cr4lXxwF.js +1 -0
- package/dist/web/assets/use-db-tab-Cr4lXxwF.js.br +0 -0
- package/dist/web/assets/use-db-tab-Cr4lXxwF.js.gz +0 -0
- package/dist/web/assets/use-design-canvas-check-DKlyMp-S.js +1 -0
- package/dist/web/assets/use-design-canvas-check-DKlyMp-S.js.br +0 -0
- package/dist/web/assets/use-design-canvas-check-DKlyMp-S.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-DS0HrHJ3.js +16 -0
- package/dist/web/assets/use-inline-blame-DS0HrHJ3.js.br +0 -0
- package/dist/web/assets/use-inline-blame-DS0HrHJ3.js.gz +0 -0
- package/dist/web/assets/use-lsp-BTVDYrt6.js +6 -0
- package/dist/web/assets/use-lsp-BTVDYrt6.js.br +0 -0
- package/dist/web/assets/use-lsp-BTVDYrt6.js.gz +0 -0
- package/dist/web/assets/use-monaco-theme-DqnhExsm.js +1 -0
- package/dist/web/assets/use-opener-focus-C5L5UUJs.js +1 -0
- package/dist/web/assets/use-process-kill-D-SGQxDn.js +1 -0
- package/dist/web/assets/use-process-kill-D-SGQxDn.js.br +0 -0
- package/dist/web/assets/use-process-kill-D-SGQxDn.js.gz +0 -0
- package/dist/web/assets/use-sql-schema-info-DRb9dAKi.js +4 -0
- package/dist/web/assets/use-sql-schema-info-DRb9dAKi.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-DRb9dAKi.js.gz +0 -0
- package/dist/web/assets/use-websocket-C6RnlNVJ.js +1 -0
- package/dist/web/assets/vendor-ui-CS1GvlOm.js +45 -0
- package/dist/web/assets/vendor-ui-CS1GvlOm.js.br +0 -0
- package/dist/web/assets/vendor-ui-CS1GvlOm.js.gz +0 -0
- package/dist/web/assets/vennDiagram-LZ73GAT5-DA_6uAVT.js +34 -0
- package/dist/web/assets/vennDiagram-LZ73GAT5-DA_6uAVT.js.br +0 -0
- package/dist/web/assets/vennDiagram-LZ73GAT5-DA_6uAVT.js.gz +0 -0
- package/dist/web/assets/video-preview-CYzeUPfH.js +1 -0
- package/dist/web/assets/video-preview-CYzeUPfH.js.br +0 -0
- package/dist/web/assets/video-preview-CYzeUPfH.js.gz +0 -0
- package/dist/web/assets/voice-settings-section-C01d-toF.js +1 -0
- package/dist/web/assets/voice-settings-section-C01d-toF.js.br +0 -0
- package/dist/web/assets/voice-settings-section-C01d-toF.js.gz +0 -0
- package/dist/web/assets/vue-Bzq4wgkZ.js +1 -0
- package/dist/web/assets/vue-Bzq4wgkZ.js.br +0 -0
- package/dist/web/assets/vue-Bzq4wgkZ.js.gz +0 -0
- package/dist/web/assets/vue-html-Cw1hn392.js +1 -0
- package/dist/web/assets/vue-html-Cw1hn392.js.br +0 -0
- package/dist/web/assets/vue-html-Cw1hn392.js.gz +0 -0
- package/dist/web/assets/vue-vine-BnNe0hw6.js +1 -0
- package/dist/web/assets/vue-vine-BnNe0hw6.js.br +0 -0
- package/dist/web/assets/vue-vine-BnNe0hw6.js.gz +0 -0
- package/dist/web/assets/web-preview-tab-F5C3quQs.js +1 -0
- package/dist/web/assets/web-preview-tab-F5C3quQs.js.br +0 -0
- package/dist/web/assets/web-preview-tab-F5C3quQs.js.gz +0 -0
- package/dist/web/assets/window-pip-registry-DSoB7T3k.js +1 -0
- package/dist/web/assets/window-store-zJczRsv4.js +1 -0
- package/dist/web/assets/window-store-zJczRsv4.js.br +0 -0
- package/dist/web/assets/window-store-zJczRsv4.js.gz +0 -0
- package/dist/web/assets/ws-auth-cWeQ7_61.js +1 -0
- package/dist/web/assets/xml-B_Dd-eqG.js +1 -0
- package/dist/web/assets/xml-B_Dd-eqG.js.br +0 -0
- package/dist/web/assets/xml-B_Dd-eqG.js.gz +0 -0
- package/dist/web/assets/xsl-gLqXzcUZ.js +1 -0
- package/dist/web/assets/xsl-gLqXzcUZ.js.br +0 -0
- package/dist/web/assets/xsl-gLqXzcUZ.js.gz +0 -0
- package/dist/web/assets/xychartDiagram-JWTSCODW-B02PE8Cu.js +7 -0
- package/dist/web/assets/xychartDiagram-JWTSCODW-B02PE8Cu.js.br +0 -0
- package/dist/web/assets/xychartDiagram-JWTSCODW-B02PE8Cu.js.gz +0 -0
- package/dist/web/index.html +52 -35
- package/dist/web/index.html.br +0 -0
- package/dist/web/index.html.gz +0 -0
- package/dist/web/sw.js +1 -1
- package/dist/web/sw.js.br +0 -0
- package/dist/web/sw.js.gz +0 -0
- package/docs/architecture/ai-chat-and-providers.md +389 -0
- package/docs/architecture/data-and-storage.md +108 -172
- package/docs/architecture/integrations.md +12 -4
- package/docs/architecture/workspace-and-ui.md +168 -6
- package/docs/code-standards.md +30 -1
- package/docs/codebase-summary.md +36 -23
- package/docs/deployment-guide.md +56 -12
- package/docs/project-overview-pdr.md +2 -2
- package/docs/project-roadmap.md +21 -2
- package/docs/system-architecture.md +12 -7
- package/package.json +4 -3
- package/packages/ext-git-graph/src/checkout-pathspec.test.ts +52 -0
- package/packages/ext-git-graph/src/commit-detail-escaping.test.ts +84 -30
- package/packages/ext-git-graph/src/commit-detail-status.test.ts +83 -0
- package/packages/ext-git-graph/src/commit-keeps-typing.test.ts +54 -0
- package/packages/ext-git-graph/src/commit-paging.test.ts +93 -0
- package/packages/ext-git-graph/src/discard-undo-toast.test.ts +46 -0
- package/packages/ext-git-graph/src/extension.ts +517 -308
- package/packages/ext-git-graph/src/fetch-through-ppm.test.ts +152 -0
- package/packages/ext-git-graph/src/git-log-parser.ts +3 -1
- package/packages/ext-git-graph/src/gone-branch-filter.test.ts +65 -0
- package/packages/ext-git-graph/src/inspector-file-icons.test.ts +93 -0
- package/packages/ext-git-graph/src/log-args.test.ts +2 -2
- package/packages/ext-git-graph/src/outside-ref-changes.test.ts +185 -0
- package/packages/ext-git-graph/src/panel-test-harness.ts +242 -0
- package/packages/ext-git-graph/src/ppm-git.test.ts +76 -0
- package/packages/ext-git-graph/src/ppm-git.ts +151 -0
- package/packages/ext-git-graph/src/remote-head-refs.test.ts +32 -0
- package/packages/ext-git-graph/src/request-answers.test.ts +76 -0
- package/packages/ext-git-graph/src/search-marks.test.ts +53 -0
- package/packages/ext-git-graph/src/stash-list.test.ts +56 -0
- package/packages/ext-git-graph/src/types.ts +53 -16
- package/packages/ext-git-graph/src/undo-commit-webview.test.ts +82 -0
- package/packages/ext-git-graph/src/undo-targets-through-ppm.test.ts +164 -0
- package/packages/ext-git-graph/src/webview-html.test.ts +529 -595
- package/packages/ext-git-graph/src/webview-html.ts +144 -3765
- package/packages/ext-git-graph/src/webview-icons.generated.ts +69 -0
- package/packages/ext-git-graph/src/webview-protocol.test.ts +135 -0
- package/packages/ext-git-graph/src/webview-script-actions.ts +1291 -0
- package/packages/ext-git-graph/src/webview-script-core.ts +624 -0
- package/packages/ext-git-graph/src/webview-script-graph.ts +570 -0
- package/packages/ext-git-graph/src/webview-script-inspector.ts +571 -0
- package/packages/ext-git-graph/src/webview-script-list.ts +696 -0
- package/packages/ext-git-graph/src/webview-script-main.ts +279 -0
- package/packages/ext-git-graph/src/webview-script-settings.ts +285 -0
- package/packages/ext-git-graph/src/webview-styles.ts +615 -0
- package/packages/ext-git-graph/src/wip-model.ts +299 -0
- package/scripts/gen-db-driver-locks.ts +41 -0
- package/scripts/gen-file-icons.ts +27 -0
- package/scripts/gen-git-graph-icons.ts +135 -0
- package/scripts/gen-product-icons.ts +34 -0
- package/scripts/vite-glide-eager-editors.ts +37 -0
- package/src/cli/commands/config-cmd.ts +10 -0
- package/src/cli/commands/db-cmd.ts +279 -50
- package/src/cli/commands/logs.ts +26 -7
- package/src/cli/utils/tty-prompt.ts +51 -0
- package/src/index.ts +4 -0
- package/src/lib/account-crypto.ts +6 -0
- package/src/providers/claude-agent-sdk-query-options.ts +111 -0
- package/src/providers/claude-agent-sdk.ts +326 -133
- package/src/providers/claude-warm-spare.ts +26 -9
- package/src/providers/cli-provider-base.ts +28 -5
- package/src/providers/codex-app-server/codex-event-mapper.ts +4 -9
- package/src/providers/codex-app-server/codex-file-baselines.ts +47 -0
- package/src/providers/codex-app-server/codex-history.ts +1 -1
- package/src/providers/codex-app-server/codex-jsonrpc-client.ts +57 -11
- package/src/providers/codex-app-server/codex-patch.ts +68 -4
- package/src/providers/codex-app-server/codex-provider.ts +76 -14
- package/src/providers/codex-app-server/codex-rollout-header.ts +2 -1
- package/src/providers/codex-app-server/codex-rollout-items.ts +22 -0
- package/src/providers/codex-app-server/codex-thread-params.ts +34 -1
- package/src/providers/cursor-cli/cursor-history.ts +2 -1
- package/src/providers/registry.ts +12 -7
- package/src/server/index.ts +224 -103
- package/src/server/middleware/access-log.ts +127 -0
- package/src/server/middleware/auth.ts +8 -0
- package/src/server/routes/accounts.ts +13 -2
- package/src/server/routes/android.ts +6 -0
- package/src/server/routes/chat-file-changes.ts +215 -0
- package/src/server/routes/chat-history-page.ts +116 -0
- package/src/server/routes/chat.ts +125 -38
- package/src/server/routes/database-changeset.ts +178 -0
- package/src/server/routes/database-drivers.ts +36 -0
- package/src/server/routes/database-grid-export.ts +212 -0
- package/src/server/routes/database-grid.ts +317 -0
- package/src/server/routes/database-impexp.ts +317 -0
- package/src/server/routes/database-query.ts +186 -0
- package/src/server/routes/database-route-helpers.ts +130 -0
- package/src/server/routes/database-structure.ts +292 -0
- package/src/server/routes/database.ts +539 -280
- package/src/server/routes/design-settings.ts +30 -6
- package/src/server/routes/git.ts +254 -16
- package/src/server/routes/html-preview.ts +42 -9
- package/src/server/routes/jira-watcher-routes.ts +7 -1
- package/src/server/routes/logs.ts +158 -0
- package/src/server/routes/mcp.ts +11 -1
- package/src/server/routes/notifications.ts +192 -0
- package/src/server/routes/port-forwarding.ts +19 -19
- package/src/server/routes/project-scoped.ts +0 -2
- package/src/server/routes/query-audit-hook.ts +37 -31
- package/src/server/routes/remote-desktop.ts +19 -0
- package/src/server/routes/settings.ts +140 -45
- package/src/server/routes/system-services.ts +12 -6
- package/src/server/routes/tailscale.ts +70 -0
- package/src/server/routes/trace.ts +4 -1
- package/src/server/routes/tunnel-spawn.ts +55 -12
- package/src/server/routes/tunnel.ts +5 -0
- package/src/server/routes/tunnels.ts +63 -11
- package/src/server/routes/upgrade.ts +5 -1
- package/src/server/ws/android.ts +36 -11
- package/src/server/ws/chat.ts +294 -69
- package/src/server/ws/extensions.ts +13 -10
- package/src/server/ws/global.ts +14 -0
- package/src/server/ws/group-chat.ts +5 -0
- package/src/server/ws/lsp.ts +29 -4
- package/src/server/ws/remote-desktop.ts +25 -9
- package/src/server/ws/terminal.ts +8 -1
- package/src/services/account-pick.service.ts +1 -1
- package/src/services/account-selector.service.ts +76 -14
- package/src/services/account.service.ts +54 -23
- package/src/services/agent-transcript/agent-transcript-activity.ts +11 -4
- package/src/services/ai-chat-env.ts +28 -0
- package/src/services/android/android-operations.ts +10 -0
- package/src/services/android/android-session.ts +20 -0
- package/src/services/android/android-video.ts +41 -7
- package/src/services/android/avd-manager.ts +21 -3
- package/src/services/android/emulator-launcher.ts +40 -2
- package/src/services/autostart-register.ts +24 -8
- package/src/services/bash-output-spy.ts +6 -3
- package/src/services/binary-content.ts +8 -0
- package/src/services/binary-upgrade-apply.ts +5 -0
- package/src/services/binary-upgrade-download.ts +9 -1
- package/src/services/binary-upgrade-swap.ts +18 -3
- package/src/services/chat-prepare/chat-prepare.service.ts +4 -1
- package/src/services/chat-prepare/settle-within-budget.ts +10 -3
- package/src/services/chat-search.service.ts +4 -2
- package/src/services/chat.service.ts +115 -5
- package/src/services/claude-transcript-exists.ts +24 -0
- package/src/services/cloud-ws.service.ts +46 -12
- package/src/services/cloud.service.ts +40 -9
- package/src/services/cloudflared.service.ts +25 -3
- package/src/services/codex-account-cooldown.ts +4 -0
- package/src/services/codex-account-login.ts +15 -4
- package/src/services/compact-segment.ts +156 -0
- package/src/services/compaction-savings.ts +8 -2
- package/src/services/config-secret-keys.ts +2 -0
- package/src/services/config.service.ts +44 -6
- package/src/services/database/analyser-mysql.ts +384 -0
- package/src/services/database/analyser-postgres.ts +259 -0
- package/src/services/database/analyser-sqlite.ts +411 -0
- package/src/services/database/changeset.service.ts +60 -0
- package/src/services/database/changeset.ts +473 -0
- package/src/services/database/connection-config.ts +370 -0
- package/src/services/database/connection-database.ts +90 -0
- package/src/services/database/connection-endpoint.ts +160 -0
- package/src/services/database/connection-login.ts +144 -0
- package/src/services/database/connection-test.ts +191 -0
- package/src/services/database/db-errors.ts +57 -0
- package/src/services/database/db-values.ts +45 -0
- package/src/services/database/ddl/ddl-common.ts +47 -0
- package/src/services/database/ddl/ddl-mysql.ts +202 -0
- package/src/services/database/ddl/ddl-objects.ts +116 -0
- package/src/services/database/ddl/ddl-postgres.ts +208 -0
- package/src/services/database/ddl/ddl-sqlite.ts +172 -0
- package/src/services/database/ddl/ddl-types.ts +61 -0
- package/src/services/database/ddl/sqlite-alter-plan.ts +61 -0
- package/src/services/database/ddl/sqlite-apply.ts +112 -0
- package/src/services/database/ddl/sqlite-recreate.ts +202 -0
- package/src/services/database/ddl/table-diff.ts +187 -0
- package/src/services/database/dialect-mysql.ts +58 -0
- package/src/services/database/dialect-postgres.ts +52 -0
- package/src/services/database/dialect-sqlite.ts +30 -0
- package/src/services/database/dialect.ts +108 -0
- package/src/services/database/dialects.ts +20 -0
- package/src/services/database/drivers/db-driver-catalog.ts +99 -0
- package/src/services/database/drivers/db-driver-install.ts +348 -0
- package/src/services/database/drivers/db-driver-loader.ts +103 -0
- package/src/services/database/drivers/db-driver-locks.generated.json +201 -0
- package/src/services/database/drivers/db-driver-store.ts +75 -0
- package/src/services/database/export-batch.ts +68 -0
- package/src/services/database/file-database.ts +105 -0
- package/src/services/database/grid-cell.ts +80 -0
- package/src/services/database/grid-export-text.ts +318 -0
- package/src/services/database/grid-export-tickets.ts +61 -0
- package/src/services/database/grid-export-xlsx.ts +296 -0
- package/src/services/database/grid-export.ts +13 -0
- package/src/services/database/grid-query-builder.ts +397 -0
- package/src/services/database/grid.service.ts +157 -0
- package/src/services/database/host-files.ts +52 -0
- package/src/services/database/impexp/column-map.ts +58 -0
- package/src/services/database/impexp/export-job-runner.ts +281 -0
- package/src/services/database/impexp/impexp-files.ts +118 -0
- package/src/services/database/impexp/impexp-job-store.ts +195 -0
- package/src/services/database/impexp/impexp-request.ts +279 -0
- package/src/services/database/impexp/import-job-runner.ts +181 -0
- package/src/services/database/impexp/import-table-writer.ts +319 -0
- package/src/services/database/impexp/import-uploads.ts +167 -0
- package/src/services/database/impexp/readers/csv-reader.ts +359 -0
- package/src/services/database/impexp/readers/file-rows.ts +59 -0
- package/src/services/database/impexp/readers/file-text.ts +80 -0
- package/src/services/database/impexp/readers/json-reader.ts +505 -0
- package/src/services/database/impexp/zip-output.ts +55 -0
- package/src/services/database/init-adapters.ts +4 -0
- package/src/services/database/isolation-level.ts +18 -0
- package/src/services/database/mysql-adapter.ts +62 -0
- package/src/services/database/object-scripts.ts +20 -0
- package/src/services/database/object-sql-mysql.ts +53 -0
- package/src/services/database/object-sql-postgres.ts +265 -0
- package/src/services/database/object-sql-sqlite.ts +25 -0
- package/src/services/database/postgres-adapter.ts +93 -23
- package/src/services/database/postgres-array-nulls.ts +101 -0
- package/src/services/database/postgres-connect-options.ts +92 -0
- package/src/services/database/query-script-runner.ts +203 -0
- package/src/services/database/readonly-check.ts +39 -15
- package/src/services/database/sqlite-adapter.ts +100 -17
- package/src/services/database/ssh-agent-socket.ts +50 -0
- package/src/services/database/ssh-known-hosts.ts +113 -0
- package/src/services/database/ssh-tunnel.ts +613 -0
- package/src/services/database/structure-change-request.ts +214 -0
- package/src/services/database/structure-edit.service.ts +143 -0
- package/src/services/database/tls-identity-check.ts +81 -0
- package/src/services/db-backup/db-backup-restore.ts +14 -2
- package/src/services/db.service.ts +153 -54
- package/src/services/design/bridge/bridge-script.ts +14 -6
- package/src/services/design/bridge/html-preview-bridge.ts +23 -0
- package/src/services/design/comments/design-comments-store.ts +7 -2
- package/src/services/design/design-skill-install.service.ts +269 -0
- package/src/services/design/design-turn-snapshot.ts +5 -2
- package/src/services/design/mcp/design-mcp-endpoint.ts +15 -77
- package/src/services/design/mcp/design-mcp-tokens.ts +9 -65
- package/src/services/design/preview/design-preview-html.ts +1 -1
- package/src/services/draft.service.ts +10 -3
- package/src/services/edge-forwarder.ts +50 -3
- package/src/services/event-loop-lag.ts +37 -2
- package/src/services/extension-host-worker.ts +41 -6
- package/src/services/extension-installer.ts +13 -5
- package/src/services/extension-manifest.ts +9 -2
- package/src/services/extension-rpc-handlers.ts +39 -4
- package/src/services/extension-rpc.ts +31 -2
- package/src/services/extension.service.ts +48 -13
- package/src/services/file-lines.ts +2 -2
- package/src/services/file-list-index.service.ts +17 -1
- package/src/services/file-watcher/linux-inotify.ts +47 -6
- package/src/services/file-watcher/watch-tree.ts +42 -6
- package/src/services/file-watcher.service.ts +15 -7
- package/src/services/file.service.ts +6 -0
- package/src/services/fs-ops/fs-core-ops.ts +5 -1
- package/src/services/fs-ops/fs-git-init.service.ts +13 -1
- package/src/services/fs-ops/fs-ops-copy-move.service.ts +5 -0
- package/src/services/fs-ops/fs-ops-mutate.service.ts +6 -1
- package/src/services/fs-ops/fs-ops-trash.service.ts +17 -3
- package/src/services/git-changes/diff-sections.ts +230 -0
- package/src/services/git-changes/git-changes.service.ts +471 -0
- package/src/services/git-changes/git-events.ts +28 -0
- package/src/services/git-changes/git-operation.ts +86 -0
- package/src/services/git-changes/porcelain-v2.ts +117 -0
- package/src/services/git-commit-draft.service.ts +51 -0
- package/src/services/git-discard-journal/git-discard-journal.service.ts +412 -0
- package/src/services/git-hunks/git-hunks.service.ts +50 -11
- package/src/services/git-workflow/git-workflow.service.ts +198 -0
- package/src/services/git.service.ts +64 -8
- package/src/services/group-chat/group-chat.service.ts +31 -5
- package/src/services/group-chat/responder-router.ts +15 -3
- package/src/services/host-info/host-info.service.ts +16 -0
- package/src/services/host-info/spawn-runner.ts +25 -0
- package/src/services/jira-config.service.ts +13 -1
- package/src/services/jira-debug-session.service.ts +19 -4
- package/src/services/jira-watcher.service.ts +53 -11
- package/src/services/jsonl-transcript-parser.ts +49 -19
- package/src/services/log-level-config.ts +36 -0
- package/src/services/logger.ts +280 -0
- package/src/services/logs/browser-logs.ts +84 -0
- package/src/services/logs/github-issues.ts +76 -0
- package/src/services/logs/log-ai.ts +40 -0
- package/src/services/logs/log-columns.ts +160 -0
- package/src/services/logs/log-environment.ts +94 -0
- package/src/services/logs/log-file-index.ts +355 -0
- package/src/services/logs/log-issues.ts +390 -0
- package/src/services/logs/log-live.ts +82 -0
- package/src/services/logs/log-report-draft.ts +63 -0
- package/src/services/logs/log-store.ts +609 -0
- package/src/services/lsp/lsp-install.ts +199 -11
- package/src/services/lsp/lsp-manager.ts +31 -7
- package/src/services/lsp/lsp-release-catalog.ts +87 -0
- package/src/services/lsp/lsp-session.ts +29 -2
- package/src/services/lsp/server-registry.ts +85 -18
- package/src/services/mcp-http-endpoint.ts +127 -0
- package/src/services/mcp-oauth/mcp-oauth-flows.ts +11 -4
- package/src/services/mcp-session-tokens.ts +77 -0
- package/src/services/media-transcode/ffmpeg-capabilities.ts +33 -2
- package/src/services/media-transcode/transcode-stream.ts +7 -1
- package/src/services/memory-diagnostics.ts +86 -0
- package/src/services/mysql.service.ts +1065 -0
- package/src/services/named-tunnel/cloudflared-login-helpers.ts +4 -2
- package/src/services/named-tunnel/cloudflared-login.service.ts +15 -2
- package/src/services/named-tunnel/named-tunnel-setup-confirm.ts +7 -1
- package/src/services/named-tunnel/named-tunnel-setup.service.ts +9 -1
- package/src/services/nested-subagent-spy.ts +7 -4
- package/src/services/notification-format.ts +74 -0
- package/src/services/notification-link.ts +22 -0
- package/src/services/notification.service.ts +157 -12
- package/src/services/ntfy-notification.service.ts +134 -0
- package/src/services/picked-account-binding.ts +7 -1
- package/src/services/port-forward/forward-hop.ts +296 -0
- package/src/services/port-forward/frame-ancestors.ts +117 -0
- package/src/services/port-forward/tailscale-forward.ts +261 -0
- package/src/services/postgres.service.ts +815 -21
- package/src/services/ppmbot/cli-reference-default.ts +17 -4
- package/src/services/ppmbot/ppmbot-delegation.ts +8 -0
- package/src/services/ppmbot/ppmbot-service.ts +58 -46
- package/src/services/ppmbot/ppmbot-session.ts +14 -10
- package/src/services/ppmbot/ppmbot-streamer.ts +6 -3
- package/src/services/ppmbot/ppmbot-telegram.ts +45 -13
- package/src/services/project.service.ts +12 -1
- package/src/services/provider-usage/usage-registry.ts +12 -2
- package/src/services/proxy-agent-anthropic-bridge.ts +11 -1
- package/src/services/proxy-agent-bridge.ts +11 -1
- package/src/services/proxy-agent-turn.ts +25 -2
- package/src/services/proxy-image-bridge.ts +2 -2
- package/src/services/proxy-openai-bridge.ts +1 -1
- package/src/services/proxy-sdk-bridge.ts +1 -1
- package/src/services/proxy.service.ts +32 -9
- package/src/services/query-audit/query-audit.service.ts +10 -2
- package/src/services/read-lines.ts +16 -4
- package/src/services/redact-secrets.ts +23 -2
- package/src/services/remote-desktop/ffmpeg-install.ts +85 -0
- package/src/services/remote-desktop/mediamtx-install.service.ts +11 -2
- package/src/services/remote-desktop/mediamtx-process.ts +31 -2
- package/src/services/remote-desktop/remote-desktop-audio.ts +24 -7
- package/src/services/remote-desktop/remote-desktop-capture-input.ts +7 -4
- package/src/services/remote-desktop/remote-desktop-capture-wayland.ts +30 -10
- package/src/services/remote-desktop/remote-desktop-capture.ts +40 -6
- package/src/services/remote-desktop/remote-desktop-displays-win32.ts +92 -0
- package/src/services/remote-desktop/remote-desktop-displays.ts +8 -5
- package/src/services/remote-desktop/remote-desktop-input-uinput.ts +20 -1
- package/src/services/remote-desktop/remote-desktop-input-win32.ts +49 -9
- package/src/services/remote-desktop/remote-desktop-portal.ts +19 -3
- package/src/services/remote-desktop/remote-desktop-privacy.ts +8 -1
- package/src/services/remote-desktop/remote-desktop-requirements.ts +3 -2
- package/src/services/remote-desktop/remote-desktop-resolution.ts +6 -0
- package/src/services/remote-desktop/remote-desktop-session.ts +111 -27
- package/src/services/remote-desktop/remote-desktop-x11.ts +25 -2
- package/src/services/scheduler-core.ts +22 -10
- package/src/services/scheduler-runner.ts +28 -10
- package/src/services/sd-notify.ts +26 -2
- package/src/services/session-file-baselines/reverse-unified-diff.ts +85 -0
- package/src/services/session-file-baselines/session-file-baselines.service.ts +241 -0
- package/src/services/session-file-baselines/session-file-blame.ts +200 -0
- package/src/services/session-file-baselines/session-file-changes.service.ts +321 -0
- package/src/services/session-file-baselines/session-file-history.ts +347 -0
- package/src/services/session-file-baselines/session-review-actions.ts +560 -0
- package/src/services/session-file-baselines/session-review-blocks.ts +90 -0
- package/src/services/session-file-baselines/session-review-marks.ts +90 -0
- package/src/services/session-file-baselines/session-turn-revert.ts +374 -0
- package/src/services/session-file-baselines/shell-change-tracker.ts +489 -0
- package/src/services/session-trace/session-trace-db.ts +14 -1
- package/src/services/session-trace/session-trace-store.ts +56 -0
- package/src/services/session-trace/turn-stop-reader.ts +70 -0
- package/src/services/speech-to-text/whisper-install.service.ts +13 -1
- package/src/services/sqlite-types.ts +2 -0
- package/src/services/sqlite.service.ts +507 -13
- package/src/services/supervisor-state.ts +6 -4
- package/src/services/supervisor-stopped-page.ts +6 -6
- package/src/services/supervisor.ts +118 -44
- package/src/services/system-metrics/gpu-collector-nvidia.ts +13 -3
- package/src/services/system-metrics/kill-request-handler.ts +9 -8
- package/src/services/system-metrics/powershell-session.ts +40 -7
- package/src/services/system-metrics/process-collector-windows.ts +4 -3
- package/src/services/system-metrics/process-net-collector-darwin.ts +13 -5
- package/src/services/system-metrics/signal-request-handler.ts +9 -8
- package/src/services/system-metrics/system-metrics-platform.ts +11 -2
- package/src/services/system-metrics/system-metrics.service.ts +31 -4
- package/src/services/system-services/app-icon-service.ts +19 -1
- package/src/services/system-services/app-icons-windows.ts +105 -0
- package/src/services/system-services/apps-windows-native.ts +233 -0
- package/src/services/system-services/apps-windows.ts +156 -0
- package/src/services/system-services/launchd-collector.ts +12 -1
- package/src/services/system-services/service-backend.ts +6 -3
- package/src/services/system-services/systemd-collector.ts +9 -1
- package/src/services/system-services/windows-services-parse.ts +186 -0
- package/src/services/system-services/windows-services.ts +200 -0
- package/src/services/tab-tools-mcp/tab-open-broker.ts +135 -0
- package/src/services/tab-tools-mcp/tab-target.ts +88 -0
- package/src/services/tab-tools-mcp/tab-tools-mcp-endpoint.ts +116 -0
- package/src/services/tab-tools-mcp/tab-tools-mcp-tokens.ts +36 -0
- package/src/services/tab-tools-mcp/tab-tools-mcp-tool.ts +78 -0
- package/src/services/table-cache.service.ts +4 -2
- package/src/services/tailscale/tailscale-app-service.ts +239 -0
- package/src/services/tailscale/tailscale-cli.ts +48 -0
- package/src/services/tailscale/tailscale-login.ts +257 -0
- package/src/services/tailscale/tailscale-state.ts +198 -0
- package/src/services/telegram-bot-api.ts +80 -0
- package/src/services/telegram-bots.ts +131 -0
- package/src/services/telegram-connect.service.ts +262 -0
- package/src/services/telegram-notification.service.ts +48 -55
- package/src/services/terminal.service.ts +46 -11
- package/src/services/theme-import/fetch-url.ts +11 -2
- package/src/services/tunnel-registry-parse.ts +4 -0
- package/src/services/tunnel.service.ts +15 -0
- package/src/services/upgrade.service.ts +30 -2
- package/src/services/web-push/web-push-crypto.ts +150 -0
- package/src/services/web-push/web-push-store.ts +116 -0
- package/src/services/web-push/web-push.service.ts +240 -0
- package/src/shared/agent-transcript-protocol.ts +4 -1
- package/src/shared/chat-reply.ts +51 -0
- package/src/shared/db-changeset.ts +89 -0
- package/src/shared/db-column-kind.ts +90 -0
- package/src/shared/db-connection-config.ts +256 -0
- package/src/shared/db-connection-url.ts +252 -0
- package/src/shared/db-drivers.ts +36 -0
- package/src/shared/db-explorer-prefs.ts +123 -0
- package/src/shared/db-filter-parser.ts +534 -0
- package/src/shared/db-grid-export.ts +88 -0
- package/src/shared/db-grid.ts +234 -0
- package/src/shared/db-impexp.ts +313 -0
- package/src/shared/db-lookup-prefs.ts +37 -0
- package/src/shared/db-query-script.ts +110 -0
- package/src/shared/db-structure-change.ts +83 -0
- package/src/shared/db-structure.ts +195 -0
- package/src/shared/db-table-model.ts +500 -0
- package/src/shared/db-types.ts +31 -0
- package/src/shared/design-canvas-check-format.ts +23 -0
- package/src/shared/design-skill-suggestion.ts +20 -4
- package/src/shared/git-changes.ts +220 -0
- package/src/shared/log-fingerprint.ts +32 -0
- package/src/shared/log-levels.ts +41 -0
- package/src/shared/log-redact.ts +82 -0
- package/src/shared/logs-api.ts +145 -0
- package/src/shared/logs-model.ts +230 -0
- package/src/shared/notification-settings.ts +184 -0
- package/src/shared/ppmbot-telegram.ts +16 -0
- package/src/shared/review-blocks.ts +222 -0
- package/src/shared/session-file-changes.ts +136 -0
- package/src/shared/split-sql-statements.ts +388 -0
- package/src/shared/sql-identifiers.ts +97 -0
- package/src/shared/tab-open-protocol.ts +70 -0
- package/src/shared/tailscale-setup.ts +126 -0
- package/src/shared/terminal-size.ts +23 -0
- package/src/shared/tool-result-content.ts +5 -0
- package/src/shared/turn-stop.ts +30 -0
- package/src/shared/user-agent-label.ts +59 -0
- package/src/shared/web-push-payload.ts +41 -0
- package/src/types/api.ts +12 -3
- package/src/types/chat.ts +6 -0
- package/src/types/config.ts +25 -0
- package/src/types/database.ts +215 -7
- package/src/types/system-metrics.ts +9 -5
- package/src/types/system-services.ts +8 -3
- package/src/web/app.tsx +31 -7
- package/src/web/components/auth/login-screen.tsx +21 -10
- package/src/web/components/chat/change-file-row.tsx +1 -79
- package/src/web/components/chat/chat-history-bar.tsx +3 -2
- package/src/web/components/chat/chat-tab.tsx +183 -39
- package/src/web/components/chat/chat-toolbar-overflow-menu.tsx +7 -1
- package/src/web/components/chat/message-action-bar.tsx +3 -1
- package/src/web/components/chat/message-input.tsx +66 -8
- package/src/web/components/chat/message-list.tsx +146 -9
- package/src/web/components/chat/message-reply-reference.ts +43 -0
- package/src/web/components/chat/message-user-bubble.tsx +10 -3
- package/src/web/components/chat/reply-card.tsx +28 -0
- package/src/web/components/chat/running-agents-bar.tsx +78 -44
- package/src/web/components/chat/session-change-row.tsx +118 -0
- package/src/web/components/chat/session-changes-bar.tsx +219 -0
- package/src/web/components/chat/session-changes-context.tsx +21 -0
- package/src/web/components/chat/tab-tool-card.tsx +93 -0
- package/src/web/components/chat/tool-cards.tsx +11 -0
- package/src/web/components/chat/turn-change-pill.tsx +20 -2
- package/src/web/components/chat/turn-change-review.tsx +383 -0
- package/src/web/components/chat/turn-change-rollup.tsx +15 -4
- package/src/web/components/chat/turn-change-sheet.tsx +103 -94
- package/src/web/components/chat/turn-change-tray.tsx +90 -93
- package/src/web/components/chat/turn-stop-bar.tsx +42 -0
- package/src/web/components/chat/user-message-parse.ts +5 -2
- package/src/web/components/database/connection-color-picker.tsx +42 -46
- package/src/web/components/database/connection-form/connection-advanced-pane.tsx +82 -0
- package/src/web/components/database/connection-form/connection-form-state.ts +719 -0
- package/src/web/components/database/connection-form/connection-form-tab.tsx +160 -0
- package/src/web/components/database/connection-form/connection-general-pane.tsx +231 -0
- package/src/web/components/database/connection-form/connection-ssh-pane.tsx +136 -0
- package/src/web/components/database/connection-form/connection-ssl-pane.tsx +68 -0
- package/src/web/components/database/connection-form/connection-test-result.tsx +90 -0
- package/src/web/components/database/connection-form/database-picker.tsx +136 -0
- package/src/web/components/database/connection-form/engine-tiles.tsx +72 -0
- package/src/web/components/database/connection-form/form-controls.tsx +219 -0
- package/src/web/components/database/connection-form/use-connection-form.ts +369 -0
- package/src/web/components/database/connection-import-export.tsx +6 -5
- package/src/web/components/database/connections-section/connection-menus.ts +100 -0
- package/src/web/components/database/connections-section/connection-tree-model.ts +113 -0
- package/src/web/components/database/connections-section/connections-section.tsx +432 -0
- package/src/web/components/database/connections-section/delete-connection-dialog.tsx +75 -0
- package/src/web/components/database/connections-section/folder-name-input.tsx +41 -0
- package/src/web/components/database/database-sidebar.tsx +55 -78
- package/src/web/components/database/db-login/db-login-dialog.tsx +255 -0
- package/src/web/components/database/db-login/db-login-store.ts +63 -0
- package/src/web/components/database/db-rows-status.tsx +32 -0
- package/src/web/components/database/db-sidebar-reveal.ts +66 -0
- package/src/web/components/database/db-tab-parts.tsx +117 -0
- package/src/web/components/database/driver-missing-notice.tsx +72 -0
- package/src/web/components/database/explorer/db-explorer-store.ts +658 -0
- package/src/web/components/database/explorer/explorer-menu.tsx +193 -0
- package/src/web/components/database/explorer/explorer-model.ts +341 -0
- package/src/web/components/database/explorer/open-db-tabs.ts +160 -0
- package/src/web/components/database/explorer/open-new-query.ts +22 -0
- package/src/web/components/database/explorer/open-new-table.ts +37 -0
- package/src/web/components/database/explorer/sql-templates.ts +110 -0
- package/src/web/components/database/explorer/tree-parts.tsx +109 -0
- package/src/web/components/database/explorer/use-db-explorer-sync.ts +25 -0
- package/src/web/components/database/explorer/use-row-menu.ts +37 -0
- package/src/web/components/database/explorer/use-tree-keys.ts +92 -0
- package/src/web/components/database/export-button.tsx +96 -113
- package/src/web/components/database/extract-query-table.ts +4 -3
- package/src/web/components/database/focused-database-prompt.tsx +85 -0
- package/src/web/components/database/glide-context-menu.tsx +52 -62
- package/src/web/components/database/glide-data-grid.tsx +1401 -157
- package/src/web/components/database/glide-grid-theme.ts +49 -2
- package/src/web/components/database/glide-grid-types.ts +222 -48
- package/src/web/components/database/glide-header-menu.tsx +52 -103
- package/src/web/components/database/glide-save-bar.tsx +4 -3
- package/src/web/components/database/grid/cell-context-menu.tsx +151 -0
- package/src/web/components/database/grid/cell-data-formats.ts +298 -0
- package/src/web/components/database/grid/cell-data-panel.tsx +662 -0
- package/src/web/components/database/grid/cell-display.ts +52 -0
- package/src/web/components/database/grid/cell-editor.tsx +55 -0
- package/src/web/components/database/grid/cell-menu.ts +210 -0
- package/src/web/components/database/grid/change-marks.ts +51 -0
- package/src/web/components/database/grid/column-filter-cell.ts +34 -0
- package/src/web/components/database/grid/column-menu.ts +51 -0
- package/src/web/components/database/grid/columns-panel.tsx +241 -0
- package/src/web/components/database/grid/columns-sheet.tsx +172 -0
- package/src/web/components/database/grid/copy-as.ts +170 -0
- package/src/web/components/database/grid/dictionary-lookup-dialog.tsx +169 -0
- package/src/web/components/database/grid/fetch-all-dialog.tsx +51 -0
- package/src/web/components/database/grid/filter-chips.tsx +107 -0
- package/src/web/components/database/grid/filter-dialog-frame.tsx +95 -0
- package/src/web/components/database/grid/filter-dialog-host.tsx +43 -0
- package/src/web/components/database/grid/filter-funnel-menu.ts +131 -0
- package/src/web/components/database/grid/filter-multiple-values-dialog.tsx +61 -0
- package/src/web/components/database/grid/filter-row.tsx +216 -0
- package/src/web/components/database/grid/filter-sheet.tsx +227 -0
- package/src/web/components/database/grid/filters-panel.tsx +163 -0
- package/src/web/components/database/grid/fk-cell-button.ts +67 -0
- package/src/web/components/database/grid/fk-cell-editor.tsx +36 -0
- package/src/web/components/database/grid/form-view-model.ts +263 -0
- package/src/web/components/database/grid/form-view.tsx +505 -0
- package/src/web/components/database/grid/generate-sql-dialog.tsx +135 -0
- package/src/web/components/database/grid/generate-sql.ts +101 -0
- package/src/web/components/database/grid/grid-changeset.ts +262 -0
- package/src/web/components/database/grid/grid-filters.ts +172 -0
- package/src/web/components/database/grid/grid-header-overlay.tsx +140 -0
- package/src/web/components/database/grid/grid-save-dialog.tsx +251 -0
- package/src/web/components/database/grid/grid-save-host.tsx +19 -0
- package/src/web/components/database/grid/grid-save-model.ts +64 -0
- package/src/web/components/database/grid/grid-save-store.ts +65 -0
- package/src/web/components/database/grid/grid-status-bar.tsx +54 -0
- package/src/web/components/database/grid/header-bands.ts +232 -0
- package/src/web/components/database/grid/json-document.ts +139 -0
- package/src/web/components/database/grid/json-tree.tsx +74 -0
- package/src/web/components/database/grid/load-more.ts +22 -0
- package/src/web/components/database/grid/master-detail-split.tsx +233 -0
- package/src/web/components/database/grid/pick-table.tsx +109 -0
- package/src/web/components/database/grid/reference-filter.ts +48 -0
- package/src/web/components/database/grid/references-panel.tsx +82 -0
- package/src/web/components/database/grid/references.ts +104 -0
- package/src/web/components/database/grid/refresh-menu.tsx +133 -0
- package/src/web/components/database/grid/row-form-sheet.tsx +234 -0
- package/src/web/components/database/grid/selection-commands.ts +124 -0
- package/src/web/components/database/grid/selection-stats.ts +131 -0
- package/src/web/components/database/grid/set-filter-dialog.tsx +93 -0
- package/src/web/components/database/grid/table-keys.ts +130 -0
- package/src/web/components/database/grid/table-toolbar.tsx +326 -0
- package/src/web/components/database/grid/table-view-state.ts +63 -0
- package/src/web/components/database/grid/text-value-dialog.tsx +80 -0
- package/src/web/components/database/grid/use-cell-long-press.ts +146 -0
- package/src/web/components/database/grid/use-changeset.ts +48 -0
- package/src/web/components/database/grid/use-filter-pickers.ts +76 -0
- package/src/web/components/database/grid/use-grid-copy.ts +99 -0
- package/src/web/components/database/grid/use-opener-focus.ts +17 -0
- package/src/web/components/database/grid/use-pick-search.ts +38 -0
- package/src/web/components/database/grid/use-table-filters.ts +84 -0
- package/src/web/components/database/grid/value-filter-text.ts +96 -0
- package/src/web/components/database/grid/value-lookup-dialog.tsx +91 -0
- package/src/web/components/database/impexp/impexp-columns-dialog.tsx +171 -0
- package/src/web/components/database/impexp/impexp-config.tsx +131 -0
- package/src/web/components/database/impexp/impexp-database-fields.tsx +107 -0
- package/src/web/components/database/impexp/impexp-file-input.tsx +118 -0
- package/src/web/components/database/impexp/impexp-format-options.tsx +127 -0
- package/src/web/components/database/impexp/impexp-map-table.tsx +187 -0
- package/src/web/components/database/impexp/impexp-parts.tsx +77 -0
- package/src/web/components/database/impexp/impexp-side-panes.tsx +191 -0
- package/src/web/components/database/impexp/impexp-state.ts +590 -0
- package/src/web/components/database/impexp/impexp-tab.tsx +222 -0
- package/src/web/components/database/impexp/impexp-tables-select.tsx +169 -0
- package/src/web/components/database/impexp/impexp-upload.ts +52 -0
- package/src/web/components/database/impexp/open-impexp-tab.ts +58 -0
- package/src/web/components/database/impexp/use-impexp-database.ts +75 -0
- package/src/web/components/database/impexp/use-impexp-job.ts +114 -0
- package/src/web/components/database/object-tree/object-menus.ts +141 -0
- package/src/web/components/database/object-tree/object-tree-model.ts +132 -0
- package/src/web/components/database/object-tree/objects-section.tsx +503 -0
- package/src/web/components/database/open-connection-form.ts +21 -0
- package/src/web/components/database/query/discard-result-edits-dialog.tsx +43 -0
- package/src/web/components/database/query/format-sql.ts +67 -0
- package/src/web/components/database/query/history-panel.tsx +177 -0
- package/src/web/components/database/query/messages-panel.tsx +98 -0
- package/src/web/components/database/query/query-file.ts +56 -0
- package/src/web/components/database/query/query-history.ts +56 -0
- package/src/web/components/database/query/query-run-state.ts +282 -0
- package/src/web/components/database/query/query-tab.tsx +397 -0
- package/src/web/components/database/query/query-target-picker.tsx +95 -0
- package/src/web/components/database/query/result-tabs.tsx +104 -0
- package/src/web/components/database/query/result-view.tsx +111 -0
- package/src/web/components/database/query/use-query-file-save.tsx +117 -0
- package/src/web/components/database/query/use-query-runner.ts +202 -0
- package/src/web/components/database/query/use-sql-schema-info.ts +40 -0
- package/src/web/components/database/reformat-cursor.ts +40 -0
- package/src/web/components/database/sidebar-split.tsx +89 -0
- package/src/web/components/database/sql-completion-provider.ts +149 -49
- package/src/web/components/database/sql-object/sql-object-model.ts +39 -0
- package/src/web/components/database/sql-object/sql-object-tab.tsx +138 -0
- package/src/web/components/database/sql-query-editor.tsx +203 -36
- package/src/web/components/database/sql-run.ts +40 -0
- package/src/web/components/database/structure/structure-model.ts +90 -0
- package/src/web/components/database/structure/structure-tab.tsx +326 -0
- package/src/web/components/database/table/table-tab.tsx +694 -0
- package/src/web/components/database/table-editor/column-dialog.tsx +129 -0
- package/src/web/components/database/table-editor/editor-dialog.tsx +122 -0
- package/src/web/components/database/table-editor/foreign-key-dialog.tsx +188 -0
- package/src/web/components/database/table-editor/key-dialog.tsx +197 -0
- package/src/web/components/database/table-editor/rename-object-dialog.tsx +45 -0
- package/src/web/components/database/table-editor/structure-save-dialog.tsx +167 -0
- package/src/web/components/database/table-editor/structure-save-host.tsx +24 -0
- package/src/web/components/database/table-editor/structure-save-model.ts +91 -0
- package/src/web/components/database/table-editor/structure-save-store.ts +52 -0
- package/src/web/components/database/table-editor/table-editor-commands.ts +27 -0
- package/src/web/components/database/table-editor/table-editor-dialogs.tsx +32 -0
- package/src/web/components/database/table-editor/table-editor-model.ts +252 -0
- package/src/web/components/database/table-editor/table-editor.tsx +485 -0
- package/src/web/components/database/table-editor/use-table-editor-tab.ts +145 -0
- package/src/web/components/database/use-connections.ts +39 -85
- package/src/web/components/database/use-database.ts +419 -214
- package/src/web/components/database/use-db-read.ts +88 -0
- package/src/web/components/database/use-db-tab.ts +68 -0
- package/src/web/components/database/use-glide-cell-content.ts +81 -88
- package/src/web/components/database/use-glide-columns.ts +16 -32
- package/src/web/components/database/use-glide-grid-actions.ts +44 -99
- package/src/web/components/database/use-glide-selection.ts +6 -18
- package/src/web/components/design/design-skill-suggestion.tsx +46 -11
- package/src/web/components/editor/code-editor.tsx +81 -47
- package/src/web/components/editor/conflict-editor.tsx +4 -1
- package/src/web/components/editor/diff-viewer.tsx +40 -4
- package/src/web/components/editor/editor-fix-with-ai.tsx +111 -0
- package/src/web/components/editor/editor-selection-context.tsx +70 -0
- package/src/web/components/editor/html-preview.tsx +48 -9
- package/src/web/components/editor/lsp-status.tsx +18 -4
- package/src/web/components/editor/video-player/video-player-controls.tsx +19 -3
- package/src/web/components/editor/video-player/video-player.tsx +67 -14
- package/src/web/components/extensions/extension-webview.tsx +44 -9
- package/src/web/components/extensions/webview-external-link.ts +29 -0
- package/src/web/components/extensions/webview-file-icons.ts +87 -0
- package/src/web/components/extensions/webview-theme.ts +12 -0
- package/src/web/components/floating-window/window-content-registry.ts +2 -0
- package/src/web/components/floating-window/window-geometry.ts +3 -3
- package/src/web/components/floating-window/window-store-types.ts +1 -1
- package/src/web/components/git/git-branch-row.tsx +138 -0
- package/src/web/components/git/git-change-parts.tsx +142 -0
- package/src/web/components/git/git-change-row.tsx +218 -0
- package/src/web/components/git/git-change-tree.tsx +190 -0
- package/src/web/components/git/git-commit-composer.tsx +126 -0
- package/src/web/components/git/git-confirm.tsx +84 -0
- package/src/web/components/git/git-operation-banner.tsx +48 -0
- package/src/web/components/git/git-stash-section.tsx +128 -0
- package/src/web/components/git/git-status-panel.tsx +588 -1043
- package/src/web/components/git/git-worktree-panel.tsx +7 -7
- package/src/web/components/git-review/git-review-block.tsx +356 -0
- package/src/web/components/git-review/git-review-desktop.tsx +355 -0
- package/src/web/components/git-review/git-review-parts.tsx +238 -0
- package/src/web/components/git-review/git-review-phone.tsx +230 -0
- package/src/web/components/git-review/git-review-tab.tsx +123 -0
- package/src/web/components/layout/cloud-share-named-tunnel-row.tsx +2 -2
- package/src/web/components/layout/command-palette-db-commands.ts +56 -0
- package/src/web/components/layout/command-palette.tsx +41 -16
- package/src/web/components/layout/draggable-tab.tsx +7 -0
- package/src/web/components/layout/mobile-drawer.tsx +27 -14
- package/src/web/components/layout/mobile-nav.tsx +4 -3
- package/src/web/components/layout/mobile-tab-switcher-sheet.tsx +8 -1
- package/src/web/components/layout/nav-section-rail.tsx +22 -6
- package/src/web/components/layout/sidebar.tsx +2 -2
- package/src/web/components/layout/status-bar.tsx +3 -0
- package/src/web/components/layout/tab-bar.tsx +5 -8
- package/src/web/components/layout/tab-close-confirm-dialog.tsx +62 -0
- package/src/web/components/layout/tab-content.tsx +47 -7
- package/src/web/components/layout/tab-pool.tsx +10 -2
- package/src/web/components/layout/upgrade-button.tsx +3 -2
- package/src/web/components/logs/logs-actions.ts +84 -0
- package/src/web/components/logs/logs-app.tsx +265 -0
- package/src/web/components/logs/logs-client.ts +31 -0
- package/src/web/components/logs/logs-issues-pane.tsx +214 -0
- package/src/web/components/logs/logs-pane.tsx +683 -0
- package/src/web/components/logs/logs-phone-pane.tsx +365 -0
- package/src/web/components/logs/logs-report-pane.tsx +440 -0
- package/src/web/components/logs/logs-report-store.ts +153 -0
- package/src/web/components/logs/logs-state.ts +93 -0
- package/src/web/components/logs/logs-tab.tsx +4 -0
- package/src/web/components/logs/logs-ui.tsx +104 -0
- package/src/web/components/logs/logs-window-content.tsx +13 -0
- package/src/web/components/logs/logs.css +440 -0
- package/src/web/components/logs/open-logs.ts +65 -0
- package/src/web/components/logs/use-follow-list.ts +90 -0
- package/src/web/components/logs/use-logs-badge.ts +57 -0
- package/src/web/components/logs/use-logs-feed.ts +251 -0
- package/src/web/components/logs/use-logs-issues.ts +61 -0
- package/src/web/components/onboarding/onboarding-quick-orientation.tsx +4 -4
- package/src/web/components/os-explorer/views/inline-name-input.tsx +13 -4
- package/src/web/components/remote-desktop/ffmpeg-install-button.tsx +59 -0
- package/src/web/components/remote-desktop/remote-desktop-readiness-gate.tsx +2 -0
- package/src/web/components/remote-desktop/use-remote-desktop-readiness.ts +1 -0
- package/src/web/components/session-review/review-code.tsx +507 -0
- package/src/web/components/session-review/review-desktop.tsx +256 -0
- package/src/web/components/session-review/review-parts.tsx +267 -0
- package/src/web/components/session-review/review-phone.tsx +206 -0
- package/src/web/components/session-review/review-tokens.tsx +70 -0
- package/src/web/components/session-review/review-view.tsx +158 -0
- package/src/web/components/session-review/session-review-tab.tsx +71 -0
- package/src/web/components/settings/ai-settings-section.tsx +20 -0
- package/src/web/components/settings/database-drivers-section.tsx +251 -0
- package/src/web/components/settings/design-settings-section.tsx +52 -3
- package/src/web/components/settings/language-servers-section.tsx +8 -2
- package/src/web/components/settings/notifications-settings-section.tsx +463 -24
- package/src/web/components/settings/ntfy-server-form.tsx +192 -0
- package/src/web/components/settings/open-settings.ts +11 -9
- package/src/web/components/settings/ppmbot-settings-section.tsx +6 -214
- package/src/web/components/settings/ppmbot-telegram-section.tsx +139 -0
- package/src/web/components/settings/remote-access/public-link-pane.tsx +282 -0
- package/src/web/components/settings/remote-access/remote-access-settings-section.tsx +49 -0
- package/src/web/components/settings/remote-access/remote-access-tab-store.ts +24 -0
- package/src/web/components/settings/run-in-terminal-button.tsx +32 -0
- package/src/web/components/settings/settings-body.tsx +14 -2
- package/src/web/components/settings/settings-categories.ts +14 -1
- package/src/web/components/settings/settings-rows.tsx +61 -0
- package/src/web/components/settings/settings-section-content.tsx +2 -0
- package/src/web/components/settings/tailscale/tailscale-settings-section.tsx +410 -0
- package/src/web/components/settings/tailscale/tailscale-setup-steps.tsx +248 -0
- package/src/web/components/settings/tailscale/tailscale-sign-in-dialog.tsx +98 -0
- package/src/web/components/settings/tailscale/tailscale-ui.tsx +81 -0
- package/src/web/components/settings/telegram-bot-token-field.tsx +129 -0
- package/src/web/components/settings/telegram-connect.tsx +147 -0
- package/src/web/components/settings/voice-settings-section.tsx +28 -3
- package/src/web/components/sqlite/sqlite-viewer.tsx +92 -134
- package/src/web/components/system/apps/app-rows.ts +19 -3
- package/src/web/components/system/apps/apps-panel.tsx +3 -1
- package/src/web/components/system/services/service-action-confirm.tsx +20 -1
- package/src/web/components/system/services/service-details-sheet.tsx +14 -4
- package/src/web/components/system/services/service-details-text.ts +5 -0
- package/src/web/components/system/services/services-panel.tsx +7 -5
- package/src/web/components/terminal/terminal-selection-chat.tsx +178 -0
- package/src/web/components/terminal/terminal-tab.tsx +10 -6
- package/src/web/components/tunnels/named-tunnel/named-tunnel-copy.ts +1 -20
- package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-content.tsx +1 -1
- package/src/web/components/tunnels/named-tunnel/named-tunnel-setup-popup.tsx +2 -2
- package/src/web/components/tunnels/named-tunnel/use-named-tunnel-setup.ts +1 -1
- package/src/web/components/tunnels/open-port-forwarding.ts +17 -0
- package/src/web/components/tunnels/port-forwarding-panel.tsx +370 -0
- package/src/web/components/ui/adaptive-context-menu.tsx +32 -3
- package/src/web/components/ui/sidebar-header.tsx +1 -1
- package/src/web/components/web-preview/open-web-preview-tab.ts +14 -0
- package/src/web/components/web-preview/web-preview-tab.tsx +92 -0
- package/src/web/hooks/use-at-most-wide.ts +20 -0
- package/src/web/hooks/use-chat.ts +214 -11
- package/src/web/hooks/use-commit-draft.ts +59 -0
- package/src/web/hooks/use-db-driver-installed.ts +16 -0
- package/src/web/hooks/use-draft.ts +25 -15
- package/src/web/hooks/use-extension-ws.ts +15 -1
- package/src/web/hooks/use-git-changes.ts +114 -0
- package/src/web/hooks/use-git-review.ts +617 -0
- package/src/web/hooks/use-global-events.ts +5 -0
- package/src/web/hooks/use-lsp.ts +4 -2
- package/src/web/hooks/use-notification-clicks.ts +43 -0
- package/src/web/hooks/use-session-file-changes.ts +100 -0
- package/src/web/hooks/use-session-review.ts +554 -0
- package/src/web/hooks/use-session-turns.ts +65 -0
- package/src/web/hooks/use-terminal.ts +19 -5
- package/src/web/hooks/use-turn-review.ts +204 -0
- package/src/web/hooks/use-url-sync.ts +15 -12
- package/src/web/lib/aggregate-turn-file-changes.ts +127 -35
- package/src/web/lib/ai-tab-placement.ts +102 -0
- package/src/web/lib/api-client.ts +113 -47
- package/src/web/lib/api-settings.ts +1 -0
- package/src/web/lib/api-tailscale.ts +12 -0
- package/src/web/lib/api-tunnels.ts +13 -1
- package/src/web/lib/code-fence.ts +7 -0
- package/src/web/lib/db-drivers.ts +41 -0
- package/src/web/lib/db-table-edit.ts +94 -0
- package/src/web/lib/db-tabs.ts +273 -0
- package/src/web/lib/design/api-design-settings.ts +11 -0
- package/src/web/lib/file-icon-name.ts +6 -0
- package/src/web/lib/file-icons.generated.ts +10 -1
- package/src/web/lib/file-icons.tsx +34 -6
- package/src/web/lib/git-changes-view.ts +292 -0
- package/src/web/lib/git-file-tree.ts +8 -8
- package/src/web/lib/git-review-model.ts +496 -0
- package/src/web/lib/html-preview-loads.ts +87 -0
- package/src/web/lib/icons.generated.tsx +41 -1
- package/src/web/lib/logs/logs-report.ts +128 -0
- package/src/web/lib/logs/logs-view-model.ts +201 -0
- package/src/web/lib/lsp/lsp-client.ts +1 -1
- package/src/web/lib/lsp/lsp-documents.ts +8 -0
- package/src/web/lib/lsp/register-providers.ts +5 -1
- package/src/web/lib/monaco-lightbulb-gutter.ts +32 -0
- package/src/web/lib/open-ai-tab.ts +160 -0
- package/src/web/lib/open-git-review.ts +24 -0
- package/src/web/lib/read-ndjson.ts +35 -0
- package/src/web/lib/running-agent-rows.ts +14 -16
- package/src/web/lib/send-to-chat.ts +55 -9
- package/src/web/lib/session-file-changes-client.ts +148 -0
- package/src/web/lib/session-file-changes.ts +69 -0
- package/src/web/lib/session-review-model.ts +379 -0
- package/src/web/lib/session-turns.ts +123 -0
- package/src/web/lib/sidebar-tabs/tab-registry.ts +1 -1
- package/src/web/lib/tab-tool-call.ts +69 -0
- package/src/web/lib/tab-type-icons.ts +12 -3
- package/src/web/lib/turn-review.ts +102 -0
- package/src/web/lib/web-preview-url.ts +31 -0
- package/src/web/lib/web-push-client.ts +91 -0
- package/src/web/lib/web-push-support.ts +88 -0
- package/src/web/stores/chat-jump-store.ts +31 -0
- package/src/web/stores/commit-draft-store.ts +119 -0
- package/src/web/stores/db-rows-status-store.ts +31 -0
- package/src/web/stores/git-status-store.ts +21 -2
- package/src/web/stores/panel-store.ts +34 -0
- package/src/web/stores/panel-utils.ts +69 -8
- package/src/web/stores/session-turns-store.ts +40 -0
- package/src/web/stores/settings-store.ts +72 -42
- package/src/web/stores/tab-close-confirm-store.ts +59 -0
- package/src/web/stores/tab-store.ts +10 -2
- package/src/web/stores/unsaved-grid-rows-store.ts +42 -0
- package/src/web/stores/window-panel-persistence.ts +23 -10
- package/src/web/styles/file-icons.generated.css +6 -0
- package/src/web/styles/globals.css +54 -0
- package/src/web/sw-notification-click.ts +51 -0
- package/src/web/sw.ts +35 -0
- package/src/web/theme/adapters/shiki-adapter.ts +55 -1
- package/templates/skill/SKILL.md.tmpl +4 -3
- package/templates/skill/common-tasks.md +8 -4
- package/vite.config.ts +3 -0
- package/dist/web/assets/_basePickBy-BEVUuplK.js +0 -1
- package/dist/web/assets/_basePickBy-BEVUuplK.js.br +0 -0
- package/dist/web/assets/_basePickBy-BEVUuplK.js.gz +0 -0
- package/dist/web/assets/_baseUniq-qb_BgEfK.js +0 -1
- package/dist/web/assets/_baseUniq-qb_BgEfK.js.br +0 -0
- package/dist/web/assets/_baseUniq-qb_BgEfK.js.gz +0 -0
- package/dist/web/assets/accounts-settings-section-CGe5ikvs.js +0 -1
- package/dist/web/assets/accounts-settings-section-CGe5ikvs.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-CGe5ikvs.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-store-_OeezCXB.js +0 -1
- package/dist/web/assets/agent-session-sheet-vBhfHYrC.js +0 -2
- package/dist/web/assets/agent-session-sheet-vBhfHYrC.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-vBhfHYrC.js.gz +0 -0
- package/dist/web/assets/agent-session-window-content-BxIxDN5i.js +0 -1
- package/dist/web/assets/agent-session-window-content-BxIxDN5i.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-BxIxDN5i.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-Y8clBPRv.js +0 -1
- package/dist/web/assets/ai-resource-editor-Y8clBPRv.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-Y8clBPRv.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-BB8vscte.js +0 -1
- package/dist/web/assets/ai-settings-section-Ck8uN_Bw.js +0 -1
- package/dist/web/assets/ai-settings-section-Ck8uN_Bw.js.br +0 -0
- package/dist/web/assets/ai-settings-section-Ck8uN_Bw.js.gz +0 -0
- package/dist/web/assets/android-tab-BIOUVVoW.js +0 -2
- package/dist/web/assets/android-tab-BIOUVVoW.js.br +0 -0
- package/dist/web/assets/android-tab-BIOUVVoW.js.gz +0 -0
- package/dist/web/assets/angular-html-Djm1KT_p.js +0 -1
- package/dist/web/assets/angular-html-Djm1KT_p.js.br +0 -0
- package/dist/web/assets/angular-html-Djm1KT_p.js.gz +0 -0
- package/dist/web/assets/angular-ts-D8ZYU4i0.js +0 -1
- package/dist/web/assets/angular-ts-D8ZYU4i0.js.br +0 -0
- package/dist/web/assets/angular-ts-D8ZYU4i0.js.gz +0 -0
- package/dist/web/assets/api-client-CbrcysYC.js +0 -1
- package/dist/web/assets/api-client-F5Zi1sR0.js +0 -1
- package/dist/web/assets/api-client-F5Zi1sR0.js.br +0 -0
- package/dist/web/assets/api-client-F5Zi1sR0.js.gz +0 -0
- package/dist/web/assets/api-settings-Cc_CpfmC.js +0 -1
- package/dist/web/assets/api-settings-Cc_CpfmC.js.br +0 -0
- package/dist/web/assets/api-settings-Cc_CpfmC.js.gz +0 -0
- package/dist/web/assets/api-settings-D1axn9vm.js +0 -1
- package/dist/web/assets/api-themes-BtMBSjuM.js +0 -1
- package/dist/web/assets/apl-Bxk9ez2r.js +0 -1
- package/dist/web/assets/apl-Bxk9ez2r.js.br +0 -0
- package/dist/web/assets/apl-Bxk9ez2r.js.gz +0 -0
- package/dist/web/assets/appearance-settings-section-Bv5_n9lH.js +0 -1
- package/dist/web/assets/appearance-settings-section-Bv5_n9lH.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-Bv5_n9lH.js.gz +0 -0
- package/dist/web/assets/apps-panel-DXHF0QEv.js +0 -1
- package/dist/web/assets/apps-panel-DXHF0QEv.js.br +0 -0
- package/dist/web/assets/apps-panel-DXHF0QEv.js.gz +0 -0
- package/dist/web/assets/arc-CrBOnruw.js +0 -1
- package/dist/web/assets/arc-CrBOnruw.js.br +0 -0
- package/dist/web/assets/arc-CrBOnruw.js.gz +0 -0
- package/dist/web/assets/architecture-PBZL5I3N-bv6Z6ZTl.js +0 -1
- package/dist/web/assets/architectureDiagram-2XIMDMQ5-sFj2GCA0.js +0 -36
- package/dist/web/assets/architectureDiagram-2XIMDMQ5-sFj2GCA0.js.br +0 -0
- package/dist/web/assets/architectureDiagram-2XIMDMQ5-sFj2GCA0.js.gz +0 -0
- package/dist/web/assets/astro-CCE8GTuJ.js +0 -1
- package/dist/web/assets/astro-CCE8GTuJ.js.br +0 -0
- package/dist/web/assets/astro-CCE8GTuJ.js.gz +0 -0
- package/dist/web/assets/audio-preview-DpjOKEm4.js +0 -1
- package/dist/web/assets/audio-preview-DpjOKEm4.js.br +0 -0
- package/dist/web/assets/audio-preview-DpjOKEm4.js.gz +0 -0
- package/dist/web/assets/blade-pJLFJ0pe.js +0 -1
- package/dist/web/assets/blade-pJLFJ0pe.js.br +0 -0
- package/dist/web/assets/blade-pJLFJ0pe.js.gz +0 -0
- package/dist/web/assets/blockDiagram-WCTKOSBZ-DFag_MHk.js +0 -132
- package/dist/web/assets/blockDiagram-WCTKOSBZ-DFag_MHk.js.br +0 -0
- package/dist/web/assets/blockDiagram-WCTKOSBZ-DFag_MHk.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-4dgMNadQ.js +0 -1
- package/dist/web/assets/branch-review-tab-4dgMNadQ.js.br +0 -0
- package/dist/web/assets/branch-review-tab-4dgMNadQ.js.gz +0 -0
- package/dist/web/assets/bsl-DJPQP6gj.js +0 -1
- package/dist/web/assets/bsl-DJPQP6gj.js.br +0 -0
- package/dist/web/assets/bsl-DJPQP6gj.js.gz +0 -0
- package/dist/web/assets/button-DeAyLH9U.js +0 -1
- package/dist/web/assets/button-DeAyLH9U.js.br +0 -0
- package/dist/web/assets/button-DeAyLH9U.js.gz +0 -0
- package/dist/web/assets/c4Diagram-IC4MRINW-Bs9OCCbR.js +0 -10
- package/dist/web/assets/c4Diagram-IC4MRINW-Bs9OCCbR.js.br +0 -0
- package/dist/web/assets/c4Diagram-IC4MRINW-Bs9OCCbR.js.gz +0 -0
- package/dist/web/assets/cairo-6pdze4qN.js +0 -1
- package/dist/web/assets/cairo-6pdze4qN.js.br +0 -0
- package/dist/web/assets/cairo-6pdze4qN.js.gz +0 -0
- package/dist/web/assets/channel-C97aABFT.js +0 -1
- package/dist/web/assets/chat-preparation-cache-BUCR58h4.js +0 -1
- package/dist/web/assets/chat-preparation-cache-BUCR58h4.js.br +0 -0
- package/dist/web/assets/chat-preparation-cache-BUCR58h4.js.gz +0 -0
- package/dist/web/assets/chat-tab-Bbe_77oJ.js +0 -15
- package/dist/web/assets/chat-tab-Bbe_77oJ.js.br +0 -0
- package/dist/web/assets/chat-tab-Bbe_77oJ.js.gz +0 -0
- package/dist/web/assets/chat-tab-D3i5O3dO.js +0 -1
- package/dist/web/assets/chat-tab-D3i5O3dO.js.br +0 -0
- package/dist/web/assets/chat-tab-D3i5O3dO.js.gz +0 -0
- package/dist/web/assets/chunk-4BX2VUAB-Dd8hGWzs.js +0 -1
- package/dist/web/assets/chunk-55IACEB6-BUOmRdCb.js +0 -1
- package/dist/web/assets/chunk-7E7YKBS2-D5i9aZ57.js +0 -1
- package/dist/web/assets/chunk-7R4GIKGN-DBr9s6EE.js +0 -80
- package/dist/web/assets/chunk-7R4GIKGN-DBr9s6EE.js.br +0 -0
- package/dist/web/assets/chunk-7R4GIKGN-DBr9s6EE.js.gz +0 -0
- package/dist/web/assets/chunk-C72U2L5F-CEUvONYx.js +0 -1
- package/dist/web/assets/chunk-EGIJ26TM-BG89sF-p.js +0 -1
- package/dist/web/assets/chunk-FMBD7UC4-BDtpoO-Q.js +0 -15
- package/dist/web/assets/chunk-GEFDOKGD-lFQnV7FQ.js +0 -2
- package/dist/web/assets/chunk-GEFDOKGD-lFQnV7FQ.js.br +0 -0
- package/dist/web/assets/chunk-GEFDOKGD-lFQnV7FQ.js.gz +0 -0
- package/dist/web/assets/chunk-GLR3WWYH-CBQYONd8.js +0 -2
- package/dist/web/assets/chunk-GLR3WWYH-CBQYONd8.js.br +0 -0
- package/dist/web/assets/chunk-GLR3WWYH-CBQYONd8.js.gz +0 -0
- package/dist/web/assets/chunk-HHEYEP7N-Cz5o2sXg.js +0 -1
- package/dist/web/assets/chunk-JSJVCQXG-FBF1o1AC.js +0 -1
- package/dist/web/assets/chunk-JSJVCQXG-FBF1o1AC.js.br +0 -0
- package/dist/web/assets/chunk-JSJVCQXG-FBF1o1AC.js.gz +0 -0
- package/dist/web/assets/chunk-KX2RTZJC-Dfwu46M7.js +0 -1
- package/dist/web/assets/chunk-KYZI473N-DQTRCz9g.js +0 -53
- package/dist/web/assets/chunk-KYZI473N-DQTRCz9g.js.br +0 -0
- package/dist/web/assets/chunk-KYZI473N-DQTRCz9g.js.gz +0 -0
- package/dist/web/assets/chunk-L3YUKLVL-DytBx0nd.js +0 -1
- package/dist/web/assets/chunk-MX3YWQON-Da7GPDei.js +0 -1
- package/dist/web/assets/chunk-MX3YWQON-Da7GPDei.js.br +0 -0
- package/dist/web/assets/chunk-MX3YWQON-Da7GPDei.js.gz +0 -0
- package/dist/web/assets/chunk-NQ4KR5QH-D9-qngPN.js +0 -220
- package/dist/web/assets/chunk-NQ4KR5QH-D9-qngPN.js.br +0 -0
- package/dist/web/assets/chunk-NQ4KR5QH-D9-qngPN.js.gz +0 -0
- package/dist/web/assets/chunk-O4XLMI2P-BFAbMP-p.js +0 -7
- package/dist/web/assets/chunk-O4XLMI2P-BFAbMP-p.js.br +0 -0
- package/dist/web/assets/chunk-O4XLMI2P-BFAbMP-p.js.gz +0 -0
- package/dist/web/assets/chunk-OZEHJAEY-DM7Vtv5V.js +0 -1
- package/dist/web/assets/chunk-OZEHJAEY-DM7Vtv5V.js.br +0 -0
- package/dist/web/assets/chunk-OZEHJAEY-DM7Vtv5V.js.gz +0 -0
- package/dist/web/assets/chunk-PQ6SQG4A-CfSY-HG3.js +0 -1
- package/dist/web/assets/chunk-PQ6SQG4A-CfSY-HG3.js.br +0 -0
- package/dist/web/assets/chunk-PQ6SQG4A-CfSY-HG3.js.gz +0 -0
- package/dist/web/assets/chunk-PU5JKC2W-BFI9jx5F.js +0 -11
- package/dist/web/assets/chunk-PU5JKC2W-BFI9jx5F.js.br +0 -0
- package/dist/web/assets/chunk-PU5JKC2W-BFI9jx5F.js.gz +0 -0
- package/dist/web/assets/chunk-QZHKN3VN-_jIwYKZ3.js +0 -1
- package/dist/web/assets/chunk-R5LLSJPH-CZY_f--s.js +0 -1
- package/dist/web/assets/chunk-WL4C6EOR-BUFIzsiK.js +0 -189
- package/dist/web/assets/chunk-WL4C6EOR-BUFIzsiK.js.br +0 -0
- package/dist/web/assets/chunk-WL4C6EOR-BUFIzsiK.js.gz +0 -0
- package/dist/web/assets/chunk-XIRO2GV7-BxPFOPRI.js +0 -1
- package/dist/web/assets/chunk-XPW4576I-DfOF_qdG.js +0 -32
- package/dist/web/assets/chunk-XPW4576I-DfOF_qdG.js.br +0 -0
- package/dist/web/assets/chunk-XPW4576I-DfOF_qdG.js.gz +0 -0
- package/dist/web/assets/chunk-XZSTWKYB-BNlQ8dIW.js +0 -94
- package/dist/web/assets/chunk-XZSTWKYB-BNlQ8dIW.js.br +0 -0
- package/dist/web/assets/chunk-XZSTWKYB-BNlQ8dIW.js.gz +0 -0
- package/dist/web/assets/chunk-YBOYWFTD-0Is1vHmh.js +0 -1
- package/dist/web/assets/classDiagram-VBA2DB6C-HwLNQY_4.js +0 -1
- package/dist/web/assets/classDiagram-v2-RAHNMMFH-CLUQCcjH.js +0 -1
- package/dist/web/assets/clone-B5kRZECd.js +0 -1
- package/dist/web/assets/cobol-6JrtZ3xT.js +0 -1
- package/dist/web/assets/cobol-6JrtZ3xT.js.br +0 -0
- package/dist/web/assets/cobol-6JrtZ3xT.js.gz +0 -0
- package/dist/web/assets/code-editor-DXsIWoQ1.js +0 -7
- package/dist/web/assets/code-editor-DXsIWoQ1.js.br +0 -0
- package/dist/web/assets/code-editor-DXsIWoQ1.js.gz +0 -0
- package/dist/web/assets/codex-reset-credit-button-DRhievFQ.js +0 -1
- package/dist/web/assets/codex-reset-credit-button-DRhievFQ.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-DRhievFQ.js.gz +0 -0
- package/dist/web/assets/coffee-eR0Qd-vR.js +0 -1
- package/dist/web/assets/coffee-eR0Qd-vR.js.br +0 -0
- package/dist/web/assets/coffee-eR0Qd-vR.js.gz +0 -0
- package/dist/web/assets/conflict-editor-D_RImo_V.js +0 -19
- package/dist/web/assets/conflict-editor-D_RImo_V.js.br +0 -0
- package/dist/web/assets/conflict-editor-D_RImo_V.js.gz +0 -0
- package/dist/web/assets/context-menu-7OX80HDB.js +0 -1
- package/dist/web/assets/context-menu-7OX80HDB.js.br +0 -0
- package/dist/web/assets/context-menu-7OX80HDB.js.gz +0 -0
- package/dist/web/assets/cose-bilkent-S5V4N54A-CAPPRjYz.js +0 -1
- package/dist/web/assets/cose-bilkent-S5V4N54A-CAPPRjYz.js.br +0 -0
- package/dist/web/assets/cose-bilkent-S5V4N54A-CAPPRjYz.js.gz +0 -0
- package/dist/web/assets/cpp-Bp_Laxmd.js +0 -1
- package/dist/web/assets/cpp-Bp_Laxmd.js.br +0 -0
- package/dist/web/assets/cpp-Bp_Laxmd.js.gz +0 -0
- package/dist/web/assets/crystal-bc0lS6i8.js +0 -1
- package/dist/web/assets/crystal-bc0lS6i8.js.br +0 -0
- package/dist/web/assets/crystal-bc0lS6i8.js.gz +0 -0
- package/dist/web/assets/csv-parser-CoxPdyLw.js +0 -6
- package/dist/web/assets/csv-parser-CoxPdyLw.js.br +0 -0
- package/dist/web/assets/csv-parser-CoxPdyLw.js.gz +0 -0
- package/dist/web/assets/csv-preview-BuFdfLo3.js +0 -2
- package/dist/web/assets/csv-preview-BuFdfLo3.js.br +0 -0
- package/dist/web/assets/csv-preview-BuFdfLo3.js.gz +0 -0
- package/dist/web/assets/dagre-D__SE4Ki.js +0 -1
- package/dist/web/assets/dagre-D__SE4Ki.js.br +0 -0
- package/dist/web/assets/dagre-D__SE4Ki.js.gz +0 -0
- package/dist/web/assets/dagre-KLK3FWXG-By-0HuN_.js +0 -4
- package/dist/web/assets/dagre-KLK3FWXG-By-0HuN_.js.br +0 -0
- package/dist/web/assets/dagre-KLK3FWXG-By-0HuN_.js.gz +0 -0
- package/dist/web/assets/data-grid-overlay-editor-CeZoduke.js +0 -1
- package/dist/web/assets/data-grid-overlay-editor-CeZoduke.js.br +0 -0
- package/dist/web/assets/data-grid-overlay-editor-CeZoduke.js.gz +0 -0
- package/dist/web/assets/data-grid-types-CHD9-pon.js +0 -1
- package/dist/web/assets/data-grid-types-CHD9-pon.js.br +0 -0
- package/dist/web/assets/data-grid-types-CHD9-pon.js.gz +0 -0
- package/dist/web/assets/database-viewer-ChcbYn9E.js +0 -1
- package/dist/web/assets/database-viewer-ChcbYn9E.js.br +0 -0
- package/dist/web/assets/database-viewer-ChcbYn9E.js.gz +0 -0
- package/dist/web/assets/design-export-client-BfdZB7xK.js +0 -1
- package/dist/web/assets/design-export-client-BfdZB7xK.js.br +0 -0
- package/dist/web/assets/design-export-client-BfdZB7xK.js.gz +0 -0
- package/dist/web/assets/design-responsive-dialog-BiYy3ibS.js +0 -1
- package/dist/web/assets/design-responsive-dialog-BiYy3ibS.js.br +0 -0
- package/dist/web/assets/design-responsive-dialog-BiYy3ibS.js.gz +0 -0
- package/dist/web/assets/design-settings-section-B_xOf51h.js +0 -2
- package/dist/web/assets/design-settings-section-B_xOf51h.js.br +0 -0
- package/dist/web/assets/design-settings-section-B_xOf51h.js.gz +0 -0
- package/dist/web/assets/design-skill-suggestion-BbEDg15Z.js +0 -3
- package/dist/web/assets/design-skill-suggestion-BbEDg15Z.js.br +0 -0
- package/dist/web/assets/design-skill-suggestion-BbEDg15Z.js.gz +0 -0
- package/dist/web/assets/design-tab-BQSYJ4cS.js +0 -57
- package/dist/web/assets/design-tab-BQSYJ4cS.js.br +0 -0
- package/dist/web/assets/design-tab-BQSYJ4cS.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-AiPaYfSU.js +0 -1
- package/dist/web/assets/designs-sidebar-panel-AiPaYfSU.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-AiPaYfSU.js.gz +0 -0
- package/dist/web/assets/diagram-E7M64L7V-w1uoD2zJ.js +0 -24
- package/dist/web/assets/diagram-E7M64L7V-w1uoD2zJ.js.br +0 -0
- package/dist/web/assets/diagram-E7M64L7V-w1uoD2zJ.js.gz +0 -0
- package/dist/web/assets/diagram-IFDJBPK2-DIZ1Hm8C.js +0 -43
- package/dist/web/assets/diagram-IFDJBPK2-DIZ1Hm8C.js.br +0 -0
- package/dist/web/assets/diagram-IFDJBPK2-DIZ1Hm8C.js.gz +0 -0
- package/dist/web/assets/diagram-P4PSJMXO-DJg8_uM2.js +0 -24
- package/dist/web/assets/diagram-P4PSJMXO-DJg8_uM2.js.br +0 -0
- package/dist/web/assets/diagram-P4PSJMXO-DJg8_uM2.js.gz +0 -0
- package/dist/web/assets/dialog-Bocc0Fgb.js +0 -1
- package/dist/web/assets/dialog-Bocc0Fgb.js.br +0 -0
- package/dist/web/assets/dialog-Bocc0Fgb.js.gz +0 -0
- package/dist/web/assets/diff-viewer-BZ6glGK-.js +0 -4
- package/dist/web/assets/diff-viewer-BZ6glGK-.js.br +0 -0
- package/dist/web/assets/diff-viewer-BZ6glGK-.js.gz +0 -0
- package/dist/web/assets/dist-CBtAY9iX.js +0 -1
- package/dist/web/assets/dist-CBtAY9iX.js.br +0 -0
- package/dist/web/assets/dist-CBtAY9iX.js.gz +0 -0
- package/dist/web/assets/dist-CWwUZUqE.js +0 -11
- package/dist/web/assets/dist-CWwUZUqE.js.br +0 -0
- package/dist/web/assets/dist-CWwUZUqE.js.gz +0 -0
- package/dist/web/assets/docx-preview-Dt6RQpfA.js +0 -12
- package/dist/web/assets/docx-preview-Dt6RQpfA.js.br +0 -0
- package/dist/web/assets/docx-preview-Dt6RQpfA.js.gz +0 -0
- package/dist/web/assets/edge-BxayftlC.js +0 -1
- package/dist/web/assets/edge-BxayftlC.js.br +0 -0
- package/dist/web/assets/edge-BxayftlC.js.gz +0 -0
- package/dist/web/assets/edit-diff-preview-D-FNLOU2.js +0 -7
- package/dist/web/assets/edit-diff-preview-D-FNLOU2.js.br +0 -0
- package/dist/web/assets/edit-diff-preview-D-FNLOU2.js.gz +0 -0
- package/dist/web/assets/editor-language-service-4sbsdqBV.js +0 -1
- package/dist/web/assets/editor-language-service-4sbsdqBV.js.br +0 -0
- package/dist/web/assets/editor-language-service-4sbsdqBV.js.gz +0 -0
- package/dist/web/assets/elixir-CncTBq2d.js +0 -1
- package/dist/web/assets/elixir-CncTBq2d.js.br +0 -0
- package/dist/web/assets/elixir-CncTBq2d.js.gz +0 -0
- package/dist/web/assets/elm-1uJDe5N1.js +0 -1
- package/dist/web/assets/elm-1uJDe5N1.js.br +0 -0
- package/dist/web/assets/elm-1uJDe5N1.js.gz +0 -0
- package/dist/web/assets/erDiagram-INFDFZHY-CXGHzu5w.js +0 -70
- package/dist/web/assets/erDiagram-INFDFZHY-CXGHzu5w.js.br +0 -0
- package/dist/web/assets/erDiagram-INFDFZHY-CXGHzu5w.js.gz +0 -0
- package/dist/web/assets/erb-dH8FUiNl.js +0 -1
- package/dist/web/assets/erb-dH8FUiNl.js.br +0 -0
- package/dist/web/assets/erb-dH8FUiNl.js.gz +0 -0
- package/dist/web/assets/erlang-D0F-1O48.js +0 -1
- package/dist/web/assets/erlang-D0F-1O48.js.br +0 -0
- package/dist/web/assets/erlang-D0F-1O48.js.gz +0 -0
- package/dist/web/assets/esm-C3TeLjGW.js +0 -2
- package/dist/web/assets/esm-C3TeLjGW.js.br +0 -0
- package/dist/web/assets/esm-C3TeLjGW.js.gz +0 -0
- package/dist/web/assets/explorer-body-DbgrG1fe.js +0 -2
- package/dist/web/assets/explorer-body-DbgrG1fe.js.br +0 -0
- package/dist/web/assets/explorer-body-DbgrG1fe.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-BCjWvHpp.js +0 -1
- package/dist/web/assets/explorer-window-content-BCjWvHpp.js.br +0 -0
- package/dist/web/assets/explorer-window-content-BCjWvHpp.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-DiMF4RnT.js +0 -1
- package/dist/web/assets/extension-manager-section-DiMF4RnT.js.br +0 -0
- package/dist/web/assets/extension-manager-section-DiMF4RnT.js.gz +0 -0
- package/dist/web/assets/extension-webview-Coti6Vfw.js +0 -12
- package/dist/web/assets/extension-webview-Coti6Vfw.js.br +0 -0
- package/dist/web/assets/extension-webview-Coti6Vfw.js.gz +0 -0
- package/dist/web/assets/file-icons-CK0J4QSy.js +0 -1
- package/dist/web/assets/file-icons-CK0J4QSy.js.br +0 -0
- package/dist/web/assets/file-icons-CK0J4QSy.js.gz +0 -0
- package/dist/web/assets/file-icons.generated-BtBErEwb.css +0 -1
- package/dist/web/assets/file-icons.generated-BtBErEwb.css.br +0 -0
- package/dist/web/assets/file-icons.generated-BtBErEwb.css.gz +0 -0
- package/dist/web/assets/file-store-Cm7-pHux.js +0 -1
- package/dist/web/assets/file-store-Cm7-pHux.js.br +0 -0
- package/dist/web/assets/file-store-Cm7-pHux.js.gz +0 -0
- package/dist/web/assets/files-settings-section-ZTVwOwx0.js +0 -1
- package/dist/web/assets/files-settings-section-ZTVwOwx0.js.br +0 -0
- package/dist/web/assets/files-settings-section-ZTVwOwx0.js.gz +0 -0
- package/dist/web/assets/flowDiagram-PKNHOUZH-CZmY6JEk.js +0 -162
- package/dist/web/assets/flowDiagram-PKNHOUZH-CZmY6JEk.js.br +0 -0
- package/dist/web/assets/flowDiagram-PKNHOUZH-CZmY6JEk.js.gz +0 -0
- package/dist/web/assets/format-file-meta-Drxf2J-k.js +0 -1
- package/dist/web/assets/format-file-meta-Drxf2J-k.js.br +0 -0
- package/dist/web/assets/format-file-meta-Drxf2J-k.js.gz +0 -0
- package/dist/web/assets/fortran-fixed-form-DB7wVefV.js +0 -1
- package/dist/web/assets/fortran-fixed-form-DB7wVefV.js.br +0 -0
- package/dist/web/assets/fortran-fixed-form-DB7wVefV.js.gz +0 -0
- package/dist/web/assets/fs-api-IX9SHt5k.js +0 -1
- package/dist/web/assets/fs-api-IX9SHt5k.js.br +0 -0
- package/dist/web/assets/fs-api-IX9SHt5k.js.gz +0 -0
- package/dist/web/assets/fsharp-B5-po_gS.js +0 -1
- package/dist/web/assets/fsharp-B5-po_gS.js.br +0 -0
- package/dist/web/assets/fsharp-B5-po_gS.js.gz +0 -0
- package/dist/web/assets/ganttDiagram-A5KZAMGK-CZbyfmux.js +0 -292
- package/dist/web/assets/ganttDiagram-A5KZAMGK-CZbyfmux.js.br +0 -0
- package/dist/web/assets/ganttDiagram-A5KZAMGK-CZbyfmux.js.gz +0 -0
- package/dist/web/assets/gdresource-DkWx6_xT.js +0 -1
- package/dist/web/assets/gdresource-DkWx6_xT.js.br +0 -0
- package/dist/web/assets/gdresource-DkWx6_xT.js.gz +0 -0
- package/dist/web/assets/general-settings-section-B7Hjx_fb.js +0 -1
- package/dist/web/assets/general-settings-section-B7Hjx_fb.js.br +0 -0
- package/dist/web/assets/general-settings-section-B7Hjx_fb.js.gz +0 -0
- package/dist/web/assets/git-commit-XsMhdamD.js +0 -1
- package/dist/web/assets/git-commit-XsMhdamD.js.br +0 -0
- package/dist/web/assets/git-commit-XsMhdamD.js.gz +0 -0
- package/dist/web/assets/git-log-panel-CbcJ_YEH.js +0 -1
- package/dist/web/assets/git-log-panel-CbcJ_YEH.js.br +0 -0
- package/dist/web/assets/git-log-panel-CbcJ_YEH.js.gz +0 -0
- package/dist/web/assets/git-rebase-CXs4QunZ.js +0 -1
- package/dist/web/assets/git-repo-store-B_u5RzIM.js +0 -1
- package/dist/web/assets/git-repo-store-B_u5RzIM.js.br +0 -0
- package/dist/web/assets/git-repo-store-B_u5RzIM.js.gz +0 -0
- package/dist/web/assets/gitGraph-HDMCJU4V-COyQftEp.js +0 -1
- package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-C9g4d3bV.js +0 -65
- package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-C9g4d3bV.js.br +0 -0
- package/dist/web/assets/gitGraphDiagram-K3NZZRJ6-C9g4d3bV.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-BfByGSf1.js +0 -141
- package/dist/web/assets/glide-data-grid-BfByGSf1.js.br +0 -0
- package/dist/web/assets/glide-data-grid-BfByGSf1.js.gz +0 -0
- package/dist/web/assets/glimmer-js-CHoxSy4K.js +0 -1
- package/dist/web/assets/glimmer-js-CHoxSy4K.js.br +0 -0
- package/dist/web/assets/glimmer-js-CHoxSy4K.js.gz +0 -0
- package/dist/web/assets/glimmer-ts-DY0DCf-r.js +0 -1
- package/dist/web/assets/glimmer-ts-DY0DCf-r.js.br +0 -0
- package/dist/web/assets/glimmer-ts-DY0DCf-r.js.gz +0 -0
- package/dist/web/assets/glsl-E9hxFBBJ.js +0 -1
- package/dist/web/assets/glsl-E9hxFBBJ.js.br +0 -0
- package/dist/web/assets/glsl-E9hxFBBJ.js.gz +0 -0
- package/dist/web/assets/graphlib-eYluCODn.js +0 -1
- package/dist/web/assets/graphlib-eYluCODn.js.br +0 -0
- package/dist/web/assets/graphlib-eYluCODn.js.gz +0 -0
- package/dist/web/assets/graphql-DAalq3Uo.js +0 -1
- package/dist/web/assets/graphql-DAalq3Uo.js.br +0 -0
- package/dist/web/assets/graphql-DAalq3Uo.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-DCo9OP3D.js +0 -1
- package/dist/web/assets/group-chat-tab-DCo9OP3D.js.br +0 -0
- package/dist/web/assets/group-chat-tab-DCo9OP3D.js.gz +0 -0
- package/dist/web/assets/hack-e6ehmpqx.js +0 -1
- package/dist/web/assets/hack-e6ehmpqx.js.br +0 -0
- package/dist/web/assets/hack-e6ehmpqx.js.gz +0 -0
- package/dist/web/assets/haml-Pr4yq62b.js +0 -1
- package/dist/web/assets/haml-Pr4yq62b.js.br +0 -0
- package/dist/web/assets/haml-Pr4yq62b.js.gz +0 -0
- package/dist/web/assets/handlebars-ZERVZ8gn.js +0 -1
- package/dist/web/assets/handlebars-ZERVZ8gn.js.br +0 -0
- package/dist/web/assets/handlebars-ZERVZ8gn.js.gz +0 -0
- package/dist/web/assets/html-BmwVFf5D.js +0 -1
- package/dist/web/assets/html-BmwVFf5D.js.br +0 -0
- package/dist/web/assets/html-BmwVFf5D.js.gz +0 -0
- package/dist/web/assets/html-derivative-C1JIrmAY.js +0 -1
- package/dist/web/assets/http-BI6PtTvX.js +0 -1
- package/dist/web/assets/http-BI6PtTvX.js.br +0 -0
- package/dist/web/assets/http-BI6PtTvX.js.gz +0 -0
- package/dist/web/assets/hurl-CJGLGxAF.js +0 -1
- package/dist/web/assets/hurl-CJGLGxAF.js.br +0 -0
- package/dist/web/assets/hurl-CJGLGxAF.js.gz +0 -0
- package/dist/web/assets/hxml-B6i0QuF9.js +0 -1
- package/dist/web/assets/hxml-B6i0QuF9.js.br +0 -0
- package/dist/web/assets/hxml-B6i0QuF9.js.gz +0 -0
- package/dist/web/assets/icons-CO_II6D-.js +0 -1
- package/dist/web/assets/icons-CO_II6D-.js.br +0 -0
- package/dist/web/assets/icons-CO_II6D-.js.gz +0 -0
- package/dist/web/assets/image-preview-Cjlps7Pt.js +0 -1
- package/dist/web/assets/index-CyDLBddf.js +0 -52
- package/dist/web/assets/index-CyDLBddf.js.br +0 -0
- package/dist/web/assets/index-CyDLBddf.js.gz +0 -0
- package/dist/web/assets/index-Dh5apC3I.css +0 -1
- package/dist/web/assets/index-Dh5apC3I.css.br +0 -0
- package/dist/web/assets/index-Dh5apC3I.css.gz +0 -0
- package/dist/web/assets/info-3K5VOQVL-M5BVLjMe.js +0 -1
- package/dist/web/assets/infoDiagram-LFFYTUFH-BpJuT5o9.js +0 -2
- package/dist/web/assets/input-CG8PS8mS.js +0 -1
- package/dist/web/assets/isEmpty-BjAN1oSC.js +0 -1
- package/dist/web/assets/isEmpty-BjAN1oSC.js.br +0 -0
- package/dist/web/assets/isEmpty-BjAN1oSC.js.gz +0 -0
- package/dist/web/assets/ishikawaDiagram-PHBUUO56-JbOmOY2f.js +0 -70
- package/dist/web/assets/ishikawaDiagram-PHBUUO56-JbOmOY2f.js.br +0 -0
- package/dist/web/assets/ishikawaDiagram-PHBUUO56-JbOmOY2f.js.gz +0 -0
- package/dist/web/assets/jinja-CM-duDMo.js +0 -1
- package/dist/web/assets/jinja-CM-duDMo.js.br +0 -0
- package/dist/web/assets/jinja-CM-duDMo.js.gz +0 -0
- package/dist/web/assets/jira-watcher-section-Dz_-sUC2.js +0 -1
- package/dist/web/assets/jison-F9rAmqyI.js +0 -1
- package/dist/web/assets/jison-F9rAmqyI.js.br +0 -0
- package/dist/web/assets/jison-F9rAmqyI.js.gz +0 -0
- package/dist/web/assets/journeyDiagram-4ABVD52K-C7_tilrE.js +0 -139
- package/dist/web/assets/journeyDiagram-4ABVD52K-C7_tilrE.js.br +0 -0
- package/dist/web/assets/journeyDiagram-4ABVD52K-C7_tilrE.js.gz +0 -0
- package/dist/web/assets/julia-AVSSuAUz.js +0 -1
- package/dist/web/assets/julia-AVSSuAUz.js.br +0 -0
- package/dist/web/assets/julia-AVSSuAUz.js.gz +0 -0
- package/dist/web/assets/just-Dw8IR-fy.js +0 -1
- package/dist/web/assets/just-Dw8IR-fy.js.br +0 -0
- package/dist/web/assets/just-Dw8IR-fy.js.gz +0 -0
- package/dist/web/assets/kanban-definition-K7BYSVSG-DvbxKeXt.js +0 -89
- package/dist/web/assets/kanban-definition-K7BYSVSG-DvbxKeXt.js.br +0 -0
- package/dist/web/assets/kanban-definition-K7BYSVSG-DvbxKeXt.js.gz +0 -0
- package/dist/web/assets/keybindings-store-BTq5Z7XP.js +0 -1
- package/dist/web/assets/keyboard-shortcuts-section-Ba5NYwlG.js +0 -1
- package/dist/web/assets/keyboard-shortcuts-section-Ba5NYwlG.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-Ba5NYwlG.js.gz +0 -0
- package/dist/web/assets/language-servers-section-DJJ7SFXo.js +0 -2
- package/dist/web/assets/language-servers-section-DJJ7SFXo.js.br +0 -0
- package/dist/web/assets/language-servers-section-DJJ7SFXo.js.gz +0 -0
- package/dist/web/assets/latex-37_9fLdz.js +0 -1
- package/dist/web/assets/latex-37_9fLdz.js.br +0 -0
- package/dist/web/assets/latex-37_9fLdz.js.gz +0 -0
- package/dist/web/assets/lib-6APiJkU3.js +0 -4
- package/dist/web/assets/lib-6APiJkU3.js.br +0 -0
- package/dist/web/assets/lib-6APiJkU3.js.gz +0 -0
- package/dist/web/assets/line-CYtSrseF.js +0 -1
- package/dist/web/assets/linear-DyCrWAir.js +0 -1
- package/dist/web/assets/linear-DyCrWAir.js.br +0 -0
- package/dist/web/assets/linear-DyCrWAir.js.gz +0 -0
- package/dist/web/assets/liquid-CaR1gaJt.js +0 -1
- package/dist/web/assets/liquid-CaR1gaJt.js.br +0 -0
- package/dist/web/assets/liquid-CaR1gaJt.js.gz +0 -0
- package/dist/web/assets/lsp-client-Dr3vQ1bb.js +0 -1
- package/dist/web/assets/lsp-client-Dr3vQ1bb.js.br +0 -0
- package/dist/web/assets/lsp-client-Dr3vQ1bb.js.gz +0 -0
- package/dist/web/assets/lua-IFhrYmKl.js +0 -1
- package/dist/web/assets/lua-IFhrYmKl.js.br +0 -0
- package/dist/web/assets/lua-IFhrYmKl.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-CmnqFfTU.js +0 -5
- package/dist/web/assets/markdown-renderer-CmnqFfTU.js.br +0 -0
- package/dist/web/assets/markdown-renderer-CmnqFfTU.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-LJdVMbGl.js +0 -1
- package/dist/web/assets/marko-2g0T6atb.js +0 -1
- package/dist/web/assets/marko-2g0T6atb.js.br +0 -0
- package/dist/web/assets/marko-2g0T6atb.js.gz +0 -0
- package/dist/web/assets/mdc-Dku_3sTh.js +0 -1
- package/dist/web/assets/mdc-Dku_3sTh.js.br +0 -0
- package/dist/web/assets/mdc-Dku_3sTh.js.gz +0 -0
- package/dist/web/assets/media-url-CrT-qulZ.js +0 -1
- package/dist/web/assets/mermaid-parser.core-C5vBM3kO.js +0 -4
- package/dist/web/assets/mermaid-parser.core-C5vBM3kO.js.br +0 -0
- package/dist/web/assets/mermaid-parser.core-C5vBM3kO.js.gz +0 -0
- package/dist/web/assets/mermaid.core-D5SAzB7L.js +0 -11
- package/dist/web/assets/mermaid.core-D5SAzB7L.js.br +0 -0
- package/dist/web/assets/mermaid.core-D5SAzB7L.js.gz +0 -0
- package/dist/web/assets/mindmap-definition-YRQLILUH-juNCbDFr.js +0 -68
- package/dist/web/assets/mindmap-definition-YRQLILUH-juNCbDFr.js.br +0 -0
- package/dist/web/assets/mindmap-definition-YRQLILUH-juNCbDFr.js.gz +0 -0
- package/dist/web/assets/mobile-bottom-sheet-D4UyOatB.js +0 -1
- package/dist/web/assets/mobile-bottom-sheet-D4UyOatB.js.br +0 -0
- package/dist/web/assets/mobile-bottom-sheet-D4UyOatB.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-BiIhZtJ2.js +0 -1
- package/dist/web/assets/mobile-explorer-sheet-BiIhZtJ2.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-BiIhZtJ2.js.gz +0 -0
- package/dist/web/assets/monaco-dotenv-language-DbSss7YR.js +0 -1
- package/dist/web/assets/new-design-dialog-DI_hxvFV.js +0 -1
- package/dist/web/assets/new-design-dialog-DI_hxvFV.js.br +0 -0
- package/dist/web/assets/new-design-dialog-DI_hxvFV.js.gz +0 -0
- package/dist/web/assets/nextflow-DwUrPV3b.js +0 -1
- package/dist/web/assets/nextflow-DwUrPV3b.js.br +0 -0
- package/dist/web/assets/nextflow-DwUrPV3b.js.gz +0 -0
- package/dist/web/assets/nginx-D10J2vrQ.js +0 -1
- package/dist/web/assets/nginx-D10J2vrQ.js.br +0 -0
- package/dist/web/assets/nginx-D10J2vrQ.js.gz +0 -0
- package/dist/web/assets/nim-BonDnBCZ.js +0 -1
- package/dist/web/assets/nim-BonDnBCZ.js.br +0 -0
- package/dist/web/assets/nim-BonDnBCZ.js.gz +0 -0
- package/dist/web/assets/notification-store-9lBSplOV.js +0 -1
- package/dist/web/assets/notifications-settings-section-0s-2OKRv.js +0 -1
- package/dist/web/assets/notifications-settings-section-0s-2OKRv.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-0s-2OKRv.js.gz +0 -0
- package/dist/web/assets/number-overlay-editor-CHqPl6Pv.js +0 -9
- package/dist/web/assets/number-overlay-editor-CHqPl6Pv.js.br +0 -0
- package/dist/web/assets/number-overlay-editor-CHqPl6Pv.js.gz +0 -0
- package/dist/web/assets/onboarding-entry-CGFdGLLP.js +0 -1
- package/dist/web/assets/onboarding-entry-CGFdGLLP.js.br +0 -0
- package/dist/web/assets/onboarding-entry-CGFdGLLP.js.gz +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DPHYFMbA.js +0 -1
- package/dist/web/assets/onboarding-quick-orientation-DPHYFMbA.js.br +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DPHYFMbA.js.gz +0 -0
- package/dist/web/assets/ordinal-CEpaoDoJ.js +0 -1
- package/dist/web/assets/ordinal-CEpaoDoJ.js.br +0 -0
- package/dist/web/assets/ordinal-CEpaoDoJ.js.gz +0 -0
- package/dist/web/assets/overview-panel-3htxfZS2.js +0 -1
- package/dist/web/assets/overview-panel-3htxfZS2.js.br +0 -0
- package/dist/web/assets/overview-panel-3htxfZS2.js.gz +0 -0
- package/dist/web/assets/packet-RMMSAZCW-DCgVLum2.js +0 -1
- package/dist/web/assets/panel-store-B6PoCwBA.js +0 -1
- package/dist/web/assets/panel-store-B6PoCwBA.js.br +0 -0
- package/dist/web/assets/panel-store-B6PoCwBA.js.gz +0 -0
- package/dist/web/assets/pdf-preview-B8A4T-ES.js +0 -1
- package/dist/web/assets/pdf-preview-B8A4T-ES.js.br +0 -0
- package/dist/web/assets/pdf-preview-B8A4T-ES.js.gz +0 -0
- package/dist/web/assets/performance-panel-V8gpnnf7.js +0 -3
- package/dist/web/assets/performance-panel-V8gpnnf7.js.br +0 -0
- package/dist/web/assets/performance-panel-V8gpnnf7.js.gz +0 -0
- package/dist/web/assets/perl-DmdIiZTm.js +0 -1
- package/dist/web/assets/perl-DmdIiZTm.js.br +0 -0
- package/dist/web/assets/perl-DmdIiZTm.js.gz +0 -0
- package/dist/web/assets/php-DXGvCIY0.js +0 -1
- package/dist/web/assets/php-DXGvCIY0.js.br +0 -0
- package/dist/web/assets/php-DXGvCIY0.js.gz +0 -0
- package/dist/web/assets/pie-UPGHQEXC-pxihnmef.js +0 -1
- package/dist/web/assets/pieDiagram-SKSYHLDU-CiJCYElI.js +0 -30
- package/dist/web/assets/pieDiagram-SKSYHLDU-CiJCYElI.js.br +0 -0
- package/dist/web/assets/pieDiagram-SKSYHLDU-CiJCYElI.js.gz +0 -0
- package/dist/web/assets/postgres-viewer-sWS-ogTC.js +0 -3
- package/dist/web/assets/postgres-viewer-sWS-ogTC.js.br +0 -0
- package/dist/web/assets/postgres-viewer-sWS-ogTC.js.gz +0 -0
- package/dist/web/assets/ppmbot-settings-section-CT8vvlzk.js +0 -1
- package/dist/web/assets/ppmbot-settings-section-CT8vvlzk.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-CT8vvlzk.js.gz +0 -0
- package/dist/web/assets/pptx-export-Ugjv0hso.js +0 -111
- package/dist/web/assets/pptx-export-Ugjv0hso.js.br +0 -0
- package/dist/web/assets/pptx-export-Ugjv0hso.js.gz +0 -0
- package/dist/web/assets/problems-panel-Gcy79pSS.js +0 -1
- package/dist/web/assets/problems-panel-Gcy79pSS.js.br +0 -0
- package/dist/web/assets/problems-panel-Gcy79pSS.js.gz +0 -0
- package/dist/web/assets/process-row-format-u6y7lOee.js +0 -1
- package/dist/web/assets/process-table-BUTIp9Oy.js +0 -1
- package/dist/web/assets/process-table-BUTIp9Oy.js.br +0 -0
- package/dist/web/assets/process-table-BUTIp9Oy.js.gz +0 -0
- package/dist/web/assets/project-store-CCimwgGF.js +0 -1
- package/dist/web/assets/project-store-CCimwgGF.js.br +0 -0
- package/dist/web/assets/project-store-CCimwgGF.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-Buv_8y54.js +0 -1
- package/dist/web/assets/proxy-settings-section-Buv_8y54.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-Buv_8y54.js.gz +0 -0
- package/dist/web/assets/pug-BgMlgmpT.js +0 -1
- package/dist/web/assets/pug-BgMlgmpT.js.br +0 -0
- package/dist/web/assets/pug-BgMlgmpT.js.gz +0 -0
- package/dist/web/assets/qml-DjqBS8bc.js +0 -1
- package/dist/web/assets/qml-DjqBS8bc.js.br +0 -0
- package/dist/web/assets/qml-DjqBS8bc.js.gz +0 -0
- package/dist/web/assets/quadrantDiagram-337W2JSQ-D3q5dHQe.js +0 -7
- package/dist/web/assets/quadrantDiagram-337W2JSQ-D3q5dHQe.js.br +0 -0
- package/dist/web/assets/quadrantDiagram-337W2JSQ-D3q5dHQe.js.gz +0 -0
- package/dist/web/assets/query-audit-section-N2DQtgJx.js +0 -1
- package/dist/web/assets/query-audit-section-N2DQtgJx.js.br +0 -0
- package/dist/web/assets/query-audit-section-N2DQtgJx.js.gz +0 -0
- package/dist/web/assets/radar-KQ55EAFF-CeeNXQSm.js +0 -1
- package/dist/web/assets/razor-CzV29vlj.js +0 -1
- package/dist/web/assets/razor-CzV29vlj.js.br +0 -0
- package/dist/web/assets/razor-CzV29vlj.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-CRvJqmaz.js +0 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-CRvJqmaz.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-CRvJqmaz.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-BoYINLbJ.js +0 -2
- package/dist/web/assets/remote-desktop-mobile-sheet-BoYINLbJ.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-BoYINLbJ.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DPdP0yYu.js +0 -1
- package/dist/web/assets/remote-desktop-mobile-view-DPdP0yYu.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DPdP0yYu.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BeQ_Jrp7.js +0 -1
- package/dist/web/assets/remote-desktop-readiness-gate-BeQ_Jrp7.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BeQ_Jrp7.js.gz +0 -0
- package/dist/web/assets/remote-desktop-settings-section-Bs4sHS3l.js +0 -1
- package/dist/web/assets/remote-desktop-settings-section-Bs4sHS3l.js.br +0 -0
- package/dist/web/assets/remote-desktop-settings-section-Bs4sHS3l.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-DDr__JxQ.js +0 -1
- package/dist/web/assets/remote-desktop-window-content-DDr__JxQ.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-DDr__JxQ.js.gz +0 -0
- package/dist/web/assets/requirementDiagram-Z7DCOOCP-BZfeEsxv.js +0 -73
- package/dist/web/assets/requirementDiagram-Z7DCOOCP-BZfeEsxv.js.br +0 -0
- package/dist/web/assets/requirementDiagram-Z7DCOOCP-BZfeEsxv.js.gz +0 -0
- package/dist/web/assets/rst-DffOOLD7.js +0 -1
- package/dist/web/assets/rst-DffOOLD7.js.br +0 -0
- package/dist/web/assets/rst-DffOOLD7.js.gz +0 -0
- package/dist/web/assets/ruby-C5DczJCc.js +0 -1
- package/dist/web/assets/ruby-C5DczJCc.js.br +0 -0
- package/dist/web/assets/ruby-C5DczJCc.js.gz +0 -0
- package/dist/web/assets/run-in-terminal-DCBNtYHQ.js +0 -1
- package/dist/web/assets/sankeyDiagram-WA2Y5GQK-CxM5iAJY.js +0 -10
- package/dist/web/assets/sankeyDiagram-WA2Y5GQK-CxM5iAJY.js.br +0 -0
- package/dist/web/assets/sankeyDiagram-WA2Y5GQK-CxM5iAJY.js.gz +0 -0
- package/dist/web/assets/sas-CoO1xLdH.js +0 -1
- package/dist/web/assets/sas-CoO1xLdH.js.br +0 -0
- package/dist/web/assets/sas-CoO1xLdH.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-_cHX2qOa.js +0 -1
- package/dist/web/assets/schedules-settings-section-_cHX2qOa.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-_cHX2qOa.js.gz +0 -0
- package/dist/web/assets/scroll-area-sjOeAfoD.js +0 -1
- package/dist/web/assets/scroll-area-sjOeAfoD.js.br +0 -0
- package/dist/web/assets/scroll-area-sjOeAfoD.js.gz +0 -0
- package/dist/web/assets/scss-d9PFDNvb.js +0 -1
- package/dist/web/assets/scss-d9PFDNvb.js.br +0 -0
- package/dist/web/assets/scss-d9PFDNvb.js.gz +0 -0
- package/dist/web/assets/send-to-chat-dNqNV7Y4.js +0 -1
- package/dist/web/assets/send-to-chat-dNqNV7Y4.js.br +0 -0
- package/dist/web/assets/send-to-chat-dNqNV7Y4.js.gz +0 -0
- package/dist/web/assets/separator-dHj3Km--.js +0 -1
- package/dist/web/assets/sequenceDiagram-2WXFIKYE-D4PdZNfQ.js +0 -145
- package/dist/web/assets/sequenceDiagram-2WXFIKYE-D4PdZNfQ.js.br +0 -0
- package/dist/web/assets/sequenceDiagram-2WXFIKYE-D4PdZNfQ.js.gz +0 -0
- package/dist/web/assets/services-panel-Dm54cnW3.js +0 -1
- package/dist/web/assets/services-panel-Dm54cnW3.js.br +0 -0
- package/dist/web/assets/services-panel-Dm54cnW3.js.gz +0 -0
- package/dist/web/assets/session-list-sync-triggers-ATvz-1g3.js +0 -1
- package/dist/web/assets/session-list-sync-triggers-ATvz-1g3.js.br +0 -0
- package/dist/web/assets/session-list-sync-triggers-ATvz-1g3.js.gz +0 -0
- package/dist/web/assets/settings-body-DRRQNaDA.js +0 -1
- package/dist/web/assets/settings-body-DRRQNaDA.js.br +0 -0
- package/dist/web/assets/settings-body-DRRQNaDA.js.gz +0 -0
- package/dist/web/assets/settings-section-content-DRaHfvm8.js +0 -1
- package/dist/web/assets/settings-section-content-U3mIx6hF.js +0 -2
- package/dist/web/assets/settings-section-content-U3mIx6hF.js.br +0 -0
- package/dist/web/assets/settings-section-content-U3mIx6hF.js.gz +0 -0
- package/dist/web/assets/settings-store-Cyuo8ceh.js +0 -2
- package/dist/web/assets/settings-store-Cyuo8ceh.js.br +0 -0
- package/dist/web/assets/settings-store-Cyuo8ceh.js.gz +0 -0
- package/dist/web/assets/settings-tab-CB_BhHTK.js +0 -1
- package/dist/web/assets/settings-window-content-CgZIMNX8.js +0 -1
- package/dist/web/assets/shaderlab-BkB57LhQ.js +0 -1
- package/dist/web/assets/shaderlab-BkB57LhQ.js.br +0 -0
- package/dist/web/assets/shaderlab-BkB57LhQ.js.gz +0 -0
- package/dist/web/assets/shellsession-CTpUym8_.js +0 -1
- package/dist/web/assets/slash-command-picker-CQlIqMW0.js +0 -1
- package/dist/web/assets/slash-command-picker-CQlIqMW0.js.br +0 -0
- package/dist/web/assets/slash-command-picker-CQlIqMW0.js.gz +0 -0
- package/dist/web/assets/sortable-header-BOa8o7NJ.js +0 -1
- package/dist/web/assets/sortable-header-BOa8o7NJ.js.br +0 -0
- package/dist/web/assets/sortable-header-BOa8o7NJ.js.gz +0 -0
- package/dist/web/assets/soy-CGmWpNZ2.js +0 -1
- package/dist/web/assets/soy-CGmWpNZ2.js.br +0 -0
- package/dist/web/assets/soy-CGmWpNZ2.js.gz +0 -0
- package/dist/web/assets/sparql-DtdOj_MX.js +0 -1
- package/dist/web/assets/sparql-DtdOj_MX.js.br +0 -0
- package/dist/web/assets/sparql-DtdOj_MX.js.gz +0 -0
- package/dist/web/assets/sql-query-editor--Z4bcqd8.js +0 -1
- package/dist/web/assets/sql-query-editor--Z4bcqd8.js.br +0 -0
- package/dist/web/assets/sql-query-editor--Z4bcqd8.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-CSmX3qaj.js +0 -1
- package/dist/web/assets/sqlite-viewer-CSmX3qaj.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-CSmX3qaj.js.gz +0 -0
- package/dist/web/assets/stata-6W_BX14b.js +0 -1
- package/dist/web/assets/stata-6W_BX14b.js.br +0 -0
- package/dist/web/assets/stata-6W_BX14b.js.gz +0 -0
- package/dist/web/assets/stateDiagram-RAJIS63D-BasP-g7l.js +0 -1
- package/dist/web/assets/stateDiagram-RAJIS63D-BasP-g7l.js.br +0 -0
- package/dist/web/assets/stateDiagram-RAJIS63D-BasP-g7l.js.gz +0 -0
- package/dist/web/assets/stateDiagram-v2-FVOUBMTO-DH7CpDey.js +0 -1
- package/dist/web/assets/surrealql-BhmbH4Yk.js +0 -1
- package/dist/web/assets/surrealql-BhmbH4Yk.js.br +0 -0
- package/dist/web/assets/surrealql-BhmbH4Yk.js.gz +0 -0
- package/dist/web/assets/svelte-D6EOFdO-.js +0 -1
- package/dist/web/assets/svelte-D6EOFdO-.js.br +0 -0
- package/dist/web/assets/svelte-D6EOFdO-.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-LannpU6H.js +0 -2
- package/dist/web/assets/system-monitor-body-LannpU6H.js.br +0 -0
- package/dist/web/assets/system-monitor-body-LannpU6H.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-BfVucwEF.js +0 -1
- package/dist/web/assets/system-monitor-window-content-kLNW9Ln3.js +0 -1
- package/dist/web/assets/tab-host-window-content-II_FtOYM.js +0 -1
- package/dist/web/assets/tab-host-window-content-II_FtOYM.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-II_FtOYM.js.gz +0 -0
- package/dist/web/assets/tab-store-DCpc0g0Q.js +0 -1
- package/dist/web/assets/templ-DuLJgZN8.js +0 -1
- package/dist/web/assets/templ-DuLJgZN8.js.br +0 -0
- package/dist/web/assets/templ-DuLJgZN8.js.gz +0 -0
- package/dist/web/assets/terminal-tab-CTe2polt.js +0 -3
- package/dist/web/assets/terminal-tab-CTe2polt.js.br +0 -0
- package/dist/web/assets/terminal-tab-CTe2polt.js.gz +0 -0
- package/dist/web/assets/tex-D8IJD2J1.js +0 -1
- package/dist/web/assets/tex-D8IJD2J1.js.br +0 -0
- package/dist/web/assets/tex-D8IJD2J1.js.gz +0 -0
- package/dist/web/assets/timeline-definition-YZTLITO2-Do92I8eh.js +0 -61
- package/dist/web/assets/timeline-definition-YZTLITO2-Do92I8eh.js.br +0 -0
- package/dist/web/assets/timeline-definition-YZTLITO2-Do92I8eh.js.gz +0 -0
- package/dist/web/assets/tool-cards-rxLXbBSm.js +0 -9
- package/dist/web/assets/tool-cards-rxLXbBSm.js.br +0 -0
- package/dist/web/assets/tool-cards-rxLXbBSm.js.gz +0 -0
- package/dist/web/assets/treemap-KZPCXAKY-OVcqjFQG.js +0 -1
- package/dist/web/assets/ts-tags-BxVcUOvj.js +0 -1
- package/dist/web/assets/ts-tags-BxVcUOvj.js.br +0 -0
- package/dist/web/assets/ts-tags-BxVcUOvj.js.gz +0 -0
- package/dist/web/assets/twig-BT8vDHa2.js +0 -1
- package/dist/web/assets/twig-BT8vDHa2.js.br +0 -0
- package/dist/web/assets/twig-BT8vDHa2.js.gz +0 -0
- package/dist/web/assets/use-blob-url-BC69n15x.js +0 -1
- package/dist/web/assets/use-inline-blame-CxZ_QWzS.js +0 -16
- package/dist/web/assets/use-inline-blame-CxZ_QWzS.js.br +0 -0
- package/dist/web/assets/use-inline-blame-CxZ_QWzS.js.gz +0 -0
- package/dist/web/assets/use-lsp-gCNE5A9K.js +0 -6
- package/dist/web/assets/use-lsp-gCNE5A9K.js.br +0 -0
- package/dist/web/assets/use-lsp-gCNE5A9K.js.gz +0 -0
- package/dist/web/assets/use-monaco-theme-DvNGcCvz.js +0 -1
- package/dist/web/assets/use-process-kill-Cbiu1mbY.js +0 -1
- package/dist/web/assets/use-process-kill-Cbiu1mbY.js.br +0 -0
- package/dist/web/assets/use-process-kill-Cbiu1mbY.js.gz +0 -0
- package/dist/web/assets/use-websocket-AC7EG1LK.js +0 -1
- package/dist/web/assets/vendor-ui-P9Ym7hCv.js +0 -45
- package/dist/web/assets/vendor-ui-P9Ym7hCv.js.br +0 -0
- package/dist/web/assets/vendor-ui-P9Ym7hCv.js.gz +0 -0
- package/dist/web/assets/vennDiagram-LZ73GAT5-ITFNzHRx.js +0 -34
- package/dist/web/assets/vennDiagram-LZ73GAT5-ITFNzHRx.js.br +0 -0
- package/dist/web/assets/vennDiagram-LZ73GAT5-ITFNzHRx.js.gz +0 -0
- package/dist/web/assets/video-preview-C2Y61WUE.js +0 -1
- package/dist/web/assets/video-preview-C2Y61WUE.js.br +0 -0
- package/dist/web/assets/video-preview-C2Y61WUE.js.gz +0 -0
- package/dist/web/assets/voice-settings-section-DCXZeLYI.js +0 -1
- package/dist/web/assets/voice-settings-section-DCXZeLYI.js.br +0 -0
- package/dist/web/assets/voice-settings-section-DCXZeLYI.js.gz +0 -0
- package/dist/web/assets/vue-BcyG2SyR.js +0 -1
- package/dist/web/assets/vue-BcyG2SyR.js.br +0 -0
- package/dist/web/assets/vue-BcyG2SyR.js.gz +0 -0
- package/dist/web/assets/vue-html-D8iVjZTe.js +0 -1
- package/dist/web/assets/vue-html-D8iVjZTe.js.br +0 -0
- package/dist/web/assets/vue-html-D8iVjZTe.js.gz +0 -0
- package/dist/web/assets/vue-vine-DxBjHHk4.js +0 -1
- package/dist/web/assets/vue-vine-DxBjHHk4.js.br +0 -0
- package/dist/web/assets/vue-vine-DxBjHHk4.js.gz +0 -0
- package/dist/web/assets/window-pip-registry-9Y9LQQYS.js +0 -1
- package/dist/web/assets/window-store-vo1N70nK.js +0 -1
- package/dist/web/assets/window-store-vo1N70nK.js.br +0 -0
- package/dist/web/assets/window-store-vo1N70nK.js.gz +0 -0
- package/dist/web/assets/ws-auth-Ytui7dXP.js +0 -1
- package/dist/web/assets/xml-Zepcw_qF.js +0 -1
- package/dist/web/assets/xml-Zepcw_qF.js.br +0 -0
- package/dist/web/assets/xml-Zepcw_qF.js.gz +0 -0
- package/dist/web/assets/xsl-_m-WMWv3.js +0 -1
- package/dist/web/assets/xsl-_m-WMWv3.js.br +0 -0
- package/dist/web/assets/xsl-_m-WMWv3.js.gz +0 -0
- package/dist/web/assets/xychartDiagram-JWTSCODW-Z12EI4TX.js +0 -7
- package/dist/web/assets/xychartDiagram-JWTSCODW-Z12EI4TX.js.br +0 -0
- package/dist/web/assets/xychartDiagram-JWTSCODW-Z12EI4TX.js.gz +0 -0
- package/src/server/routes/fs-sqlite.ts +0 -129
- package/src/server/routes/postgres.ts +0 -92
- package/src/server/routes/sqlite.ts +0 -148
- package/src/services/database/split-sql-statements.ts +0 -95
- package/src/web/components/chat/change-edit-list.tsx +0 -50
- package/src/web/components/database/connection-form-dialog.tsx +0 -252
- package/src/web/components/database/connection-list.tsx +0 -192
- package/src/web/components/database/connection-row.tsx +0 -104
- package/src/web/components/database/database-viewer.tsx +0 -353
- package/src/web/components/database/glide-column-search.tsx +0 -81
- package/src/web/components/database/glide-data-preview-panel.tsx +0 -114
- package/src/web/components/database/glide-grid-pagination.tsx +0 -34
- package/src/web/components/database/glide-grid-toolbar.tsx +0 -105
- package/src/web/components/database/resolve-preview-data.ts +0 -62
- package/src/web/components/database/schema-table-tree.tsx +0 -98
- package/src/web/components/database/split-sql-statements.ts +0 -116
- package/src/web/components/database/use-db-tree-expansion.ts +0 -74
- package/src/web/components/database/use-glide-pending-edits.ts +0 -72
- package/src/web/components/database/use-glide-row-pinning.ts +0 -35
- package/src/web/components/postgres/postgres-viewer.tsx +0 -283
- package/src/web/components/postgres/use-postgres.ts +0 -161
- package/src/web/components/shared/bug-report-popup.tsx +0 -59
- package/src/web/components/sqlite/sqlite-data-grid.tsx +0 -213
- package/src/web/components/sqlite/sqlite-query-editor.tsx +0 -10
- package/src/web/components/sqlite/sqlite-table-list.tsx +0 -48
- package/src/web/components/sqlite/use-sqlite.ts +0 -135
- package/src/web/components/tunnels/named-tunnel/named-tunnel-section.tsx +0 -159
- package/src/web/components/tunnels/public-tunnel-switch.tsx +0 -82
- package/src/web/components/tunnels/tunnel-manager-tab.tsx +0 -207
- package/src/web/lib/report-bug.ts +0 -79
- /package/dist/web/assets/{__vite-browser-external-C5mXParC.js → __vite-browser-external-B4VNaaaA.js} +0 -0
- /package/dist/web/assets/{abap-Ds6L4g_T.js → abap-BIHt2d9F.js} +0 -0
- /package/dist/web/assets/{abap-Ds6L4g_T.js.br → abap-BIHt2d9F.js.br} +0 -0
- /package/dist/web/assets/{abap-Ds6L4g_T.js.gz → abap-BIHt2d9F.js.gz} +0 -0
- /package/dist/web/assets/{actionscript-3-CLNiH4aj.js → actionscript-3-rbCNRHFj.js} +0 -0
- /package/dist/web/assets/{actionscript-3-CLNiH4aj.js.br → actionscript-3-rbCNRHFj.js.br} +0 -0
- /package/dist/web/assets/{actionscript-3-CLNiH4aj.js.gz → actionscript-3-rbCNRHFj.js.gz} +0 -0
- /package/dist/web/assets/{ada-BoiebnO1.js → ada-CN94LQTJ.js} +0 -0
- /package/dist/web/assets/{ada-BoiebnO1.js.br → ada-CN94LQTJ.js.br} +0 -0
- /package/dist/web/assets/{ada-BoiebnO1.js.gz → ada-CN94LQTJ.js.gz} +0 -0
- /package/dist/web/assets/{andromeeda-CdMZLp1H.js → andromeeda-BsmcoXuQ.js} +0 -0
- /package/dist/web/assets/{andromeeda-CdMZLp1H.js.br → andromeeda-BsmcoXuQ.js.br} +0 -0
- /package/dist/web/assets/{andromeeda-CdMZLp1H.js.gz → andromeeda-BsmcoXuQ.js.gz} +0 -0
- /package/dist/web/assets/{apache-BKOdPQIP.js → apache-pRQmqcVZ.js} +0 -0
- /package/dist/web/assets/{apache-BKOdPQIP.js.br → apache-pRQmqcVZ.js.br} +0 -0
- /package/dist/web/assets/{apache-BKOdPQIP.js.gz → apache-pRQmqcVZ.js.gz} +0 -0
- /package/dist/web/assets/{apex-kTmPDDVo.js → apex-CNEumC1X.js} +0 -0
- /package/dist/web/assets/{apex-kTmPDDVo.js.br → apex-CNEumC1X.js.br} +0 -0
- /package/dist/web/assets/{apex-kTmPDDVo.js.gz → apex-CNEumC1X.js.gz} +0 -0
- /package/dist/web/assets/{applescript-C65SMPLe.js → applescript-DjEVsS-3.js} +0 -0
- /package/dist/web/assets/{applescript-C65SMPLe.js.br → applescript-DjEVsS-3.js.br} +0 -0
- /package/dist/web/assets/{applescript-C65SMPLe.js.gz → applescript-DjEVsS-3.js.gz} +0 -0
- /package/dist/web/assets/{apply-theme-Cc_cmrD5.js → apply-theme-ORrEdHKT.js} +0 -0
- /package/dist/web/assets/{ara-BKT6no2T.js → ara-DbhZRlTL.js} +0 -0
- /package/dist/web/assets/{ara-BKT6no2T.js.br → ara-DbhZRlTL.js.br} +0 -0
- /package/dist/web/assets/{ara-BKT6no2T.js.gz → ara-DbhZRlTL.js.gz} +0 -0
- /package/dist/web/assets/{array-F4LNYbhF.js → array-BQrdK5nm.js} +0 -0
- /package/dist/web/assets/{asciidoc-BGur0ue3.js → asciidoc-BsfbAXIK.js} +0 -0
- /package/dist/web/assets/{asciidoc-BGur0ue3.js.br → asciidoc-BsfbAXIK.js.br} +0 -0
- /package/dist/web/assets/{asciidoc-BGur0ue3.js.gz → asciidoc-BsfbAXIK.js.gz} +0 -0
- /package/dist/web/assets/{asm-DOfgqCKD.js → asm-Vw5NMXjI.js} +0 -0
- /package/dist/web/assets/{asm-DOfgqCKD.js.br → asm-Vw5NMXjI.js.br} +0 -0
- /package/dist/web/assets/{asm-DOfgqCKD.js.gz → asm-Vw5NMXjI.js.gz} +0 -0
- /package/dist/web/assets/{aurora-x-D64MWGxe.js → aurora-x-CoahU6sR.js} +0 -0
- /package/dist/web/assets/{aurora-x-D64MWGxe.js.br → aurora-x-CoahU6sR.js.br} +0 -0
- /package/dist/web/assets/{aurora-x-D64MWGxe.js.gz → aurora-x-CoahU6sR.js.gz} +0 -0
- /package/dist/web/assets/{awk-B_r8LcWp.js → awk-ChKjCxHz.js} +0 -0
- /package/dist/web/assets/{awk-B_r8LcWp.js.br → awk-ChKjCxHz.js.br} +0 -0
- /package/dist/web/assets/{awk-B_r8LcWp.js.gz → awk-ChKjCxHz.js.gz} +0 -0
- /package/dist/web/assets/{ayu-dark-DlDyr9-5.js → ayu-dark-By9RKxTf.js} +0 -0
- /package/dist/web/assets/{ayu-dark-DlDyr9-5.js.br → ayu-dark-By9RKxTf.js.br} +0 -0
- /package/dist/web/assets/{ayu-dark-DlDyr9-5.js.gz → ayu-dark-By9RKxTf.js.gz} +0 -0
- /package/dist/web/assets/{ayu-light-BF0a181n.js → ayu-light-CEsgeLON.js} +0 -0
- /package/dist/web/assets/{ayu-light-BF0a181n.js.br → ayu-light-CEsgeLON.js.br} +0 -0
- /package/dist/web/assets/{ayu-light-BF0a181n.js.gz → ayu-light-CEsgeLON.js.gz} +0 -0
- /package/dist/web/assets/{ayu-mirage-B6hnRsHM.js → ayu-mirage-CYrtwSLW.js} +0 -0
- /package/dist/web/assets/{ayu-mirage-B6hnRsHM.js.br → ayu-mirage-CYrtwSLW.js.br} +0 -0
- /package/dist/web/assets/{ayu-mirage-B6hnRsHM.js.gz → ayu-mirage-CYrtwSLW.js.gz} +0 -0
- /package/dist/web/assets/{ballerina-CyhD34qA.js → ballerina-CCSVz22W.js} +0 -0
- /package/dist/web/assets/{ballerina-CyhD34qA.js.br → ballerina-CCSVz22W.js.br} +0 -0
- /package/dist/web/assets/{ballerina-CyhD34qA.js.gz → ballerina-CCSVz22W.js.gz} +0 -0
- /package/dist/web/assets/{bat-wHB_k1YG.js → bat-DU4--CMj.js} +0 -0
- /package/dist/web/assets/{bat-wHB_k1YG.js.br → bat-DU4--CMj.js.br} +0 -0
- /package/dist/web/assets/{bat-wHB_k1YG.js.gz → bat-DU4--CMj.js.gz} +0 -0
- /package/dist/web/assets/{beancount-SUF8MnzM.js → beancount-DF_tlRlF.js} +0 -0
- /package/dist/web/assets/{beancount-SUF8MnzM.js.br → beancount-DF_tlRlF.js.br} +0 -0
- /package/dist/web/assets/{beancount-SUF8MnzM.js.gz → beancount-DF_tlRlF.js.gz} +0 -0
- /package/dist/web/assets/{berry-BP_34_jr.js → berry-CZTnatvO.js} +0 -0
- /package/dist/web/assets/{berry-BP_34_jr.js.br → berry-CZTnatvO.js.br} +0 -0
- /package/dist/web/assets/{berry-BP_34_jr.js.gz → berry-CZTnatvO.js.gz} +0 -0
- /package/dist/web/assets/{bibtex-DKgKw2bN.js → bibtex-BSpXy8jk.js} +0 -0
- /package/dist/web/assets/{bibtex-DKgKw2bN.js.br → bibtex-BSpXy8jk.js.br} +0 -0
- /package/dist/web/assets/{bibtex-DKgKw2bN.js.gz → bibtex-BSpXy8jk.js.gz} +0 -0
- /package/dist/web/assets/{bicep-BjU-KQeN.js → bicep-yv1Ydq5Z.js} +0 -0
- /package/dist/web/assets/{bicep-BjU-KQeN.js.br → bicep-yv1Ydq5Z.js.br} +0 -0
- /package/dist/web/assets/{bicep-BjU-KQeN.js.gz → bicep-yv1Ydq5Z.js.gz} +0 -0
- /package/dist/web/assets/{bird2-CCFmrT2P.js → bird2-Db7Z7SMN.js} +0 -0
- /package/dist/web/assets/{bird2-CCFmrT2P.js.br → bird2-Db7Z7SMN.js.br} +0 -0
- /package/dist/web/assets/{bird2-CCFmrT2P.js.gz → bird2-Db7Z7SMN.js.gz} +0 -0
- /package/dist/web/assets/{c-BX-1170_.js → c-D2iyQzEt.js} +0 -0
- /package/dist/web/assets/{c-BX-1170_.js.br → c-D2iyQzEt.js.br} +0 -0
- /package/dist/web/assets/{c-BX-1170_.js.gz → c-D2iyQzEt.js.gz} +0 -0
- /package/dist/web/assets/{c3-DSc4IcLQ.js → c3-N4mKyst9.js} +0 -0
- /package/dist/web/assets/{c3-DSc4IcLQ.js.br → c3-N4mKyst9.js.br} +0 -0
- /package/dist/web/assets/{c3-DSc4IcLQ.js.gz → c3-N4mKyst9.js.gz} +0 -0
- /package/dist/web/assets/{cadence-CUaLlWyn.js → cadence-BYK8tFFk.js} +0 -0
- /package/dist/web/assets/{cadence-CUaLlWyn.js.br → cadence-BYK8tFFk.js.br} +0 -0
- /package/dist/web/assets/{cadence-CUaLlWyn.js.gz → cadence-BYK8tFFk.js.gz} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-DeE2-kd5.js → can-open-in-ppm-CwrBTXOy.js} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-DeE2-kd5.js.br → can-open-in-ppm-CwrBTXOy.js.br} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-DeE2-kd5.js.gz → can-open-in-ppm-CwrBTXOy.js.gz} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-BT3IMDYa.js → catppuccin-frappe-BK9Tv2XG.js} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-BT3IMDYa.js.br → catppuccin-frappe-BK9Tv2XG.js.br} +0 -0
- /package/dist/web/assets/{catppuccin-frappe-BT3IMDYa.js.gz → catppuccin-frappe-BK9Tv2XG.js.gz} +0 -0
- /package/dist/web/assets/{catppuccin-latte-DM9i15n3.js → catppuccin-latte-De4mVCp3.js} +0 -0
- /package/dist/web/assets/{catppuccin-latte-DM9i15n3.js.br → catppuccin-latte-De4mVCp3.js.br} +0 -0
- /package/dist/web/assets/{catppuccin-latte-DM9i15n3.js.gz → catppuccin-latte-De4mVCp3.js.gz} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-CAEDr_h3.js → catppuccin-macchiato-Bxt_D7cs.js} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-CAEDr_h3.js.br → catppuccin-macchiato-Bxt_D7cs.js.br} +0 -0
- /package/dist/web/assets/{catppuccin-macchiato-CAEDr_h3.js.gz → catppuccin-macchiato-Bxt_D7cs.js.gz} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-BzOmDckq.js → catppuccin-mocha-Dz2o8gN7.js} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-BzOmDckq.js.br → catppuccin-mocha-Dz2o8gN7.js.br} +0 -0
- /package/dist/web/assets/{catppuccin-mocha-BzOmDckq.js.gz → catppuccin-mocha-Dz2o8gN7.js.gz} +0 -0
- /package/dist/web/assets/{clarity-BijZXjQ6.js → clarity-BJdh0Pw-.js} +0 -0
- /package/dist/web/assets/{clarity-BijZXjQ6.js.br → clarity-BJdh0Pw-.js.br} +0 -0
- /package/dist/web/assets/{clarity-BijZXjQ6.js.gz → clarity-BJdh0Pw-.js.gz} +0 -0
- /package/dist/web/assets/{clojure--ad2221W.js → clojure-DG-FYGzn.js} +0 -0
- /package/dist/web/assets/{clojure--ad2221W.js.br → clojure-DG-FYGzn.js.br} +0 -0
- /package/dist/web/assets/{clojure--ad2221W.js.gz → clojure-DG-FYGzn.js.gz} +0 -0
- /package/dist/web/assets/{cmake-DyjUMpXU.js → cmake-D1imEXan.js} +0 -0
- /package/dist/web/assets/{cmake-DyjUMpXU.js.br → cmake-D1imEXan.js.br} +0 -0
- /package/dist/web/assets/{cmake-DyjUMpXU.js.gz → cmake-D1imEXan.js.gz} +0 -0
- /package/dist/web/assets/{codeowners-BeMhKnC9.js → codeowners-YpylTFB5.js} +0 -0
- /package/dist/web/assets/{codeql-BGtwwp5_.js → codeql-ajDEPgqi.js} +0 -0
- /package/dist/web/assets/{codeql-BGtwwp5_.js.br → codeql-ajDEPgqi.js.br} +0 -0
- /package/dist/web/assets/{codeql-BGtwwp5_.js.gz → codeql-ajDEPgqi.js.gz} +0 -0
- /package/dist/web/assets/{common-lisp--ldIKs5M.js → common-lisp-C2sCrd-m.js} +0 -0
- /package/dist/web/assets/{common-lisp--ldIKs5M.js.br → common-lisp-C2sCrd-m.js.br} +0 -0
- /package/dist/web/assets/{common-lisp--ldIKs5M.js.gz → common-lisp-C2sCrd-m.js.gz} +0 -0
- /package/dist/web/assets/{coq-CRn01_Db.js → coq-BqybyDc9.js} +0 -0
- /package/dist/web/assets/{coq-CRn01_Db.js.br → coq-BqybyDc9.js.br} +0 -0
- /package/dist/web/assets/{coq-CRn01_Db.js.gz → coq-BqybyDc9.js.gz} +0 -0
- /package/dist/web/assets/{csharp-CuWM1IYq.js → csharp-nKCEiujy.js} +0 -0
- /package/dist/web/assets/{csharp-CuWM1IYq.js.br → csharp-nKCEiujy.js.br} +0 -0
- /package/dist/web/assets/{csharp-CuWM1IYq.js.gz → csharp-nKCEiujy.js.gz} +0 -0
- /package/dist/web/assets/{css-CQ_jz6Vl.js → css-BwwQrFr3.js} +0 -0
- /package/dist/web/assets/{css-CQ_jz6Vl.js.br → css-BwwQrFr3.js.br} +0 -0
- /package/dist/web/assets/{css-CQ_jz6Vl.js.gz → css-BwwQrFr3.js.gz} +0 -0
- /package/dist/web/assets/{csv-DP77pbR8.js → csv-Nh9vQwQm.js} +0 -0
- /package/dist/web/assets/{csv-DP77pbR8.js.br → csv-Nh9vQwQm.js.br} +0 -0
- /package/dist/web/assets/{csv-DP77pbR8.js.gz → csv-Nh9vQwQm.js.gz} +0 -0
- /package/dist/web/assets/{cue-DScL5ELc.js → cue-Ch79RPsU.js} +0 -0
- /package/dist/web/assets/{cue-DScL5ELc.js.br → cue-Ch79RPsU.js.br} +0 -0
- /package/dist/web/assets/{cue-DScL5ELc.js.gz → cue-Ch79RPsU.js.gz} +0 -0
- /package/dist/web/assets/{cypher-8ehI2vrw.js → cypher-CgiOQ6hs.js} +0 -0
- /package/dist/web/assets/{cypher-8ehI2vrw.js.br → cypher-CgiOQ6hs.js.br} +0 -0
- /package/dist/web/assets/{cypher-8ehI2vrw.js.gz → cypher-CgiOQ6hs.js.gz} +0 -0
- /package/dist/web/assets/{cytoscape.esm-BokGhmK2.js → cytoscape.esm-9PBaSM25.js} +0 -0
- /package/dist/web/assets/{cytoscape.esm-BokGhmK2.js.br → cytoscape.esm-9PBaSM25.js.br} +0 -0
- /package/dist/web/assets/{cytoscape.esm-BokGhmK2.js.gz → cytoscape.esm-9PBaSM25.js.gz} +0 -0
- /package/dist/web/assets/{d-BvFZUewv.js → d-CmBcySpH.js} +0 -0
- /package/dist/web/assets/{d-BvFZUewv.js.br → d-CmBcySpH.js.br} +0 -0
- /package/dist/web/assets/{d-BvFZUewv.js.gz → d-CmBcySpH.js.gz} +0 -0
- /package/dist/web/assets/{dark-plus-DKLywSFP.js → dark-plus-COLEX2ui.js} +0 -0
- /package/dist/web/assets/{dark-plus-DKLywSFP.js.br → dark-plus-COLEX2ui.js.br} +0 -0
- /package/dist/web/assets/{dark-plus-DKLywSFP.js.gz → dark-plus-COLEX2ui.js.gz} +0 -0
- /package/dist/web/assets/{dart-Cs_NJAZ7.js → dart-BTAArMcJ.js} +0 -0
- /package/dist/web/assets/{dart-Cs_NJAZ7.js.br → dart-BTAArMcJ.js.br} +0 -0
- /package/dist/web/assets/{dart-Cs_NJAZ7.js.gz → dart-BTAArMcJ.js.gz} +0 -0
- /package/dist/web/assets/{dax-BB8KgXzI.js → dax-BbZzRY9i.js} +0 -0
- /package/dist/web/assets/{dax-BB8KgXzI.js.br → dax-BbZzRY9i.js.br} +0 -0
- /package/dist/web/assets/{dax-BB8KgXzI.js.gz → dax-BbZzRY9i.js.gz} +0 -0
- /package/dist/web/assets/{defaultLocale-4xAk2LVU.js → defaultLocale-1Phej3f6.js} +0 -0
- /package/dist/web/assets/{defaultLocale-4xAk2LVU.js.br → defaultLocale-1Phej3f6.js.br} +0 -0
- /package/dist/web/assets/{defaultLocale-4xAk2LVU.js.gz → defaultLocale-1Phej3f6.js.gz} +0 -0
- /package/dist/web/assets/{design-system-status-label-ekiLyjKn.js → design-system-status-label-Cus6e2Df.js} +0 -0
- /package/dist/web/assets/{desktop-Cs6Sk5Pu.js → desktop-OmQvU3-J.js} +0 -0
- /package/dist/web/assets/{desktop-Cs6Sk5Pu.js.br → desktop-OmQvU3-J.js.br} +0 -0
- /package/dist/web/assets/{desktop-Cs6Sk5Pu.js.gz → desktop-OmQvU3-J.js.gz} +0 -0
- /package/dist/web/assets/{diff-CXSq83h3.js → diff-BEPnb9Fb.js} +0 -0
- /package/dist/web/assets/{diff-CXSq83h3.js.br → diff-BEPnb9Fb.js.br} +0 -0
- /package/dist/web/assets/{diff-CXSq83h3.js.gz → diff-BEPnb9Fb.js.gz} +0 -0
- /package/dist/web/assets/{dist-D7mSb2HC.js → dist--v_QGJF6.js} +0 -0
- /package/dist/web/assets/{dist-D7mSb2HC.js.br → dist--v_QGJF6.js.br} +0 -0
- /package/dist/web/assets/{dist-D7mSb2HC.js.gz → dist--v_QGJF6.js.gz} +0 -0
- /package/dist/web/assets/{dist-0EbiTA3n.js → dist-ChawRilJ.js} +0 -0
- /package/dist/web/assets/{dist-0EbiTA3n.js.br → dist-ChawRilJ.js.br} +0 -0
- /package/dist/web/assets/{dist-0EbiTA3n.js.gz → dist-ChawRilJ.js.gz} +0 -0
- /package/dist/web/assets/{docker-BX5p1mZ3.js → docker-Cg17HgTD.js} +0 -0
- /package/dist/web/assets/{docker-BX5p1mZ3.js.br → docker-Cg17HgTD.js.br} +0 -0
- /package/dist/web/assets/{docker-BX5p1mZ3.js.gz → docker-Cg17HgTD.js.gz} +0 -0
- /package/dist/web/assets/{dotenv-D8xdMiRo.js → dotenv-DEMIaY7V.js} +0 -0
- /package/dist/web/assets/{dotenv-D8xdMiRo.js.br → dotenv-DEMIaY7V.js.br} +0 -0
- /package/dist/web/assets/{dotenv-D8xdMiRo.js.gz → dotenv-DEMIaY7V.js.gz} +0 -0
- /package/dist/web/assets/{dracula-BNPKmiGE.js → dracula-BkCFq8SO.js} +0 -0
- /package/dist/web/assets/{dracula-BNPKmiGE.js.br → dracula-BkCFq8SO.js.br} +0 -0
- /package/dist/web/assets/{dracula-BNPKmiGE.js.gz → dracula-BkCFq8SO.js.gz} +0 -0
- /package/dist/web/assets/{dracula-soft-Bv4lLEFc.js → dracula-soft-Cjp6-ltF.js} +0 -0
- /package/dist/web/assets/{dracula-soft-Bv4lLEFc.js.br → dracula-soft-Cjp6-ltF.js.br} +0 -0
- /package/dist/web/assets/{dracula-soft-Bv4lLEFc.js.gz → dracula-soft-Cjp6-ltF.js.gz} +0 -0
- /package/dist/web/assets/{dream-maker-Yg8FPJu3.js → dream-maker-Ce7Y_UKj.js} +0 -0
- /package/dist/web/assets/{dream-maker-Yg8FPJu3.js.br → dream-maker-Ce7Y_UKj.js.br} +0 -0
- /package/dist/web/assets/{dream-maker-Yg8FPJu3.js.gz → dream-maker-Ce7Y_UKj.js.gz} +0 -0
- /package/dist/web/assets/{editor-font-CBszn6vt.js → editor-font-CdxKRKX-.js} +0 -0
- /package/dist/web/assets/{emacs-lisp-kBgNJmB7.js → emacs-lisp-BjpyfTbN.js} +0 -0
- /package/dist/web/assets/{emacs-lisp-kBgNJmB7.js.br → emacs-lisp-BjpyfTbN.js.br} +0 -0
- /package/dist/web/assets/{emacs-lisp-kBgNJmB7.js.gz → emacs-lisp-BjpyfTbN.js.gz} +0 -0
- /package/dist/web/assets/{everforest-dark-7XTfQW4s.js → everforest-dark-9r4okw1s.js} +0 -0
- /package/dist/web/assets/{everforest-dark-7XTfQW4s.js.br → everforest-dark-9r4okw1s.js.br} +0 -0
- /package/dist/web/assets/{everforest-dark-7XTfQW4s.js.gz → everforest-dark-9r4okw1s.js.gz} +0 -0
- /package/dist/web/assets/{everforest-light-CmPZPQmV.js → everforest-light-GCQTZ3Ju.js} +0 -0
- /package/dist/web/assets/{everforest-light-CmPZPQmV.js.br → everforest-light-GCQTZ3Ju.js.br} +0 -0
- /package/dist/web/assets/{everforest-light-CmPZPQmV.js.gz → everforest-light-GCQTZ3Ju.js.gz} +0 -0
- /package/dist/web/assets/{fennel-Dm71IPM6.js → fennel-ITjY5Z6u.js} +0 -0
- /package/dist/web/assets/{fennel-Dm71IPM6.js.br → fennel-ITjY5Z6u.js.br} +0 -0
- /package/dist/web/assets/{fennel-Dm71IPM6.js.gz → fennel-ITjY5Z6u.js.gz} +0 -0
- /package/dist/web/assets/{fish-CIzcfZjZ.js → fish-DP2uEzyg.js} +0 -0
- /package/dist/web/assets/{fish-CIzcfZjZ.js.br → fish-DP2uEzyg.js.br} +0 -0
- /package/dist/web/assets/{fish-CIzcfZjZ.js.gz → fish-DP2uEzyg.js.gz} +0 -0
- /package/dist/web/assets/{fluent-DFSMEphj.js → fluent-irzaP1f6.js} +0 -0
- /package/dist/web/assets/{fluent-DFSMEphj.js.br → fluent-irzaP1f6.js.br} +0 -0
- /package/dist/web/assets/{fluent-DFSMEphj.js.gz → fluent-irzaP1f6.js.gz} +0 -0
- /package/dist/web/assets/{format-bytes-FQmpZ25A.js → format-bytes-B2kC4sbB.js} +0 -0
- /package/dist/web/assets/{format-date-BMtvCeb9.js → format-date-CSHaU2wN.js} +0 -0
- /package/dist/web/assets/{fortran-free-form-xnlj2dLW.js → fortran-free-form-BAPoainr.js} +0 -0
- /package/dist/web/assets/{fortran-free-form-xnlj2dLW.js.br → fortran-free-form-BAPoainr.js.br} +0 -0
- /package/dist/web/assets/{fortran-free-form-xnlj2dLW.js.gz → fortran-free-form-BAPoainr.js.gz} +0 -0
- /package/dist/web/assets/{gdscript-DFnznHD1.js → gdscript-DJ098V1z.js} +0 -0
- /package/dist/web/assets/{gdscript-DFnznHD1.js.br → gdscript-DJ098V1z.js.br} +0 -0
- /package/dist/web/assets/{gdscript-DFnznHD1.js.gz → gdscript-DJ098V1z.js.gz} +0 -0
- /package/dist/web/assets/{gdshader-B9wvgXVU.js → gdshader-DS2Jfy-K.js} +0 -0
- /package/dist/web/assets/{gdshader-B9wvgXVU.js.br → gdshader-DS2Jfy-K.js.br} +0 -0
- /package/dist/web/assets/{gdshader-B9wvgXVU.js.gz → gdshader-DS2Jfy-K.js.gz} +0 -0
- /package/dist/web/assets/{genie-Bz0RXdFf.js → genie-CqfOaFFx.js} +0 -0
- /package/dist/web/assets/{genie-Bz0RXdFf.js.br → genie-CqfOaFFx.js.br} +0 -0
- /package/dist/web/assets/{genie-Bz0RXdFf.js.gz → genie-CqfOaFFx.js.gz} +0 -0
- /package/dist/web/assets/{gherkin-ZD8lWd_U.js → gherkin-CoZ2ucDH.js} +0 -0
- /package/dist/web/assets/{gherkin-ZD8lWd_U.js.br → gherkin-CoZ2ucDH.js.br} +0 -0
- /package/dist/web/assets/{gherkin-ZD8lWd_U.js.gz → gherkin-CoZ2ucDH.js.gz} +0 -0
- /package/dist/web/assets/{github-dark-D8IE4lln.js → github-dark-BNLgnSO9.js} +0 -0
- /package/dist/web/assets/{github-dark-D8IE4lln.js.br → github-dark-BNLgnSO9.js.br} +0 -0
- /package/dist/web/assets/{github-dark-D8IE4lln.js.gz → github-dark-BNLgnSO9.js.gz} +0 -0
- /package/dist/web/assets/{github-dark-default-Bv2-je5j.js → github-dark-default-CYlSggwi.js} +0 -0
- /package/dist/web/assets/{github-dark-default-Bv2-je5j.js.br → github-dark-default-CYlSggwi.js.br} +0 -0
- /package/dist/web/assets/{github-dark-default-Bv2-je5j.js.gz → github-dark-default-CYlSggwi.js.gz} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-Dn2Abfcl.js → github-dark-dimmed-DumUysDk.js} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-Dn2Abfcl.js.br → github-dark-dimmed-DumUysDk.js.br} +0 -0
- /package/dist/web/assets/{github-dark-dimmed-Dn2Abfcl.js.gz → github-dark-dimmed-DumUysDk.js.gz} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-CPYPXNHn.js → github-dark-high-contrast-TKrcDJ2I.js} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-CPYPXNHn.js.br → github-dark-high-contrast-TKrcDJ2I.js.br} +0 -0
- /package/dist/web/assets/{github-dark-high-contrast-CPYPXNHn.js.gz → github-dark-high-contrast-TKrcDJ2I.js.gz} +0 -0
- /package/dist/web/assets/{github-light-CVOMBMvb.js → github-light-DVENFHLJ.js} +0 -0
- /package/dist/web/assets/{github-light-CVOMBMvb.js.br → github-light-DVENFHLJ.js.br} +0 -0
- /package/dist/web/assets/{github-light-CVOMBMvb.js.gz → github-light-DVENFHLJ.js.gz} +0 -0
- /package/dist/web/assets/{github-light-default-6Ayk6lJY.js → github-light-default-DtN8AGcE.js} +0 -0
- /package/dist/web/assets/{github-light-default-6Ayk6lJY.js.br → github-light-default-DtN8AGcE.js.br} +0 -0
- /package/dist/web/assets/{github-light-default-6Ayk6lJY.js.gz → github-light-default-DtN8AGcE.js.gz} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-BTGKd6JI.js → github-light-high-contrast-NSyF37x4.js} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-BTGKd6JI.js.br → github-light-high-contrast-NSyF37x4.js.br} +0 -0
- /package/dist/web/assets/{github-light-high-contrast-BTGKd6JI.js.gz → github-light-high-contrast-NSyF37x4.js.gz} +0 -0
- /package/dist/web/assets/{gleam-UeA7_OU8.js → gleam-hp4NMSb5.js} +0 -0
- /package/dist/web/assets/{gleam-UeA7_OU8.js.br → gleam-hp4NMSb5.js.br} +0 -0
- /package/dist/web/assets/{gleam-UeA7_OU8.js.gz → gleam-hp4NMSb5.js.gz} +0 -0
- /package/dist/web/assets/{gn-DrdNDhFj.js → gn-Dptw2PEu.js} +0 -0
- /package/dist/web/assets/{gn-DrdNDhFj.js.br → gn-Dptw2PEu.js.br} +0 -0
- /package/dist/web/assets/{gn-DrdNDhFj.js.gz → gn-Dptw2PEu.js.gz} +0 -0
- /package/dist/web/assets/{gnuplot-D8vxhaGw.js → gnuplot-9juRzjwv.js} +0 -0
- /package/dist/web/assets/{gnuplot-D8vxhaGw.js.br → gnuplot-9juRzjwv.js.br} +0 -0
- /package/dist/web/assets/{gnuplot-D8vxhaGw.js.gz → gnuplot-9juRzjwv.js.gz} +0 -0
- /package/dist/web/assets/{go-atNMhmH3.js → go-D-QLCda0.js} +0 -0
- /package/dist/web/assets/{go-atNMhmH3.js.br → go-D-QLCda0.js.br} +0 -0
- /package/dist/web/assets/{go-atNMhmH3.js.gz → go-D-QLCda0.js.gz} +0 -0
- /package/dist/web/assets/{groovy-CLRzHDW2.js → groovy-DHKNy6Eh.js} +0 -0
- /package/dist/web/assets/{groovy-CLRzHDW2.js.br → groovy-DHKNy6Eh.js.br} +0 -0
- /package/dist/web/assets/{groovy-CLRzHDW2.js.gz → groovy-DHKNy6Eh.js.gz} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-CMSNCrAk.js → gruvbox-dark-hard-BFD6aQdB.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-CMSNCrAk.js.br → gruvbox-dark-hard-BFD6aQdB.js.br} +0 -0
- /package/dist/web/assets/{gruvbox-dark-hard-CMSNCrAk.js.gz → gruvbox-dark-hard-BFD6aQdB.js.gz} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-CR5wAM1c.js → gruvbox-dark-medium-D5llYBNp.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-CR5wAM1c.js.br → gruvbox-dark-medium-D5llYBNp.js.br} +0 -0
- /package/dist/web/assets/{gruvbox-dark-medium-CR5wAM1c.js.gz → gruvbox-dark-medium-D5llYBNp.js.gz} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-Ba1gP2O2.js → gruvbox-dark-soft-DOztQmNR.js} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-Ba1gP2O2.js.br → gruvbox-dark-soft-DOztQmNR.js.br} +0 -0
- /package/dist/web/assets/{gruvbox-dark-soft-Ba1gP2O2.js.gz → gruvbox-dark-soft-DOztQmNR.js.gz} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-ChSY383t.js → gruvbox-light-hard-BFGD-8Pd.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-ChSY383t.js.br → gruvbox-light-hard-BFGD-8Pd.js.br} +0 -0
- /package/dist/web/assets/{gruvbox-light-hard-ChSY383t.js.gz → gruvbox-light-hard-BFGD-8Pd.js.gz} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-DebZzeA2.js → gruvbox-light-medium-DzoyXgT7.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-DebZzeA2.js.br → gruvbox-light-medium-DzoyXgT7.js.br} +0 -0
- /package/dist/web/assets/{gruvbox-light-medium-DebZzeA2.js.gz → gruvbox-light-medium-DzoyXgT7.js.gz} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-CEWqv8Ew.js → gruvbox-light-soft-B1Ix2zLN.js} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-CEWqv8Ew.js.br → gruvbox-light-soft-B1Ix2zLN.js.br} +0 -0
- /package/dist/web/assets/{gruvbox-light-soft-CEWqv8Ew.js.gz → gruvbox-light-soft-B1Ix2zLN.js.gz} +0 -0
- /package/dist/web/assets/{haskell-CkgCblz9.js → haskell-BnrJ0k7G.js} +0 -0
- /package/dist/web/assets/{haskell-CkgCblz9.js.br → haskell-BnrJ0k7G.js.br} +0 -0
- /package/dist/web/assets/{haskell-CkgCblz9.js.gz → haskell-BnrJ0k7G.js.gz} +0 -0
- /package/dist/web/assets/{haxe-DwOdNXRl.js → haxe-DwShHT_-.js} +0 -0
- /package/dist/web/assets/{haxe-DwOdNXRl.js.br → haxe-DwShHT_-.js.br} +0 -0
- /package/dist/web/assets/{haxe-DwOdNXRl.js.gz → haxe-DwShHT_-.js.gz} +0 -0
- /package/dist/web/assets/{hcl-DXsxN8nX.js → hcl-VOjEibVB.js} +0 -0
- /package/dist/web/assets/{hcl-DXsxN8nX.js.br → hcl-VOjEibVB.js.br} +0 -0
- /package/dist/web/assets/{hcl-DXsxN8nX.js.gz → hcl-VOjEibVB.js.gz} +0 -0
- /package/dist/web/assets/{hjson-oBOZxrL4.js → hjson-BHEn7pNn.js} +0 -0
- /package/dist/web/assets/{hjson-oBOZxrL4.js.br → hjson-BHEn7pNn.js.br} +0 -0
- /package/dist/web/assets/{hjson-oBOZxrL4.js.gz → hjson-BHEn7pNn.js.gz} +0 -0
- /package/dist/web/assets/{hlsl-VEZxDU3L.js → hlsl-CrvxlGii.js} +0 -0
- /package/dist/web/assets/{hlsl-VEZxDU3L.js.br → hlsl-CrvxlGii.js.br} +0 -0
- /package/dist/web/assets/{hlsl-VEZxDU3L.js.gz → hlsl-CrvxlGii.js.gz} +0 -0
- /package/dist/web/assets/{horizon-C_xHTsMO.js → horizon-D3T-P0u6.js} +0 -0
- /package/dist/web/assets/{horizon-C_xHTsMO.js.br → horizon-D3T-P0u6.js.br} +0 -0
- /package/dist/web/assets/{horizon-C_xHTsMO.js.gz → horizon-D3T-P0u6.js.gz} +0 -0
- /package/dist/web/assets/{horizon-bright-CJd-vMFG.js → horizon-bright-vifGsEdk.js} +0 -0
- /package/dist/web/assets/{horizon-bright-CJd-vMFG.js.br → horizon-bright-vifGsEdk.js.br} +0 -0
- /package/dist/web/assets/{horizon-bright-CJd-vMFG.js.gz → horizon-bright-vifGsEdk.js.gz} +0 -0
- /package/dist/web/assets/{houston-BYOfZpV9.js → houston-IrOgT7r4.js} +0 -0
- /package/dist/web/assets/{houston-BYOfZpV9.js.br → houston-IrOgT7r4.js.br} +0 -0
- /package/dist/web/assets/{houston-BYOfZpV9.js.gz → houston-IrOgT7r4.js.gz} +0 -0
- /package/dist/web/assets/{hy-DiruP4wR.js → hy-5eSgTJ8G.js} +0 -0
- /package/dist/web/assets/{hy-DiruP4wR.js.br → hy-5eSgTJ8G.js.br} +0 -0
- /package/dist/web/assets/{hy-DiruP4wR.js.gz → hy-5eSgTJ8G.js.gz} +0 -0
- /package/dist/web/assets/{image-gallery-B16hO6Ab.js → image-gallery-BuxSgBug.js} +0 -0
- /package/dist/web/assets/{image-preview-geometry-D4Ihz4UV.js → image-preview-geometry-CCq8rio7.js} +0 -0
- /package/dist/web/assets/{imba-BBm5cmpQ.js → imba-Dp0I4DVl.js} +0 -0
- /package/dist/web/assets/{imba-BBm5cmpQ.js.br → imba-Dp0I4DVl.js.br} +0 -0
- /package/dist/web/assets/{imba-BBm5cmpQ.js.gz → imba-Dp0I4DVl.js.gz} +0 -0
- /package/dist/web/assets/{ini-DIjchSIH.js → ini-CHDKad9O.js} +0 -0
- /package/dist/web/assets/{ini-DIjchSIH.js.br → ini-CHDKad9O.js.br} +0 -0
- /package/dist/web/assets/{ini-DIjchSIH.js.gz → ini-CHDKad9O.js.gz} +0 -0
- /package/dist/web/assets/{init-Cf64k-PQ.js → init-YGhXRxki.js} +0 -0
- /package/dist/web/assets/{isArrayLikeObject-DoNOpNUH.js → isArrayLikeObject-DHTG10am.js} +0 -0
- /package/dist/web/assets/{isArrayLikeObject-DoNOpNUH.js.br → isArrayLikeObject-DHTG10am.js.br} +0 -0
- /package/dist/web/assets/{isArrayLikeObject-DoNOpNUH.js.gz → isArrayLikeObject-DHTG10am.js.gz} +0 -0
- /package/dist/web/assets/{java-BjdsRxXN.js → java-ClnCQCSW.js} +0 -0
- /package/dist/web/assets/{java-BjdsRxXN.js.br → java-ClnCQCSW.js.br} +0 -0
- /package/dist/web/assets/{java-BjdsRxXN.js.gz → java-ClnCQCSW.js.gz} +0 -0
- /package/dist/web/assets/{javascript-R2SZ_OEC.js → javascript-D1PM1fYV.js} +0 -0
- /package/dist/web/assets/{javascript-R2SZ_OEC.js.br → javascript-D1PM1fYV.js.br} +0 -0
- /package/dist/web/assets/{javascript-R2SZ_OEC.js.gz → javascript-D1PM1fYV.js.gz} +0 -0
- /package/dist/web/assets/{json-CYCJeTwK.js → json-DELY1EIR.js} +0 -0
- /package/dist/web/assets/{json-CYCJeTwK.js.br → json-DELY1EIR.js.br} +0 -0
- /package/dist/web/assets/{json-CYCJeTwK.js.gz → json-DELY1EIR.js.gz} +0 -0
- /package/dist/web/assets/{json5-0Pz845K0.js → json5-D6f_uNwJ.js} +0 -0
- /package/dist/web/assets/{json5-0Pz845K0.js.br → json5-D6f_uNwJ.js.br} +0 -0
- /package/dist/web/assets/{json5-0Pz845K0.js.gz → json5-D6f_uNwJ.js.gz} +0 -0
- /package/dist/web/assets/{jsonc-B0jdT4uM.js → jsonc-DrHCdmos.js} +0 -0
- /package/dist/web/assets/{jsonc-B0jdT4uM.js.br → jsonc-DrHCdmos.js.br} +0 -0
- /package/dist/web/assets/{jsonc-B0jdT4uM.js.gz → jsonc-DrHCdmos.js.gz} +0 -0
- /package/dist/web/assets/{jsonl-CdvFKZtz.js → jsonl-Cwc3cXEL.js} +0 -0
- /package/dist/web/assets/{jsonl-CdvFKZtz.js.br → jsonl-Cwc3cXEL.js.br} +0 -0
- /package/dist/web/assets/{jsonl-CdvFKZtz.js.gz → jsonl-Cwc3cXEL.js.gz} +0 -0
- /package/dist/web/assets/{jsonnet-BYd5ZGqe.js → jsonnet-BwZfaIFT.js} +0 -0
- /package/dist/web/assets/{jsonnet-BYd5ZGqe.js.br → jsonnet-BwZfaIFT.js.br} +0 -0
- /package/dist/web/assets/{jsonnet-BYd5ZGqe.js.gz → jsonnet-BwZfaIFT.js.gz} +0 -0
- /package/dist/web/assets/{jssm-BlBU_IK1.js → jssm-BpEmg_MT.js} +0 -0
- /package/dist/web/assets/{jssm-BlBU_IK1.js.br → jssm-BpEmg_MT.js.br} +0 -0
- /package/dist/web/assets/{jssm-BlBU_IK1.js.gz → jssm-BpEmg_MT.js.gz} +0 -0
- /package/dist/web/assets/{jsx-CsWR7aMm.js → jsx-BOrwA6ld.js} +0 -0
- /package/dist/web/assets/{jsx-CsWR7aMm.js.br → jsx-BOrwA6ld.js.br} +0 -0
- /package/dist/web/assets/{jsx-CsWR7aMm.js.gz → jsx-BOrwA6ld.js.gz} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-C6ogFc3X.js → kanagawa-dragon-DRfVaGIX.js} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-C6ogFc3X.js.br → kanagawa-dragon-DRfVaGIX.js.br} +0 -0
- /package/dist/web/assets/{kanagawa-dragon-C6ogFc3X.js.gz → kanagawa-dragon-DRfVaGIX.js.gz} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-8esZNUbA.js → kanagawa-lotus-CjOlny0Q.js} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-8esZNUbA.js.br → kanagawa-lotus-CjOlny0Q.js.br} +0 -0
- /package/dist/web/assets/{kanagawa-lotus-8esZNUbA.js.gz → kanagawa-lotus-CjOlny0Q.js.gz} +0 -0
- /package/dist/web/assets/{kanagawa-wave-C-yWQ6RD.js → kanagawa-wave-DvdM88a4.js} +0 -0
- /package/dist/web/assets/{kanagawa-wave-C-yWQ6RD.js.br → kanagawa-wave-DvdM88a4.js.br} +0 -0
- /package/dist/web/assets/{kanagawa-wave-C-yWQ6RD.js.gz → kanagawa-wave-DvdM88a4.js.gz} +0 -0
- /package/dist/web/assets/{katex-Cz0KLyXA.js → katex-BHtqYBze.js} +0 -0
- /package/dist/web/assets/{katex-Cz0KLyXA.js.br → katex-BHtqYBze.js.br} +0 -0
- /package/dist/web/assets/{katex-Cz0KLyXA.js.gz → katex-BHtqYBze.js.gz} +0 -0
- /package/dist/web/assets/{kdl-D712OVXR.js → kdl-DSo3PvM0.js} +0 -0
- /package/dist/web/assets/{kdl-D712OVXR.js.br → kdl-DSo3PvM0.js.br} +0 -0
- /package/dist/web/assets/{kdl-D712OVXR.js.gz → kdl-DSo3PvM0.js.gz} +0 -0
- /package/dist/web/assets/{kotlin-BEUa7XzN.js → kotlin-BV8TwCGu.js} +0 -0
- /package/dist/web/assets/{kotlin-BEUa7XzN.js.br → kotlin-BV8TwCGu.js.br} +0 -0
- /package/dist/web/assets/{kotlin-BEUa7XzN.js.gz → kotlin-BV8TwCGu.js.gz} +0 -0
- /package/dist/web/assets/{kusto-n4J6aIey.js → kusto-DCo1Fdmm.js} +0 -0
- /package/dist/web/assets/{kusto-n4J6aIey.js.br → kusto-DCo1Fdmm.js.br} +0 -0
- /package/dist/web/assets/{kusto-n4J6aIey.js.gz → kusto-DCo1Fdmm.js.gz} +0 -0
- /package/dist/web/assets/{laserwave-CddL9sH-.js → laserwave-DPX9FvD9.js} +0 -0
- /package/dist/web/assets/{laserwave-CddL9sH-.js.br → laserwave-DPX9FvD9.js.br} +0 -0
- /package/dist/web/assets/{laserwave-CddL9sH-.js.gz → laserwave-DPX9FvD9.js.gz} +0 -0
- /package/dist/web/assets/{lean-CS8dnaPi.js → lean-Cya8dqZu.js} +0 -0
- /package/dist/web/assets/{lean-CS8dnaPi.js.br → lean-Cya8dqZu.js.br} +0 -0
- /package/dist/web/assets/{lean-CS8dnaPi.js.gz → lean-Cya8dqZu.js.gz} +0 -0
- /package/dist/web/assets/{less-D7VWEXeK.js → less-CJUPgkIs.js} +0 -0
- /package/dist/web/assets/{less-D7VWEXeK.js.br → less-CJUPgkIs.js.br} +0 -0
- /package/dist/web/assets/{less-D7VWEXeK.js.gz → less-CJUPgkIs.js.gz} +0 -0
- /package/dist/web/assets/{libesm-5wREk7JN.js → libesm-B6LsX5wH.js} +0 -0
- /package/dist/web/assets/{libesm-5wREk7JN.js.br → libesm-B6LsX5wH.js.br} +0 -0
- /package/dist/web/assets/{libesm-5wREk7JN.js.gz → libesm-B6LsX5wH.js.gz} +0 -0
- /package/dist/web/assets/{light-plus-DUh-yC9k.js → light-plus-BXXrlFJH.js} +0 -0
- /package/dist/web/assets/{light-plus-DUh-yC9k.js.br → light-plus-BXXrlFJH.js.br} +0 -0
- /package/dist/web/assets/{light-plus-DUh-yC9k.js.gz → light-plus-BXXrlFJH.js.gz} +0 -0
- /package/dist/web/assets/{llvm-P1D8XyMB.js → llvm-CUbQanZr.js} +0 -0
- /package/dist/web/assets/{llvm-P1D8XyMB.js.br → llvm-CUbQanZr.js.br} +0 -0
- /package/dist/web/assets/{llvm-P1D8XyMB.js.gz → llvm-CUbQanZr.js.gz} +0 -0
- /package/dist/web/assets/{log-BGft0RQz.js → log-B3fFlSMd.js} +0 -0
- /package/dist/web/assets/{log-BGft0RQz.js.br → log-B3fFlSMd.js.br} +0 -0
- /package/dist/web/assets/{log-BGft0RQz.js.gz → log-B3fFlSMd.js.gz} +0 -0
- /package/dist/web/assets/{logo-uFZx2JEw.js → logo-ucAyw6zf.js} +0 -0
- /package/dist/web/assets/{logo-uFZx2JEw.js.br → logo-ucAyw6zf.js.br} +0 -0
- /package/dist/web/assets/{logo-uFZx2JEw.js.gz → logo-ucAyw6zf.js.gz} +0 -0
- /package/dist/web/assets/{luau-aDpnpIe3.js → luau-C4l6TSTB.js} +0 -0
- /package/dist/web/assets/{luau-aDpnpIe3.js.br → luau-C4l6TSTB.js.br} +0 -0
- /package/dist/web/assets/{luau-aDpnpIe3.js.gz → luau-C4l6TSTB.js.gz} +0 -0
- /package/dist/web/assets/{make-DwjpJeU5.js → make-CDtGIVc7.js} +0 -0
- /package/dist/web/assets/{make-DwjpJeU5.js.br → make-CDtGIVc7.js.br} +0 -0
- /package/dist/web/assets/{make-DwjpJeU5.js.gz → make-CDtGIVc7.js.gz} +0 -0
- /package/dist/web/assets/{markdown-DC-eWqXi.js → markdown-CH1zKu2p.js} +0 -0
- /package/dist/web/assets/{markdown-DC-eWqXi.js.br → markdown-CH1zKu2p.js.br} +0 -0
- /package/dist/web/assets/{markdown-DC-eWqXi.js.gz → markdown-CH1zKu2p.js.gz} +0 -0
- /package/dist/web/assets/{marked.esm-DDb9MclE.js → marked.esm-jqwIt-AK.js} +0 -0
- /package/dist/web/assets/{marked.esm-DDb9MclE.js.br → marked.esm-jqwIt-AK.js.br} +0 -0
- /package/dist/web/assets/{marked.esm-DDb9MclE.js.gz → marked.esm-jqwIt-AK.js.gz} +0 -0
- /package/dist/web/assets/{material-theme-9BivM5cB.js → material-theme-CEuGVTmh.js} +0 -0
- /package/dist/web/assets/{material-theme-9BivM5cB.js.br → material-theme-CEuGVTmh.js.br} +0 -0
- /package/dist/web/assets/{material-theme-9BivM5cB.js.gz → material-theme-CEuGVTmh.js.gz} +0 -0
- /package/dist/web/assets/{material-theme-darker-Bg7I3WIw.js → material-theme-darker-CUZ3MoIr.js} +0 -0
- /package/dist/web/assets/{material-theme-darker-Bg7I3WIw.js.br → material-theme-darker-CUZ3MoIr.js.br} +0 -0
- /package/dist/web/assets/{material-theme-darker-Bg7I3WIw.js.gz → material-theme-darker-CUZ3MoIr.js.gz} +0 -0
- /package/dist/web/assets/{material-theme-lighter-BoEshpBb.js → material-theme-lighter-DxAqJSid.js} +0 -0
- /package/dist/web/assets/{material-theme-lighter-BoEshpBb.js.br → material-theme-lighter-DxAqJSid.js.br} +0 -0
- /package/dist/web/assets/{material-theme-lighter-BoEshpBb.js.gz → material-theme-lighter-DxAqJSid.js.gz} +0 -0
- /package/dist/web/assets/{material-theme-ocean-CmKcBlBP.js → material-theme-ocean-BSvvHJp6.js} +0 -0
- /package/dist/web/assets/{material-theme-ocean-CmKcBlBP.js.br → material-theme-ocean-BSvvHJp6.js.br} +0 -0
- /package/dist/web/assets/{material-theme-ocean-CmKcBlBP.js.gz → material-theme-ocean-BSvvHJp6.js.gz} +0 -0
- /package/dist/web/assets/{material-theme-palenight-CUyfHC0C.js → material-theme-palenight-QVOl50_m.js} +0 -0
- /package/dist/web/assets/{material-theme-palenight-CUyfHC0C.js.br → material-theme-palenight-QVOl50_m.js.br} +0 -0
- /package/dist/web/assets/{material-theme-palenight-CUyfHC0C.js.gz → material-theme-palenight-QVOl50_m.js.gz} +0 -0
- /package/dist/web/assets/{math-DAaFbMeh.js → math-iYw0Gln4.js} +0 -0
- /package/dist/web/assets/{matlab-CqBfVqYF.js → matlab-CZLQLwUp.js} +0 -0
- /package/dist/web/assets/{matlab-CqBfVqYF.js.br → matlab-CZLQLwUp.js.br} +0 -0
- /package/dist/web/assets/{matlab-CqBfVqYF.js.gz → matlab-CZLQLwUp.js.gz} +0 -0
- /package/dist/web/assets/{mdx-CdC2mVzF.js → mdx-DO4NJsOo.js} +0 -0
- /package/dist/web/assets/{mdx-CdC2mVzF.js.br → mdx-DO4NJsOo.js.br} +0 -0
- /package/dist/web/assets/{mdx-CdC2mVzF.js.gz → mdx-DO4NJsOo.js.gz} +0 -0
- /package/dist/web/assets/{mermaid-B542RnGP.js → mermaid-CIwzg1uO.js} +0 -0
- /package/dist/web/assets/{mermaid-B542RnGP.js.br → mermaid-CIwzg1uO.js.br} +0 -0
- /package/dist/web/assets/{mermaid-B542RnGP.js.gz → mermaid-CIwzg1uO.js.gz} +0 -0
- /package/dist/web/assets/{metric-chart-canvas-D7f-LQ8x.js → metric-chart-canvas-LAMaVJTu.js} +0 -0
- /package/dist/web/assets/{metric-chart-canvas-D7f-LQ8x.js.br → metric-chart-canvas-LAMaVJTu.js.br} +0 -0
- /package/dist/web/assets/{metric-chart-canvas-D7f-LQ8x.js.gz → metric-chart-canvas-LAMaVJTu.js.gz} +0 -0
- /package/dist/web/assets/{min-dark-uGP-9UE_.js → min-dark-BdIgslXy.js} +0 -0
- /package/dist/web/assets/{min-dark-uGP-9UE_.js.br → min-dark-BdIgslXy.js.br} +0 -0
- /package/dist/web/assets/{min-dark-uGP-9UE_.js.gz → min-dark-BdIgslXy.js.gz} +0 -0
- /package/dist/web/assets/{min-light-BkFlXt3G.js → min-light-DyU-T1r2.js} +0 -0
- /package/dist/web/assets/{min-light-BkFlXt3G.js.br → min-light-DyU-T1r2.js.br} +0 -0
- /package/dist/web/assets/{min-light-BkFlXt3G.js.gz → min-light-DyU-T1r2.js.gz} +0 -0
- /package/dist/web/assets/{mipsasm-CkaxcMA-.js → mipsasm-DRad-Klm.js} +0 -0
- /package/dist/web/assets/{mipsasm-CkaxcMA-.js.br → mipsasm-DRad-Klm.js.br} +0 -0
- /package/dist/web/assets/{mipsasm-CkaxcMA-.js.gz → mipsasm-DRad-Klm.js.gz} +0 -0
- /package/dist/web/assets/{mojo-DDh7AQLv.js → mojo-DXp5LDOc.js} +0 -0
- /package/dist/web/assets/{mojo-DDh7AQLv.js.br → mojo-DXp5LDOc.js.br} +0 -0
- /package/dist/web/assets/{mojo-DDh7AQLv.js.gz → mojo-DXp5LDOc.js.gz} +0 -0
- /package/dist/web/assets/{monokai-BA4dkSrE.js → monokai-BiKX3qby.js} +0 -0
- /package/dist/web/assets/{monokai-BA4dkSrE.js.br → monokai-BiKX3qby.js.br} +0 -0
- /package/dist/web/assets/{monokai-BA4dkSrE.js.gz → monokai-BiKX3qby.js.gz} +0 -0
- /package/dist/web/assets/{moonbit-DGxZDax4.js → moonbit-BOUoLF5r.js} +0 -0
- /package/dist/web/assets/{moonbit-DGxZDax4.js.br → moonbit-BOUoLF5r.js.br} +0 -0
- /package/dist/web/assets/{moonbit-DGxZDax4.js.gz → moonbit-BOUoLF5r.js.gz} +0 -0
- /package/dist/web/assets/{move-C1HZaVNc.js → move-Dlk64FWK.js} +0 -0
- /package/dist/web/assets/{move-C1HZaVNc.js.br → move-Dlk64FWK.js.br} +0 -0
- /package/dist/web/assets/{move-C1HZaVNc.js.gz → move-Dlk64FWK.js.gz} +0 -0
- /package/dist/web/assets/{narrat-g4c9qhYS.js → narrat-B-qd2Lh0.js} +0 -0
- /package/dist/web/assets/{narrat-g4c9qhYS.js.br → narrat-B-qd2Lh0.js.br} +0 -0
- /package/dist/web/assets/{narrat-g4c9qhYS.js.gz → narrat-B-qd2Lh0.js.gz} +0 -0
- /package/dist/web/assets/{nextflow-groovy-CisdbLPv.js → nextflow-groovy-iAMYas0F.js} +0 -0
- /package/dist/web/assets/{nextflow-groovy-CisdbLPv.js.br → nextflow-groovy-iAMYas0F.js.br} +0 -0
- /package/dist/web/assets/{nextflow-groovy-CisdbLPv.js.gz → nextflow-groovy-iAMYas0F.js.gz} +0 -0
- /package/dist/web/assets/{night-owl-ds7NNgBg.js → night-owl-3YNqjftR.js} +0 -0
- /package/dist/web/assets/{night-owl-ds7NNgBg.js.br → night-owl-3YNqjftR.js.br} +0 -0
- /package/dist/web/assets/{night-owl-ds7NNgBg.js.gz → night-owl-3YNqjftR.js.gz} +0 -0
- /package/dist/web/assets/{night-owl-light-DurCGAfC.js → night-owl-light-GIncHb5w.js} +0 -0
- /package/dist/web/assets/{night-owl-light-DurCGAfC.js.br → night-owl-light-GIncHb5w.js.br} +0 -0
- /package/dist/web/assets/{night-owl-light-DurCGAfC.js.gz → night-owl-light-GIncHb5w.js.gz} +0 -0
- /package/dist/web/assets/{nix-D7kCv9F9.js → nix-xjlEb3uw.js} +0 -0
- /package/dist/web/assets/{nix-D7kCv9F9.js.br → nix-xjlEb3uw.js.br} +0 -0
- /package/dist/web/assets/{nix-D7kCv9F9.js.gz → nix-xjlEb3uw.js.gz} +0 -0
- /package/dist/web/assets/{nord-C-O3ceAv.js → nord-C8tvWx7P.js} +0 -0
- /package/dist/web/assets/{nord-C-O3ceAv.js.br → nord-C8tvWx7P.js.br} +0 -0
- /package/dist/web/assets/{nord-C-O3ceAv.js.gz → nord-C8tvWx7P.js.gz} +0 -0
- /package/dist/web/assets/{nushell-oUYTGkzu.js → nushell-BqBb4pU6.js} +0 -0
- /package/dist/web/assets/{nushell-oUYTGkzu.js.br → nushell-BqBb4pU6.js.br} +0 -0
- /package/dist/web/assets/{nushell-oUYTGkzu.js.gz → nushell-BqBb4pU6.js.gz} +0 -0
- /package/dist/web/assets/{objective-c-CzqHoRSj.js → objective-c-Bk6s0Cn5.js} +0 -0
- /package/dist/web/assets/{objective-c-CzqHoRSj.js.br → objective-c-Bk6s0Cn5.js.br} +0 -0
- /package/dist/web/assets/{objective-c-CzqHoRSj.js.gz → objective-c-Bk6s0Cn5.js.gz} +0 -0
- /package/dist/web/assets/{objective-cpp-DJ8fgF2d.js → objective-cpp-DGTVWQ3V.js} +0 -0
- /package/dist/web/assets/{objective-cpp-DJ8fgF2d.js.br → objective-cpp-DGTVWQ3V.js.br} +0 -0
- /package/dist/web/assets/{objective-cpp-DJ8fgF2d.js.gz → objective-cpp-DGTVWQ3V.js.gz} +0 -0
- /package/dist/web/assets/{ocaml-B_nWFfqA.js → ocaml-D6wPQ4kw.js} +0 -0
- /package/dist/web/assets/{ocaml-B_nWFfqA.js.br → ocaml-D6wPQ4kw.js.br} +0 -0
- /package/dist/web/assets/{ocaml-B_nWFfqA.js.gz → ocaml-D6wPQ4kw.js.gz} +0 -0
- /package/dist/web/assets/{odin-BUQfWY13.js → odin-C9mw2xRN.js} +0 -0
- /package/dist/web/assets/{odin-BUQfWY13.js.br → odin-C9mw2xRN.js.br} +0 -0
- /package/dist/web/assets/{odin-BUQfWY13.js.gz → odin-C9mw2xRN.js.gz} +0 -0
- /package/dist/web/assets/{one-dark-pro-DJQor_US.js → one-dark-pro-SMBlneFb.js} +0 -0
- /package/dist/web/assets/{one-dark-pro-DJQor_US.js.br → one-dark-pro-SMBlneFb.js.br} +0 -0
- /package/dist/web/assets/{one-dark-pro-DJQor_US.js.gz → one-dark-pro-SMBlneFb.js.gz} +0 -0
- /package/dist/web/assets/{one-light-BMvQ1R6M.js → one-light-C9JMU1Cx.js} +0 -0
- /package/dist/web/assets/{one-light-BMvQ1R6M.js.br → one-light-C9JMU1Cx.js.br} +0 -0
- /package/dist/web/assets/{one-light-BMvQ1R6M.js.gz → one-light-C9JMU1Cx.js.gz} +0 -0
- /package/dist/web/assets/{openscad-DTylcqP8.js → openscad-C0I9CtuA.js} +0 -0
- /package/dist/web/assets/{openscad-DTylcqP8.js.br → openscad-C0I9CtuA.js.br} +0 -0
- /package/dist/web/assets/{openscad-DTylcqP8.js.gz → openscad-C0I9CtuA.js.gz} +0 -0
- /package/dist/web/assets/{pascal-D0N_7LGg.js → pascal-D0z4DJnY.js} +0 -0
- /package/dist/web/assets/{pascal-D0N_7LGg.js.br → pascal-D0z4DJnY.js.br} +0 -0
- /package/dist/web/assets/{pascal-D0N_7LGg.js.gz → pascal-D0z4DJnY.js.gz} +0 -0
- /package/dist/web/assets/{path-LyOWnqX5.js → path-z62pEMqs.js} +0 -0
- /package/dist/web/assets/{path-LyOWnqX5.js.br → path-z62pEMqs.js.br} +0 -0
- /package/dist/web/assets/{path-LyOWnqX5.js.gz → path-z62pEMqs.js.gz} +0 -0
- /package/dist/web/assets/{pkl-HQNdCmJT.js → pkl-CITYNGVz.js} +0 -0
- /package/dist/web/assets/{pkl-HQNdCmJT.js.br → pkl-CITYNGVz.js.br} +0 -0
- /package/dist/web/assets/{pkl-HQNdCmJT.js.gz → pkl-CITYNGVz.js.gz} +0 -0
- /package/dist/web/assets/{plastic-QMrjD10f.js → plastic-Bf0T6rmg.js} +0 -0
- /package/dist/web/assets/{plastic-QMrjD10f.js.br → plastic-Bf0T6rmg.js.br} +0 -0
- /package/dist/web/assets/{plastic-QMrjD10f.js.gz → plastic-Bf0T6rmg.js.gz} +0 -0
- /package/dist/web/assets/{plsql-Ds9EzM4F.js → plsql-Chr907pu.js} +0 -0
- /package/dist/web/assets/{plsql-Ds9EzM4F.js.br → plsql-Chr907pu.js.br} +0 -0
- /package/dist/web/assets/{plsql-Ds9EzM4F.js.gz → plsql-Chr907pu.js.gz} +0 -0
- /package/dist/web/assets/{po-CM8JtETE.js → po-07U75CYV.js} +0 -0
- /package/dist/web/assets/{po-CM8JtETE.js.br → po-07U75CYV.js.br} +0 -0
- /package/dist/web/assets/{po-CM8JtETE.js.gz → po-07U75CYV.js.gz} +0 -0
- /package/dist/web/assets/{poimandres-fat7kglW.js → poimandres-B0T4qwXY.js} +0 -0
- /package/dist/web/assets/{poimandres-fat7kglW.js.br → poimandres-B0T4qwXY.js.br} +0 -0
- /package/dist/web/assets/{poimandres-fat7kglW.js.gz → poimandres-B0T4qwXY.js.gz} +0 -0
- /package/dist/web/assets/{polar-CnOzO2UD.js → polar-BvNJMMV5.js} +0 -0
- /package/dist/web/assets/{polar-CnOzO2UD.js.br → polar-BvNJMMV5.js.br} +0 -0
- /package/dist/web/assets/{polar-CnOzO2UD.js.gz → polar-BvNJMMV5.js.gz} +0 -0
- /package/dist/web/assets/{portal-container-context-NFSuymMu.js → portal-container-context-BXAsDqrB.js} +0 -0
- /package/dist/web/assets/{postcss-BaqfiaQC.js → postcss-BSdf-zzo.js} +0 -0
- /package/dist/web/assets/{postcss-BaqfiaQC.js.br → postcss-BSdf-zzo.js.br} +0 -0
- /package/dist/web/assets/{postcss-BaqfiaQC.js.gz → postcss-BSdf-zzo.js.gz} +0 -0
- /package/dist/web/assets/{powerquery-CtMX6ik_.js → powerquery-B2Ad_HK8.js} +0 -0
- /package/dist/web/assets/{powerquery-CtMX6ik_.js.br → powerquery-B2Ad_HK8.js.br} +0 -0
- /package/dist/web/assets/{powerquery-CtMX6ik_.js.gz → powerquery-B2Ad_HK8.js.gz} +0 -0
- /package/dist/web/assets/{powershell-BaTgHUxS.js → powershell-DO5WY2v2.js} +0 -0
- /package/dist/web/assets/{powershell-BaTgHUxS.js.br → powershell-DO5WY2v2.js.br} +0 -0
- /package/dist/web/assets/{powershell-BaTgHUxS.js.gz → powershell-DO5WY2v2.js.gz} +0 -0
- /package/dist/web/assets/{preload-helper-BEFjQwLd.js → preload-helper-CM8YhcCa.js} +0 -0
- /package/dist/web/assets/{preload-helper-BEFjQwLd.js.br → preload-helper-CM8YhcCa.js.br} +0 -0
- /package/dist/web/assets/{preload-helper-BEFjQwLd.js.gz → preload-helper-CM8YhcCa.js.gz} +0 -0
- /package/dist/web/assets/{prisma-BLaoUK-7.js → prisma-BfaRPYzs.js} +0 -0
- /package/dist/web/assets/{prisma-BLaoUK-7.js.br → prisma-BfaRPYzs.js.br} +0 -0
- /package/dist/web/assets/{prisma-BLaoUK-7.js.gz → prisma-BfaRPYzs.js.gz} +0 -0
- /package/dist/web/assets/{prolog-0I-GhZLt.js → prolog-Cz0Nue9e.js} +0 -0
- /package/dist/web/assets/{prolog-0I-GhZLt.js.br → prolog-Cz0Nue9e.js.br} +0 -0
- /package/dist/web/assets/{prolog-0I-GhZLt.js.gz → prolog-Cz0Nue9e.js.gz} +0 -0
- /package/dist/web/assets/{proto-CHfg51WI.js → proto-FVleUZJO.js} +0 -0
- /package/dist/web/assets/{proto-CHfg51WI.js.br → proto-FVleUZJO.js.br} +0 -0
- /package/dist/web/assets/{proto-CHfg51WI.js.gz → proto-FVleUZJO.js.gz} +0 -0
- /package/dist/web/assets/{puppet-B0WZdEhx.js → puppet-BEX5o7hE.js} +0 -0
- /package/dist/web/assets/{puppet-B0WZdEhx.js.br → puppet-BEX5o7hE.js.br} +0 -0
- /package/dist/web/assets/{puppet-B0WZdEhx.js.gz → puppet-BEX5o7hE.js.gz} +0 -0
- /package/dist/web/assets/{purescript-CrVZ4Uql.js → purescript-BZX6Kw4j.js} +0 -0
- /package/dist/web/assets/{purescript-CrVZ4Uql.js.br → purescript-BZX6Kw4j.js.br} +0 -0
- /package/dist/web/assets/{purescript-CrVZ4Uql.js.gz → purescript-BZX6Kw4j.js.gz} +0 -0
- /package/dist/web/assets/{python-aEpe7ZUF.js → python-CO89UIxE.js} +0 -0
- /package/dist/web/assets/{python-aEpe7ZUF.js.br → python-CO89UIxE.js.br} +0 -0
- /package/dist/web/assets/{python-aEpe7ZUF.js.gz → python-CO89UIxE.js.gz} +0 -0
- /package/dist/web/assets/{qmldir-DxTPc3lc.js → qmldir-DH526DWB.js} +0 -0
- /package/dist/web/assets/{qss-D-nPbCGx.js → qss-wp8im4Iz.js} +0 -0
- /package/dist/web/assets/{qss-D-nPbCGx.js.br → qss-wp8im4Iz.js.br} +0 -0
- /package/dist/web/assets/{qss-D-nPbCGx.js.gz → qss-wp8im4Iz.js.gz} +0 -0
- /package/dist/web/assets/{r-BLnTqw3q.js → r-Ct7VghHm.js} +0 -0
- /package/dist/web/assets/{r-BLnTqw3q.js.br → r-Ct7VghHm.js.br} +0 -0
- /package/dist/web/assets/{r-BLnTqw3q.js.gz → r-Ct7VghHm.js.gz} +0 -0
- /package/dist/web/assets/{racket-DNO4210g.js → racket-BQvbOE5D.js} +0 -0
- /package/dist/web/assets/{racket-DNO4210g.js.br → racket-BQvbOE5D.js.br} +0 -0
- /package/dist/web/assets/{racket-DNO4210g.js.gz → racket-BQvbOE5D.js.gz} +0 -0
- /package/dist/web/assets/{raku-iZJO4hxf.js → raku-B0iWSynj.js} +0 -0
- /package/dist/web/assets/{raku-iZJO4hxf.js.br → raku-B0iWSynj.js.br} +0 -0
- /package/dist/web/assets/{raku-iZJO4hxf.js.gz → raku-B0iWSynj.js.gz} +0 -0
- /package/dist/web/assets/{react-CzUPVyyG.js → react-PkBxFcos.js} +0 -0
- /package/dist/web/assets/{red-F3EQNsNx.js → red-Cm00r9eI.js} +0 -0
- /package/dist/web/assets/{red-F3EQNsNx.js.br → red-Cm00r9eI.js.br} +0 -0
- /package/dist/web/assets/{red-F3EQNsNx.js.gz → red-Cm00r9eI.js.gz} +0 -0
- /package/dist/web/assets/{reg-DD_Uwu3t.js → reg-CBuhna22.js} +0 -0
- /package/dist/web/assets/{reg-DD_Uwu3t.js.br → reg-CBuhna22.js.br} +0 -0
- /package/dist/web/assets/{reg-DD_Uwu3t.js.gz → reg-CBuhna22.js.gz} +0 -0
- /package/dist/web/assets/{regexp-D3RlqUxN.js → regexp-BebzP4Rp.js} +0 -0
- /package/dist/web/assets/{regexp-D3RlqUxN.js.br → regexp-BebzP4Rp.js.br} +0 -0
- /package/dist/web/assets/{regexp-D3RlqUxN.js.gz → regexp-BebzP4Rp.js.gz} +0 -0
- /package/dist/web/assets/{rel-DM5GSHUR.js → rel-BYzlBhbq.js} +0 -0
- /package/dist/web/assets/{rel-DM5GSHUR.js.br → rel-BYzlBhbq.js.br} +0 -0
- /package/dist/web/assets/{rel-DM5GSHUR.js.gz → rel-BYzlBhbq.js.gz} +0 -0
- /package/dist/web/assets/{resolve-theme-STMsK2vc.js → resolve-theme-BqoL27BW.js} +0 -0
- /package/dist/web/assets/{resolve-theme-STMsK2vc.js.br → resolve-theme-BqoL27BW.js.br} +0 -0
- /package/dist/web/assets/{resolve-theme-STMsK2vc.js.gz → resolve-theme-BqoL27BW.js.gz} +0 -0
- /package/dist/web/assets/{riscv-C_jO4gJw.js → riscv-CQQP0Ro9.js} +0 -0
- /package/dist/web/assets/{riscv-C_jO4gJw.js.br → riscv-CQQP0Ro9.js.br} +0 -0
- /package/dist/web/assets/{riscv-C_jO4gJw.js.gz → riscv-CQQP0Ro9.js.gz} +0 -0
- /package/dist/web/assets/{ron--r6_MG5U.js → ron-j1ON9YzM.js} +0 -0
- /package/dist/web/assets/{ron--r6_MG5U.js.br → ron-j1ON9YzM.js.br} +0 -0
- /package/dist/web/assets/{ron--r6_MG5U.js.gz → ron-j1ON9YzM.js.gz} +0 -0
- /package/dist/web/assets/{rose-pine-NjvlliYf.js → rose-pine-Cbri3jon.js} +0 -0
- /package/dist/web/assets/{rose-pine-NjvlliYf.js.br → rose-pine-Cbri3jon.js.br} +0 -0
- /package/dist/web/assets/{rose-pine-NjvlliYf.js.gz → rose-pine-Cbri3jon.js.gz} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-DnsL01oA.js → rose-pine-dawn-BMuvKrGo.js} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-DnsL01oA.js.br → rose-pine-dawn-BMuvKrGo.js.br} +0 -0
- /package/dist/web/assets/{rose-pine-dawn-DnsL01oA.js.gz → rose-pine-dawn-BMuvKrGo.js.gz} +0 -0
- /package/dist/web/assets/{rose-pine-moon-DQTuCjVy.js → rose-pine-moon-4biZzaYD.js} +0 -0
- /package/dist/web/assets/{rose-pine-moon-DQTuCjVy.js.br → rose-pine-moon-4biZzaYD.js.br} +0 -0
- /package/dist/web/assets/{rose-pine-moon-DQTuCjVy.js.gz → rose-pine-moon-4biZzaYD.js.gz} +0 -0
- /package/dist/web/assets/{rosmsg-BQrgxzms.js → rosmsg-CXx22rtz.js} +0 -0
- /package/dist/web/assets/{rosmsg-BQrgxzms.js.br → rosmsg-CXx22rtz.js.br} +0 -0
- /package/dist/web/assets/{rosmsg-BQrgxzms.js.gz → rosmsg-CXx22rtz.js.gz} +0 -0
- /package/dist/web/assets/{rough.esm-CSLcW3u5.js → rough.esm-DK8Fp44C.js} +0 -0
- /package/dist/web/assets/{rough.esm-CSLcW3u5.js.br → rough.esm-DK8Fp44C.js.br} +0 -0
- /package/dist/web/assets/{rough.esm-CSLcW3u5.js.gz → rough.esm-DK8Fp44C.js.gz} +0 -0
- /package/dist/web/assets/{rust-CP39BBh-.js → rust-D28cFIhL.js} +0 -0
- /package/dist/web/assets/{rust-CP39BBh-.js.br → rust-D28cFIhL.js.br} +0 -0
- /package/dist/web/assets/{rust-CP39BBh-.js.gz → rust-D28cFIhL.js.gz} +0 -0
- /package/dist/web/assets/{sass-CMiN16ff.js → sass-DtNw4V28.js} +0 -0
- /package/dist/web/assets/{sass-CMiN16ff.js.br → sass-DtNw4V28.js.br} +0 -0
- /package/dist/web/assets/{sass-CMiN16ff.js.gz → sass-DtNw4V28.js.gz} +0 -0
- /package/dist/web/assets/{scala-jm4Hro87.js → scala-hv69_YQC.js} +0 -0
- /package/dist/web/assets/{scala-jm4Hro87.js.br → scala-hv69_YQC.js.br} +0 -0
- /package/dist/web/assets/{scala-jm4Hro87.js.gz → scala-hv69_YQC.js.gz} +0 -0
- /package/dist/web/assets/{scheme-Ct_BnC2r.js → scheme-Dtp9B_ng.js} +0 -0
- /package/dist/web/assets/{scheme-Ct_BnC2r.js.br → scheme-Dtp9B_ng.js.br} +0 -0
- /package/dist/web/assets/{scheme-Ct_BnC2r.js.gz → scheme-Dtp9B_ng.js.gz} +0 -0
- /package/dist/web/assets/{sdbl-CnOjqCoH.js → sdbl-DEwEngAE.js} +0 -0
- /package/dist/web/assets/{sdbl-CnOjqCoH.js.br → sdbl-DEwEngAE.js.br} +0 -0
- /package/dist/web/assets/{sdbl-CnOjqCoH.js.gz → sdbl-DEwEngAE.js.gz} +0 -0
- /package/dist/web/assets/{shellscript-C6sdrDvR.js → shellscript-CYnZDrks.js} +0 -0
- /package/dist/web/assets/{shellscript-C6sdrDvR.js.br → shellscript-CYnZDrks.js.br} +0 -0
- /package/dist/web/assets/{shellscript-C6sdrDvR.js.gz → shellscript-CYnZDrks.js.gz} +0 -0
- /package/dist/web/assets/{slack-dark-BOdgeH19.js → slack-dark-DT0E0ABt.js} +0 -0
- /package/dist/web/assets/{slack-dark-BOdgeH19.js.br → slack-dark-DT0E0ABt.js.br} +0 -0
- /package/dist/web/assets/{slack-dark-BOdgeH19.js.gz → slack-dark-DT0E0ABt.js.gz} +0 -0
- /package/dist/web/assets/{slack-ochin-DBMQIw0j.js → slack-ochin-DHHiQnxo.js} +0 -0
- /package/dist/web/assets/{slack-ochin-DBMQIw0j.js.br → slack-ochin-DHHiQnxo.js.br} +0 -0
- /package/dist/web/assets/{slack-ochin-DBMQIw0j.js.gz → slack-ochin-DHHiQnxo.js.gz} +0 -0
- /package/dist/web/assets/{smalltalk-BMQqYubg.js → smalltalk-BF_I35xJ.js} +0 -0
- /package/dist/web/assets/{smalltalk-BMQqYubg.js.br → smalltalk-BF_I35xJ.js.br} +0 -0
- /package/dist/web/assets/{smalltalk-BMQqYubg.js.gz → smalltalk-BF_I35xJ.js.gz} +0 -0
- /package/dist/web/assets/{snazzy-light-DwnLbrVG.js → snazzy-light-Cv7tIZo9.js} +0 -0
- /package/dist/web/assets/{snazzy-light-DwnLbrVG.js.br → snazzy-light-Cv7tIZo9.js.br} +0 -0
- /package/dist/web/assets/{snazzy-light-DwnLbrVG.js.gz → snazzy-light-Cv7tIZo9.js.gz} +0 -0
- /package/dist/web/assets/{solarized-dark-DXJnupYd.js → solarized-dark-wZ5YPCys.js} +0 -0
- /package/dist/web/assets/{solarized-dark-DXJnupYd.js.br → solarized-dark-wZ5YPCys.js.br} +0 -0
- /package/dist/web/assets/{solarized-dark-DXJnupYd.js.gz → solarized-dark-wZ5YPCys.js.gz} +0 -0
- /package/dist/web/assets/{solarized-light-DqhyrtI4.js → solarized-light-DGDOr1AS.js} +0 -0
- /package/dist/web/assets/{solarized-light-DqhyrtI4.js.br → solarized-light-DGDOr1AS.js.br} +0 -0
- /package/dist/web/assets/{solarized-light-DqhyrtI4.js.gz → solarized-light-DGDOr1AS.js.gz} +0 -0
- /package/dist/web/assets/{solidity-BM0p0sku.js → solidity-BJknuPqJ.js} +0 -0
- /package/dist/web/assets/{solidity-BM0p0sku.js.br → solidity-BJknuPqJ.js.br} +0 -0
- /package/dist/web/assets/{solidity-BM0p0sku.js.gz → solidity-BJknuPqJ.js.gz} +0 -0
- /package/dist/web/assets/{splunk-Cq6_jbaY.js → splunk-B1ClO_KU.js} +0 -0
- /package/dist/web/assets/{splunk-Cq6_jbaY.js.br → splunk-B1ClO_KU.js.br} +0 -0
- /package/dist/web/assets/{splunk-Cq6_jbaY.js.gz → splunk-B1ClO_KU.js.gz} +0 -0
- /package/dist/web/assets/{sql-CPfIb_cO.js → sql-CEkBuGIw.js} +0 -0
- /package/dist/web/assets/{sql-CPfIb_cO.js.br → sql-CEkBuGIw.js.br} +0 -0
- /package/dist/web/assets/{sql-CPfIb_cO.js.gz → sql-CEkBuGIw.js.gz} +0 -0
- /package/dist/web/assets/{src-C7A68uNq.js → src-C1GX5Kxw.js} +0 -0
- /package/dist/web/assets/{src-C7A68uNq.js.br → src-C1GX5Kxw.js.br} +0 -0
- /package/dist/web/assets/{src-C7A68uNq.js.gz → src-C1GX5Kxw.js.gz} +0 -0
- /package/dist/web/assets/{ssh-config-GRgzMVtG.js → ssh-config-kgM67Sf6.js} +0 -0
- /package/dist/web/assets/{ssh-config-GRgzMVtG.js.br → ssh-config-kgM67Sf6.js.br} +0 -0
- /package/dist/web/assets/{ssh-config-GRgzMVtG.js.gz → ssh-config-kgM67Sf6.js.gz} +0 -0
- /package/dist/web/assets/{stylus-DNs7ubf9.js → stylus-RcVaInR-.js} +0 -0
- /package/dist/web/assets/{stylus-DNs7ubf9.js.br → stylus-RcVaInR-.js.br} +0 -0
- /package/dist/web/assets/{stylus-DNs7ubf9.js.gz → stylus-RcVaInR-.js.gz} +0 -0
- /package/dist/web/assets/{swift-BQV34vng.js → swift-Cm0fh2lX.js} +0 -0
- /package/dist/web/assets/{swift-BQV34vng.js.br → swift-Cm0fh2lX.js.br} +0 -0
- /package/dist/web/assets/{swift-BQV34vng.js.gz → swift-Cm0fh2lX.js.gz} +0 -0
- /package/dist/web/assets/{synthwave-84-CypcdXbA.js → synthwave-84-CwLiazxr.js} +0 -0
- /package/dist/web/assets/{synthwave-84-CypcdXbA.js.br → synthwave-84-CwLiazxr.js.br} +0 -0
- /package/dist/web/assets/{synthwave-84-CypcdXbA.js.gz → synthwave-84-CwLiazxr.js.gz} +0 -0
- /package/dist/web/assets/{system-verilog-DaLPjQ4v.js → system-verilog-CzYaDVLH.js} +0 -0
- /package/dist/web/assets/{system-verilog-DaLPjQ4v.js.br → system-verilog-CzYaDVLH.js.br} +0 -0
- /package/dist/web/assets/{system-verilog-DaLPjQ4v.js.gz → system-verilog-CzYaDVLH.js.gz} +0 -0
- /package/dist/web/assets/{systemd-CXHFtmNc.js → systemd-DbSagfLw.js} +0 -0
- /package/dist/web/assets/{systemd-CXHFtmNc.js.br → systemd-DbSagfLw.js.br} +0 -0
- /package/dist/web/assets/{systemd-CXHFtmNc.js.gz → systemd-DbSagfLw.js.gz} +0 -0
- /package/dist/web/assets/{talonscript-DI9nO5jX.js → talonscript-BCFnWejL.js} +0 -0
- /package/dist/web/assets/{talonscript-DI9nO5jX.js.br → talonscript-BCFnWejL.js.br} +0 -0
- /package/dist/web/assets/{talonscript-DI9nO5jX.js.gz → talonscript-BCFnWejL.js.gz} +0 -0
- /package/dist/web/assets/{tasl-BAQyAl0c.js → tasl-BUdqtEe1.js} +0 -0
- /package/dist/web/assets/{tasl-BAQyAl0c.js.br → tasl-BUdqtEe1.js.br} +0 -0
- /package/dist/web/assets/{tasl-BAQyAl0c.js.gz → tasl-BUdqtEe1.js.gz} +0 -0
- /package/dist/web/assets/{tcl-BP_ozI58.js → tcl-CR_lTV9N.js} +0 -0
- /package/dist/web/assets/{tcl-BP_ozI58.js.br → tcl-CR_lTV9N.js.br} +0 -0
- /package/dist/web/assets/{tcl-BP_ozI58.js.gz → tcl-CR_lTV9N.js.gz} +0 -0
- /package/dist/web/assets/{terraform-NrndR0yZ.js → terraform-Bqsha-xe.js} +0 -0
- /package/dist/web/assets/{terraform-NrndR0yZ.js.br → terraform-Bqsha-xe.js.br} +0 -0
- /package/dist/web/assets/{terraform-NrndR0yZ.js.gz → terraform-Bqsha-xe.js.gz} +0 -0
- /package/dist/web/assets/{tokyo-night-CbUQlN8D.js → tokyo-night-Cnuo6JB6.js} +0 -0
- /package/dist/web/assets/{tokyo-night-CbUQlN8D.js.br → tokyo-night-Cnuo6JB6.js.br} +0 -0
- /package/dist/web/assets/{tokyo-night-CbUQlN8D.js.gz → tokyo-night-Cnuo6JB6.js.gz} +0 -0
- /package/dist/web/assets/{toml-BM_zrMLj.js → toml-CLFdhT22.js} +0 -0
- /package/dist/web/assets/{toml-BM_zrMLj.js.br → toml-CLFdhT22.js.br} +0 -0
- /package/dist/web/assets/{toml-BM_zrMLj.js.gz → toml-CLFdhT22.js.gz} +0 -0
- /package/dist/web/assets/{tsv-CfyllNPO.js → tsv-Dw3tLrZN.js} +0 -0
- /package/dist/web/assets/{tsx-BROcpVjE.js → tsx-BuCbOiJi.js} +0 -0
- /package/dist/web/assets/{tsx-BROcpVjE.js.br → tsx-BuCbOiJi.js.br} +0 -0
- /package/dist/web/assets/{tsx-BROcpVjE.js.gz → tsx-BuCbOiJi.js.gz} +0 -0
- /package/dist/web/assets/{turtle-CHmyeS9k.js → turtle-BMKMfTrj.js} +0 -0
- /package/dist/web/assets/{turtle-CHmyeS9k.js.br → turtle-BMKMfTrj.js.br} +0 -0
- /package/dist/web/assets/{turtle-CHmyeS9k.js.gz → turtle-BMKMfTrj.js.gz} +0 -0
- /package/dist/web/assets/{typescript-BVwspRg8.js → typescript-Y6cbFqno.js} +0 -0
- /package/dist/web/assets/{typescript-BVwspRg8.js.br → typescript-Y6cbFqno.js.br} +0 -0
- /package/dist/web/assets/{typescript-BVwspRg8.js.gz → typescript-Y6cbFqno.js.gz} +0 -0
- /package/dist/web/assets/{typespec-DXRppCgc.js → typespec-EbgGJHV_.js} +0 -0
- /package/dist/web/assets/{typespec-DXRppCgc.js.br → typespec-EbgGJHV_.js.br} +0 -0
- /package/dist/web/assets/{typespec-DXRppCgc.js.gz → typespec-EbgGJHV_.js.gz} +0 -0
- /package/dist/web/assets/{typst-L5uwArOj.js → typst-CQXV2SzX.js} +0 -0
- /package/dist/web/assets/{typst-L5uwArOj.js.br → typst-CQXV2SzX.js.br} +0 -0
- /package/dist/web/assets/{typst-L5uwArOj.js.gz → typst-CQXV2SzX.js.gz} +0 -0
- /package/dist/web/assets/{use-h264-canvas-decoder-BfO9QrlH.js → use-h264-canvas-decoder-DAjp9oHe.js} +0 -0
- /package/dist/web/assets/{use-h264-canvas-decoder-BfO9QrlH.js.br → use-h264-canvas-decoder-DAjp9oHe.js.br} +0 -0
- /package/dist/web/assets/{use-h264-canvas-decoder-BfO9QrlH.js.gz → use-h264-canvas-decoder-DAjp9oHe.js.gz} +0 -0
- /package/dist/web/assets/{use-is-mobile-BClDZJP5.js → use-is-mobile-BXHbkfs9.js} +0 -0
- /package/dist/web/assets/{use-visual-viewport-BGpcMnIx.js → use-visual-viewport-CQ6-A0Dt.js} +0 -0
- /package/dist/web/assets/{utils-btZ8C8-R.js → utils-Bslrbb-G.js} +0 -0
- /package/dist/web/assets/{utils-btZ8C8-R.js.br → utils-Bslrbb-G.js.br} +0 -0
- /package/dist/web/assets/{utils-btZ8C8-R.js.gz → utils-Bslrbb-G.js.gz} +0 -0
- /package/dist/web/assets/{v-Bz99d5uk.js → v-Ci1jObJJ.js} +0 -0
- /package/dist/web/assets/{v-Bz99d5uk.js.br → v-Ci1jObJJ.js.br} +0 -0
- /package/dist/web/assets/{v-Bz99d5uk.js.gz → v-Ci1jObJJ.js.gz} +0 -0
- /package/dist/web/assets/{vala-B-CtBLX1.js → vala-C_NdfqrY.js} +0 -0
- /package/dist/web/assets/{vala-B-CtBLX1.js.br → vala-C_NdfqrY.js.br} +0 -0
- /package/dist/web/assets/{vala-B-CtBLX1.js.gz → vala-C_NdfqrY.js.gz} +0 -0
- /package/dist/web/assets/{vb-DHqiz9Cp.js → vb-K_r_h_s8.js} +0 -0
- /package/dist/web/assets/{vb-DHqiz9Cp.js.br → vb-K_r_h_s8.js.br} +0 -0
- /package/dist/web/assets/{vb-DHqiz9Cp.js.gz → vb-K_r_h_s8.js.gz} +0 -0
- /package/dist/web/assets/{vendor-xterm-CfasyE0m.js → vendor-xterm-sFX94k3w.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-CfasyE0m.js.br → vendor-xterm-sFX94k3w.js.br} +0 -0
- /package/dist/web/assets/{vendor-xterm-CfasyE0m.js.gz → vendor-xterm-sFX94k3w.js.gz} +0 -0
- /package/dist/web/assets/{verilog-DbTkSkM7.js → verilog-DQPYLsZI.js} +0 -0
- /package/dist/web/assets/{verilog-DbTkSkM7.js.br → verilog-DQPYLsZI.js.br} +0 -0
- /package/dist/web/assets/{verilog-DbTkSkM7.js.gz → verilog-DQPYLsZI.js.gz} +0 -0
- /package/dist/web/assets/{vesper-2aVei4Le.js → vesper-BrmzEV8s.js} +0 -0
- /package/dist/web/assets/{vesper-2aVei4Le.js.br → vesper-BrmzEV8s.js.br} +0 -0
- /package/dist/web/assets/{vesper-2aVei4Le.js.gz → vesper-BrmzEV8s.js.gz} +0 -0
- /package/dist/web/assets/{vhdl-BJJSCnQQ.js → vhdl-CjxQGaH2.js} +0 -0
- /package/dist/web/assets/{vhdl-BJJSCnQQ.js.br → vhdl-CjxQGaH2.js.br} +0 -0
- /package/dist/web/assets/{vhdl-BJJSCnQQ.js.gz → vhdl-CjxQGaH2.js.gz} +0 -0
- /package/dist/web/assets/{viml-qxSvRN8n.js → viml-CTKJNQH1.js} +0 -0
- /package/dist/web/assets/{viml-qxSvRN8n.js.br → viml-CTKJNQH1.js.br} +0 -0
- /package/dist/web/assets/{viml-qxSvRN8n.js.gz → viml-CTKJNQH1.js.gz} +0 -0
- /package/dist/web/assets/{vitesse-black-CjR1y0Bv.js → vitesse-black-i-H_3p1i.js} +0 -0
- /package/dist/web/assets/{vitesse-black-CjR1y0Bv.js.br → vitesse-black-i-H_3p1i.js.br} +0 -0
- /package/dist/web/assets/{vitesse-black-CjR1y0Bv.js.gz → vitesse-black-i-H_3p1i.js.gz} +0 -0
- /package/dist/web/assets/{vitesse-dark-jrcdsqkn.js → vitesse-dark-DZC_Yy3_.js} +0 -0
- /package/dist/web/assets/{vitesse-dark-jrcdsqkn.js.br → vitesse-dark-DZC_Yy3_.js.br} +0 -0
- /package/dist/web/assets/{vitesse-dark-jrcdsqkn.js.gz → vitesse-dark-DZC_Yy3_.js.gz} +0 -0
- /package/dist/web/assets/{vitesse-light-DkC_qU0k.js → vitesse-light-rf4kpmk8.js} +0 -0
- /package/dist/web/assets/{vitesse-light-DkC_qU0k.js.br → vitesse-light-rf4kpmk8.js.br} +0 -0
- /package/dist/web/assets/{vitesse-light-DkC_qU0k.js.gz → vitesse-light-rf4kpmk8.js.gz} +0 -0
- /package/dist/web/assets/{vyper-WAhkfwIX.js → vyper-BLnOw4Nf.js} +0 -0
- /package/dist/web/assets/{vyper-WAhkfwIX.js.br → vyper-BLnOw4Nf.js.br} +0 -0
- /package/dist/web/assets/{vyper-WAhkfwIX.js.gz → vyper-BLnOw4Nf.js.gz} +0 -0
- /package/dist/web/assets/{wasm-BYGI5YYa.js → wasm-CTwH9oN2.js} +0 -0
- /package/dist/web/assets/{wasm-BYGI5YYa.js.br → wasm-CTwH9oN2.js.br} +0 -0
- /package/dist/web/assets/{wasm-BYGI5YYa.js.gz → wasm-CTwH9oN2.js.gz} +0 -0
- /package/dist/web/assets/{wasm-Miuao4O0.js → wasm-CWeHvGNG.js} +0 -0
- /package/dist/web/assets/{wasm-Miuao4O0.js.br → wasm-CWeHvGNG.js.br} +0 -0
- /package/dist/web/assets/{wasm-Miuao4O0.js.gz → wasm-CWeHvGNG.js.gz} +0 -0
- /package/dist/web/assets/{wenyan-Dd5qjF8u.js → wenyan-CLwdRuzd.js} +0 -0
- /package/dist/web/assets/{wenyan-Dd5qjF8u.js.br → wenyan-CLwdRuzd.js.br} +0 -0
- /package/dist/web/assets/{wenyan-Dd5qjF8u.js.gz → wenyan-CLwdRuzd.js.gz} +0 -0
- /package/dist/web/assets/{wgsl-C3T5a0UO.js → wgsl-CBTDMVJR.js} +0 -0
- /package/dist/web/assets/{wgsl-C3T5a0UO.js.br → wgsl-CBTDMVJR.js.br} +0 -0
- /package/dist/web/assets/{wgsl-C3T5a0UO.js.gz → wgsl-CBTDMVJR.js.gz} +0 -0
- /package/dist/web/assets/{wikitext-CvCJjxSa.js → wikitext-CQHrF84e.js} +0 -0
- /package/dist/web/assets/{wikitext-CvCJjxSa.js.br → wikitext-CQHrF84e.js.br} +0 -0
- /package/dist/web/assets/{wikitext-CvCJjxSa.js.gz → wikitext-CQHrF84e.js.gz} +0 -0
- /package/dist/web/assets/{wit-DybvG9BU.js → wit-8xdbdipU.js} +0 -0
- /package/dist/web/assets/{wit-DybvG9BU.js.br → wit-8xdbdipU.js.br} +0 -0
- /package/dist/web/assets/{wit-DybvG9BU.js.gz → wit-8xdbdipU.js.gz} +0 -0
- /package/dist/web/assets/{wolfram-CdhnrpZ7.js → wolfram-tFwx32a_.js} +0 -0
- /package/dist/web/assets/{wolfram-CdhnrpZ7.js.br → wolfram-tFwx32a_.js.br} +0 -0
- /package/dist/web/assets/{wolfram-CdhnrpZ7.js.gz → wolfram-tFwx32a_.js.gz} +0 -0
- /package/dist/web/assets/{yaml-B0HIje0z.js → yaml-D5O1CXgB.js} +0 -0
- /package/dist/web/assets/{yaml-B0HIje0z.js.br → yaml-D5O1CXgB.js.br} +0 -0
- /package/dist/web/assets/{yaml-B0HIje0z.js.gz → yaml-D5O1CXgB.js.gz} +0 -0
- /package/dist/web/assets/{zenscript-CcLSNTvD.js → zenscript-B10Pj7JT.js} +0 -0
- /package/dist/web/assets/{zenscript-CcLSNTvD.js.br → zenscript-B10Pj7JT.js.br} +0 -0
- /package/dist/web/assets/{zenscript-CcLSNTvD.js.gz → zenscript-B10Pj7JT.js.gz} +0 -0
- /package/dist/web/assets/{zig-dAelYAUr.js → zig-BZKcTtrK.js} +0 -0
- /package/dist/web/assets/{zig-dAelYAUr.js.br → zig-BZKcTtrK.js.br} +0 -0
- /package/dist/web/assets/{zig-dAelYAUr.js.gz → zig-BZKcTtrK.js.gz} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,191 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.23.13] - 2026-10-08
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- **One click installs what Settings used to give you commands for.**
|
|
8
|
+
- **Settings → Design** installs the suggested design skill, ui-ux-pro-max 2.15.0, for each design provider you use (Claude's `~/.claude/skills`, Codex's `~/.agents/skills`) and names it in your design instructions. The result is the same as running `uipro init --global`, checked file for file, from a download pinned by checksum; a skill folder that is already there is left alone. Its scripts need Python 3, and PPM says so when the machine has none. The commands are still there under "Install it yourself instead".
|
|
9
|
+
- **Settings → Language Servers** and the editor's missing-server dialog install clangd and the Lua server by downloading the project's own release (pinned by version and SHA-256, and started once to check it runs on this machine), and Solargraph with the machine's Ruby, all into PPM's own folder; Remove deletes them again. Every server in the list now has an Install button wherever the machine can carry it out. Solargraph is not offered on Windows, and says so when a gem needs a C compiler the machine lacks.
|
|
10
|
+
- **Tailscale on Linux** and **Voice Input on a Mac**: a step that needs your password or Homebrew has a button that types its command into a PPM terminal, where you press Enter. For Tailscale one command installs, starts and lets PPM manage it, so the password is asked once; for Voice it is `brew install whisper.cpp`, and the pane carries on once whisper.cpp is there. Nothing runs until you press Enter.
|
|
11
|
+
|
|
12
|
+
- **The AI can open files and show you the pages it makes, in PPM tabs.** Turn on **Settings → AI Provider → Let the AI open tabs in PPM** and Claude and Codex get two tools. Each opens a tab on the device you sent the message from: beside the chat on a desktop, or in place of the chat on a phone. PPM serves the page itself, so it works the same over a LAN address, the tunnel and a phone. Turning the setting on also turns off Claude's claude.ai Artifact tool inside PPM. It applies to new chats.
|
|
13
|
+
- **`open_file`** opens a file the way you would: code in the editor, at a line when the AI points at one, and HTML, Markdown, images, PDF and CSV in their viewers.
|
|
14
|
+
- **`open_preview`** is for what the AI made: a page, chart, report or mockup. The tab opens and the page loads. The AI then gets the page's script and loading errors, its layout problems, and a screenshot at the size the tab has on your screen, so it can fix what it sees and call again; a tab that is already open reloads in place. Tried with real Claude and Codex: each fixed a page whose chart library 404'd in one round, in 73 s (Claude) and 107 s (Codex) end to end.
|
|
15
|
+
- **HTML previews may load scripts, styles and fonts from a CDN**: cdn.tailwindcss.com, cdn.jsdelivr.net, unpkg.com, fonts.googleapis.com and fonts.gstatic.com. `fetch`/XHR still reach only the files next to the page.
|
|
16
|
+
- **Every call is a card in the chat**, such as "Preview · dashboard.html · 2 problems" or "Opened · totals.ts:20". Its **Open** button brings the tab back after you closed it, from the chat's history, or on another device.
|
|
17
|
+
- If no PPM window is showing the chat, the tool answers at once that nothing was shown and says where the file is, and the AI passes that on.
|
|
18
|
+
|
|
19
|
+
- **A Logs window in place of Report Bug: read what PPM logged, see what AI made of the errors, and report a bug from the lines that show it.** The Logs button at the bottom of the rail (in the menu on a phone; Logs and Report a Bug in the command palette) opens a window on a desktop and a tab on a phone, with three tabs:
|
|
20
|
+
- **Logs** reads `ppm.log` and its rotated copies, `cloudflared.log` and the consoles of open PPM tabs as one list, sorted into AI & chat, Shell & tools, Server, Extensions, Files, Automation, Tunnel and Browser, each with its count of errors and warnings. Filter by level, tag, text (plain or a regular expression), chat and time (15 minutes, an hour, since the last restart, today, everything kept). Repeats fold into one line with a count, restarts are marked, and new lines arrive live while the window is open: Follow keeps the newest in view and stops once you select lines, so the list holds still while you pick; Pause holds them back. The list keeps its place when you go to Issues or Report and back. Select lines with click, Shift, Ctrl or a drag (on a phone, long-press one and tap the last) and add them to the current chat, a new chat or the report, or copy them; the lines in view can be saved as a `.log` file. A chat's ⋯ menu has Show logs for this chat.
|
|
21
|
+
- **Issues** is the last 24 hours of errors and warnings, grouped by cause by Claude Haiku 4.5 on your own Claude account and labelled a likely PPM bug, your setup, upstream or expected, with why and, where it can, a fix. Info lines are never sent, and secrets, home folders, email addresses and chat ids are removed first. Each issue leads to its lines, into a chat, or to a drafted report. Auto sorts new patterns at most every ten minutes and only while something is looking at them; the Logs button shows a red count of likely bugs, which can be switched off.
|
|
22
|
+
- **Report** turns the chosen lines into a GitHub issue for hienlh/ppm: a title, labels, what happened, steps and what was expected, written by you or drafted by Claude from the lines, each snippet with 5 or 20 lines of context either side if you want them, and your environment. Home folder, email addresses, chat ids and project names can be masked, secrets and quick tunnel addresses always are, and the preview marks every masked spot. Nothing is sent from PPM: Open GitHub issue opens GitHub with the report filled in for you to read and submit (copying the body instead when it is too long for a link), and open issues that look like the same problem are listed beside it.
|
|
23
|
+
- The login screen's Report Bug opens a GitHub issue holding only the PPM version and browser, since the Logs window needs signing in. `/api/logs/recent`, the log tail it used to read, needs signing in now too.
|
|
24
|
+
|
|
25
|
+
- **Log levels, and a log that records what PPM did.** Every line in `~/.ppm/ppm.log` now carries one of `DEBUG`, `INFO`, `WARN`, `ERROR` or `FATAL`, and `ppm logs --level warn` shows only that level and above (with `-n` and `-f` too). `INFO` is the default; `ppm config set log_level debug` turns on the detail without a restart, and `PPM_LOG_LEVEL` pins a level for one process.
|
|
26
|
+
- Every HTTP request is logged once, with method, path, status and time — a change at `INFO`, a read at `DEBUG`, a failure at `ERROR` with the message it returned (and the stack when a handler threw) — and every WebSocket opening and closing. Secrets in query strings and preview tokens in paths are cut out.
|
|
27
|
+
- Settings changes (the field names, never the values), database creation and migrations, server start-up and shutdown are logged; a database that will not open and a port that will not bind are `FATAL` before the process exits.
|
|
28
|
+
- Each part of PPM now records what it did: every chat turn's start and end with its outcome (`success`, `aborted`, `error`, …), account token refreshes and accounts taken out of rotation, git writes (commit, push, branch, merge, …), terminals opening and exiting, Remote Desktop and Android sessions, language servers, database pools, SSH tunnels and import/export jobs, extensions (including their own console output), Task Manager kills and signals, and the supervisor's restarts, upgrades, tunnels and PPM Cloud connection — a server that keeps crashing and is given up on is `FATAL`.
|
|
29
|
+
- A helper process that dies on its own — ffmpeg, the emulator, a language server, the Codex app-server, the WebRTC relay, the extension host — is an `ERROR` with the last of its output, where it used to vanish without a trace. Failures that were caught and dropped are logged, and one that repeats on every poll is logged once and then at `DEBUG`.
|
|
30
|
+
- The log used to be 81% one streamed SDK event, which rotated everything else out within about nine hours. Per-event chatter is `DEBUG` now, and chat text, tool output and shell commands, some of which used to be written into the log, are not logged at all. Accounts are named by id, never by email.
|
|
31
|
+
- `/api/logs/recent` (the old bug report's log tail) returns only `INFO` and above, and a Telegram bot token, an ntfy topic and a Remote Desktop stream name are redacted like the other secrets. A bug report also drops a quick tunnel's address, which lets anyone reach the forwarded dev server.
|
|
32
|
+
- CLI commands write their log lines to stderr, so a command's own output (`--json`, a pipe) stays clean.
|
|
33
|
+
|
|
34
|
+
- **Settings → Remote Access → Tailscale: PPM at a private address on your tailnet, with an on/off switch.** Turned on, PPM answers at `https://ppm.<your-tailnet>.ts.net` on every device signed in to your tailnet: a Tailscale Service hosted by this machine, with a real certificate and nothing opened to the internet. Tailscale decides most of the setup in its admin console, so the pane walks through it and checks each step itself: install Tailscale, let PPM manage it (Linux), sign in, turn on MagicDNS and HTTPS, tag the machine, and create the service. Each step links to the page that does it and turns green on its own once Tailscale reports the change. Signing in happens in the pane, with the sign-in link and a QR code so a phone can finish it, and a bottom sheet on a phone.
|
|
35
|
+
- Once on, the pane says whether an admin still has to approve this machine as the service's host, and gives the `autoApprovers` snippet that makes that automatic. When it is live, the address can be copied, opened or shown as a QR code.
|
|
36
|
+
- The address survives restarts and reboots: Tailscale keeps it, and PPM puts it back at start-up if it went missing. A `svc:ppm` set up by hand before this shows as on.
|
|
37
|
+
- It never takes over a name that already points somewhere else without asking, turning it off clears it only while it still points at PPM, and turning it on needs PPM's password to be on, since anyone in the tailnet could otherwise open PPM. The name (`ppm`, `ppm-mac`, …) can be changed while it is off.
|
|
38
|
+
|
|
39
|
+
- **Forward a dev server and open it in a PPM tab, over Tailscale or Cloudflare.** Forward, in the sidebar's Port Forwarding panel, offers Tailscale (`https://<machine>.<tailnet>.ts.net:<port>/`, reachable from your tailnet only, at a URL that stays the same from one forward to the next) or Cloudflare (a public link), and Open in a tab shows the page inside PPM, with its toolbar under the thumb on a phone. Both go through a small hop on the host that makes the request look local to the dev server: Vite 8 listens on `[::1]` only and refuses a Host that is not localhost, so forwarding a Vite server with its defaults used to fail either way. A page that refuses to be framed (Rails and Django do by default) still shows in the tab: the hop lets the address PPM is open at frame it, and every other site is still refused. A Tailscale forward lasts as long as the `tailscale serve` process PPM runs for it, and PPM stops those when it exits, so a restart leaves no dead handler behind (only a `kill -9` of PPM itself can).
|
|
40
|
+
|
|
41
|
+
- **Every file a chat changed, in one place, like Cursor's review.** A bar above the composer reads "N files changed +X −Y" for the whole session, across all its turns — the chip under each answer still covers that turn only. It opens into the file list (a bottom sheet on a phone), and Review or any file opens a Review tab that goes through the changes block by block, the way Cursor and Zed review an agent's edits: each block sits in place in its file, compared with the state the file was in *before the session first touched it*, and is kept or reverted right there. That is not git: an uncommitted edit from before the session is not counted as the session's, and a file edited in three turns is one set of blocks. The tab follows the chat while it runs and works on its own after a reload.
|
|
42
|
+
- PPM keeps that "before" itself, under `session-baselines/` in its directory, because nothing else has it: Claude Code's transcript drops a tool's `originalFile` above ~10 KB (kept at 9.8 KB, gone at 13.6 KB), and an Edit's `old_string` is a fragment. Claude's copy is taken by a PreToolUse hook just before the write, in every permission mode, sub-agents included; Codex applies a patch before PPM hears of it, so its "before" is the patch reverse-applied to the file. The first copy wins, a file over 5 MB or binary is listed without a diff, credential paths are never copied, and a session's copies go when it is deleted or after 30 days without a change.
|
|
43
|
+
- Files a Claude session changed with shell commands are listed too — a `cp`, a `sed -i`, a `printf >>`, a formatter, a `git checkout --` that threw a change away. PPM runs `git status` just before and just after each command in the repositories it can reach (its directory, the ones it `cd`s into or names, and the ones the session has written in), about 6 ms each, and a file whose status or timestamps moved in between is one the command changed. Its "before" is read ahead of the command when git already listed the file, and from HEAD otherwise. An edit committed in the same command is still found. A file git ignores or one outside any repository is not, and the list says so. Codex's shell commands are not followed yet.
|
|
44
|
+
- A session from before this falls back to git HEAD for the files its transcript names, inside the project only, and says so above its blocks.
|
|
45
|
+
- **Keep or revert, block by block.** Keep (Y) leaves a change and moves on; Revert (N) writes the block's original lines back to the file on disk at once, byte for byte (line endings and a missing last newline included), and leaves what it put back in place, dimmed. Every answer can be undone from a toast for 5 seconds, and a decided block has Change, which opens it again or undoes its revert later. J and K move between blocks across files; Keep file and Revert file… (confirmed first) answer a whole file, and a binary or very large file is only answered whole; Keep all remaining keeps everything still open. Lines are coloured like the chat's code blocks, with the changed part of each line marked. On a phone the tab shows the file in focus with Previous, Revert, Keep and Next under the thumb and the file list in a sheet; in a narrow split the list folds behind an "N files" button.
|
|
46
|
+
- **Answers are kept on the server**, so a phone and a desktop agree and a reload loses nothing. An answer applies only to the version on screen: a file the agent changed while you were reading it is left alone and drawn again. A file whose blocks are all kept is marked reviewed and leaves the bar's totals behind one "N reviewed — Show" row, as a checkbox or "Mark all reviewed" in the bar does; the bar shrinks to "All N files reviewed" once nothing is left. If the agent changes a reviewed file again it comes back as "New since review" with only the new blocks open.
|
|
47
|
+
- **Each block names the turn that wrote it.** A chip on the block ("Turn 2 · 14:03") opens the prompt that asked for the change, with Copy prompt and Show in chat, which brings the chat to the tool call and flashes it; a block two turns wrote names both. PPM records each file's state just before and just after every call that writes it — a file tool, a shell command, a Codex patch — as small deltas beside its "before", and works out which call put each line in the way `git blame` walks commits. A change no call made, such as your own edit or a formatter, names no turn.
|
|
48
|
+
- **Keep, revert, or revert a whole turn from the chat.** The pill under each answer says how that turn's edits stand ("3 edits to review", "Kept", "2 reverted"), and its tray — a sheet on a phone — keeps or reverts each edit, keeps them all, or opens the Review tab. Revert turn… shows first what it will do: what goes back in which file, a file the turn created removed, and any line a later turn changed again named and left alone ("app.ts line 2 stays as it is — Turn 2 changed it again."). It writes nothing if a file changed since that preview, leaves alone one that changes while it writes, and Undo puts it all back.
|
|
49
|
+
|
|
50
|
+
- **Add selected code to chat.** Select code in the editor and Monaco's own yellow lightbulb offers Add to current chat and Add to new chat, in the same menu as a language server's quick fixes and refactorings (Ctrl+. opens it too). Selecting does not open anything by itself. The chip carries the file path, the selected line range and the editor's current text, unsaved edits included. When the line has no room for the bulb, Monaco puts it in the glyph margin left of the line numbers, which standalone Monaco turns off; it is now on, two lanes wide, with the bulb centred in it instead of pressed against the editor's edge, and the line-number column reserves three digits instead of five so the code starts where it did (2px further right). A click anywhere on the bulb opens the menu and keeps the selection.
|
|
51
|
+
|
|
52
|
+
- **Add a terminal selection to chat.** Select text in a terminal and Add to current chat and Add to new chat appear right under it, as the editor offers them for a code selection (and as Cursor shows its Add to Chat). Either one adds the selection as a "Terminal selection" chip without sending anything, and clears the selection. On a phone, select in select mode; the buttons are finger-sized.
|
|
53
|
+
|
|
54
|
+
- **Fix with AI and Explain with AI on errors and warnings in the editor.** Every error and warning offers both, the way Copilot's Fix and Explain do (Cursor has the first as Fix in Chat): in the lightbulb menu beside the language server's own quick fixes, each marked with a sparkle, and Fix with AI also as a one-click action in the problem's hover, next to Quick Fix. When they are the only fixes on offer, the bulb itself is a sparkle. Either one opens a new chat and sends the request at once: each problem with its line, column, source and code, then the code three lines either side as the editor has it, unsaved edits included. Explain asks for an explanation without changing any files. Hints and infos are not offered. TypeScript and most other languages report errors only while the language server is on (LSP in the editor toolbar); Monaco's own JSON and CSS checks report them either way.
|
|
55
|
+
|
|
56
|
+
- **Reply to a user or AI chat message.** Select Reply to quote a completed message while keeping your draft and attachments. Quotes reach the AI on normal and mid-turn sends, survive history reloads, and remain readable if their source is unavailable. Reply drafts recover after reload or rejected sends; quote cards jump to a uniquely identified original message.
|
|
57
|
+
|
|
58
|
+
- **The database sidebar is now a DBGate-style workspace, for SQLite, PostgreSQL, MySQL and MariaDB.** It was a list of connections, a table list and a read-mostly grid. It now follows DBGate's screens, one area at a time:
|
|
59
|
+
- **Connections**: a connection tab with General, Advanced, SSH Tunnel and SSL pages; Test shows the server version and its databases. A connection can **ask for its password** instead of storing it (Database Log In holds it until Disconnect), be limited to a list of databases, set the isolation level and a query timeout. The sidebar shows CONNECTIONS above TABLES, VIEWS, FUNCTIONS, with folders, status, filters and menus.
|
|
60
|
+
- **MySQL and MariaDB**: the `mysql2` driver installs from **Settings → Database Drivers** (or `ppm db driver install mysql`) rather than shipping in the binary; SSH tunnels use `ssh2` the same way.
|
|
61
|
+
- **Data grid**: DBGate's filter row and filter syntax with Set filter, Filter multiple values, Choose value and Lookup dialogs and a Filters panel; sort on several columns; 100 rows at a time with Fetch all; a Columns panel; the Rows / Count / Sum label.
|
|
62
|
+
- **Editing**: edit cells, add and delete rows, undo and redo, then **Save** shows the script and runs it in one transaction. Deleting a row other rows still point at offers **Delete references CASCADE**.
|
|
63
|
+
- **Form view (F4), Cell data and References**, including following a foreign key from a cell.
|
|
64
|
+
- **Copy advanced** in nine formats, **Generate SQL** (INSERT / UPDATE / DELETE) from selected rows, and **Export ▾** of the current view as CSV, TSV, JSON, NDJSON, SQL, XML or XLSX.
|
|
65
|
+
- **Structure tab**: add, change, rename and drop columns, keys and indexes with a preview of the DDL; new tables. SQLite changes that `ALTER TABLE` cannot express rebuild the table in SQLite's 12 documented steps.
|
|
66
|
+
- **Import/Export tab**: export several tables at once (one file each, one XLSX workbook with a sheet per table, or a zip) and import CSV, JSON or JSON-lines files into new or existing tables, as jobs you can stop.
|
|
67
|
+
- **Query tab**: runs a script one statement at a time with a **Messages** tab and a **Result** tab per statement, marks the line that failed, can go on past an error, **Stop** cancels the running statement on PostgreSQL and MySQL / MariaDB, a row limit per tab, EXPLAIN, **Format** (Shift+Alt+F: the script laid out by `sql-formatter` in the engine's own dialect, a MySQL `DELIMITER` block left as typed), a **History** panel read from the query audit log, and Ctrl+S to save the script as a `.sql` file.
|
|
68
|
+
- **On a phone**: the tree is a drawer, menus open on long-press as bottom sheets, filters and columns are sheets, a tapped row opens as a form, and Run sits in the thumb zone.
|
|
69
|
+
|
|
70
|
+
- **Source Control, a new Review changes tab and the Git Graph now work as one flow: stage block by block, review, commit.** The three show the same changes, the same staged blocks and the same commit message, and an action in one shows in the others straight away.
|
|
71
|
+
- **Source Control** lists every changed file in one Changes group — staged, unstaged and new together — each with a checkbox (ticked, partly ticked or empty), a dot per block (green once staged), its +/− and its status letter. The branch row always says where the branch stands and offers the one action it needs: Push ↑n, Pull ↓n, Sync, Publish for a branch with no upstream, or Synced. The commit box adds Commit and push, Amend last commit, Commit with sign-off and Undo last commit (only while that commit is not pushed; its message goes back in the box). A merge, rebase or cherry-pick that stopped part way shows a banner with Abort and Continue, each conflict gets a Resolve that opens the conflict editor, and ticking a file that still has conflict markers asks first. Stashes (apply, pop, drop) and worktrees fold out below. On a phone the rows are 56 px, the checkboxes 48 px, and the commit box sits at the bottom, under the thumb.
|
|
72
|
+
- **Review changes** goes through what you have not committed block by block, the way the chat's session review goes through an agent's edits: Stage (Y), Discard (N), or Lines… (L) to stage single lines. J and K move between blocks across files, and the commit box is in the tab. A binary, very large or renamed file is one block for the whole file. Clicking a file in Source Control opens it here. On a phone the tab shows one block at a time with Discard and Stage at the bottom, and the file list and the commit box in sheets.
|
|
73
|
+
- **Git Graph** takes the app's colours, icons and font. A commit opens in an inspector on the right — an overlay below 900 px wide, a bottom sheet on a phone — with Checkout, Branch…, Cherry-pick, its message and its files, each with its own file-type icon. The Uncommitted changes row opens the commit box with a checkbox per file, and Review. The toolbar picks which branches are drawn, searches by message, author or hash, lists stashes and worktrees, and has Fetch, Pull ↓n and Push ↑n. A branch, tag or stash changed outside PPM, in a terminal for example, shows within the 5-second refresh instead of waiting for Refresh.
|
|
74
|
+
- **One commit message per repository**, kept on the server: what you type in one of the three boxes appears in the others, it survives a reload, and a commit from any of them clears all three.
|
|
75
|
+
- **A discard can be undone.** Discarding a block or a file shows a toast with Undo, and a discarded block keeps its Undo in the Review tab. git keeps nothing of a discarded change, so PPM keeps a copy for a day, up to 100 per repository, under `git-discards/` in its directory. Undo refuses rather than overwrite anything changed since; a file over 20 MB is not copied, and its discard says it cannot be undone.
|
|
76
|
+
- **Every view follows a change at once.** A git action made through PPM's git routes — everything in Source Control and the Review tab, and in the Git Graph its commit box, its toolbar and applying, popping or dropping a stash — tells Source Control, the Review tab, the Git Graph, the status bar and the file tree's colours to look again. The Git Graph's commit, branch and tag menus still run git themselves, and are seen at the next poll at the latest. After the Git Graph's Fetch, Pull or Push the status bar used to wait up to 10 seconds for its own poll; it now follows in about 0.6 s. The Git Graph's Fetch goes through PPM for that reason, and fetches every remote with prune.
|
|
77
|
+
|
|
78
|
+
- **Push notifications to your phone or computer, switched on per device in Settings → Notifications.** It is standard Web Push: Chrome and Android deliver it through Firebase Cloud Messaging, Firefox and Safari through their own services, and PPM signs each push with its own key, so there is no Firebase project to set up. A notification says what happened and on which machine, with the detail worth reading without opening PPM — the end of the answer, the command waiting for approval, the question asked — and tapping it opens that session in the PPM window already open, or in a new one. A session has one notification at a time: a newer one replaces it. Push needs PPM on HTTPS or localhost, and on iPhone and iPad it works only once PPM is added to the Home Screen; the pane says which applies. Every device that receives push is listed with when it last got one, Send a test and Remove.
|
|
79
|
+
|
|
80
|
+
- **Settings → Notifications decides what is sent and when, for push, Telegram and ntfy alike.** Each kind can be switched off (chat finished, needs approval, AI has a question, scheduled run, Jira). By default a notification waits a minute and goes out only if the chat is still unread by then: opening it on any device, or answering the approval, cancels it. "Right away" sends at once.
|
|
81
|
+
|
|
82
|
+
- **Connect Telegram in one tap.** Connect Telegram makes a single-use link (with a QR code on a desktop); opening it in Telegram and pressing Start connects that chat — no pairing code to copy, and PPMBot does not have to be on. The pane walks through creating a bot with @BotFather, and a token is checked with Telegram before it is saved, so a mistyped one is refused with Telegram's reason instead of failing silently later. Telegram messages carry the same detail as push and link to the session.
|
|
83
|
+
|
|
84
|
+
- **PPMBot has a Telegram bot and chats of its own, set up the way Notifications are.** Settings → PPMBot → Telegram now has the same parts as Notifications → Telegram: the bot token with the steps to create a bot in @BotFather (checked with Telegram before it is saved), a switch that turns PPMBot on and says whether it is running, the chats that can use PPMBot with Disconnect, and Connect Telegram with a single-use link and a QR code. There are no pairing codes any more: Connect Telegram is the only way in, as with Notifications, so nothing waits for approval, and a chat that writes to the bot without being connected is told once where to connect it. Notifications and PPMBot used to share one bot and one list of chats, so connecting a chat for alerts also let it command PPMBot, which runs tasks on this machine, and alerts arrived in the middle of PPMBot conversations. Now a chat connected in Notifications gets alerts and nothing else, and a chat connected in PPMBot can use PPMBot and gets no alerts. Controls are 44 px on a phone.
|
|
85
|
+
- Upgrading leaves nothing behind: every chat that got alerts still does, and a PPMBot that was on keeps answering on the bot it used, with a note in both panes suggesting a bot of its own. A PPMBot that was off starts with no bot. PPMBot's token is stored outside the config object, so nothing that shows config can reveal it.
|
|
86
|
+
|
|
87
|
+
- **Notifications through ntfy**, on ntfy.sh or a server of your own. Enter the server, a topic (PPM suggests one that is hard to guess) and, for a server that requires sign-in, an access token; PPM checks that the address answers as ntfy and that the server accepts the token before saving, and saving a different server in Settings drops the token saved for the old one instead of sending it to the new one. Every phone or computer subscribed to the topic gets the same text as push, with a tap that opens the session; an approval or a question goes out at ntfy's high priority. ntfy has its own switch, Send a test, a link to the topic and a short guide, including the `upstream-base-url` setting an iPhone needs to get instant alerts from a self-hosted server.
|
|
88
|
+
|
|
89
|
+
- **The System Monitor's Apps page works on Windows.** It used to say "This host does not list desktop applications". An app is now what Task Manager's Apps group shows — a process owning a visible, titled, top-level window — read over Win32 and named by its executable's own description. The page is sorted by memory, biggest first.
|
|
90
|
+
|
|
91
|
+
- **The System Monitor's Services page works on Windows.** It used to say the host had no service manager; it now reads the Service Control Manager, with startup type, exit code and pid on the list and this boot's Event Log entries behind each service. One long-lived PowerShell session answers every poll rather than a process per poll.
|
|
92
|
+
|
|
93
|
+
- **Remote Desktop offers each Windows monitor separately.** Windows listed one display — the whole virtual desktop — so monitors of different sizes streamed as one oversized frame holding area no screen shows. Each monitor is now its own entry to capture and control.
|
|
94
|
+
|
|
95
|
+
- **An Install ffmpeg button on Remote Desktop's Windows readiness screen.** The checklist used to offer only a `winget` command to type into a terminal. It now runs the install on the host, shows its progress and WinGet's own error, and the re-check picks up the result without restarting PPM.
|
|
96
|
+
|
|
97
|
+
- **A long chat opens a page at a time.** Opening a chat tab used to parse and render every message since the last compaction, which on a long session is thousands of bubbles and, on the server, minutes of CPU for a transcript in the hundreds of megabytes. History now arrives in windows, and scrolling up asks for the next one.
|
|
98
|
+
|
|
99
|
+
- **An opt-in server memory monitor, `PPM_MEM_DIAG=1`.** Off unless set. It appends memory use, what grew and a few gauges to `<ppm dir>/mem-diag.log` every 30 seconds, and writes a heap snapshot the first time the heap crosses 1, 2, 4 and 8 GB — for diagnosing a server whose memory climbs.
|
|
100
|
+
|
|
101
|
+
### Changed
|
|
102
|
+
|
|
103
|
+
- **PPM's own public link moved from the sidebar's Tunnels panel to Settings → Remote Access, next to Tailscale; forwarding a port stays in the sidebar.** Remote Access has one sub-tab per way to reach PPM itself: Tailscale (the pane as it was) and Public link, which puts the on/off switch first, shows the link with Copy, Open and a QR code, and sets the two kinds of address side by side — a temporary trycloudflare.com one, or your own domain, set up right there. The sidebar panel, now Port Forwarding, opens with one row each for Tailscale and Cloudflare saying where it stands, and Set up (Manage once it is done) opens that service's sub-tab: signing in happens there, never in the panel. Below them it takes a port and a choice of Tailscale (your tailnet only) or Cloudflare (anyone with the link, no sign-in needed), and lists every forward with Open in a tab, Copy and Stop; a tunnel started outside PPM asks before it is stopped, and PPM's own link opens the Public link tab instead of offering Stop. Remote Access and Forward a Port in the command palette open them, on a phone too.
|
|
104
|
+
- **A readonly connection is now enforced by the database itself, on every path — `ppm db query` included.** It used to be protected by a check of the SQL text alone, which let a write hidden in a function call through: `SELECT nextval('s')`, `setval`, any function that writes. PostgreSQL now runs each statement inside `BEGIN READ ONLY`, MySQL / MariaDB inside a READ ONLY transaction on a READ ONLY session, and SQLite opens a readonly handle. A statement that ran before on a readonly connection can now fail.
|
|
105
|
+
- **Dates and times come back as the database prints them.** `ppm db data` and `/api/db/connections/:id/data` used to turn PostgreSQL timestamps into ISO strings in UTC; they now pass the database's own text through, as `psql` shows it. Anything that parsed the old ISO / UTC form needs updating.
|
|
106
|
+
- **`verify-full` (PostgreSQL) and `VERIFY_IDENTITY` (MySQL) now check the certificate's name when the host is an IP address.** Bun did not check the name at all for an IP target, so a certificate that does not list that IP was accepted; it is now refused.
|
|
107
|
+
- The separate PostgreSQL viewer and its CodeMirror SQL editor are gone: every connection, and a `.db` file opened from the file tree, uses the same data and Query tabs. `@codemirror/lang-sql` and `@uiw/react-codemirror` are no longer dependencies.
|
|
108
|
+
- **Clicking a file in Source Control opens it in the Review changes tab instead of a diff.** Open diff in the file's menu still shows the whole file's diff. The list is now the default view; if you had picked the tree, it stays a tree.
|
|
109
|
+
- **The Git Graph's commit details moved from the pane under the graph to an inspector on the right, and the Refs column is gone**: branch and tag labels lead the commit's subject, keep their whole names and take the colour of their line in the graph, the subject being what is cut short. Create worktree, Rebase and Interactive rebase are no longer on the commit menu — rebase is on a branch label's menu, interactive rebase in the command palette, and Add worktree… in the Worktrees menu. Refresh is in the View menu.
|
|
110
|
+
- `POST /git/pull` now takes `{ rebase? }` and pulls from the branch's upstream; it no longer takes a remote or a branch. `POST /git/fetch` takes `prune`.
|
|
111
|
+
- **Telegram alerts are no longer held back while a PPM tab is open.** They used to go out only when no browser was connected, so a tab left open anywhere — even in the background — meant no alert at all. They now follow the delay and unread rule in Settings → Notifications.
|
|
112
|
+
|
|
113
|
+
### Fixed
|
|
114
|
+
|
|
115
|
+
- **A container started from a PPM terminal or chat could restart PPM and end every session.** Under systemd, every process PPM started inherited systemd's notify socket, and systemd believed what any of them told it. `podman run` reports its container's monitor as the service's main process, so PPM "ended" when the container did, and a private `dbus-daemon` reports the service as stopping when it exits. Only the supervisor holds the socket now; the server, the edge forwarder, cloudflared and everything they start no longer get it (#38).
|
|
116
|
+
|
|
117
|
+
- **The running-agents bar listed every named agent twice, and grew over the chat.** An agent given a name was reported once as an Agent card and again as a teammate, so a session that fanned out to eleven agents showed 22 rows covering the whole conversation. Each agent is one row now, and from four agents on the list scrolls inside about three rows under an "N agents running" header that folds it away: open on a desktop, folded on a phone.
|
|
118
|
+
|
|
119
|
+
- **Save closed a new database connection's form.** It now stays open, as DBGate's does, as that connection's form: a second Save updates the connection instead of adding another one, and Edit on the connection brings that tab forward when it is in the focused panel. Connect still closes it.
|
|
120
|
+
|
|
121
|
+
- **Account rotation sent most chats to one account.** A chat kept the account it started on for as long as it existed, so chats resumed days later all went back to it: five landed on one account in a single morning while another sat at 3%. A chat now keeps its account only while that account still holds the chat's prompt cache, which is all that staying saves, and is routed like a new chat once the cache has lapsed. Round-robin also started over at the first account after every restart, and skipped an account whenever another one dropped out of the list; it now carries on after the account it handed out last. And moving an idle Claude chat to another account in the usage panel now applies to its next message, as it already did for Codex, instead of waiting until something restarted the chat's process.
|
|
122
|
+
|
|
123
|
+
- **A tool call made alongside another one lost its result when the turn ended.** The card showed a tick and nothing in it. Each block of a reply is stored as its own message, so two calls made at once sit in two messages with both results after the second, and the history reload that ends every turn put both results under the second call. Each result now stays with the call that made it.
|
|
124
|
+
|
|
125
|
+
- **A chat that stopped on an error looked like it had simply finished.** A turn that hit Max Turns (500 steps for one message by default) showed its red line only until the chat reloaded its history, which happens on every reload and at the end of a long turn, and the notification still said "Chat completed". A bar above the composer now says why the last turn stopped — "Stopped after 500 steps (Max Turns)", with where the limit is set — and stays through reloads and reconnects until the next message, with a Continue button that picks the work up again. The notification for such a turn reads "Chat stopped" with the reason. The stop is read back from the session trace, because Claude's own transcript ends at the last tool result and has no record of it.
|
|
126
|
+
|
|
127
|
+
- **A link into Settings did nothing while Settings was already open.** Open General in the Tailscale pane's password notice and Codex accounts & login in AI Provider did nothing at all, and Manage accounts in the chat's usage panel, or the link from a missing database driver, focused an open Settings window or tab but left it on the pane it was showing. It now moves to the pane the link names.
|
|
128
|
+
|
|
129
|
+
- **A tap on a Telegram or ntfy notification opened PPM at this machine's LAN address** (`http://192.168.x.x:<port>`) whenever no Cloudflare tunnel was running: plain HTTP on an insecure origin, where the browser turns off notifications, the clipboard and the other permissions PPM asks for, and where you had to sign in again. The link now goes to the tunnel, else to PPM's Tailscale address, else to `localhost`.
|
|
130
|
+
|
|
131
|
+
- **"Open in PPM" on a scheduled run's notification opened the wrong project.** The link was given the project's path where it needs the project's name, so it fell back to whichever project sorted first.
|
|
132
|
+
|
|
133
|
+
- **A notification's link opened a Codex session as a Claude chat.** Links now name the session's provider, as the app's own chat URLs do.
|
|
134
|
+
|
|
135
|
+
- **Extensions could read the Telegram bot token** through `workspace:config:get`. It is now withheld like PPM's other secrets.
|
|
136
|
+
|
|
137
|
+
- **Scrolling up in a long chat failed with "File too large: 542MB exceeds 256MB limit".** A session that had run for five days reached 543MB and 141 compactions, and "Load previous conversation" refused the whole file on every scroll up, although the part each scroll shows is about 3MB. Only that part is parsed now: the file is scanned as bytes, as far as the end of the part, to find where the part starts and ends. The 256MB bound applies to the part parsed rather than the file.
|
|
138
|
+
|
|
139
|
+
- **A Codex patch that touched several files counted only the first, and a file it created counted +0.** The chip under the answer and the transcript's change list now name every file in the patch, live and in both rollout formats, and a created or deleted file counts its lines: Codex sends those as the file's content, not as a diff.
|
|
140
|
+
|
|
141
|
+
- **A refused turn said only "Invalid request sent to the API."** The API reports a refusal as an `invalid_request` error, and the chat showed the generic hint for that error. The CLI's own text in the message says what happened and what to do next (rephrase in a new session, or change the model), and it is now the error the chat shows.
|
|
142
|
+
|
|
143
|
+
- **A diff on a phone was one changed line between screens of hatching.** The inline view hides the original side in a 35px column, and the diff viewer forced word wrap on it there too, so every original line was many rows tall and the visible side was padded to match. It now stays unwrapped in that mode, as Monaco keeps it itself; the Source Control diff tab had the same problem.
|
|
144
|
+
|
|
145
|
+
- **Closing or switching a diff no longer throws "TextModel got disposed before DiffEditorWidget model got reset".** `@monaco-editor/react` disposes the two models before the diff editor still showing them; the viewer now detaches them first.
|
|
146
|
+
|
|
147
|
+
- **A terminal could die with "double free or corruption" the first time you typed in it.** Some terminals are mounted but not on screen: the dock's active tab while the dock is hidden, and on a phone every dock terminal, because the dock is always restored collapsed there. Such a terminal was fitted to xterm's smallest size, 2 columns by 1 row, and that size went to the shell. zsh with a themed prompt corrupts its own memory redrawing that narrow. It then aborted on the first keystroke after the terminal was shown, which could be an hour later and at an ordinary size, so the crash pointed nowhere near its cause. Replaying the sequence against zsh with an oh-my-zsh + oh-my-posh config, 20 of 20 shells left at 2x1 died on that keystroke and none of the shells left at 80x24 did. A terminal is now never fitted below 20x2. The server also drops a smaller size, which covers a browser still running an older bundle. In Chrome against a scratch server, a terminal in a hidden dock gave its shell 2x1 before the fix and 80x24 after, then 140x11 once the dock was opened.
|
|
148
|
+
|
|
149
|
+
- **The language server's quick fixes never appeared for an error.** The code-action request handed the server an empty list of diagnostics, and typescript-language-server finds its fixes from that list, so with LSP on an error had no Change spelling, no Add import, nothing. Measured against the real server, the same request offered no quick fix with the list empty, and Change spelling to 'answer' plus Remove unused declaration with the two diagnostics it had published. The request now carries the diagnostics touching the range, exactly as the server sent them.
|
|
150
|
+
|
|
151
|
+
- **The lightbulb menu cut off its longest action** ("Move to a new…"). Monaco sizes that menu to its widest row and expects its 4px padding outside that width; Tailwind's global `box-sizing: border-box` put the padding inside, so every menu was 8px too narrow.
|
|
152
|
+
|
|
153
|
+
- **New File and New Folder from a right-click menu did nothing.** In the project explorer the name box appeared and was gone about 10 ms later, so the toolbar button was the only way to create a file. Radix hands focus back to whatever held it before the menu opened — the right-clicked row — a moment after the menu closes, and does it unconditionally; the box had already taken focus, reads a blur as "done", and done with nothing typed means cancel. Rename escaped only because its box replaces the very row focus would have gone back to. The explorer window lost the same race another way: its name field focused while the menu's focus trap was still up, so it sat there unfocused and whatever was typed next went to the list behind it. A context menu now leaves focus where the chosen item put it (and still returns it to the row when the item moved it nowhere), and the window's field takes focus again once the menu has closed. In Chrome against a scratch server the box survived 0 of 5 attempts before and 5 of 5 after.
|
|
154
|
+
|
|
155
|
+
- **The video player's seek bar came and went between two opens of the same file.** A video already in the media cache fires its load events before React has put the element in the page, and React drops them, so the player never learned the duration. It now reads that state from the element whenever the source changes.
|
|
156
|
+
|
|
157
|
+
- **Dragging the video player's seek bar showed no frame until the release, and then the thumb jumped back.** A drag now seeks as it goes and holds a playing video still until the release (a transcoded stream still waits for the release, since each seek there is a new ffmpeg job), and the thumb stays where it was let go. The spinner fades in after 300 ms instead of flashing over every quick seek.
|
|
158
|
+
|
|
159
|
+
- **On a phone, a long press that opens a menu no longer closes it when the finger lifts.** The menu opens after 400 ms, but the browser still treats a touch shorter than its own long-press delay as a tap: 500 ms by default on a phone, up to 1.5 s with a longer "Touch & hold delay". That tap landed on the menu's backdrop and closed it. This applied to every long-press menu in the app.
|
|
160
|
+
|
|
161
|
+
- **On a phone, three controls outside the database screens are now 44 px touch targets:** the drawer's close button (which also had no accessible name), the version line at the foot of the drawer, and a toast's close button. Each was 17 to 32 px; the two close buttons look as they did.
|
|
162
|
+
|
|
163
|
+
- **Pull failed whenever the branch had diverged from its remote.** git 2.33 and later refuse a plain `git pull` then ("Need to specify how to reconcile divergent branches") unless the repository says how to combine the two. PPM now merges, as GitHub Desktop does, when the repository sets none of `pull.rebase`, `pull.ff` or `branch.<name>.rebase`, and leaves it to git when it sets one.
|
|
164
|
+
|
|
165
|
+
- **Popping or applying a stash from the Git Graph brought staged changes back unstaged.** It now restores the index too; when the staged part no longer fits, the changes come back unstaged and a toast says so.
|
|
166
|
+
|
|
167
|
+
- **The conflict editor never showed the file.** It measured the space for the editor while its loading spinner was still up, found none, and never measured again.
|
|
168
|
+
|
|
169
|
+
- **The Git Graph lost your place every 5 seconds.** Its refresh cleared the selected commit and the search results, and Refresh or loading more commits dropped the branch filter.
|
|
170
|
+
|
|
171
|
+
- **The Git Graph drew `origin/HEAD` as a label of its own, and listed a branch called "origin".** git 2.48 and later create that pointer on every fetch; it is the remote's default branch, not a branch.
|
|
172
|
+
|
|
173
|
+
- **The file tree's git colours stood still while Source Control was open.**
|
|
174
|
+
|
|
175
|
+
- **On a phone, a long-press menu's sheet could be scrolled sideways by 4 px.**
|
|
176
|
+
|
|
177
|
+
- **An extension panel such as the Git Graph came back in the old theme after its tab moved.** Change the theme, then split the panel, drag its tab elsewhere, or cross between the desktop and phone layouts, and the panel reloaded in the theme it had opened with and kept it until the next theme change. A panel is now told the current theme each time it loads; in Chrome the right theme was in place before the panel's first paint.
|
|
178
|
+
|
|
179
|
+
- **A Claude chat could be resumed as Codex, answer "transcript was not found" and drop the message.** A session row written while marking a chat unread or claiming an account carried no provider, so every reader fell back to the install's default — which on a Codex-default install was the wrong one. The provider is recorded now.
|
|
180
|
+
|
|
181
|
+
- **A long chat stopped loading its history and kept the server busy parsing.** Each state update asked the tab to refetch, and the refetch cancelled the one already on its way; on a transcript big enough that an answer takes longer than the gap between asks, none ever finished. Measured on an 85 MB transcript, it took 110 seconds a round and 368 requests piled up.
|
|
182
|
+
|
|
183
|
+
- **Scrolling up in a long chat could drop the page just loaded, and lose an edit's place.** A refetch that answered after an older page had landed replaced the window with its own stale slice.
|
|
184
|
+
|
|
185
|
+
- **Two Windows Store apps shared one row in the System Monitor**, because every Store app window is framed by one shared host process. End on either row killed both, and each counted the other's CPU and memory. Each app is its own row now, and a process is counted under one app only.
|
|
186
|
+
|
|
187
|
+
- **A Windows service could be stopped through the API without the guard that protects critical services.** The guard and the no-op shortcuts read the last listing, which is empty until the page has been opened once and stale after any change — so a direct request could stop RPC or Audio, and a stop followed by a start answered "already running" without starting it.
|
|
188
|
+
|
|
3
189
|
## [0.23.12] - 2026-10-02
|
|
4
190
|
|
|
5
191
|
### Added
|
package/CLAUDE.md
CHANGED
|
@@ -60,6 +60,7 @@ Exceptions (intentionally use real `homedir()`):
|
|
|
60
60
|
- `fs-browse.service.ts`, `git-dirs.service.ts` — file browser starting from real home
|
|
61
61
|
- `ppmbot/` — bot files in real home
|
|
62
62
|
- `slash-discovery/` — discovers skills from real home
|
|
63
|
+
- `design/design-skill-install.service.ts` — installs the suggested design skill where Claude (`$CLAUDE_CONFIG_DIR/skills`, else `~/.claude/skills`) and Codex (`~/.agents/skills`) read user skills
|
|
63
64
|
- `named-tunnel/cloudflared-cert.ts` — `~/.cloudflared` is where `cloudflared` itself writes `cert.pem`, not PPM's directory
|
|
64
65
|
- `fs-credential-path-guard.ts` — refuses `~/.cloudflared` (alongside the PPM dir) on every fs read/write/transfer door
|
|
65
66
|
- `db-backup/db-backup-paths.ts` — snapshots live in `~/.ppm-backups` *outside* the PPM dir on purpose, so they survive a wipe of it (under an isolated `PPM_HOME` they go back inside that temp dir)
|
|
@@ -90,11 +91,11 @@ Related: `configService.save()`/`set()` throw when `load()` has not run, because
|
|
|
90
91
|
- **A signed-out Codex account fails slowly, and its retry notices are not errors**: a revoked or expired ChatGPT login does not fail `initialize` or `thread/start` — codex opens the turn, then sends `error` notifications with **`willRetry: true`** ("Reconnecting... N/5", ten of them over ~24s) before a final `willRetry: false`. The cause is only in `error.additionalDetails` (`workspace routing discovery unauthorized (401)`), never the headline. Mapping every `error` to a fatal event made the proxy give up at the first reconnect, and a retrying client then kept a dozen app-servers starting at once until the server stopped answering its health check. `codex-event-mapper.ts` turns retry notices into `status_update`; `codex-auth-failure.ts` recognises the 401 on the first one; `codex-account-auth-state.ts` benches the account (hard exclusion, unlike a quota park) so the turn rotates or fails in milliseconds; and `proxy-agent-turn.ts` caps concurrent proxy turns with a 429. Selection also has to ignore the usage figure for such an account: the usage endpoint keeps serving its last good reading, which made a dead account look emptier than a working one.
|
|
91
92
|
- **Nested subagents are never streamed**: the SDK stamps `parent_tool_use_id` only on agents the session itself spawned. An agent that spawns another agent (a reviewer running `Skill code-review`, a planner calling researchers) produces **zero** stream events for that grandchild, so the Agent card would freeze on the forking step for minutes. Its transcript still lands in `<session>/subagents/agent-<id>.jsonl`, with a meta carrying only `parentAgentId` (raw id, no `agent-` prefix) and no `toolUseId`. `src/services/nested-subagent-spy.ts` tails those during the turn and `subagent-transcript-merger.ts` folds them in flat, time-ordered, on reload — both via `groupSubagentsByCard`, which walks the `parentAgentId` chain to the root card.
|
|
92
93
|
- **A codex subagent is a session file of its own**: codex writes every spawned agent as a full rollout in the same `$CODEX_HOME/sessions` tree, with the same `cwd` as the conversation that spawned it — so a cwd filter alone lists each spawn as a top-level session that opens mid-stream, because a subagent's task is handed over as encrypted scaffolding and never appears as a `UserMessage` in its own transcript. `session_meta.parent_thread_id` is what tells the two apart. The parent names each spawn twice (`SubAgentActivity` `started`/`completed`) under **different item ids** but one `agent_thread_id`, which is why `codex-subagent-thread.ts` keys the card on the thread; `codex-history.ts` then reads the child rollout and hangs it under that Agent card.
|
|
93
|
-
- **Agent teams are implicit and mostly not in `~/.claude/teams/`**: there is no `TeamCreate` tool any more. A team appears as `~/.claude/teams/<sessionId>/inboxes/*.json` with **no `config.json`**, so anything that requires a config sees no team at all. The inboxes only hold what was sent *to* each handle — in practice just the lead's task assignments — so they can neither say who is working nor show a teammate's replies. Both live in the agent transcripts under `~/.claude/projects/<slug>/<sessionId>/subagents/`: `agent-<id>.meta.json` maps the teammate `name` to its transcript, a transcript being appended to means that teammate is running, and its replies are `SendMessage` tool calls inside it. See `src/services/team-member-activity/`. A single teammate transcript reaches several MB, so the member window follows one by byte offset (`?sinceBytes=` on the transcript route, `member-transcript-tail.ts`) instead of re-reading it — an idle poll then costs nothing.
|
|
94
|
+
- **Agent teams are implicit and mostly not in `~/.claude/teams/`**: there is no `TeamCreate` tool any more. A team appears as `~/.claude/teams/<sessionId>/inboxes/*.json` with **no `config.json`**, so anything that requires a config sees no team at all. The inboxes only hold what was sent *to* each handle — in practice just the lead's task assignments — so they can neither say who is working nor show a teammate's replies. Both live in the agent transcripts under `~/.claude/projects/<slug>/<sessionId>/subagents/`: `agent-<id>.meta.json` maps the teammate `name` to its transcript, a transcript being appended to means that teammate is running, and its replies are `SendMessage` tool calls inside it. See `src/services/team-member-activity/`. A single teammate transcript reaches several MB, so the member window follows one by byte offset (`?sinceBytes=` on the transcript route, `member-transcript-tail.ts`) instead of re-reading it — an idle poll then costs nothing. A named agent's meta carries the spawning call's `toolUseId` as well as its `name`, so it is an Agent card *and* a teammate: indexing by card and by name lists it twice, which is how the running-agents bar showed every agent of a fan-out session two times. `agent-transcript-activity.ts` lists a teammate only when no card covers its transcript.
|
|
94
95
|
|
|
95
96
|
- **An extension panel only gets a tab if a browser tab asked for it**: `use-extension-ws.ts` creates a tab for `webview:create` only when `locallyDispatchedViews` holds a matching entry, i.e. when *this* client dispatched the command. A panel the extension opens on its own initiative exists server-side with no tab to show it. To open one panel from another, call `window.openTab("extension", …, { viewType })` instead — `extension-webview.tsx` then sees a tab with no panel and dispatches the command itself, which *is* a local dispatch. The recovery dispatch forwards only the project path, so any other argument has to be stashed for the target panel to pick up (`packages/ext-git-graph/src/panel-nav.ts`). The command id and the viewType must also be identical: both are turned into a tab slug by stripping a trailing `.view`, and a mismatch silently yields no tab.
|
|
96
97
|
- **Extensions may only spawn `git`, `node`, `bun`, `npx`, `sqlite3`** (`ALLOWED_SPAWN_COMMANDS` in `extension-rpc-handlers.ts`) and the call *throws* for anything else. Reaching for `test`, `cat` or any other coreutil looks fine in review and fails only at runtime — where a surrounding `catch` can turn it into silently missing data rather than an error. `env` is merged over `process.env` (so `PATH` survives) except for `BLOCKED_ENV_KEYS`; `GIT_SEQUENCE_EDITOR` and `GIT_EDITOR` are not blocked, which is what makes a non-interactive `git rebase -i` possible.
|
|
97
|
-
- **A webview inherits nothing from the app, including which theme is on**: the iframe is `sandbox="allow-scripts"` with its own document, so none of the CSS vars `apply-theme.ts` writes to `<html>` reach it and there is no `.dark` class to read. The only question the panel can ask by itself is `prefers-color-scheme` — the *OS* setting — which is why every extension panel rendered dark inside a light app on a dark desktop. `webview-theme.ts` stamps `data-ppm-theme` on the panel's own `<html>` and appends the app's tokens as a `:root[data-ppm-theme]` block, and the panels' dark rules are written as `:root[data-ppm-theme="dark"]` plus `@media (prefers-color-scheme: dark) { :root:not([data-ppm-theme="light"]) }` — a bare `:root` inside that media query is the bug, because it cannot lose to an explicit light. Three things are load-bearing: the injected block is *appended last* and ties on specificity, so a panel rule more specific than one attribute silently wins over the app's colours; the seed goes into `srcDoc` (later changes are `postMessage`d, because rewriting `srcDoc` reloads the panel and a graph would refetch every commit); and `--surface-hover` is derived from `--text` rather than injected, because some app themes give `--panel` and `--panel-2` the same value and a hover mapped from either would be invisible in exactly those themes.
|
|
98
|
+
- **A webview inherits nothing from the app, including which theme is on**: the iframe is `sandbox="allow-scripts"` with its own document, so none of the CSS vars `apply-theme.ts` writes to `<html>` reach it and there is no `.dark` class to read. The only question the panel can ask by itself is `prefers-color-scheme` — the *OS* setting — which is why every extension panel rendered dark inside a light app on a dark desktop. `webview-theme.ts` stamps `data-ppm-theme` on the panel's own `<html>` and appends the app's tokens as a `:root[data-ppm-theme]` block, and the panels' dark rules are written as `:root[data-ppm-theme="dark"]` plus `@media (prefers-color-scheme: dark) { :root:not([data-ppm-theme="light"]) }` — a bare `:root` inside that media query is the bug, because it cannot lose to an explicit light. Three things are load-bearing: the injected block is *appended last* and ties on specificity, so a panel rule more specific than one attribute silently wins over the app's colours; the seed goes into `srcDoc` (later changes are `postMessage`d, because rewriting `srcDoc` reloads the panel and a graph would refetch every commit — and the theme is posted again on every iframe `load`, because the tab pool moves a tab with `appendChild` and a moved iframe reloads from that same `srcDoc`, whose seed is the theme of the moment the HTML arrived); and `--surface-hover` is derived from `--text` rather than injected, because some app themes give `--panel` and `--panel-2` the same value and a hover mapped from either would be invisible in exactly those themes.
|
|
98
99
|
- **A webview panel has no `prompt`/`confirm`/`alert`**: `extension-webview.tsx` mounts the iframe with `sandbox="allow-scripts"` and nothing else, and a sandboxed `prompt()` returns `null` silently — no exception, no console warning. Any answer a panel needs has to be collected by markup it renders itself (`confirmHtml` in `reflog-view.ts`). The same string is a TypeScript template literal, so a backtick anywhere inside it — a `` `code span` `` in a comment is the usual one — ends the literal early and reports as a syntax error at some unrelated token far below.
|
|
99
100
|
- **A Monaco model in PPM is not named after its file**: the editor mounts `<Editor value=... />` with no `path`, so Monaco names models `inmemory://model/N`. A language server has never heard of that, and the `file:` URIs it answers with match no model — so an unrewritten request makes the server answer about a document it was never given, and an unrewritten response makes Monaco treat the open file as a different one (go-to-definition inside the current file tries to *open* it, and diagnostics attach to nothing and never appear). `src/server/ws/lsp.ts` rewrites both directions, including URIs used as object *keys* in a workspace edit's `changes`.
|
|
100
101
|
- **Standalone Monaco's F12 into another file hijacks the current editor**: its default editor service, once a model exists for the target, swaps that model into the editor you are in. The tab keeps its old title and its old dirty state while showing another file's contents. `lsp-navigation.ts` replaces the binding and opens a real tab instead. Peek and find-references are left on Monaco's bindings — they render in place and never navigate — but they need a model to exist for the target, which is what the shadow models in `lsp-shadow-models.ts` are for; there is no public way to give standalone Monaco a model *resolver*, so providers create the models before returning locations.
|
|
@@ -102,11 +103,12 @@ Related: `configService.save()`/`set()` throw when `load()` has not run, because
|
|
|
102
103
|
- **`typescript-language-server` needs TypeScript 5.x**: the 7.x line is the native port and ships no `tsserver.js`, so the server exits at `initialize` with "provides no tsserver". It reads like a broken install rather than the wrong major version, so the registry's install hint pins `typescript@5`.
|
|
103
104
|
- **A compiled PPM reaches none of its own `node_modules`, and is not bun**: `bundledServerEntry` resolves the TypeScript server it ships through `createRequire(import.meta.url)`, which in a compiled binary is `file:///$bunfs/root/…` — so resolution falls back to the process's **cwd**, and the systemd unit's cwd is `~/.ppm`. Measured: started from inside the checkout it answers the real path, started anywhere else `null`, i.e. "TypeScript is not installed" on every release binary and on the unit, for a server the repository does depend on. The second half is the same trap as `<ppm> x @openai/codex app-server`: `process.execPath` is bun only from source, so spawning `[process.execPath, entry]` runs *PPM's CLI* with a script path. Anything that runs a JS entry has to go through `resolveBunPath()` (`bunRuntime()` in `lsp-manager.ts`), and `installLanguageServer` needs it too — which is why a host with no bun at all is reported as not-installed rather than started and left to fail at spawn.
|
|
104
105
|
- **`bun add` in a directory with no `package.json` installs into the parent**: it does not create a manifest where it was asked to. Measured — in `<dir>/sub` with a manifest at `<dir>`, the package landed in `<dir>/node_modules` and `sub` stayed empty. Anything installing into a PPM-owned directory (`lsp-install.ts`, `extension-installer.ts`) must write that directory's own `package.json` first, or the packages appear somewhere above the PPM dir and every later lookup answers "not installed".
|
|
105
|
-
- **A `~/.cargo/bin` proxy exists whether or not the component does, and `Bun.which` cannot see a `PATH` you just set**: `~/.cargo/bin/rust-analyzer` is a symlink to rustup, present on any rustup install — measured on a host where `rustup which rust-analyzer` answered `unknown binary`, the symlink was right there. Found on `PATH` it reports an installed server that prints that error and exits at spawn, i.e. a *broken* server instead of the missing one the Install button is offered for, so `lsp-manager.ts` asks `rustupServerPath` **before** `Bun.which` and takes rustup's 3 ms answer as both the lookup and the installed-check. The same call is the reason a test cannot fake a missing toolchain: `Bun.which` reads the `PATH` the **process started with** and ignores every later write to `process.env.PATH` (so does `Bun.spawn`'s own resolution) — only the explicit `Bun.which(cmd, { PATH })` option is live, which is what `installToolPath` passes.
|
|
106
|
+
- **A `~/.cargo/bin` proxy exists whether or not the component does, and `Bun.which` cannot see a `PATH` you just set**: `~/.cargo/bin/rust-analyzer` is a symlink to rustup, present on any rustup install — measured on a host where `rustup which rust-analyzer` answered `unknown binary`, the symlink was right there. Found on `PATH` it reports an installed server that prints that error and exits at spawn, i.e. a *broken* server instead of the missing one the Install button is offered for, so `lsp-manager.ts` asks `rustupServerPath` **before** `Bun.which` and takes rustup's 3 ms answer as both the lookup and the installed-check. The same call is the reason a test cannot fake a missing toolchain: `Bun.which` reads the `PATH` the **process started with** and ignores every later write to `process.env.PATH` (so does `Bun.spawn`'s own resolution) — only the explicit `Bun.which(cmd, { PATH })` option is live, which is what `installToolPath` passes. A child gets the same snapshot: `Bun.spawn` without `env:` passes the environment the process *started* with, so a variable written to `process.env` afterwards (a `beforeEach` setting one, say) never reaches it, under `bun test` too. Pass `env: process.env` or an argument; `tests/fixtures/fake-tailscale.ts` takes its state file as an argument for that reason.
|
|
106
107
|
- **Standalone Monaco can never turn semantic highlighting on from a theme**: `StandaloneTheme` hardcodes `semanticHighlighting = false` and never reads it from the `defineTheme` data (`IStandaloneThemeData` has no such field), while the `semanticHighlighting.enabled` option defaults to `'configuredByTheme'` — so tokens are fetched, decoded, and change nothing. The only switch is the editor option set to `true` (`code-editor.tsx`). Colours then resolve through the *same* rule trie as TextMate scopes: `getTokenStyleMetadata` joins the type and its modifiers with dots (`variable.readonly.local`) and `ThemeTrieElement.match` falls back segment by segment, so a type with no rule lands on the theme's default foreground — i.e. plain text where the regex tokenizer had colour. `src/web/theme/semantic-token-rules.ts` is that table, and it must cover names outside the specification: `typescript-language-server` sends **`member`** for methods, one of the most common tokens in a TS file.
|
|
107
108
|
- **Monaco's bundled TypeScript service is off entirely, and `setDiagnosticsOptions` is not what does it**: that call silences the validator but leaves all **thirteen** providers in `modeConfigurationDefault` registered, so every `.ts` file had two completion lists and two hovers — the second from a worker that sees one file with no `tsconfig.json` and no `node_modules`. It also cost a *visible* stall: answering a hover at all means fetching `ts.worker.bundle.js` (**13 MB**, the whole TypeScript compiler), and Monaco's hover widget merges every provider and shows "Loading…" until the last one replies — so the real server's answer rendered in milliseconds and then sat behind a spinner. `setModeConfiguration` is the call that unregisters them (`monaco-builtin-typescript.ts`, asserted against Monaco's own default list so an upgrade adding a provider fails a test). Consequence, accepted: a buffer the LSP cannot serve — untitled, external, inline — falls back to word-based suggestions only.
|
|
108
109
|
- **A button in a Monaco hover is a `command:` link in *trusted* markdown, and trust is all-or-nothing unless you narrow it**: a hover can only contain markdown, so the blame hover's actions are `[label](command:id?args)` links reaching ids registered with `monaco.editor.registerCommand`. The renderer *strips* those links unless the `IMarkdownString` is trusted — and `isTrusted: true` allows **every** command on the page's global registry. That hover embeds a commit message, so anyone who can land a commit could write `[click](command:...)` in one and have it render as a working button. Both defences are needed and both are in `blame-hover.ts`: `isTrusted: { enabledCommands: [...] }` (an array is honoured by `toAllowCommandsOption`), and escaping the message so it cannot form a link at all. `supportHtml` stays **off** — the avatar is ``, which renders inline at its intrinsic size, so no HTML has to be allowed for it. Escape `<` and `>` too: with `supportHtml` off the renderer does not leave an unknown tag alone, it drops the tag and keeps the text, so a message mentioning a literal `<script>alert(1)</script>` displayed as `alert(1)` — the message silently rewritten in the one view meant to show it verbatim.
|
|
109
110
|
- **Hovering injected text does reach the decoration under it, and Monaco has no `diff` language**: an `after` injected-text annotation sits past the line's last column, and `ContentHoverComputer._getLineDecorations` relaxes its column check by one character *only* for `showIfCollapsed` decorations — which is what makes the blame hover work at all, and why that flag is load-bearing rather than cosmetic. `editor.action.showHover` opens the same hover from the cursor, which is the touch path (gated on `hover: none`, not on a width breakpoint; the mouse target's `injectedText` would identify the tap exactly but is not in Monaco's public typings, so the handler goes by column). Separately: Monaco's 91 basic languages include no `diff` — VS Code's comes from a bundled extension — so a fenced diff block runs the tokenizer and comes back entirely `mtk1`, the theme's default foreground. `monaco-diff-language.ts` registers one and `theme/diff-token-rules.ts` colours it; a Monarch rule whose token name has no theme rule is the same silent no-op as an unmapped semantic token, and a test pairs the two so neither can be added without the other.
|
|
111
|
+
- **Monaco hit-tests the gutter by x, and sizes its glyph margin in lanes**: standalone Monaco ships `glyphMargin` off (`editor.api2.js`), and the code-action lightbulb Monaco puts there when its line has no room is then drawn nowhere. Turned on, the margin is one line height per glyph *lane* in use, so the bulb fills a single 19px lane flush against the editor's edge. Moving it right with CSS looks correct and is a bug: `_hitTestMargin` tells glyph margin from line numbers by the x coordinate alone, so a bulb drawn over the line-number column still opens its menu and the same mousedown selects that whole line, replacing the selection the menu was opened for (measured: `[1,7 -> 2,8]` became `[1,1 -> 2,1]`). `monaco-lightbulb-gutter.ts` widens the margin instead, with two empty glyph-margin widgets. Three traps, all silent. Monaco draws one glyph per (line, lane), highest zIndex first and widgets winning ties, so at zIndex 0 the left widget hid the bulb on line 1. A `persistLane` *decoration* would hold the lanes as well, but any glyph decoration on the bulb's line makes the lightbulb give up the gutter and draw itself over the text. And the width follows the line that uses the most lanes, so both are held on the same line — one lane held on its own widens nothing. Separately, Tailwind's preflight `* { box-sizing: border-box }` makes Monaco's `.action-widget` 8px narrower than the row it measured, which cut the longest code action off with an ellipsis.
|
|
110
112
|
- **The service worker's precache can silently undo any download saving, and both compressions are needed**: `injectManifest` defaults to precaching *everything* in the build output, so the first visit fetched 488 files / 33.3 MB — including the 12.7 MB TypeScript worker that `monaco-builtin-typescript.ts` had just made unnecessary to ever load. A saving measured in the network tab of a warm page is not a saving; measure `precache N entries (X KiB)` in the build output too. `globPatterns` now lists only the boot shell (9 entries / 1.08 MB) with everything else on a runtime `CacheFirst`. Separately, `scripts/precompress-web.ts` writes **both** `.br` and `.gz` siblings and `static-encoding.ts` picks one: brotli alone is not enough, because browsers advertise `br` only on a **secure origin** and PPM is routinely reached over plain HTTP on a LAN. And Monaco is staged locally by `scripts/copy-monaco.ts` with `loader.config({ paths: { vs: "/assets/monaco/vs" } })` — the default is jsdelivr, which means no editor offline and a third party told which files are opened. `vite build` empties `dist/web`, so `copy-monaco` and `precompress-web` must run *after* `build:web` (running `build:web` alone leaves an installed PPM with no Monaco at all).
|
|
111
113
|
- **`FileSink.write()` consumes the whole chunk and returns a number that is not how much of it went in**: the careful-looking `while (off < buf.length) { off += await sink.write(buf.subarray(off)) }` is therefore a loop that re-sends the tail. Measured against `cat`, one 4,924,800-byte frame produced eleven `write()` calls each answering **475072** while everything had already been buffered, and the child received **28,043,840 bytes — 5.7x the frame**. Downstream the damage is silent and total: ffmpeg's rawvideo input is offset for good, so the *first* picture decodes perfectly and every one after it is drawn rolled, with no error from ffmpeg, from the sink, or from the encoder wrapper. One `write()` then `await flush()` is the whole correct form (`writeFrameToSink` in `android-video.ts`). Two things generalise. A frame **counter** cannot see this — every counter in the pipeline reported the right number while 5.7x the bytes left the process — so the test has to measure the bytes a real child receives (`tests/unit/android/android-video-frame-write.test.ts`), and it needs a chunk big enough that the sink buffers in pieces or the bug does not reproduce at all. And a capture that decodes correctly proves nothing if it holds one access unit: the first frame is always right.
|
|
112
114
|
- **A lazy chunk boundary is one static import away from not existing, and it is invisible**: `code-editor.tsx` reaches the language service only through `lazy(() => import("./editor-language-service"))`, which is what keeps the LSP client out of the editor's chunk and — the part that actually costs something — keeps the code that asks the host for a server unreachable until the setting is on. One `import { anything } from "@/hooks/use-lsp"` anywhere on that static path merges the chunk back in and nothing about the UI looks different, so `tests/unit/web/editor-lsp-lazy-boundary.test.ts` enumerates the offenders instead. Importing even a *constant* from the lazy module counts; `import type` does not. Related: `lspEnabled` and `mobileWordWrap` are written with `persistDevicePref` (localStorage only) rather than `persistUiPref`, because the server round-trip that makes prefs survive an origin change also means the last device to write wins everywhere — and a desktop must not start an 854 MB server process for a phone.
|
|
@@ -149,6 +151,8 @@ Related: `configService.save()`/`set()` throw when `load()` has not run, because
|
|
|
149
151
|
|
|
150
152
|
- **An ANSI palette's neutral ends sit on top of the background, and the fix is not in the palette**: two of the sixteen slots are *defined* to be extremes, so a light theme's `white`/`brightWhite` and a dark theme's `black` land on the background — 1.03–1.18:1 across PPM's six built-in themes, i.e. invisible rather than merely dim. It is not a theoretical slot either: oh-my-posh writes its second prompt line in plain **SGR 37**, correct on the dark terminal it was designed for, and that line was absent on every light theme. Recolouring the slot cannot fix it, because the same `white` is also the text *on* a coloured powerline segment where white is right — only a per-cell decision can tell the two uses apart. `minimumContrastRatio` is xterm's, it defaults to **1 (do nothing)**, and VS Code ships 4.5; it adjusts the foreground against each cell's real background, so segments render byte-identically and only text on the bare background moves. Set it as a *terminal* option, not via a renderer: the WebGL addon is skipped on touch devices, which is where this was reported from. Two traps when measuring a prompt: parse `38;5;`/`37`/`97` as well as `38;2;` truecolor, or plain-ANSI runs read as "no colour set" and the real culprit is invisible to the tooling too — and a `%{`…`%}`-quoted zsh prompt has to have those markers stripped before it is written to a terminal, since the shell normally eats them. `tests/unit/web/terminal-contrast.test.ts` pins the hazard and the mitigation together.
|
|
151
153
|
|
|
154
|
+
- **xterm stays silent about a selection it already reported, even after clearing it**: `onSelectionChange` fires from `_fireEventIfSelectionChanged`, which compares against the last selection it *reported* — and `clearSelection()` fires the event without resetting that record. xterm itself clears on resize, on a buffer switch and whenever the user types with something selected, so selecting the same text again afterwards reports nothing, and anything driven by the event alone (the terminal's Add to chat bar) silently does not appear. Found by an e2e that selected the same rows twice; `terminal-selection-chat.tsx` also reads the selection on the mouseup that ends a press in the terminal. Related: `getSelectionPosition()` is typed as 1-based and returns 0-based columns and buffer rows, end column exclusive.
|
|
155
|
+
|
|
152
156
|
- **An overlay on a vendored glyph assumes that glyph is empty, and an icon set migration silently breaks that**: the streaming chat tab draws three bouncing dots absolutely positioned over its 16px bubble icon, which was correct against lucide's hollow `MessageSquare`. Fluent's `chat` is the same bubble with **two message lines drawn inside it**, so after the migration the dots landed on the upper line in the same `currentColor` and the three fused into one lumpy bar — a static-looking smudge at the size a tab renders, reported as a broken animation rather than a wrong glyph, because the dots really were still bouncing. The fix is `chat-empty` (exported as `MessageCircle`), whose two subpaths are byte-identical to `chat`'s first two: same outline, nothing in it. Two things generalise. A glyph's *subpath count* is the cheap test for "does this draw anything inside itself" — `tests/unit/web/tab-streaming-indicator.test.ts` asserts the host glyph contributes exactly the outer edge and its hole, so a MAP edit or a regeneration cannot put a lined glyph back under the dots; and freezing a CSS animation with `animation-play-state: paused` plus a *negative* `animation-delay` renders any phase of its cycle, which is how a bounce this small is compared before and after at all. Note also that `isStreaming` is safe to branch an icon on only because both call sites read `sessionId` exclusively for `type === "chat"`.
|
|
153
157
|
|
|
154
158
|
- **A Monarch `/$/` rule never runs, so a line-oriented grammar may not use states at all**: Monarch's per-line loop ends the moment the position reaches the end of the line, which means the idiomatic-looking `[/$/, { token: "", next: "@popall" }]` is dead code — the state entered mid-line is *never* left, and it carries into every following line. The `dotenv` grammar (`src/web/lib/monaco-dotenv-language.ts`, since Monaco ships no `.env` language and neither does VS Code) first used a `@value` state entered on `=`; from the first assignment on, the whole file tokenized as a value, so `#KEY=off` came back `string` — the one case the language existed for, still broken while every line *looked* coloured. Everything has to happen in `root`, the way Monaco's own `ini` does, and the test forbids a `next:` outright. Two consequences of statelessness worth knowing: a quoted value must be matched **whole** (`/"(?:[^"\\]|\\.)*"/`), which is the only way a `#` inside it is not read as a comment — at the cost of not colouring an interpolation inside quotes; and an unterminated quote falls through to the bare-value rule instead of swallowing the rest of the file. Separately, this grammar needs **no** `*-token-rules.ts` beside `diff-token-rules.ts`: its token names are Monaco's own (`comment`, `key`, `string`, `variable`, `keyword`, `delimiter`) and `monaco-adapter.ts` defines every PPM theme with `inherit: true`, so the colours arrive from the `vs`/`vs-dark` base and cannot drift from the app's themes — the test reads that pairing out of Monaco's own theme table rather than trusting it. Last trap, when verifying any of this in a browser: a standalone Monaco has **one global theme**, so two editors cannot show two themes at once (the second `create` silently retints the first), and sampling colours right after `setTheme` reads the *old* `mtk` class indices against the new palette — `string` measured as `#FF0000`. One editor, one reload per theme. Do not be misled by a `dotenv-*.js` chunk in the build output: that is shiki's TextMate grammar for a fenced `dotenv` block in markdown (`@shikijs/langs`, reached from `markdown-code-block.tsx`), a separate pipeline Monaco cannot read — there is no TextMate bridge in the editor, which is why a Monarch grammar had to be written even though the repository already ships a dotenv grammar.
|
|
@@ -188,6 +192,8 @@ Related: `configService.save()`/`set()` throw when `load()` has not run, because
|
|
|
188
192
|
- **Design exports are octet-stream Blobs, and the view tabs are real links**: a `blob:` URL has PPM's origin, and a browser that ignores `download` (iOS Safari) would open an HTML one and run the design beside the token in `localStorage`. Print and "Open in new tab" are `<a target=_blank rel="noopener noreferrer">` to tokens minted when the menu opens, because a `noopener` `window.open` cannot report a blocked popup. `allow-modals` is reachable only through a print-purpose token; the CDN hosts the design CSP allows (jsdelivr, unpkg) run any npm or GitHub code, which is accepted.
|
|
189
193
|
- **`tabSessionId()` is the only way to ask a tab for its session**: design tabs hold chat sessions too, so `type === "chat" && metadata.sessionId` makes a design session look unopened, and reopening it starts a plain chat outside design mode (`src/web/lib/tab-session-id.ts`).
|
|
190
194
|
- **Hono's global `cors()` overwrites the `Access-Control-Allow-Origin` a route sets**: headers set before the handler are copied over the handler's response, so `design-preview.ts` re-asserts `null` in a middleware after `next()`, and its unit test mounts `cors()` like the real server. The same re-wrap (`new Response(res.body, res)`) makes Bun lose a `BunFile.slice()` body: behind `cors()` a `rangeFileResponse` 206 for `bytes=2-5` sends `Content-Length: 8` and bytes 2 to EOF. That one is still open; route unit tests mount without `cors()`, which is why none caught it.
|
|
195
|
+
- **A gem installed into PPM's own folder cannot find itself, and a release zip needs a tool Bun does not have**: `gem install --install-dir <dir>` writes a binstub that asks RubyGems for its gem, and `<dir>` is on no gem path — measured, it exits with `Gem::GemNotFoundException` unless spawned with `GEM_PATH` naming `<dir>` (`installedServerEnv`, threaded `resolveCommand` → `LspSession.start`). Solargraph's dependencies (prism, rbs, jaro_winkler) compile C, so a host with no compiler fails with "Failed to build gem native extension" and a message that ends on a log path; `lsp-install.ts` says what is missing instead and deletes the half-install gem leaves "for inspection" (a first install only — a working one being updated keeps its folder). For downloads: `Bun.Archive` answers "Unrecognized archive format" for a zip and GNU tar cannot read one either, so a zip off Windows needs `unzip` or `bsdtar` on PATH (Windows' own `tar.exe` is bsdtar), and a host with neither has no button.
|
|
196
|
+
- **The dev bundle's terminal connects straight to `:8081`, whatever server the page came from**: `use-terminal.ts` bypasses Vite's WebSocket proxy in dev, so under the html-preview harness (random API port) every terminal sits on "Reconnecting…" — and if a dev PPM is up on 8081, an e2e's terminal opens a shell *in that instance* and types into it. Check `ss -ltn` for 8081 first; to test a live terminal, put the scratch API on 8081 itself. React's `StrictMode` also double-mounts it in dev, so each terminal spawns two shells and a handed-over command is typed into both, showing twice in one xterm — dev only; a production build mounts once.
|
|
191
197
|
- **A leading BOM makes parse5 drop the locations of `<html>`, `<head>` and `<body>`**: it is read as body text, so those explicit start tags lose `sourceCodeLocation`. Strip it first and address everything in the BOM-less text (`decodeDesignText`); parse5 offsets are UTF-16 code units of exactly the string parsed, as `String#slice` counts them, and `startTag.attrs` is keyed by the lowercased source name.
|
|
192
198
|
- **The pre-migration database snapshot is skipped whenever `CURRENT_SCHEMA_VERSION` lags the migrations**: `backupBeforeMigrations` returns early for a database already at that version, and the constant sat at 47 while migrations reached 49, so a database at 47 ran 48 and 49 with no snapshot. Bump it with every migration; `db-session-design-slug.test.ts` asserts a migrated database ends at it.
|
|
193
199
|
- **A PreToolUse hook verdict needs `hookSpecificOutput.hookEventName: "PreToolUse"`**: the bundled CLI reads `permissionDecision` only when the event name matches ("Hook returned incorrect event name" otherwise), so without it a Deny the user clicked did not block the tool. `preToolUseDecision()` in `claude-agent-sdk-query-options.ts` builds every verdict.
|
|
@@ -201,8 +207,30 @@ Related: `configService.save()`/`set()` throw when `load()` has not run, because
|
|
|
201
207
|
- **WebCodecs is secure-context only, so Remote Desktop and the Android viewer cannot show a picture on a plain-HTTP LAN address** — which is how a phone or tablet normally reaches PPM. Measured in one browser at one moment: `VideoDecoder` is `undefined` on `http://192.168.98.96:3210` and present on `http://127.0.0.1:3210`, while `RTCPeerConnection` exists on both. Nothing warns; the viewer just reports "this browser has no WebCodecs" about a browser that is fine, which is why `missingDecoderReason()` branches on `window.isSecureContext` instead. The way out is WebRTC, and in Bun that means a **downloaded binary**: there is no WebRTC stack in the runtime, GStreamer's `webrtcbin` **segfaults PyGObject** on GStreamer 1.28.7 + Python 3.14 (`gst_webrtc_session_description_copy` → `gst_sdp_message_copy` → `g_strdup` on a malformed emails array — it dies just *reading* the offer, and rebuilding the description from SDP text does not help) *and* would put GStreamer + PyGObject on every Windows and macOS host, and `@roamhq/wrtc` only accepts raw i420, i.e. it would discard the hardware H.264 encode and re-encode in software. `mediamtx-*.ts` is the answer: MediaMTX repackages the H.264 ffmpeg already produced (verified — 1920x1080 Main@4.0 in, `video/H264` at the same size out) for 0.6% of a core and 55 MB RSS. Four traps in wiring it. Its **shipped `mediamtx.yml` must never be used**: it listens on every interface with RTMP/HLS/SRT/MoQ/API/metrics/pprof on, and MoQ writes `auto.crt`/`auto.key` beside itself on first start — PPM generates its own config and every switch is spelled out, because MediaMTX *rejects unknown keys* (`json: unknown field`), so a renamed key fails loudly instead of silently leaving a listener open. The **ICE/UDP port cannot be loopback** — WebRTC media is peer-to-peer, so confining it breaks every remote viewer while the page still connects; what protects it is the per-session ICE ufrag/password, which is why a test asserts the port is *not* loopback. `filesrc` **cannot read a FIFO** (it probes for seekability and closes it, so ffmpeg takes EPIPE) — open the FIFO yourself and hand over `fdsrc fd=N`. And the relay answers **404 until the publisher's first packet**, which a quality change re-creates by respawning ffmpeg, so the browser's WHEP handshake must retry rather than fail. Peer-to-peer also means a viewer on the **Cloudflare tunnel** has no route for the media at all: the handshake is proxied over HTTPS and succeeds, then nothing arrives, and Chromium takes **15 s** (measured, no candidate reachable) to call the connection `failed`. So `use-webrtc-canvas-video.ts` gives ICE `CONNECT_DEADLINE_MS` and the connection hook reconnects asking for the WebSocket stream, remembered for the tab in `sessionStorage` — but only where WebCodecs exists: behind the tunnel's HTTPS it does in any browser that ships it, on a plain-HTTP LAN origin it never does, and there the WebRTC error stands. Last: `startCapture` keeps `stdout: "pipe"` in both modes even though nothing reads it when publishing — making it conditional widens Bun's spawn type so `proc.stdout` is possibly-undefined everywhere below, the same family as the `ReturnType<typeof Bun.spawn>` trap above.
|
|
202
208
|
- **`Bun.spawn({ stdin: other.stdout })` is not a pipe between two children**: Bun reads every byte into PPM and writes it back out with a pump of its own (measured: piping 200 MB raised the Bun process's own `rchar` and `wchar` by 200 MB each). Two failures follow, both silent until the reader dies. Under a burst, that pump rejects with `EPIPE`s nothing can catch — 2–3 per remux death with keyframe-sized writes, and `handleFatalError` in `src/server/index.ts` exits the server at 3 in a minute. And a reader that stalls before dying leaves the writer running for good, because Bun is still reading it: gst-launch kept encoding with no `onExit` and the viewer sat on a frozen picture. `remote-desktop-capture-wayland.ts` therefore pumps gst into the remux itself (one awaited `write()` + `flush()` per chunk, the same shape as the `FileSink` entry above) and watches **both** processes, the first to die taking the other down. `wayland-capture-supervision.test.ts` drives it with shell stand-ins; under `bun test` an unhandled rejection is a failed test, which is what makes the burst case assertable at all.
|
|
203
209
|
|
|
210
|
+
- **The error that ends a turn is in no transcript, so anything rebuilt from history drops it**: a Max Turns stop reaches the browser as an `error` event and a `done` with `resultSubtype: "error_max_turns"`, and Claude's JSONL ends at the turn's last tool result. A reload rebuilds the chat from that transcript, and so does the end of any turn long enough to overflow the 10,000-event reconnect buffer (thinking deltas fill it), where `replayTruncatedRef` refetches history at idle — so the one red line saying why the session stopped vanished, and the notification said "Chat completed". `turn-stop-reader.ts` reads how the last top-level turn ended back from the session trace (a cancel, a newer message or a turn still running means no stop; rows with `parentToolUseId` are a subagent's), `session_state.turnStop` carries it to every greeting, `turn_stop` goes out just before the `done`, and `useChat` keeps it apart from `messages` so a refetch cannot erase it. Several `session_state` builders (model, effort, thinking) omit the field, which is why the client only touches `turnStop` when the key is present. Verify with `node tests/e2e/turn-stop-e2e.mjs` (`PPM_PLAYWRIGHT_MODULE` if Playwright is not installed here).
|
|
204
211
|
- **`PRAGMA auto_vacuum` takes the write lock even when it changes nothing, so `busy_timeout` must be set first**: the session trace set it after `auto_vacuum`/`journal_mode` (copied from `query-audit-db.ts`, which still has that order), and a second process opening the file while another was mid-write got `SQLITE_BUSY` at once — measured: a lock held for 300 ms failed the open outright against a 2 s timeout. Only the full unit suite's server-plus-CLI race caught it. `journal_mode = WAL` on a file already in WAL does *not* wait on a writer, which is why `db.service.ts`'s order is harmless. Put `busy_timeout` first in any opener two processes share.
|
|
205
212
|
- **The Claude SDK interleaves a data-less `system/thinking_tokens` between every two thinking deltas**, so anything folding *consecutive* deltas folds nothing: the trace's coalescer turned one real turn into 92 rows, 84 of them single deltas and ticks. The provider forwards every SDK system message it does not special-case as a bare `{type, subtype}` (`claude-agent-sdk.ts`), and that shape is how to recognise a signal — `trace-coalescer.ts` counts one arriving inside a block on the block (`signals`) instead of closing it. A mock or scripted provider that never sends these hides the bug entirely, which is why the replay test's script now does.
|
|
213
|
+
- **A terminal with no layout is fitted to 2x1, and zsh does not survive 2x1**: xterm's FitAddon never proposes less than 2 columns by 1 row, which is exactly its answer for a 0x0 container. A terminal is mounted with no layout more often than it looks. The dock's active tab is mounted while the dock is hidden (`collectFromDock` marks it active either way), and a phone restores every dock collapsed (`collapseRestoredDockOnMobile`). Fitted at mount, such a terminal got 2x1, and its socket sent that size on open. zsh with a themed prompt then corrupted its own heap redrawing at 2 columns. glibc aborted it with `double free or corruption (!prev)` on the first keystroke after the terminal was shown, up to an hour later and at an ordinary size. That is why every core in `coredumpctl` read 156-269 columns and none pointed at a resize. Replayed against zsh with an oh-my-zsh + oh-my-posh config: left at 2x1 or 2x2, 20 of 20 shells died on that keystroke; at 3x1, 10x1, 2x20, 156x1 or 80x24, none did, and a bare zsh survived 2x1. Every `fit()` in `use-terminal.ts` now asks `proposeDimensions()` first, and `terminalService.resize` drops anything `isUsableTerminalSize` (20x2, `src/shared/terminal-size.ts`) rejects, so a browser on an older bundle cannot do it either. Two lessons for the next one. A crash that lands long after its cause needs the history of the shell's size, and the live PTYs hold it: `stty -F /dev/pts/N size` on each `zsh` under `ppm.service` found a hidden terminal still sitting at 2x1. And the ResizeObserver's own `contentRect` zero check was never enough, because its debounced fit runs 100 ms later, when the tab may already be parked. Verify with `PPM_E2E_DIST=<scratch dist> node tests/e2e/terminal-hidden-resize-e2e.mjs`, which reads the size from the shell's tty rather than from xterm.
|
|
214
|
+
- **A session's "before" for a file is PPM's to keep, because no transcript holds it**: Claude Code records a tool's `toolUseResult.originalFile` only for small files (measured: kept at 9,836 B, gone from 13.6 KB up), an Edit's `old_string` is a fragment at an unknown offset, SDK checkpointing is off, and git HEAD also holds whatever was uncommitted before the session began. So the session review reads `session-baselines/` (see Architecture), filled at PreToolUse **in every permission mode**. That last part is new: before it, a bypass-mode session — the default — installed **no PreToolUse hook at all** (the permission hook is skipped there by design), so anything added to the permission hook does not run for most sessions. `buildToolHooks` therefore gives bypass mode a file-write hook of its own (`PreToolUse[0]` there), while every other mode runs it from the permission hook once that has allowed the write — a denied write records nothing; `permissionHook()` in `claude-agent-sdk.test.ts` finds that `.*` one. Verified against the real CLI in bypass mode: the hook fires for a sub-agent's Write too. A record is hard-linked into place so the **first capture wins**; never "fix" a missing record by writing one later in the session, which would record a state the session itself produced. Shell commands are the exception that proves it: `shell-change-tracker.ts` reads a file's bytes *before* the command runs and records them only if the command moved it, and a file git did not list is HEAD — read from the **pre-command** HEAD, because `git commit` in the same command moves it (the post-command HEAD would name the new content as the "before"). Outside bypass mode that snapshot is taken by the permission hook once it has allowed the command, not by a hook of its own, so it cannot be taken while the approval prompt is still open — an edit made during that wait would otherwise be put on the command (checked with the real CLI: a file edited during a 1.5 s approval wait was not recorded).
|
|
215
|
+
- **Codex's `FileUpdateChange.diff` is a diff only for an update**: for `add` and `delete` it is the file's **raw content**, and an update may end in `\n\nMoved to: <path>`. Parsing all three as a unified diff (`diffToOldNew`) dropped every line without a `+`/`-`/space prefix, so a created file counted +0. The rollout's `item_completed` FileChange carries `changes` as a dict keyed by path, not the live array (`rolloutFileChanges` vs `fileUpdateChanges` in `codex-patch.ts`). One patch over several files is **one** Edit/Write card whose own fields describe only the first file, with `input.files` listing all of them — read `files`, or every file after the first is invisible. And the patch is on disk before PPM hears of it, so its "before" is the diff reverse-applied (`reverse-unified-diff.ts`), which refuses rather than guesses when a hunk does not match.
|
|
216
|
+
- **`@monaco-editor/react` 4.7 disposes a diff's models before the diff editor holding them**, and Monaco 0.55 reports it as an uncaught "TextModel got disposed before DiffEditorWidget model got reset" on every unmount — every closed diff tab, every file a review steps to. `DiffEditor` in `diff-viewer.tsx` is the library component's parent and detaches and disposes the models in its own cleanup, which React runs first because it runs a removed subtree's cleanups parent before child (every layout one before any passive one). The layout effect there is margin, not the fix: measured on React 19.2, a `useEffect` cleanup in the wrapper also runs before the library's passive one. `diff-viewer-dispose-order.test.ts` mounts the real viewer over the real library and goes red without the cleanup. Separately, that file's word-wrap sync forced `wordWrapOverride2` onto the original editor in **inline** mode too, where the original is a hidden 35px column: every line wrapped many rows tall and the inline view padded the visible side to match, so a phone showed one changed line between screens of hatching (`.diagonal-fill`). Monaco itself keeps that editor unwrapped when inline; only a side-by-side original wraps now.
|
|
217
|
+
- **A bounded read of a file stream has to count its own bytes and end with `cancel()`**: on Bun 1.3.11, `Bun.file(f).slice(a, b).stream()` never finishes when `b` is well short of the end of a multi-MB file — the last `read()` neither resolves nor errors (a 4MB file's `slice(0, 259)` hung; `slice(0, size - 1)` and an endless `slice(a)` did not) — so `readLines` takes `toByte` and stops at it itself. And a reader let go of before its end with `releaseLock()` keeps its file descriptor: 2000 early stops left 2000 open, `reader.cancel()` closes it. Both bite the windowed transcript reads in `compact-segment.ts`, which stop early on every scroll up by design; `compact-segment.test.ts` pins both.
|
|
218
|
+
|
|
219
|
+
- **Rebuilding a table that others reference deletes their rows unless foreign keys are off — and that pragma is ignored inside a transaction**: SQLite's recipe for changing a constraint (create the new table, copy, drop the old one, rename) is how migration 55 let `connections` accept `mysql` / `mariadb`. With `foreign_keys = ON`, `DROP TABLE connections` runs an implicit `DELETE` that cascades through `connection_table_cache`'s `ON DELETE CASCADE` and empties it before the new table exists — no error, just a cache that is gone. `PRAGMA foreign_keys = OFF` is a no-op inside a transaction, so `allowConnectionTypes` in `db.service.ts` turns it off *before* `BEGIN`, reads it back and refuses to run when a caller's transaction kept it on, and restores it afterwards. It also rebuilds from the table's own recorded SQL with only the CHECK replaced, so a column a later migration added is carried over, and keeps the `AUTOINCREMENT` high-water mark, because query-audit rows still name the ids of deleted connections.
|
|
220
|
+
- **SQLite has no `ILIKE`, and its `LIKE` ignores case for ASCII only**: a filter written with Postgres's `ILIKE` is a syntax error on SQLite. Case-insensitive matching goes through each dialect's `likeInsensitive` (`src/services/database/dialect-*.ts`): `ILIKE … ESCAPE E'\\'` on Postgres, plain `LIKE … ESCAPE '\'` on SQLite (already case-blind for ASCII; "Ä" and "ä" stay different because `bun:sqlite` loads no ICU), and `LIKE … ESCAPE CHAR(92)` under the column's own collation on MySQL, where a `_ci` collation ignores case and `LOWER(col)` would give up the index (the escape is named because a server whose `sql_mode` has `NO_BACKSLASH_ESCAPES` gives `LIKE` none, and as `CHAR(92)` because a backslash written as a string literal is spelled differently in each mode). Build filter SQL through the dialect, never by pasting an operator into a string.
|
|
221
|
+
- **A result read as objects loses the columns that share a name**: `SELECT 1 AS a, 2 AS b, 3 AS a` has three columns, but a row object holds one `a`, so a header built from `Object.keys(row)` shows two. bun:sqlite is worse than lossy: its `columnNames` is built from an object's keys too, so the repeat collapses *and moves* — `["b", "a"]` over three values, pairing every value with the wrong name. Read rows as arrays next to the driver's column metadata (postgres.js `.values()`, mysql2 `rowsAsArray: true`, bun:sqlite `.values()`), and for SQLite recover the names with `statementColumnNames` in `sqlite.service.ts`, which prepares the statement again as a subquery — never runs it — because SQLite then renames the repeats to `a:1`, `a:2`.
|
|
222
|
+
- **`git pull` refuses a diverged branch on git ≥ 2.33 unless the repository says how to reconcile**: it fails with "Need to specify how to reconcile divergent branches", so a Pull or Sync button works every time until the first time it is needed. `git-workflow.service.ts` adds `--no-rebase` (a merge, as GitHub Desktop does) only when none of `pull.rebase`, `pull.ff` and `branch.<name>.rebase` is set — passed unconditionally it would override `pull.ff = only` and merge anyway.
|
|
223
|
+
- **`git stash pop`/`apply` without `--index` puts staged changes back unstaged, silently**; with it, git refuses outright when the staged part no longer applies, and touches nothing. So `git-workflow.service.ts` tries `--index` first, falls back to a plain apply, and the UI says the changes "came back unstaged". It also checks the hash of `stash@{n}` before acting, because the list renumbers whenever anything else pushes or drops a stash.
|
|
224
|
+
- **Since git 2.48, `git fetch` creates `refs/remotes/origin/HEAD`, and `%(refname:short)` prints it as `origin`**: a ref list that does not skip symbolic refs (`%(symref)` set) grows a branch called "origin" and an extra label on the default branch's commit. The Git Graph showed both until it skipped them.
|
|
225
|
+
- **Codex renames a new chat during its first turn, so anything holding a session id across a turn has to follow it**: the tab tools' token is minted under PPM's id and handed to the Codex app-server in its environment, for the life of that process. During the first turn Codex emits `session_migrated` and `ws/chat.ts` re-keys `activeSessions` and the sockets to the thread id — so every later `open_file`/`open_preview` named an id with no sockets, and in a new Codex chat the tools answered "no device" while the chat sat open in front of the user. `tab-open-broker.ts` keys its pending calls, limits and delivery by `resolveMigratedSession(id)`. Claude keeps its id, which is why only Codex showed it.
|
|
226
|
+
- **History pairs a tool's result with its call inside one message, so results must be merged into the message that holds the call**: the Claude SDK writes every content block as its own record, so two calls made at once are two assistant records followed by both results. The old merge put every result on the *last* assistant message, which left the first call's card with no result — fine while streaming, then lost when the chat refetches history at the end of the turn. `mergeToolResultMessages` in `jsonl-transcript-parser.ts` routes each result by `toolUseId`, and both history paths (`getMessages` and `parseJsonlTranscript`) use it.
|
|
227
|
+
- **`handleEditorMount` in `code-editor.tsx` is memoised on `[isSql]`, so it sees the props of the render that created it**: a tab can be asked for a line before its editor exists — `open_file` with `line` on an HTML page open in preview mounts Monaco only when it switches to code — and the stale closure revealed the first render's target, i.e. none. It reads `revealTargetRef` now; anything else that handler needs from props has to go through a ref too.
|
|
228
|
+
- **In a Playwright-driven preview check, a page error naming `localStorage` or `serviceWorker` is Playwright's, not the page's**: `addInitScript` runs in every frame, the sandboxed previews included, where storage access throws `SecurityError`, and `serviceWorkers: "block"` injects a read of `navigator.serviceWorker` that an opaque-origin frame refuses too. The bridge reports both as the page's own errors, so the check lists problems the page does not have. Guard init scripts with `window.top !== window` and filter the service-worker one (`ai-tab-tools-e2e.mjs`).
|
|
229
|
+
- **An AI uses PPM's tool only if it does not think it has a better one**: with the user's Playwright MCP available, Opus given `open_preview`'s first description wrote the page, checked it in its own headless browser for four minutes (28 Playwright calls) and opened the tab only at the end — the user watched nothing. Saying *when* to call (as soon as the file is written; the user watches while you fix) and that the check needs no browser of its own put the call 5 s after the Write (Codex's came 34 s after its Write). Opus still opened its own browser afterwards, but only for what the check does not cover: hover tooltips and dark mode. The first run also inherited a max effort, so the two changes are not separated. Claude Code 2.1.280+ defers MCP tools, so a session's first call to either tool costs a `ToolSearch` round first.
|
|
230
|
+
- **A Tailscale Service is three admin steps the CLI cannot take, and its approval is not in the serve config**: `tailscale serve --service=svc:<name>` refuses an untagged node (`service hosts must be tagged nodes`), cannot define the service (the admin console's Services page does) and leaves the host waiting for an admin. Whether that approval happened is only in `status --json`: `Self.CapMap["service-host"]` maps each service this node may host to its VIPs (`[{ "svc:ppm": [...] }]`), and `CapMap["services/<name>"]` is present for a definition the node can see. `--service` forces `--bg`, so tailscaled keeps the handler across PPM restarts and reboots: PPM's switch is a desired state, re-applied by `ensureServiceOnStartup`, and a switch never touched counts an address already pointing at PPM as on (the address this dev host is reached at was set up by hand). A `svc:<name>` pointing anywhere else is never taken over without `replace` (409 `code: "conflict"`), which is also what keeps a dev instance off the live one's name. Two traps in `tailscale up`: on a node with any non-default pref it refuses with `requires mentioning all non-default flags` and prints the command that keeps them, which `tailscale-login.ts` retries once; and a stopped node must get a bare `up`, because any flag, `--json` included, takes it into that same refusal. `tailscale debug prefs` carries the node's private keys (`Config.PrivateNodeKey`, the network-lock key): `parsePrefs` keeps three fields, so never log or return the raw output. On Linux tailscaled takes changes from root and its `OperatorUser` only, which is why the pane's operator step (`sudo tailscale set --operator=<user>`) comes before sign-in. Never run `tailscale up`, `login`, `logout` or a `serve` change against this dev host from a test; `tests/fixtures/fake-tailscale.ts` answers every command the pane uses.
|
|
231
|
+
- **A forwarded page that refuses framing is let into PPM's tab by the hop, never by stripping the header**: the web-preview tab is an iframe on PPM's origin, so Rails' default `X-Frame-Options: SAMEORIGIN`, Django's `DENY` or any CSP `frame-ancestors` rendered a blocked frame. Deleting those headers would let every site frame the dev app, which matters for a public Cloudflare forward. `frame-ancestors.ts` translates instead: SAMEORIGIN becomes `frame-ancestors 'self' <PPM>`, DENY becomes `frame-ancestors <PPM>`, and an existing `frame-ancestors` gains PPM's origins (`'none'` dropped, since it cannot stand beside a source). `X-Frame-Options` cannot name an origin (`ALLOW-FROM` is ignored everywhere), and an enforced `frame-ancestors` makes browsers skip it. PPM's origin has to come from the browser: the server cannot know every name it is reached by (LAN address, tunnel, reverse proxy). So the tab POSTs `location.origin` to `/api/tunnels/frame-ancestors` before its frame loads and again on Reload; the list is in memory like the hops, so a restart forgets it. CSP has no IPv6 literal, so a PPM opened at `http://[::1]:<port>` cannot be named. `bun tests/e2e/forward-hop-framing-e2e.ts` checks the verdict in Chromium, Firefox and WebKit: PPM may frame every page, another site still may not. In a UI e2e, note that Forward opens the tab by itself, so nothing read after Forward is a "before".
|
|
232
|
+
- **Headless Chromium cannot subscribe to push, so a push e2e has to enter at the service worker**: `pushManager.subscribe` there fails with `Registration failed - permission denied`, so no test ever reaches a real FCM endpoint. The two halves are checked apart: the server's by encrypting a real push (`src/services/web-push/`) to a local HTTPS receiver, the worker's with CDP `ServiceWorker.deliverPushMessage` for `push` and a `NotificationEvent` dispatched inside the worker (`page.context().serviceWorkers()` → `evaluate`) for `notificationclick`. Chrome accepts only `userVisibleOnly: true` subscriptions, so `sw.ts` shows a notification for every push and never drops one. Like wake lock and WebCodecs, push needs a secure context, and on iOS a Home Screen install too; the Notifications pane says which one is missing instead of offering a switch that cannot work.
|
|
233
|
+
- **A log line's timestamp is a claim, not its place in the file**: the live `ppm.log.1` held a record stamped `2026-10-06T03:06:13Z` among `20:49Z` ones. The old build logged tool output verbatim (`tool_result: … output=`), that output quoted an example log line from the docs, and the reader took the quoted line for a record of its own. Merged by timestamp, it carried everything after it in the file seven hours forward. `formatLogLine` still writes a multi-line message as it is, so any text that quotes a log line can do it again. `log-columns.ts` therefore orders records by an `order` key: the longest run of in-step timestamps (patience sort), with each line off that run taking the time of the last in-step line before it. `merge()` and the time-range search compare that key, and `ppm.log.3` → `ppm.log` are one chain read in file order; only separate logs are interleaved by time. Related: Show in Logs reaches lines older than the first page with `reach=<id>`, one request capped at `MAX_REACH` (15,000 lines) that answers `reachMissed: "far" | "gone"` rather than leaving an empty selection.
|
|
206
234
|
|
|
207
235
|
## UI Rules
|
|
208
236
|
|
|
@@ -250,13 +278,15 @@ Before planning or implementing a new feature, read `docs/project-roadmap.md` to
|
|
|
250
278
|
- The contract everywhere here is **`undefined` = cannot measure**, and the UI renders that as an em dash. Never substitute `0`: "this GPU has no dedicated memory" and "this GPU has 0 MB of memory" are different claims, and `tests/unit/web/overview-gpu-card-vram.test.tsx` pins the difference.
|
|
251
279
|
- `src/services/db-backup/` — verified `VACUUM INTO` snapshots of `ppm.db` (hourly + at start + before every migration), GFS retention, `ppm backup` / `ppm restore`
|
|
252
280
|
- `src/services/session-trace/` — the session trace ("every run is traceable"): its own `session-trace.db` (outside `db-backup` — a log, not state), one trace per run keyed by the PPM session id with `trace_aliases` for ids a provider migrated to. `ChatService` records every input it handles (`user_message`, `context_added`, `approval_resolved`, `turn_aborted`) and every provider event, text/thinking deltas coalesced per block (`trace-coalescer.ts`), through a batching writer that never throws into a chat (`trace-writer.ts`). Browser half: `src/web/lib/trace-client.ts` (every console level; errors carry the 50 lines before them) posting to `POST /api/trace` keyed by device id, plus the inline watchdog beacon in `index.html`. Read a session with `GET /api/trace/sessions/:id`; retention in `session-trace-cleanup.ts`. Design and as-built notes: `docs/architecture/plugins-and-tracing.md`
|
|
281
|
+
- `src/services/logs/` — the Logs window, which replaced Report Bug. `log-store.ts` reads every log as one list — `ppm.log` and its rotated copies, `cloudflared.log`, and the browser rows the session trace already keeps (`browser-logs.ts`) — indexed per file inode as typed columns (`log-file-index.ts`, `log-columns.ts`: ~450k records in ~13 MB where objects cost ~200 MB), with the text read back a page at a time. `log-live.ts` is the live tail: a one-second poll that runs only while some view is subscribed over `/ws/global` (`logs:subscribe`). `log-issues.ts` is the Issues tab — the last 24 hours of errors and warnings grouped by `src/shared/log-fingerprint.ts`, then sorted by cause by Claude Haiku through `log-ai.ts` (`completeOnce`, the person's own account, no tools), remembered per fingerprint in `<ppm dir>/logs-issues.json`; Auto runs at most every ten minutes and only while something reads the issues. `log-report-draft.ts` drafts a report from chosen lines, `log-environment.ts` is its Environment block, `github-issues.ts` asks GitHub for labels and look-alike open issues — never posts. What the Logs window's own AI is shown and what goes into a report go through `src/shared/log-redact.ts` first, which takes out secrets whatever the switches say (a process's own stderr reaches `ppm.log` unredacted); Add to chat puts lines in a chat as they are. Routes `src/server/routes/logs.ts` (authenticated, like the old bug report's `/api/logs/recent` in `src/server/index.ts`, which nothing in PPM reads any more), shapes `src/shared/logs-model.ts` + `logs-api.ts`. UI `src/web/components/logs/` — a window on desktop, the `logs` tab below `md`, both through `open-logs.ts` — with the pure halves in `src/web/lib/logs/` (`logs-view-model.ts`: folding repeats, ranges; `logs-report.ts`: the issue Markdown and its URL limit). The GitHub button is a real `<a target=_blank>`, so it cannot be popup-blocked, and a body too long for the URL is copied instead
|
|
253
282
|
- `src/services/remote-desktop/` — Remote Desktop: one ffmpeg per WS session (`remote-desktop-capture.ts` + per-platform `remote-desktop-capture-input.ts` + `remote-desktop-encoder-args.ts`) → Annex-B H.264 access units → WebCodecs; input via `remote-desktop-input.ts` facade over `remote-desktop-input-{win32,darwin,linux,uinput}.ts` (bun:ffi, no helper binary); host checklist in `remote-desktop-requirements.ts` (ffmpeg install command, macOS TCC pre-flight, Linux session/XTEST/uinput rows); display list in `remote-desktop-displays.ts` (`CGGetActiveDisplayList` order = avfoundation `Capture screen N`, names/bounds via one JXA call; X11 monitors via `XRRGetMonitors`). Linux specifics: `remote-desktop-linux-session.ts` decides X11 vs Wayland and resolves `DISPLAY`/`XAUTHORITY` (a Wayland session then takes a separate capture backend: `remote-desktop-portal.ts` holds the `org.freedesktop.portal.ScreenCast` session over libdbus FFI and `remote-desktop-capture-wayland.ts` runs `gst-launch-1.0` against the PipeWire node it hands back, producing the same Annex-B stdout ffmpeg does), `remote-desktop-x11.ts` is the shared Xlib connection, `remote-desktop-evdev-key-map.ts` is the one key table both Linux backends use. Clipboard sync is `remote-desktop-clipboard.ts` (host side, one helper process per read/write) and `src/web/components/remote-desktop/remote-desktop-clipboard-client.ts` (which key combos mean copy/paste, plus the insecure-origin copy fallback). The in-session controls are `remote-desktop-toolbar.tsx` (desktop, RustDesk's grouped menus) and `remote-desktop-mobile-toolbar.tsx` + `remote-desktop-mobile-settings.tsx` (thumb zone), with the scale maths in `remote-desktop-view-style.ts`. Host audio is `remote-desktop-audio.ts` (a second ffmpeg, Opus in Ogg) demuxed by `remote-desktop-ogg-opus.ts` and played by `use-opus-audio-player.ts`; privacy mode is `remote-desktop-privacy.ts` (X grabs + DPMS); host resolution is `remote-desktop-resolution.ts` (XRandR FFI) with the menu collapse and the fit-local decision in `remote-desktop-resolution-list.ts`; the custom image-quality maths ported from RustDesk's `video_qos.rs` are `src/shared/remote-desktop-custom-quality.ts` behind `remote-desktop-custom-quality-dialog.tsx`; screenshot/recording are `remote-desktop-recording.ts` + `use-remote-desktop-recorder.ts` (client-side `MediaRecorder` over the canvas). The WebRTC transport is an optional downloaded relay: `mediamtx-catalog.ts` (pinned version + SHA-256 per platform), `mediamtx-install.service.ts`, `mediamtx-paths.ts`, `mediamtx-config.ts` (the generated config — the one place the relay's exposure is decided) and `mediamtx-process.ts` (one relay per session, free ports, waits until it is really listening); `buildCaptureArgs`'s last argument swaps `pipe:1` for an RTSP push, `remote-desktop-whep-registry.ts` + `POST /api/remote-desktop/whep/:ticket` are the authenticated, **ticket-addressed** handshake proxy, and `use-webrtc-canvas-video.ts` paints the track into the same canvas the WebCodecs path draws to. Settings pane `settings/remote-desktop-settings-section.tsx`. Codec choice comes from `workingEncoders()` in `media-transcode/ffmpeg-capabilities.ts`, which probes *every* candidate rather than short-circuiting. Routes `src/server/routes/remote-desktop.ts`, WS `src/server/ws/remote-desktop.ts`, UI `src/web/components/remote-desktop/`, e2e `tests/e2e/remote-desktop-e2e.mjs`
|
|
254
283
|
- `src/services/git-hunks/` — hunk/line-level stage, unstage and discard (`/api/projects/:name/git/{hunks,stage-hunks,unstage-hunks,discard-hunks}`). `unified-diff.ts` holds the patch surgery (recomputed `@@` counts, unselected deletions demoted to context); the UI is `src/web/components/git/hunk-stage-dialog.tsx`
|
|
255
284
|
- `src/services/git-repos/` — which repository a project's git surfaces run in, when the project folder is a container of checkouts rather than a repository itself. `git-repo-discovery.ts` walks the folder (`GET /git/repos`), the `?repo=` middleware in `src/server/routes/git.ts` scopes every git route to one of them, and the browser side is `src/web/lib/git-repo-scope.ts` (pure decisions and both directions of path rebasing), `src/web/stores/git-repo-store.ts` (the device-local choice), `src/web/hooks/use-git-repo.ts` (what every panel calls) and `src/web/components/git/git-repo-picker.tsx`. Extension panels are opened on the repository, so `packages/ext-git-graph/src/project-scope.ts` maps that path back to the containing project
|
|
285
|
+
- `src/services/git-changes/` + `src/services/git-workflow/` + `src/services/git-discard-journal/` + `src/services/git-commit-draft.service.ts` — Source Control, the Review changes tab and the Git Graph as one flow over the same routes. `GET /git/changes` is the working tree file by file and block by block (one `git status --porcelain=v2`, at most one `git diff` per side, `GIT_OPTIONAL_LOCKS=0`; a block's id is the fingerprint `git-hunks` resolves), every POST on the git router emits `git:changed` on `/ws/global`, a discard is kept for Undo under `<ppm dir>/git-discards/`, and the commit message is one per repository in `chat_drafts` (`git:commit-draft`). UI: `src/web/components/git/git-status-panel.tsx` and its `git-*.tsx` parts (decisions in `src/web/lib/git-changes-view.ts`), the `git-review` tab in `src/web/components/git-review/` over `src/web/lib/git-review-model.ts`, and the Git Graph reaching the same routes through `packages/ext-git-graph/src/ppm-git.ts` — a git write that bypasses them is heard by nobody until the next poll. The Git Graph's file icons are the app's, answered per name by `src/web/components/extensions/webview-file-icons.ts`. Docs `docs/architecture/workspace-and-ui.md` → Source Control, Review changes and Git Graph
|
|
256
286
|
- `src/web/lib/icons.ts` + `src/web/lib/icons.generated.tsx` + `src/web/lib/fluent-icon.tsx` — the product icons (Fluent System Icons 20px Regular, MIT, microsoft/fluentui-system-icons) for the app's own chrome. Every UI icon is imported from `@/lib/icons`; regenerate with `bun scripts/gen-product-icons.ts` after editing its `MAP`
|
|
257
287
|
- `src/server/routes/static-fallback.ts` + `src/web/components/root-error-boundary.tsx` + `src/web/lib/chunk-recovery.ts` + the inline watchdog in `src/web/index.html` — the four halves of not going blank when a chunk is missing: 404 instead of the shell, a boundary above `App`, one guarded purge-and-reload on `vite:preloadError`, and a dependency-free last resort for when the entry never ran at all
|
|
258
288
|
- `src/web/lib/file-icons.tsx` + `src/web/lib/file-icon-name.ts` + `src/web/lib/file-icons.generated.ts` + `src/web/styles/file-icons.generated.css` — the file icon theme (real `vscode-icons` artwork, MIT). `FileIcon` for a component slot, `fileIconElement` for the `icon: ElementType` slots (tab bar, command palette, both through `src/web/lib/tab-type-icons.ts`). Name resolution is the pure half in `file-icon-name.ts` (importable under `bun:test`); the framework preset comes from `src/web/stores/project-framework-store.ts`. Regenerate with `bun scripts/gen-file-icons.ts`
|
|
259
|
-
- `src/services/lsp/` — language servers for the editor. `server-registry.ts` says which binary serves which language and how to find it (project `node_modules/.bin`, then PATH, then PPM's own directory), `lsp-protocol.ts` is the `Content-Length` framing, `lsp-session.ts` owns one child process, `lsp-manager.ts` decides how many exist and shares them by *server + root directory*. `lsp-install.ts` is the Install button's host half, one plan per server: `bun add` of the registry's packages into `<ppm dir>/lsp-servers` — never `-g` — `go install` with `GOBIN` pointed at that same directory, and for rust-analyzer alone `rustup component add` **in the project's directory**, keeping no copy because the component belongs to whichever toolchain that project selects. All
|
|
289
|
+
- `src/services/lsp/` — language servers for the editor. `server-registry.ts` says which binary serves which language and how to find it (project `node_modules/.bin`, then PATH, then PPM's own directory), `lsp-protocol.ts` is the `Content-Length` framing, `lsp-session.ts` owns one child process, `lsp-manager.ts` decides how many exist and shares them by *server + root directory*. `lsp-install.ts` is the Install button's host half, one plan per server: `bun add` of the registry's packages into `<ppm dir>/lsp-servers` — never `-g` — `go install` with `GOBIN` pointed at that same directory, `gem install --install-dir <lsp dir>/ruby` for Solargraph (spawned with `GEM_PATH` pointing there — `installedServerEnv` — and not offered on Windows, whose `.bat` binstub is unverified), a release download for clangd and lua-language-server (`lsp-release-catalog.ts`, version + SHA-256 per platform; staged beside the target, unpacked, started once with `--version`, then swapped in whole), and for rust-analyzer alone `rustup component add` **in the project's directory**, keeping no copy because the component belongs to whichever toolchain that project selects. All of them behind `POST /api/project/:name/lsp/install`, which takes a server **id** and never a package name; a toolchain PPM cannot find means no button rather than one that fails; the browser side is `retryUnavailableLspDocuments()` in `lsp-client.ts`, which reopens the files that had no server so an install needs no reopened tab. The same pair exists machine-wide at `/api/lsp/{servers,install}` for `settings/language-servers-section.tsx` — Settings is open on no project, so nothing project-local is consulted there — and that pane reaches the client through a **dynamic** import, because the lazy-boundary test scans all of `src/web`. That pane's Remove (`POST /api/lsp/uninstall`, Settings only — the editor's dialog is only ever shown for a *missing* server) is gated on `origin` from `availability()`, which is where `resolveCommand` found the server: only `ppm` and `rustup` may be removed, because a copy on `PATH` is the user's, one in a project is the repository's and `bundled` is PPM's own dependency. One npm package can serve several rows (`vscode-langservers-extracted` is JSON + HTML + CSS), which `serversSharingInstall` names so the confirmation can say so before the removal takes all three. Bridge at `src/server/ws/lsp.ts` on `/ws/project/:name/lsp`, status at `/api/projects/:name/lsp/status`. Browser side in `src/web/lib/lsp/` (client, Monaco conversions, providers, shadow models, F12 navigation) driven by `src/web/hooks/use-lsp.ts`. All of it is behind the `lspEnabled` setting — off by default, per device, never on below the `md` breakpoint — and mounted by `src/web/components/editor/editor-language-service.tsx`, which `code-editor.tsx` may only reach through `lazy()`. Real-server check: `bun tests/e2e/lsp-e2e.ts`
|
|
260
290
|
- `src/web/components/problems/` + `src/web/stores/problems-store.ts` — the Problems panel: a dock tab (`DOCK_ALLOWED_TAB_TYPES`) fed by every mounted editor's `useLsp`, opened from the status bar counts on desktop and the editor's LSP row on mobile. Scoped to the active project because `tab-pool` keeps other projects' editors mounted for keep-alive, so their servers keep publishing
|
|
261
291
|
- `src/services/git-blame/` — `git blame --porcelain` for the editor's inline annotation (`/api/projects/:name/git/blame`); shared shape and formatting in `src/shared/blame.ts`, editor wiring in `src/web/hooks/use-inline-blame.ts`. The annotation's GitLens-style hover adds one `git show --unified=0` per commit *and line* (`/git/commit-line`, parsed by `commit-line-diff.ts`), with the markdown built in `src/web/lib/blame-hover.ts` and its buttons registered in `blame-hover-commands.ts`, which hand off to the Git Graph extension's own views over `ext:command:execute`
|
|
262
292
|
- `dist/web` asset pipeline — `scripts/copy-monaco.ts` stages `monaco-editor/min/vs` under `dist/web/assets/monaco/` (inside `assets/` so it inherits the immutable cache header, the SW runtime cache and the compressed siblings), `scripts/precompress-web.ts` writes `.br`/`.gz` siblings, and `src/server/routes/static-encoding.ts` chooses one per request (honouring `q=0` and `*`, keeping the original MIME, adding `Vary: Accept-Encoding` and the encoding in the ETag). Both scripts run after `build:web` in the `build` chain
|
|
@@ -264,6 +294,11 @@ Before planning or implementing a new feature, read `docs/project-roadmap.md` to
|
|
|
264
294
|
- `scripts/gen-nerd-font.ts` + `src/web/styles/nerd-font.generated.css` + `src/web/styles/fonts/` — the terminal's icon glyphs (Nerd Fonts symbols-only, MIT, ryanoasis/nerd-fonts), subset per icon set so each `@font-face` is fetched only when something draws a character in its range. Regenerate with `bun scripts/gen-nerd-font.ts` after editing its `BLOCKS`; `TERMINAL_FONT_FAMILY` in `src/web/lib/editor-font.ts` is what names the family, and `use-terminal.ts` is what invalidates xterm's glyph atlas when a face lands
|
|
265
295
|
- `src/services/speech-to-text/` — speech to text for the chat mic, run on the host. `whisper-catalog.ts` pins the whisper.cpp build and every model by SHA-256, `whisper-download.ts` streams and hashes in one pass onto a `.part` file, `whisper-install.service.ts` installs under `<ppm dir>/whisper` and proves the binary runs before calling it installed, `whisper-transcribe.service.ts` is one `whisper-cli` run per request (serialised — two at once just make both slow), with `whisper-hallucinations.ts` dropping the sentences the model invents as a second line of defence behind the VAD. Routes `src/server/routes/speech.ts`, browser side `src/web/hooks/use-whisper-voice-input.ts` + `src/web/lib/voice-wav.ts`, Settings pane `src/web/components/settings/voice-settings-section.tsx` (the engine choice only appears once it is installed), e2e `bun tests/e2e/whisper-e2e.ts`
|
|
266
296
|
- `src/services/mcp-oauth/` — MCP sign-in for `needs-auth` servers: `mcp-oauth-flows.ts` (one prompt-less Claude subprocess per flow, opened by the provider's `openMcpControlQuery`), `mcp-status-probe.ts` (cached per-directory status), `mcp-oauth-redirect.ts` (pure redirect/host rules). Routes `src/server/routes/mcp-auth.ts` (public `GET /api/mcp-auth/callback` mounted before auth), chat sync `src/server/ws/chat-mcp-sign-in-sync.ts`, UI `src/web/components/mcp-auth/` (dialog/bottom sheet, chat bar, the list shown in Settings → AI Provider and the AI Resources panel), e2e `tests/e2e/mcp-sign-in-e2e.mjs`
|
|
267
|
-
- `src/services/named-tunnel/` — Named tunnel (stable `https://<prefix>.<zone>` URL via Cloudflare login), orchestrated from `src/server/routes/named-tunnel.ts`, spawned/probed by the supervisor; UI in `src/web/components/tunnels/named-tunnel/`
|
|
268
|
-
- `src/services/
|
|
297
|
+
- `src/services/named-tunnel/` — Named tunnel (stable `https://<prefix>.<zone>` URL via Cloudflare login), orchestrated from `src/server/routes/named-tunnel.ts`, spawned/probed by the supervisor; UI in `src/web/components/tunnels/named-tunnel/` (the setup flow, shared by the first-run popup and Settings)
|
|
298
|
+
- `src/services/tailscale/` — Settings → Remote Access → Tailscale, PPM at `https://<name>.<tailnet>.ts.net` through the Tailscale Service `svc:<name>`. `tailscale-cli.ts` finds and runs the CLI (shared with `port-forward/tailscale-forward.ts`), `tailscale-state.ts` reads the setup from `status --json`, `debug prefs` and `serve status --json` and changes nothing, `tailscale-login.ts` is the in-app sign-in (`tailscale up --json`, its link and QR code), `tailscale-app-service.ts` is the switch (the `tailscale_service` config row) and the start-up re-apply. The step order is `currentSetupStep` in `src/shared/tailscale-setup.ts`, shared by the server's refusal messages and the pane's checklist. Routes `src/server/routes/tailscale.ts` (`/api/tailscale`), UI `src/web/components/settings/tailscale/`, fake CLI for tests `tests/fixtures/fake-tailscale.ts`
|
|
299
|
+
- `src/web/components/settings/remote-access/` — Settings → Remote Access, every way to reach PPM itself from another device, one sub-tab each (`remote-access-tab-store.ts`, which `openRemoteAccess(tab)` sets before opening Settings): Tailscale (the pane above, mounted as it is) and Public link (`public-link-pane.tsx`: the `/api/tunnel` switch plus the temporary-vs-own-domain choice, the named-tunnel flow rendered inline). Forwarding a dev server is the sidebar's Port Forwarding section (id `tunnels`), `src/web/components/tunnels/port-forwarding-panel.tsx` over `/api/tunnels`, which the palette's Forward a Port reaches through `open-port-forwarding.ts` (the drawer on a phone). Its two rows say where Tailscale (`/api/tunnels/transports`) and PPM's own Cloudflare domain (`/api/tunnel/named/status`) stand, and their Set up / Manage buttons are the links into these sub-tabs — signing in to either is never done in the panel. `tests/unit/web/remote-access-settings.test.tsx`, `tests/unit/web/port-forwarding-panel.test.tsx`
|
|
300
|
+
- `src/services/design/` — Design mode: a design is `designs/<slug>/` with its canvas data in the git-ignored, unwatched `.design/`. `design-store.service.ts` (folders, `design.json`), `design-snapshots.service.ts` + `design-restore.service.ts`/`design-restore-journal.ts` (history, crash-safe restore), `design-turn-snapshot.ts` (a snapshot after each design turn, scheduled from `chatService.sendMessage`), `design-instructions.ts` + `design-tool-policy.ts` (the per-turn instructions `chatService.prepareSendOptions` adds, and the `acceptEdits` policy), `design-skill-install.service.ts` (Settings → Design's Install for the suggested skill: the pinned npm tarball laid out exactly as upstream's `uipro init --global`, checked by `tests/e2e/design-skill-install-e2e.ts`), `preview/` (capability tokens, CSP, parse5 `data-ppm-id` instrumentation, print view), `bridge/` (the in-frame script, shipped as source), `source/` (the patchers behind tweaks and move/resize), `comments/`, `export/` and `design-edit-undo-journal.ts`. Routes `src/server/routes/designs.ts` with its `design-*.ts` sub-routers, and `design-preview.ts` for the canvas; protocol `src/shared/design-bridge-protocol.ts`; UI `src/web/components/design/` with client helpers in `src/web/lib/design/`; docs `docs/architecture/workspace-and-ui.md` → Design mode; e2e `tests/e2e/design-mode-e2e.mjs` (fixture server and scripted provider in `tests/e2e/fixtures/design-mode-server.ts` / `design-script-provider.ts`)
|
|
301
|
+
- `src/services/tab-tools-mcp/` — the AI's tab tools, `open_file` (optional `line`) and `open_preview`, given to every chat that is not a design session while Settings → AI Provider → *Let the AI open tabs in PPM* (`ai.tab_tools`) is on; Claude's claude.ai Artifact tools are turned off with it (`CLAUDE_CODE_DISABLE_ARTIFACT=1`), and a call made after the setting went off is refused at the endpoint, because a chat keeps the tools it started with. `/api/tab-tools-mcp` (`tab-tools-mcp-endpoint.ts`, mounted before auth) is built from the same parts as `/api/design-mcp`: `src/services/mcp-http-endpoint.ts` (JSON-only Streamable HTTP, a request with an `Origin` refused, 64 KB cap) and `src/services/mcp-session-tokens.ts` (per-session capability tokens, memory only, looked up by SHA-256); `tab-tools-mcp-tokens.ts` binds a token to the session id alone, so a warm spare's token is the one its session's turns mint. `tab-target.ts` resolves the agent's `path` under the editor's own read rules, and `tab-open-broker.ts` sends `tab_open` over the chat WebSocket and waits for the first `tab_open_result` (8 s for a file, 40 s for a page; 4 calls in flight and 20 a minute per session) — `deliverTabOpen` in `src/server/ws/chat.ts` picks the device that sent the turn's message, else every device showing the chat, and never buffers it for replay. Protocol and the per-provider tool names in `src/shared/tab-open-protocol.ts`; provider wiring `tabToolsMcpServers` (`claude-agent-sdk-query-options.ts`) and `tabToolsMcpConfig`/`tabToolsMcpEnv` (`codex-thread-params.ts`), from the access `chatService.prepareSendOptions` mints. Browser: `src/web/lib/open-ai-tab.ts` (answers `tab_open` from `use-chat.ts`: opens the tab, waits for the page, runs its check), `ai-tab-placement.ts` (pure: beside the chat on a desktop, the whole screen on a phone), `html-preview-loads.ts` (which preview shows which page, by load), `tab-tool-call.ts` + `src/web/components/chat/tab-tool-card.tsx` (the card and its Open button). The HTML preview route serves the design canvas's CSP (`buildDesignCsp`, so the design CDNs load) and injects `design/bridge/html-preview-bridge.ts`, the design bridge's core plus its self-check. Docs `docs/architecture/ai-chat-and-providers.md` → AI tab tools; e2e `PPM_PLAYWRIGHT_MODULE=<playwright>/index.mjs node tests/e2e/ai-tab-tools-e2e.mjs` (scripted provider in `tests/e2e/fixtures/tab-tools-server.ts`; `PPM_TAB_TOOLS_WEB_DIR` reuses a scratch build) and `tests/e2e/html-preview-cdn-check-e2e.mjs`
|
|
269
302
|
- `src/services/agent-transcript/` — one hub per `(providerId, sessionId)` streaming an Agent card's or teammate's own transcript live over `/ws/global`, independent of the chat WebSocket and of whether the root turn is still running. `session-ownership.ts` proves the session belongs to the caller's project before any file is named; `agent-transcript-sources.ts` resolves a card/teammate to the exact file(s), including Codex descendants via `session_meta.parent_thread_id`; `agent-transcript-session-hub.ts` + `agent-transcript-hub.ts` are the per-session tail/page/cursor loop, `agent-transcript-session-hub-activity.ts` the separate "who is running" feed. Protocol in `src/shared/agent-transcript-protocol.ts`; UI entry points `src/web/components/chat/{agent-card-summary,agent-session-window-content,agent-session-sheet,running-agents-bar}.tsx` via `use-agent-session-stream.ts`/`use-agent-activity.ts`; docs `docs/architecture/ai-chat-and-providers.md` → Agent session transcripts
|
|
303
|
+
- `src/services/session-file-baselines/` — the session review (the changes bar above the composer and the block-by-block Review tab): `session-file-baselines.service.ts` keeps each file's state from before the session's first write (`<ppm dir>/session-baselines/<session id>/`, first capture wins, 5 MB cap, credential paths never copied, 30-day prune), `session-file-changes.service.ts` compares it with the disk (git HEAD only as a fallback inside the project), `reverse-unified-diff.ts` works a Codex patch's "before" out, `shell-change-tracker.ts` brackets each Claude shell command with `git status`, `session-review-marks.ts` keeps what the user marked reviewed (a snapshot per file under `<session dir>/reviewed/`, written only at the version the browser showed; a file changed after its mark is diffed against the mark). Blocks are cut by `src/shared/review-blocks.ts`, shared because the server cuts them again from the disk before acting on a key the browser sent; `session-review-blocks.ts` records the kept ones per base hash, and `session-review-actions.ts` keeps, reopens and reverts blocks or whole files on disk (`/file-changes/answer`, refused as `stale` unless the file is at the version drawn) and undoes any answer all-or-nothing from its journal (`/file-changes/undo`). `session-file-history.ts` logs each file's state just before and after every call that writes it (`<session dir>/history/`, as line deltas), `session-file-blame.ts` replays that log to name the calls behind each block, and `session-turn-revert.ts` puts a turn's calls back where their lines are still intact (`/file-changes/revert-turn`: a preview first, then `stale` unless every file is at the previewed version). Captured by the Claude PreToolUse file-write hook and the shell hooks around each `Bash` call (`buildToolHooks` in `claude-agent-sdk-query-options.ts`) and by `codex-file-baselines.ts`. Routes `src/server/routes/chat-file-changes.ts`, shapes `src/shared/session-file-changes.ts`; UI `src/web/components/chat/session-changes-bar.tsx` + `session-change-row.tsx`, and `src/web/components/session-review/` (`review-desktop.tsx`, `review-phone.tsx` below `md`, `review-code.tsx` for the blocks and their turn chips, `review-tokens.tsx` for shiki colours), the chat's per-answer pill and tray `src/web/components/chat/turn-change-{rollup,tray,sheet,review}.tsx` over `src/web/hooks/use-turn-review.ts` + `src/web/lib/turn-review.ts` (the list reaches them through `session-changes-context.tsx`), turns from `src/web/lib/session-turns.ts` through `src/web/stores/session-turns-store.ts` (published by the chat, read by `use-session-turns.ts` when no chat is open), Show in chat through `src/web/stores/chat-jump-store.ts`, state `src/web/hooks/use-session-review.ts` over the pure `src/web/lib/session-review-model.ts`, data `src/web/hooks/use-session-file-changes.ts` + `src/web/lib/session-file-changes{,-client}.ts`; docs `docs/architecture/ai-chat-and-providers.md` → Session changes and review; e2e `bun tests/e2e/session-changes-e2e.mjs`
|
|
304
|
+
- `src/services/notification.service.ts` — notifications, configured in Settings → Notifications. `broadcast(type, payload, { stillUnseen })` drops a switched-off event, waits `delay_seconds` (one pending per session: a newer event replaces it) and sends only if `stillUnseen()` still holds — the chat is still unread, and for an approval the same request is still pending (`src/server/ws/chat.ts`); schedules and Jira pass none and always send. `deliver` fans out to push, Telegram and ntfy, plus PPM Cloud's `sendNotification`, which is inert in the server process because that connection lives in the supervisor. Settings shape and defaults in `src/shared/notification-settings.ts`, text and links in `notification-format.ts`. Push is standard Web Push with no dependency, `src/services/web-push/` (VAPID ES256 + RFC 8291 aes128gcm on WebCrypto; keys and subscriptions are the config rows `web_push_vapid` / `web_push_subscriptions` and never reach a browser); the browser half is `src/web/sw.ts` (`push`, and `notificationclick` → `src/web/sw-notification-click.ts`, which hands the session to an open window through `src/web/hooks/use-notification-clicks.ts`) and `src/web/lib/web-push-{support,client}.ts`. Telegram sends through `telegram-notification.service.ts` to the chats in the `telegram_notify_chats` config row, and to nobody else: PPMBot has a bot and chats of its own (`telegram-bots.ts` — the `ppmbot_telegram` row and `clawbot_paired_chats`; both rows sit outside `CONFIG_TABLE_KEYS` like the VAPID key, and an install that shared one bot is split once, on first read). The one-tap Connect link is `telegram-connect.service.ts`, one per bot owner, which polls a bot itself unless PPMBot is reading that bot (Telegram allows one `getUpdates` reader per bot; the bots are compared by id, the digits before the token's colon). ntfy is `ntfy-notification.service.ts`: one JSON publish per notification (the header form cannot carry a non-ASCII title), the config row `ntfy` with its token in `SECRET_CONFIG_KEYS`, dropped when Settings saves a different server so it is not sent to the new one (`PUT /ntfy`; `ppm config set ntfy.server` does not drop it). Both channels take their link back into PPM from `notification-link.ts`: the tunnel URL, else the Tailscale Service address, else localhost — never the LAN address, which is plain HTTP on an insecure origin where the browser withholds every permission PPM asks for. Routes `src/server/routes/notifications.ts` (`/api/notifications/*`), UI `src/web/components/settings/notifications-settings-section.tsx` + `telegram-bot-token-field.tsx` + `ntfy-server-form.tsx`, fake ntfy for tests `tests/helpers/fake-ntfy-server.ts`
|