@hienlh/ppm 0.9.0-beta.9 → 0.9.1

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 (262) hide show
  1. package/CHANGELOG.md +233 -0
  2. package/bun.lock +17 -0
  3. package/dist/web/assets/{_basePickBy-3Xe18azI.js → _basePickBy-5PGDJbfF.js} +1 -1
  4. package/dist/web/assets/{_baseUniq-Yy35llnn.js → _baseUniq-BT4Ow4Kk.js} +1 -1
  5. package/dist/web/assets/api-settings-BUvk6Saw.js +1 -0
  6. package/dist/web/assets/{arc-B9n1Gvb5.js → arc-BAOivWpI.js} +1 -1
  7. package/dist/web/assets/architecture-PBZL5I3N-DEO2f3VD.js +1 -0
  8. package/dist/web/assets/{architectureDiagram-2XIMDMQ5-DqAZP_F6.js → architectureDiagram-2XIMDMQ5-Z-4eN4za.js} +1 -1
  9. package/dist/web/assets/arrow-up-BYhx9ckd.js +1 -0
  10. package/dist/web/assets/{blockDiagram-WCTKOSBZ-h3cDF2vI.js → blockDiagram-WCTKOSBZ-BCLqzhuZ.js} +1 -1
  11. package/dist/web/assets/browser-tab-CrkhFCaw.js +1 -0
  12. package/dist/web/assets/{c4Diagram-IC4MRINW--pF1r5lr.js → c4Diagram-IC4MRINW-0Vp0Jeas.js} +1 -1
  13. package/dist/web/assets/channel-By7bn0Yq.js +1 -0
  14. package/dist/web/assets/chat-tab-C6jpiwh7.js +8 -0
  15. package/dist/web/assets/chevron-right-5HgK6l7K.js +1 -0
  16. package/dist/web/assets/{chunk-4BX2VUAB-C3aZvW7B.js → chunk-4BX2VUAB-D4tOov49.js} +1 -1
  17. package/dist/web/assets/{chunk-55IACEB6-D5cABeB9.js → chunk-55IACEB6-DJ6BynZ4.js} +1 -1
  18. package/dist/web/assets/{chunk-7E7YKBS2-CkFGv6Zs.js → chunk-7E7YKBS2-CiyUJxNI.js} +1 -1
  19. package/dist/web/assets/{chunk-7R4GIKGN-Dvbyu4Zw.js → chunk-7R4GIKGN-Dv-4cAYn.js} +2 -2
  20. package/dist/web/assets/{chunk-C72U2L5F-CtqKiH4q.js → chunk-C72U2L5F-D21mS_6G.js} +1 -1
  21. package/dist/web/assets/{chunk-EGIJ26TM-Cpr87sBR.js → chunk-EGIJ26TM-DzqmU2Z7.js} +1 -1
  22. package/dist/web/assets/{chunk-FMBD7UC4-D23YVTOU.js → chunk-FMBD7UC4-DXncblvW.js} +1 -1
  23. package/dist/web/assets/{chunk-GEFDOKGD-tDjHsAUs.js → chunk-GEFDOKGD-D-pKjlVd.js} +1 -1
  24. package/dist/web/assets/chunk-GLR3WWYH-DKikpoJM.js +2 -0
  25. package/dist/web/assets/chunk-HHEYEP7N-C7vxA5i9.js +1 -0
  26. package/dist/web/assets/{chunk-JSJVCQXG-BBmymCjA.js → chunk-JSJVCQXG-99JzIdPr.js} +1 -1
  27. package/dist/web/assets/{chunk-KX2RTZJC-DP36BDiU.js → chunk-KX2RTZJC-CRq1OBZv.js} +1 -1
  28. package/dist/web/assets/{chunk-KYZI473N-Djw13C-3.js → chunk-KYZI473N-Bb0MCaIO.js} +1 -1
  29. package/dist/web/assets/{chunk-L3YUKLVL-HG_eMj_C.js → chunk-L3YUKLVL-C7qGJrfV.js} +1 -1
  30. package/dist/web/assets/{chunk-MX3YWQON-C2UEioMs.js → chunk-MX3YWQON-BpS_PtKp.js} +1 -1
  31. package/dist/web/assets/{chunk-NQ4KR5QH-DXUTQ-BL.js → chunk-NQ4KR5QH-z_blpjxi.js} +1 -1
  32. package/dist/web/assets/{chunk-O4XLMI2P-BsUWb9d0.js → chunk-O4XLMI2P-nDhi_cVu.js} +1 -1
  33. package/dist/web/assets/{chunk-OZEHJAEY-rG0P22U9.js → chunk-OZEHJAEY-BXhYx3nO.js} +1 -1
  34. package/dist/web/assets/{chunk-PQ6SQG4A-DX0xW7kO.js → chunk-PQ6SQG4A-TF58UVMU.js} +1 -1
  35. package/dist/web/assets/{chunk-PU5JKC2W-C7Gry6md.js → chunk-PU5JKC2W-ek7k4QVB.js} +1 -1
  36. package/dist/web/assets/chunk-QZHKN3VN-CYaTbeZf.js +1 -0
  37. package/dist/web/assets/{chunk-R5LLSJPH-CMY0PkRK.js → chunk-R5LLSJPH-CFwSJijQ.js} +1 -1
  38. package/dist/web/assets/{chunk-WL4C6EOR-CXuQvlyu.js → chunk-WL4C6EOR-ByUrSRin.js} +1 -1
  39. package/dist/web/assets/{chunk-XIRO2GV7-DRJEb7Zb.js → chunk-XIRO2GV7-Djlmrely.js} +1 -1
  40. package/dist/web/assets/{chunk-XPW4576I-BPEX8KhL.js → chunk-XPW4576I-BPQQBakK.js} +1 -1
  41. package/dist/web/assets/{chunk-XZSTWKYB-Cb0iqycX.js → chunk-XZSTWKYB-DxAOx4hG.js} +1 -1
  42. package/dist/web/assets/{chunk-YBOYWFTD-av5aeHLq.js → chunk-YBOYWFTD-rQG3QH5s.js} +1 -1
  43. package/dist/web/assets/classDiagram-VBA2DB6C-BA8Nj-_C.js +1 -0
  44. package/dist/web/assets/classDiagram-v2-RAHNMMFH-DjYu-6mn.js +1 -0
  45. package/dist/web/assets/clone-LRxlvnMj.js +1 -0
  46. package/dist/web/assets/code-editor-CBIPzlP2.js +2 -0
  47. package/dist/web/assets/columns-2-cEVJHYd7.js +1 -0
  48. package/dist/web/assets/{cose-bilkent-S5V4N54A-qudEiMCT.js → cose-bilkent-S5V4N54A-B_AWZsOP.js} +1 -1
  49. package/dist/web/assets/createLucideIcon-PuMiQgHl.js +1 -0
  50. package/dist/web/assets/{csv-preview-DUbHtTAS.js → csv-preview-ncSOnJSC.js} +2 -2
  51. package/dist/web/assets/{dagre-BFcnKyBF.js → dagre-DHq9bhnd.js} +1 -1
  52. package/dist/web/assets/{dagre-KLK3FWXG-C3O-MTLf.js → dagre-KLK3FWXG-BdJr7Byp.js} +1 -1
  53. package/dist/web/assets/database-viewer-BqOJR_zi.js +1 -0
  54. package/dist/web/assets/{diagram-E7M64L7V-DxPjK7_c.js → diagram-E7M64L7V-_db4pBVA.js} +1 -1
  55. package/dist/web/assets/{diagram-IFDJBPK2-sqTog_XV.js → diagram-IFDJBPK2-xKoeuiJx.js} +1 -1
  56. package/dist/web/assets/{diagram-P4PSJMXO-hzmp0GHK.js → diagram-P4PSJMXO-C8tjJsev.js} +1 -1
  57. package/dist/web/assets/diff-viewer-CcLyp4eY.js +4 -0
  58. package/dist/web/assets/{dist-CALwEtco.js → dist-DIV6WgAG.js} +1 -1
  59. package/dist/web/assets/{dist-DGDPTxs1.js → dist-ovWkrgO-.js} +1 -1
  60. package/dist/web/assets/{erDiagram-INFDFZHY-DLeYhAAT.js → erDiagram-INFDFZHY-BSh2z9Df.js} +1 -1
  61. package/dist/web/assets/extension-webview-NiZ7Ybvv.js +3 -0
  62. package/dist/web/assets/{flowDiagram-PKNHOUZH-CRxlE9Sr.js → flowDiagram-PKNHOUZH-oYaovqyp.js} +1 -1
  63. package/dist/web/assets/{ganttDiagram-A5KZAMGK-BdjmoMLS.js → ganttDiagram-A5KZAMGK-DmL26q2P.js} +1 -1
  64. package/dist/web/assets/git-graph-CoTvMrIo.js +1 -0
  65. package/dist/web/assets/gitGraph-HDMCJU4V-Bwna3and.js +1 -0
  66. package/dist/web/assets/{gitGraphDiagram-K3NZZRJ6-BeHSX7kk.js → gitGraphDiagram-K3NZZRJ6-CMoukSrY.js} +1 -1
  67. package/dist/web/assets/{graphlib-Duh_bWLa.js → graphlib-BcsNnGcW.js} +1 -1
  68. package/dist/web/assets/index-C8byznLO.js +37 -0
  69. package/dist/web/assets/index-KwC2YrG4.css +2 -0
  70. package/dist/web/assets/info-3K5VOQVL-_vRxVNUm.js +1 -0
  71. package/dist/web/assets/infoDiagram-LFFYTUFH-DWwumDkq.js +2 -0
  72. package/dist/web/assets/{isEmpty-B9L-Ge-H.js → isEmpty-bnrF3Qbc.js} +1 -1
  73. package/dist/web/assets/{ishikawaDiagram-PHBUUO56-Cu0Rt1Ok.js → ishikawaDiagram-PHBUUO56-D05_LyL7.js} +1 -1
  74. package/dist/web/assets/{journeyDiagram-4ABVD52K-CgDI-UG4.js → journeyDiagram-4ABVD52K-B_L20qMe.js} +1 -1
  75. package/dist/web/assets/jsx-runtime-kMwlnEGE.js +1 -0
  76. package/dist/web/assets/{kanban-definition-K7BYSVSG-h4g10UHL.js → kanban-definition-K7BYSVSG-CZ535BbZ.js} +1 -1
  77. package/dist/web/assets/keybindings-store-DPYzBe_M.js +1 -0
  78. package/dist/web/assets/{line-B75-Rx70.js → line-CVvo3dRu.js} +1 -1
  79. package/dist/web/assets/{linear-Bcjv9FQt.js → linear-DP4mkX3m.js} +1 -1
  80. package/dist/web/assets/{markdown-renderer-VIZB1GXE.js → markdown-renderer-DPLdR9xc.js} +5 -5
  81. package/dist/web/assets/{mermaid-parser.core-8u2leTXI.js → mermaid-parser.core-C7UwoIh6.js} +2 -2
  82. package/dist/web/assets/{mindmap-definition-YRQLILUH-BaOBwb-W.js → mindmap-definition-YRQLILUH-x0MTutJp.js} +1 -1
  83. package/dist/web/assets/{ordinal-LFEjVtwQ.js → ordinal-_K3x1fkz.js} +1 -1
  84. package/dist/web/assets/packet-RMMSAZCW-DY5PNnZU.js +1 -0
  85. package/dist/web/assets/pie-UPGHQEXC-BHncZutv.js +1 -0
  86. package/dist/web/assets/{pieDiagram-SKSYHLDU-At5Kz0KK.js → pieDiagram-SKSYHLDU-C1Gjrtzy.js} +1 -1
  87. package/dist/web/assets/postgres-viewer-BeiK4lCa.js +1 -0
  88. package/dist/web/assets/{quadrantDiagram-337W2JSQ-CdjGIDfw.js → quadrantDiagram-337W2JSQ-C8bzJCjQ.js} +1 -1
  89. package/dist/web/assets/radar-KQ55EAFF-DH0AOkUy.js +1 -0
  90. package/dist/web/assets/{requirementDiagram-Z7DCOOCP-B9F_Cx_p.js → requirementDiagram-Z7DCOOCP-pQyah6WB.js} +1 -1
  91. package/dist/web/assets/{sankeyDiagram-WA2Y5GQK-RolPi8bU.js → sankeyDiagram-WA2Y5GQK-T6RgG-N8.js} +1 -1
  92. package/dist/web/assets/{sequenceDiagram-2WXFIKYE-DM-tMAhx.js → sequenceDiagram-2WXFIKYE-BQDJ4CVs.js} +1 -1
  93. package/dist/web/assets/settings-tab-D3AvU4lu.js +1 -0
  94. package/dist/web/assets/sqlite-viewer-nA2sD4Yv.js +1 -0
  95. package/dist/web/assets/{stateDiagram-RAJIS63D-C4EMl6jf.js → stateDiagram-RAJIS63D-66vhiIuk.js} +1 -1
  96. package/dist/web/assets/stateDiagram-v2-FVOUBMTO-BGVqj_g9.js +1 -0
  97. package/dist/web/assets/tab-store-BOgTrqRr.js +1 -0
  98. package/dist/web/assets/table-DFevCOMd.js +1 -0
  99. package/dist/web/assets/tag-CXMT0QB6.js +1 -0
  100. package/dist/web/assets/{terminal-tab-XhKfb4ei.js → terminal-tab-BBi0pEji.js} +1 -1
  101. package/dist/web/assets/{timeline-definition-YZTLITO2-A4PN_Efm.js → timeline-definition-YZTLITO2-DwZqB3nn.js} +1 -1
  102. package/dist/web/assets/treemap-KZPCXAKY-B2Xkyv-K.js +1 -0
  103. package/dist/web/assets/{use-monaco-theme-0p0-84jJ.js → use-monaco-theme-B5pG2d1w.js} +1 -1
  104. package/dist/web/assets/{vennDiagram-LZ73GAT5-ywK7LMaH.js → vennDiagram-LZ73GAT5-s9Z71fz-.js} +1 -1
  105. package/dist/web/assets/{xychartDiagram-JWTSCODW-DylHYNtJ.js → xychartDiagram-JWTSCODW-DRa_TH4B.js} +1 -1
  106. package/dist/web/index.html +10 -9
  107. package/dist/web/monacoeditorwork/css.worker.bundle.js +122 -122
  108. package/dist/web/monacoeditorwork/editor.worker.bundle.js +78 -78
  109. package/dist/web/monacoeditorwork/html.worker.bundle.js +110 -110
  110. package/dist/web/monacoeditorwork/json.worker.bundle.js +108 -108
  111. package/dist/web/monacoeditorwork/ts.worker.bundle.js +81 -81
  112. package/dist/web/sw.js +1 -1
  113. package/docs/code-standards.md +128 -1
  114. package/docs/codebase-summary.md +79 -12
  115. package/docs/extension-development-guide.md +532 -0
  116. package/docs/project-changelog.md +51 -1
  117. package/docs/project-roadmap.md +9 -3
  118. package/docs/streaming-input-guide.md +267 -0
  119. package/docs/system-architecture.md +432 -3
  120. package/package.json +6 -3
  121. package/packages/ext-database/package.json +41 -0
  122. package/packages/ext-database/src/connection-tree.ts +142 -0
  123. package/packages/ext-database/src/extension.ts +346 -0
  124. package/packages/ext-database/src/query-panel.ts +120 -0
  125. package/packages/ext-database/src/table-viewer-panel.ts +410 -0
  126. package/packages/ext-database/tsconfig.json +8 -0
  127. package/packages/vscode-compat/package.json +16 -0
  128. package/packages/vscode-compat/src/commands.ts +39 -0
  129. package/packages/vscode-compat/src/context.ts +65 -0
  130. package/packages/vscode-compat/src/disposable.ts +21 -0
  131. package/packages/vscode-compat/src/env.ts +20 -0
  132. package/packages/vscode-compat/src/event-emitter.ts +28 -0
  133. package/packages/vscode-compat/src/index.ts +93 -0
  134. package/packages/vscode-compat/src/not-supported.ts +15 -0
  135. package/packages/vscode-compat/src/types.ts +167 -0
  136. package/packages/vscode-compat/src/uri.ts +65 -0
  137. package/packages/vscode-compat/src/window.ts +229 -0
  138. package/packages/vscode-compat/src/workspace.ts +76 -0
  139. package/packages/vscode-compat/tsconfig.json +10 -0
  140. package/snapshot-state.md +1526 -0
  141. package/src/cli/commands/autostart.ts +1 -1
  142. package/src/cli/commands/ext-cmd.ts +121 -0
  143. package/src/cli/commands/restart.ts +9 -1
  144. package/src/cli/commands/status.ts +19 -0
  145. package/src/index.ts +5 -3
  146. package/src/providers/claude-agent-sdk.ts +221 -17
  147. package/src/providers/cli-provider-base.ts +6 -0
  148. package/src/server/index.ts +55 -155
  149. package/src/server/routes/chat.ts +81 -11
  150. package/src/server/routes/extensions.ts +81 -0
  151. package/src/server/routes/project-scoped.ts +2 -0
  152. package/src/server/routes/settings.ts +27 -0
  153. package/src/server/routes/workspace.ts +35 -0
  154. package/src/server/ws/chat.ts +9 -3
  155. package/src/server/ws/extensions.ts +175 -0
  156. package/src/services/account-selector.service.ts +14 -5
  157. package/src/services/account.service.ts +7 -7
  158. package/src/services/claude-usage.service.ts +11 -11
  159. package/src/services/cloud-ws.service.ts +228 -0
  160. package/src/services/cloud.service.ts +1 -0
  161. package/src/services/contribution-registry.ts +110 -0
  162. package/src/services/db.service.ts +181 -4
  163. package/src/services/extension-host-worker.ts +160 -0
  164. package/src/services/extension-installer.ts +112 -0
  165. package/src/services/extension-manifest.ts +65 -0
  166. package/src/services/extension-rpc-handlers.ts +235 -0
  167. package/src/services/extension-rpc.ts +105 -0
  168. package/src/services/extension.service.ts +228 -0
  169. package/src/services/mcp-config.service.ts +15 -6
  170. package/src/services/supervisor.ts +271 -25
  171. package/src/types/api.ts +1 -0
  172. package/src/types/chat.ts +4 -0
  173. package/src/types/extension-messages.ts +64 -0
  174. package/src/types/extension.ts +131 -0
  175. package/src/web/app.tsx +69 -48
  176. package/src/web/components/chat/account-rotation-settings.tsx +163 -0
  177. package/src/web/components/chat/chat-history-bar.tsx +106 -10
  178. package/src/web/components/chat/chat-tab.tsx +15 -10
  179. package/src/web/components/chat/chat-welcome.tsx +148 -0
  180. package/src/web/components/chat/message-list.tsx +19 -6
  181. package/src/web/components/chat/session-picker.tsx +80 -32
  182. package/src/web/components/chat/usage-badge.tsx +68 -8
  183. package/src/web/components/extensions/extension-inputbox.tsx +92 -0
  184. package/src/web/components/extensions/extension-quickpick.tsx +194 -0
  185. package/src/web/components/extensions/extension-tree-view.tsx +240 -0
  186. package/src/web/components/extensions/extension-webview.tsx +83 -0
  187. package/src/web/components/layout/command-palette.tsx +22 -2
  188. package/src/web/components/layout/editor-panel.tsx +163 -18
  189. package/src/web/components/layout/mobile-nav.tsx +2 -1
  190. package/src/web/components/layout/sidebar.tsx +21 -3
  191. package/src/web/components/layout/status-bar.tsx +64 -0
  192. package/src/web/components/layout/tab-bar.tsx +2 -0
  193. package/src/web/components/layout/tab-content.tsx +5 -0
  194. package/src/web/components/layout/upgrade-banner.tsx +15 -5
  195. package/src/web/components/settings/change-password-section.tsx +128 -0
  196. package/src/web/components/settings/extension-manager-section.tsx +214 -0
  197. package/src/web/components/settings/settings-tab.tsx +9 -2
  198. package/src/web/components/shared/connection-lost-overlay.tsx +89 -0
  199. package/src/web/hooks/use-chat.ts +28 -0
  200. package/src/web/hooks/use-extension-ws.ts +181 -0
  201. package/src/web/hooks/use-global-keybindings.ts +18 -2
  202. package/src/web/hooks/use-server-reload.ts +9 -0
  203. package/src/web/hooks/use-url-sync.ts +173 -21
  204. package/src/web/stores/connection-store.ts +39 -0
  205. package/src/web/stores/extension-store.ts +204 -0
  206. package/src/web/stores/panel-store.ts +63 -9
  207. package/src/web/stores/panel-utils.ts +145 -3
  208. package/src/web/stores/settings-store.ts +7 -2
  209. package/src/web/stores/tab-store.ts +2 -1
  210. package/test-session-ops.mjs +444 -0
  211. package/test-tokens.mjs +212 -0
  212. package/tsconfig.json +3 -1
  213. package/dist/web/assets/api-settings-CEMxVMCV.js +0 -1
  214. package/dist/web/assets/architecture-PBZL5I3N-CFzkFKEL.js +0 -1
  215. package/dist/web/assets/arrow-up--LjUXLEt.js +0 -1
  216. package/dist/web/assets/browser-tab-D1Zua62g.js +0 -1
  217. package/dist/web/assets/channel-C2fMafck.js +0 -1
  218. package/dist/web/assets/chat-tab-BnD27Vp9.js +0 -7
  219. package/dist/web/assets/chevron-right-CHnjJt4E.js +0 -1
  220. package/dist/web/assets/chunk-GLR3WWYH-DBdWQ3zy.js +0 -2
  221. package/dist/web/assets/chunk-HHEYEP7N-BBw_z0fW.js +0 -1
  222. package/dist/web/assets/chunk-QZHKN3VN-DFKFM_C1.js +0 -1
  223. package/dist/web/assets/classDiagram-VBA2DB6C-Dp4Kk3Yb.js +0 -1
  224. package/dist/web/assets/classDiagram-v2-RAHNMMFH-D8IvcV_B.js +0 -1
  225. package/dist/web/assets/clone-B2hUek6n.js +0 -1
  226. package/dist/web/assets/code-editor-DGRg8stf.js +0 -2
  227. package/dist/web/assets/columns-2-DbesTfa7.js +0 -1
  228. package/dist/web/assets/database-viewer-DxCXZQcE.js +0 -1
  229. package/dist/web/assets/diff-viewer-C1sDJG35.js +0 -4
  230. package/dist/web/assets/git-graph-BDn-EiGE.js +0 -1
  231. package/dist/web/assets/gitGraph-HDMCJU4V-CNlas3Rz.js +0 -1
  232. package/dist/web/assets/index-Bun94AK3.js +0 -37
  233. package/dist/web/assets/index-Db8uky1a.css +0 -2
  234. package/dist/web/assets/info-3K5VOQVL-BDzTLc11.js +0 -1
  235. package/dist/web/assets/infoDiagram-LFFYTUFH-ZZmpgc6t.js +0 -2
  236. package/dist/web/assets/jsx-runtime-BRW_vwa9.js +0 -1
  237. package/dist/web/assets/keybindings-store-COmK4Dte.js +0 -1
  238. package/dist/web/assets/packet-RMMSAZCW-IVa5F-go.js +0 -1
  239. package/dist/web/assets/pie-UPGHQEXC-CvXHKAzp.js +0 -1
  240. package/dist/web/assets/postgres-viewer-CvQZ8gkh.js +0 -1
  241. package/dist/web/assets/radar-KQ55EAFF-Z-Tr5wtS.js +0 -1
  242. package/dist/web/assets/settings-tab-RCnvZ29H.js +0 -1
  243. package/dist/web/assets/sqlite-viewer-CEEm2W4C.js +0 -1
  244. package/dist/web/assets/stateDiagram-v2-FVOUBMTO-B-UjZch3.js +0 -1
  245. package/dist/web/assets/tab-store-Bjh6bXFP.js +0 -1
  246. package/dist/web/assets/table-CQVQM2SB.js +0 -1
  247. package/dist/web/assets/tag-Q2dZiSPX.js +0 -1
  248. package/dist/web/assets/treemap-KZPCXAKY-C9TYRE0k.js +0 -1
  249. /package/dist/web/assets/{api-client-BKIT_Qeg.js → api-client-BfBM3I7n.js} +0 -0
  250. /package/dist/web/assets/{array-DqLCdDFv.js → array-B9UHiPd-.js} +0 -0
  251. /package/dist/web/assets/{cytoscape.esm-CWPXKqbJ.js → cytoscape.esm-BW-DbntU.js} +0 -0
  252. /package/dist/web/assets/{defaultLocale-CrJzLgRD.js → defaultLocale-5eAKkKJC.js} +0 -0
  253. /package/dist/web/assets/{dist-Cep75xXf.js → dist-CSJdAyA9.js} +0 -0
  254. /package/dist/web/assets/{init-C0r9Gk5G.js → init-DlZdxViB.js} +0 -0
  255. /package/dist/web/assets/{isArrayLikeObject-CGBoxvCD.js → isArrayLikeObject-B_v2FtYn.js} +0 -0
  256. /package/dist/web/assets/{katex-DzXRfQ_m.js → katex-Bqvo_ZG0.js} +0 -0
  257. /package/dist/web/assets/{lib-BeaDXEkP.js → lib-BQ34Db2e.js} +0 -0
  258. /package/dist/web/assets/{math-y9zN1W-N.js → math-069Z4SuC.js} +0 -0
  259. /package/dist/web/assets/{path-DIKpVbHL.js → path-6uRLdFF7.js} +0 -0
  260. /package/dist/web/assets/{rough.esm-nHaDi0Kw.js → rough.esm-JX0wREDd.js} +0 -0
  261. /package/dist/web/assets/{src-Dw4QhedI.js → src-BqX54PbV.js} +0 -0
  262. /package/dist/web/assets/{utils-DMiycH3O.js → utils-BNytJOb1.js} +0 -0
@@ -0,0 +1,346 @@
1
+ /**
2
+ * @ppm/ext-database — Database Viewer extension for PPM.
3
+ * Provides a sidebar tree view of DB connections/tables/columns
4
+ * and a full-featured table viewer webview with inline editing,
5
+ * pagination, and SQL query panel.
6
+ */
7
+ import type { ExtensionContext } from "@ppm/vscode-compat";
8
+ import { ConnectionTreeProvider } from "./connection-tree.ts";
9
+ import { getQueryPanelHtml } from "./query-panel.ts";
10
+ import { getTableViewerHtml } from "./table-viewer-panel.ts";
11
+
12
+ /** PPM vscode-compat API namespace (passed as second arg by Worker) */
13
+ interface VscodeApi {
14
+ commands: {
15
+ registerCommand(command: string, callback: (...args: unknown[]) => unknown): { dispose(): void };
16
+ };
17
+ window: {
18
+ showInformationMessage(message: string, ...items: string[]): Promise<string | undefined>;
19
+ showErrorMessage(message: string, ...items: string[]): Promise<string | undefined>;
20
+ showQuickPick(items: string[], options?: { placeHolder?: string }): Promise<string | undefined>;
21
+ showInputBox(options?: { prompt?: string; placeHolder?: string; value?: string }): Promise<string | undefined>;
22
+ createTreeView(viewId: string, options: { treeDataProvider: unknown }): { dispose(): void };
23
+ createWebviewPanel(viewType: string, title: string, showOptions: unknown): {
24
+ webview: {
25
+ html: string;
26
+ onDidReceiveMessage: (listener: (msg: unknown) => void) => { dispose(): void };
27
+ postMessage(message: unknown): Promise<boolean>;
28
+ };
29
+ onDidDispose: (listener: () => void) => { dispose(): void };
30
+ dispose(): void;
31
+ };
32
+ createStatusBarItem(alignment?: unknown, priority?: number): {
33
+ text: string; tooltip?: string; command?: string;
34
+ show(): void; hide(): void; dispose(): void;
35
+ };
36
+ };
37
+ EventEmitter: new <T>() => { fire(data?: T): void; event: unknown; dispose(): void };
38
+ StatusBarAlignment: { Left: number; Right: number };
39
+ ViewColumn: { Active: number };
40
+ }
41
+
42
+ // Server base URL for fetch() calls (set by Worker before activation)
43
+ let baseUrl = "";
44
+
45
+ export function activate(context: ExtensionContext, vscode: VscodeApi): void {
46
+ baseUrl = (globalThis as any).__PPM_BASE_URL__ || "";
47
+
48
+ // --- Tree View ---
49
+ const emitter = new vscode.EventEmitter<unknown>();
50
+ const treeProvider = new ConnectionTreeProvider(
51
+ { fire: (el?: unknown) => emitter.fire(el), event: emitter.event },
52
+ baseUrl,
53
+ );
54
+
55
+ const treeView = vscode.window.createTreeView("ppm-db.connections", {
56
+ treeDataProvider: treeProvider,
57
+ });
58
+ context.subscriptions.push(treeView);
59
+
60
+ // --- Commands ---
61
+ context.subscriptions.push(
62
+ vscode.commands.registerCommand("ppm-db.openViewer", (...args: unknown[]) => {
63
+ const connectionId = (args[0] as number) ?? 1;
64
+ const connectionName = (args[1] as string) ?? "Database";
65
+ const tableName = args[2] as string | undefined;
66
+ const schemaName = (args[3] as string) ?? "public";
67
+ if (tableName) {
68
+ openTableViewer(vscode, context, connectionId, connectionName, tableName, schemaName);
69
+ } else {
70
+ openQueryPanel(vscode, context, connectionId, connectionName);
71
+ }
72
+ }),
73
+ );
74
+
75
+ context.subscriptions.push(
76
+ vscode.commands.registerCommand("ppm-db.runQuery", () => {
77
+ openQueryPanel(vscode, context, 1, "Default");
78
+ }),
79
+ );
80
+
81
+ context.subscriptions.push(
82
+ vscode.commands.registerCommand("ppm-db.refreshConnections", () => {
83
+ treeProvider.refresh();
84
+ }),
85
+ );
86
+
87
+ context.subscriptions.push(
88
+ vscode.commands.registerCommand("ppm-db.refreshConnection", () => {
89
+ treeProvider.refresh();
90
+ }),
91
+ );
92
+
93
+ context.subscriptions.push(
94
+ vscode.commands.registerCommand("ppm-db.addConnection", async () => {
95
+ await addConnection(vscode, treeProvider);
96
+ }),
97
+ );
98
+
99
+ // --- Status Bar ---
100
+ const statusItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 10);
101
+ statusItem.text = "DB";
102
+ statusItem.tooltip = "Database Viewer";
103
+ statusItem.command = "ppm-db.runQuery";
104
+ statusItem.show();
105
+ context.subscriptions.push(statusItem);
106
+
107
+ console.log("[ext-database] activated");
108
+ }
109
+
110
+ export function deactivate(): void {
111
+ console.log("[ext-database] deactivated");
112
+ }
113
+
114
+ // ---------------------------------------------------------------------------
115
+ // Table Viewer — full-featured data grid with inline editing & SQL panel
116
+ // ---------------------------------------------------------------------------
117
+
118
+ function openTableViewer(
119
+ vscode: VscodeApi,
120
+ context: ExtensionContext,
121
+ connectionId: number,
122
+ connectionName: string,
123
+ tableName: string,
124
+ schemaName: string,
125
+ ): void {
126
+ const panel = vscode.window.createWebviewPanel(
127
+ "ppm-db.tableViewer",
128
+ `${connectionName} · ${tableName}`,
129
+ vscode.ViewColumn.Active,
130
+ );
131
+
132
+ panel.webview.html = getTableViewerHtml({ connectionId, connectionName, tableName, schemaName });
133
+
134
+ const msgDisposable = panel.webview.onDidReceiveMessage(async (raw: unknown) => {
135
+ const msg = raw as Record<string, unknown>;
136
+ const connId = (msg.connectionId as number) ?? connectionId;
137
+ const tbl = (msg.tableName as string) ?? tableName;
138
+ const schema = (msg.schemaName as string) ?? schemaName;
139
+
140
+ switch (msg.type) {
141
+ case "init":
142
+ case "refresh":
143
+ await sendTableData(panel, connId, tbl, schema, (msg.page as number) ?? 1);
144
+ break;
145
+
146
+ case "fetchPage":
147
+ await sendTableData(panel, connId, tbl, schema, (msg.page as number) ?? 1);
148
+ break;
149
+
150
+ case "executeQuery":
151
+ await handleQuery(panel, connId, msg.sql as string);
152
+ break;
153
+
154
+ case "updateCell":
155
+ await handleCellUpdate(panel, connId, tbl, schema, msg);
156
+ break;
157
+ }
158
+ });
159
+ context.subscriptions.push(msgDisposable);
160
+ panel.onDidDispose(() => msgDisposable.dispose());
161
+ }
162
+
163
+ /** Fetch table data + schema and send to webview */
164
+ async function sendTableData(
165
+ panel: ReturnType<VscodeApi["window"]["createWebviewPanel"]>,
166
+ connectionId: number,
167
+ tableName: string,
168
+ schemaName: string,
169
+ page: number,
170
+ ): Promise<void> {
171
+ try {
172
+ const [dataRes, schemaRes] = await Promise.all([
173
+ fetch(`${baseUrl}/api/db/connections/${connectionId}/data?table=${encodeURIComponent(tableName)}&schema=${schemaName}&page=${page}&limit=100`),
174
+ fetch(`${baseUrl}/api/db/connections/${connectionId}/schema?table=${encodeURIComponent(tableName)}&schema=${schemaName}`),
175
+ ]);
176
+ const dataJson = await dataRes.json() as { ok: boolean; data?: { columns: string[]; rows: Record<string, unknown>[]; total: number; page: number; limit: number } };
177
+ const schemaJson = await schemaRes.json() as { ok: boolean; data?: { name: string; type: string; nullable: boolean; pk: boolean; defaultValue: string | null }[] };
178
+
179
+ if (!dataJson.ok) {
180
+ await panel.webview.postMessage({ type: "error", message: "Failed to load table data" });
181
+ return;
182
+ }
183
+
184
+ await panel.webview.postMessage({
185
+ type: "tableData",
186
+ columns: dataJson.data?.columns ?? [],
187
+ rows: dataJson.data?.rows ?? [],
188
+ total: dataJson.data?.total ?? 0,
189
+ page: dataJson.data?.page ?? page,
190
+ limit: dataJson.data?.limit ?? 100,
191
+ schema: schemaJson.data ?? [],
192
+ });
193
+ } catch (e) {
194
+ const errMsg = e instanceof Error ? e.message : String(e);
195
+ await panel.webview.postMessage({ type: "error", message: errMsg });
196
+ }
197
+ }
198
+
199
+ /** Execute SQL query and send result to webview */
200
+ async function handleQuery(
201
+ panel: ReturnType<VscodeApi["window"]["createWebviewPanel"]>,
202
+ connectionId: number,
203
+ sql: string,
204
+ ): Promise<void> {
205
+ if (!sql) return;
206
+ try {
207
+ const start = Date.now();
208
+ const res = await fetch(`${baseUrl}/api/db/connections/${connectionId}/query`, {
209
+ method: "POST",
210
+ headers: { "Content-Type": "application/json" },
211
+ body: JSON.stringify({ sql }),
212
+ });
213
+ const json = await res.json() as { ok: boolean; data?: { columns: string[]; rows: Record<string, unknown>[]; rowsAffected: number; changeType: string } };
214
+ const duration = Date.now() - start;
215
+
216
+ if (!json.ok) {
217
+ await panel.webview.postMessage({ type: "queryError", error: (json as any).error ?? "Query failed" });
218
+ return;
219
+ }
220
+
221
+ await panel.webview.postMessage({
222
+ type: "queryResult",
223
+ columns: json.data?.columns ?? [],
224
+ rows: json.data?.rows ?? [],
225
+ rowsAffected: json.data?.rowsAffected ?? 0,
226
+ changeType: json.data?.changeType ?? "select",
227
+ duration,
228
+ });
229
+ } catch (e) {
230
+ const errMsg = e instanceof Error ? e.message : String(e);
231
+ await panel.webview.postMessage({ type: "queryError", error: errMsg });
232
+ }
233
+ }
234
+
235
+ /** Update a single cell value */
236
+ async function handleCellUpdate(
237
+ panel: ReturnType<VscodeApi["window"]["createWebviewPanel"]>,
238
+ connectionId: number,
239
+ tableName: string,
240
+ schemaName: string,
241
+ msg: Record<string, unknown>,
242
+ ): Promise<void> {
243
+ try {
244
+ const res = await fetch(`${baseUrl}/api/db/connections/${connectionId}/cell`, {
245
+ method: "PUT",
246
+ headers: { "Content-Type": "application/json" },
247
+ body: JSON.stringify({
248
+ table: tableName,
249
+ schema: schemaName,
250
+ pkColumn: msg.pkColumn,
251
+ pkValue: msg.pkValue,
252
+ column: msg.column,
253
+ value: msg.value,
254
+ }),
255
+ });
256
+ const json = await res.json() as { ok: boolean; error?: string };
257
+ if (json.ok) {
258
+ await panel.webview.postMessage({ type: "cellUpdated" });
259
+ } else {
260
+ await panel.webview.postMessage({ type: "error", message: json.error ?? "Cell update failed" });
261
+ }
262
+ } catch (e) {
263
+ const errMsg = e instanceof Error ? e.message : String(e);
264
+ await panel.webview.postMessage({ type: "error", message: errMsg });
265
+ }
266
+ }
267
+
268
+ // ---------------------------------------------------------------------------
269
+ // Query Panel — standalone SQL editor (opened from status bar)
270
+ // ---------------------------------------------------------------------------
271
+
272
+ function openQueryPanel(
273
+ vscode: VscodeApi,
274
+ context: ExtensionContext,
275
+ connectionId: number,
276
+ connectionName: string,
277
+ tableName?: string,
278
+ ): void {
279
+ const panel = vscode.window.createWebviewPanel(
280
+ "ppm-db.queryPanel",
281
+ `Query: ${connectionName}`,
282
+ vscode.ViewColumn.Active,
283
+ );
284
+
285
+ panel.webview.html = getQueryPanelHtml(connectionName, tableName);
286
+
287
+ const msgDisposable = panel.webview.onDidReceiveMessage(async (raw: unknown) => {
288
+ const msg = raw as { type: string; sql?: string };
289
+ if (msg.type !== "executeQuery" || !msg.sql) return;
290
+ await handleQuery(panel, connectionId, msg.sql);
291
+ });
292
+ context.subscriptions.push(msgDisposable);
293
+ panel.onDidDispose(() => msgDisposable.dispose());
294
+ }
295
+
296
+ // ---------------------------------------------------------------------------
297
+ // Add Connection — collect info via QuickPick + InputBox, then POST to API
298
+ // ---------------------------------------------------------------------------
299
+
300
+ async function addConnection(
301
+ vscode: VscodeApi,
302
+ treeProvider: ConnectionTreeProvider,
303
+ ): Promise<void> {
304
+ // 1. Pick type
305
+ const type = await vscode.window.showQuickPick(["postgres", "sqlite"], {
306
+ placeHolder: "Select database type",
307
+ }) as string | undefined;
308
+ if (!type) return;
309
+
310
+ // 2. Name
311
+ const name = await vscode.window.showInputBox({ prompt: "Connection name", placeHolder: "e.g. Production DB" });
312
+ if (!name) return;
313
+
314
+ // 3. Connection config
315
+ let connectionConfig: Record<string, string>;
316
+ if (type === "sqlite") {
317
+ const path = await vscode.window.showInputBox({ prompt: "SQLite file path", placeHolder: "/path/to/database.db" });
318
+ if (!path) return;
319
+ connectionConfig = { type: "sqlite", path };
320
+ } else {
321
+ const connStr = await vscode.window.showInputBox({
322
+ prompt: "PostgreSQL connection string",
323
+ placeHolder: "postgres://user:pass@host:5432/dbname",
324
+ });
325
+ if (!connStr) return;
326
+ connectionConfig = { type: "postgres", connectionString: connStr };
327
+ }
328
+
329
+ // 4. Create via API
330
+ try {
331
+ const res = await fetch(`${baseUrl}/api/db/connections`, {
332
+ method: "POST",
333
+ headers: { "Content-Type": "application/json" },
334
+ body: JSON.stringify({ type, name, connectionConfig }),
335
+ });
336
+ const json = await res.json() as { ok: boolean; error?: string };
337
+ if (json.ok) {
338
+ await vscode.window.showInformationMessage(`Connection "${name}" created`);
339
+ treeProvider.refresh();
340
+ } else {
341
+ await vscode.window.showErrorMessage(json.error ?? "Failed to create connection");
342
+ }
343
+ } catch (e) {
344
+ await vscode.window.showErrorMessage(`Error: ${e instanceof Error ? e.message : String(e)}`);
345
+ }
346
+ }
@@ -0,0 +1,120 @@
1
+ /**
2
+ * WebviewPanel for SQL query editor + results display.
3
+ * Communicates with the extension via postMessage.
4
+ */
5
+
6
+ function escHtml(s: string): string {
7
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
8
+ }
9
+
10
+ /** Create the HTML content for the query webview panel */
11
+ export function getQueryPanelHtml(connectionName: string, tableName?: string): string {
12
+ const initialQuery = tableName ? `SELECT * FROM ${escHtml(tableName)} LIMIT 100;` : "";
13
+ return `<!DOCTYPE html>
14
+ <html>
15
+ <head>
16
+ <meta charset="utf-8">
17
+ <style>
18
+ * { box-sizing: border-box; margin: 0; padding: 0; }
19
+ body { font-family: -apple-system, BlinkMacSystemFont, sans-serif; background: #1e1e2e; color: #cdd6f4; padding: 12px; font-size: 13px; }
20
+ .header { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
21
+ .header h3 { font-size: 14px; font-weight: 600; }
22
+ .header .badge { background: #313244; padding: 2px 8px; border-radius: 4px; font-size: 11px; color: #a6adc8; }
23
+ textarea { width: 100%; height: 80px; background: #313244; border: 1px solid #45475a; border-radius: 6px; color: #cdd6f4; padding: 8px; font-family: 'SF Mono', 'Fira Code', monospace; font-size: 12px; resize: vertical; }
24
+ textarea:focus { outline: none; border-color: #89b4fa; }
25
+ .actions { display: flex; gap: 8px; margin: 8px 0; }
26
+ button { background: #89b4fa; color: #1e1e2e; border: none; padding: 6px 16px; border-radius: 4px; font-size: 12px; font-weight: 600; cursor: pointer; }
27
+ button:hover { background: #74c7ec; }
28
+ button.secondary { background: #313244; color: #cdd6f4; }
29
+ .status { font-size: 11px; color: #a6adc8; margin: 4px 0; }
30
+ .error { color: #f38ba8; background: #45475a; padding: 8px; border-radius: 4px; margin: 8px 0; font-size: 12px; }
31
+ table { width: 100%; border-collapse: collapse; margin-top: 8px; font-size: 12px; }
32
+ th { background: #313244; text-align: left; padding: 6px 8px; border-bottom: 1px solid #45475a; font-weight: 600; position: sticky; top: 0; }
33
+ td { padding: 4px 8px; border-bottom: 1px solid #313244; max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
34
+ tr:hover td { background: #313244; }
35
+ .results { max-height: 60vh; overflow: auto; border: 1px solid #45475a; border-radius: 6px; }
36
+ .empty { text-align: center; padding: 24px; color: #6c7086; }
37
+ </style>
38
+ </head>
39
+ <body>
40
+ <div class="header">
41
+ <h3>Query</h3>
42
+ <span class="badge">${escHtml(connectionName)}</span>
43
+ </div>
44
+ <textarea id="sql" placeholder="Enter SQL query...">${initialQuery}</textarea>
45
+ <div class="actions">
46
+ <button id="run">Run Query</button>
47
+ <button class="secondary" id="clear">Clear</button>
48
+ </div>
49
+ <div id="status" class="status"></div>
50
+ <div id="error" style="display:none"></div>
51
+ <div id="results"></div>
52
+ <script>
53
+ const vscode = acquireVsCodeApi();
54
+ const sqlEl = document.getElementById('sql');
55
+ const statusEl = document.getElementById('status');
56
+ const errorEl = document.getElementById('error');
57
+ const resultsEl = document.getElementById('results');
58
+
59
+ document.getElementById('run').addEventListener('click', () => {
60
+ const sql = sqlEl.value.trim();
61
+ if (!sql) return;
62
+ statusEl.textContent = 'Running...';
63
+ errorEl.style.display = 'none';
64
+ resultsEl.innerHTML = '';
65
+ vscode.postMessage({ type: 'executeQuery', sql });
66
+ });
67
+
68
+ document.getElementById('clear').addEventListener('click', () => {
69
+ sqlEl.value = '';
70
+ statusEl.textContent = '';
71
+ errorEl.style.display = 'none';
72
+ resultsEl.innerHTML = '';
73
+ });
74
+
75
+ sqlEl.addEventListener('keydown', (e) => {
76
+ if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') {
77
+ document.getElementById('run').click();
78
+ }
79
+ });
80
+
81
+ window.addEventListener('message', (event) => {
82
+ const msg = event.data;
83
+ if (msg.type === 'queryResult') {
84
+ if (msg.changeType === 'modify') {
85
+ statusEl.textContent = (msg.rowsAffected ?? 0) + ' row(s) affected' + (msg.duration ? ' in ' + msg.duration + 'ms' : '');
86
+ resultsEl.innerHTML = '';
87
+ return;
88
+ }
89
+ const rows = msg.rows || [];
90
+ statusEl.textContent = rows.length + ' row(s) returned' + (msg.duration ? ' in ' + msg.duration + 'ms' : '');
91
+ if (rows.length === 0) {
92
+ resultsEl.innerHTML = '<div class="empty">No results</div>';
93
+ return;
94
+ }
95
+ function esc(s){return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');}
96
+ const cols = msg.columns || Object.keys(rows[0]);
97
+ let html = '<div class="results"><table><thead><tr>';
98
+ cols.forEach(c => { html += '<th>' + esc(c) + '</th>'; });
99
+ html += '</tr></thead><tbody>';
100
+ rows.forEach(row => {
101
+ html += '<tr>';
102
+ cols.forEach(c => {
103
+ const v = row[c];
104
+ html += '<td>' + (v === null ? '<span style="color:#6c7086">NULL</span>' : esc(v)) + '</td>';
105
+ });
106
+ html += '</tr>';
107
+ });
108
+ html += '</tbody></table></div>';
109
+ resultsEl.innerHTML = html;
110
+ } else if (msg.type === 'queryError') {
111
+ statusEl.textContent = '';
112
+ errorEl.textContent = msg.error;
113
+ errorEl.style.display = 'block';
114
+ errorEl.className = 'error';
115
+ }
116
+ });
117
+ </script>
118
+ </body>
119
+ </html>`;
120
+ }