@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.
Files changed (252) hide show
  1. package/260413-1354-new-file-editor-tab/reports/code-reviewer-260413-1420-new-file-tab-review.md +210 -0
  2. package/CHANGELOG.md +23 -0
  3. package/bun.lock +259 -9
  4. package/dist/web/assets/{_basePickBy-5PGDJbfF.js → _basePickBy-Bj0dI1ei.js} +1 -1
  5. package/dist/web/assets/{_baseUniq-BT4Ow4Kk.js → _baseUniq-CyzdZeQH.js} +1 -1
  6. package/dist/web/assets/ai-settings-section-Bo9lCaTd.js +1 -0
  7. package/dist/web/assets/{api-settings-Bn-bIxD1.js → api-settings-CUxg9RE5.js} +1 -1
  8. package/dist/web/assets/{arc-BAOivWpI.js → arc-CxgHJ7Z4.js} +1 -1
  9. package/dist/web/assets/architecture-PBZL5I3N-DDFO_NKq.js +1 -0
  10. package/dist/web/assets/{architectureDiagram-2XIMDMQ5-Z-4eN4za.js → architectureDiagram-2XIMDMQ5-D16OotsC.js} +1 -1
  11. package/dist/web/assets/arrow-up-I9-21gkR.js +1 -0
  12. package/dist/web/assets/{blockDiagram-WCTKOSBZ-BCLqzhuZ.js → blockDiagram-WCTKOSBZ-Ct57Wtfk.js} +1 -1
  13. package/dist/web/assets/{c4Diagram-IC4MRINW-0Vp0Jeas.js → c4Diagram-IC4MRINW-BIymcNsg.js} +1 -1
  14. package/dist/web/assets/channel-wumTB1if.js +1 -0
  15. package/dist/web/assets/chat-tab-BEEd-Km4.js +10 -0
  16. package/dist/web/assets/chevron-right-DY_wImxB.js +1 -0
  17. package/dist/web/assets/{chunk-4BX2VUAB-D4tOov49.js → chunk-4BX2VUAB-CENmY7Kw.js} +1 -1
  18. package/dist/web/assets/{chunk-55IACEB6-DJ6BynZ4.js → chunk-55IACEB6-DhZGI1l3.js} +1 -1
  19. package/dist/web/assets/{chunk-7E7YKBS2-CiyUJxNI.js → chunk-7E7YKBS2-DZcnC7Ow.js} +1 -1
  20. package/dist/web/assets/{chunk-7R4GIKGN-Dv-4cAYn.js → chunk-7R4GIKGN-y8bfHEy-.js} +2 -2
  21. package/dist/web/assets/{chunk-C72U2L5F-D21mS_6G.js → chunk-C72U2L5F-BHPkfQj2.js} +1 -1
  22. package/dist/web/assets/{chunk-EGIJ26TM-DzqmU2Z7.js → chunk-EGIJ26TM-nant2LXl.js} +1 -1
  23. package/dist/web/assets/{chunk-FMBD7UC4-DXncblvW.js → chunk-FMBD7UC4-Bog4cpN-.js} +1 -1
  24. package/dist/web/assets/{chunk-GEFDOKGD-D-pKjlVd.js → chunk-GEFDOKGD-86LFbsAC.js} +1 -1
  25. package/dist/web/assets/chunk-GLR3WWYH-Re-5eSlQ.js +2 -0
  26. package/dist/web/assets/chunk-HHEYEP7N-C45i5G_3.js +1 -0
  27. package/dist/web/assets/{chunk-JSJVCQXG-99JzIdPr.js → chunk-JSJVCQXG-23eG9mgt.js} +1 -1
  28. package/dist/web/assets/{chunk-KX2RTZJC-CRq1OBZv.js → chunk-KX2RTZJC-CHj8TnTB.js} +1 -1
  29. package/dist/web/assets/{chunk-KYZI473N-Bb0MCaIO.js → chunk-KYZI473N-gqRLpJ4w.js} +1 -1
  30. package/dist/web/assets/{chunk-L3YUKLVL-C7qGJrfV.js → chunk-L3YUKLVL-DnSMmNFC.js} +1 -1
  31. package/dist/web/assets/{chunk-MX3YWQON-BpS_PtKp.js → chunk-MX3YWQON-B6g1ZH9X.js} +1 -1
  32. package/dist/web/assets/{chunk-NQ4KR5QH-z_blpjxi.js → chunk-NQ4KR5QH-DX32345Y.js} +1 -1
  33. package/dist/web/assets/{chunk-O4XLMI2P-nDhi_cVu.js → chunk-O4XLMI2P-Vp_V4P-b.js} +1 -1
  34. package/dist/web/assets/{chunk-OZEHJAEY-BXhYx3nO.js → chunk-OZEHJAEY-lKq2SWjA.js} +1 -1
  35. package/dist/web/assets/{chunk-PQ6SQG4A-TF58UVMU.js → chunk-PQ6SQG4A-Bik13fTV.js} +1 -1
  36. package/dist/web/assets/{chunk-PU5JKC2W-ek7k4QVB.js → chunk-PU5JKC2W-DD95Rx35.js} +1 -1
  37. package/dist/web/assets/chunk-QZHKN3VN-N3VXx1VH.js +1 -0
  38. package/dist/web/assets/{chunk-R5LLSJPH-CFwSJijQ.js → chunk-R5LLSJPH-dRhXRnrb.js} +1 -1
  39. package/dist/web/assets/{chunk-WL4C6EOR-ByUrSRin.js → chunk-WL4C6EOR-B1iIvLOG.js} +1 -1
  40. package/dist/web/assets/{chunk-XIRO2GV7-Djlmrely.js → chunk-XIRO2GV7-DZBoNl1_.js} +1 -1
  41. package/dist/web/assets/{chunk-XPW4576I-BPQQBakK.js → chunk-XPW4576I-CgLyyW03.js} +1 -1
  42. package/dist/web/assets/{chunk-XZSTWKYB-DxAOx4hG.js → chunk-XZSTWKYB-DjV8xl5A.js} +1 -1
  43. package/dist/web/assets/{chunk-YBOYWFTD-rQG3QH5s.js → chunk-YBOYWFTD-D_ILLe6_.js} +1 -1
  44. package/dist/web/assets/classDiagram-VBA2DB6C-mr-Cb1me.js +1 -0
  45. package/dist/web/assets/classDiagram-v2-RAHNMMFH-BKe8_uda.js +1 -0
  46. package/dist/web/assets/clone--z5KLAuR.js +1 -0
  47. package/dist/web/assets/code-editor-Ij4p30cr.js +8 -0
  48. package/dist/web/assets/columns-2-IeETSfON.js +1 -0
  49. package/dist/web/assets/{cose-bilkent-S5V4N54A-B_AWZsOP.js → cose-bilkent-S5V4N54A-BGNPFv3x.js} +1 -1
  50. package/dist/web/assets/{csv-preview-D2pJJj3K.js → csv-preview-CwQnOa3E.js} +2 -2
  51. package/dist/web/assets/{dagre-DHq9bhnd.js → dagre-CkhlMHnx.js} +1 -1
  52. package/dist/web/assets/{dagre-KLK3FWXG-BdJr7Byp.js → dagre-KLK3FWXG-Cnp996VG.js} +1 -1
  53. package/dist/web/assets/database-CgTomMxt.js +1 -0
  54. package/dist/web/assets/{database-viewer-Camu01H4.js → database-viewer-C1UHSgft.js} +2 -2
  55. package/dist/web/assets/{diagram-E7M64L7V-_db4pBVA.js → diagram-E7M64L7V-BZF0tSOr.js} +1 -1
  56. package/dist/web/assets/{diagram-IFDJBPK2-xKoeuiJx.js → diagram-IFDJBPK2-nUcO8sN8.js} +1 -1
  57. package/dist/web/assets/{diagram-P4PSJMXO-C8tjJsev.js → diagram-P4PSJMXO-CW0eCkwC.js} +1 -1
  58. package/dist/web/assets/diff-viewer-CVx5naBA.js +4 -0
  59. package/dist/web/assets/dist-CM0oD8tQ.js +1 -0
  60. package/dist/web/assets/{erDiagram-INFDFZHY-BSh2z9Df.js → erDiagram-INFDFZHY-DSkriYZ9.js} +1 -1
  61. package/dist/web/assets/extension-webview-CHVVpV34.js +3 -0
  62. package/dist/web/assets/{flowDiagram-PKNHOUZH-oYaovqyp.js → flowDiagram-PKNHOUZH-CFYAfZBx.js} +1 -1
  63. package/dist/web/assets/{ganttDiagram-A5KZAMGK-DmL26q2P.js → ganttDiagram-A5KZAMGK-KSn4XAU4.js} +1 -1
  64. package/dist/web/assets/gitGraph-HDMCJU4V-OkvBPi6H.js +1 -0
  65. package/dist/web/assets/{gitGraphDiagram-K3NZZRJ6-CMoukSrY.js → gitGraphDiagram-K3NZZRJ6-BMgjjVys.js} +1 -1
  66. package/dist/web/assets/{graphlib-BcsNnGcW.js → graphlib-BWe1iK_s.js} +1 -1
  67. package/dist/web/assets/index-OqgGFmh8.js +26 -0
  68. package/dist/web/assets/index-vA7juDri.css +2 -0
  69. package/dist/web/assets/info-3K5VOQVL-BDU2_bYD.js +1 -0
  70. package/dist/web/assets/infoDiagram-LFFYTUFH-Diq4Cyc3.js +2 -0
  71. package/dist/web/assets/input-BHj0veau.js +45 -0
  72. package/dist/web/assets/{isEmpty-bnrF3Qbc.js → isEmpty-BfLnxq-B.js} +1 -1
  73. package/dist/web/assets/{ishikawaDiagram-PHBUUO56-D05_LyL7.js → ishikawaDiagram-PHBUUO56-CiVEvp8o.js} +1 -1
  74. package/dist/web/assets/{journeyDiagram-4ABVD52K-B_L20qMe.js → journeyDiagram-4ABVD52K-CG_v5Aho.js} +1 -1
  75. package/dist/web/assets/jsx-runtime-BRW_vwa9.js +1 -0
  76. package/dist/web/assets/{kanban-definition-K7BYSVSG-CZ535BbZ.js → kanban-definition-K7BYSVSG-miB0-_Zq.js} +1 -1
  77. package/dist/web/assets/keybindings-store-BQxgPV5o.js +1 -0
  78. package/dist/web/assets/{line-CVvo3dRu.js → line-CSuSrJ9J.js} +1 -1
  79. package/dist/web/assets/{linear-DP4mkX3m.js → linear-DFN_MPsw.js} +1 -1
  80. package/dist/web/assets/markdown-renderer-CRy8xw2B.js +306 -0
  81. package/dist/web/assets/{mermaid-parser.core-C7UwoIh6.js → mermaid-parser.core-CFdP1Z5_.js} +2 -2
  82. package/dist/web/assets/{mindmap-definition-YRQLILUH-x0MTutJp.js → mindmap-definition-YRQLILUH-pYPWwASE.js} +1 -1
  83. package/dist/web/assets/{ordinal-_K3x1fkz.js → ordinal-DpFn432U.js} +1 -1
  84. package/dist/web/assets/packet-RMMSAZCW-BwpIpYB3.js +1 -0
  85. package/dist/web/assets/pie-UPGHQEXC-BPgAfmes.js +1 -0
  86. package/dist/web/assets/{pieDiagram-SKSYHLDU-C1Gjrtzy.js → pieDiagram-SKSYHLDU-Dovdlvhu.js} +1 -1
  87. package/dist/web/assets/plus-DQGIb4mQ.js +1 -0
  88. package/dist/web/assets/port-forwarding-tab-Biua8ov5.js +1 -0
  89. package/dist/web/assets/{postgres-viewer-BQdPMowm.js → postgres-viewer-BcVjCAl4.js} +3 -3
  90. package/dist/web/assets/{quadrantDiagram-337W2JSQ-C8bzJCjQ.js → quadrantDiagram-337W2JSQ-TXe6cU_F.js} +1 -1
  91. package/dist/web/assets/radar-KQ55EAFF-TqxBkWx-.js +1 -0
  92. package/dist/web/assets/refresh-cw-Clk8fdUD.js +1 -0
  93. package/dist/web/assets/{requirementDiagram-Z7DCOOCP-pQyah6WB.js → requirementDiagram-Z7DCOOCP-CuiiuGS9.js} +1 -1
  94. package/dist/web/assets/{sankeyDiagram-WA2Y5GQK-T6RgG-N8.js → sankeyDiagram-WA2Y5GQK-BbRmhv0t.js} +1 -1
  95. package/dist/web/assets/scroll-area-BpXCNme3.js +1 -0
  96. package/dist/web/assets/{sequenceDiagram-2WXFIKYE-BQDJ4CVs.js → sequenceDiagram-2WXFIKYE-B2D8IQDb.js} +1 -1
  97. package/dist/web/assets/settings-tab-C9X-N8hE.js +1 -0
  98. package/dist/web/assets/{sql-query-editor-CY61vWBg.js → sql-query-editor-BFvRvJn0.js} +1 -1
  99. package/dist/web/assets/sqlite-viewer-CPfvwFl4.js +1 -0
  100. package/dist/web/assets/square-vBdqj0bF.js +1 -0
  101. package/dist/web/assets/{stateDiagram-RAJIS63D-66vhiIuk.js → stateDiagram-RAJIS63D-ylr4HxPu.js} +1 -1
  102. package/dist/web/assets/stateDiagram-v2-FVOUBMTO-D6zvxf3M.js +1 -0
  103. package/dist/web/assets/table-Bi27fEaN.js +1 -0
  104. package/dist/web/assets/{terminal-tab-TIJmxHl6.js → terminal-tab-mWwk_weB.js} +2 -2
  105. package/dist/web/assets/text-wrap-D_OmSzhp.js +1 -0
  106. package/dist/web/assets/{timeline-definition-YZTLITO2-DwZqB3nn.js → timeline-definition-YZTLITO2-pMv1grvM.js} +1 -1
  107. package/dist/web/assets/trash-2-CNuB-htI.js +1 -0
  108. package/dist/web/assets/treemap-KZPCXAKY-Kck06FKU.js +1 -0
  109. package/dist/web/assets/{use-monaco-theme-BHn-LEm7.js → use-monaco-theme-CPaeSMAA.js} +1 -1
  110. package/dist/web/assets/{vennDiagram-LZ73GAT5-s9Z71fz-.js → vennDiagram-LZ73GAT5-C-rkIUbo.js} +1 -1
  111. package/dist/web/assets/x-Dw3TjeY_.js +1 -0
  112. package/dist/web/assets/{xychartDiagram-JWTSCODW-DRa_TH4B.js → xychartDiagram-JWTSCODW-CtpjAakO.js} +1 -1
  113. package/dist/web/index.html +18 -12
  114. package/dist/web/sw.js +1 -1
  115. package/docs/codebase-summary.md +134 -11
  116. package/docs/extension-development-guide.md +98 -1
  117. package/docs/journals/260414-1400-ext-git-graph-port-complete.md +147 -0
  118. package/docs/journals/260414-1452-git-graph-faithful-port.md +144 -0
  119. package/docs/journals/260414-1810-git-graph-ui-improvements-complete.md +261 -0
  120. package/docs/journals/260414-2001-bundled-extensions.md +219 -0
  121. package/docs/project-changelog.md +63 -22
  122. package/docs/project-roadmap.md +1 -0
  123. package/docs/system-architecture.md +33 -5
  124. package/package.json +9 -3
  125. package/packages/ext-git-graph/package.json +30 -0
  126. package/packages/ext-git-graph/src/extension-integration.test.ts +230 -0
  127. package/packages/ext-git-graph/src/extension-parsers.test.ts +193 -0
  128. package/packages/ext-git-graph/src/extension.ts +800 -0
  129. package/packages/ext-git-graph/src/git-log-parser.test.ts +271 -0
  130. package/packages/ext-git-graph/src/git-log-parser.ts +38 -0
  131. package/packages/ext-git-graph/src/types.ts +181 -0
  132. package/packages/ext-git-graph/src/webview-html.test.ts +142 -0
  133. package/packages/ext-git-graph/src/webview-html.ts +2199 -0
  134. package/packages/vscode-compat/src/index.ts +4 -0
  135. package/packages/vscode-compat/src/process.ts +25 -0
  136. package/packages/vscode-compat/src/window.ts +10 -0
  137. package/src/cli/commands/ext-cmd.ts +3 -1
  138. package/src/server/index.ts +1 -1
  139. package/src/server/ws/extensions.ts +6 -2
  140. package/src/services/contribution-registry.ts +14 -1
  141. package/src/services/extension-host-worker.ts +7 -3
  142. package/src/services/extension-manifest.ts +18 -1
  143. package/src/services/extension-rpc-handlers.ts +68 -2
  144. package/src/services/extension.service.ts +46 -6
  145. package/src/types/extension-messages.ts +2 -0
  146. package/src/types/extension.ts +8 -0
  147. package/src/web/components/editor/code-editor.tsx +83 -8
  148. package/src/web/components/editor/save-as-dialog.tsx +75 -0
  149. package/src/web/components/extensions/extension-webview.tsx +111 -12
  150. package/src/web/components/layout/command-palette.tsx +43 -17
  151. package/src/web/components/layout/draggable-tab.tsx +120 -67
  152. package/src/web/components/layout/editor-panel.tsx +15 -4
  153. package/src/web/components/layout/mobile-nav.tsx +74 -7
  154. package/src/web/components/layout/tab-bar.tsx +76 -4
  155. package/src/web/components/layout/tab-content.tsx +12 -5
  156. package/src/web/components/layout/upgrade-banner.tsx +3 -0
  157. package/src/web/components/settings/keyboard-shortcuts-section.tsx +46 -1
  158. package/src/web/components/shared/markdown-code-block.tsx +142 -0
  159. package/src/web/components/shared/markdown-context.ts +20 -0
  160. package/src/web/components/shared/markdown-renderer.tsx +113 -288
  161. package/src/web/hooks/use-extension-ws.ts +22 -4
  162. package/src/web/hooks/use-global-keybindings.ts +31 -2
  163. package/src/web/hooks/use-url-sync.ts +8 -3
  164. package/src/web/main.tsx +1 -0
  165. package/src/web/stores/keybindings-store.ts +3 -3
  166. package/src/web/stores/panel-store.ts +2 -2
  167. package/src/web/stores/panel-utils.ts +17 -2
  168. package/src/web/stores/tab-store.ts +17 -1
  169. package/src/web/styles/globals.css +6 -0
  170. package/.opencode/.env.example +0 -98
  171. package/.opencode/skills/ads-management/scripts/.env.example +0 -13
  172. package/.opencode/skills/ai-multimodal/.env.example +0 -230
  173. package/.opencode/skills/cip-design/.env.example +0 -6
  174. package/.opencode/skills/devops/.env.example +0 -76
  175. package/.opencode/skills/docs-seeker/.env.example +0 -15
  176. package/.opencode/skills/elevenlabs/.env.example +0 -3
  177. package/.opencode/skills/marketing-dashboard/.env.example +0 -15
  178. package/.opencode/skills/marketing-dashboard/app/.env.example +0 -2
  179. package/.opencode/skills/marketing-dashboard/server/.env.example +0 -2
  180. package/.opencode/skills/mcp-management/scripts/dist/analyze-tools.js +0 -70
  181. package/.opencode/skills/mcp-management/scripts/dist/cli.js +0 -160
  182. package/.opencode/skills/mcp-management/scripts/dist/mcp-client.js +0 -183
  183. package/.opencode/skills/payment-integration/scripts/.env.example +0 -20
  184. package/.opencode/skills/sequential-thinking/.env.example +0 -8
  185. package/dist/web/assets/architecture-PBZL5I3N-DEO2f3VD.js +0 -1
  186. package/dist/web/assets/arrow-up-BYhx9ckd.js +0 -1
  187. package/dist/web/assets/channel-By7bn0Yq.js +0 -1
  188. package/dist/web/assets/chat-tab-CT2XUgsc.js +0 -10
  189. package/dist/web/assets/chevron-right-4zq1jPv6.js +0 -1
  190. package/dist/web/assets/chunk-GLR3WWYH-DKikpoJM.js +0 -2
  191. package/dist/web/assets/chunk-HHEYEP7N-C7vxA5i9.js +0 -1
  192. package/dist/web/assets/chunk-QZHKN3VN-CYaTbeZf.js +0 -1
  193. package/dist/web/assets/classDiagram-VBA2DB6C-BA8Nj-_C.js +0 -1
  194. package/dist/web/assets/classDiagram-v2-RAHNMMFH-DjYu-6mn.js +0 -1
  195. package/dist/web/assets/clone-LRxlvnMj.js +0 -1
  196. package/dist/web/assets/code-editor-DQiPtcNd.js +0 -8
  197. package/dist/web/assets/columns-2-BoZAN-iw.js +0 -1
  198. package/dist/web/assets/createLucideIcon-PuMiQgHl.js +0 -1
  199. package/dist/web/assets/diff-viewer-CTwcVIP_.js +0 -4
  200. package/dist/web/assets/dist-DIV6WgAG.js +0 -41
  201. package/dist/web/assets/extension-webview-pU1xJyoc.js +0 -3
  202. package/dist/web/assets/git-graph-BnFbmpom.js +0 -1
  203. package/dist/web/assets/gitGraph-HDMCJU4V-Bwna3and.js +0 -1
  204. package/dist/web/assets/index-CP9KnaGh.js +0 -30
  205. package/dist/web/assets/index-Cxz7oGXY.css +0 -2
  206. package/dist/web/assets/info-3K5VOQVL-_vRxVNUm.js +0 -1
  207. package/dist/web/assets/infoDiagram-LFFYTUFH-DWwumDkq.js +0 -2
  208. package/dist/web/assets/jsx-runtime-kMwlnEGE.js +0 -1
  209. package/dist/web/assets/keybindings-store-DdhEeehv.js +0 -1
  210. package/dist/web/assets/markdown-renderer-BjYurPV4.js +0 -326
  211. package/dist/web/assets/packet-RMMSAZCW-DY5PNnZU.js +0 -1
  212. package/dist/web/assets/pie-UPGHQEXC-BHncZutv.js +0 -1
  213. package/dist/web/assets/port-forwarding-tab-Bgr8dmsw.js +0 -1
  214. package/dist/web/assets/radar-KQ55EAFF-DH0AOkUy.js +0 -1
  215. package/dist/web/assets/settings-tab-BNoboN6E.js +0 -1
  216. package/dist/web/assets/sqlite-viewer-srSbGg1D.js +0 -1
  217. package/dist/web/assets/square-oPKIkJiw.js +0 -1
  218. package/dist/web/assets/stateDiagram-v2-FVOUBMTO-BGVqj_g9.js +0 -1
  219. package/dist/web/assets/table-DFevCOMd.js +0 -1
  220. package/dist/web/assets/tag-CXMT0QB6.js +0 -1
  221. package/dist/web/assets/text-wrap-BWNOVswA.js +0 -1
  222. package/dist/web/assets/treemap-KZPCXAKY-B2Xkyv-K.js +0 -1
  223. package/dist/web/assets/x-D2_KzIET.js +0 -1
  224. package/src/web/components/git/git-graph-branch-label.tsx +0 -124
  225. package/src/web/components/git/git-graph-constants.ts +0 -185
  226. package/src/web/components/git/git-graph-detail.tsx +0 -107
  227. package/src/web/components/git/git-graph-dialog.tsx +0 -72
  228. package/src/web/components/git/git-graph-row.tsx +0 -167
  229. package/src/web/components/git/git-graph-settings-dialog.tsx +0 -104
  230. package/src/web/components/git/git-graph-svg.tsx +0 -54
  231. package/src/web/components/git/git-graph-toolbar.tsx +0 -195
  232. package/src/web/components/git/git-graph.tsx +0 -193
  233. package/src/web/components/git/use-column-resize.ts +0 -33
  234. package/src/web/components/git/use-git-graph.ts +0 -201
  235. /package/dist/web/assets/{api-client-BfBM3I7n.js → api-client-BvxmRZUi.js} +0 -0
  236. /package/dist/web/assets/{array-B9UHiPd-.js → array-BFDiaBgf.js} +0 -0
  237. /package/dist/web/assets/{csv-parser-CNNw2RVA.js → csv-parser-i7fjqP2H.js} +0 -0
  238. /package/dist/web/assets/{cytoscape.esm-BW-DbntU.js → cytoscape.esm-C8i2jUzT.js} +0 -0
  239. /package/dist/web/assets/{defaultLocale-5eAKkKJC.js → defaultLocale-ZeknFqNe.js} +0 -0
  240. /package/dist/web/assets/{dist-CSJdAyA9.js → dist-DZmJeHOA.js} +0 -0
  241. /package/dist/web/assets/{init-DlZdxViB.js → init-0VJVrkRJ.js} +0 -0
  242. /package/dist/web/assets/{isArrayLikeObject-B_v2FtYn.js → isArrayLikeObject-ClzWCpcm.js} +0 -0
  243. /package/dist/web/assets/{katex-Bqvo_ZG0.js → katex-DR0kdMDv.js} +0 -0
  244. /package/dist/web/assets/{lib-DurwGtQO.js → lib-CeBVkQ-7.js} +0 -0
  245. /package/dist/web/assets/{math-069Z4SuC.js → math-CRc16Nj6.js} +0 -0
  246. /package/dist/web/assets/{path-6uRLdFF7.js → path-INs8XTPH.js} +0 -0
  247. /package/dist/web/assets/{preload-helper-Bf_JiD2A.js → preload-helper-mr3rCizq.js} +0 -0
  248. /package/dist/web/assets/{react-SKk5z-bm.js → react-0tkk-ztn.js} +0 -0
  249. /package/dist/web/assets/{rough.esm-JX0wREDd.js → rough.esm-eLccZ4OJ.js} +0 -0
  250. /package/dist/web/assets/{sql-completion-provider-DM9Qov6L.js → sql-completion-provider-B8uUWWej.js} +0 -0
  251. /package/dist/web/assets/{src-BqX54PbV.js → src-CqyWLlNZ.js} +0 -0
  252. /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
- }