@hienlh/ppm 0.9.84 → 0.9.86
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/260413-1354-new-file-editor-tab/reports/code-reviewer-260413-1420-new-file-tab-review.md +210 -0
- package/CHANGELOG.md +23 -0
- package/bun.lock +259 -9
- package/dist/web/assets/{_basePickBy-5PGDJbfF.js → _basePickBy-Bj0dI1ei.js} +1 -1
- package/dist/web/assets/{_baseUniq-BT4Ow4Kk.js → _baseUniq-CyzdZeQH.js} +1 -1
- package/dist/web/assets/ai-settings-section-Bo9lCaTd.js +1 -0
- package/dist/web/assets/{api-settings-Bn-bIxD1.js → api-settings-CUxg9RE5.js} +1 -1
- package/dist/web/assets/{arc-BAOivWpI.js → arc-CxgHJ7Z4.js} +1 -1
- package/dist/web/assets/architecture-PBZL5I3N-DDFO_NKq.js +1 -0
- package/dist/web/assets/{architectureDiagram-2XIMDMQ5-Z-4eN4za.js → architectureDiagram-2XIMDMQ5-D16OotsC.js} +1 -1
- package/dist/web/assets/arrow-up-I9-21gkR.js +1 -0
- package/dist/web/assets/{blockDiagram-WCTKOSBZ-BCLqzhuZ.js → blockDiagram-WCTKOSBZ-Ct57Wtfk.js} +1 -1
- package/dist/web/assets/{c4Diagram-IC4MRINW-0Vp0Jeas.js → c4Diagram-IC4MRINW-BIymcNsg.js} +1 -1
- package/dist/web/assets/channel-wumTB1if.js +1 -0
- package/dist/web/assets/chat-tab-BEEd-Km4.js +10 -0
- package/dist/web/assets/chevron-right-DY_wImxB.js +1 -0
- package/dist/web/assets/{chunk-4BX2VUAB-D4tOov49.js → chunk-4BX2VUAB-CENmY7Kw.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-DJ6BynZ4.js → chunk-55IACEB6-DhZGI1l3.js} +1 -1
- package/dist/web/assets/{chunk-7E7YKBS2-CiyUJxNI.js → chunk-7E7YKBS2-DZcnC7Ow.js} +1 -1
- package/dist/web/assets/{chunk-7R4GIKGN-Dv-4cAYn.js → chunk-7R4GIKGN-y8bfHEy-.js} +2 -2
- package/dist/web/assets/{chunk-C72U2L5F-D21mS_6G.js → chunk-C72U2L5F-BHPkfQj2.js} +1 -1
- package/dist/web/assets/{chunk-EGIJ26TM-DzqmU2Z7.js → chunk-EGIJ26TM-nant2LXl.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-DXncblvW.js → chunk-FMBD7UC4-Bog4cpN-.js} +1 -1
- package/dist/web/assets/{chunk-GEFDOKGD-D-pKjlVd.js → chunk-GEFDOKGD-86LFbsAC.js} +1 -1
- package/dist/web/assets/chunk-GLR3WWYH-Re-5eSlQ.js +2 -0
- package/dist/web/assets/chunk-HHEYEP7N-C45i5G_3.js +1 -0
- package/dist/web/assets/{chunk-JSJVCQXG-99JzIdPr.js → chunk-JSJVCQXG-23eG9mgt.js} +1 -1
- package/dist/web/assets/{chunk-KX2RTZJC-CRq1OBZv.js → chunk-KX2RTZJC-CHj8TnTB.js} +1 -1
- package/dist/web/assets/{chunk-KYZI473N-Bb0MCaIO.js → chunk-KYZI473N-gqRLpJ4w.js} +1 -1
- package/dist/web/assets/{chunk-L3YUKLVL-C7qGJrfV.js → chunk-L3YUKLVL-DnSMmNFC.js} +1 -1
- package/dist/web/assets/{chunk-MX3YWQON-BpS_PtKp.js → chunk-MX3YWQON-B6g1ZH9X.js} +1 -1
- package/dist/web/assets/{chunk-NQ4KR5QH-z_blpjxi.js → chunk-NQ4KR5QH-DX32345Y.js} +1 -1
- package/dist/web/assets/{chunk-O4XLMI2P-nDhi_cVu.js → chunk-O4XLMI2P-Vp_V4P-b.js} +1 -1
- package/dist/web/assets/{chunk-OZEHJAEY-BXhYx3nO.js → chunk-OZEHJAEY-lKq2SWjA.js} +1 -1
- package/dist/web/assets/{chunk-PQ6SQG4A-TF58UVMU.js → chunk-PQ6SQG4A-Bik13fTV.js} +1 -1
- package/dist/web/assets/{chunk-PU5JKC2W-ek7k4QVB.js → chunk-PU5JKC2W-DD95Rx35.js} +1 -1
- package/dist/web/assets/chunk-QZHKN3VN-N3VXx1VH.js +1 -0
- package/dist/web/assets/{chunk-R5LLSJPH-CFwSJijQ.js → chunk-R5LLSJPH-dRhXRnrb.js} +1 -1
- package/dist/web/assets/{chunk-WL4C6EOR-ByUrSRin.js → chunk-WL4C6EOR-B1iIvLOG.js} +1 -1
- package/dist/web/assets/{chunk-XIRO2GV7-Djlmrely.js → chunk-XIRO2GV7-DZBoNl1_.js} +1 -1
- package/dist/web/assets/{chunk-XPW4576I-BPQQBakK.js → chunk-XPW4576I-CgLyyW03.js} +1 -1
- package/dist/web/assets/{chunk-XZSTWKYB-DxAOx4hG.js → chunk-XZSTWKYB-DjV8xl5A.js} +1 -1
- package/dist/web/assets/{chunk-YBOYWFTD-rQG3QH5s.js → chunk-YBOYWFTD-D_ILLe6_.js} +1 -1
- package/dist/web/assets/classDiagram-VBA2DB6C-mr-Cb1me.js +1 -0
- package/dist/web/assets/classDiagram-v2-RAHNMMFH-BKe8_uda.js +1 -0
- package/dist/web/assets/clone--z5KLAuR.js +1 -0
- package/dist/web/assets/code-editor-Ij4p30cr.js +8 -0
- package/dist/web/assets/columns-2-IeETSfON.js +1 -0
- package/dist/web/assets/{cose-bilkent-S5V4N54A-B_AWZsOP.js → cose-bilkent-S5V4N54A-BGNPFv3x.js} +1 -1
- package/dist/web/assets/{csv-preview-D2pJJj3K.js → csv-preview-CwQnOa3E.js} +2 -2
- package/dist/web/assets/{dagre-DHq9bhnd.js → dagre-CkhlMHnx.js} +1 -1
- package/dist/web/assets/{dagre-KLK3FWXG-BdJr7Byp.js → dagre-KLK3FWXG-Cnp996VG.js} +1 -1
- package/dist/web/assets/database-CgTomMxt.js +1 -0
- package/dist/web/assets/{database-viewer-Camu01H4.js → database-viewer-C1UHSgft.js} +2 -2
- package/dist/web/assets/{diagram-E7M64L7V-_db4pBVA.js → diagram-E7M64L7V-BZF0tSOr.js} +1 -1
- package/dist/web/assets/{diagram-IFDJBPK2-xKoeuiJx.js → diagram-IFDJBPK2-nUcO8sN8.js} +1 -1
- package/dist/web/assets/{diagram-P4PSJMXO-C8tjJsev.js → diagram-P4PSJMXO-CW0eCkwC.js} +1 -1
- package/dist/web/assets/diff-viewer-CVx5naBA.js +4 -0
- package/dist/web/assets/dist-CM0oD8tQ.js +1 -0
- package/dist/web/assets/{erDiagram-INFDFZHY-BSh2z9Df.js → erDiagram-INFDFZHY-DSkriYZ9.js} +1 -1
- package/dist/web/assets/extension-webview-CHVVpV34.js +3 -0
- package/dist/web/assets/{flowDiagram-PKNHOUZH-oYaovqyp.js → flowDiagram-PKNHOUZH-CFYAfZBx.js} +1 -1
- package/dist/web/assets/{ganttDiagram-A5KZAMGK-DmL26q2P.js → ganttDiagram-A5KZAMGK-KSn4XAU4.js} +1 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-OkvBPi6H.js +1 -0
- package/dist/web/assets/{gitGraphDiagram-K3NZZRJ6-CMoukSrY.js → gitGraphDiagram-K3NZZRJ6-BMgjjVys.js} +1 -1
- package/dist/web/assets/{graphlib-BcsNnGcW.js → graphlib-BWe1iK_s.js} +1 -1
- package/dist/web/assets/index-OqgGFmh8.js +26 -0
- package/dist/web/assets/index-vA7juDri.css +2 -0
- package/dist/web/assets/info-3K5VOQVL-BDU2_bYD.js +1 -0
- package/dist/web/assets/infoDiagram-LFFYTUFH-Diq4Cyc3.js +2 -0
- package/dist/web/assets/input-BHj0veau.js +45 -0
- package/dist/web/assets/{isEmpty-bnrF3Qbc.js → isEmpty-BfLnxq-B.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-PHBUUO56-D05_LyL7.js → ishikawaDiagram-PHBUUO56-CiVEvp8o.js} +1 -1
- package/dist/web/assets/{journeyDiagram-4ABVD52K-B_L20qMe.js → journeyDiagram-4ABVD52K-CG_v5Aho.js} +1 -1
- package/dist/web/assets/jsx-runtime-BRW_vwa9.js +1 -0
- package/dist/web/assets/{kanban-definition-K7BYSVSG-CZ535BbZ.js → kanban-definition-K7BYSVSG-miB0-_Zq.js} +1 -1
- package/dist/web/assets/keybindings-store-BQxgPV5o.js +1 -0
- package/dist/web/assets/{line-CVvo3dRu.js → line-CSuSrJ9J.js} +1 -1
- package/dist/web/assets/{linear-DP4mkX3m.js → linear-DFN_MPsw.js} +1 -1
- package/dist/web/assets/markdown-renderer-CRy8xw2B.js +306 -0
- package/dist/web/assets/{mermaid-parser.core-C7UwoIh6.js → mermaid-parser.core-CFdP1Z5_.js} +2 -2
- package/dist/web/assets/{mindmap-definition-YRQLILUH-x0MTutJp.js → mindmap-definition-YRQLILUH-pYPWwASE.js} +1 -1
- package/dist/web/assets/{ordinal-_K3x1fkz.js → ordinal-DpFn432U.js} +1 -1
- package/dist/web/assets/packet-RMMSAZCW-BwpIpYB3.js +1 -0
- package/dist/web/assets/pie-UPGHQEXC-BPgAfmes.js +1 -0
- package/dist/web/assets/{pieDiagram-SKSYHLDU-C1Gjrtzy.js → pieDiagram-SKSYHLDU-Dovdlvhu.js} +1 -1
- package/dist/web/assets/plus-DQGIb4mQ.js +1 -0
- package/dist/web/assets/port-forwarding-tab-Biua8ov5.js +1 -0
- package/dist/web/assets/{postgres-viewer-BQdPMowm.js → postgres-viewer-BcVjCAl4.js} +3 -3
- package/dist/web/assets/{quadrantDiagram-337W2JSQ-C8bzJCjQ.js → quadrantDiagram-337W2JSQ-TXe6cU_F.js} +1 -1
- package/dist/web/assets/radar-KQ55EAFF-TqxBkWx-.js +1 -0
- package/dist/web/assets/refresh-cw-Clk8fdUD.js +1 -0
- package/dist/web/assets/{requirementDiagram-Z7DCOOCP-pQyah6WB.js → requirementDiagram-Z7DCOOCP-CuiiuGS9.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-WA2Y5GQK-T6RgG-N8.js → sankeyDiagram-WA2Y5GQK-BbRmhv0t.js} +1 -1
- package/dist/web/assets/scroll-area-BpXCNme3.js +1 -0
- package/dist/web/assets/{sequenceDiagram-2WXFIKYE-BQDJ4CVs.js → sequenceDiagram-2WXFIKYE-B2D8IQDb.js} +1 -1
- package/dist/web/assets/settings-tab-C9X-N8hE.js +1 -0
- package/dist/web/assets/{sql-query-editor-CY61vWBg.js → sql-query-editor-BFvRvJn0.js} +1 -1
- package/dist/web/assets/sqlite-viewer-CPfvwFl4.js +1 -0
- package/dist/web/assets/square-vBdqj0bF.js +1 -0
- package/dist/web/assets/{stateDiagram-RAJIS63D-66vhiIuk.js → stateDiagram-RAJIS63D-ylr4HxPu.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-FVOUBMTO-D6zvxf3M.js +1 -0
- package/dist/web/assets/table-Bi27fEaN.js +1 -0
- package/dist/web/assets/{terminal-tab-TIJmxHl6.js → terminal-tab-mWwk_weB.js} +2 -2
- package/dist/web/assets/text-wrap-D_OmSzhp.js +1 -0
- package/dist/web/assets/{timeline-definition-YZTLITO2-DwZqB3nn.js → timeline-definition-YZTLITO2-pMv1grvM.js} +1 -1
- package/dist/web/assets/trash-2-CNuB-htI.js +1 -0
- package/dist/web/assets/treemap-KZPCXAKY-Kck06FKU.js +1 -0
- package/dist/web/assets/{use-monaco-theme-BHn-LEm7.js → use-monaco-theme-CPaeSMAA.js} +1 -1
- package/dist/web/assets/{vennDiagram-LZ73GAT5-s9Z71fz-.js → vennDiagram-LZ73GAT5-C-rkIUbo.js} +1 -1
- package/dist/web/assets/x-Dw3TjeY_.js +1 -0
- package/dist/web/assets/{xychartDiagram-JWTSCODW-DRa_TH4B.js → xychartDiagram-JWTSCODW-CtpjAakO.js} +1 -1
- package/dist/web/index.html +18 -12
- package/dist/web/sw.js +1 -1
- package/docs/codebase-summary.md +134 -11
- package/docs/extension-development-guide.md +98 -1
- package/docs/journals/260414-1400-ext-git-graph-port-complete.md +147 -0
- package/docs/journals/260414-1452-git-graph-faithful-port.md +144 -0
- package/docs/journals/260414-1810-git-graph-ui-improvements-complete.md +261 -0
- package/docs/journals/260414-2001-bundled-extensions.md +219 -0
- package/docs/project-changelog.md +63 -22
- package/docs/project-roadmap.md +1 -0
- package/docs/system-architecture.md +33 -5
- package/package.json +9 -3
- package/packages/ext-git-graph/package.json +30 -0
- package/packages/ext-git-graph/src/extension-integration.test.ts +230 -0
- package/packages/ext-git-graph/src/extension-parsers.test.ts +193 -0
- package/packages/ext-git-graph/src/extension.ts +800 -0
- package/packages/ext-git-graph/src/git-log-parser.test.ts +271 -0
- package/packages/ext-git-graph/src/git-log-parser.ts +38 -0
- package/packages/ext-git-graph/src/types.ts +181 -0
- package/packages/ext-git-graph/src/webview-html.test.ts +142 -0
- package/packages/ext-git-graph/src/webview-html.ts +2199 -0
- package/packages/vscode-compat/src/index.ts +4 -0
- package/packages/vscode-compat/src/process.ts +25 -0
- package/packages/vscode-compat/src/window.ts +10 -0
- package/src/cli/commands/ext-cmd.ts +3 -1
- package/src/server/index.ts +1 -1
- package/src/server/ws/extensions.ts +6 -2
- package/src/services/contribution-registry.ts +14 -1
- package/src/services/extension-host-worker.ts +7 -3
- package/src/services/extension-manifest.ts +18 -1
- package/src/services/extension-rpc-handlers.ts +68 -2
- package/src/services/extension.service.ts +46 -6
- package/src/types/extension-messages.ts +2 -0
- package/src/types/extension.ts +8 -0
- package/src/web/components/editor/code-editor.tsx +83 -8
- package/src/web/components/editor/save-as-dialog.tsx +75 -0
- package/src/web/components/extensions/extension-webview.tsx +111 -12
- package/src/web/components/layout/command-palette.tsx +43 -17
- package/src/web/components/layout/draggable-tab.tsx +120 -67
- package/src/web/components/layout/editor-panel.tsx +15 -4
- package/src/web/components/layout/mobile-nav.tsx +74 -7
- package/src/web/components/layout/tab-bar.tsx +76 -4
- package/src/web/components/layout/tab-content.tsx +12 -5
- package/src/web/components/layout/upgrade-banner.tsx +3 -0
- package/src/web/components/settings/keyboard-shortcuts-section.tsx +46 -1
- package/src/web/components/shared/markdown-code-block.tsx +142 -0
- package/src/web/components/shared/markdown-context.ts +20 -0
- package/src/web/components/shared/markdown-renderer.tsx +113 -288
- package/src/web/hooks/use-extension-ws.ts +22 -4
- package/src/web/hooks/use-global-keybindings.ts +31 -2
- package/src/web/hooks/use-url-sync.ts +8 -3
- package/src/web/main.tsx +1 -0
- package/src/web/stores/keybindings-store.ts +3 -3
- package/src/web/stores/panel-store.ts +2 -2
- package/src/web/stores/panel-utils.ts +17 -2
- package/src/web/stores/tab-store.ts +17 -1
- package/src/web/styles/globals.css +6 -0
- package/.opencode/.env.example +0 -98
- package/.opencode/skills/ads-management/scripts/.env.example +0 -13
- package/.opencode/skills/ai-multimodal/.env.example +0 -230
- package/.opencode/skills/cip-design/.env.example +0 -6
- package/.opencode/skills/devops/.env.example +0 -76
- package/.opencode/skills/docs-seeker/.env.example +0 -15
- package/.opencode/skills/elevenlabs/.env.example +0 -3
- package/.opencode/skills/marketing-dashboard/.env.example +0 -15
- package/.opencode/skills/marketing-dashboard/app/.env.example +0 -2
- package/.opencode/skills/marketing-dashboard/server/.env.example +0 -2
- package/.opencode/skills/mcp-management/scripts/dist/analyze-tools.js +0 -70
- package/.opencode/skills/mcp-management/scripts/dist/cli.js +0 -160
- package/.opencode/skills/mcp-management/scripts/dist/mcp-client.js +0 -183
- package/.opencode/skills/payment-integration/scripts/.env.example +0 -20
- package/.opencode/skills/sequential-thinking/.env.example +0 -8
- package/dist/web/assets/architecture-PBZL5I3N-DEO2f3VD.js +0 -1
- package/dist/web/assets/arrow-up-BYhx9ckd.js +0 -1
- package/dist/web/assets/channel-By7bn0Yq.js +0 -1
- package/dist/web/assets/chat-tab-CT2XUgsc.js +0 -10
- package/dist/web/assets/chevron-right-4zq1jPv6.js +0 -1
- package/dist/web/assets/chunk-GLR3WWYH-DKikpoJM.js +0 -2
- package/dist/web/assets/chunk-HHEYEP7N-C7vxA5i9.js +0 -1
- package/dist/web/assets/chunk-QZHKN3VN-CYaTbeZf.js +0 -1
- package/dist/web/assets/classDiagram-VBA2DB6C-BA8Nj-_C.js +0 -1
- package/dist/web/assets/classDiagram-v2-RAHNMMFH-DjYu-6mn.js +0 -1
- package/dist/web/assets/clone-LRxlvnMj.js +0 -1
- package/dist/web/assets/code-editor-DQiPtcNd.js +0 -8
- package/dist/web/assets/columns-2-BoZAN-iw.js +0 -1
- package/dist/web/assets/createLucideIcon-PuMiQgHl.js +0 -1
- package/dist/web/assets/diff-viewer-CTwcVIP_.js +0 -4
- package/dist/web/assets/dist-DIV6WgAG.js +0 -41
- package/dist/web/assets/extension-webview-pU1xJyoc.js +0 -3
- package/dist/web/assets/git-graph-BnFbmpom.js +0 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-Bwna3and.js +0 -1
- package/dist/web/assets/index-CP9KnaGh.js +0 -30
- package/dist/web/assets/index-Cxz7oGXY.css +0 -2
- package/dist/web/assets/info-3K5VOQVL-_vRxVNUm.js +0 -1
- package/dist/web/assets/infoDiagram-LFFYTUFH-DWwumDkq.js +0 -2
- package/dist/web/assets/jsx-runtime-kMwlnEGE.js +0 -1
- package/dist/web/assets/keybindings-store-DdhEeehv.js +0 -1
- package/dist/web/assets/markdown-renderer-BjYurPV4.js +0 -326
- package/dist/web/assets/packet-RMMSAZCW-DY5PNnZU.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-BHncZutv.js +0 -1
- package/dist/web/assets/port-forwarding-tab-Bgr8dmsw.js +0 -1
- package/dist/web/assets/radar-KQ55EAFF-DH0AOkUy.js +0 -1
- package/dist/web/assets/settings-tab-BNoboN6E.js +0 -1
- package/dist/web/assets/sqlite-viewer-srSbGg1D.js +0 -1
- package/dist/web/assets/square-oPKIkJiw.js +0 -1
- package/dist/web/assets/stateDiagram-v2-FVOUBMTO-BGVqj_g9.js +0 -1
- package/dist/web/assets/table-DFevCOMd.js +0 -1
- package/dist/web/assets/tag-CXMT0QB6.js +0 -1
- package/dist/web/assets/text-wrap-BWNOVswA.js +0 -1
- package/dist/web/assets/treemap-KZPCXAKY-B2Xkyv-K.js +0 -1
- package/dist/web/assets/x-D2_KzIET.js +0 -1
- package/src/web/components/git/git-graph-branch-label.tsx +0 -124
- package/src/web/components/git/git-graph-constants.ts +0 -185
- package/src/web/components/git/git-graph-detail.tsx +0 -107
- package/src/web/components/git/git-graph-dialog.tsx +0 -72
- package/src/web/components/git/git-graph-row.tsx +0 -167
- package/src/web/components/git/git-graph-settings-dialog.tsx +0 -104
- package/src/web/components/git/git-graph-svg.tsx +0 -54
- package/src/web/components/git/git-graph-toolbar.tsx +0 -195
- package/src/web/components/git/git-graph.tsx +0 -193
- package/src/web/components/git/use-column-resize.ts +0 -33
- package/src/web/components/git/use-git-graph.ts +0 -201
- /package/dist/web/assets/{api-client-BfBM3I7n.js → api-client-BvxmRZUi.js} +0 -0
- /package/dist/web/assets/{array-B9UHiPd-.js → array-BFDiaBgf.js} +0 -0
- /package/dist/web/assets/{csv-parser-CNNw2RVA.js → csv-parser-i7fjqP2H.js} +0 -0
- /package/dist/web/assets/{cytoscape.esm-BW-DbntU.js → cytoscape.esm-C8i2jUzT.js} +0 -0
- /package/dist/web/assets/{defaultLocale-5eAKkKJC.js → defaultLocale-ZeknFqNe.js} +0 -0
- /package/dist/web/assets/{dist-CSJdAyA9.js → dist-DZmJeHOA.js} +0 -0
- /package/dist/web/assets/{init-DlZdxViB.js → init-0VJVrkRJ.js} +0 -0
- /package/dist/web/assets/{isArrayLikeObject-B_v2FtYn.js → isArrayLikeObject-ClzWCpcm.js} +0 -0
- /package/dist/web/assets/{katex-Bqvo_ZG0.js → katex-DR0kdMDv.js} +0 -0
- /package/dist/web/assets/{lib-DurwGtQO.js → lib-CeBVkQ-7.js} +0 -0
- /package/dist/web/assets/{math-069Z4SuC.js → math-CRc16Nj6.js} +0 -0
- /package/dist/web/assets/{path-6uRLdFF7.js → path-INs8XTPH.js} +0 -0
- /package/dist/web/assets/{preload-helper-Bf_JiD2A.js → preload-helper-mr3rCizq.js} +0 -0
- /package/dist/web/assets/{react-SKk5z-bm.js → react-0tkk-ztn.js} +0 -0
- /package/dist/web/assets/{rough.esm-JX0wREDd.js → rough.esm-eLccZ4OJ.js} +0 -0
- /package/dist/web/assets/{sql-completion-provider-DM9Qov6L.js → sql-completion-provider-B8uUWWej.js} +0 -0
- /package/dist/web/assets/{src-BqX54PbV.js → src-CqyWLlNZ.js} +0 -0
- /package/dist/web/assets/{utils-BNytJOb1.js → utils-DX8jb5qv.js} +0 -0
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
import { useState, useRef, useCallback } from "react";
|
|
2
|
-
import { Loader2 } from "lucide-react";
|
|
3
|
-
import { Button } from "@/components/ui/button";
|
|
4
|
-
import { LANE_WIDTH, ROW_HEIGHT } from "./git-graph-constants";
|
|
5
|
-
import { useGitGraph } from "./use-git-graph";
|
|
6
|
-
import { useColumnResize } from "./use-column-resize";
|
|
7
|
-
import { GitGraphToolbar } from "./git-graph-toolbar";
|
|
8
|
-
import { GitGraphSvg } from "./git-graph-svg";
|
|
9
|
-
import { GitGraphRow } from "./git-graph-row";
|
|
10
|
-
import { GitGraphDetail } from "./git-graph-detail";
|
|
11
|
-
import { GitGraphDialog } from "./git-graph-dialog";
|
|
12
|
-
import { GitGraphSettingsDialog } from "./git-graph-settings-dialog";
|
|
13
|
-
|
|
14
|
-
interface GitGraphProps {
|
|
15
|
-
metadata?: Record<string, unknown>;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function GitGraph({ metadata }: GitGraphProps) {
|
|
19
|
-
const projectName = metadata?.projectName as string | undefined;
|
|
20
|
-
const g = useGitGraph(projectName);
|
|
21
|
-
const [dialogState, setDialogState] = useState<{
|
|
22
|
-
type: "branch" | "tag" | null;
|
|
23
|
-
hash?: string;
|
|
24
|
-
}>({ type: null });
|
|
25
|
-
const [showSettings, setShowSettings] = useState(false);
|
|
26
|
-
|
|
27
|
-
// Resizable graph column — use ref to avoid stale closure
|
|
28
|
-
const isMobile = typeof window !== "undefined" && window.innerWidth < 768;
|
|
29
|
-
const defaultGraphW = (isMobile ? 6 : 10) * LANE_WIDTH + LANE_WIDTH;
|
|
30
|
-
const [graphColWidth, setGraphColWidth] = useState(defaultGraphW);
|
|
31
|
-
const graphWidthRef = useRef(defaultGraphW);
|
|
32
|
-
graphWidthRef.current = graphColWidth;
|
|
33
|
-
const graphDragging = useRef(false);
|
|
34
|
-
|
|
35
|
-
const startGraphResize = (startX: number) => {
|
|
36
|
-
graphDragging.current = true;
|
|
37
|
-
const startW = graphWidthRef.current;
|
|
38
|
-
const onMove = (ev: MouseEvent | TouchEvent) => {
|
|
39
|
-
if (!graphDragging.current) return;
|
|
40
|
-
const cx = "touches" in ev ? ev.touches[0]!.clientX : ev.clientX;
|
|
41
|
-
setGraphColWidth(Math.max(40, startW + cx - startX));
|
|
42
|
-
};
|
|
43
|
-
const onUp = () => {
|
|
44
|
-
graphDragging.current = false;
|
|
45
|
-
window.removeEventListener("mousemove", onMove);
|
|
46
|
-
window.removeEventListener("mouseup", onUp);
|
|
47
|
-
window.removeEventListener("touchmove", onMove);
|
|
48
|
-
window.removeEventListener("touchend", onUp);
|
|
49
|
-
};
|
|
50
|
-
window.addEventListener("mousemove", onMove);
|
|
51
|
-
window.addEventListener("mouseup", onUp);
|
|
52
|
-
window.addEventListener("touchmove", onMove, { passive: false });
|
|
53
|
-
window.addEventListener("touchend", onUp);
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
// Resizable table columns (Date, Author, Commit)
|
|
57
|
-
const { widths: colW, startResize } = useColumnResize({ date: 80, author: 120, commit: 70 });
|
|
58
|
-
|
|
59
|
-
// Infinite scroll — ref-based to avoid stale closure
|
|
60
|
-
const loadMoreRef = useRef(g.loadMore);
|
|
61
|
-
loadMoreRef.current = g.loadMore;
|
|
62
|
-
const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {
|
|
63
|
-
const el = e.currentTarget;
|
|
64
|
-
if (el.scrollHeight - el.scrollTop - el.clientHeight < 200) {
|
|
65
|
-
loadMoreRef.current();
|
|
66
|
-
}
|
|
67
|
-
}, []);
|
|
68
|
-
|
|
69
|
-
if (!projectName) return <EmptyState msg="No project selected." />;
|
|
70
|
-
if (g.loading && !g.data) return <LoadingState />;
|
|
71
|
-
if (g.error && !g.data) return <ErrorState error={g.error} onRetry={g.fetchGraph} />;
|
|
72
|
-
|
|
73
|
-
return (
|
|
74
|
-
<div className="flex flex-col h-full">
|
|
75
|
-
<GitGraphToolbar
|
|
76
|
-
branches={g.data?.branches ?? []} branchFilter={g.branchFilter}
|
|
77
|
-
onBranchFilterChange={g.setBranchFilter} searchQuery={g.searchQuery}
|
|
78
|
-
onSearchQueryChange={g.setSearchQuery} showSearch={g.showSearch}
|
|
79
|
-
onToggleSearch={() => g.setShowSearch(!g.showSearch)}
|
|
80
|
-
onFetch={g.fetchFromRemotes} onRefresh={g.fetchGraph}
|
|
81
|
-
onOpenSettings={() => setShowSettings(true)}
|
|
82
|
-
loading={g.loading} acting={g.acting} projectName={projectName}
|
|
83
|
-
/>
|
|
84
|
-
{g.error && <div className="px-3 py-1.5 text-xs text-destructive bg-destructive/10">{g.error}</div>}
|
|
85
|
-
|
|
86
|
-
<div className="flex-1 overflow-auto" onScroll={handleScroll}>
|
|
87
|
-
<div className="flex min-w-max md:min-w-0">
|
|
88
|
-
{/* Graph SVG column — overflow-hidden clips lanes beyond column width */}
|
|
89
|
-
<div className="sticky left-0 z-10 shrink-0 bg-background relative overflow-hidden" style={{ width: `${graphColWidth}px` }}>
|
|
90
|
-
<div className="text-[11px] font-semibold text-muted-foreground px-2 border-b bg-background sticky top-0 z-20"
|
|
91
|
-
style={{ height: `${ROW_HEIGHT}px`, lineHeight: `${ROW_HEIGHT}px` }}>Graph</div>
|
|
92
|
-
<GitGraphSvg commits={g.filteredCommits} laneMap={g.filteredLanes.laneMap}
|
|
93
|
-
svgPaths={g.svgPaths} width={(g.filteredLanes.maxLane + 2) * LANE_WIDTH} height={g.svgHeight} headHash={g.headHash} />
|
|
94
|
-
<div className="absolute top-0 right-0 w-1.5 h-full cursor-col-resize hover:bg-primary/30"
|
|
95
|
-
onMouseDown={(e) => { e.preventDefault(); startGraphResize(e.clientX); }}
|
|
96
|
-
onTouchStart={(e) => startGraphResize(e.touches[0]!.clientX)} />
|
|
97
|
-
</div>
|
|
98
|
-
|
|
99
|
-
{/* Commit table */}
|
|
100
|
-
<div className="flex-1 min-w-[400px]">
|
|
101
|
-
<table className="w-full border-collapse text-xs" style={{ tableLayout: "fixed" }}>
|
|
102
|
-
<colgroup>
|
|
103
|
-
<col />
|
|
104
|
-
<col style={{ width: `${colW.date}px` }} />
|
|
105
|
-
<col style={{ width: `${colW.author}px` }} />
|
|
106
|
-
<col style={{ width: `${colW.commit}px` }} />
|
|
107
|
-
</colgroup>
|
|
108
|
-
<thead className="sticky top-0 z-10 bg-background">
|
|
109
|
-
<tr className="border-b text-[11px] font-semibold text-muted-foreground" style={{ height: `${ROW_HEIGHT}px` }}>
|
|
110
|
-
<th className="text-left px-2 font-semibold">Description</th>
|
|
111
|
-
<ResizableTh label="Date" colKey="date" onStartResize={startResize} />
|
|
112
|
-
<ResizableTh label="Author" colKey="author" onStartResize={startResize} />
|
|
113
|
-
<th className="text-left px-2 font-semibold">Commit</th>
|
|
114
|
-
</tr>
|
|
115
|
-
</thead>
|
|
116
|
-
<tbody>
|
|
117
|
-
{g.filteredCommits.map((commit) => (
|
|
118
|
-
<GitGraphRow key={commit.hash} commit={commit}
|
|
119
|
-
lane={g.filteredLanes.laneMap.get(commit.hash) ?? 0}
|
|
120
|
-
isSelected={g.selectedCommit?.hash === commit.hash}
|
|
121
|
-
isHead={commit.hash === g.headHash}
|
|
122
|
-
labels={g.commitLabels.get(commit.hash) ?? []}
|
|
123
|
-
currentBranch={g.currentBranch}
|
|
124
|
-
onSelect={() => g.selectCommit(commit)}
|
|
125
|
-
onCheckout={g.handleCheckout} onCherryPick={g.handleCherryPick}
|
|
126
|
-
onRevert={g.handleRevert} onMerge={g.handleMerge}
|
|
127
|
-
onDeleteBranch={g.handleDeleteBranch} onPushBranch={g.handlePushBranch}
|
|
128
|
-
onCreatePr={g.handleCreatePr}
|
|
129
|
-
onOpenCreateBranch={(h) => setDialogState({ type: "branch", hash: h })}
|
|
130
|
-
onOpenCreateTag={(h) => setDialogState({ type: "tag", hash: h })}
|
|
131
|
-
onOpenDiff={() => g.openDiffForCommit(commit)}
|
|
132
|
-
onCopyHash={() => g.copyHash(commit.hash)} />
|
|
133
|
-
))}
|
|
134
|
-
</tbody>
|
|
135
|
-
</table>
|
|
136
|
-
{g.loadingMore && (
|
|
137
|
-
<div className="flex items-center justify-center gap-2 py-3 text-xs text-muted-foreground">
|
|
138
|
-
<Loader2 className="size-3.5 animate-spin" /> Loading more commits...
|
|
139
|
-
</div>
|
|
140
|
-
)}
|
|
141
|
-
{!g.hasMore && g.data && g.data.commits.length > 0 && (
|
|
142
|
-
<div className="text-center py-2 text-xs text-muted-foreground">
|
|
143
|
-
{g.data.commits.length} commits loaded
|
|
144
|
-
</div>
|
|
145
|
-
)}
|
|
146
|
-
</div>
|
|
147
|
-
</div>
|
|
148
|
-
</div>
|
|
149
|
-
|
|
150
|
-
{g.selectedCommit && projectName && (
|
|
151
|
-
<GitGraphDetail commit={g.selectedCommit} files={g.commitFiles}
|
|
152
|
-
loadingDetail={g.loadingDetail} projectName={projectName}
|
|
153
|
-
onClose={() => g.setSelectedCommit(null)} copyHash={g.copyHash} />
|
|
154
|
-
)}
|
|
155
|
-
<GitGraphDialog type={dialogState.type} hash={dialogState.hash}
|
|
156
|
-
onClose={() => setDialogState({ type: null })}
|
|
157
|
-
onCreateBranch={g.handleCreateBranch} onCreateTag={g.handleCreateTag} />
|
|
158
|
-
<GitGraphSettingsDialog open={showSettings} onClose={() => setShowSettings(false)}
|
|
159
|
-
projectName={projectName} branches={g.data?.branches ?? []} />
|
|
160
|
-
</div>
|
|
161
|
-
);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
function ResizableTh({ label, colKey, onStartResize }: {
|
|
165
|
-
label: string; colKey: string; onStartResize: (key: string, x: number) => void;
|
|
166
|
-
}) {
|
|
167
|
-
return (
|
|
168
|
-
<th className="text-left px-2 font-semibold relative">
|
|
169
|
-
{label}
|
|
170
|
-
<div className="absolute top-0 right-0 w-1.5 h-full cursor-col-resize hover:bg-primary/30"
|
|
171
|
-
onMouseDown={(e) => { e.preventDefault(); onStartResize(colKey, e.clientX); }}
|
|
172
|
-
onTouchStart={(e) => onStartResize(colKey, e.touches[0]!.clientX)} />
|
|
173
|
-
</th>
|
|
174
|
-
);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
function EmptyState({ msg }: { msg: string }) {
|
|
178
|
-
return <div className="flex items-center justify-center h-full text-muted-foreground text-sm">{msg}</div>;
|
|
179
|
-
}
|
|
180
|
-
function LoadingState() {
|
|
181
|
-
return (
|
|
182
|
-
<div className="flex items-center justify-center h-full gap-2 text-muted-foreground">
|
|
183
|
-
<Loader2 className="size-5 animate-spin" /><span className="text-sm">Loading git graph...</span>
|
|
184
|
-
</div>
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
function ErrorState({ error, onRetry }: { error: string; onRetry: () => void }) {
|
|
188
|
-
return (
|
|
189
|
-
<div className="flex flex-col items-center justify-center h-full gap-2 text-destructive text-sm">
|
|
190
|
-
<p>{error}</p><Button variant="outline" size="sm" onClick={onRetry}>Retry</Button>
|
|
191
|
-
</div>
|
|
192
|
-
);
|
|
193
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { useState, useRef } from "react";
|
|
2
|
-
|
|
3
|
-
/** Generic column resize hook — uses refs to avoid stale closures */
|
|
4
|
-
export function useColumnResize(initialWidths: Record<string, number>) {
|
|
5
|
-
const [widths, setWidths] = useState(initialWidths);
|
|
6
|
-
const widthsRef = useRef(initialWidths);
|
|
7
|
-
widthsRef.current = widths;
|
|
8
|
-
const dragging = useRef(false);
|
|
9
|
-
|
|
10
|
-
const startResize = (colKey: string, startX: number) => {
|
|
11
|
-
dragging.current = true;
|
|
12
|
-
const startW = widthsRef.current[colKey] ?? 80;
|
|
13
|
-
const onMove = (ev: MouseEvent | TouchEvent) => {
|
|
14
|
-
if (!dragging.current) return;
|
|
15
|
-
const clientX = "touches" in ev ? ev.touches[0]!.clientX : ev.clientX;
|
|
16
|
-
const newW = Math.max(40, startW + clientX - startX);
|
|
17
|
-
setWidths((prev) => ({ ...prev, [colKey]: newW }));
|
|
18
|
-
};
|
|
19
|
-
const onUp = () => {
|
|
20
|
-
dragging.current = false;
|
|
21
|
-
window.removeEventListener("mousemove", onMove);
|
|
22
|
-
window.removeEventListener("mouseup", onUp);
|
|
23
|
-
window.removeEventListener("touchmove", onMove);
|
|
24
|
-
window.removeEventListener("touchend", onUp);
|
|
25
|
-
};
|
|
26
|
-
window.addEventListener("mousemove", onMove);
|
|
27
|
-
window.addEventListener("mouseup", onUp);
|
|
28
|
-
window.addEventListener("touchmove", onMove, { passive: false });
|
|
29
|
-
window.addEventListener("touchend", onUp);
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
return { widths, startResize };
|
|
33
|
-
}
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import { useEffect, useState, useCallback, useMemo, useRef } from "react";
|
|
2
|
-
import { api, projectUrl } from "@/lib/api-client";
|
|
3
|
-
import { useTabStore } from "@/stores/tab-store";
|
|
4
|
-
import type { GitGraphData, GitCommit } from "../../../types/git";
|
|
5
|
-
import { buildCommitLabels, computeLanes, computeSvgPaths, ROW_HEIGHT } from "./git-graph-constants";
|
|
6
|
-
|
|
7
|
-
const PAGE_SIZE = 200;
|
|
8
|
-
|
|
9
|
-
export function useGitGraph(projectName: string | undefined) {
|
|
10
|
-
const [data, setData] = useState<GitGraphData | null>(null);
|
|
11
|
-
const [loading, setLoading] = useState(true);
|
|
12
|
-
const [loadingMore, setLoadingMore] = useState(false);
|
|
13
|
-
const [hasMore, setHasMore] = useState(true);
|
|
14
|
-
const [error, setError] = useState<string | null>(null);
|
|
15
|
-
const [acting, setActing] = useState(false);
|
|
16
|
-
const [selectedCommit, setSelectedCommit] = useState<GitCommit | null>(null);
|
|
17
|
-
const [commitFiles, setCommitFiles] = useState<
|
|
18
|
-
Array<{ path: string; additions: number; deletions: number }>
|
|
19
|
-
>([]);
|
|
20
|
-
const [loadingDetail, setLoadingDetail] = useState(false);
|
|
21
|
-
const [branchFilter, setBranchFilter] = useState("__all__");
|
|
22
|
-
const [searchQuery, setSearchQuery] = useState("");
|
|
23
|
-
const [showSearch, setShowSearch] = useState(false);
|
|
24
|
-
const { openTab } = useTabStore();
|
|
25
|
-
const loadedCountRef = useRef(0);
|
|
26
|
-
|
|
27
|
-
const fetchGraph = useCallback(async () => {
|
|
28
|
-
if (!projectName) return;
|
|
29
|
-
try {
|
|
30
|
-
setLoading(true);
|
|
31
|
-
// Fetch at least PAGE_SIZE, but if we've loaded more via pagination, re-fetch all
|
|
32
|
-
const count = Math.max(PAGE_SIZE, loadedCountRef.current);
|
|
33
|
-
const result = await api.get<GitGraphData>(
|
|
34
|
-
`${projectUrl(projectName)}/git/graph?max=${count}`,
|
|
35
|
-
);
|
|
36
|
-
setData(result);
|
|
37
|
-
loadedCountRef.current = result.commits.length;
|
|
38
|
-
setHasMore(result.commits.length >= count);
|
|
39
|
-
setError(null);
|
|
40
|
-
} catch (e) {
|
|
41
|
-
setError(e instanceof Error ? e.message : "Failed to fetch graph");
|
|
42
|
-
} finally {
|
|
43
|
-
setLoading(false);
|
|
44
|
-
}
|
|
45
|
-
}, [projectName]);
|
|
46
|
-
|
|
47
|
-
const loadMore = useCallback(async () => {
|
|
48
|
-
if (!projectName || loadingMore || !hasMore) return;
|
|
49
|
-
try {
|
|
50
|
-
setLoadingMore(true);
|
|
51
|
-
const skip = loadedCountRef.current;
|
|
52
|
-
const result = await api.get<GitGraphData>(
|
|
53
|
-
`${projectUrl(projectName)}/git/graph?max=${PAGE_SIZE}&skip=${skip}`,
|
|
54
|
-
);
|
|
55
|
-
if (result.commits.length === 0) {
|
|
56
|
-
setHasMore(false);
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
setData((prev) => {
|
|
60
|
-
if (!prev) return result;
|
|
61
|
-
// Deduplicate by hash
|
|
62
|
-
const existing = new Set(prev.commits.map((c) => c.hash));
|
|
63
|
-
const newCommits = result.commits.filter((c) => !existing.has(c.hash));
|
|
64
|
-
// Merge branches: keep existing + add new remote-only branches
|
|
65
|
-
const existingBranches = new Set(prev.branches.map((b) => b.name));
|
|
66
|
-
const newBranches = result.branches.filter((b) => !existingBranches.has(b.name));
|
|
67
|
-
return {
|
|
68
|
-
commits: [...prev.commits, ...newCommits],
|
|
69
|
-
branches: [...prev.branches, ...newBranches],
|
|
70
|
-
head: prev.head,
|
|
71
|
-
};
|
|
72
|
-
});
|
|
73
|
-
loadedCountRef.current = skip + result.commits.length;
|
|
74
|
-
setHasMore(result.commits.length >= PAGE_SIZE);
|
|
75
|
-
} catch (e) {
|
|
76
|
-
setError(e instanceof Error ? e.message : "Failed to load more");
|
|
77
|
-
} finally {
|
|
78
|
-
setLoadingMore(false);
|
|
79
|
-
}
|
|
80
|
-
}, [projectName, loadingMore, hasMore]);
|
|
81
|
-
|
|
82
|
-
useEffect(() => {
|
|
83
|
-
fetchGraph();
|
|
84
|
-
const interval = setInterval(fetchGraph, 10000);
|
|
85
|
-
return () => clearInterval(interval);
|
|
86
|
-
}, [fetchGraph]);
|
|
87
|
-
|
|
88
|
-
const gitAction = async (path: string, body: Record<string, unknown>) => {
|
|
89
|
-
if (!projectName) return;
|
|
90
|
-
setActing(true);
|
|
91
|
-
try { await api.post(`${projectUrl(projectName)}${path}`, body); await fetchGraph(); }
|
|
92
|
-
catch (e) { setError(e instanceof Error ? e.message : "Action failed"); }
|
|
93
|
-
finally { setActing(false); }
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
const fetchFromRemotes = () => gitAction("/git/fetch", {});
|
|
97
|
-
const handleCheckout = (ref: string) => gitAction("/git/checkout", { ref });
|
|
98
|
-
const handleCherryPick = (hash: string) => gitAction("/git/cherry-pick", { hash });
|
|
99
|
-
const handleRevert = (hash: string) => gitAction("/git/revert", { hash });
|
|
100
|
-
const handleMerge = (source: string) => gitAction("/git/merge", { source });
|
|
101
|
-
const handleDeleteBranch = (name: string) => gitAction("/git/branch/delete", { name });
|
|
102
|
-
const handlePushBranch = (branch: string) => gitAction("/git/push", { branch });
|
|
103
|
-
const handleCreateTag = (name: string, hash?: string) => gitAction("/git/tag", { name, hash });
|
|
104
|
-
const copyHash = (hash: string) => navigator.clipboard.writeText(hash);
|
|
105
|
-
|
|
106
|
-
const handleCreateBranch = async (name: string, from: string) => {
|
|
107
|
-
const exists = data?.branches.some((b) => b.name === name || b.name.endsWith(`/${name}`));
|
|
108
|
-
if (exists) {
|
|
109
|
-
if (!window.confirm(`Branch "${name}" already exists.\nDelete and recreate from this commit?`)) return;
|
|
110
|
-
await gitAction("/git/branch/delete", { name });
|
|
111
|
-
}
|
|
112
|
-
await gitAction("/git/branch/create", { name, from });
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
const handleCreatePr = async (branch: string) => {
|
|
116
|
-
if (!projectName) return;
|
|
117
|
-
try {
|
|
118
|
-
const r = await api.get<{ url: string | null }>(`${projectUrl(projectName)}/git/pr-url?branch=${encodeURIComponent(branch)}`);
|
|
119
|
-
if (r.url) window.open(r.url, "_blank");
|
|
120
|
-
} catch { /* silent */ }
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
const selectCommit = async (commit: GitCommit) => {
|
|
124
|
-
if (selectedCommit?.hash === commit.hash) { setSelectedCommit(null); return; }
|
|
125
|
-
setSelectedCommit(commit);
|
|
126
|
-
setLoadingDetail(true);
|
|
127
|
-
try {
|
|
128
|
-
const parent = commit.parents[0] ?? "";
|
|
129
|
-
const ref1Param = parent ? `ref1=${encodeURIComponent(parent)}&` : "";
|
|
130
|
-
const files = await api.get<Array<{ path: string; additions: number; deletions: number }>>(
|
|
131
|
-
`${projectUrl(projectName!)}/git/diff-stat?${ref1Param}ref2=${encodeURIComponent(commit.hash)}`);
|
|
132
|
-
setCommitFiles(Array.isArray(files) ? files : []);
|
|
133
|
-
} catch { setCommitFiles([]); }
|
|
134
|
-
finally { setLoadingDetail(false); }
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
const openDiffForCommit = (commit: GitCommit) => openTab({
|
|
138
|
-
type: "git-diff", title: `Diff ${commit.abbreviatedHash}`, closable: true,
|
|
139
|
-
metadata: { projectName, ref1: commit.parents[0] ?? undefined, ref2: commit.hash },
|
|
140
|
-
projectId: projectName ?? null,
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
// --- Computed ---
|
|
144
|
-
const commitLabels = useMemo(() => buildCommitLabels(data), [data]);
|
|
145
|
-
const currentBranch = data?.branches.find((b) => b.current);
|
|
146
|
-
const headHash = data?.head ?? "";
|
|
147
|
-
|
|
148
|
-
const filteredCommits = useMemo(() => {
|
|
149
|
-
if (!data) return [];
|
|
150
|
-
let commits = data.commits;
|
|
151
|
-
if (branchFilter !== "__all__") {
|
|
152
|
-
const branch = data.branches.find((b) => b.name === branchFilter);
|
|
153
|
-
if (branch) {
|
|
154
|
-
const reachable = new Set<string>();
|
|
155
|
-
const queue = [branch.commitHash];
|
|
156
|
-
while (queue.length > 0) {
|
|
157
|
-
const hash = queue.pop()!;
|
|
158
|
-
if (reachable.has(hash)) continue;
|
|
159
|
-
reachable.add(hash);
|
|
160
|
-
const c = data.commits.find((cm) => cm.hash === hash);
|
|
161
|
-
if (c) queue.push(...c.parents);
|
|
162
|
-
}
|
|
163
|
-
commits = commits.filter((c) => reachable.has(c.hash));
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
if (searchQuery.trim()) {
|
|
167
|
-
const q = searchQuery.toLowerCase();
|
|
168
|
-
commits = commits.filter(
|
|
169
|
-
(c) =>
|
|
170
|
-
c.subject.toLowerCase().includes(q) ||
|
|
171
|
-
c.authorName.toLowerCase().includes(q) ||
|
|
172
|
-
c.abbreviatedHash.includes(q) ||
|
|
173
|
-
c.hash.includes(q),
|
|
174
|
-
);
|
|
175
|
-
}
|
|
176
|
-
return commits;
|
|
177
|
-
}, [data, branchFilter, searchQuery]);
|
|
178
|
-
|
|
179
|
-
const filteredData = useMemo(() => (data ? { ...data, commits: filteredCommits } : null), [data, filteredCommits]);
|
|
180
|
-
const filteredLanes = useMemo(() => computeLanes(filteredData), [filteredData]);
|
|
181
|
-
const svgHeight = filteredCommits.length * ROW_HEIGHT + ROW_HEIGHT * 2; // extra padding for unloaded-parent lines
|
|
182
|
-
const svgPaths = useMemo(
|
|
183
|
-
() => computeSvgPaths(filteredData, filteredLanes.laneMap, filteredLanes.unloadedParentLanes, svgHeight),
|
|
184
|
-
[filteredData, filteredLanes.laneMap, filteredLanes.unloadedParentLanes, svgHeight]);
|
|
185
|
-
|
|
186
|
-
return {
|
|
187
|
-
data, loading, loadingMore, hasMore, error, acting,
|
|
188
|
-
selectedCommit, setSelectedCommit,
|
|
189
|
-
commitFiles, loadingDetail,
|
|
190
|
-
branchFilter, setBranchFilter,
|
|
191
|
-
searchQuery, setSearchQuery,
|
|
192
|
-
showSearch, setShowSearch,
|
|
193
|
-
fetchGraph, fetchFromRemotes, loadMore,
|
|
194
|
-
handleCheckout, handleCherryPick, handleRevert,
|
|
195
|
-
handleMerge, handleDeleteBranch, handlePushBranch,
|
|
196
|
-
handleCreateBranch, handleCreateTag, handleCreatePr,
|
|
197
|
-
copyHash, selectCommit, openDiffForCommit,
|
|
198
|
-
commitLabels, currentBranch, headHash,
|
|
199
|
-
filteredCommits, filteredLanes, svgHeight, svgPaths,
|
|
200
|
-
};
|
|
201
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/web/assets/{sql-completion-provider-DM9Qov6L.js → sql-completion-provider-B8uUWWej.js}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|