@hienlh/ppm 0.13.55 → 0.13.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/http-api.md +2 -1
- package/dist/web/assets/ai-settings-section-BH2UOQH-.js +1 -0
- package/dist/web/assets/{api-settings-BJTjIG4U.js → api-settings-uQKmeGkl.js} +1 -1
- package/dist/web/assets/architecture-PBZL5I3N-DLKD1Xjj.js +1 -0
- package/dist/web/assets/{audio-preview-B53oeW0y.js → audio-preview-LCxWo-25.js} +1 -1
- package/dist/web/assets/chat-tab-3GUmdAJN.js +16 -0
- package/dist/web/assets/code-editor-Cd7NZ0VX.js +8 -0
- package/dist/web/assets/{conflict-editor-C3l3pgtV.js → conflict-editor-No7IVPRN.js} +1 -1
- package/dist/web/assets/{csv-preview-asMfgR0r.js → csv-preview-DgArUJhd.js} +1 -1
- package/dist/web/assets/{data-grid-overlay-editor-DGjqvYn6.js → data-grid-overlay-editor-CmduzuPM.js} +1 -1
- package/dist/web/assets/{database-viewer-DNYgu_Jv.js → database-viewer-zeQXxkg-.js} +1 -1
- package/dist/web/assets/{diff-viewer-Dec4mKgl.js → diff-viewer-DmSkyBaT.js} +1 -1
- package/dist/web/assets/{esm-xVTUq__o.js → esm-JPvheKDJ.js} +1 -1
- package/dist/web/assets/{extension-webview-b7T0yAq2.js → extension-webview-DCwz2Wso.js} +1 -1
- package/dist/web/assets/{git-log-panel-CWTTJERX.js → git-log-panel-Bk7Eh-Bn.js} +1 -1
- package/dist/web/assets/gitGraph-HDMCJU4V-2a0r4GHr.js +1 -0
- package/dist/web/assets/{glide-data-grid-_9gGGfZy.js → glide-data-grid-ha8hjunf.js} +6 -6
- package/dist/web/assets/{image-preview-CzXKlWft.js → image-preview-C1VLHLdJ.js} +1 -1
- package/dist/web/assets/{index-1_isAfRS.js → index-CP6EIXkh.js} +8 -8
- package/dist/web/assets/index-DwvSM9vu.css +2 -0
- package/dist/web/assets/info-3K5VOQVL-CWKw4e0V.js +1 -0
- package/dist/web/assets/{input-By_lZeCs.js → input-B78ol0hV.js} +1 -1
- package/dist/web/assets/keybindings-store-Rf9YKWAp.js +1 -0
- package/dist/web/assets/{markdown-renderer-DWIBF9Jg.js → markdown-renderer-C7ZoGWso.js} +3 -3
- package/dist/web/assets/notification-store-C3tg-ZXm.js +1 -0
- package/dist/web/assets/{number-overlay-editor-DtUBprPW.js → number-overlay-editor-DS-qf63L.js} +1 -1
- package/dist/web/assets/packet-RMMSAZCW-Ar00Wbhd.js +1 -0
- package/dist/web/assets/{panel-store-C9VAhbZz.js → panel-store-B1pOXkyS.js} +1 -1
- package/dist/web/assets/{pdf-preview-C51mDesS.js → pdf-preview-BdmR2RsT.js} +1 -1
- package/dist/web/assets/pie-UPGHQEXC-Q4ssDdib.js +1 -0
- package/dist/web/assets/{port-forwarding-tab-BmRMiN32.js → port-forwarding-tab-BMb8neu0.js} +1 -1
- package/dist/web/assets/{postgres-viewer-DuiEoUGK.js → postgres-viewer-DkM6ndux.js} +3 -3
- package/dist/web/assets/{project-store-DlbHpIq0.js → project-store-BnvrVKBw.js} +1 -1
- package/dist/web/assets/radar-KQ55EAFF-kq5v4OKX.js +1 -0
- package/dist/web/assets/{settings-store-DQUFTPk2.js → settings-store-CSDOihqv.js} +2 -2
- package/dist/web/assets/settings-tab-WdL5pYxG.js +1 -0
- package/dist/web/assets/{sql-query-editor-BA80nuKp.js → sql-query-editor-CNwOnFgF.js} +1 -1
- package/dist/web/assets/{sqlite-viewer-Bev2XJe7.js → sqlite-viewer-FFlsRPWf.js} +1 -1
- package/dist/web/assets/system-monitor-tab-CefzxLVi.js +1 -0
- package/dist/web/assets/{tab-store-CIcbSn0c.js → tab-store-DzftzxTL.js} +1 -1
- package/dist/web/assets/{terminal-tab-Ca5kyUS7.js → terminal-tab-C4MNU5S3.js} +1 -1
- package/dist/web/assets/{x-ClICkcxR.js → trash-2-DkIfBY8d.js} +1 -1
- package/dist/web/assets/treemap-KZPCXAKY-DChODgHt.js +1 -0
- package/dist/web/assets/{use-blob-url-VgTGpely.js → use-blob-url-CI2h4qu0.js} +1 -1
- package/dist/web/assets/{use-monaco-theme-BLIgarH5.js → use-monaco-theme-qx6SfVRk.js} +1 -1
- package/dist/web/assets/{vendor-mermaid-DkqjpqJK.js → vendor-mermaid-DCie7hiR.js} +2 -2
- package/dist/web/assets/{video-preview-Bvd0OaYA.js → video-preview-izCy3xj7.js} +1 -1
- package/dist/web/assets/x-DfF6D5Js.js +1 -0
- package/dist/web/index.html +15 -14
- package/dist/web/sw.js +1 -1
- package/package.json +1 -1
- package/src/server/routes/resources.ts +28 -1
- package/src/web/components/system/system-monitor-group-row.tsx +133 -0
- package/src/web/components/system/system-monitor-tab.tsx +65 -73
- package/dist/web/assets/ai-settings-section-AxLbNnLW.js +0 -1
- package/dist/web/assets/architecture-PBZL5I3N-CkdUQjA_.js +0 -1
- package/dist/web/assets/chat-tab-Clzw7eDP.js +0 -16
- package/dist/web/assets/code-editor-BgU5lFVC.js +0 -8
- package/dist/web/assets/gitGraph-HDMCJU4V-D3UR56AG.js +0 -1
- package/dist/web/assets/index-CDPVPZHJ.css +0 -2
- package/dist/web/assets/info-3K5VOQVL-DUhLSKI2.js +0 -1
- package/dist/web/assets/keybindings-store-BicDU0b1.js +0 -1
- package/dist/web/assets/notification-store-D_2wCv0z.js +0 -1
- package/dist/web/assets/packet-RMMSAZCW-BIpeVUGW.js +0 -1
- package/dist/web/assets/pie-UPGHQEXC-CNoizzjb.js +0 -1
- package/dist/web/assets/radar-KQ55EAFF-7dns-ho5.js +0 -1
- package/dist/web/assets/settings-tab-p3lxp6_T.js +0 -1
- package/dist/web/assets/system-monitor-tab-DfpsOgL3.js +0 -1
- package/dist/web/assets/treemap-KZPCXAKY-D3DZCLoE.js +0 -1
- /package/dist/web/assets/{api-client-BK4NPNoY.js → api-client-DiZgVOok.js} +0 -0
- /package/dist/web/assets/{csv-parser-D1b_lg2T.js → csv-parser-D8VHWVA6.js} +0 -0
- /package/dist/web/assets/{data-grid-types-DzL5W2em.js → data-grid-types-C29KDkZJ.js} +0 -0
- /package/dist/web/assets/{dist-CohudVKa.js → dist-DeY41KFi.js} +0 -0
- /package/dist/web/assets/{dist-BM2EHhLH.js → dist-PPUhQONj.js} +0 -0
- /package/dist/web/assets/{katex-CHaeM9QC.js → katex-DUj5OG1J.js} +0 -0
- /package/dist/web/assets/{lib-LPmTkMu4.js → lib-DrypSCq8.js} +0 -0
- /package/dist/web/assets/{react-DHBl6KRc.js → react-CfveccaI.js} +0 -0
- /package/dist/web/assets/{utils-CSCvNZxE.js → utils-E0yyGxXt.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-vh96p1Au.js → vendor-xterm-t3d5xZdz.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as e}from"./vendor-markdown-0Mxgxy0L.js";import{t}from"./file-exclamation-point-B__2Hrd6.js";import"./api-client-
|
|
1
|
+
import{b as e}from"./vendor-markdown-0Mxgxy0L.js";import{t}from"./file-exclamation-point-B__2Hrd6.js";import"./api-client-DiZgVOok.js";import{$ as n}from"./index-CP6EIXkh.js";import{t as r}from"./use-blob-url-CI2h4qu0.js";var i=e();function a({filePath:e,projectName:a}){let{blobUrl:o,error:s}=r(e,a);return s?(0,i.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,i.jsx)(t,{className:`size-10 text-text-subtle`}),(0,i.jsx)(`p`,{className:`text-sm`,children:`Failed to load video.`})]}):o?(0,i.jsx)(`div`,{className:`flex items-center justify-center h-full p-4 bg-surface overflow-auto`,children:(0,i.jsx)(`video`,{src:o,controls:!0,className:`max-w-full max-h-full`})}):(0,i.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,i.jsx)(n,{className:`size-5 animate-spin text-text-subtle`})})}export{a as VideoPreview};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./createLucideIcon-BjHrJDVb.js";var t=e(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t};
|
package/dist/web/index.html
CHANGED
|
@@ -39,31 +39,32 @@
|
|
|
39
39
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
40
40
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
41
41
|
<link href="https://fonts.googleapis.com/css2?family=Geist+Mono:wght@400;500;600;700&family=Geist:wght@400;500;600;700&display=swap" rel="stylesheet" />
|
|
42
|
-
<script type="module" crossorigin src="/assets/index-
|
|
42
|
+
<script type="module" crossorigin src="/assets/index-CP6EIXkh.js"></script>
|
|
43
43
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-FhOqtrmT.js">
|
|
44
|
-
<link rel="modulepreload" crossorigin href="/assets/vendor-mermaid-
|
|
44
|
+
<link rel="modulepreload" crossorigin href="/assets/vendor-mermaid-DCie7hiR.js">
|
|
45
45
|
<link rel="modulepreload" crossorigin href="/assets/vendor-markdown-0Mxgxy0L.js">
|
|
46
46
|
<link rel="modulepreload" crossorigin href="/assets/vendor-ui-UXCWAcmi.js">
|
|
47
|
-
<link rel="modulepreload" crossorigin href="/assets/utils-
|
|
47
|
+
<link rel="modulepreload" crossorigin href="/assets/utils-E0yyGxXt.js">
|
|
48
48
|
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-BjHrJDVb.js">
|
|
49
|
-
<link rel="modulepreload" crossorigin href="/assets/x-
|
|
50
|
-
<link rel="modulepreload" crossorigin href="/assets/input-
|
|
51
|
-
<link rel="modulepreload" crossorigin href="/assets/react-
|
|
52
|
-
<link rel="modulepreload" crossorigin href="/assets/api-client-
|
|
53
|
-
<link rel="modulepreload" crossorigin href="/assets/settings-store-
|
|
49
|
+
<link rel="modulepreload" crossorigin href="/assets/x-DfF6D5Js.js">
|
|
50
|
+
<link rel="modulepreload" crossorigin href="/assets/input-B78ol0hV.js">
|
|
51
|
+
<link rel="modulepreload" crossorigin href="/assets/react-CfveccaI.js">
|
|
52
|
+
<link rel="modulepreload" crossorigin href="/assets/api-client-DiZgVOok.js">
|
|
53
|
+
<link rel="modulepreload" crossorigin href="/assets/settings-store-CSDOihqv.js">
|
|
54
54
|
<link rel="modulepreload" crossorigin href="/assets/eye-off-BacF7RVS.js">
|
|
55
55
|
<link rel="modulepreload" crossorigin href="/assets/chevron-down-BMo4cBth.js">
|
|
56
56
|
<link rel="modulepreload" crossorigin href="/assets/globe-CQ8NAYvi.js">
|
|
57
|
+
<link rel="modulepreload" crossorigin href="/assets/trash-2-DkIfBY8d.js">
|
|
57
58
|
<link rel="modulepreload" crossorigin href="/assets/refresh-cw-CRD2qr4U.js">
|
|
58
|
-
<link rel="modulepreload" crossorigin href="/assets/api-settings-
|
|
59
|
-
<link rel="modulepreload" crossorigin href="/assets/ai-settings-section-
|
|
59
|
+
<link rel="modulepreload" crossorigin href="/assets/api-settings-uQKmeGkl.js">
|
|
60
|
+
<link rel="modulepreload" crossorigin href="/assets/ai-settings-section-BH2UOQH-.js">
|
|
60
61
|
<link rel="modulepreload" crossorigin href="/assets/database-Dc8mr-dP.js">
|
|
61
62
|
<link rel="modulepreload" crossorigin href="/assets/chevron-right-CD8e6Aj4.js">
|
|
62
63
|
<link rel="modulepreload" crossorigin href="/assets/search-D90WJ5fo.js">
|
|
63
|
-
<link rel="modulepreload" crossorigin href="/assets/panel-store-
|
|
64
|
-
<link rel="modulepreload" crossorigin href="/assets/project-store-
|
|
65
|
-
<link rel="modulepreload" crossorigin href="/assets/tab-store-
|
|
66
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
64
|
+
<link rel="modulepreload" crossorigin href="/assets/panel-store-B1pOXkyS.js">
|
|
65
|
+
<link rel="modulepreload" crossorigin href="/assets/project-store-BnvrVKBw.js">
|
|
66
|
+
<link rel="modulepreload" crossorigin href="/assets/tab-store-DzftzxTL.js">
|
|
67
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DwvSM9vu.css">
|
|
67
68
|
<link rel="manifest" href="/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script></head>
|
|
68
69
|
<body class="bg-[#0f1419] text-[#e5e7eb] font-sans antialiased">
|
|
69
70
|
<div id="portal" style="position: fixed; left: 0; top: 0; z-index: 9999;" /></div>
|
package/dist/web/sw.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
try{self[`workbox:core:7.3.0`]&&_()}catch{}var e=(e,...t)=>{let n=e;return t.length>0&&(n+=` :: ${JSON.stringify(t)}`),n},t=class extends Error{constructor(t,n){let r=e(t,n);super(r),this.name=t,this.details=n}},n={googleAnalytics:`googleAnalytics`,precache:`precache-v2`,prefix:`workbox`,runtime:`runtime`,suffix:typeof registration<`u`?registration.scope:``},r=e=>[n.prefix,e,n.suffix].filter(e=>e&&e.length>0).join(`-`),i=e=>{for(let t of Object.keys(n))e(t)},a={updateDetails:e=>{i(t=>{typeof e[t]==`string`&&(n[t]=e[t])})},getGoogleAnalyticsName:e=>e||r(n.googleAnalytics),getPrecacheName:e=>e||r(n.precache),getPrefix:()=>n.prefix,getRuntimeName:e=>e||r(n.runtime),getSuffix:()=>n.suffix};function o(e,t){let n=t();return e.waitUntil(n),n}try{self[`workbox:precaching:7.3.0`]&&_()}catch{}var s=`__WB_REVISION__`;function c(e){if(!e)throw new t(`add-to-cache-list-unexpected-type`,{entry:e});if(typeof e==`string`){let t=new URL(e,location.href);return{cacheKey:t.href,url:t.href}}let{revision:n,url:r}=e;if(!r)throw new t(`add-to-cache-list-unexpected-type`,{entry:e});if(!n){let e=new URL(r,location.href);return{cacheKey:e.href,url:e.href}}let i=new URL(r,location.href),a=new URL(r,location.href);return i.searchParams.set(s,n),{cacheKey:i.href,url:a.href}}var l=class{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)},this.cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:n})=>{if(e.type===`install`&&t&&t.originalRequest&&t.originalRequest instanceof Request){let e=t.originalRequest.url;n?this.notUpdatedURLs.push(e):this.updatedURLs.push(e)}return n}}},u=class{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:e,params:t})=>{let n=t?.cacheKey||this._precacheController.getCacheKeyForURL(e.url);return n?new Request(n,{headers:e.headers}):e},this._precacheController=e}},d;function f(){if(d===void 0){let e=new Response(``);if(`body`in e)try{new Response(e.body),d=!0}catch{d=!1}d=!1}return d}async function p(e,n){let r=null;if(e.url&&(r=new URL(e.url).origin),r!==self.location.origin)throw new t(`cross-origin-copy-response`,{origin:r});let i=e.clone(),a={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},o=n?n(a):a,s=f()?i.body:await i.blob();return new Response(s,o)}var m=e=>new URL(String(e),location.href).href.replace(RegExp(`^${location.origin}`),``);function h(e,t){let n=new URL(e);for(let e of t)n.searchParams.delete(e);return n.href}async function g(e,t,n,r){let i=h(t.url,n);if(t.url===i)return e.match(t,r);let a=Object.assign(Object.assign({},r),{ignoreSearch:!0}),o=await e.keys(t,a);for(let t of o)if(i===h(t.url,n))return e.match(t,r)}var v=class{constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}},y=new Set;async function b(){for(let e of y)await e()}function x(e){return new Promise(t=>setTimeout(t,e))}try{self[`workbox:strategies:7.3.0`]&&_()}catch{}function S(e){return typeof e==`string`?new Request(e):e}var C=class{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new v,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(let e of this._plugins)this._pluginStateMap.set(e,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){let{event:n}=this,r=S(e);if(r.mode===`navigate`&&n instanceof FetchEvent&&n.preloadResponse){let e=await n.preloadResponse;if(e)return e}let i=this.hasCallback(`fetchDidFail`)?r.clone():null;try{for(let e of this.iterateCallbacks(`requestWillFetch`))r=await e({request:r.clone(),event:n})}catch(e){if(e instanceof Error)throw new t(`plugin-error-request-will-fetch`,{thrownErrorMessage:e.message})}let a=r.clone();try{let e;e=await fetch(r,r.mode===`navigate`?void 0:this._strategy.fetchOptions);for(let t of this.iterateCallbacks(`fetchDidSucceed`))e=await t({event:n,request:a,response:e});return e}catch(e){throw i&&await this.runCallbacks(`fetchDidFail`,{error:e,event:n,originalRequest:i.clone(),request:a.clone()}),e}}async fetchAndCachePut(e){let t=await this.fetch(e),n=t.clone();return this.waitUntil(this.cachePut(e,n)),t}async cacheMatch(e){let t=S(e),n,{cacheName:r,matchOptions:i}=this._strategy,a=await this.getCacheKey(t,`read`),o=Object.assign(Object.assign({},i),{cacheName:r});n=await caches.match(a,o);for(let e of this.iterateCallbacks(`cachedResponseWillBeUsed`))n=await e({cacheName:r,matchOptions:i,cachedResponse:n,request:a,event:this.event})||void 0;return n}async cachePut(e,n){let r=S(e);await x(0);let i=await this.getCacheKey(r,`write`);if(!n)throw new t(`cache-put-with-no-response`,{url:m(i.url)});let a=await this._ensureResponseSafeToCache(n);if(!a)return!1;let{cacheName:o,matchOptions:s}=this._strategy,c=await self.caches.open(o),l=this.hasCallback(`cacheDidUpdate`),u=l?await g(c,i.clone(),[`__WB_REVISION__`],s):null;try{await c.put(i,l?a.clone():a)}catch(e){if(e instanceof Error)throw e.name===`QuotaExceededError`&&await b(),e}for(let e of this.iterateCallbacks(`cacheDidUpdate`))await e({cacheName:o,oldResponse:u,newResponse:a.clone(),request:i,event:this.event});return!0}async getCacheKey(e,t){let n=`${e.url} | ${t}`;if(!this._cacheKeys[n]){let r=e;for(let e of this.iterateCallbacks(`cacheKeyWillBeUsed`))r=S(await e({mode:t,request:r,event:this.event,params:this.params}));this._cacheKeys[n]=r}return this._cacheKeys[n]}hasCallback(e){for(let t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(let n of this.iterateCallbacks(e))await n(t)}*iterateCallbacks(e){for(let t of this._strategy.plugins)if(typeof t[e]==`function`){let n=this._pluginStateMap.get(t);yield r=>{let i=Object.assign(Object.assign({},r),{state:n});return t[e](i)}}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){for(;this._extendLifetimePromises.length;){let e=this._extendLifetimePromises.splice(0),t=(await Promise.allSettled(e)).find(e=>e.status===`rejected`);if(t)throw t.reason}}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let t=e,n=!1;for(let e of this.iterateCallbacks(`cacheWillUpdate`))if(t=await e({request:this.request,response:t,event:this.event})||void 0,n=!0,!t)break;return n||t&&t.status!==200&&(t=void 0),t}},w=class{constructor(e={}){this.cacheName=a.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){let[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});let t=e.event,n=typeof e.request==`string`?new Request(e.request):e.request,r=`params`in e?e.params:void 0,i=new C(this,{event:t,request:n,params:r}),a=this._getResponse(i,n,t);return[a,this._awaitComplete(a,i,n,t)]}async _getResponse(e,n,r){await e.runCallbacks(`handlerWillStart`,{event:r,request:n});let i;try{if(i=await this._handle(n,e),!i||i.type===`error`)throw new t(`no-response`,{url:n.url})}catch(t){if(t instanceof Error){for(let a of e.iterateCallbacks(`handlerDidError`))if(i=await a({error:t,event:r,request:n}),i)break}if(!i)throw t}for(let t of e.iterateCallbacks(`handlerWillRespond`))i=await t({event:r,request:n,response:i});return i}async _awaitComplete(e,t,n,r){let i,a;try{i=await e}catch{}try{await t.runCallbacks(`handlerDidRespond`,{event:r,request:n,response:i}),await t.doneWaiting()}catch(e){e instanceof Error&&(a=e)}if(await t.runCallbacks(`handlerDidComplete`,{event:r,request:n,response:i,error:a}),t.destroy(),a)throw a}},T=class e extends w{constructor(t={}){t.cacheName=a.getPrecacheName(t.cacheName),super(t),this._fallbackToNetwork=t.fallbackToNetwork!==!1,this.plugins.push(e.copyRedirectedCacheableResponsesPlugin)}async _handle(e,t){return await t.cacheMatch(e)||(t.event&&t.event.type===`install`?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,n){let r,i=n.params||{};if(this._fallbackToNetwork){let t=i.integrity,a=e.integrity,o=!a||a===t;r=await n.fetch(new Request(e,{integrity:e.mode===`no-cors`?void 0:a||t})),t&&o&&e.mode!==`no-cors`&&(this._useDefaultCacheabilityPluginIfNeeded(),await n.cachePut(e,r.clone()))}else throw new t(`missing-precache-entry`,{cacheName:this.cacheName,url:e.url});return r}async _handleInstall(e,n){this._useDefaultCacheabilityPluginIfNeeded();let r=await n.fetch(e);if(!await n.cachePut(e,r.clone()))throw new t(`bad-precaching-response`,{url:e.url,status:r.status});return r}_useDefaultCacheabilityPluginIfNeeded(){let t=null,n=0;for(let[r,i]of this.plugins.entries())i!==e.copyRedirectedCacheableResponsesPlugin&&(i===e.defaultPrecacheCacheabilityPlugin&&(t=r),i.cacheWillUpdate&&n++);n===0?this.plugins.push(e.defaultPrecacheCacheabilityPlugin):n>1&&t!==null&&this.plugins.splice(t,1)}};T.defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:e}){return!e||e.status>=400?null:e}},T.copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:e}){return e.redirected?await p(e):e}};var E=class{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:n=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new T({cacheName:a.getPrecacheName(e),plugins:[...t,new u({precacheController:this})],fallbackToNetwork:n}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this._strategy}precache(e){this.addToCacheList(e),this._installAndActiveListenersAdded||=(self.addEventListener(`install`,this.install),self.addEventListener(`activate`,this.activate),!0)}addToCacheList(e){let n=[];for(let r of e){typeof r==`string`?n.push(r):r&&r.revision===void 0&&n.push(r.url);let{cacheKey:e,url:i}=c(r),a=typeof r!=`string`&&r.revision?`reload`:`default`;if(this._urlsToCacheKeys.has(i)&&this._urlsToCacheKeys.get(i)!==e)throw new t(`add-to-cache-list-conflicting-entries`,{firstEntry:this._urlsToCacheKeys.get(i),secondEntry:e});if(typeof r!=`string`&&r.integrity){if(this._cacheKeysToIntegrities.has(e)&&this._cacheKeysToIntegrities.get(e)!==r.integrity)throw new t(`add-to-cache-list-conflicting-integrities`,{url:i});this._cacheKeysToIntegrities.set(e,r.integrity)}if(this._urlsToCacheKeys.set(i,e),this._urlsToCacheModes.set(i,a),n.length>0){let e=`Workbox is precaching URLs without revision info: ${n.join(`, `)}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(e)}}}install(e){return o(e,async()=>{let t=new l;this.strategy.plugins.push(t);for(let[t,n]of this._urlsToCacheKeys){let r=this._cacheKeysToIntegrities.get(n),i=this._urlsToCacheModes.get(t),a=new Request(t,{integrity:r,cache:i,credentials:`same-origin`});await Promise.all(this.strategy.handleAll({params:{cacheKey:n},request:a,event:e}))}let{updatedURLs:n,notUpdatedURLs:r}=t;return{updatedURLs:n,notUpdatedURLs:r}})}activate(e){return o(e,async()=>{let e=await self.caches.open(this.strategy.cacheName),t=await e.keys(),n=new Set(this._urlsToCacheKeys.values()),r=[];for(let i of t)n.has(i.url)||(await e.delete(i),r.push(i.url));return{deletedURLs:r}})}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){let t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){let t=e instanceof Request?e.url:e,n=this.getCacheKeyForURL(t);if(n)return(await self.caches.open(this.strategy.cacheName)).match(n)}createHandlerBoundToURL(e){let n=this.getCacheKeyForURL(e);if(!n)throw new t(`non-precached-url`,{url:e});return t=>(t.request=new Request(e),t.params=Object.assign({cacheKey:n},t.params),this.strategy.handle(t))}},D,O=()=>(D||=new E,D);try{self[`workbox:routing:7.3.0`]&&_()}catch{}var k=e=>e&&typeof e==`object`?e:{handle:e},A=class{constructor(e,t,n=`GET`){this.handler=k(t),this.match=e,this.method=n}setCatchHandler(e){this.catchHandler=k(e)}},j=class extends A{constructor(e,t,n){super(({url:t})=>{let n=e.exec(t.href);if(n&&!(t.origin!==location.origin&&n.index!==0))return n.slice(1)},t,n)}},M=class{constructor(){this._routes=new Map,this._defaultHandlerMap=new Map}get routes(){return this._routes}addFetchListener(){self.addEventListener(`fetch`,(e=>{let{request:t}=e,n=this.handleRequest({request:t,event:e});n&&e.respondWith(n)}))}addCacheListener(){self.addEventListener(`message`,(e=>{if(e.data&&e.data.type===`CACHE_URLS`){let{payload:t}=e.data,n=Promise.all(t.urlsToCache.map(t=>{typeof t==`string`&&(t=[t]);let n=new Request(...t);return this.handleRequest({request:n,event:e})}));e.waitUntil(n),e.ports&&e.ports[0]&&n.then(()=>e.ports[0].postMessage(!0))}}))}handleRequest({request:e,event:t}){let n=new URL(e.url,location.href);if(!n.protocol.startsWith(`http`))return;let r=n.origin===location.origin,{params:i,route:a}=this.findMatchingRoute({event:t,request:e,sameOrigin:r,url:n}),o=a&&a.handler,s=e.method;if(!o&&this._defaultHandlerMap.has(s)&&(o=this._defaultHandlerMap.get(s)),!o)return;let c;try{c=o.handle({url:n,request:e,event:t,params:i})}catch(e){c=Promise.reject(e)}let l=a&&a.catchHandler;return c instanceof Promise&&(this._catchHandler||l)&&(c=c.catch(async r=>{if(l)try{return await l.handle({url:n,request:e,event:t,params:i})}catch(e){e instanceof Error&&(r=e)}if(this._catchHandler)return this._catchHandler.handle({url:n,request:e,event:t});throw r})),c}findMatchingRoute({url:e,sameOrigin:t,request:n,event:r}){let i=this._routes.get(n.method)||[];for(let a of i){let i,o=a.match({url:e,sameOrigin:t,request:n,event:r});if(o)return i=o,(Array.isArray(i)&&i.length===0||o.constructor===Object&&Object.keys(o).length===0||typeof o==`boolean`)&&(i=void 0),{route:a,params:i}}return{}}setDefaultHandler(e,t=`GET`){this._defaultHandlerMap.set(t,k(e))}setCatchHandler(e){this._catchHandler=k(e)}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new t(`unregister-route-but-not-found-with-method`,{method:e.method});let n=this._routes.get(e.method).indexOf(e);if(n>-1)this._routes.get(e.method).splice(n,1);else throw new t(`unregister-route-route-not-registered`)}},N,P=()=>(N||(N=new M,N.addFetchListener(),N.addCacheListener()),N);function F(e,n,r){let i;if(typeof e==`string`){let t=new URL(e,location.href);i=new A(({url:e})=>e.href===t.href,n,r)}else if(e instanceof RegExp)i=new j(e,n,r);else if(typeof e==`function`)i=new A(e,n,r);else if(e instanceof A)i=e;else throw new t(`unsupported-route-type`,{moduleName:`workbox-routing`,funcName:`registerRoute`,paramName:`capture`});return P().registerRoute(i),i}function I(e,t=[]){for(let n of[...e.searchParams.keys()])t.some(e=>e.test(n))&&e.searchParams.delete(n);return e}function*L(e,{ignoreURLParametersMatching:t=[/^utm_/,/^fbclid$/],directoryIndex:n=`index.html`,cleanURLs:r=!0,urlManipulation:i}={}){let a=new URL(e,location.href);a.hash=``,yield a.href;let o=I(a,t);if(yield o.href,n&&o.pathname.endsWith(`/`)){let e=new URL(o.href);e.pathname+=n,yield e.href}if(r){let e=new URL(o.href);e.pathname+=`.html`,yield e.href}if(i){let e=i({url:a});for(let t of e)yield t.href}}var R=class extends A{constructor(e,t){super(({request:n})=>{let r=e.getURLsToCacheKeys();for(let i of L(n.url,t)){let t=r.get(i);if(t)return{cacheKey:t,integrity:e.getIntegrityForCacheKey(t)}}},e.strategy)}};function z(e){F(new R(O(),e))}function B(e){O().precache(e)}function V(e,t){B(e),z(t)}V([{"revision":"1872c500de691dce40960bb85481de07","url":"registerSW.js"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"63bd4ab1b5c42a305941a3a738963ffd","url":"index.html"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":null,"url":"assets/project-store-DlbHpIq0.js"},{"revision":null,"url":"assets/utils-CSCvNZxE.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2"},{"revision":null,"url":"assets/KaTeX_AMS-Regular-BQhdFMY1.woff2"},{"revision":null,"url":"assets/table-2wDtM4_B.js"},{"revision":null,"url":"assets/katex-CHaeM9QC.js"},{"revision":null,"url":"assets/extension-webview-b7T0yAq2.js"},{"revision":null,"url":"assets/arrow-down-D825m4vm.js"},{"revision":null,"url":"assets/api-settings-BJTjIG4U.js"},{"revision":null,"url":"assets/pie-UPGHQEXC-CNoizzjb.js"},{"revision":null,"url":"assets/code-editor-BgU5lFVC.js"},{"revision":null,"url":"assets/chat-tab-Clzw7eDP.js"},{"revision":null,"url":"assets/esm-xVTUq__o.js"},{"revision":null,"url":"assets/audio-preview-B53oeW0y.js"},{"revision":null,"url":"assets/settings-tab-p3lxp6_T.js"},{"revision":null,"url":"assets/sql-query-editor-BA80nuKp.js"},{"revision":null,"url":"assets/keybindings-store-BicDU0b1.js"},{"revision":null,"url":"assets/KaTeX_Main-Regular-B22Nviop.woff2"},{"revision":null,"url":"assets/port-forwarding-tab-BmRMiN32.js"},{"revision":null,"url":"assets/radar-KQ55EAFF-7dns-ho5.js"},{"revision":null,"url":"assets/chevron-down-BMo4cBth.js"},{"revision":null,"url":"assets/react-DHBl6KRc.js"},{"revision":null,"url":"assets/conflict-editor-C3l3pgtV.js"},{"revision":null,"url":"assets/sqlite-viewer-Bev2XJe7.js"},{"revision":null,"url":"assets/github.min-D2BCvnWf.css"},{"revision":null,"url":"assets/treemap-KZPCXAKY-D3DZCLoE.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2"},{"revision":null,"url":"assets/dist-CohudVKa.js"},{"revision":null,"url":"assets/glide-data-grid-nthEL3fk.css"},{"revision":null,"url":"assets/settings-store-DQUFTPk2.js"},{"revision":null,"url":"assets/use-blob-url-VgTGpely.js"},{"revision":null,"url":"assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2"},{"revision":null,"url":"assets/terminal-tab-Ca5kyUS7.js"},{"revision":null,"url":"assets/vendor-markdown-0Mxgxy0L.js"},{"revision":null,"url":"assets/vendor-xterm-vh96p1Au.js"},{"revision":null,"url":"assets/wifi-LJEyIdXf.js"},{"revision":null,"url":"assets/tab-store-CIcbSn0c.js"},{"revision":null,"url":"assets/KaTeX_Main-Italic-NWA7e6Wa.woff2"},{"revision":null,"url":"assets/video-preview-Bvd0OaYA.js"},{"revision":null,"url":"assets/notification-store-D_2wCv0z.js"},{"revision":null,"url":"assets/use-monaco-theme-BLIgarH5.js"},{"revision":null,"url":"assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2"},{"revision":null,"url":"assets/panel-store-C9VAhbZz.js"},{"revision":null,"url":"assets/chevron-right-CD8e6Aj4.js"},{"revision":null,"url":"assets/data-grid-types-DzL5W2em.js"},{"revision":null,"url":"assets/index-CDPVPZHJ.css"},{"revision":null,"url":"assets/text-wrap-AZErifCu.js"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2"},{"revision":null,"url":"assets/globe-CQ8NAYvi.js"},{"revision":null,"url":"assets/data-grid-overlay-editor-DGjqvYn6.js"},{"revision":null,"url":"assets/glide-data-grid-_9gGGfZy.js"},{"revision":null,"url":"assets/gitGraph-HDMCJU4V-D3UR56AG.js"},{"revision":null,"url":"assets/rolldown-runtime-FhOqtrmT.js"},{"revision":null,"url":"assets/code-DiNmA3eR.js"},{"revision":null,"url":"assets/refresh-cw-CRD2qr4U.js"},{"revision":null,"url":"assets/search-D90WJ5fo.js"},{"revision":null,"url":"assets/vendor-ui-UXCWAcmi.js"},{"revision":null,"url":"assets/packet-RMMSAZCW-BIpeVUGW.js"},{"revision":null,"url":"assets/file-exclamation-point-B__2Hrd6.js"},{"revision":null,"url":"assets/KaTeX_Math-Italic-t53AETM-.woff2"},{"revision":null,"url":"assets/github-dark-dimmed.min-BrpRStFV.css"},{"revision":null,"url":"assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2"},{"revision":null,"url":"assets/KaTeX_Script-Regular-D3wIWfF6.woff2"},{"revision":null,"url":"assets/arrow-up-Rcw6_KKu.js"},{"revision":null,"url":"assets/database-Dc8mr-dP.js"},{"revision":null,"url":"assets/eye-off-BacF7RVS.js"},{"revision":null,"url":"assets/vendor-mermaid-DkqjpqJK.js"},{"revision":null,"url":"assets/postgres-viewer-DuiEoUGK.js"},{"revision":null,"url":"assets/lib-LPmTkMu4.js"},{"revision":null,"url":"assets/KaTeX_Main-Bold-Cx986IdX.woff2"},{"revision":null,"url":"assets/pdf-preview-C51mDesS.js"},{"revision":null,"url":"assets/markdown-renderer-DWIBF9Jg.js"},{"revision":null,"url":"assets/KaTeX_Size2-Regular-Dy4dx90m.woff2"},{"revision":null,"url":"assets/index-1_isAfRS.js"},{"revision":null,"url":"assets/git-log-panel-CWTTJERX.js"},{"revision":null,"url":"assets/system-monitor-tab-DfpsOgL3.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2"},{"revision":null,"url":"assets/diff-viewer-Dec4mKgl.js"},{"revision":null,"url":"assets/KaTeX_Size1-Regular-mCD8mA8B.woff2"},{"revision":null,"url":"assets/architecture-PBZL5I3N-CkdUQjA_.js"},{"revision":null,"url":"assets/database-viewer-DNYgu_Jv.js"},{"revision":null,"url":"assets/number-overlay-editor-DtUBprPW.js"},{"revision":null,"url":"assets/csv-preview-asMfgR0r.js"},{"revision":null,"url":"assets/createLucideIcon-BjHrJDVb.js"},{"revision":null,"url":"assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2"},{"revision":null,"url":"assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2"},{"revision":null,"url":"assets/input-By_lZeCs.js"},{"revision":null,"url":"assets/api-client-BK4NPNoY.js"},{"revision":null,"url":"assets/sparkles-KCOEy7QI.js"},{"revision":null,"url":"assets/ai-settings-section-AxLbNnLW.js"},{"revision":null,"url":"assets/image-preview-CzXKlWft.js"},{"revision":null,"url":"assets/vendor-xterm-BrP-ENHg.css"},{"revision":null,"url":"assets/info-3K5VOQVL-DUhLSKI2.js"},{"revision":null,"url":"assets/x-ClICkcxR.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2"},{"revision":null,"url":"assets/dist-BM2EHhLH.js"},{"revision":null,"url":"assets/csv-parser-D1b_lg2T.js"},{"revision":"d0f94ce046cf8cf09605ee7664dac557","url":"monacoeditorwork/html.worker.bundle.js"},{"revision":"a424156a79b9c1b907db93aa3180585a","url":"monacoeditorwork/editor.worker.bundle.js"},{"revision":"b3a7f967560c9816492a1567b3f7f0dc","url":"monacoeditorwork/css.worker.bundle.js"},{"revision":"a5d8a1acfc29c2a4c882a54ffc93def3","url":"monacoeditorwork/json.worker.bundle.js"},{"revision":"948e060affb598c339be40d69e1f6f9c","url":"monacoeditorwork/ts.worker.bundle.js"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"26dccd02a2ef7522892015154f5e3680","url":"manifest.webmanifest"}]),self.addEventListener(`push`,e=>{e.waitUntil(self.clients.matchAll({type:`window`,includeUncontrolled:!0}).then(t=>{if(t.some(e=>e.visibilityState===`visible`))return;let n=e.data?.json()??{title:`PPM`,body:`Chat completed`};return self.registration.showNotification(n.title,{body:n.body,icon:`/icon-192.svg`,badge:`/icon-192.svg`,tag:`ppm-chat-done`,silent:!1,data:{url:self.location.origin}})}))}),self.addEventListener(`notificationclick`,e=>{e.notification.close(),e.waitUntil(self.clients.matchAll({type:`window`,includeUncontrolled:!0}).then(t=>{for(let e of t)if(e.url.includes(self.location.origin)&&`focus`in e)return e.focus();return self.clients.openWindow(e.notification.data?.url||`/`)}))});
|
|
1
|
+
try{self[`workbox:core:7.3.0`]&&_()}catch{}var e=(e,...t)=>{let n=e;return t.length>0&&(n+=` :: ${JSON.stringify(t)}`),n},t=class extends Error{constructor(t,n){let r=e(t,n);super(r),this.name=t,this.details=n}},n={googleAnalytics:`googleAnalytics`,precache:`precache-v2`,prefix:`workbox`,runtime:`runtime`,suffix:typeof registration<`u`?registration.scope:``},r=e=>[n.prefix,e,n.suffix].filter(e=>e&&e.length>0).join(`-`),i=e=>{for(let t of Object.keys(n))e(t)},a={updateDetails:e=>{i(t=>{typeof e[t]==`string`&&(n[t]=e[t])})},getGoogleAnalyticsName:e=>e||r(n.googleAnalytics),getPrecacheName:e=>e||r(n.precache),getPrefix:()=>n.prefix,getRuntimeName:e=>e||r(n.runtime),getSuffix:()=>n.suffix};function o(e,t){let n=t();return e.waitUntil(n),n}try{self[`workbox:precaching:7.3.0`]&&_()}catch{}var s=`__WB_REVISION__`;function c(e){if(!e)throw new t(`add-to-cache-list-unexpected-type`,{entry:e});if(typeof e==`string`){let t=new URL(e,location.href);return{cacheKey:t.href,url:t.href}}let{revision:n,url:r}=e;if(!r)throw new t(`add-to-cache-list-unexpected-type`,{entry:e});if(!n){let e=new URL(r,location.href);return{cacheKey:e.href,url:e.href}}let i=new URL(r,location.href),a=new URL(r,location.href);return i.searchParams.set(s,n),{cacheKey:i.href,url:a.href}}var l=class{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)},this.cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:n})=>{if(e.type===`install`&&t&&t.originalRequest&&t.originalRequest instanceof Request){let e=t.originalRequest.url;n?this.notUpdatedURLs.push(e):this.updatedURLs.push(e)}return n}}},u=class{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:e,params:t})=>{let n=t?.cacheKey||this._precacheController.getCacheKeyForURL(e.url);return n?new Request(n,{headers:e.headers}):e},this._precacheController=e}},d;function f(){if(d===void 0){let e=new Response(``);if(`body`in e)try{new Response(e.body),d=!0}catch{d=!1}d=!1}return d}async function p(e,n){let r=null;if(e.url&&(r=new URL(e.url).origin),r!==self.location.origin)throw new t(`cross-origin-copy-response`,{origin:r});let i=e.clone(),a={headers:new Headers(i.headers),status:i.status,statusText:i.statusText},o=n?n(a):a,s=f()?i.body:await i.blob();return new Response(s,o)}var m=e=>new URL(String(e),location.href).href.replace(RegExp(`^${location.origin}`),``);function h(e,t){let n=new URL(e);for(let e of t)n.searchParams.delete(e);return n.href}async function g(e,t,n,r){let i=h(t.url,n);if(t.url===i)return e.match(t,r);let a=Object.assign(Object.assign({},r),{ignoreSearch:!0}),o=await e.keys(t,a);for(let t of o)if(i===h(t.url,n))return e.match(t,r)}var v=class{constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}},y=new Set;async function b(){for(let e of y)await e()}function x(e){return new Promise(t=>setTimeout(t,e))}try{self[`workbox:strategies:7.3.0`]&&_()}catch{}function S(e){return typeof e==`string`?new Request(e):e}var C=class{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new v,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(let e of this._plugins)this._pluginStateMap.set(e,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){let{event:n}=this,r=S(e);if(r.mode===`navigate`&&n instanceof FetchEvent&&n.preloadResponse){let e=await n.preloadResponse;if(e)return e}let i=this.hasCallback(`fetchDidFail`)?r.clone():null;try{for(let e of this.iterateCallbacks(`requestWillFetch`))r=await e({request:r.clone(),event:n})}catch(e){if(e instanceof Error)throw new t(`plugin-error-request-will-fetch`,{thrownErrorMessage:e.message})}let a=r.clone();try{let e;e=await fetch(r,r.mode===`navigate`?void 0:this._strategy.fetchOptions);for(let t of this.iterateCallbacks(`fetchDidSucceed`))e=await t({event:n,request:a,response:e});return e}catch(e){throw i&&await this.runCallbacks(`fetchDidFail`,{error:e,event:n,originalRequest:i.clone(),request:a.clone()}),e}}async fetchAndCachePut(e){let t=await this.fetch(e),n=t.clone();return this.waitUntil(this.cachePut(e,n)),t}async cacheMatch(e){let t=S(e),n,{cacheName:r,matchOptions:i}=this._strategy,a=await this.getCacheKey(t,`read`),o=Object.assign(Object.assign({},i),{cacheName:r});n=await caches.match(a,o);for(let e of this.iterateCallbacks(`cachedResponseWillBeUsed`))n=await e({cacheName:r,matchOptions:i,cachedResponse:n,request:a,event:this.event})||void 0;return n}async cachePut(e,n){let r=S(e);await x(0);let i=await this.getCacheKey(r,`write`);if(!n)throw new t(`cache-put-with-no-response`,{url:m(i.url)});let a=await this._ensureResponseSafeToCache(n);if(!a)return!1;let{cacheName:o,matchOptions:s}=this._strategy,c=await self.caches.open(o),l=this.hasCallback(`cacheDidUpdate`),u=l?await g(c,i.clone(),[`__WB_REVISION__`],s):null;try{await c.put(i,l?a.clone():a)}catch(e){if(e instanceof Error)throw e.name===`QuotaExceededError`&&await b(),e}for(let e of this.iterateCallbacks(`cacheDidUpdate`))await e({cacheName:o,oldResponse:u,newResponse:a.clone(),request:i,event:this.event});return!0}async getCacheKey(e,t){let n=`${e.url} | ${t}`;if(!this._cacheKeys[n]){let r=e;for(let e of this.iterateCallbacks(`cacheKeyWillBeUsed`))r=S(await e({mode:t,request:r,event:this.event,params:this.params}));this._cacheKeys[n]=r}return this._cacheKeys[n]}hasCallback(e){for(let t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(let n of this.iterateCallbacks(e))await n(t)}*iterateCallbacks(e){for(let t of this._strategy.plugins)if(typeof t[e]==`function`){let n=this._pluginStateMap.get(t);yield r=>{let i=Object.assign(Object.assign({},r),{state:n});return t[e](i)}}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){for(;this._extendLifetimePromises.length;){let e=this._extendLifetimePromises.splice(0),t=(await Promise.allSettled(e)).find(e=>e.status===`rejected`);if(t)throw t.reason}}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let t=e,n=!1;for(let e of this.iterateCallbacks(`cacheWillUpdate`))if(t=await e({request:this.request,response:t,event:this.event})||void 0,n=!0,!t)break;return n||t&&t.status!==200&&(t=void 0),t}},w=class{constructor(e={}){this.cacheName=a.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){let[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});let t=e.event,n=typeof e.request==`string`?new Request(e.request):e.request,r=`params`in e?e.params:void 0,i=new C(this,{event:t,request:n,params:r}),a=this._getResponse(i,n,t);return[a,this._awaitComplete(a,i,n,t)]}async _getResponse(e,n,r){await e.runCallbacks(`handlerWillStart`,{event:r,request:n});let i;try{if(i=await this._handle(n,e),!i||i.type===`error`)throw new t(`no-response`,{url:n.url})}catch(t){if(t instanceof Error){for(let a of e.iterateCallbacks(`handlerDidError`))if(i=await a({error:t,event:r,request:n}),i)break}if(!i)throw t}for(let t of e.iterateCallbacks(`handlerWillRespond`))i=await t({event:r,request:n,response:i});return i}async _awaitComplete(e,t,n,r){let i,a;try{i=await e}catch{}try{await t.runCallbacks(`handlerDidRespond`,{event:r,request:n,response:i}),await t.doneWaiting()}catch(e){e instanceof Error&&(a=e)}if(await t.runCallbacks(`handlerDidComplete`,{event:r,request:n,response:i,error:a}),t.destroy(),a)throw a}},T=class e extends w{constructor(t={}){t.cacheName=a.getPrecacheName(t.cacheName),super(t),this._fallbackToNetwork=t.fallbackToNetwork!==!1,this.plugins.push(e.copyRedirectedCacheableResponsesPlugin)}async _handle(e,t){return await t.cacheMatch(e)||(t.event&&t.event.type===`install`?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,n){let r,i=n.params||{};if(this._fallbackToNetwork){let t=i.integrity,a=e.integrity,o=!a||a===t;r=await n.fetch(new Request(e,{integrity:e.mode===`no-cors`?void 0:a||t})),t&&o&&e.mode!==`no-cors`&&(this._useDefaultCacheabilityPluginIfNeeded(),await n.cachePut(e,r.clone()))}else throw new t(`missing-precache-entry`,{cacheName:this.cacheName,url:e.url});return r}async _handleInstall(e,n){this._useDefaultCacheabilityPluginIfNeeded();let r=await n.fetch(e);if(!await n.cachePut(e,r.clone()))throw new t(`bad-precaching-response`,{url:e.url,status:r.status});return r}_useDefaultCacheabilityPluginIfNeeded(){let t=null,n=0;for(let[r,i]of this.plugins.entries())i!==e.copyRedirectedCacheableResponsesPlugin&&(i===e.defaultPrecacheCacheabilityPlugin&&(t=r),i.cacheWillUpdate&&n++);n===0?this.plugins.push(e.defaultPrecacheCacheabilityPlugin):n>1&&t!==null&&this.plugins.splice(t,1)}};T.defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:e}){return!e||e.status>=400?null:e}},T.copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:e}){return e.redirected?await p(e):e}};var E=class{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:n=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new T({cacheName:a.getPrecacheName(e),plugins:[...t,new u({precacheController:this})],fallbackToNetwork:n}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this._strategy}precache(e){this.addToCacheList(e),this._installAndActiveListenersAdded||=(self.addEventListener(`install`,this.install),self.addEventListener(`activate`,this.activate),!0)}addToCacheList(e){let n=[];for(let r of e){typeof r==`string`?n.push(r):r&&r.revision===void 0&&n.push(r.url);let{cacheKey:e,url:i}=c(r),a=typeof r!=`string`&&r.revision?`reload`:`default`;if(this._urlsToCacheKeys.has(i)&&this._urlsToCacheKeys.get(i)!==e)throw new t(`add-to-cache-list-conflicting-entries`,{firstEntry:this._urlsToCacheKeys.get(i),secondEntry:e});if(typeof r!=`string`&&r.integrity){if(this._cacheKeysToIntegrities.has(e)&&this._cacheKeysToIntegrities.get(e)!==r.integrity)throw new t(`add-to-cache-list-conflicting-integrities`,{url:i});this._cacheKeysToIntegrities.set(e,r.integrity)}if(this._urlsToCacheKeys.set(i,e),this._urlsToCacheModes.set(i,a),n.length>0){let e=`Workbox is precaching URLs without revision info: ${n.join(`, `)}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(e)}}}install(e){return o(e,async()=>{let t=new l;this.strategy.plugins.push(t);for(let[t,n]of this._urlsToCacheKeys){let r=this._cacheKeysToIntegrities.get(n),i=this._urlsToCacheModes.get(t),a=new Request(t,{integrity:r,cache:i,credentials:`same-origin`});await Promise.all(this.strategy.handleAll({params:{cacheKey:n},request:a,event:e}))}let{updatedURLs:n,notUpdatedURLs:r}=t;return{updatedURLs:n,notUpdatedURLs:r}})}activate(e){return o(e,async()=>{let e=await self.caches.open(this.strategy.cacheName),t=await e.keys(),n=new Set(this._urlsToCacheKeys.values()),r=[];for(let i of t)n.has(i.url)||(await e.delete(i),r.push(i.url));return{deletedURLs:r}})}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){let t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){let t=e instanceof Request?e.url:e,n=this.getCacheKeyForURL(t);if(n)return(await self.caches.open(this.strategy.cacheName)).match(n)}createHandlerBoundToURL(e){let n=this.getCacheKeyForURL(e);if(!n)throw new t(`non-precached-url`,{url:e});return t=>(t.request=new Request(e),t.params=Object.assign({cacheKey:n},t.params),this.strategy.handle(t))}},D,O=()=>(D||=new E,D);try{self[`workbox:routing:7.3.0`]&&_()}catch{}var k=e=>e&&typeof e==`object`?e:{handle:e},A=class{constructor(e,t,n=`GET`){this.handler=k(t),this.match=e,this.method=n}setCatchHandler(e){this.catchHandler=k(e)}},j=class extends A{constructor(e,t,n){super(({url:t})=>{let n=e.exec(t.href);if(n&&!(t.origin!==location.origin&&n.index!==0))return n.slice(1)},t,n)}},M=class{constructor(){this._routes=new Map,this._defaultHandlerMap=new Map}get routes(){return this._routes}addFetchListener(){self.addEventListener(`fetch`,(e=>{let{request:t}=e,n=this.handleRequest({request:t,event:e});n&&e.respondWith(n)}))}addCacheListener(){self.addEventListener(`message`,(e=>{if(e.data&&e.data.type===`CACHE_URLS`){let{payload:t}=e.data,n=Promise.all(t.urlsToCache.map(t=>{typeof t==`string`&&(t=[t]);let n=new Request(...t);return this.handleRequest({request:n,event:e})}));e.waitUntil(n),e.ports&&e.ports[0]&&n.then(()=>e.ports[0].postMessage(!0))}}))}handleRequest({request:e,event:t}){let n=new URL(e.url,location.href);if(!n.protocol.startsWith(`http`))return;let r=n.origin===location.origin,{params:i,route:a}=this.findMatchingRoute({event:t,request:e,sameOrigin:r,url:n}),o=a&&a.handler,s=e.method;if(!o&&this._defaultHandlerMap.has(s)&&(o=this._defaultHandlerMap.get(s)),!o)return;let c;try{c=o.handle({url:n,request:e,event:t,params:i})}catch(e){c=Promise.reject(e)}let l=a&&a.catchHandler;return c instanceof Promise&&(this._catchHandler||l)&&(c=c.catch(async r=>{if(l)try{return await l.handle({url:n,request:e,event:t,params:i})}catch(e){e instanceof Error&&(r=e)}if(this._catchHandler)return this._catchHandler.handle({url:n,request:e,event:t});throw r})),c}findMatchingRoute({url:e,sameOrigin:t,request:n,event:r}){let i=this._routes.get(n.method)||[];for(let a of i){let i,o=a.match({url:e,sameOrigin:t,request:n,event:r});if(o)return i=o,(Array.isArray(i)&&i.length===0||o.constructor===Object&&Object.keys(o).length===0||typeof o==`boolean`)&&(i=void 0),{route:a,params:i}}return{}}setDefaultHandler(e,t=`GET`){this._defaultHandlerMap.set(t,k(e))}setCatchHandler(e){this._catchHandler=k(e)}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new t(`unregister-route-but-not-found-with-method`,{method:e.method});let n=this._routes.get(e.method).indexOf(e);if(n>-1)this._routes.get(e.method).splice(n,1);else throw new t(`unregister-route-route-not-registered`)}},N,P=()=>(N||(N=new M,N.addFetchListener(),N.addCacheListener()),N);function F(e,n,r){let i;if(typeof e==`string`){let t=new URL(e,location.href);i=new A(({url:e})=>e.href===t.href,n,r)}else if(e instanceof RegExp)i=new j(e,n,r);else if(typeof e==`function`)i=new A(e,n,r);else if(e instanceof A)i=e;else throw new t(`unsupported-route-type`,{moduleName:`workbox-routing`,funcName:`registerRoute`,paramName:`capture`});return P().registerRoute(i),i}function I(e,t=[]){for(let n of[...e.searchParams.keys()])t.some(e=>e.test(n))&&e.searchParams.delete(n);return e}function*L(e,{ignoreURLParametersMatching:t=[/^utm_/,/^fbclid$/],directoryIndex:n=`index.html`,cleanURLs:r=!0,urlManipulation:i}={}){let a=new URL(e,location.href);a.hash=``,yield a.href;let o=I(a,t);if(yield o.href,n&&o.pathname.endsWith(`/`)){let e=new URL(o.href);e.pathname+=n,yield e.href}if(r){let e=new URL(o.href);e.pathname+=`.html`,yield e.href}if(i){let e=i({url:a});for(let t of e)yield t.href}}var R=class extends A{constructor(e,t){super(({request:n})=>{let r=e.getURLsToCacheKeys();for(let i of L(n.url,t)){let t=r.get(i);if(t)return{cacheKey:t,integrity:e.getIntegrityForCacheKey(t)}}},e.strategy)}};function z(e){F(new R(O(),e))}function B(e){O().precache(e)}function V(e,t){B(e),z(t)}V([{"revision":"1872c500de691dce40960bb85481de07","url":"registerSW.js"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"6102283689db4f29312da41d44e93e01","url":"index.html"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":null,"url":"assets/git-log-panel-Bk7Eh-Bn.js"},{"revision":null,"url":"assets/react-CfveccaI.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2"},{"revision":null,"url":"assets/api-settings-uQKmeGkl.js"},{"revision":null,"url":"assets/KaTeX_AMS-Regular-BQhdFMY1.woff2"},{"revision":null,"url":"assets/project-store-BnvrVKBw.js"},{"revision":null,"url":"assets/sql-query-editor-CNwOnFgF.js"},{"revision":null,"url":"assets/table-2wDtM4_B.js"},{"revision":null,"url":"assets/packet-RMMSAZCW-Ar00Wbhd.js"},{"revision":null,"url":"assets/sqlite-viewer-FFlsRPWf.js"},{"revision":null,"url":"assets/extension-webview-DCwz2Wso.js"},{"revision":null,"url":"assets/arrow-down-D825m4vm.js"},{"revision":null,"url":"assets/database-viewer-zeQXxkg-.js"},{"revision":null,"url":"assets/system-monitor-tab-CefzxLVi.js"},{"revision":null,"url":"assets/KaTeX_Main-Regular-B22Nviop.woff2"},{"revision":null,"url":"assets/chevron-down-BMo4cBth.js"},{"revision":null,"url":"assets/audio-preview-LCxWo-25.js"},{"revision":null,"url":"assets/dist-DeY41KFi.js"},{"revision":null,"url":"assets/pie-UPGHQEXC-Q4ssDdib.js"},{"revision":null,"url":"assets/github.min-D2BCvnWf.css"},{"revision":null,"url":"assets/pdf-preview-BdmR2RsT.js"},{"revision":null,"url":"assets/radar-KQ55EAFF-kq5v4OKX.js"},{"revision":null,"url":"assets/settings-store-CSDOihqv.js"},{"revision":null,"url":"assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2"},{"revision":null,"url":"assets/image-preview-C1VLHLdJ.js"},{"revision":null,"url":"assets/info-3K5VOQVL-CWKw4e0V.js"},{"revision":null,"url":"assets/settings-tab-WdL5pYxG.js"},{"revision":null,"url":"assets/glide-data-grid-nthEL3fk.css"},{"revision":null,"url":"assets/esm-JPvheKDJ.js"},{"revision":null,"url":"assets/video-preview-izCy3xj7.js"},{"revision":null,"url":"assets/lib-DrypSCq8.js"},{"revision":null,"url":"assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2"},{"revision":null,"url":"assets/panel-store-B1pOXkyS.js"},{"revision":null,"url":"assets/vendor-markdown-0Mxgxy0L.js"},{"revision":null,"url":"assets/wifi-LJEyIdXf.js"},{"revision":null,"url":"assets/use-blob-url-CI2h4qu0.js"},{"revision":null,"url":"assets/KaTeX_Main-Italic-NWA7e6Wa.woff2"},{"revision":null,"url":"assets/keybindings-store-Rf9YKWAp.js"},{"revision":null,"url":"assets/postgres-viewer-DkM6ndux.js"},{"revision":null,"url":"assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2"},{"revision":null,"url":"assets/chevron-right-CD8e6Aj4.js"},{"revision":null,"url":"assets/vendor-mermaid-DCie7hiR.js"},{"revision":null,"url":"assets/glide-data-grid-ha8hjunf.js"},{"revision":null,"url":"assets/trash-2-DkIfBY8d.js"},{"revision":null,"url":"assets/code-editor-Cd7NZ0VX.js"},{"revision":null,"url":"assets/terminal-tab-C4MNU5S3.js"},{"revision":null,"url":"assets/text-wrap-AZErifCu.js"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2"},{"revision":null,"url":"assets/globe-CQ8NAYvi.js"},{"revision":null,"url":"assets/utils-E0yyGxXt.js"},{"revision":null,"url":"assets/markdown-renderer-C7ZoGWso.js"},{"revision":null,"url":"assets/rolldown-runtime-FhOqtrmT.js"},{"revision":null,"url":"assets/use-monaco-theme-qx6SfVRk.js"},{"revision":null,"url":"assets/input-B78ol0hV.js"},{"revision":null,"url":"assets/code-DiNmA3eR.js"},{"revision":null,"url":"assets/refresh-cw-CRD2qr4U.js"},{"revision":null,"url":"assets/search-D90WJ5fo.js"},{"revision":null,"url":"assets/vendor-ui-UXCWAcmi.js"},{"revision":null,"url":"assets/diff-viewer-DmSkyBaT.js"},{"revision":null,"url":"assets/file-exclamation-point-B__2Hrd6.js"},{"revision":null,"url":"assets/KaTeX_Math-Italic-t53AETM-.woff2"},{"revision":null,"url":"assets/data-grid-types-C29KDkZJ.js"},{"revision":null,"url":"assets/katex-DUj5OG1J.js"},{"revision":null,"url":"assets/index-DwvSM9vu.css"},{"revision":null,"url":"assets/github-dark-dimmed.min-BrpRStFV.css"},{"revision":null,"url":"assets/notification-store-C3tg-ZXm.js"},{"revision":null,"url":"assets/number-overlay-editor-DS-qf63L.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2"},{"revision":null,"url":"assets/KaTeX_Script-Regular-D3wIWfF6.woff2"},{"revision":null,"url":"assets/arrow-up-Rcw6_KKu.js"},{"revision":null,"url":"assets/ai-settings-section-BH2UOQH-.js"},{"revision":null,"url":"assets/database-Dc8mr-dP.js"},{"revision":null,"url":"assets/eye-off-BacF7RVS.js"},{"revision":null,"url":"assets/KaTeX_Main-Bold-Cx986IdX.woff2"},{"revision":null,"url":"assets/KaTeX_Size2-Regular-Dy4dx90m.woff2"},{"revision":null,"url":"assets/vendor-xterm-t3d5xZdz.js"},{"revision":null,"url":"assets/api-client-DiZgVOok.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2"},{"revision":null,"url":"assets/KaTeX_Size1-Regular-mCD8mA8B.woff2"},{"revision":null,"url":"assets/x-DfF6D5Js.js"},{"revision":null,"url":"assets/treemap-KZPCXAKY-DChODgHt.js"},{"revision":null,"url":"assets/createLucideIcon-BjHrJDVb.js"},{"revision":null,"url":"assets/data-grid-overlay-editor-CmduzuPM.js"},{"revision":null,"url":"assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2"},{"revision":null,"url":"assets/port-forwarding-tab-BMb8neu0.js"},{"revision":null,"url":"assets/gitGraph-HDMCJU4V-2a0r4GHr.js"},{"revision":null,"url":"assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2"},{"revision":null,"url":"assets/sparkles-KCOEy7QI.js"},{"revision":null,"url":"assets/architecture-PBZL5I3N-DLKD1Xjj.js"},{"revision":null,"url":"assets/index-CP6EIXkh.js"},{"revision":null,"url":"assets/csv-parser-D8VHWVA6.js"},{"revision":null,"url":"assets/conflict-editor-No7IVPRN.js"},{"revision":null,"url":"assets/csv-preview-DgArUJhd.js"},{"revision":null,"url":"assets/tab-store-DzftzxTL.js"},{"revision":null,"url":"assets/vendor-xterm-BrP-ENHg.css"},{"revision":null,"url":"assets/dist-PPUhQONj.js"},{"revision":null,"url":"assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2"},{"revision":null,"url":"assets/chat-tab-3GUmdAJN.js"},{"revision":"d0f94ce046cf8cf09605ee7664dac557","url":"monacoeditorwork/html.worker.bundle.js"},{"revision":"a424156a79b9c1b907db93aa3180585a","url":"monacoeditorwork/editor.worker.bundle.js"},{"revision":"b3a7f967560c9816492a1567b3f7f0dc","url":"monacoeditorwork/css.worker.bundle.js"},{"revision":"a5d8a1acfc29c2a4c882a54ffc93def3","url":"monacoeditorwork/json.worker.bundle.js"},{"revision":"948e060affb598c339be40d69e1f6f9c","url":"monacoeditorwork/ts.worker.bundle.js"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"26dccd02a2ef7522892015154f5e3680","url":"manifest.webmanifest"}]),self.addEventListener(`push`,e=>{e.waitUntil(self.clients.matchAll({type:`window`,includeUncontrolled:!0}).then(t=>{if(t.some(e=>e.visibilityState===`visible`))return;let n=e.data?.json()??{title:`PPM`,body:`Chat completed`};return self.registration.showNotification(n.title,{body:n.body,icon:`/icon-192.svg`,badge:`/icon-192.svg`,tag:`ppm-chat-done`,silent:!1,data:{url:self.location.origin}})}))}),self.addEventListener(`notificationclick`,e=>{e.notification.close(),e.waitUntil(self.clients.matchAll({type:`window`,includeUncontrolled:!0}).then(t=>{for(let e of t)if(e.url.includes(self.location.origin)&&`focus`in e)return e.focus();return self.clients.openWindow(e.notification.data?.url||`/`)}))});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
2
|
import { resourceMonitor, type ResourceSnapshot } from "../../services/resource-monitor.service.ts";
|
|
3
|
-
import { ok } from "../../types/api.ts";
|
|
3
|
+
import { ok, err } from "../../types/api.ts";
|
|
4
4
|
|
|
5
5
|
export const resourceRoutes = new Hono();
|
|
6
6
|
|
|
@@ -17,6 +17,33 @@ resourceRoutes.get("/resources/history", (c) => {
|
|
|
17
17
|
return c.json(ok(resourceMonitor.getHistory()));
|
|
18
18
|
});
|
|
19
19
|
|
|
20
|
+
/** POST /resources/kill/:pid — send SIGTERM to a process in PPM's tree */
|
|
21
|
+
resourceRoutes.post("/resources/kill/:pid", async (c) => {
|
|
22
|
+
const pid = parseInt(c.req.param("pid"), 10);
|
|
23
|
+
if (isNaN(pid) || pid <= 0) {
|
|
24
|
+
return c.json(err("Invalid PID"), 400);
|
|
25
|
+
}
|
|
26
|
+
// Safety: only allow killing processes in PPM's own tree
|
|
27
|
+
const snapshot = resourceMonitor.getLatest();
|
|
28
|
+
if (!snapshot) {
|
|
29
|
+
return c.json(err("No resource data available"), 400);
|
|
30
|
+
}
|
|
31
|
+
const allPids = snapshot.groups.flatMap((g) => g.processes.map((p) => p.pid));
|
|
32
|
+
if (!allPids.includes(pid)) {
|
|
33
|
+
return c.json(err("PID not in PPM process tree"), 403);
|
|
34
|
+
}
|
|
35
|
+
// Don't allow killing the server itself
|
|
36
|
+
if (pid === process.pid) {
|
|
37
|
+
return c.json(err("Cannot kill PPM server process"), 403);
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
process.kill(pid, "SIGTERM");
|
|
41
|
+
return c.json(ok({ pid, signal: "SIGTERM" }));
|
|
42
|
+
} catch (e: any) {
|
|
43
|
+
return c.json(err(`Failed to kill PID ${pid}: ${e.message}`), 500);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
20
47
|
/** GET /resources/stream — SSE stream of snapshots every 3s */
|
|
21
48
|
resourceRoutes.get("/resources/stream", (c) => {
|
|
22
49
|
if (sseClientCount >= MAX_SSE_CLIENTS) {
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { memo, useMemo } from "react";
|
|
2
|
+
import { ChevronRight, ChevronDown, HelpCircle, X, ArrowUp, ArrowDown } from "lucide-react";
|
|
3
|
+
import type { ResourceGroup } from "@/hooks/use-resource-monitor";
|
|
4
|
+
import { SparklineCanvas } from "./sparkline-canvas";
|
|
5
|
+
import { cn } from "@/lib/utils";
|
|
6
|
+
|
|
7
|
+
export type SortKey = "cpu" | "ram" | null;
|
|
8
|
+
export type SortDir = "asc" | "desc";
|
|
9
|
+
|
|
10
|
+
function cpuColor(cpu: number) {
|
|
11
|
+
if (cpu > 80) return "text-red-500";
|
|
12
|
+
if (cpu > 50) return "text-yellow-500";
|
|
13
|
+
return "text-green-500";
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function formatRam(mb: number) {
|
|
17
|
+
return mb < 1024 ? `${mb.toFixed(0)} MB` : `${(mb / 1024).toFixed(1)} GB`;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface GroupRowProps {
|
|
21
|
+
group: ResourceGroup;
|
|
22
|
+
Icon: React.ElementType;
|
|
23
|
+
isExpanded: boolean;
|
|
24
|
+
sparkData: number[];
|
|
25
|
+
isMobile: boolean;
|
|
26
|
+
sortKey: SortKey;
|
|
27
|
+
sortDir: SortDir;
|
|
28
|
+
onToggle: () => void;
|
|
29
|
+
onKill: (pid: number) => void;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const GroupRow = memo(function GroupRow({
|
|
33
|
+
group, Icon, isExpanded, sparkData, isMobile, sortKey, sortDir, onToggle, onKill,
|
|
34
|
+
}: GroupRowProps) {
|
|
35
|
+
const Chevron = isExpanded ? ChevronDown : ChevronRight;
|
|
36
|
+
|
|
37
|
+
const sortedProcesses = useMemo(() => {
|
|
38
|
+
if (!sortKey) return group.processes;
|
|
39
|
+
return [...group.processes].sort((a, b) => {
|
|
40
|
+
const av = sortKey === "cpu" ? a.cpu : a.ramMB;
|
|
41
|
+
const bv = sortKey === "cpu" ? b.cpu : b.ramMB;
|
|
42
|
+
return sortDir === "asc" ? av - bv : bv - av;
|
|
43
|
+
});
|
|
44
|
+
}, [group.processes, sortKey, sortDir]);
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<>
|
|
48
|
+
<tr
|
|
49
|
+
className="hover:bg-surface-hover cursor-pointer transition-colors"
|
|
50
|
+
onClick={onToggle}
|
|
51
|
+
>
|
|
52
|
+
<td className="py-1.5 px-3">
|
|
53
|
+
<div className="flex items-center gap-1.5">
|
|
54
|
+
<Chevron className="size-3 text-text-subtle shrink-0" />
|
|
55
|
+
<Icon className="size-3.5 text-text-secondary shrink-0" />
|
|
56
|
+
<span className="truncate">{group.label}</span>
|
|
57
|
+
<span className="text-text-subtle">({group.processes.length})</span>
|
|
58
|
+
</div>
|
|
59
|
+
</td>
|
|
60
|
+
<td className={cn("text-right py-1.5 px-2", cpuColor(group.cpu))}>
|
|
61
|
+
{group.cpu.toFixed(1)}%
|
|
62
|
+
</td>
|
|
63
|
+
<td className="text-right py-1.5 px-2 text-text-secondary">
|
|
64
|
+
{formatRam(group.ramMB)}
|
|
65
|
+
</td>
|
|
66
|
+
{!isMobile && (
|
|
67
|
+
<td className="py-1.5 px-2">
|
|
68
|
+
{sparkData.length > 1 && (
|
|
69
|
+
<SparklineCanvas data={sparkData} width={120} height={20} />
|
|
70
|
+
)}
|
|
71
|
+
</td>
|
|
72
|
+
)}
|
|
73
|
+
</tr>
|
|
74
|
+
{isExpanded && sortedProcesses.map((proc) => (
|
|
75
|
+
<tr key={proc.pid} className="text-text-subtle group/proc hover:bg-surface-hover transition-colors">
|
|
76
|
+
<td className="py-1 px-3 pl-10">
|
|
77
|
+
<div className="flex items-start gap-1.5">
|
|
78
|
+
<span className="text-text-subtle shrink-0">{proc.pid}</span>
|
|
79
|
+
<span className="break-all text-text-secondary" title={proc.command}>
|
|
80
|
+
{proc.command}
|
|
81
|
+
</span>
|
|
82
|
+
</div>
|
|
83
|
+
</td>
|
|
84
|
+
<td className="text-right py-1 px-2 align-top">{proc.cpu.toFixed(1)}%</td>
|
|
85
|
+
<td className="text-right py-1 px-2 align-top">{formatRam(proc.ramMB)}</td>
|
|
86
|
+
{!isMobile && (
|
|
87
|
+
<td className="align-top py-1 px-2">
|
|
88
|
+
<button
|
|
89
|
+
onClick={(e) => { e.stopPropagation(); onKill(proc.pid); }}
|
|
90
|
+
className="opacity-0 group-hover/proc:opacity-100 p-0.5 rounded hover:bg-red-500/20 hover:text-red-500 transition-all"
|
|
91
|
+
title={`End process ${proc.pid}`}
|
|
92
|
+
>
|
|
93
|
+
<X className="size-3" />
|
|
94
|
+
</button>
|
|
95
|
+
</td>
|
|
96
|
+
)}
|
|
97
|
+
</tr>
|
|
98
|
+
))}
|
|
99
|
+
</>
|
|
100
|
+
);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// ── Sortable column header ─────────────────────────────────────────────
|
|
104
|
+
|
|
105
|
+
export function SortableHeader({ label, field, activeKey, activeDir, onClick, className }: {
|
|
106
|
+
label: string;
|
|
107
|
+
field: "cpu" | "ram";
|
|
108
|
+
activeKey: SortKey;
|
|
109
|
+
activeDir: SortDir;
|
|
110
|
+
onClick: (field: "cpu" | "ram") => void;
|
|
111
|
+
className?: string;
|
|
112
|
+
}) {
|
|
113
|
+
const isActive = activeKey === field;
|
|
114
|
+
const Arrow = isActive ? (activeDir === "asc" ? ArrowUp : ArrowDown) : null;
|
|
115
|
+
|
|
116
|
+
return (
|
|
117
|
+
<th
|
|
118
|
+
className={cn(
|
|
119
|
+
"text-right py-1.5 px-2 font-medium cursor-pointer select-none hover:text-text-primary transition-colors",
|
|
120
|
+
isActive && "text-text-primary",
|
|
121
|
+
className,
|
|
122
|
+
)}
|
|
123
|
+
onClick={() => onClick(field)}
|
|
124
|
+
>
|
|
125
|
+
<div className="flex items-center justify-end gap-0.5">
|
|
126
|
+
<span>{label}</span>
|
|
127
|
+
{Arrow && <Arrow className="size-3" />}
|
|
128
|
+
</div>
|
|
129
|
+
</th>
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export { cpuColor, formatRam };
|
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
import { useState, useMemo, memo } from "react";
|
|
1
|
+
import { useState, useMemo, useCallback, memo } from "react";
|
|
2
2
|
import {
|
|
3
3
|
Server, Monitor, Bot, Hammer, HelpCircle,
|
|
4
|
-
|
|
4
|
+
Wifi, WifiOff,
|
|
5
5
|
} from "lucide-react";
|
|
6
6
|
import { useResourceMonitor, type ResourceGroup } from "@/hooks/use-resource-monitor";
|
|
7
|
-
import { SparklineCanvas } from "./sparkline-canvas";
|
|
8
7
|
import { useIsMobile } from "@/hooks/use-is-mobile";
|
|
8
|
+
import { api } from "@/lib/api-client";
|
|
9
|
+
import { toast } from "sonner";
|
|
9
10
|
import { cn } from "@/lib/utils";
|
|
11
|
+
import {
|
|
12
|
+
GroupRow, SortableHeader, cpuColor, formatRam,
|
|
13
|
+
type SortKey, type SortDir,
|
|
14
|
+
} from "./system-monitor-group-row";
|
|
10
15
|
|
|
11
16
|
const GROUP_ICONS: Record<ResourceGroup["type"], React.ElementType> = {
|
|
12
17
|
server: Server,
|
|
@@ -16,24 +21,33 @@ const GROUP_ICONS: Record<ResourceGroup["type"], React.ElementType> = {
|
|
|
16
21
|
unknown: HelpCircle,
|
|
17
22
|
};
|
|
18
23
|
|
|
19
|
-
const SPARKLINE_POINTS = 200;
|
|
24
|
+
const SPARKLINE_POINTS = 200;
|
|
20
25
|
|
|
21
|
-
function
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
return "
|
|
26
|
+
function toggleSort(
|
|
27
|
+
current: SortKey, dir: SortDir, clicked: "cpu" | "ram",
|
|
28
|
+
): [SortKey, SortDir] {
|
|
29
|
+
if (current !== clicked) return [clicked, "desc"];
|
|
30
|
+
if (dir === "desc") return [clicked, "asc"];
|
|
31
|
+
return [null, "desc"]; // third click resets
|
|
25
32
|
}
|
|
26
33
|
|
|
27
|
-
function
|
|
28
|
-
|
|
34
|
+
function sortGroups(groups: ResourceGroup[], key: SortKey, dir: SortDir) {
|
|
35
|
+
if (!key) return groups;
|
|
36
|
+
const sorted = [...groups].sort((a, b) => {
|
|
37
|
+
const av = key === "cpu" ? a.cpu : a.ramMB;
|
|
38
|
+
const bv = key === "cpu" ? b.cpu : b.ramMB;
|
|
39
|
+
return dir === "asc" ? av - bv : bv - av;
|
|
40
|
+
});
|
|
41
|
+
return sorted;
|
|
29
42
|
}
|
|
30
43
|
|
|
31
44
|
export const SystemMonitorTab = memo(function SystemMonitorTab() {
|
|
32
45
|
const { latest, history, isConnected } = useResourceMonitor();
|
|
33
46
|
const [expanded, setExpanded] = useState<Set<string>>(() => new Set(["server"]));
|
|
47
|
+
const [sortKey, setSortKey] = useState<SortKey>(null);
|
|
48
|
+
const [sortDir, setSortDir] = useState<SortDir>("desc");
|
|
34
49
|
const isMobile = useIsMobile();
|
|
35
50
|
|
|
36
|
-
// Extract per-group CPU history for sparklines
|
|
37
51
|
const groupSparklines = useMemo(() => {
|
|
38
52
|
const map = new Map<string, number[]>();
|
|
39
53
|
const recentHistory = history.slice(-SPARKLINE_POINTS);
|
|
@@ -48,6 +62,20 @@ export const SystemMonitorTab = memo(function SystemMonitorTab() {
|
|
|
48
62
|
return map;
|
|
49
63
|
}, [history]);
|
|
50
64
|
|
|
65
|
+
const sortedGroups = useMemo(() => {
|
|
66
|
+
if (!latest) return [];
|
|
67
|
+
return sortGroups(latest.groups, sortKey, sortDir);
|
|
68
|
+
}, [latest, sortKey, sortDir]);
|
|
69
|
+
|
|
70
|
+
const killProcess = useCallback(async (pid: number) => {
|
|
71
|
+
try {
|
|
72
|
+
await api.post(`/api/system/resources/kill/${pid}`);
|
|
73
|
+
toast.success(`Sent SIGTERM to PID ${pid}`);
|
|
74
|
+
} catch (e: any) {
|
|
75
|
+
toast.error(e.message || `Failed to kill PID ${pid}`);
|
|
76
|
+
}
|
|
77
|
+
}, []);
|
|
78
|
+
|
|
51
79
|
const toggle = (key: string) => {
|
|
52
80
|
setExpanded((prev) => {
|
|
53
81
|
const next = new Set(prev);
|
|
@@ -57,6 +85,12 @@ export const SystemMonitorTab = memo(function SystemMonitorTab() {
|
|
|
57
85
|
});
|
|
58
86
|
};
|
|
59
87
|
|
|
88
|
+
const handleSort = (clicked: "cpu" | "ram") => {
|
|
89
|
+
const [newKey, newDir] = toggleSort(sortKey, sortDir, clicked);
|
|
90
|
+
setSortKey(newKey);
|
|
91
|
+
setSortDir(newDir);
|
|
92
|
+
};
|
|
93
|
+
|
|
60
94
|
if (!latest) {
|
|
61
95
|
return (
|
|
62
96
|
<div className="flex items-center justify-center h-full text-text-subtle text-sm">
|
|
@@ -86,15 +120,29 @@ export const SystemMonitorTab = memo(function SystemMonitorTab() {
|
|
|
86
120
|
<thead>
|
|
87
121
|
<tr className="text-text-subtle border-b border-border">
|
|
88
122
|
<th className="text-left py-1.5 px-3 font-medium">Process</th>
|
|
89
|
-
<
|
|
90
|
-
|
|
123
|
+
<SortableHeader
|
|
124
|
+
label="CPU"
|
|
125
|
+
field="cpu"
|
|
126
|
+
activeKey={sortKey}
|
|
127
|
+
activeDir={sortDir}
|
|
128
|
+
onClick={handleSort}
|
|
129
|
+
className="w-16"
|
|
130
|
+
/>
|
|
131
|
+
<SortableHeader
|
|
132
|
+
label="RAM"
|
|
133
|
+
field="ram"
|
|
134
|
+
activeKey={sortKey}
|
|
135
|
+
activeDir={sortDir}
|
|
136
|
+
onClick={handleSort}
|
|
137
|
+
className="w-20"
|
|
138
|
+
/>
|
|
91
139
|
{!isMobile && (
|
|
92
140
|
<th className="py-1.5 px-2 font-medium w-[130px]">Trend</th>
|
|
93
141
|
)}
|
|
94
142
|
</tr>
|
|
95
143
|
</thead>
|
|
96
144
|
<tbody>
|
|
97
|
-
{
|
|
145
|
+
{sortedGroups.map((group) => {
|
|
98
146
|
const key = `${group.type}:${group.label}`;
|
|
99
147
|
const Icon = GROUP_ICONS[group.type] ?? HelpCircle;
|
|
100
148
|
const isExpanded = expanded.has(key);
|
|
@@ -108,7 +156,10 @@ export const SystemMonitorTab = memo(function SystemMonitorTab() {
|
|
|
108
156
|
isExpanded={isExpanded}
|
|
109
157
|
sparkData={sparkData}
|
|
110
158
|
isMobile={isMobile}
|
|
159
|
+
sortKey={sortKey}
|
|
160
|
+
sortDir={sortDir}
|
|
111
161
|
onToggle={() => toggle(key)}
|
|
162
|
+
onKill={killProcess}
|
|
112
163
|
/>
|
|
113
164
|
);
|
|
114
165
|
})}
|
|
@@ -133,62 +184,3 @@ export const SystemMonitorTab = memo(function SystemMonitorTab() {
|
|
|
133
184
|
</div>
|
|
134
185
|
);
|
|
135
186
|
});
|
|
136
|
-
|
|
137
|
-
// ── Group row with collapsible children ────────────────────────────────
|
|
138
|
-
|
|
139
|
-
interface GroupRowProps {
|
|
140
|
-
group: ResourceGroup;
|
|
141
|
-
Icon: React.ElementType;
|
|
142
|
-
isExpanded: boolean;
|
|
143
|
-
sparkData: number[];
|
|
144
|
-
isMobile: boolean;
|
|
145
|
-
onToggle: () => void;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
const GroupRow = memo(function GroupRow({
|
|
149
|
-
group, Icon, isExpanded, sparkData, isMobile, onToggle,
|
|
150
|
-
}: GroupRowProps) {
|
|
151
|
-
const Chevron = isExpanded ? ChevronDown : ChevronRight;
|
|
152
|
-
|
|
153
|
-
return (
|
|
154
|
-
<>
|
|
155
|
-
<tr
|
|
156
|
-
className="hover:bg-surface-hover cursor-pointer transition-colors"
|
|
157
|
-
onClick={onToggle}
|
|
158
|
-
>
|
|
159
|
-
<td className="py-1.5 px-3">
|
|
160
|
-
<div className="flex items-center gap-1.5">
|
|
161
|
-
<Chevron className="size-3 text-text-subtle shrink-0" />
|
|
162
|
-
<Icon className="size-3.5 text-text-secondary shrink-0" />
|
|
163
|
-
<span className="truncate">{group.label}</span>
|
|
164
|
-
<span className="text-text-subtle">({group.processes.length})</span>
|
|
165
|
-
</div>
|
|
166
|
-
</td>
|
|
167
|
-
<td className={cn("text-right py-1.5 px-2", cpuColor(group.cpu))}>
|
|
168
|
-
{group.cpu.toFixed(1)}%
|
|
169
|
-
</td>
|
|
170
|
-
<td className="text-right py-1.5 px-2 text-text-secondary">
|
|
171
|
-
{formatRam(group.ramMB)}
|
|
172
|
-
</td>
|
|
173
|
-
{!isMobile && (
|
|
174
|
-
<td className="py-1.5 px-2">
|
|
175
|
-
{sparkData.length > 1 && (
|
|
176
|
-
<SparklineCanvas data={sparkData} width={120} height={20} />
|
|
177
|
-
)}
|
|
178
|
-
</td>
|
|
179
|
-
)}
|
|
180
|
-
</tr>
|
|
181
|
-
{isExpanded && group.processes.map((proc) => (
|
|
182
|
-
<tr key={proc.pid} className="text-text-subtle">
|
|
183
|
-
<td className="py-1 px-3 pl-10">
|
|
184
|
-
<span className="text-text-subtle mr-1.5">{proc.pid}</span>
|
|
185
|
-
<span className="truncate">{proc.command}</span>
|
|
186
|
-
</td>
|
|
187
|
-
<td className="text-right py-1 px-2">{proc.cpu.toFixed(1)}%</td>
|
|
188
|
-
<td className="text-right py-1 px-2">{formatRam(proc.ramMB)}</td>
|
|
189
|
-
{!isMobile && <td />}
|
|
190
|
-
</tr>
|
|
191
|
-
))}
|
|
192
|
-
</>
|
|
193
|
-
);
|
|
194
|
-
});
|
|
@@ -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{S as r,a as i,c as a,d as o,f as s,g as c,h as l,l as u,m as d,n as f,o as p,p as m,r as h,s as g,u as _}from"./vendor-ui-UXCWAcmi.js";import{t as v}from"./createLucideIcon-BjHrJDVb.js";import{t as y}from"./chevron-down-BMo4cBth.js";import{n as b}from"./globe-CQ8NAYvi.js";import{t as x}from"./input-By_lZeCs.js";import{n as S}from"./x-ClICkcxR.js";import{t as C}from"./refresh-cw-CRD2qr4U.js";import{i as w,t as T}from"./api-client-BK4NPNoY.js";import{n as E}from"./utils-CSCvNZxE.js";import{a as D,h as O}from"./api-settings-BJTjIG4U.js";var k=v(`bell-off`,[[`path`,{d:`M10.268 21a2 2 0 0 0 3.464 0`,key:`vwvbt9`}],[`path`,{d:`M17 17H4a1 1 0 0 1-.74-1.673C4.59 13.956 6 12.499 6 8a6 6 0 0 1 .258-1.742`,key:`178tsu`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}],[`path`,{d:`M8.668 3.01A6 6 0 0 1 18 8c0 2.687.77 4.653 1.707 6.05`,key:`1hqiys`}]]),A=v(`bug`,[[`path`,{d:`M12 20v-9`,key:`1qisl0`}],[`path`,{d:`M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z`,key:`uouzyp`}],[`path`,{d:`M14.12 3.88 16 2`,key:`qol33r`}],[`path`,{d:`M21 21a4 4 0 0 0-3.81-4`,key:`1b0z45`}],[`path`,{d:`M21 5a4 4 0 0 1-3.55 3.97`,key:`5cxbf6`}],[`path`,{d:`M22 13h-4`,key:`1jl80f`}],[`path`,{d:`M3 21a4 4 0 0 1 3.81-4`,key:`1fjd4g`}],[`path`,{d:`M3 5a4 4 0 0 0 3.55 3.97`,key:`1d7oge`}],[`path`,{d:`M6 13H2`,key:`82j7cp`}],[`path`,{d:`m8 2 1.88 1.88`,key:`fmnt4t`}],[`path`,{d:`M9 7.13V6a3 3 0 1 1 6 0v1.13`,key:`1vgav8`}]]),j=v(`chevron-up`,[[`path`,{d:`m18 15-6-6-6 6`,key:`153udz`}]]),M=v(`lock`,[[`rect`,{width:`18`,height:`11`,x:`3`,y:`11`,rx:`2`,ry:`2`,key:`1w4ew1`}],[`path`,{d:`M7 11V7a5 5 0 0 1 10 0v4`,key:`fwvmzm`}]]),N=v(`pencil`,[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]),P=e(n(),1),F=t();function I({className:e,...t}){return(0,F.jsx)(r,{"data-slot":`label`,className:E(`flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50`,e),...t})}var L=P.forwardRef(({className:e,...t},n)=>(0,F.jsx)(f,{className:E(`peer inline-flex h-5 w-9 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input`,e),...t,ref:n,children:(0,F.jsx)(h,{className:E(`pointer-events-none block h-4 w-4 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0`)})}));L.displayName=f.displayName;function R({...e}){return(0,F.jsx)(o,{"data-slot":`select`,...e})}function z({...e}){return(0,F.jsx)(l,{"data-slot":`select-value`,...e})}function B({className:e,size:t=`default`,children:n,...r}){return(0,F.jsxs)(d,{"data-slot":`select-trigger`,"data-size":t,className:E(`flex w-fit items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground`,e),...r,children:[n,(0,F.jsx)(p,{asChild:!0,children:(0,F.jsx)(y,{className:`size-4 opacity-50`})})]})}function V({className:e,children:t,position:n=`item-aligned`,align:r=`center`,...a}){return(0,F.jsx)(_,{children:(0,F.jsxs)(i,{"data-slot":`select-content`,className:E(`relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95`,n===`popper`&&`data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1`,e),position:n,align:r,...a,children:[(0,F.jsx)(U,{}),(0,F.jsx)(c,{className:E(`p-1`,n===`popper`&&`h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1`),children:t}),(0,F.jsx)(W,{})]})})}function H({className:e,children:t,...n}){return(0,F.jsxs)(g,{"data-slot":`select-item`,className:E(`relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2`,e),...n,children:[(0,F.jsx)(`span`,{"data-slot":`select-item-indicator`,className:`absolute right-2 flex size-3.5 items-center justify-center`,children:(0,F.jsx)(a,{children:(0,F.jsx)(b,{className:`size-4`})})}),(0,F.jsx)(u,{children:t})]})}function U({className:e,...t}){return(0,F.jsx)(m,{"data-slot":`select-scroll-up-button`,className:E(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,F.jsx)(j,{className:`size-4`})})}function W({className:e,...t}){return(0,F.jsx)(s,{"data-slot":`select-scroll-down-button`,className:E(`flex cursor-default items-center justify-center py-1`,e),...t,children:(0,F.jsx)(y,{className:`size-4`})})}var G={claude:`C`,cursor:`▶`,codex:`◆`,gemini:`G`};function K({value:e,onChange:t,projectName:n}){let[r,i]=(0,P.useState)([]),[a,o]=(0,P.useState)(!1),s=(0,P.useRef)(null),c=(0,P.useRef)(0);(0,P.useEffect)(()=>{n&&T.get(`${w(n)}/chat/providers`).then(i).catch(()=>{})},[n]),(0,P.useEffect)(()=>{if(!a)return;let e=e=>{s.current&&!s.current.contains(e.target)&&o(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[a]),(0,P.useEffect)(()=>{a&&(c.current=Math.max(0,r.findIndex(t=>t.id===e)))},[a,e,r]);let l=(0,P.useCallback)(e=>{if(e.key===`Escape`){o(!1);return}if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;c.current=(c.current+t+r.length)%r.length,(s.current?.querySelector(`[data-idx="${c.current}"]`))?.focus()}if(e.key===`Enter`){e.preventDefault();let n=r[c.current];n&&(t(n.id),o(!1))}},[t,r]);if(r.length<=1)return null;let u=r.find(t=>t.id===e),d=G[e]||`?`;return(0,F.jsxs)(`div`,{className:`relative`,children:[(0,F.jsxs)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),o(e=>!e)},className:`inline-flex items-center gap-1 px-2 py-1 rounded-md text-[11px] text-text-subtle hover:text-text-primary hover:bg-surface-elevated transition-colors border border-transparent hover:border-border`,"aria-label":`AI Provider: ${u?.name??e}`,children:[(0,F.jsx)(`span`,{className:`inline-flex h-3.5 w-3.5 items-center justify-center rounded text-[9px] font-bold bg-surface-elevated shrink-0`,children:d}),(0,F.jsx)(`span`,{className:`max-w-[80px] truncate capitalize`,children:u?.name??e})]}),a&&(0,F.jsxs)(`div`,{ref:s,role:`listbox`,"aria-label":`AI Providers`,onKeyDown:l,onMouseDown:e=>e.stopPropagation(),onClick:e=>e.stopPropagation(),className:`absolute bottom-full left-0 mb-1 z-50 w-56 rounded-lg border border-border bg-surface shadow-lg`,children:[(0,F.jsx)(`div`,{className:`px-3 py-2 border-b border-border`,children:(0,F.jsx)(`span`,{className:`text-xs font-medium text-text-secondary`,children:`Provider`})}),(0,F.jsx)(`div`,{className:`py-1`,children:r.map((n,r)=>{let i=G[n.id]||`?`,a=n.id===e;return(0,F.jsxs)(`button`,{"data-idx":r,role:`option`,"aria-selected":a,tabIndex:0,onClick:()=>{t(n.id),o(!1)},className:`w-full flex items-center gap-3 px-3 py-2 text-left transition-colors hover:bg-surface-elevated focus:bg-surface-elevated focus:outline-none ${a?`bg-surface-elevated`:``}`,children:[(0,F.jsx)(`span`,{className:`inline-flex h-5 w-5 items-center justify-center rounded text-[11px] font-bold bg-surface-elevated text-text-subtle shrink-0`,children:i}),(0,F.jsx)(`span`,{className:`flex-1 text-sm font-medium text-text-primary capitalize`,children:n.name}),a&&(0,F.jsx)(b,{className:`size-4 shrink-0 text-primary`})]},n.id)})})]})]})}function q({providerId:e}){return(0,F.jsx)(`span`,{className:`inline-flex h-4 w-4 items-center justify-center rounded text-[10px] font-bold bg-surface-elevated text-text-subtle shrink-0`,title:e,children:G[e]||`?`})}var J=[{value:`low`,label:`Low`},{value:`medium`,label:`Medium`},{value:`high`,label:`High`}],Y=[{value:`bypassPermissions`,label:`Bypass permissions (default)`},{value:`default`,label:`Ask before edits`},{value:`acceptEdits`,label:`Edit automatically`},{value:`plan`,label:`Plan mode`}],X={claude:`Claude`,cursor:`Cursor`,codex:`Codex`,gemini:`Gemini`};function Z({compact:e}={}){let[t,n]=(0,P.useState)(null),[r,i]=(0,P.useState)(``),[a,o]=(0,P.useState)([]),[s,c]=(0,P.useState)(!1),[l,u]=(0,P.useState)(!1),[d,f]=(0,P.useState)(null),[p,m]=(0,P.useState)(0);(0,P.useEffect)(()=>{D().then(e=>{n(e),i(e.default_provider??`claude`)}).catch(e=>f(e.message))},[]),(0,P.useEffect)(()=>{r&&(c(!0),T.get(`/api/settings/ai/providers/${r}/models`).then(o).catch(()=>o([])).finally(()=>c(!1)))},[r]);let h=t?Object.keys(t.providers).filter(e=>e!==`mock`).map(e=>({id:e,name:X[e]??e})):[],g=t?.providers[r],_=g?.type===`agent-sdk`||!g?.type&&r===`claude`,v=async(e,i)=>{if(t){u(!0),f(null);try{n(await O({providers:{[r]:{[e]:i}}})),m(e=>e+1)}catch(e){f(e.message)}finally{u(!1)}}},y=e?`text-[11px]`:`text-sm`,b=e?`text-xs`:`text-sm`,S=e?`space-y-2`:`space-y-4`,C=e?`space-y-1.5`:`space-y-3`,w=e?`space-y-1`:`space-y-1.5`;if(!t)return(0,F.jsxs)(`div`,{className:C,children:[(0,F.jsx)(`h3`,{className:`${b} font-medium text-text-secondary`,children:`AI Settings`}),(0,F.jsx)(`p`,{className:`${y} text-text-subtle`,children:d?`Error: ${d}`:`Loading...`})]});let E=_?a:[{value:`__default__`,label:`Auto (default)`},...a];return(0,F.jsxs)(`div`,{className:S,children:[(0,F.jsx)(`h3`,{className:`${b} font-medium text-text-secondary`,children:`AI Settings`}),h.length>1&&(0,F.jsx)(`div`,{className:`flex gap-0.5 border-b border-border/50 -mx-1 px-1`,children:h.map(e=>(0,F.jsxs)(`button`,{onClick:()=>i(e.id),className:`flex items-center gap-1 px-2 py-1 text-[11px] rounded-t transition-colors ${r===e.id?`text-primary border-b-2 border-primary font-medium`:`text-text-subtle hover:text-text-secondary`}`,children:[(0,F.jsx)(q,{providerId:e.id}),(0,F.jsx)(`span`,{className:`capitalize`,children:e.name})]},e.id))}),(0,F.jsxs)(`div`,{className:C,children:[a.length>0&&(0,F.jsxs)(`div`,{className:w,children:[(0,F.jsx)(I,{htmlFor:`ai-model`,className:e?y:void 0,children:`Model`}),(0,F.jsxs)(R,{value:_?g?.model??a[0]?.value:g?.model||`__default__`,onValueChange:e=>v(`model`,e===`__default__`?void 0:e),disabled:s,children:[(0,F.jsx)(B,{id:`ai-model`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,F.jsx)(z,{placeholder:s?`Loading models...`:`Select model`})}),(0,F.jsx)(V,{className:`max-h-[300px]`,children:E.map(e=>(0,F.jsx)(H,{value:e.value,children:e.label},e.value))})]})]}),_&&(0,F.jsxs)(F.Fragment,{children:[(0,F.jsxs)(`div`,{className:w,children:[(0,F.jsx)(I,{htmlFor:`ai-base-url`,className:e?y:void 0,children:`Base URL`}),(0,F.jsx)(x,{id:`ai-base-url`,type:`url`,defaultValue:g?.base_url??``,placeholder:`https://api.anthropic.com (default)`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{v(`base_url`,e.target.value.trim()||void 0)}},`baseurl-${r}-${p}`)]}),(0,F.jsxs)(`div`,{className:w,children:[(0,F.jsx)(I,{htmlFor:`ai-api-key`,className:e?y:void 0,children:`API Key / Token`}),(0,F.jsx)(x,{id:`ai-api-key`,type:`password`,defaultValue:g?.api_key??``,placeholder:`sk-ant-... (optional, overrides accounts)`,className:e?`h-7 text-[11px] font-mono`:`font-mono`,onBlur:e=>{let t=e.target.value.trim();t.startsWith(`••••`)||v(`api_key`,t||void 0)}},`apikey-${r}-${p}`),(0,F.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Direct API key or OAuth token. Leave empty to use connected accounts.`})]}),(0,F.jsxs)(`div`,{className:w,children:[(0,F.jsx)(I,{htmlFor:`ai-effort`,className:e?y:void 0,children:`Effort`}),(0,F.jsxs)(R,{value:g?.effort??`high`,onValueChange:e=>v(`effort`,e),children:[(0,F.jsx)(B,{id:`ai-effort`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,F.jsx)(z,{})}),(0,F.jsx)(V,{children:J.map(e=>(0,F.jsx)(H,{value:e.value,children:e.label},e.value))})]})]}),(0,F.jsxs)(`div`,{className:w,children:[(0,F.jsx)(I,{htmlFor:`ai-max-turns`,className:e?y:void 0,children:`Max Turns (1-500)`}),(0,F.jsx)(x,{id:`ai-max-turns`,type:`number`,min:1,max:500,defaultValue:g?.max_turns??100,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value);isNaN(t)||v(`max_turns`,t)}},`turns-${r}-${p}`)]}),(0,F.jsxs)(`div`,{className:w,children:[(0,F.jsx)(I,{htmlFor:`ai-budget`,className:e?y:void 0,children:`Max Budget (USD)`}),(0,F.jsx)(x,{id:`ai-budget`,type:`number`,step:.1,min:.01,max:50,defaultValue:g?.max_budget_usd??``,placeholder:`No limit`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseFloat(e.target.value);v(`max_budget_usd`,isNaN(t)?void 0:t)}},`budget-${r}-${p}`)]}),(0,F.jsxs)(`div`,{className:w,children:[(0,F.jsx)(I,{htmlFor:`ai-thinking`,className:e?y:void 0,children:`Thinking Budget (tokens)`}),(0,F.jsx)(x,{id:`ai-thinking`,type:`number`,min:0,defaultValue:g?.thinking_budget_tokens??``,placeholder:`Disabled`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value);v(`thinking_budget_tokens`,isNaN(t)?void 0:t)}},`thinking-${r}-${p}`)]}),(0,F.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,F.jsxs)(`div`,{children:[(0,F.jsx)(I,{htmlFor:`ai-agent-teams`,className:e?y:void 0,children:`Agent Teams`}),(0,F.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Experimental. Enables multi-agent collaboration with shared tasks and messaging. Uses ~7x more tokens.`})]}),(0,F.jsx)(L,{id:`ai-agent-teams`,checked:g?.agent_teams??!1,onCheckedChange:e=>v(`agent_teams`,e)})]}),g?.agent_teams&&(0,F.jsx)(Q,{compact:e})]}),(0,F.jsxs)(`div`,{className:w,children:[(0,F.jsx)(I,{htmlFor:`ai-permission-mode`,className:e?y:void 0,children:`Default Permission Mode`}),(0,F.jsxs)(R,{value:g?.permission_mode??`bypassPermissions`,onValueChange:e=>v(`permission_mode`,e),children:[(0,F.jsx)(B,{id:`ai-permission-mode`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,F.jsx)(z,{})}),(0,F.jsx)(V,{children:Y.map(e=>(0,F.jsx)(H,{value:e.value,children:e.label},e.value))})]})]}),(0,F.jsxs)(`div`,{className:w,children:[(0,F.jsx)(I,{htmlFor:`ai-system-prompt`,className:e?y:void 0,children:`Additional Instructions`}),(0,F.jsx)(`textarea`,{id:`ai-system-prompt`,rows:e?3:4,defaultValue:g?.system_prompt??``,placeholder:`Enter additional instructions for ${r}...`,className:`w-full rounded-md border border-input bg-background px-3 py-2 ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ${e?`text-[11px]`:`text-sm`}`,onBlur:e=>{v(`system_prompt`,e.target.value.trim()||void 0)}},`sysprompt-${r}-${p}`)]})]}),l&&(0,F.jsx)(`p`,{className:`text-xs text-text-subtle`,children:`Saving...`}),d&&(0,F.jsx)(`p`,{className:`text-xs text-red-500`,children:d})]})}function Q({compact:e}){let[t,n]=(0,P.useState)([]),[r,i]=(0,P.useState)(!1),[a,o]=(0,P.useState)(null),s=(0,P.useCallback)(async()=>{i(!0);try{n(await T.get(`/api/teams`)??[])}catch{}i(!1)},[]);(0,P.useEffect)(()=>{s()},[s]);let c=async e=>{try{await T.del(`/api/teams/${encodeURIComponent(e)}`),n(t=>t.filter(t=>t.name!==e)),o(null)}catch{}};return t.length===0&&!r?null:(0,F.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,F.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,F.jsxs)(I,{className:e?`text-[11px]`:void 0,children:[`Teams (`,t.length,`)`]}),(0,F.jsx)(`button`,{onClick:s,className:`text-text-subtle hover:text-foreground p-1`,"aria-label":`Refresh teams`,children:(0,F.jsx)(C,{className:`size-3 ${r?`animate-spin`:``}`})})]}),t.map(e=>(0,F.jsxs)(`div`,{className:`flex items-center justify-between p-2 rounded bg-surface-elevated text-xs`,children:[(0,F.jsxs)(`div`,{className:`min-w-0`,children:[(0,F.jsx)(`div`,{className:`font-medium truncate`,children:e.name}),e.description&&(0,F.jsx)(`div`,{className:`text-text-subtle truncate`,children:e.description}),(0,F.jsxs)(`div`,{className:`text-text-subtle`,children:[e.members?.length??e.memberCount??0,` members`,e.createdAt?` · ${new Date(e.createdAt).toLocaleDateString()}`:``]})]}),a===e.name?(0,F.jsxs)(`div`,{className:`flex gap-1 shrink-0 ml-2`,children:[(0,F.jsx)(`button`,{onClick:()=>c(e.name),className:`px-2 py-1 bg-red-600 text-white rounded text-[10px]`,children:`Delete`}),(0,F.jsx)(`button`,{onClick:()=>o(null),className:`px-2 py-1 bg-zinc-600 text-white rounded text-[10px]`,children:`Cancel`})]}):(0,F.jsx)(`button`,{onClick:()=>o(e.name),className:`shrink-0 text-text-subtle hover:text-red-500 p-1 ml-2`,"aria-label":`Delete team ${e.name}`,children:(0,F.jsx)(S,{className:`size-3.5`})})]},e.name))]})}export{V as a,z as c,N as d,M as f,k as h,R as i,L as l,A as m,q as n,H as o,j as p,K as r,B as s,Z as t,I as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{G as e}from"./vendor-mermaid-DkqjpqJK.js";export{e as createArchitectureServices};
|