@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 +0,0 @@
1
- import"./chunk-XZSTWKYB-DxAOx4hG.js";import{n as e}from"./chunk-C72U2L5F-D21mS_6G.js";export{e as createPacketServices};
@@ -1 +0,0 @@
1
- import"./chunk-XZSTWKYB-DxAOx4hG.js";import{n as e}from"./chunk-XIRO2GV7-Djlmrely.js";export{e as createPieServices};
@@ -1 +0,0 @@
1
- import{o as e}from"./chunk-CFjPhJqf.js";import{t}from"./react-nm2Ru1Pt.js";import"./react-dom-Bpkvzu3U.js";import{t as n}from"./createLucideIcon-PuMiQgHl.js";import{t as r}from"./square-oPKIkJiw.js";import{t as i}from"./jsx-runtime-kMwlnEGE.js";import{t as a}from"./api-client-BfBM3I7n.js";import{Dt as o,Pt as s,X as c,ht as l,pt as u,wt as d}from"./index-CP9KnaGh.js";var f=n(`wifi`,[[`path`,{d:`M12 20h.01`,key:`zekei9`}],[`path`,{d:`M2 8.82a15 15 0 0 1 20 0`,key:`dnpr2z`}],[`path`,{d:`M5 12.859a10 10 0 0 1 14 0`,key:`1x1e6c`}],[`path`,{d:`M8.5 16.429a5 5 0 0 1 7 0`,key:`1bycff`}]]),p=e(t(),1),m=i();function h(){let[e,t]=(0,p.useState)(``),[n,i]=(0,p.useState)([]),[h,g]=(0,p.useState)(!1),[_,v]=(0,p.useState)(null),[y,b]=(0,p.useState)(null),x=(0,p.useCallback)(async()=>{try{i(await a.get(`/api/preview/tunnels`))}catch(e){console.warn(`[ports] failed to fetch tunnels`,e)}},[]);(0,p.useEffect)(()=>{x();let e=setInterval(x,1e4);return()=>clearInterval(e)},[x]);let S=async e=>{let r=n.find(t=>t.port===e);if(r){window.open(r.url,`_blank`),t(``);return}g(!0),v(null);try{let n=await a.post(`/api/preview/tunnel`,{port:e});window.open(n.url,`_blank`),t(``),await x()}catch(t){v(t.message||`Failed to start tunnel for port ${e}`)}finally{g(!1)}},C=async e=>{try{await a.del(`/api/preview/tunnel/${e}`),await x()}catch(t){c.error(t.message||`Failed to stop tunnel for port ${e}`)}},w=(e,t)=>{navigator.clipboard.writeText(t).then(()=>{b(e),c.success(`URL copied`),setTimeout(()=>b(null),2e3)}).catch(()=>{c.error(`Failed to copy URL`)})};return(0,m.jsxs)(`div`,{className:`flex flex-col h-full w-full bg-background`,children:[(0,m.jsxs)(`div`,{className:`p-4 md:p-6 border-b border-border bg-surface`,children:[(0,m.jsxs)(`div`,{className:`flex items-center gap-2 mb-3`,children:[(0,m.jsx)(f,{className:`size-5 text-primary`}),(0,m.jsx)(`h2`,{className:`text-base font-medium text-text-primary`,children:`Port Forwarding`})]}),(0,m.jsxs)(`form`,{onSubmit:t=>{t.preventDefault();let n=parseInt(e,10);n>=1&&n<=65535?S(n):v(`Port must be 1-65535`)},className:`flex items-center gap-2`,children:[(0,m.jsxs)(`div`,{className:`flex-1 flex items-center gap-2 px-3 py-2.5 rounded-lg bg-background border border-border focus-within:border-primary/50 transition-colors`,children:[(0,m.jsx)(`span`,{className:`text-sm text-text-subtle shrink-0`,children:`localhost:`}),(0,m.jsx)(`input`,{type:`number`,value:e,onChange:e=>{t(e.target.value),v(null)},placeholder:`3000`,min:1,max:65535,className:`flex-1 bg-transparent text-sm text-text-primary outline-none placeholder:text-text-subtle min-w-0 [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none`})]}),(0,m.jsx)(`button`,{type:`submit`,disabled:h||!e,className:`px-4 py-2.5 rounded-lg bg-primary text-primary-foreground text-sm font-medium hover:bg-primary/90 disabled:opacity-50 transition-colors shrink-0 min-w-[72px] flex items-center justify-center`,children:h?(0,m.jsx)(u,{className:`size-4 animate-spin`}):`Forward`})]}),_&&(0,m.jsx)(`p`,{className:`text-sm text-red-400 mt-2`,children:_}),h&&(0,m.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-text-secondary mt-2`,children:[(0,m.jsx)(u,{className:`size-3.5 animate-spin`}),(0,m.jsx)(`span`,{children:`Starting tunnel...`})]})]}),(0,m.jsx)(`div`,{className:`flex-1 overflow-y-auto p-4 md:p-6`,children:n.length===0?(0,m.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-center`,children:[(0,m.jsx)(l,{className:`size-10 text-text-subtle`}),(0,m.jsx)(`p`,{className:`text-sm text-text-secondary max-w-xs`,children:`No active ports. Forward a port to access your local dev server from anywhere.`})]}):(0,m.jsx)(`div`,{className:`space-y-2`,children:n.map(e=>(0,m.jsxs)(`div`,{className:`flex items-center gap-3 p-3 rounded-lg bg-surface border border-border`,children:[(0,m.jsxs)(`div`,{className:`shrink-0 px-2 py-1 rounded bg-primary/10 text-primary text-xs font-mono font-medium`,children:[`:`,e.port]}),(0,m.jsx)(`span`,{className:`flex-1 text-xs text-text-secondary truncate min-w-0`,children:e.url}),(0,m.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[(0,m.jsx)(`button`,{onClick:()=>window.open(e.url,`_blank`),className:`p-2.5 rounded-md hover:bg-surface-elevated transition-colors`,title:`Open in browser`,children:(0,m.jsx)(d,{className:`size-4 text-text-secondary`})}),(0,m.jsx)(`button`,{onClick:()=>w(e.port,e.url),className:`p-2.5 rounded-md hover:bg-surface-elevated transition-colors`,title:`Copy URL`,children:y===e.port?(0,m.jsx)(s,{className:`size-4 text-green-400`}):(0,m.jsx)(o,{className:`size-4 text-text-secondary`})}),(0,m.jsx)(`button`,{onClick:()=>C(e.port),className:`p-2.5 rounded-md hover:bg-red-500/10 transition-colors`,title:`Stop tunnel`,children:(0,m.jsx)(r,{className:`size-4 text-red-400`})})]})]},e.port))})})]})}export{h as PortForwardingTab};
@@ -1 +0,0 @@
1
- import"./chunk-XZSTWKYB-DxAOx4hG.js";import{n as e}from"./chunk-L3YUKLVL-C7qGJrfV.js";export{e as createRadarServices};
@@ -1 +0,0 @@
1
- import"./react-nm2Ru1Pt.js";import"./react-dom-Bpkvzu3U.js";import"./jsx-runtime-kMwlnEGE.js";import"./dist-DIV6WgAG.js";import"./api-client-BfBM3I7n.js";import"./api-settings-Bn-bIxD1.js";import{o as e}from"./index-CP9KnaGh.js";export{e as SettingsTab};
@@ -1 +0,0 @@
1
- import{o as e}from"./chunk-CFjPhJqf.js";import{t}from"./react-nm2Ru1Pt.js";import{t as n}from"./chevron-right-4zq1jPv6.js";import{t as r}from"./table-DFevCOMd.js";import{t as i}from"./jsx-runtime-kMwlnEGE.js";import{i as a,t as o}from"./api-client-BfBM3I7n.js";import{Et as s,Nt as c,Q as l,jt as u,pt as d,rt as f}from"./index-CP9KnaGh.js";import"./use-monaco-theme-BHn-LEm7.js";import{t as p}from"./sql-query-editor-CY61vWBg.js";import{n as m,r as h,t as g}from"./lib-DurwGtQO.js";var _=e(t(),1);function v(e,t,n){let[r,i]=(0,_.useState)([]),[s,c]=(0,_.useState)(null),[l,u]=(0,_.useState)(null),[d,f]=(0,_.useState)([]),[p,m]=(0,_.useState)(!1),[h,g]=(0,_.useState)(null),[v,y]=(0,_.useState)(1),[b,x]=(0,_.useState)(null),[S,C]=(0,_.useState)(null),[w,T]=(0,_.useState)(!1),E=n?`/api/db/connections/${n}`:null,D=E??`${a(e)}/sqlite`,O=E?``:`path=${encodeURIComponent(t)}`,k=(0,_.useCallback)(async()=>{m(!0),g(null);try{let e=E?`?cached=1`:O?`?${O}`:``,t=await o.get(`${D}/tables${e}`);i(t),!E&&t.length>0&&!s&&c(t[0].name)}catch(e){g(e.message)}finally{m(!1)}},[D,O,E]);(0,_.useEffect)(()=>{k()},[k]);let A=(0,_.useCallback)(async()=>{if(s){m(!0);try{let e=O?`${O}&`:``,[t,n]=await Promise.all([o.get(`${D}/data?${e}table=${encodeURIComponent(s)}&page=${v}&limit=100`),o.get(`${D}/schema?${e}table=${encodeURIComponent(s)}`)]);u(t),f(n)}catch(e){g(e.message)}finally{m(!1)}}},[D,O,s,v]);return(0,_.useEffect)(()=>{A()},[A]),{tables:r,selectedTable:s,selectTable:(0,_.useCallback)(e=>{c(e),y(1),x(null)},[]),tableData:l,schema:d,loading:p,error:h,page:v,setPage:y,queryResult:b,queryError:S,queryLoading:w,executeQuery:(0,_.useCallback)(async e=>{T(!0),C(null);try{let n=E?{sql:e}:{path:t,sql:e},r=await o.post(`${D}/query`,n);x(r),r.changeType===`modify`&&A()}catch(e){C(e.message)}finally{T(!1)}},[D,E,t,A]),updateCell:(0,_.useCallback)(async(e,n,r)=>{if(s)try{E?await o.put(`${D}/cell`,{table:s,pkColumn:`rowid`,pkValue:e,column:n,value:r}):await o.put(`${D}/cell`,{path:t,table:s,rowid:e,column:n,value:r}),A()}catch(e){g(e.message)}},[D,E,t,s,A]),deleteRow:(0,_.useCallback)(async e=>{if(s)try{E?await o.del(`${D}/row`,{table:s,pkColumn:`rowid`,pkValue:e}):await o.del(`${D}/row`,{path:t,table:s,rowid:e}),A(),k()}catch(e){g(e.message)}},[D,E,t,s,A,k]),refreshTables:k,refreshData:A}}var y=i();function b({tables:e,selectedTable:t,onSelect:n,onRefresh:i}){return(0,y.jsxs)(`div`,{className:`w-48 shrink-0 flex flex-col bg-background overflow-hidden`,children:[(0,y.jsxs)(`div`,{className:`flex items-center justify-between px-3 py-2 border-b border-border`,children:[(0,y.jsx)(`span`,{className:`text-xs font-medium text-muted-foreground uppercase tracking-wider`,children:`Tables`}),(0,y.jsx)(`button`,{type:`button`,onClick:i,className:`text-muted-foreground hover:text-foreground transition-colors`,title:`Refresh tables`,children:(0,y.jsx)(f,{className:`size-3`})})]}),(0,y.jsxs)(`div`,{className:`flex-1 overflow-y-auto`,children:[e.map(e=>(0,y.jsxs)(`button`,{type:`button`,onClick:()=>n(e.name),className:`w-full flex items-center gap-2 px-3 py-1.5 text-left text-xs transition-colors ${t===e.name?`bg-muted text-foreground`:`text-muted-foreground hover:bg-muted/50 hover:text-foreground`}`,children:[(0,y.jsx)(r,{className:`size-3 shrink-0`}),(0,y.jsx)(`span`,{className:`truncate flex-1`,children:e.name}),(0,y.jsx)(`span`,{className:`text-[10px] opacity-60`,children:e.rowCount})]},e.name)),e.length===0&&(0,y.jsx)(`p`,{className:`px-3 py-4 text-xs text-muted-foreground text-center`,children:`No tables found`})]})]})}function x({tableData:e,schema:t,loading:r,page:i,onPageChange:a,onCellUpdate:o,onRowDelete:s}){if(!e)return(0,y.jsx)(`div`,{className:`flex items-center justify-center h-full text-xs text-muted-foreground`,children:r?(0,y.jsx)(d,{className:`size-4 animate-spin`}):`Select a table`});let l=Math.ceil(e.total/e.limit)||1;return(0,y.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden`,children:[(0,y.jsx)(`div`,{className:`flex-1 overflow-auto`,children:(0,y.jsx)(S,{columns:e.columns,rows:e.rows,schema:t,onCellUpdate:o,onRowDelete:s})}),(0,y.jsxs)(`div`,{className:`flex items-center justify-between px-3 py-1.5 border-t border-border bg-background shrink-0 text-xs text-muted-foreground`,children:[(0,y.jsxs)(`span`,{children:[e.total.toLocaleString(),` rows`]}),(0,y.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,y.jsx)(`button`,{type:`button`,disabled:i<=1,onClick:()=>a(i-1),className:`p-0.5 rounded hover:bg-muted disabled:opacity-30`,children:(0,y.jsx)(c,{className:`size-3.5`})}),(0,y.jsxs)(`span`,{children:[i,` / `,l]}),(0,y.jsx)(`button`,{type:`button`,disabled:i>=l,onClick:()=>a(i+1),className:`p-0.5 rounded hover:bg-muted disabled:opacity-30`,children:(0,y.jsx)(n,{className:`size-3.5`})})]})]})]})}function S({columns:e,rows:t,schema:n,onCellUpdate:r,onRowDelete:i}){let[a,o]=(0,_.useState)(null),[s,c]=(0,_.useState)(``),[u,d]=(0,_.useState)(null),f=(0,_.useMemo)(()=>new Set(n.filter(e=>e.pk).map(e=>e.name)),[n]),p=(0,_.useCallback)((e,t,n)=>{t!==`rowid`&&(o({rowIdx:e,col:t}),c(n==null?``:String(n)))},[]),v=(0,_.useCallback)(()=>{if(!a)return;let e=t[a.rowIdx];if(!e)return;let n=e.rowid,i=e[a.col];String(i??``)!==s&&r(n,a.col,s===``?null:s),o(null)},[a,s,t,r]),b=(0,_.useCallback)(()=>o(null),[]),x=(0,_.useCallback)(e=>{let n=t[e];!n||!i||(i(n.rowid),d(null))},[t,i]),S=m({data:t,columns:(0,_.useMemo)(()=>{let t=e.map(e=>({id:e,accessorFn:t=>t[e],header:()=>(0,y.jsx)(`span`,{className:`${f.has(e)?`font-bold`:``} ${e===`rowid`?`text-muted-foreground/50`:``}`,children:e}),cell:({row:t,getValue:n})=>{let r=t.index,i=a?.rowIdx===r&&a?.col===e,o=n();return i?(0,y.jsx)(`input`,{autoFocus:!0,className:`w-full bg-transparent border border-primary/50 rounded px-1 py-0 text-xs outline-none`,value:s,onChange:e=>c(e.target.value),onBlur:v,onKeyDown:e=>{e.key===`Enter`&&v(),e.key===`Escape`&&b()}}):(0,y.jsx)(`span`,{className:`cursor-pointer truncate block ${o==null?`text-muted-foreground/40 italic`:``} ${e===`rowid`?`text-muted-foreground/50`:``}`,onDoubleClick:()=>p(r,e,o),title:o==null?`NULL`:String(o),children:o==null?`NULL`:String(o)})}}));return i&&t.push({id:`_actions`,header:()=>null,cell:({row:e})=>{let t=e.index;return u===t?(0,y.jsxs)(`span`,{className:`flex items-center gap-1 whitespace-nowrap`,children:[(0,y.jsx)(`button`,{type:`button`,onClick:()=>x(t),className:`text-destructive text-[10px] font-medium hover:underline`,children:`Confirm`}),(0,y.jsx)(`button`,{type:`button`,onClick:()=>d(null),className:`text-muted-foreground text-[10px] hover:underline`,children:`Cancel`})]}):(0,y.jsx)(`button`,{type:`button`,onClick:()=>d(t),className:`p-0.5 rounded opacity-0 group-hover:opacity-100 hover:bg-destructive/10 hover:text-destructive transition-opacity`,title:`Delete row`,children:(0,y.jsx)(l,{className:`size-3`})})},size:60}),t},[e,f,a,s,v,b,p,i,u,x]),getCoreRowModel:h()});return(0,y.jsxs)(`table`,{className:`w-full text-xs border-collapse`,children:[(0,y.jsx)(`thead`,{className:`sticky top-0 z-10 bg-muted`,children:S.getHeaderGroups().map(e=>(0,y.jsx)(`tr`,{children:e.headers.map(e=>(0,y.jsx)(`th`,{className:`px-2 py-1.5 text-left font-medium text-muted-foreground border-b border-border whitespace-nowrap`,children:g(e.column.columnDef.header,e.getContext())},e.id))},e.id))}),(0,y.jsxs)(`tbody`,{children:[S.getRowModel().rows.map(e=>(0,y.jsx)(`tr`,{className:`group hover:bg-muted/30 border-b border-border/50`,children:e.getVisibleCells().map(e=>(0,y.jsx)(`td`,{className:`px-2 py-1 max-w-[300px]`,children:g(e.column.columnDef.cell,e.getContext())},e.id))},e.id)),t.length===0&&(0,y.jsx)(`tr`,{children:(0,y.jsx)(`td`,{colSpan:e.length,className:`px-2 py-8 text-center text-muted-foreground`,children:`No data`})})]})]})}function C({onExecute:e,loading:t}){return(0,y.jsx)(p,{onExecute:e,loading:t})}function w({metadata:e}){let t=e?.filePath,n=e?.projectName,r=e?.connectionId,i=e?.tableName,[a,o]=(0,_.useState)(!1);return r?(0,y.jsx)(T,{projectName:``,dbPath:``,connectionId:r,connectionName:e?.connectionName,initialTable:i,queryPanelOpen:a,onToggleQueryPanel:()=>o(e=>!e),hideTableList:!0}):!t||!n?(0,y.jsxs)(`div`,{className:`flex items-center justify-center h-full text-text-secondary text-sm`,children:[(0,y.jsx)(s,{className:`size-5 mr-2`}),` No database file selected.`]}):(0,y.jsx)(T,{projectName:n,dbPath:t,queryPanelOpen:a,onToggleQueryPanel:()=>o(e=>!e)})}function T({projectName:e,dbPath:t,connectionId:n,connectionName:r,initialTable:i,queryPanelOpen:a,onToggleQueryPanel:o,hideTableList:c}){let l=v(e,t,n),f=(0,_.useRef)(!1);return(0,_.useEffect)(()=>{i&&!f.current&&l.tables.length>0&&(f.current=!0,l.selectTable(i))},[i,l.tables]),l.error&&l.tables.length===0?(0,y.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,y.jsx)(u,{className:`size-10 text-destructive`}),(0,y.jsx)(`p`,{className:`text-sm`,children:l.error})]}):l.loading&&l.tables.length===0?(0,y.jsxs)(`div`,{className:`flex items-center justify-center h-full gap-2 text-text-secondary`,children:[(0,y.jsx)(d,{className:`size-5 animate-spin`}),(0,y.jsx)(`span`,{className:`text-sm`,children:`Loading database...`})]}):(0,y.jsxs)(`div`,{className:`flex h-full w-full overflow-hidden`,children:[!c&&(0,y.jsx)(b,{tables:l.tables,selectedTable:l.selectedTable,onSelect:l.selectTable,onRefresh:l.refreshTables}),(0,y.jsxs)(`div`,{className:`flex-1 flex flex-col overflow-hidden ${c?``:`border-l border-border`}`,children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 border-b border-border bg-background shrink-0`,children:[(0,y.jsx)(s,{className:`size-3.5 text-muted-foreground`}),(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground truncate`,children:r??t}),(0,y.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:l.selectedTable&&`/ ${l.selectedTable}`}),(0,y.jsx)(`div`,{className:`ml-auto`,children:(0,y.jsx)(`button`,{type:`button`,onClick:o,className:`px-2 py-1 rounded text-xs transition-colors ${a?`bg-muted text-foreground`:`text-muted-foreground hover:text-foreground`}`,children:`SQL`})})]}),(0,y.jsx)(`div`,{className:`flex-1 overflow-hidden ${a?`max-h-[60%]`:``}`,children:(0,y.jsx)(x,{tableData:l.tableData,schema:l.schema,loading:l.loading,page:l.page,onPageChange:l.setPage,onCellUpdate:l.updateCell,onRowDelete:l.deleteRow})}),a&&(0,y.jsx)(`div`,{className:`border-t border-border h-[40%] shrink-0`,children:(0,y.jsx)(C,{onExecute:l.executeQuery,loading:l.queryLoading})})]})]})}export{w as SqliteViewer};
@@ -1 +0,0 @@
1
- import{t as e}from"./createLucideIcon-PuMiQgHl.js";var t=e(`square`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}]]);export{t};
@@ -1 +0,0 @@
1
- import"./chunk-GEFDOKGD-D-pKjlVd.js";import{h as e}from"./src-BqX54PbV.js";import"./chunk-7R4GIKGN-Dv-4cAYn.js";import"./dist-CSJdAyA9.js";import"./chunk-PU5JKC2W-ek7k4QVB.js";import"./chunk-MX3YWQON-BpS_PtKp.js";import"./chunk-YBOYWFTD-rQG3QH5s.js";import"./chunk-55IACEB6-DJ6BynZ4.js";import"./chunk-KX2RTZJC-CRq1OBZv.js";import"./chunk-PQ6SQG4A-TF58UVMU.js";import"./chunk-KYZI473N-Bb0MCaIO.js";import"./chunk-O4XLMI2P-nDhi_cVu.js";import"./chunk-GLR3WWYH-DKikpoJM.js";import{i as t,n,r,t as i}from"./chunk-NQ4KR5QH-z_blpjxi.js";var a={parser:n,get db(){return new i(2)},renderer:r,styles:t,init:e(e=>{e.state||={},e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},`init`)};export{a as diagram};
@@ -1 +0,0 @@
1
- import{t as e}from"./createLucideIcon-PuMiQgHl.js";var t=e(`table`,[[`path`,{d:`M12 3v18`,key:`108xh3`}],[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M3 9h18`,key:`1pudct`}],[`path`,{d:`M3 15h18`,key:`5xshup`}]]);export{t};
@@ -1 +0,0 @@
1
- import{t as e}from"./createLucideIcon-PuMiQgHl.js";var t=e(`tag`,[[`path`,{d:`M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z`,key:`vktsd0`}],[`circle`,{cx:`7.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`kqv944`}]]);export{t};
@@ -1 +0,0 @@
1
- import{t as e}from"./createLucideIcon-PuMiQgHl.js";var t=e(`text-wrap`,[[`path`,{d:`m16 16-3 3 3 3`,key:`117b85`}],[`path`,{d:`M3 12h14.5a1 1 0 0 1 0 7H13`,key:`18xa6z`}],[`path`,{d:`M3 19h6`,key:`1ygdsz`}],[`path`,{d:`M3 5h18`,key:`1u36vt`}]]);export{t};
@@ -1 +0,0 @@
1
- import"./chunk-XZSTWKYB-DxAOx4hG.js";import{n as e}from"./chunk-OZEHJAEY-BXhYx3nO.js";export{e as createTreemapServices};
@@ -1 +0,0 @@
1
- import{t as e}from"./createLucideIcon-PuMiQgHl.js";var t=e(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]),n=e(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t as n,n as t};
@@ -1,124 +0,0 @@
1
- import {
2
- GitBranch,
3
- GitMerge,
4
- Trash2,
5
- ArrowUpFromLine,
6
- ExternalLink,
7
- Tag,
8
- } from "lucide-react";
9
- import {
10
- ContextMenu,
11
- ContextMenuContent,
12
- ContextMenuItem,
13
- ContextMenuSeparator,
14
- ContextMenuTrigger,
15
- } from "@/components/ui/context-menu";
16
- import type { GitBranch as GitBranchType } from "../../../types/git";
17
-
18
- interface BranchLabelProps {
19
- name: string;
20
- type: "branch" | "tag";
21
- remotes: string[];
22
- isCurrent: boolean;
23
- color: string;
24
- currentBranch: GitBranchType | undefined;
25
- onCheckout: (ref: string) => void;
26
- onMerge: (source: string) => void;
27
- onPush: (branch: string) => void;
28
- onCreatePr: (branch: string) => void;
29
- onDelete: (name: string) => void;
30
- }
31
-
32
- export function BranchLabel({
33
- name,
34
- type,
35
- remotes,
36
- isCurrent,
37
- color,
38
- currentBranch,
39
- onCheckout,
40
- onMerge,
41
- onPush,
42
- onCreatePr,
43
- onDelete,
44
- }: BranchLabelProps) {
45
- if (type === "tag") {
46
- return (
47
- <span className="inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-[10px] font-medium shrink-0 bg-amber-500/20 text-amber-500 border border-amber-500/30">
48
- <Tag className="size-2.5" />
49
- {name}
50
- </span>
51
- );
52
- }
53
-
54
- return (
55
- <ContextMenu>
56
- <ContextMenuTrigger asChild>
57
- <span
58
- className="inline-flex items-center rounded text-[10px] font-medium shrink-0 cursor-context-menu overflow-hidden"
59
- style={{
60
- border: isCurrent
61
- ? `1.5px solid ${color}`
62
- : `1px solid ${color}50`,
63
- }}
64
- >
65
- {/* Branch name segment */}
66
- <span
67
- className="inline-flex items-center gap-0.5 px-1.5 py-0.5"
68
- style={{
69
- backgroundColor: isCurrent ? color : `${color}30`,
70
- color: isCurrent ? "#fff" : color,
71
- }}
72
- >
73
- <GitBranch className="size-2.5" />
74
- {name}
75
- </span>
76
- {/* Remote indicators (italic, separated by border) */}
77
- {remotes.map((remote) => (
78
- <span
79
- key={remote}
80
- className="px-1.5 py-0.5 italic opacity-70"
81
- style={{
82
- borderLeft: `1px solid ${color}40`,
83
- color,
84
- backgroundColor: `${color}15`,
85
- }}
86
- >
87
- {remote}
88
- </span>
89
- ))}
90
- </span>
91
- </ContextMenuTrigger>
92
- <ContextMenuContent>
93
- <ContextMenuItem onClick={() => onCheckout(name)}>
94
- Checkout
95
- </ContextMenuItem>
96
- <ContextMenuItem
97
- onClick={() => onMerge(name)}
98
- disabled={name === currentBranch?.name}
99
- >
100
- <GitMerge className="size-3" />
101
- Merge into current
102
- </ContextMenuItem>
103
- <ContextMenuSeparator />
104
- <ContextMenuItem onClick={() => onPush(name)}>
105
- <ArrowUpFromLine className="size-3" />
106
- Push
107
- </ContextMenuItem>
108
- <ContextMenuItem onClick={() => onCreatePr(name)}>
109
- <ExternalLink className="size-3" />
110
- Create PR
111
- </ContextMenuItem>
112
- <ContextMenuSeparator />
113
- <ContextMenuItem
114
- variant="destructive"
115
- onClick={() => onDelete(name)}
116
- disabled={name === currentBranch?.name}
117
- >
118
- <Trash2 className="size-3" />
119
- Delete
120
- </ContextMenuItem>
121
- </ContextMenuContent>
122
- </ContextMenu>
123
- );
124
- }
@@ -1,185 +0,0 @@
1
- import type { GitGraphData } from "../../../types/git";
2
-
3
- export const LANE_COLORS = [
4
- "#0085d9", "#d73a49", "#6f42c1", "#2cbe4e", "#e36209",
5
- "#005cc5", "#b31d28", "#5a32a3", "#22863a", "#cb2431",
6
- ];
7
-
8
- export const ROW_HEIGHT = 24;
9
- export const LANE_WIDTH = 16;
10
- export const NODE_RADIUS = 4;
11
-
12
- /** Build commit → branch/tag label map (shows local + remote-only branches) */
13
- export function buildCommitLabels(data: GitGraphData | null) {
14
- const labels = new Map<string, Array<{ name: string; type: "branch" | "tag"; remotes: string[]; current: boolean }>>();
15
- if (!data) return labels;
16
-
17
- // Collect which remote branches are already covered by a local branch
18
- const coveredRemotes = new Set<string>();
19
- for (const branch of data.branches) {
20
- if (!branch.remote) {
21
- for (const remote of branch.remotes) {
22
- coveredRemotes.add(`remotes/${remote}/${branch.name}`);
23
- }
24
- }
25
- }
26
-
27
- for (const branch of data.branches) {
28
- if (branch.remote) {
29
- // Show remote-only branches (not covered by a local branch)
30
- if (coveredRemotes.has(branch.name)) continue;
31
- const arr = labels.get(branch.commitHash) ?? [];
32
- // Display as "remote/branch" (strip "remotes/" prefix)
33
- const displayName = branch.name.replace(/^remotes\//, "");
34
- arr.push({ name: displayName, type: "branch", remotes: [], current: false });
35
- labels.set(branch.commitHash, arr);
36
- } else {
37
- const arr = labels.get(branch.commitHash) ?? [];
38
- arr.push({ name: branch.name, type: "branch", remotes: branch.remotes, current: branch.current });
39
- labels.set(branch.commitHash, arr);
40
- }
41
- }
42
-
43
- for (const commit of data.commits) {
44
- for (const ref of commit.refs) {
45
- if (ref.startsWith("tag: ")) {
46
- const tagName = ref.replace("tag: ", "");
47
- const arr = labels.get(commit.hash) ?? [];
48
- arr.push({ name: tagName, type: "tag", remotes: [], current: false });
49
- labels.set(commit.hash, arr);
50
- }
51
- }
52
- }
53
- return labels;
54
- }
55
-
56
- /** Lane assignment algorithm — recycles freed lanes to keep graph compact */
57
- export function computeLanes(data: GitGraphData | null) {
58
- const map = new Map<string, number>();
59
- if (!data) return { laneMap: map, maxLane: 0, unloadedParentLanes: new Map<string, number>() };
60
-
61
- let nextLane = 0;
62
- let maxLaneUsed = 0;
63
- const activeLanes = new Map<string, number>();
64
- const commitSet = new Set(data.commits.map((c) => c.hash));
65
- const freeLanes: number[] = [];
66
-
67
- const allocLane = () => {
68
- if (freeLanes.length > 0) {
69
- freeLanes.sort((a, b) => a - b);
70
- return freeLanes.shift()!;
71
- }
72
- return nextLane++;
73
- };
74
-
75
- for (const commit of data.commits) {
76
- let lane = activeLanes.get(commit.hash);
77
- if (lane === undefined) lane = allocLane();
78
- map.set(commit.hash, lane);
79
- if (lane > maxLaneUsed) maxLaneUsed = lane;
80
- activeLanes.delete(commit.hash);
81
-
82
- let laneReused = false;
83
- for (let i = 0; i < commit.parents.length; i++) {
84
- const parent = commit.parents[i]!;
85
- if (!activeLanes.has(parent)) {
86
- if (i === 0) {
87
- activeLanes.set(parent, lane);
88
- laneReused = true;
89
- } else {
90
- const newLane = allocLane();
91
- activeLanes.set(parent, newLane);
92
- if (newLane > maxLaneUsed) maxLaneUsed = newLane;
93
- }
94
- }
95
- }
96
- if (!laneReused) freeLanes.push(lane);
97
- }
98
-
99
- const unloadedParentLanes = new Map<string, number>();
100
- for (const [hash, lane] of activeLanes) {
101
- if (!commitSet.has(hash)) unloadedParentLanes.set(hash, lane);
102
- }
103
-
104
- return { laneMap: map, maxLane: maxLaneUsed, unloadedParentLanes };
105
- }
106
-
107
- /** Build SVG paths for connections (including unloaded parent extension) */
108
- export function computeSvgPaths(
109
- data: GitGraphData | null,
110
- laneMap: Map<string, number>,
111
- unloadedParentLanes: Map<string, number>,
112
- totalHeight: number,
113
- ) {
114
- if (!data) return [];
115
- const paths: Array<{ d: string; color: string }> = [];
116
- const commitSet = new Set(data.commits.map((c) => c.hash));
117
-
118
- for (let idx = 0; idx < data.commits.length; idx++) {
119
- const commit = data.commits[idx]!;
120
- const lane = laneMap.get(commit.hash) ?? 0;
121
- const color = LANE_COLORS[lane % LANE_COLORS.length]!;
122
-
123
- for (const parentHash of commit.parents) {
124
- const parentIdx = data.commits.findIndex((c) => c.hash === parentHash);
125
-
126
- if (parentIdx >= 0) {
127
- // Parent is loaded — draw connection
128
- const parentLane = laneMap.get(parentHash) ?? 0;
129
- const parentColor = LANE_COLORS[parentLane % LANE_COLORS.length]!;
130
- const x1 = lane * LANE_WIDTH + LANE_WIDTH / 2;
131
- const y1 = idx * ROW_HEIGHT + ROW_HEIGHT / 2;
132
- const x2 = parentLane * LANE_WIDTH + LANE_WIDTH / 2;
133
- const y2 = parentIdx * ROW_HEIGHT + ROW_HEIGHT / 2;
134
-
135
- let d: string;
136
- const isMerge = commit.parents.indexOf(parentHash) > 0;
137
- if (x1 === x2) {
138
- d = `M ${x1} ${y1} L ${x2} ${y2}`;
139
- } else if (isMerge) {
140
- const curveEnd = y1 + ROW_HEIGHT;
141
- d = `M ${x1} ${y1} C ${x1} ${curveEnd} ${x2} ${y1} ${x2} ${curveEnd} L ${x2} ${y2}`;
142
- } else {
143
- const curveStart = y2 - ROW_HEIGHT;
144
- d = `M ${x1} ${y1} L ${x1} ${curveStart} C ${x1} ${y2} ${x2} ${curveStart} ${x2} ${y2}`;
145
- }
146
- const lineColor = commit.parents.indexOf(parentHash) === 0 ? color : parentColor;
147
- paths.push({ d, color: lineColor });
148
- } else if (!commitSet.has(parentHash)) {
149
- // Parent NOT loaded — use the parent's assigned lane for the extension line
150
- const parentLane = unloadedParentLanes.get(parentHash) ?? lane;
151
- const parentColor = LANE_COLORS[parentLane % LANE_COLORS.length]!;
152
- const x1 = lane * LANE_WIDTH + LANE_WIDTH / 2;
153
- const y1 = idx * ROW_HEIGHT + ROW_HEIGHT / 2;
154
- const x2 = parentLane * LANE_WIDTH + LANE_WIDTH / 2;
155
-
156
- if (x1 === x2) {
157
- // Same lane — straight down
158
- paths.push({ d: `M ${x1} ${y1} L ${x1} ${totalHeight}`, color });
159
- } else {
160
- // Different lane — curve then straight down
161
- const curveEnd = y1 + ROW_HEIGHT;
162
- const d = `M ${x1} ${y1} C ${x1} ${curveEnd} ${x2} ${y1} ${x2} ${curveEnd} L ${x2} ${totalHeight}`;
163
- paths.push({ d, color: parentColor });
164
- }
165
- }
166
- }
167
- }
168
- return paths;
169
- }
170
-
171
- export function relativeDate(dateStr: string): string {
172
- const date = new Date(dateStr);
173
- const now = new Date();
174
- const diffMs = now.getTime() - date.getTime();
175
- const diffMins = Math.floor(diffMs / 60000);
176
- if (diffMins < 1) return "just now";
177
- if (diffMins < 60) return `${diffMins}m ago`;
178
- const diffHours = Math.floor(diffMins / 60);
179
- if (diffHours < 24) return `${diffHours}h ago`;
180
- const diffDays = Math.floor(diffHours / 24);
181
- if (diffDays < 30) return `${diffDays}d ago`;
182
- const diffMonths = Math.floor(diffDays / 30);
183
- if (diffMonths < 12) return `${diffMonths}mo ago`;
184
- return `${Math.floor(diffMonths / 12)}y ago`;
185
- }
@@ -1,107 +0,0 @@
1
- import { Button } from "@/components/ui/button";
2
- import { useTabStore } from "@/stores/tab-store";
3
- import { basename } from "@/lib/utils";
4
- import type { GitCommit } from "../../../types/git";
5
-
6
- interface GitGraphDetailProps {
7
- commit: GitCommit;
8
- files: Array<{ path: string; additions: number; deletions: number }>;
9
- loadingDetail: boolean;
10
- projectName: string;
11
- onClose: () => void;
12
- copyHash: (hash: string) => void;
13
- }
14
-
15
- export function GitGraphDetail({
16
- commit,
17
- files,
18
- loadingDetail,
19
- projectName,
20
- onClose,
21
- copyHash,
22
- }: GitGraphDetailProps) {
23
- const { openTab } = useTabStore();
24
-
25
- return (
26
- <div className="border-t bg-muted/30 max-h-[40%] overflow-auto">
27
- <div className="px-3 py-2 border-b flex items-center justify-between">
28
- <span className="text-sm font-medium truncate">
29
- {commit.abbreviatedHash} — {commit.subject}
30
- </span>
31
- <Button variant="ghost" size="icon-xs" onClick={onClose}>
32
-
33
- </Button>
34
- </div>
35
- <div className="px-3 py-2 text-xs space-y-1">
36
- <div className="flex gap-4">
37
- <span className="text-muted-foreground w-12 shrink-0">Author</span>
38
- <span>
39
- {commit.authorName} &lt;{commit.authorEmail}&gt;
40
- </span>
41
- </div>
42
- <div className="flex gap-4">
43
- <span className="text-muted-foreground w-12 shrink-0">Date</span>
44
- <span>{new Date(commit.authorDate).toLocaleString()}</span>
45
- </div>
46
- <div className="flex gap-4">
47
- <span className="text-muted-foreground w-12 shrink-0">Hash</span>
48
- <span
49
- className="font-mono cursor-pointer hover:text-primary"
50
- onClick={() => copyHash(commit.hash)}
51
- >
52
- {commit.hash}
53
- </span>
54
- </div>
55
- {commit.parents.length > 0 && (
56
- <div className="flex gap-4">
57
- <span className="text-muted-foreground w-12 shrink-0">Parents</span>
58
- <span className="font-mono">
59
- {commit.parents.map((p) => p.slice(0, 7)).join(", ")}
60
- </span>
61
- </div>
62
- )}
63
- {commit.body && (
64
- <div className="mt-2 p-2 bg-background rounded text-xs whitespace-pre-wrap">
65
- {commit.body}
66
- </div>
67
- )}
68
- </div>
69
- {/* Changed files */}
70
- <div className="px-3 py-1 border-t">
71
- <div className="text-xs text-muted-foreground py-1">
72
- {loadingDetail
73
- ? "Loading files..."
74
- : `${files.length} file${files.length !== 1 ? "s" : ""} changed`}
75
- </div>
76
- {files.map((file) => (
77
- <div
78
- key={file.path}
79
- className="flex items-center gap-2 py-0.5 text-xs hover:bg-muted/50 rounded px-1 cursor-pointer"
80
- onClick={() =>
81
- openTab({
82
- type: "git-diff",
83
- title: `Diff ${basename(file.path)}`,
84
- closable: true,
85
- metadata: {
86
- projectName,
87
- ref1: commit.parents[0] ?? undefined,
88
- ref2: commit.hash,
89
- filePath: file.path,
90
- },
91
- projectId: projectName,
92
- })
93
- }
94
- >
95
- <span className="flex-1 truncate font-mono">{file.path}</span>
96
- {file.additions > 0 && (
97
- <span className="text-green-500">+{file.additions}</span>
98
- )}
99
- {file.deletions > 0 && (
100
- <span className="text-red-500">-{file.deletions}</span>
101
- )}
102
- </div>
103
- ))}
104
- </div>
105
- </div>
106
- );
107
- }
@@ -1,72 +0,0 @@
1
- import { useState } from "react";
2
- import {
3
- Dialog,
4
- DialogContent,
5
- DialogHeader,
6
- DialogTitle,
7
- DialogFooter,
8
- } from "@/components/ui/dialog";
9
- import { Input } from "@/components/ui/input";
10
- import { Button } from "@/components/ui/button";
11
-
12
- interface GitGraphDialogProps {
13
- type: "branch" | "tag" | null;
14
- hash?: string;
15
- onClose: () => void;
16
- onCreateBranch: (name: string, from: string) => void;
17
- onCreateTag: (name: string, hash?: string) => void;
18
- }
19
-
20
- export function GitGraphDialog({
21
- type,
22
- hash,
23
- onClose,
24
- onCreateBranch,
25
- onCreateTag,
26
- }: GitGraphDialogProps) {
27
- const [inputValue, setInputValue] = useState("");
28
-
29
- const handleSubmit = () => {
30
- if (!inputValue.trim()) return;
31
- if (type === "branch") {
32
- onCreateBranch(inputValue.trim(), hash!);
33
- } else {
34
- onCreateTag(inputValue.trim(), hash);
35
- }
36
- onClose();
37
- };
38
-
39
- return (
40
- <Dialog
41
- open={type !== null}
42
- onOpenChange={(open) => {
43
- if (!open) onClose();
44
- }}
45
- >
46
- <DialogContent>
47
- <DialogHeader>
48
- <DialogTitle>
49
- {type === "branch" ? "Create Branch" : "Create Tag"}
50
- </DialogTitle>
51
- </DialogHeader>
52
- <Input
53
- placeholder={type === "branch" ? "Branch name" : "Tag name"}
54
- value={inputValue}
55
- onChange={(e) => setInputValue(e.target.value)}
56
- onKeyDown={(e) => {
57
- if (e.key === "Enter") handleSubmit();
58
- }}
59
- autoFocus
60
- />
61
- <DialogFooter>
62
- <Button variant="outline" onClick={onClose}>
63
- Cancel
64
- </Button>
65
- <Button disabled={!inputValue.trim()} onClick={handleSubmit}>
66
- Create
67
- </Button>
68
- </DialogFooter>
69
- </DialogContent>
70
- </Dialog>
71
- );
72
- }