@hienlh/ppm 0.13.53 → 0.13.55

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 (126) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/assets/skills/ppm/SKILL.md +2 -2
  3. package/assets/skills/ppm/references/cli-reference.md +11 -0
  4. package/assets/skills/ppm/references/http-api.md +7 -1
  5. package/dist/web/assets/ai-settings-section-AxLbNnLW.js +1 -0
  6. package/dist/web/assets/{api-settings-C3T95dWg.js → api-settings-BJTjIG4U.js} +1 -1
  7. package/dist/web/assets/architecture-PBZL5I3N-CkdUQjA_.js +1 -0
  8. package/dist/web/assets/arrow-down-D825m4vm.js +1 -0
  9. package/dist/web/assets/{audio-preview-DzlMrjXC.js → audio-preview-B53oeW0y.js} +1 -1
  10. package/dist/web/assets/chat-tab-Clzw7eDP.js +16 -0
  11. package/dist/web/assets/chevron-down-BMo4cBth.js +1 -0
  12. package/dist/web/assets/code-editor-BgU5lFVC.js +8 -0
  13. package/dist/web/assets/{conflict-editor-DsL9J6Ao.js → conflict-editor-C3l3pgtV.js} +3 -3
  14. package/dist/web/assets/csv-parser-D1b_lg2T.js +6 -0
  15. package/dist/web/assets/{csv-preview-B3Dyhgho.js → csv-preview-asMfgR0r.js} +2 -2
  16. package/dist/web/assets/{data-grid-overlay-editor-C1UUm7Ob.js → data-grid-overlay-editor-DGjqvYn6.js} +1 -1
  17. package/dist/web/assets/database-viewer-DNYgu_Jv.js +1 -0
  18. package/dist/web/assets/diff-viewer-Dec4mKgl.js +4 -0
  19. package/dist/web/assets/{esm-DCbn6xno.js → esm-xVTUq__o.js} +1 -1
  20. package/dist/web/assets/{extension-webview-SqqLBksj.js → extension-webview-b7T0yAq2.js} +1 -1
  21. package/dist/web/assets/eye-off-BacF7RVS.js +1 -0
  22. package/dist/web/assets/git-log-panel-CWTTJERX.js +1 -0
  23. package/dist/web/assets/gitGraph-HDMCJU4V-D3UR56AG.js +1 -0
  24. package/dist/web/assets/glide-data-grid-_9gGGfZy.js +136 -0
  25. package/dist/web/assets/{image-preview-CVERB6Hn.js → image-preview-CzXKlWft.js} +1 -1
  26. package/dist/web/assets/index-1_isAfRS.js +27 -0
  27. package/dist/web/assets/index-CDPVPZHJ.css +2 -0
  28. package/dist/web/assets/info-3K5VOQVL-DUhLSKI2.js +1 -0
  29. package/dist/web/assets/{input-_LFQwhzd.js → input-By_lZeCs.js} +1 -1
  30. package/dist/web/assets/keybindings-store-BicDU0b1.js +1 -0
  31. package/dist/web/assets/{markdown-renderer-F5aFyJ-g.js → markdown-renderer-DWIBF9Jg.js} +3 -3
  32. package/dist/web/assets/notification-store-D_2wCv0z.js +1 -0
  33. package/dist/web/assets/{number-overlay-editor-CyEqxXcg.js → number-overlay-editor-DtUBprPW.js} +1 -1
  34. package/dist/web/assets/packet-RMMSAZCW-BIpeVUGW.js +1 -0
  35. package/dist/web/assets/panel-store-C9VAhbZz.js +1 -0
  36. package/dist/web/assets/{pdf-preview-RgwYR2Lj.js → pdf-preview-C51mDesS.js} +1 -1
  37. package/dist/web/assets/pie-UPGHQEXC-CNoizzjb.js +1 -0
  38. package/dist/web/assets/port-forwarding-tab-BmRMiN32.js +1 -0
  39. package/dist/web/assets/{postgres-viewer-Dq2nI9jE.js → postgres-viewer-DuiEoUGK.js} +3 -3
  40. package/dist/web/assets/project-store-DlbHpIq0.js +1 -0
  41. package/dist/web/assets/radar-KQ55EAFF-7dns-ho5.js +1 -0
  42. package/dist/web/assets/{settings-store-8FpQDjEA.js → settings-store-DQUFTPk2.js} +2 -2
  43. package/dist/web/assets/settings-tab-p3lxp6_T.js +1 -0
  44. package/dist/web/assets/{sql-query-editor-CL6O_4eW.js → sql-query-editor-BA80nuKp.js} +1 -1
  45. package/dist/web/assets/{sqlite-viewer-CcJz9Bva.js → sqlite-viewer-Bev2XJe7.js} +1 -1
  46. package/dist/web/assets/system-monitor-tab-DfpsOgL3.js +1 -0
  47. package/dist/web/assets/{tab-store-CNas5Ny8.js → tab-store-CIcbSn0c.js} +1 -1
  48. package/dist/web/assets/{terminal-tab-BlyuDIu5.js → terminal-tab-Ca5kyUS7.js} +2 -2
  49. package/dist/web/assets/treemap-KZPCXAKY-D3DZCLoE.js +1 -0
  50. package/dist/web/assets/{use-blob-url-DB4nNruT.js → use-blob-url-VgTGpely.js} +1 -1
  51. package/dist/web/assets/{use-monaco-theme-DEI-tJAh.js → use-monaco-theme-BLIgarH5.js} +1 -1
  52. package/dist/web/assets/{vendor-mermaid-D2KKkqNs.js → vendor-mermaid-DkqjpqJK.js} +2 -2
  53. package/dist/web/assets/{video-preview-C8s0VXIf.js → video-preview-Bvd0OaYA.js} +1 -1
  54. package/dist/web/assets/wifi-LJEyIdXf.js +1 -0
  55. package/dist/web/index.html +21 -20
  56. package/dist/web/sw.js +1 -1
  57. package/docs/project-changelog.md +38 -1
  58. package/docs/system-architecture.md +2 -1
  59. package/package.json +1 -1
  60. package/packages/ext-git-graph/src/webview-html.ts +29 -8
  61. package/src/cli/commands/db-cmd.ts +30 -4
  62. package/src/server/index.ts +4 -0
  63. package/src/server/middleware/auth.ts +9 -0
  64. package/src/server/routes/resources.ts +61 -0
  65. package/src/services/ppmbot/cli-reference-default.ts +6 -1
  66. package/src/services/resource-monitor-utils.ts +129 -0
  67. package/src/services/resource-monitor.service.ts +122 -0
  68. package/src/web/components/editor/editor-breadcrumb.tsx +8 -1
  69. package/src/web/components/git/git-log-panel.tsx +206 -0
  70. package/src/web/components/git/git-ref-badge.tsx +150 -0
  71. package/src/web/components/git/git-status-panel.tsx +18 -0
  72. package/src/web/components/layout/mobile-nav.tsx +2 -0
  73. package/src/web/components/layout/sidebar.tsx +6 -0
  74. package/src/web/components/layout/tab-bar.tsx +3 -0
  75. package/src/web/components/layout/tab-content.tsx +10 -0
  76. package/src/web/components/layout/tab-pool.tsx +2 -0
  77. package/src/web/components/system/resource-status-bar.tsx +66 -0
  78. package/src/web/components/system/sparkline-canvas.tsx +64 -0
  79. package/src/web/components/system/system-monitor-tab.tsx +194 -0
  80. package/src/web/hooks/use-resource-monitor.ts +114 -0
  81. package/src/web/stores/panel-store.ts +1 -1
  82. package/src/web/stores/tab-store.ts +3 -1
  83. package/templates/skill/SKILL.md.tmpl +1 -1
  84. package/dist/web/assets/ai-settings-section-AuV6Lzz2.js +0 -1
  85. package/dist/web/assets/architecture-PBZL5I3N-fAJMexNi.js +0 -1
  86. package/dist/web/assets/chat-tab-BpP-9jSF.js +0 -16
  87. package/dist/web/assets/code-editor-DUrnjDXe.js +0 -8
  88. package/dist/web/assets/csv-parser-Dly5nqE1.js +0 -6
  89. package/dist/web/assets/database-viewer-BzZ_B08X.js +0 -1
  90. package/dist/web/assets/diff-viewer-BTtOJWuk.js +0 -4
  91. package/dist/web/assets/file-store-DOxcU_7s.js +0 -1
  92. package/dist/web/assets/gitGraph-HDMCJU4V-ClRAoBAn.js +0 -1
  93. package/dist/web/assets/glide-data-grid-YCbGSPc8.js +0 -136
  94. package/dist/web/assets/index-CKKoR3gY.css +0 -2
  95. package/dist/web/assets/index-D3gMHLKc.js +0 -27
  96. package/dist/web/assets/info-3K5VOQVL-D8uyBfC_.js +0 -1
  97. package/dist/web/assets/keybindings-store-BY4JJMPB.js +0 -1
  98. package/dist/web/assets/notification-store-CmFhp1D7.js +0 -1
  99. package/dist/web/assets/packet-RMMSAZCW-BJj3FH_w.js +0 -1
  100. package/dist/web/assets/panel-store-C8wwxBpn.js +0 -1
  101. package/dist/web/assets/pie-UPGHQEXC-BKfHRBz7.js +0 -1
  102. package/dist/web/assets/port-forwarding-tab-CRBTvvYM.js +0 -1
  103. package/dist/web/assets/radar-KQ55EAFF-DkybKTt9.js +0 -1
  104. package/dist/web/assets/scroll-area-BDi_FNzr.js +0 -1
  105. package/dist/web/assets/settings-tab-BrtuPA9W.js +0 -1
  106. package/dist/web/assets/treemap-KZPCXAKY-BvDgIWW9.js +0 -1
  107. /package/dist/web/assets/{api-client-DIhJ5qVW.js → api-client-BK4NPNoY.js} +0 -0
  108. /package/dist/web/assets/{chevron-right-DnHIvvcy.js → chevron-right-CD8e6Aj4.js} +0 -0
  109. /package/dist/web/assets/{code-DGBecc50.js → code-DiNmA3eR.js} +0 -0
  110. /package/dist/web/assets/{data-grid-types-D2cHE8hx.js → data-grid-types-DzL5W2em.js} +0 -0
  111. /package/dist/web/assets/{database-DOWH9-Vv.js → database-Dc8mr-dP.js} +0 -0
  112. /package/dist/web/assets/{dist-BoIkGNC8.js → dist-BM2EHhLH.js} +0 -0
  113. /package/dist/web/assets/{dist-DVk8T0R5.js → dist-CohudVKa.js} +0 -0
  114. /package/dist/web/assets/{file-exclamation-point-BwzaQ50n.js → file-exclamation-point-B__2Hrd6.js} +0 -0
  115. /package/dist/web/assets/{globe-B4Ilypbs.js → globe-CQ8NAYvi.js} +0 -0
  116. /package/dist/web/assets/{katex-C10ndCVt.js → katex-CHaeM9QC.js} +0 -0
  117. /package/dist/web/assets/{lib-C2D8j3K3.js → lib-LPmTkMu4.js} +0 -0
  118. /package/dist/web/assets/{react-DMIOAtcX.js → react-DHBl6KRc.js} +0 -0
  119. /package/dist/web/assets/{refresh-cw-BjrAbUJe.js → refresh-cw-CRD2qr4U.js} +0 -0
  120. /package/dist/web/assets/{search-tM8K5zWU.js → search-D90WJ5fo.js} +0 -0
  121. /package/dist/web/assets/{sparkles-CulWHe4c.js → sparkles-KCOEy7QI.js} +0 -0
  122. /package/dist/web/assets/{table-BzjWcs87.js → table-2wDtM4_B.js} +0 -0
  123. /package/dist/web/assets/{text-wrap-DJz9Bgpa.js → text-wrap-AZErifCu.js} +0 -0
  124. /package/dist/web/assets/{utils-CQux7CsO.js → utils-CSCvNZxE.js} +0 -0
  125. /package/dist/web/assets/{vendor-xterm-D1P36hcr.js → vendor-xterm-vh96p1Au.js} +0 -0
  126. /package/dist/web/assets/{x-BPReZWnP.js → x-ClICkcxR.js} +0 -0
@@ -1 +0,0 @@
1
- import{V as e}from"./vendor-mermaid-D2KKkqNs.js";export{e as createInfoServices};
@@ -1 +0,0 @@
1
- import"./vendor-markdown-0Mxgxy0L.js";import"./api-client-DIhJ5qVW.js";import{T as e}from"./index-D3gMHLKc.js";export{e as useKeybindingsStore};
@@ -1 +0,0 @@
1
- import"./vendor-markdown-0Mxgxy0L.js";import"./api-client-DIhJ5qVW.js";import{j as e}from"./index-D3gMHLKc.js";export{e as useNotificationStore};
@@ -1 +0,0 @@
1
- import{z as e}from"./vendor-mermaid-D2KKkqNs.js";export{e as createPacketServices};
@@ -1 +0,0 @@
1
- import{t as e}from"./react-DMIOAtcX.js";import{r as t}from"./utils-CQux7CsO.js";function n(){return`panel-${t()}`}function r(e=[],t=null){return{id:n(),tabs:e,activeTabId:t,tabHistory:t?[t]:[]}}function i(e){return e?1:3}function a(e,t){return e.map(e=>e.filter(e=>e!==t)).filter(e=>e.length>0)}function o(e,t){for(let n=0;n<e.length;n++){let r=e[n].indexOf(t);if(r!==-1)return{row:n,col:r}}return null}function s(e){let t=0;for(let n of Object.values(e))for(let e of n.tabs){let n=e.id.match(/^editor:untitled-(\d+)$/);n&&(t=Math.max(t,Number(n[1])))}return t+1}function c(e,n){switch(e){case`editor`:return n?.viewerKey?`editor:viewer:${n.viewerKey}`:n?.isUntitled?`editor:untitled-${n.untitledNumber??1}`:`editor:${n?.filePath??`untitled`}`;case`chat`:return`chat:${n?.providerId??`default`}/${n?.sessionId??t()}`;case`terminal`:return`terminal:${n?.terminalIndex??1}`;case`database`:return`database:${n?.connectionId??`default`}:${n?.tableName??``}`;case`sqlite`:return`sqlite:${n?.filePath??`default`}`;case`postgres`:return`postgres:${n?.connectionId??`default`}:${n?.tableName??``}`;case`extension`:return`extension:${String(n?.viewType??`unknown`).replace(/\.view$/,``)}`;case`git-diff`:return`git-diff:${n?.filePath??`unknown`}`;case`conflict-editor`:return`conflict-editor:${n?.filePath??`unknown`}`;case`settings`:return`settings`;case`ports`:return`ports`;default:return`${e}:${t()}`}}function l(e){let t={...e,panels:{...e.panels}};for(let[e,n]of Object.entries(t.panels)){let r=n.tabs.map(e=>{if(e.id.startsWith(`tab-`)){let t=c(e.type,e.metadata);return{...e,id:t}}return e}),i=new Map;n.tabs.forEach((e,t)=>{e.id!==r[t].id&&i.set(e.id,r[t].id)});let a=i.get(n.activeTabId??``)??n.activeTabId,o=n.tabHistory.map(e=>i.get(e)??e);t.panels[e]={...n,tabs:r,activeTabId:a,tabHistory:o}}return t}var u=`ppm-panels-`,d=`ppm-tabs-`;function f(e){return`${u}${e}`}function p(e,t){try{let n={...t,updatedAt:new Date().toISOString()};localStorage.setItem(f(e),JSON.stringify(n)),e!==`__global__`&&_(e,t)}catch{}}function m(e){try{let t=localStorage.getItem(f(e));if(t)return l(JSON.parse(t))}catch{}return y(e)}async function h(e){if(e===`__global__`)return null;try{let t={},n=localStorage.getItem(`ppm-auth-token`);n&&(t.Authorization=`Bearer ${n}`);let r=await fetch(`/api/project/${encodeURIComponent(e)}/workspace`,{headers:t});if(!r.ok)return null;let i=await r.json();return!i.ok||!i.data?null:{...i.data.layout,updatedAt:i.data.updatedAt}}catch{return null}}var g=new Map;function _(e,t){let n=g.get(e);n&&clearTimeout(n),g.set(e,setTimeout(async()=>{g.delete(e);try{let n={"Content-Type":`application/json`},r=localStorage.getItem(`ppm-auth-token`);r&&(n.Authorization=`Bearer ${r}`);let i=await fetch(`/api/project/${encodeURIComponent(e)}/workspace`,{method:`PUT`,headers:n,body:JSON.stringify({layout:t})});if(i.ok){let t=await i.json();if(t.data?.updatedAt){let n=`${u}${e}`,r=localStorage.getItem(n);if(r){let e=JSON.parse(r);e.updatedAt=t.data.updatedAt,localStorage.setItem(n,JSON.stringify(e))}}}}catch{}},1500))}function v(e,t){if(!e&&!t)return null;if(!e)return t;if(!t)return e;let n=new Date(e.updatedAt).getTime();return new Date(t.updatedAt).getTime()>=n?t:e}function y(e){try{let t=localStorage.getItem(`${d}${e}`);if(!t)return null;let n=JSON.parse(t);if(!n.tabs?.length)return null;let i=r(n.tabs,n.activeTabId),a={panels:{[i.id]:i},grid:[[i.id]],focusedPanelId:i.id};return p(e,a),localStorage.removeItem(`${d}${e}`),a}catch{return null}}var b=new Set([`settings`]),x=new Set([`projects`,`git-status`,`git-graph`]);function S(e,t){let n=e.filter(e=>e!==t);return n.push(t),n.length>50&&n.shift(),n}function C(){let e=r();return{panels:{[e.id]:e},grid:[[e.id]],focusedPanelId:e.id}}var w=e()((e,t)=>{function n(){let{currentProject:e,panels:n,grid:r,focusedPanelId:i}=t();if(!e)return;let a=new Set(r.flat()),o={};for(let[e,t]of Object.entries(n))a.has(e)&&(o[e]=t);p(e,{panels:o,grid:r,focusedPanelId:i})}function s(e){return Object.values(t().panels).find(t=>t.tabs.some(t=>t.id===e))}function l(e){return e??t().focusedPanelId}return{...C(),currentProject:null,projectGrids:{},projectFocused:{},switchProject:n=>{let{currentProject:i,panels:a,grid:o,focusedPanelId:s,projectGrids:c,projectFocused:l}=t();if(i===n)return;let u={...c},d={...l};if(i){u[i]=o,d[i]=s;let e=new Set(o.flat()),t={};for(let[n,r]of Object.entries(a))e.has(n)&&(t[n]=r);p(i,{panels:t,grid:o,focusedPanelId:s})}if(u[n]){let t=u[n];e({currentProject:n,grid:t,focusedPanelId:d[n]??t[0]?.[0]??``,projectGrids:u,projectFocused:d});return}let f=m(n);if(f&&Object.keys(f.panels).length>0){let t={};for(let[e,n]of Object.entries(f.panels)){let r=n.tabs.filter(e=>!x.has(e.type)),i=n.tabHistory.filter(e=>r.some(t=>t.id===e)),a=n.activeTabId&&r.some(e=>e.id===n.activeTabId)?n.activeTabId:i[i.length-1]??r[0]?.id??null;t[e]={...n,tabs:r,tabHistory:i,activeTabId:a}}let r={...a,...t};u[n]=f.grid,d[n]=f.focusedPanelId,e({currentProject:n,panels:r,grid:f.grid,focusedPanelId:f.focusedPanelId,projectGrids:u,projectFocused:d})}else{let t=r(),i=[[t.id]],o={...a,[t.id]:t};u[n]=i,d[n]=t.id,p(n,{panels:{[t.id]:t},grid:i,focusedPanelId:t.id}),e({currentProject:n,panels:o,grid:i,focusedPanelId:t.id,projectGrids:u,projectFocused:d})}},reloadProject:n=>{let{projectGrids:r,projectFocused:i,panels:a}=t(),o={...r},s={...i};delete o[n],delete s[n];let c=r[n],l=c?new Set(c.flat()):new Set,u={...a};for(let e of l)delete u[e];e({projectGrids:o,projectFocused:s,panels:u,currentProject:null}),t().switchProject(n)},setFocusedPanel:n=>{t().panels[n]&&e({focusedPanelId:n})},openTab:(r,i)=>{let a=t().isMobile(),o=a?t().grid[0]?.[0]??l(i):l(i);if(!t().panels[o])return``;if(r.type===`terminal`&&!r.metadata?.terminalIndex){let e=Object.values(t().panels).flatMap(e=>e.tabs).filter(e=>e.type===`terminal`).map(e=>{let t=e.id.match(/^terminal:(\d+)/);return t?parseInt(t[1],10):0}),n=e.length>0?Math.max(...e)+1:1;r={...r,metadata:{...r.metadata,terminalIndex:n}}}let s=c(r.type,r.metadata);if(b.has(r.type))for(let r of Object.values(t().panels)){let t=r.tabs.find(e=>e.id===s);if(t)return e(e=>({focusedPanelId:r.id,panels:{...e.panels,[r.id]:{...r,activeTabId:t.id,tabHistory:S(r.tabHistory,t.id)}}})),n(),t.id}if(a)for(let r of t().grid.flat()){let i=t().panels[r];if(!i)continue;let a=i.tabs.find(e=>e.id===s||e.id.startsWith(`${s}@`));if(a)return e(e=>({focusedPanelId:i.id,panels:{...e.panels,[i.id]:{...i,activeTabId:a.id,tabHistory:S(i.tabHistory,a.id)}}})),n(),a.id}let u=t().panels[o],d=u.tabs.find(e=>e.id===s);if(d)return e(e=>({panels:{...e.panels,[o]:{...u,activeTabId:d.id,tabHistory:S(u.tabHistory,d.id)}}})),n(),d.id;let f=Object.values(t().panels).some(e=>e.id!==o&&e.tabs.some(e=>e.id===s))?`${s}@${o}`:s,p={...r,id:f};return e(e=>{let t=e.panels[o];return{focusedPanelId:o,panels:{...e.panels,[o]:{...t,tabs:[...t.tabs,p],activeTabId:f,tabHistory:S(t.tabHistory,f)}}}}),n(),f},closeTab:(r,i)=>{let o=i?t().panels[i]:s(r);if(!o)return;let c=o.id;if(r.startsWith(`terminal:`))try{localStorage.removeItem(`ppm:terminal-session:${r}`)}catch{}e(e=>{let t=e.panels[c],n=t.tabs.filter(e=>e.id!==r),i=t.tabHistory.filter(e=>e!==r),o=t.activeTabId;if(t.activeTabId===r){let e=i.length>0?i[i.length-1]:null;o=e&&n.some(t=>t.id===e)?e:n[n.length-1]?.id??null}let s=e.grid.flat().length;if(n.length===0&&s>1){let{[c]:t,...n}=e.panels;return{panels:n,grid:a(e.grid,c),focusedPanelId:e.focusedPanelId===c?Object.keys(n)[0]:e.focusedPanelId}}return{panels:{...e.panels,[c]:{...t,tabs:n,activeTabId:o,tabHistory:i}}}}),n()},setActiveTab:(r,i)=>{let a=i?t().panels[i]:s(r);if(!a)return;let o=a.id;e(e=>{let t=e.panels[o];return{focusedPanelId:o,panels:{...e.panels,[o]:{...t,activeTabId:r,tabHistory:S(t.tabHistory,r)}}}}),n()},updateTab:(t,r)=>{let i=s(t);i&&(e(e=>({panels:{...e.panels,[i.id]:{...i,tabs:i.tabs.map(e=>e.id===t?{...e,...r}:e)}}})),n())},reorderTab:(r,i,a)=>{let o=t().panels[i];if(!o)return;let s=o.tabs.findIndex(e=>e.id===r);if(s===-1||s===a)return;let c=[...o.tabs],[l]=c.splice(s,1);c.splice(a,0,l),e(e=>({panels:{...e.panels,[i]:{...o,tabs:c}}})),n()},moveTab:(r,i,o,s)=>{if(i===o)return;let c=t().panels[i],l=t().panels[o];if(!c||!l)return;let u=c.tabs.find(e=>e.id===r);if(!u)return;let d=c.tabs.filter(e=>e.id!==r),f=c.tabHistory.filter(e=>e!==r),p=c.activeTabId===r?f[f.length-1]??d[d.length-1]?.id??null:c.activeTabId,m=[...l.tabs];s===void 0?m.push(u):m.splice(s,0,u),e(e=>{let t=e.grid.flat().length;if(d.length===0&&t>1){let{[i]:t,...n}=e.panels;return{panels:{...n,[o]:{...l,tabs:m,activeTabId:r,tabHistory:S(l.tabHistory,r)}},grid:a(e.grid,i),focusedPanelId:o}}return{focusedPanelId:o,panels:{...e.panels,[i]:{...c,tabs:d,activeTabId:p,tabHistory:f},[o]:{...l,tabs:m,activeTabId:r,tabHistory:S(l.tabHistory,r)}}}}),n()},splitPanel:(s,c,l,u)=>{let{grid:d,panels:f}=t(),p=t().isMobile(),m=f[l];if(!m)return!1;let h=m.tabs.find(e=>e.id===c);if(!h)return!1;let g=o(d,u??l);if(!g)return!1;let _=s===`left`||s===`right`,v=s===`up`||s===`down`;if(_&&(d[g.row]?.length??0)>=i(p)||v&&d.length>=3)return!1;let y=r([h],h.id);y.tabHistory=[h.id];let b=m.tabs.filter(e=>e.id!==c),x=m.tabHistory.filter(e=>e!==c),S=m.activeTabId===c?x[x.length-1]??b[b.length-1]?.id??null:m.activeTabId,C;if(_)C=d.map((e,t)=>{if(t!==g.row)return e;let n=[...e],r=s===`right`?g.col+1:g.col;return n.splice(r,0,y.id),n});else{C=[...d];let e=s===`down`?g.row+1:g.row;C.splice(e,0,[y.id])}return e(e=>{let t=e.grid.flat().length,n={...e.panels,[y.id]:y};if(b.length===0&&t>1){let{[l]:e,...t}=n;n=t,C=a(C,l)}else n[l]={...m,tabs:b,activeTabId:S,tabHistory:x};return{panels:n,grid:C,focusedPanelId:y.id}}),n(),!0},closePanel:r=>{let{panels:i,grid:s}=t();if(s.flat().length<=1)return;let c=i[r];if(!c)return;o(s,r);let l=s.flat(),u=l.indexOf(r),d=u>0?l[u-1]:l[1],f=i[d];f&&(e(e=>{let{[r]:t,...n}=e.panels,i=[...f.tabs,...c.tabs],o=f.activeTabId??c.activeTabId;return{panels:{...n,[d]:{...f,tabs:i,activeTabId:o,tabHistory:[...f.tabHistory,...c.tabHistory]}},grid:a(e.grid,r),focusedPanelId:d}}),n())},getPanelForTab:e=>s(e),isMobile:()=>typeof window<`u`&&window.innerWidth<768}});export{s as a,o as i,r as n,i as o,h as r,v as s,w as t};
@@ -1 +0,0 @@
1
- import{L as e}from"./vendor-mermaid-D2KKkqNs.js";export{e as createPieServices};
@@ -1 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import"./vendor-ui-UXCWAcmi.js";import{t as r}from"./createLucideIcon-BjHrJDVb.js";import{n as i,t as a}from"./globe-B4Ilypbs.js";import{t as o}from"./api-client-DIhJ5qVW.js";import{B as s,F as c,nt as l,q as u,tt as d}from"./index-D3gMHLKc.js";var f=r(`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(n(),1),m=t();function h(){let[e,t]=(0,p.useState)(``),[n,r]=(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{r(await o.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 o.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 o.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)(a,{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)(i,{className:`size-4 text-green-400`}):(0,m.jsx)(l,{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)(s,{className:`size-4 text-red-400`})})]})]},e.port))})})]})}export{h as PortForwardingTab};
@@ -1 +0,0 @@
1
- import{F as e}from"./vendor-mermaid-D2KKkqNs.js";export{e as createRadarServices};
@@ -1 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{b as t,x as n}from"./vendor-markdown-0Mxgxy0L.js";import{_ as r,b as i,v as a,x as o,y as s}from"./vendor-ui-UXCWAcmi.js";import{t as c}from"./createLucideIcon-BjHrJDVb.js";import{n as l}from"./utils-CQux7CsO.js";var u=c(`arrow-left`,[[`path`,{d:`m12 19-7-7 7-7`,key:`1l729n`}],[`path`,{d:`M19 12H5`,key:`x3x0zl`}]]),d=c(`eye-off`,[[`path`,{d:`M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49`,key:`ct8e1f`}],[`path`,{d:`M14.084 14.158a3 3 0 0 1-4.242-4.242`,key:`151rxh`}],[`path`,{d:`M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143`,key:`13bj9a`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}]]),f=c(`monitor`,[[`rect`,{width:`20`,height:`14`,x:`2`,y:`3`,rx:`2`,key:`48i651`}],[`line`,{x1:`8`,x2:`16`,y1:`21`,y2:`21`,key:`1svkeh`}],[`line`,{x1:`12`,x2:`12`,y1:`17`,y2:`21`,key:`vw1qmm`}]]);e(n(),1);var p=t();function m({className:e,children:t,...n}){return(0,p.jsxs)(a,{"data-slot":`scroll-area`,className:l(`relative`,e),...n,children:[(0,p.jsx)(o,{"data-slot":`scroll-area-viewport`,className:`size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 [&>div]:!block`,children:t}),(0,p.jsx)(h,{}),(0,p.jsx)(r,{})]})}function h({className:e,orientation:t=`vertical`,...n}){return(0,p.jsx)(s,{"data-slot":`scroll-area-scrollbar`,orientation:t,className:l(`flex touch-none p-px transition-colors select-none`,t===`vertical`&&`h-full w-1.5 border-l border-l-transparent`,t===`horizontal`&&`h-1.5 flex-col border-t border-t-transparent`,e),...n,children:(0,p.jsx)(i,{"data-slot":`scroll-area-thumb`,className:`relative flex-1 rounded-full bg-border`})})}export{u as i,f as n,d as r,m as t};
@@ -1 +0,0 @@
1
- import"./vendor-markdown-0Mxgxy0L.js";import"./vendor-ui-UXCWAcmi.js";import"./scroll-area-BDi_FNzr.js";import"./ai-settings-section-AuV6Lzz2.js";import"./input-_LFQwhzd.js";import"./api-client-DIhJ5qVW.js";import"./settings-store-8FpQDjEA.js";import"./vendor-mermaid-D2KKkqNs.js";import"./file-store-DOxcU_7s.js";import"./api-settings-C3T95dWg.js";import{s as e}from"./index-D3gMHLKc.js";export{e as SettingsTab};
@@ -1 +0,0 @@
1
- import{N as e}from"./vendor-mermaid-D2KKkqNs.js";export{e as createTreemapServices};