@hienlh/ppm 0.17.52 → 0.17.54
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/CHANGELOG.md +17 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/{ai-resource-editor-D12van6q.js → ai-resource-editor-Bc1JjqQ2.js} +1 -1
- package/dist/web/assets/{audio-preview-C3YJNKjD.js → audio-preview-DkMX9OJj.js} +1 -1
- package/dist/web/assets/{chat-tab-B6Elb3uK.js → chat-tab-DbLlGvwV.js} +3 -3
- package/dist/web/assets/{code-editor-DM-ay_BF.js → code-editor-Dlzl3dNT.js} +2 -2
- package/dist/web/assets/{conflict-editor-4rb0oS2i.js → conflict-editor-DUHhHqpE.js} +1 -1
- package/dist/web/assets/{csv-preview-Bqfk0OeJ.js → csv-preview-CS_r0b6o.js} +1 -1
- package/dist/web/assets/{database-viewer-CrBOZBE4.js → database-viewer-CVYeQeUc.js} +1 -1
- package/dist/web/assets/{diff-viewer-BX02Fg5_.js → diff-viewer-CCrzns7w.js} +1 -1
- package/dist/web/assets/{docx-preview-rR_dLI4P.js → docx-preview-BLQB-hLE.js} +1 -1
- package/dist/web/assets/{extension-webview-D4rHB1h7.js → extension-webview-z-UAr801.js} +1 -1
- package/dist/web/assets/{git-log-panel-BryqAkz2.js → git-log-panel-cfFgTJhr.js} +1 -1
- package/dist/web/assets/{glide-data-grid-CcGfgB3d.js → glide-data-grid-DLI4he-v.js} +1 -1
- package/dist/web/assets/{group-chat-tab-rB8JuZIe.js → group-chat-tab-C2AhbwL2.js} +1 -1
- package/dist/web/assets/{image-preview-i-jTDsjR.js → image-preview-B8al9rrY.js} +1 -1
- package/dist/web/assets/index-CVJmlKhp.css +2 -0
- package/dist/web/assets/index-DlzNfQJh.js +50 -0
- package/dist/web/assets/{keybindings-store-C3dkxGGX.js → keybindings-store-DtAKiCMw.js} +1 -1
- package/dist/web/assets/{markdown-renderer-PbB8SlkU.js → markdown-renderer-CNSv3Olb.js} +1 -1
- package/dist/web/assets/{markdown-renderer-DEXzjjQ8.js → markdown-renderer-DHnbHEFr.js} +1 -1
- package/dist/web/assets/{notification-store-6-9K7U26.js → notification-store-DGrzDj7x.js} +1 -1
- package/dist/web/assets/{pdf-preview-k7xI6wlU.js → pdf-preview-P8Ar0W1A.js} +1 -1
- package/dist/web/assets/{postgres-viewer-5zQgJlQz.js → postgres-viewer-CqjPnnlc.js} +1 -1
- package/dist/web/assets/settings-store-B3LfpCPa.js +2 -0
- package/dist/web/assets/{settings-tab-DDNHT-XP.js → settings-tab-LZPNBhSb.js} +1 -1
- package/dist/web/assets/{sql-query-editor-CYLWqNpT.js → sql-query-editor-BpDMqI2d.js} +1 -1
- package/dist/web/assets/{sqlite-viewer-DANvopw7.js → sqlite-viewer-D6sC2hw7.js} +1 -1
- package/dist/web/assets/{system-monitor-tab-Cfs1hq4q.js → system-monitor-tab-C3Ef8jqO.js} +1 -1
- package/dist/web/assets/{terminal-tab-CTB-qo9d.js → terminal-tab-BR-71TAe.js} +1 -1
- package/dist/web/assets/{tool-cards-BBr3Pix3.js → tool-cards-Bmr07Non.js} +2 -2
- package/dist/web/assets/{use-monaco-theme-BJHYbrpI.js → use-monaco-theme-DPVuNCPp.js} +1 -1
- package/dist/web/assets/{video-preview-Dv1PD_Rj.js → video-preview-BwnO8msG.js} +1 -1
- package/dist/web/index.html +4 -4
- package/dist/web/sw.js +1 -1
- package/package.json +2 -2
- package/src/providers/claude-agent-sdk.ts +17 -0
- package/src/server/index.ts +11 -9
- package/src/server/routes/settings.ts +1 -1
- package/src/services/supervisor.ts +44 -1
- package/src/types/config.ts +5 -4
- package/src/web/components/auth/login-screen.tsx +22 -4
- package/src/web/components/settings/settings-tab.tsx +3 -8
- package/src/web/components/shared/theme-mode-menu.tsx +74 -0
- package/src/web/index.html +1 -1
- package/src/web/stores/settings-store.ts +29 -6
- package/src/web/theme/theme-mode-options.ts +17 -0
- package/dist/web/assets/index-6_hleyhK.css +0 -2
- package/dist/web/assets/index-C4m82SWg.js +0 -50
- package/dist/web/assets/settings-store-BbFtHCGd.js +0 -2
package/dist/web/index.html
CHANGED
|
@@ -39,7 +39,7 @@
|
|
|
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-DlzNfQJh.js"></script>
|
|
43
43
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-FhOqtrmT.js">
|
|
44
44
|
<link rel="modulepreload" crossorigin href="/assets/vendor-mermaid-CYOBtZtD.js">
|
|
45
45
|
<link rel="modulepreload" crossorigin href="/assets/vendor-markdown-CKTlmXbz.js">
|
|
@@ -61,11 +61,11 @@
|
|
|
61
61
|
<link rel="modulepreload" crossorigin href="/assets/api-settings-Do0Z0IRN.js">
|
|
62
62
|
<link rel="modulepreload" crossorigin href="/assets/project-store-D0ALup9Z.js">
|
|
63
63
|
<link rel="modulepreload" crossorigin href="/assets/panel-store-CpKvXNnm.js">
|
|
64
|
-
<link rel="modulepreload" crossorigin href="/assets/settings-store-
|
|
64
|
+
<link rel="modulepreload" crossorigin href="/assets/settings-store-B3LfpCPa.js">
|
|
65
65
|
<link rel="modulepreload" crossorigin href="/assets/tab-store-BQmDVh9c.js">
|
|
66
66
|
<link rel="modulepreload" crossorigin href="/assets/apply-theme-BSJDABU3.js">
|
|
67
67
|
<link rel="modulepreload" crossorigin href="/assets/resolve-theme-B9Mgd5GG.js">
|
|
68
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
68
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CVJmlKhp.css">
|
|
69
69
|
<link rel="manifest" href="/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script></head>
|
|
70
70
|
<body class="text-text font-sans antialiased" style="background: var(--bg)">
|
|
71
71
|
<!-- FOUC guard: apply the persisted theme mode before first paint.
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
try {
|
|
76
76
|
var raw = localStorage.getItem("ppm-settings");
|
|
77
77
|
var s = raw ? JSON.parse(raw) : {};
|
|
78
|
-
var mode = s.themeMode || s.theme || "
|
|
78
|
+
var mode = s.themeMode || s.theme || "system";
|
|
79
79
|
if (mode === "system") {
|
|
80
80
|
mode = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
81
81
|
}
|
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":"06204baf9b481bbc8be3f6ebc8877521","url":"index.html"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"0797b652383bb69d817f1695b75742ec","url":"donate-qr.png"},{"revision":"948e060affb598c339be40d69e1f6f9c","url":"monacoeditorwork/ts.worker.bundle.js"},{"revision":"a5d8a1acfc29c2a4c882a54ffc93def3","url":"monacoeditorwork/json.worker.bundle.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":null,"url":"assets/zig-CrzwMpQE.js"},{"revision":null,"url":"assets/zenscript-DDAXkseY.js"},{"revision":null,"url":"assets/yaml-DOZ10aZe.js"},{"revision":null,"url":"assets/xsl-DTLhN7uu.js"},{"revision":null,"url":"assets/xml-BHzIcDWI.js"},{"revision":null,"url":"assets/x-BsFLg-T8.js"},{"revision":null,"url":"assets/wolfram-Cza4b443.js"},{"revision":null,"url":"assets/wit-DIrx_eCI.js"},{"revision":null,"url":"assets/wikitext-T1DoFcm8.js"},{"revision":null,"url":"assets/wgsl-W-3UHMDO.js"},{"revision":null,"url":"assets/wenyan-BC7irgM3.js"},{"revision":null,"url":"assets/wasm-CVlf9Jwb.js"},{"revision":null,"url":"assets/wasm-BhQEkzil.js"},{"revision":null,"url":"assets/vyper-CwSN64Jn.js"},{"revision":null,"url":"assets/vue-vine-BbBB3V_G.js"},{"revision":null,"url":"assets/vue-m75pWowk.js"},{"revision":null,"url":"assets/vue-html-odHs7IMn.js"},{"revision":null,"url":"assets/vitesse-light-M-eYyOoe.js"},{"revision":null,"url":"assets/vitesse-dark-BuSr6OT5.js"},{"revision":null,"url":"assets/vitesse-black-C6KILWdF.js"},{"revision":null,"url":"assets/viml-D6EKG66q.js"},{"revision":null,"url":"assets/video-preview-Dv1PD_Rj.js"},{"revision":null,"url":"assets/vhdl-DoK4PjhE.js"},{"revision":null,"url":"assets/vesper-DCZnFmY0.js"},{"revision":null,"url":"assets/verilog-BrnAQ3tF.js"},{"revision":null,"url":"assets/vendor-xterm-QDr0jvpJ.js"},{"revision":null,"url":"assets/vendor-xterm-DkTCHfhq.css"},{"revision":null,"url":"assets/vendor-ui-DMRGWRuc.js"},{"revision":null,"url":"assets/vendor-mermaid-CYOBtZtD.js"},{"revision":null,"url":"assets/vendor-markdown-CKTlmXbz.js"},{"revision":null,"url":"assets/vb-DNUJ9fOP.js"},{"revision":null,"url":"assets/vala-AFg9DmKE.js"},{"revision":null,"url":"assets/v-D4997FGs.js"},{"revision":null,"url":"assets/utils-E0yyGxXt.js"},{"revision":null,"url":"assets/use-monaco-theme-BJHYbrpI.js"},{"revision":null,"url":"assets/use-is-mobile-BcuCjH19.js"},{"revision":null,"url":"assets/use-blob-url-B3YovXF6.js"},{"revision":null,"url":"assets/typst-DkvUYMT-.js"},{"revision":null,"url":"assets/typespec-ymBaOi_c.js"},{"revision":null,"url":"assets/typescript-BLfAIchl.js"},{"revision":null,"url":"assets/twig-B7VUm2Ca.js"},{"revision":null,"url":"assets/turtle-DaQac_UT.js"},{"revision":null,"url":"assets/tsx-DJfG3fzg.js"},{"revision":null,"url":"assets/tsv-2kdn5dqL.js"},{"revision":null,"url":"assets/ts-tags-BovP9TMu.js"},{"revision":null,"url":"assets/treemap-KZPCXAKY-CjUqpVnS.js"},{"revision":null,"url":"assets/tool-cards-BBr3Pix3.js"},{"revision":null,"url":"assets/toml-B7D2mIDU.js"},{"revision":null,"url":"assets/tokyo-night-CDyT1jCI.js"},{"revision":null,"url":"assets/tex-ugJpgYPc.js"},{"revision":null,"url":"assets/terraform-CVRZ4SZ4.js"},{"revision":null,"url":"assets/terminal-tab-CTB-qo9d.js"},{"revision":null,"url":"assets/templ-CPxlP4vF.js"},{"revision":null,"url":"assets/tcl-caTR_frn.js"},{"revision":null,"url":"assets/tasl-WQR8VslV.js"},{"revision":null,"url":"assets/talonscript-70lVC3cw.js"},{"revision":null,"url":"assets/table-Di8pv2Y_.js"},{"revision":null,"url":"assets/tab-store-BQmDVh9c.js"},{"revision":null,"url":"assets/systemd-CH8ApCUs.js"},{"revision":null,"url":"assets/system-verilog-Bj7X_lq4.js"},{"revision":null,"url":"assets/system-monitor-tab-Cfs1hq4q.js"},{"revision":null,"url":"assets/synthwave-84-DAroyZBu.js"},{"revision":null,"url":"assets/swift-DtMMgvRI.js"},{"revision":null,"url":"assets/svelte-23si1KV5.js"},{"revision":null,"url":"assets/surrealql-Dkz0DPK8.js"},{"revision":null,"url":"assets/stylus-D0uTFXCy.js"},{"revision":null,"url":"assets/stata-Bk3cgfXJ.js"},{"revision":null,"url":"assets/ssh-config-C3Wv6qRp.js"},{"revision":null,"url":"assets/sqlite-viewer-DANvopw7.js"},{"revision":null,"url":"assets/sql-query-editor-CYLWqNpT.js"},{"revision":null,"url":"assets/sql-CoqObhgo.js"},{"revision":null,"url":"assets/splunk-CDTN2iAG.js"},{"revision":null,"url":"assets/sparql-CsM6F2Yv.js"},{"revision":null,"url":"assets/sparkles-B3DmG8PJ.js"},{"revision":null,"url":"assets/soy-DrLNhqfp.js"},{"revision":null,"url":"assets/solidity-H9fSjkQP.js"},{"revision":null,"url":"assets/solarized-light-C74FvgcO.js"},{"revision":null,"url":"assets/solarized-dark-93sEWmYT.js"},{"revision":null,"url":"assets/snazzy-light-ClAuuhn4.js"},{"revision":null,"url":"assets/smalltalk-Bm0qg6SA.js"},{"revision":null,"url":"assets/slack-ochin-BTkxWjEP.js"},{"revision":null,"url":"assets/slack-dark-DIIV3bpD.js"},{"revision":null,"url":"assets/shield-off-D5tU7gQT.js"},{"revision":null,"url":"assets/shield-check-C3qYSU8a.js"},{"revision":null,"url":"assets/shellsession-D2OCI4Gv.js"},{"revision":null,"url":"assets/shellscript-DxfzKSgU.js"},{"revision":null,"url":"assets/shaderlab-nM5YZwa5.js"},{"revision":null,"url":"assets/settings-tab-DDNHT-XP.js"},{"revision":null,"url":"assets/settings-store-BbFtHCGd.js"},{"revision":null,"url":"assets/sdbl-C34Cg6e7.js"},{"revision":null,"url":"assets/scss-GAyp5euH.js"},{"revision":null,"url":"assets/scheme-DM2jzwUK.js"},{"revision":null,"url":"assets/scala-DpBKROIu.js"},{"revision":null,"url":"assets/save-BM4p9_9n.js"},{"revision":null,"url":"assets/sass-DD75Izu_.js"},{"revision":null,"url":"assets/sas-BtnF4zaV.js"},{"revision":null,"url":"assets/rust-2jBzrC0l.js"},{"revision":null,"url":"assets/ruby-O_z2NTLY.js"},{"revision":null,"url":"assets/rst-C4AZyQQl.js"},{"revision":null,"url":"assets/rosmsg-DEJ8Snbv.js"},{"revision":null,"url":"assets/rose-pine-moon-Cnzr2Cw0.js"},{"revision":null,"url":"assets/rose-pine-HzwmOzHM.js"},{"revision":null,"url":"assets/rose-pine-dawn-CSp9xAF9.js"},{"revision":null,"url":"assets/ron-D0t4kvJG.js"},{"revision":null,"url":"assets/rolldown-runtime-FhOqtrmT.js"},{"revision":null,"url":"assets/riscv-BFZrdZtB.js"},{"revision":null,"url":"assets/resolve-theme-B9Mgd5GG.js"},{"revision":null,"url":"assets/rel-Ce0UO-OB.js"},{"revision":null,"url":"assets/regexp-CCSe1Fc4.js"},{"revision":null,"url":"assets/reg-FMjhUQE-.js"},{"revision":null,"url":"assets/red-CSz3QEOw.js"},{"revision":null,"url":"assets/react-8hrD3-kv.js"},{"revision":null,"url":"assets/razor-8tvJXsO3.js"},{"revision":null,"url":"assets/raku-CX1q9GW0.js"},{"revision":null,"url":"assets/radar-KQ55EAFF-QtJGaSGt.js"},{"revision":null,"url":"assets/racket-DI8v8nzD.js"},{"revision":null,"url":"assets/r-Dvfjp0wc.js"},{"revision":null,"url":"assets/qss-LbRHzb21.js"},{"revision":null,"url":"assets/qmldir-CbNgyhnI.js"},{"revision":null,"url":"assets/qml-CyQVzNXS.js"},{"revision":null,"url":"assets/python-Ctyr4faP.js"},{"revision":null,"url":"assets/purescript-ClIblkvh.js"},{"revision":null,"url":"assets/puppet-osfKyZp4.js"},{"revision":null,"url":"assets/pug-D2aO-l2T.js"},{"revision":null,"url":"assets/proto-DWMt6Qu1.js"},{"revision":null,"url":"assets/prolog-ByNNz2pB.js"},{"revision":null,"url":"assets/project-store-D0ALup9Z.js"},{"revision":null,"url":"assets/prisma-DCmjceML.js"},{"revision":null,"url":"assets/powershell-8ojzYH34.js"},{"revision":null,"url":"assets/powerquery-YOdcTZmd.js"},{"revision":null,"url":"assets/postgres-viewer-5zQgJlQz.js"},{"revision":null,"url":"assets/postcss-DouzwG4F.js"},{"revision":null,"url":"assets/polar-Che1XC2Z.js"},{"revision":null,"url":"assets/poimandres-BBbtYwmR.js"},{"revision":null,"url":"assets/po-Dz4OaDNi.js"},{"revision":null,"url":"assets/plus-DcuJuDC3.js"},{"revision":null,"url":"assets/plsql-BzyjheXU.js"},{"revision":null,"url":"assets/plastic-B3cRtgKD.js"},{"revision":null,"url":"assets/pkl-C_r_zLLt.js"},{"revision":null,"url":"assets/pie-UPGHQEXC-CM29eKDR.js"},{"revision":null,"url":"assets/php-D-DLTnWJ.js"},{"revision":null,"url":"assets/perl-Bd_0l-b4.js"},{"revision":null,"url":"assets/pdf-preview-k7xI6wlU.js"},{"revision":null,"url":"assets/pascal-zM5SlmgF.js"},{"revision":null,"url":"assets/panel-store-CpKvXNnm.js"},{"revision":null,"url":"assets/packet-RMMSAZCW-D5IUZ66-.js"},{"revision":null,"url":"assets/openscad-DcKia-sV.js"},{"revision":null,"url":"assets/one-light-LUZAvT8g.js"},{"revision":null,"url":"assets/one-dark-pro-3sSHqoqQ.js"},{"revision":null,"url":"assets/odin-B8pz4gIL.js"},{"revision":null,"url":"assets/ocaml-CrtQYMMK.js"},{"revision":null,"url":"assets/objective-cpp-BysdFvND.js"},{"revision":null,"url":"assets/objective-c-CoeQAcnP.js"},{"revision":null,"url":"assets/nushell-BsY59i7N.js"},{"revision":null,"url":"assets/number-overlay-editor-CunvWJnN.js"},{"revision":null,"url":"assets/notification-store-6-9K7U26.js"},{"revision":null,"url":"assets/nord-DxASd4qG.js"},{"revision":null,"url":"assets/nix-B9EAdptu.js"},{"revision":null,"url":"assets/nim-BrMojX4O.js"},{"revision":null,"url":"assets/night-owl-light-CC-brflp.js"},{"revision":null,"url":"assets/night-owl-CBQBcbmw.js"},{"revision":null,"url":"assets/nginx-ByvWruGD.js"},{"revision":null,"url":"assets/nextflow-groovy-CMy5-Z4k.js"},{"revision":null,"url":"assets/nextflow-Adq02pv-.js"},{"revision":null,"url":"assets/narrat-BXGbPwG3.js"},{"revision":null,"url":"assets/move-BvhjG2ic.js"},{"revision":null,"url":"assets/moonbit-C9roWxMb.js"},{"revision":null,"url":"assets/monokai-D9vrJ8JM.js"},{"revision":null,"url":"assets/mojo-q9wuEYKR.js"},{"revision":null,"url":"assets/mipsasm-DYyZAum-.js"},{"revision":null,"url":"assets/min-light-Bxw0_Gqq.js"},{"revision":null,"url":"assets/min-dark-BX-xHAD2.js"},{"revision":null,"url":"assets/mermaid-DlR4U4Pe.js"},{"revision":null,"url":"assets/mdx-D4kZ6c6G.js"},{"revision":null,"url":"assets/mdc-omkodQB5.js"},{"revision":null,"url":"assets/matlab-tHQDNC9G.js"},{"revision":null,"url":"assets/material-theme-rbV8EefR.js"},{"revision":null,"url":"assets/material-theme-palenight-ztiOCPbw.js"},{"revision":null,"url":"assets/material-theme-ocean-CX_CHnQq.js"},{"revision":null,"url":"assets/material-theme-lighter-B0CBBjBw.js"},{"revision":null,"url":"assets/material-theme-darker-BZrskvoo.js"},{"revision":null,"url":"assets/marko-HGo5Qtz4.js"},{"revision":null,"url":"assets/markdown-renderer-PbB8SlkU.js"},{"revision":null,"url":"assets/markdown-renderer-DEXzjjQ8.js"},{"revision":null,"url":"assets/markdown-BQNMNiYS.js"},{"revision":null,"url":"assets/make-CqNL10gS.js"},{"revision":null,"url":"assets/luau-B1vcBzl8.js"},{"revision":null,"url":"assets/lua-D8NNsLbC.js"},{"revision":null,"url":"assets/logo-DUinJheI.js"},{"revision":null,"url":"assets/log-QW3dqr1D.js"},{"revision":null,"url":"assets/llvm-6UDP3NQb.js"},{"revision":null,"url":"assets/liquid-KNJEBOwW.js"},{"revision":null,"url":"assets/light-plus-B3BLlguG.js"},{"revision":null,"url":"assets/libesm-DdtEjhIi.js"},{"revision":null,"url":"assets/lib-DTaN9riD.js"},{"revision":null,"url":"assets/less-Dfn9YC_2.js"},{"revision":null,"url":"assets/lean-CJ_KLkrJ.js"},{"revision":null,"url":"assets/latex-ChNeshUC.js"},{"revision":null,"url":"assets/laserwave-C-NuzoMp.js"},{"revision":null,"url":"assets/kusto-Ba87977j.js"},{"revision":null,"url":"assets/kotlin-DVAEYiwY.js"},{"revision":null,"url":"assets/keybindings-store-C3dkxGGX.js"},{"revision":null,"url":"assets/kdl-B6blIqLq.js"},{"revision":null,"url":"assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2"},{"revision":null,"url":"assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2"},{"revision":null,"url":"assets/KaTeX_Size2-Regular-Dy4dx90m.woff2"},{"revision":null,"url":"assets/KaTeX_Size1-Regular-mCD8mA8B.woff2"},{"revision":null,"url":"assets/KaTeX_Script-Regular-D3wIWfF6.woff2"},{"revision":null,"url":"assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2"},{"revision":null,"url":"assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2"},{"revision":null,"url":"assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2"},{"revision":null,"url":"assets/KaTeX_Math-Italic-t53AETM-.woff2"},{"revision":null,"url":"assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2"},{"revision":null,"url":"assets/KaTeX_Main-Regular-B22Nviop.woff2"},{"revision":null,"url":"assets/KaTeX_Main-Italic-NWA7e6Wa.woff2"},{"revision":null,"url":"assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2"},{"revision":null,"url":"assets/KaTeX_Main-Bold-Cx986IdX.woff2"},{"revision":null,"url":"assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2"},{"revision":null,"url":"assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2"},{"revision":null,"url":"assets/KaTeX_AMS-Regular-BQhdFMY1.woff2"},{"revision":null,"url":"assets/kanagawa-wave-BglPniBb.js"},{"revision":null,"url":"assets/kanagawa-lotus-CLnIPAGs.js"},{"revision":null,"url":"assets/kanagawa-dragon-BpeLlraV.js"},{"revision":null,"url":"assets/just-BvQHq7VE.js"},{"revision":null,"url":"assets/julia-DJ8MrQPA.js"},{"revision":null,"url":"assets/jsx-z4TGELE1.js"},{"revision":null,"url":"assets/jssm-B7HswxOM.js"},{"revision":null,"url":"assets/jsonnet-CPj4HCRm.js"},{"revision":null,"url":"assets/jsonl-BAwnWh7U.js"},{"revision":null,"url":"assets/jsonc-tC5zvrPO.js"},{"revision":null,"url":"assets/json5-R_LXJXL0.js"},{"revision":null,"url":"assets/json-uWUKqOxq.js"},{"revision":null,"url":"assets/jison-C2vJYjbJ.js"},{"revision":null,"url":"assets/jinja-B-zKiwlp.js"},{"revision":null,"url":"assets/javascript-DQR6GQKs.js"},{"revision":null,"url":"assets/java-PRMSQp24.js"},{"revision":null,"url":"assets/ini-CAvrVa5R.js"},{"revision":null,"url":"assets/info-3K5VOQVL-BpNjgbj9.js"},{"revision":null,"url":"assets/index-C4m82SWg.js"},{"revision":null,"url":"assets/index-6_hleyhK.css"},{"revision":null,"url":"assets/imba-aiXalPnK.js"},{"revision":null,"url":"assets/image-preview-i-jTDsjR.js"},{"revision":null,"url":"assets/image-gallery-CObzTisL.js"},{"revision":null,"url":"assets/hy-DzZa6alE.js"},{"revision":null,"url":"assets/hxml-BQvjiuBt.js"},{"revision":null,"url":"assets/hurl-boMPgDm9.js"},{"revision":null,"url":"assets/http-CHd2gYPf.js"},{"revision":null,"url":"assets/html-derivative-BiTPuOba.js"},{"revision":null,"url":"assets/html-2p0RvXi4.js"},{"revision":null,"url":"assets/houston-Ddm8AgpV.js"},{"revision":null,"url":"assets/horizon-DSOVAzyH.js"},{"revision":null,"url":"assets/horizon-bright-DKfVjGj_.js"},{"revision":null,"url":"assets/hlsl-DCKvuEyZ.js"},{"revision":null,"url":"assets/hjson-BygWIJ-3.js"},{"revision":null,"url":"assets/hcl-CusCzwOk.js"},{"revision":null,"url":"assets/haxe-DLRwZxmt.js"},{"revision":null,"url":"assets/haskell-DybKb9uW.js"},{"revision":null,"url":"assets/handlebars-C9HXIMtj.js"},{"revision":null,"url":"assets/haml-Dts9JlPU.js"},{"revision":null,"url":"assets/hack-sxywdIAQ.js"},{"revision":null,"url":"assets/gruvbox-light-soft-DrrS2sdV.js"},{"revision":null,"url":"assets/gruvbox-light-medium-BOHMe1-7.js"},{"revision":null,"url":"assets/gruvbox-light-hard-CWXUzp9b.js"},{"revision":null,"url":"assets/gruvbox-dark-soft-DV6TAcen.js"},{"revision":null,"url":"assets/gruvbox-dark-medium-Df0L0qje.js"},{"revision":null,"url":"assets/gruvbox-dark-hard-CLbDN-E3.js"},{"revision":null,"url":"assets/group-chat-tab-rB8JuZIe.js"},{"revision":null,"url":"assets/groovy-rfHeCRqy.js"},{"revision":null,"url":"assets/graphql-B_KyE6oz.js"},{"revision":null,"url":"assets/go-BL16cMJO.js"},{"revision":null,"url":"assets/gnuplot-Df_8pFbI.js"},{"revision":null,"url":"assets/gn-DuO2D2eW.js"},{"revision":null,"url":"assets/glsl-BED7ZmUZ.js"},{"revision":null,"url":"assets/glimmer-ts-Coz155XK.js"},{"revision":null,"url":"assets/glimmer-js-BwJnDfL-.js"},{"revision":null,"url":"assets/glide-data-grid-nthEL3fk.css"},{"revision":null,"url":"assets/glide-data-grid-CcGfgB3d.js"},{"revision":null,"url":"assets/gleam-D4dP7V5M.js"},{"revision":null,"url":"assets/github-light-high-contrast-DiJVeRlZ.js"},{"revision":null,"url":"assets/github-light-default-CKFslV7i.js"},{"revision":null,"url":"assets/github-light-Ch-E92cy.js"},{"revision":null,"url":"assets/github-dark-high-contrast-B6BvU8H-.js"},{"revision":null,"url":"assets/github-dark-dimmed-CUXSQ8bS.js"},{"revision":null,"url":"assets/github-dark-default-DZ1m_6OP.js"},{"revision":null,"url":"assets/github-dark-BWCf99kM.js"},{"revision":null,"url":"assets/gitGraph-HDMCJU4V-CutkUNY_.js"},{"revision":null,"url":"assets/git-rebase-DkHvejAR.js"},{"revision":null,"url":"assets/git-log-panel-BryqAkz2.js"},{"revision":null,"url":"assets/git-commit-sQznNP43.js"},{"revision":null,"url":"assets/gherkin-CW9NH2DW.js"},{"revision":null,"url":"assets/genie-B4hkIXNU.js"},{"revision":null,"url":"assets/gdshader-C2XOq90k.js"},{"revision":null,"url":"assets/gdscript-BYdRNu_P.js"},{"revision":null,"url":"assets/gdresource-DJ7IvROZ.js"},{"revision":null,"url":"assets/fsharp-DxITxZW5.js"},{"revision":null,"url":"assets/fortran-free-form-BN7VmmxZ.js"},{"revision":null,"url":"assets/fortran-fixed-form-CpR0cN7O.js"},{"revision":null,"url":"assets/fluent-CH3IJUki.js"},{"revision":null,"url":"assets/fish-Vr62C2vP.js"},{"revision":null,"url":"assets/file-exclamation-point-DBEC-Kst.js"},{"revision":null,"url":"assets/fennel-C6ktGUzp.js"},{"revision":null,"url":"assets/eye-off-Rq1n2-oe.js"},{"revision":null,"url":"assets/extension-webview-D4rHB1h7.js"},{"revision":null,"url":"assets/everforest-light-CyFxGMIs.js"},{"revision":null,"url":"assets/everforest-dark-CN77B1NJ.js"},{"revision":null,"url":"assets/esm-PmlN1RTs.js"},{"revision":null,"url":"assets/erlang-B_etLcPG.js"},{"revision":null,"url":"assets/erb-DHX2IIEs.js"},{"revision":null,"url":"assets/emacs-lisp-B7aZTnJ_.js"},{"revision":null,"url":"assets/elm-CpD28xsW.js"},{"revision":null,"url":"assets/elixir-BAX9HSOu.js"},{"revision":null,"url":"assets/edit-diff-preview-D1TEK7Jz.js"},{"revision":null,"url":"assets/edge-CTom35R_.js"},{"revision":null,"url":"assets/dream-maker-TBDKiHrV.js"},{"revision":null,"url":"assets/dracula-yI5kpKp5.js"},{"revision":null,"url":"assets/dracula-soft-CYF6cJce.js"},{"revision":null,"url":"assets/dotenv-QeT1SLTv.js"},{"revision":null,"url":"assets/docx-preview-rR_dLI4P.js"},{"revision":null,"url":"assets/docker-DjDr3TJF.js"},{"revision":null,"url":"assets/dist-m_oJqIDk.js"},{"revision":null,"url":"assets/dist-Bi4gRyhr.js"},{"revision":null,"url":"assets/diff-viewer-BX02Fg5_.js"},{"revision":null,"url":"assets/diff-CupGmT1a.js"},{"revision":null,"url":"assets/dialog-HHdNInEH.js"},{"revision":null,"url":"assets/desktop-C6lD62ar.js"},{"revision":null,"url":"assets/dax-B1aRUMXT.js"},{"revision":null,"url":"assets/database-viewer-CrBOZBE4.js"},{"revision":null,"url":"assets/database-COYAMZaw.js"},{"revision":null,"url":"assets/data-grid-types-BuMHLKXV.js"},{"revision":null,"url":"assets/data-grid-overlay-editor-Bdc80TJ1.js"},{"revision":null,"url":"assets/dart-BmpakMe-.js"},{"revision":null,"url":"assets/dark-plus-sn-FFTT1.js"},{"revision":null,"url":"assets/d-CxaScvxf.js"},{"revision":null,"url":"assets/cypher-TVlMMWma.js"},{"revision":null,"url":"assets/cue-Byh1xHko.js"},{"revision":null,"url":"assets/csv-preview-Bqfk0OeJ.js"},{"revision":null,"url":"assets/csv-parser-DVHBcvuE.js"},{"revision":null,"url":"assets/csv-DW48Z5d-.js"},{"revision":null,"url":"assets/css-CIjciIIk.js"},{"revision":null,"url":"assets/csharp-DcR97P0D.js"},{"revision":null,"url":"assets/crystal-DMjCL--0.js"},{"revision":null,"url":"assets/createLucideIcon-ConhwJnb.js"},{"revision":null,"url":"assets/cpp-CnU9hfBq.js"},{"revision":null,"url":"assets/coq-D2bX6-8g.js"},{"revision":null,"url":"assets/context-menu-DIiZdfbE.js"},{"revision":null,"url":"assets/conflict-editor-4rb0oS2i.js"},{"revision":null,"url":"assets/common-lisp-BX1XgHTt.js"},{"revision":null,"url":"assets/coffee-DTtK7kKi.js"},{"revision":null,"url":"assets/codeql-BpP1PDrj.js"},{"revision":null,"url":"assets/codeowners-CtkKTnsH.js"},{"revision":null,"url":"assets/code-TekEnDFM.js"},{"revision":null,"url":"assets/code-editor-DM-ay_BF.js"},{"revision":null,"url":"assets/cobol-D39V6ukp.js"},{"revision":null,"url":"assets/cmake-DsZu4U4F.js"},{"revision":null,"url":"assets/clojure-pSLH-KQp.js"},{"revision":null,"url":"assets/clarity-BRdirlsw.js"},{"revision":null,"url":"assets/circle-question-mark-PaJgx-3d.js"},{"revision":null,"url":"assets/chevron-right-DeUue2aK.js"},{"revision":null,"url":"assets/chat-tab-B6Elb3uK.js"},{"revision":null,"url":"assets/catppuccin-mocha-BeMC5hqi.js"},{"revision":null,"url":"assets/catppuccin-macchiato-B0bAzXh0.js"},{"revision":null,"url":"assets/catppuccin-latte-ZxS-ga_K.js"},{"revision":null,"url":"assets/catppuccin-frappe-Dm3rVY3b.js"},{"revision":null,"url":"assets/cairo-BboZ9qIf.js"},{"revision":null,"url":"assets/cadence-B5X2vWm3.js"},{"revision":null,"url":"assets/c3-Da53KeG6.js"},{"revision":null,"url":"assets/c-BQFvJ6Ux.js"},{"revision":null,"url":"assets/bsl-CGf6Xuyu.js"},{"revision":null,"url":"assets/bot-E9mcVZnr.js"},{"revision":null,"url":"assets/blade-BvrP2gPd.js"},{"revision":null,"url":"assets/bird2-C0pvipi_.js"},{"revision":null,"url":"assets/bicep-DWS-2uWR.js"},{"revision":null,"url":"assets/bibtex-C_q8ygAM.js"},{"revision":null,"url":"assets/berry-BqVQYZZr.js"},{"revision":null,"url":"assets/beancount-f8f3BBqB.js"},{"revision":null,"url":"assets/bat-Cg8hlSct.js"},{"revision":null,"url":"assets/ballerina-DUO9mwyV.js"},{"revision":null,"url":"assets/ayu-mirage-BAdm8pKU.js"},{"revision":null,"url":"assets/ayu-light-DyIp0Idy.js"},{"revision":null,"url":"assets/ayu-dark-C50MYKhw.js"},{"revision":null,"url":"assets/awk-Cj93pRL8.js"},{"revision":null,"url":"assets/aurora-x-BPgGL50S.js"},{"revision":null,"url":"assets/audio-preview-C3YJNKjD.js"},{"revision":null,"url":"assets/astro-CXIotiNS.js"},{"revision":null,"url":"assets/asm-p1-PUkh3.js"},{"revision":null,"url":"assets/asciidoc-CIsC4kkq.js"},{"revision":null,"url":"assets/architecture-PBZL5I3N-DVRYSsQn.js"},{"revision":null,"url":"assets/ara-BGtOX5Hn.js"},{"revision":null,"url":"assets/apply-theme-BSJDABU3.js"},{"revision":null,"url":"assets/applescript-5AlzBqQO.js"},{"revision":null,"url":"assets/apl-DSANFLx0.js"},{"revision":null,"url":"assets/api-themes-DXi8sz-9.js"},{"revision":null,"url":"assets/api-settings-Do0Z0IRN.js"},{"revision":null,"url":"assets/api-settings-De--HNHp.js"},{"revision":null,"url":"assets/api-client-RtNXvS0P.js"},{"revision":null,"url":"assets/api-client-COQtP-dB.js"},{"revision":null,"url":"assets/apex-3O2170Ju.js"},{"revision":null,"url":"assets/apache-Dg7oWQbs.js"},{"revision":null,"url":"assets/angular-ts-CUvq2h3X.js"},{"revision":null,"url":"assets/angular-html-D4YJUMLP.js"},{"revision":null,"url":"assets/andromeeda-C3nkvRhj.js"},{"revision":null,"url":"assets/ai-resource-editor-D12van6q.js"},{"revision":null,"url":"assets/ada-DzO1tMqV.js"},{"revision":null,"url":"assets/actionscript-3-CML-MTNy.js"},{"revision":null,"url":"assets/abap-BM5PMK0-.js"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":"26dccd02a2ef7522892015154f5e3680","url":"manifest.webmanifest"}]);
|
|
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":"e44e2cdbe841a184651bf0503a3bca18","url":"index.html"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"0797b652383bb69d817f1695b75742ec","url":"donate-qr.png"},{"revision":"948e060affb598c339be40d69e1f6f9c","url":"monacoeditorwork/ts.worker.bundle.js"},{"revision":"a5d8a1acfc29c2a4c882a54ffc93def3","url":"monacoeditorwork/json.worker.bundle.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":null,"url":"assets/zig-CrzwMpQE.js"},{"revision":null,"url":"assets/zenscript-DDAXkseY.js"},{"revision":null,"url":"assets/yaml-DOZ10aZe.js"},{"revision":null,"url":"assets/xsl-DTLhN7uu.js"},{"revision":null,"url":"assets/xml-BHzIcDWI.js"},{"revision":null,"url":"assets/x-BsFLg-T8.js"},{"revision":null,"url":"assets/wolfram-Cza4b443.js"},{"revision":null,"url":"assets/wit-DIrx_eCI.js"},{"revision":null,"url":"assets/wikitext-T1DoFcm8.js"},{"revision":null,"url":"assets/wgsl-W-3UHMDO.js"},{"revision":null,"url":"assets/wenyan-BC7irgM3.js"},{"revision":null,"url":"assets/wasm-CVlf9Jwb.js"},{"revision":null,"url":"assets/wasm-BhQEkzil.js"},{"revision":null,"url":"assets/vyper-CwSN64Jn.js"},{"revision":null,"url":"assets/vue-vine-BbBB3V_G.js"},{"revision":null,"url":"assets/vue-m75pWowk.js"},{"revision":null,"url":"assets/vue-html-odHs7IMn.js"},{"revision":null,"url":"assets/vitesse-light-M-eYyOoe.js"},{"revision":null,"url":"assets/vitesse-dark-BuSr6OT5.js"},{"revision":null,"url":"assets/vitesse-black-C6KILWdF.js"},{"revision":null,"url":"assets/viml-D6EKG66q.js"},{"revision":null,"url":"assets/video-preview-BwnO8msG.js"},{"revision":null,"url":"assets/vhdl-DoK4PjhE.js"},{"revision":null,"url":"assets/vesper-DCZnFmY0.js"},{"revision":null,"url":"assets/verilog-BrnAQ3tF.js"},{"revision":null,"url":"assets/vendor-xterm-QDr0jvpJ.js"},{"revision":null,"url":"assets/vendor-xterm-DkTCHfhq.css"},{"revision":null,"url":"assets/vendor-ui-DMRGWRuc.js"},{"revision":null,"url":"assets/vendor-mermaid-CYOBtZtD.js"},{"revision":null,"url":"assets/vendor-markdown-CKTlmXbz.js"},{"revision":null,"url":"assets/vb-DNUJ9fOP.js"},{"revision":null,"url":"assets/vala-AFg9DmKE.js"},{"revision":null,"url":"assets/v-D4997FGs.js"},{"revision":null,"url":"assets/utils-E0yyGxXt.js"},{"revision":null,"url":"assets/use-monaco-theme-DPVuNCPp.js"},{"revision":null,"url":"assets/use-is-mobile-BcuCjH19.js"},{"revision":null,"url":"assets/use-blob-url-B3YovXF6.js"},{"revision":null,"url":"assets/typst-DkvUYMT-.js"},{"revision":null,"url":"assets/typespec-ymBaOi_c.js"},{"revision":null,"url":"assets/typescript-BLfAIchl.js"},{"revision":null,"url":"assets/twig-B7VUm2Ca.js"},{"revision":null,"url":"assets/turtle-DaQac_UT.js"},{"revision":null,"url":"assets/tsx-DJfG3fzg.js"},{"revision":null,"url":"assets/tsv-2kdn5dqL.js"},{"revision":null,"url":"assets/ts-tags-BovP9TMu.js"},{"revision":null,"url":"assets/treemap-KZPCXAKY-CjUqpVnS.js"},{"revision":null,"url":"assets/tool-cards-Bmr07Non.js"},{"revision":null,"url":"assets/toml-B7D2mIDU.js"},{"revision":null,"url":"assets/tokyo-night-CDyT1jCI.js"},{"revision":null,"url":"assets/tex-ugJpgYPc.js"},{"revision":null,"url":"assets/terraform-CVRZ4SZ4.js"},{"revision":null,"url":"assets/terminal-tab-BR-71TAe.js"},{"revision":null,"url":"assets/templ-CPxlP4vF.js"},{"revision":null,"url":"assets/tcl-caTR_frn.js"},{"revision":null,"url":"assets/tasl-WQR8VslV.js"},{"revision":null,"url":"assets/talonscript-70lVC3cw.js"},{"revision":null,"url":"assets/table-Di8pv2Y_.js"},{"revision":null,"url":"assets/tab-store-BQmDVh9c.js"},{"revision":null,"url":"assets/systemd-CH8ApCUs.js"},{"revision":null,"url":"assets/system-verilog-Bj7X_lq4.js"},{"revision":null,"url":"assets/system-monitor-tab-C3Ef8jqO.js"},{"revision":null,"url":"assets/synthwave-84-DAroyZBu.js"},{"revision":null,"url":"assets/swift-DtMMgvRI.js"},{"revision":null,"url":"assets/svelte-23si1KV5.js"},{"revision":null,"url":"assets/surrealql-Dkz0DPK8.js"},{"revision":null,"url":"assets/stylus-D0uTFXCy.js"},{"revision":null,"url":"assets/stata-Bk3cgfXJ.js"},{"revision":null,"url":"assets/ssh-config-C3Wv6qRp.js"},{"revision":null,"url":"assets/sqlite-viewer-D6sC2hw7.js"},{"revision":null,"url":"assets/sql-query-editor-BpDMqI2d.js"},{"revision":null,"url":"assets/sql-CoqObhgo.js"},{"revision":null,"url":"assets/splunk-CDTN2iAG.js"},{"revision":null,"url":"assets/sparql-CsM6F2Yv.js"},{"revision":null,"url":"assets/sparkles-B3DmG8PJ.js"},{"revision":null,"url":"assets/soy-DrLNhqfp.js"},{"revision":null,"url":"assets/solidity-H9fSjkQP.js"},{"revision":null,"url":"assets/solarized-light-C74FvgcO.js"},{"revision":null,"url":"assets/solarized-dark-93sEWmYT.js"},{"revision":null,"url":"assets/snazzy-light-ClAuuhn4.js"},{"revision":null,"url":"assets/smalltalk-Bm0qg6SA.js"},{"revision":null,"url":"assets/slack-ochin-BTkxWjEP.js"},{"revision":null,"url":"assets/slack-dark-DIIV3bpD.js"},{"revision":null,"url":"assets/shield-off-D5tU7gQT.js"},{"revision":null,"url":"assets/shield-check-C3qYSU8a.js"},{"revision":null,"url":"assets/shellsession-D2OCI4Gv.js"},{"revision":null,"url":"assets/shellscript-DxfzKSgU.js"},{"revision":null,"url":"assets/shaderlab-nM5YZwa5.js"},{"revision":null,"url":"assets/settings-tab-LZPNBhSb.js"},{"revision":null,"url":"assets/settings-store-B3LfpCPa.js"},{"revision":null,"url":"assets/sdbl-C34Cg6e7.js"},{"revision":null,"url":"assets/scss-GAyp5euH.js"},{"revision":null,"url":"assets/scheme-DM2jzwUK.js"},{"revision":null,"url":"assets/scala-DpBKROIu.js"},{"revision":null,"url":"assets/save-BM4p9_9n.js"},{"revision":null,"url":"assets/sass-DD75Izu_.js"},{"revision":null,"url":"assets/sas-BtnF4zaV.js"},{"revision":null,"url":"assets/rust-2jBzrC0l.js"},{"revision":null,"url":"assets/ruby-O_z2NTLY.js"},{"revision":null,"url":"assets/rst-C4AZyQQl.js"},{"revision":null,"url":"assets/rosmsg-DEJ8Snbv.js"},{"revision":null,"url":"assets/rose-pine-moon-Cnzr2Cw0.js"},{"revision":null,"url":"assets/rose-pine-HzwmOzHM.js"},{"revision":null,"url":"assets/rose-pine-dawn-CSp9xAF9.js"},{"revision":null,"url":"assets/ron-D0t4kvJG.js"},{"revision":null,"url":"assets/rolldown-runtime-FhOqtrmT.js"},{"revision":null,"url":"assets/riscv-BFZrdZtB.js"},{"revision":null,"url":"assets/resolve-theme-B9Mgd5GG.js"},{"revision":null,"url":"assets/rel-Ce0UO-OB.js"},{"revision":null,"url":"assets/regexp-CCSe1Fc4.js"},{"revision":null,"url":"assets/reg-FMjhUQE-.js"},{"revision":null,"url":"assets/red-CSz3QEOw.js"},{"revision":null,"url":"assets/react-8hrD3-kv.js"},{"revision":null,"url":"assets/razor-8tvJXsO3.js"},{"revision":null,"url":"assets/raku-CX1q9GW0.js"},{"revision":null,"url":"assets/radar-KQ55EAFF-QtJGaSGt.js"},{"revision":null,"url":"assets/racket-DI8v8nzD.js"},{"revision":null,"url":"assets/r-Dvfjp0wc.js"},{"revision":null,"url":"assets/qss-LbRHzb21.js"},{"revision":null,"url":"assets/qmldir-CbNgyhnI.js"},{"revision":null,"url":"assets/qml-CyQVzNXS.js"},{"revision":null,"url":"assets/python-Ctyr4faP.js"},{"revision":null,"url":"assets/purescript-ClIblkvh.js"},{"revision":null,"url":"assets/puppet-osfKyZp4.js"},{"revision":null,"url":"assets/pug-D2aO-l2T.js"},{"revision":null,"url":"assets/proto-DWMt6Qu1.js"},{"revision":null,"url":"assets/prolog-ByNNz2pB.js"},{"revision":null,"url":"assets/project-store-D0ALup9Z.js"},{"revision":null,"url":"assets/prisma-DCmjceML.js"},{"revision":null,"url":"assets/powershell-8ojzYH34.js"},{"revision":null,"url":"assets/powerquery-YOdcTZmd.js"},{"revision":null,"url":"assets/postgres-viewer-CqjPnnlc.js"},{"revision":null,"url":"assets/postcss-DouzwG4F.js"},{"revision":null,"url":"assets/polar-Che1XC2Z.js"},{"revision":null,"url":"assets/poimandres-BBbtYwmR.js"},{"revision":null,"url":"assets/po-Dz4OaDNi.js"},{"revision":null,"url":"assets/plus-DcuJuDC3.js"},{"revision":null,"url":"assets/plsql-BzyjheXU.js"},{"revision":null,"url":"assets/plastic-B3cRtgKD.js"},{"revision":null,"url":"assets/pkl-C_r_zLLt.js"},{"revision":null,"url":"assets/pie-UPGHQEXC-CM29eKDR.js"},{"revision":null,"url":"assets/php-D-DLTnWJ.js"},{"revision":null,"url":"assets/perl-Bd_0l-b4.js"},{"revision":null,"url":"assets/pdf-preview-P8Ar0W1A.js"},{"revision":null,"url":"assets/pascal-zM5SlmgF.js"},{"revision":null,"url":"assets/panel-store-CpKvXNnm.js"},{"revision":null,"url":"assets/packet-RMMSAZCW-D5IUZ66-.js"},{"revision":null,"url":"assets/openscad-DcKia-sV.js"},{"revision":null,"url":"assets/one-light-LUZAvT8g.js"},{"revision":null,"url":"assets/one-dark-pro-3sSHqoqQ.js"},{"revision":null,"url":"assets/odin-B8pz4gIL.js"},{"revision":null,"url":"assets/ocaml-CrtQYMMK.js"},{"revision":null,"url":"assets/objective-cpp-BysdFvND.js"},{"revision":null,"url":"assets/objective-c-CoeQAcnP.js"},{"revision":null,"url":"assets/nushell-BsY59i7N.js"},{"revision":null,"url":"assets/number-overlay-editor-CunvWJnN.js"},{"revision":null,"url":"assets/notification-store-DGrzDj7x.js"},{"revision":null,"url":"assets/nord-DxASd4qG.js"},{"revision":null,"url":"assets/nix-B9EAdptu.js"},{"revision":null,"url":"assets/nim-BrMojX4O.js"},{"revision":null,"url":"assets/night-owl-light-CC-brflp.js"},{"revision":null,"url":"assets/night-owl-CBQBcbmw.js"},{"revision":null,"url":"assets/nginx-ByvWruGD.js"},{"revision":null,"url":"assets/nextflow-groovy-CMy5-Z4k.js"},{"revision":null,"url":"assets/nextflow-Adq02pv-.js"},{"revision":null,"url":"assets/narrat-BXGbPwG3.js"},{"revision":null,"url":"assets/move-BvhjG2ic.js"},{"revision":null,"url":"assets/moonbit-C9roWxMb.js"},{"revision":null,"url":"assets/monokai-D9vrJ8JM.js"},{"revision":null,"url":"assets/mojo-q9wuEYKR.js"},{"revision":null,"url":"assets/mipsasm-DYyZAum-.js"},{"revision":null,"url":"assets/min-light-Bxw0_Gqq.js"},{"revision":null,"url":"assets/min-dark-BX-xHAD2.js"},{"revision":null,"url":"assets/mermaid-DlR4U4Pe.js"},{"revision":null,"url":"assets/mdx-D4kZ6c6G.js"},{"revision":null,"url":"assets/mdc-omkodQB5.js"},{"revision":null,"url":"assets/matlab-tHQDNC9G.js"},{"revision":null,"url":"assets/material-theme-rbV8EefR.js"},{"revision":null,"url":"assets/material-theme-palenight-ztiOCPbw.js"},{"revision":null,"url":"assets/material-theme-ocean-CX_CHnQq.js"},{"revision":null,"url":"assets/material-theme-lighter-B0CBBjBw.js"},{"revision":null,"url":"assets/material-theme-darker-BZrskvoo.js"},{"revision":null,"url":"assets/marko-HGo5Qtz4.js"},{"revision":null,"url":"assets/markdown-renderer-DHnbHEFr.js"},{"revision":null,"url":"assets/markdown-renderer-CNSv3Olb.js"},{"revision":null,"url":"assets/markdown-BQNMNiYS.js"},{"revision":null,"url":"assets/make-CqNL10gS.js"},{"revision":null,"url":"assets/luau-B1vcBzl8.js"},{"revision":null,"url":"assets/lua-D8NNsLbC.js"},{"revision":null,"url":"assets/logo-DUinJheI.js"},{"revision":null,"url":"assets/log-QW3dqr1D.js"},{"revision":null,"url":"assets/llvm-6UDP3NQb.js"},{"revision":null,"url":"assets/liquid-KNJEBOwW.js"},{"revision":null,"url":"assets/light-plus-B3BLlguG.js"},{"revision":null,"url":"assets/libesm-DdtEjhIi.js"},{"revision":null,"url":"assets/lib-DTaN9riD.js"},{"revision":null,"url":"assets/less-Dfn9YC_2.js"},{"revision":null,"url":"assets/lean-CJ_KLkrJ.js"},{"revision":null,"url":"assets/latex-ChNeshUC.js"},{"revision":null,"url":"assets/laserwave-C-NuzoMp.js"},{"revision":null,"url":"assets/kusto-Ba87977j.js"},{"revision":null,"url":"assets/kotlin-DVAEYiwY.js"},{"revision":null,"url":"assets/keybindings-store-DtAKiCMw.js"},{"revision":null,"url":"assets/kdl-B6blIqLq.js"},{"revision":null,"url":"assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2"},{"revision":null,"url":"assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2"},{"revision":null,"url":"assets/KaTeX_Size2-Regular-Dy4dx90m.woff2"},{"revision":null,"url":"assets/KaTeX_Size1-Regular-mCD8mA8B.woff2"},{"revision":null,"url":"assets/KaTeX_Script-Regular-D3wIWfF6.woff2"},{"revision":null,"url":"assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2"},{"revision":null,"url":"assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2"},{"revision":null,"url":"assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2"},{"revision":null,"url":"assets/KaTeX_Math-Italic-t53AETM-.woff2"},{"revision":null,"url":"assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2"},{"revision":null,"url":"assets/KaTeX_Main-Regular-B22Nviop.woff2"},{"revision":null,"url":"assets/KaTeX_Main-Italic-NWA7e6Wa.woff2"},{"revision":null,"url":"assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2"},{"revision":null,"url":"assets/KaTeX_Main-Bold-Cx986IdX.woff2"},{"revision":null,"url":"assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2"},{"revision":null,"url":"assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2"},{"revision":null,"url":"assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2"},{"revision":null,"url":"assets/KaTeX_AMS-Regular-BQhdFMY1.woff2"},{"revision":null,"url":"assets/kanagawa-wave-BglPniBb.js"},{"revision":null,"url":"assets/kanagawa-lotus-CLnIPAGs.js"},{"revision":null,"url":"assets/kanagawa-dragon-BpeLlraV.js"},{"revision":null,"url":"assets/just-BvQHq7VE.js"},{"revision":null,"url":"assets/julia-DJ8MrQPA.js"},{"revision":null,"url":"assets/jsx-z4TGELE1.js"},{"revision":null,"url":"assets/jssm-B7HswxOM.js"},{"revision":null,"url":"assets/jsonnet-CPj4HCRm.js"},{"revision":null,"url":"assets/jsonl-BAwnWh7U.js"},{"revision":null,"url":"assets/jsonc-tC5zvrPO.js"},{"revision":null,"url":"assets/json5-R_LXJXL0.js"},{"revision":null,"url":"assets/json-uWUKqOxq.js"},{"revision":null,"url":"assets/jison-C2vJYjbJ.js"},{"revision":null,"url":"assets/jinja-B-zKiwlp.js"},{"revision":null,"url":"assets/javascript-DQR6GQKs.js"},{"revision":null,"url":"assets/java-PRMSQp24.js"},{"revision":null,"url":"assets/ini-CAvrVa5R.js"},{"revision":null,"url":"assets/info-3K5VOQVL-BpNjgbj9.js"},{"revision":null,"url":"assets/index-DlzNfQJh.js"},{"revision":null,"url":"assets/index-CVJmlKhp.css"},{"revision":null,"url":"assets/imba-aiXalPnK.js"},{"revision":null,"url":"assets/image-preview-B8al9rrY.js"},{"revision":null,"url":"assets/image-gallery-CObzTisL.js"},{"revision":null,"url":"assets/hy-DzZa6alE.js"},{"revision":null,"url":"assets/hxml-BQvjiuBt.js"},{"revision":null,"url":"assets/hurl-boMPgDm9.js"},{"revision":null,"url":"assets/http-CHd2gYPf.js"},{"revision":null,"url":"assets/html-derivative-BiTPuOba.js"},{"revision":null,"url":"assets/html-2p0RvXi4.js"},{"revision":null,"url":"assets/houston-Ddm8AgpV.js"},{"revision":null,"url":"assets/horizon-DSOVAzyH.js"},{"revision":null,"url":"assets/horizon-bright-DKfVjGj_.js"},{"revision":null,"url":"assets/hlsl-DCKvuEyZ.js"},{"revision":null,"url":"assets/hjson-BygWIJ-3.js"},{"revision":null,"url":"assets/hcl-CusCzwOk.js"},{"revision":null,"url":"assets/haxe-DLRwZxmt.js"},{"revision":null,"url":"assets/haskell-DybKb9uW.js"},{"revision":null,"url":"assets/handlebars-C9HXIMtj.js"},{"revision":null,"url":"assets/haml-Dts9JlPU.js"},{"revision":null,"url":"assets/hack-sxywdIAQ.js"},{"revision":null,"url":"assets/gruvbox-light-soft-DrrS2sdV.js"},{"revision":null,"url":"assets/gruvbox-light-medium-BOHMe1-7.js"},{"revision":null,"url":"assets/gruvbox-light-hard-CWXUzp9b.js"},{"revision":null,"url":"assets/gruvbox-dark-soft-DV6TAcen.js"},{"revision":null,"url":"assets/gruvbox-dark-medium-Df0L0qje.js"},{"revision":null,"url":"assets/gruvbox-dark-hard-CLbDN-E3.js"},{"revision":null,"url":"assets/group-chat-tab-C2AhbwL2.js"},{"revision":null,"url":"assets/groovy-rfHeCRqy.js"},{"revision":null,"url":"assets/graphql-B_KyE6oz.js"},{"revision":null,"url":"assets/go-BL16cMJO.js"},{"revision":null,"url":"assets/gnuplot-Df_8pFbI.js"},{"revision":null,"url":"assets/gn-DuO2D2eW.js"},{"revision":null,"url":"assets/glsl-BED7ZmUZ.js"},{"revision":null,"url":"assets/glimmer-ts-Coz155XK.js"},{"revision":null,"url":"assets/glimmer-js-BwJnDfL-.js"},{"revision":null,"url":"assets/glide-data-grid-nthEL3fk.css"},{"revision":null,"url":"assets/glide-data-grid-DLI4he-v.js"},{"revision":null,"url":"assets/gleam-D4dP7V5M.js"},{"revision":null,"url":"assets/github-light-high-contrast-DiJVeRlZ.js"},{"revision":null,"url":"assets/github-light-default-CKFslV7i.js"},{"revision":null,"url":"assets/github-light-Ch-E92cy.js"},{"revision":null,"url":"assets/github-dark-high-contrast-B6BvU8H-.js"},{"revision":null,"url":"assets/github-dark-dimmed-CUXSQ8bS.js"},{"revision":null,"url":"assets/github-dark-default-DZ1m_6OP.js"},{"revision":null,"url":"assets/github-dark-BWCf99kM.js"},{"revision":null,"url":"assets/gitGraph-HDMCJU4V-CutkUNY_.js"},{"revision":null,"url":"assets/git-rebase-DkHvejAR.js"},{"revision":null,"url":"assets/git-log-panel-cfFgTJhr.js"},{"revision":null,"url":"assets/git-commit-sQznNP43.js"},{"revision":null,"url":"assets/gherkin-CW9NH2DW.js"},{"revision":null,"url":"assets/genie-B4hkIXNU.js"},{"revision":null,"url":"assets/gdshader-C2XOq90k.js"},{"revision":null,"url":"assets/gdscript-BYdRNu_P.js"},{"revision":null,"url":"assets/gdresource-DJ7IvROZ.js"},{"revision":null,"url":"assets/fsharp-DxITxZW5.js"},{"revision":null,"url":"assets/fortran-free-form-BN7VmmxZ.js"},{"revision":null,"url":"assets/fortran-fixed-form-CpR0cN7O.js"},{"revision":null,"url":"assets/fluent-CH3IJUki.js"},{"revision":null,"url":"assets/fish-Vr62C2vP.js"},{"revision":null,"url":"assets/file-exclamation-point-DBEC-Kst.js"},{"revision":null,"url":"assets/fennel-C6ktGUzp.js"},{"revision":null,"url":"assets/eye-off-Rq1n2-oe.js"},{"revision":null,"url":"assets/extension-webview-z-UAr801.js"},{"revision":null,"url":"assets/everforest-light-CyFxGMIs.js"},{"revision":null,"url":"assets/everforest-dark-CN77B1NJ.js"},{"revision":null,"url":"assets/esm-PmlN1RTs.js"},{"revision":null,"url":"assets/erlang-B_etLcPG.js"},{"revision":null,"url":"assets/erb-DHX2IIEs.js"},{"revision":null,"url":"assets/emacs-lisp-B7aZTnJ_.js"},{"revision":null,"url":"assets/elm-CpD28xsW.js"},{"revision":null,"url":"assets/elixir-BAX9HSOu.js"},{"revision":null,"url":"assets/edit-diff-preview-D1TEK7Jz.js"},{"revision":null,"url":"assets/edge-CTom35R_.js"},{"revision":null,"url":"assets/dream-maker-TBDKiHrV.js"},{"revision":null,"url":"assets/dracula-yI5kpKp5.js"},{"revision":null,"url":"assets/dracula-soft-CYF6cJce.js"},{"revision":null,"url":"assets/dotenv-QeT1SLTv.js"},{"revision":null,"url":"assets/docx-preview-BLQB-hLE.js"},{"revision":null,"url":"assets/docker-DjDr3TJF.js"},{"revision":null,"url":"assets/dist-m_oJqIDk.js"},{"revision":null,"url":"assets/dist-Bi4gRyhr.js"},{"revision":null,"url":"assets/diff-viewer-CCrzns7w.js"},{"revision":null,"url":"assets/diff-CupGmT1a.js"},{"revision":null,"url":"assets/dialog-HHdNInEH.js"},{"revision":null,"url":"assets/desktop-C6lD62ar.js"},{"revision":null,"url":"assets/dax-B1aRUMXT.js"},{"revision":null,"url":"assets/database-viewer-CVYeQeUc.js"},{"revision":null,"url":"assets/database-COYAMZaw.js"},{"revision":null,"url":"assets/data-grid-types-BuMHLKXV.js"},{"revision":null,"url":"assets/data-grid-overlay-editor-Bdc80TJ1.js"},{"revision":null,"url":"assets/dart-BmpakMe-.js"},{"revision":null,"url":"assets/dark-plus-sn-FFTT1.js"},{"revision":null,"url":"assets/d-CxaScvxf.js"},{"revision":null,"url":"assets/cypher-TVlMMWma.js"},{"revision":null,"url":"assets/cue-Byh1xHko.js"},{"revision":null,"url":"assets/csv-preview-CS_r0b6o.js"},{"revision":null,"url":"assets/csv-parser-DVHBcvuE.js"},{"revision":null,"url":"assets/csv-DW48Z5d-.js"},{"revision":null,"url":"assets/css-CIjciIIk.js"},{"revision":null,"url":"assets/csharp-DcR97P0D.js"},{"revision":null,"url":"assets/crystal-DMjCL--0.js"},{"revision":null,"url":"assets/createLucideIcon-ConhwJnb.js"},{"revision":null,"url":"assets/cpp-CnU9hfBq.js"},{"revision":null,"url":"assets/coq-D2bX6-8g.js"},{"revision":null,"url":"assets/context-menu-DIiZdfbE.js"},{"revision":null,"url":"assets/conflict-editor-DUHhHqpE.js"},{"revision":null,"url":"assets/common-lisp-BX1XgHTt.js"},{"revision":null,"url":"assets/coffee-DTtK7kKi.js"},{"revision":null,"url":"assets/codeql-BpP1PDrj.js"},{"revision":null,"url":"assets/codeowners-CtkKTnsH.js"},{"revision":null,"url":"assets/code-TekEnDFM.js"},{"revision":null,"url":"assets/code-editor-Dlzl3dNT.js"},{"revision":null,"url":"assets/cobol-D39V6ukp.js"},{"revision":null,"url":"assets/cmake-DsZu4U4F.js"},{"revision":null,"url":"assets/clojure-pSLH-KQp.js"},{"revision":null,"url":"assets/clarity-BRdirlsw.js"},{"revision":null,"url":"assets/circle-question-mark-PaJgx-3d.js"},{"revision":null,"url":"assets/chevron-right-DeUue2aK.js"},{"revision":null,"url":"assets/chat-tab-DbLlGvwV.js"},{"revision":null,"url":"assets/catppuccin-mocha-BeMC5hqi.js"},{"revision":null,"url":"assets/catppuccin-macchiato-B0bAzXh0.js"},{"revision":null,"url":"assets/catppuccin-latte-ZxS-ga_K.js"},{"revision":null,"url":"assets/catppuccin-frappe-Dm3rVY3b.js"},{"revision":null,"url":"assets/cairo-BboZ9qIf.js"},{"revision":null,"url":"assets/cadence-B5X2vWm3.js"},{"revision":null,"url":"assets/c3-Da53KeG6.js"},{"revision":null,"url":"assets/c-BQFvJ6Ux.js"},{"revision":null,"url":"assets/bsl-CGf6Xuyu.js"},{"revision":null,"url":"assets/bot-E9mcVZnr.js"},{"revision":null,"url":"assets/blade-BvrP2gPd.js"},{"revision":null,"url":"assets/bird2-C0pvipi_.js"},{"revision":null,"url":"assets/bicep-DWS-2uWR.js"},{"revision":null,"url":"assets/bibtex-C_q8ygAM.js"},{"revision":null,"url":"assets/berry-BqVQYZZr.js"},{"revision":null,"url":"assets/beancount-f8f3BBqB.js"},{"revision":null,"url":"assets/bat-Cg8hlSct.js"},{"revision":null,"url":"assets/ballerina-DUO9mwyV.js"},{"revision":null,"url":"assets/ayu-mirage-BAdm8pKU.js"},{"revision":null,"url":"assets/ayu-light-DyIp0Idy.js"},{"revision":null,"url":"assets/ayu-dark-C50MYKhw.js"},{"revision":null,"url":"assets/awk-Cj93pRL8.js"},{"revision":null,"url":"assets/aurora-x-BPgGL50S.js"},{"revision":null,"url":"assets/audio-preview-DkMX9OJj.js"},{"revision":null,"url":"assets/astro-CXIotiNS.js"},{"revision":null,"url":"assets/asm-p1-PUkh3.js"},{"revision":null,"url":"assets/asciidoc-CIsC4kkq.js"},{"revision":null,"url":"assets/architecture-PBZL5I3N-DVRYSsQn.js"},{"revision":null,"url":"assets/ara-BGtOX5Hn.js"},{"revision":null,"url":"assets/apply-theme-BSJDABU3.js"},{"revision":null,"url":"assets/applescript-5AlzBqQO.js"},{"revision":null,"url":"assets/apl-DSANFLx0.js"},{"revision":null,"url":"assets/api-themes-DXi8sz-9.js"},{"revision":null,"url":"assets/api-settings-Do0Z0IRN.js"},{"revision":null,"url":"assets/api-settings-De--HNHp.js"},{"revision":null,"url":"assets/api-client-RtNXvS0P.js"},{"revision":null,"url":"assets/api-client-COQtP-dB.js"},{"revision":null,"url":"assets/apex-3O2170Ju.js"},{"revision":null,"url":"assets/apache-Dg7oWQbs.js"},{"revision":null,"url":"assets/angular-ts-CUvq2h3X.js"},{"revision":null,"url":"assets/angular-html-D4YJUMLP.js"},{"revision":null,"url":"assets/andromeeda-C3nkvRhj.js"},{"revision":null,"url":"assets/ai-resource-editor-Bc1JjqQ2.js"},{"revision":null,"url":"assets/ada-DzO1tMqV.js"},{"revision":null,"url":"assets/actionscript-3-CML-MTNy.js"},{"revision":null,"url":"assets/abap-BM5PMK0-.js"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-192.svg"},{"revision":"a0fb34fc84eb148d51812cd62669f20d","url":"icon-512.svg"},{"revision":"26dccd02a2ef7522892015154f5e3680","url":"manifest.webmanifest"}]);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hienlh/ppm",
|
|
3
|
-
"version": "0.17.
|
|
4
|
-
"description": "Personal Project Manager
|
|
3
|
+
"version": "0.17.54",
|
|
4
|
+
"description": "Personal Project Manager  mobile-first web IDE with AI assistance",
|
|
5
5
|
"author": "hienlh",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
7
7
|
"module": "src/index.ts",
|
|
@@ -1806,6 +1806,23 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1806
1806
|
const result = msg as any;
|
|
1807
1807
|
const subtype = result.subtype as string | undefined;
|
|
1808
1808
|
|
|
1809
|
+
// The SDK closes out background deliveries with a result of their own —
|
|
1810
|
+
// notably the orphaned-task notifications it replays on resume. Those carry
|
|
1811
|
+
// origin 'task-notification' with no turns, no usage and duration_api_ms 0:
|
|
1812
|
+
// no request ever reached the API. Treating one as the end of the user's turn
|
|
1813
|
+
// raised a bogus "Claude returned no response (0 turns)", yielded `done`, and
|
|
1814
|
+
// flipped the session to idle while the real turn was still streaming.
|
|
1815
|
+
// Only the empty ones are ignored: a scheduled-trigger delivery shares this
|
|
1816
|
+
// origin but does run a real turn, and must still be allowed to finish.
|
|
1817
|
+
if (
|
|
1818
|
+
result.origin?.kind === "task-notification"
|
|
1819
|
+
&& (result.num_turns ?? 0) === 0
|
|
1820
|
+
&& !assistantContent
|
|
1821
|
+
) {
|
|
1822
|
+
console.log(`[sdk] session=${sessionId} ignoring empty task-notification result (no turn ran)`);
|
|
1823
|
+
continue;
|
|
1824
|
+
}
|
|
1825
|
+
|
|
1809
1826
|
// Write cost to shared usage cache
|
|
1810
1827
|
if (result.total_cost_usd != null) {
|
|
1811
1828
|
updateFromSdkEvent(undefined, undefined, result.total_cost_usd);
|
package/src/server/index.ts
CHANGED
|
@@ -942,15 +942,17 @@ if (process.argv.includes("__serve__")) {
|
|
|
942
942
|
}, 200);
|
|
943
943
|
}
|
|
944
944
|
|
|
945
|
-
// Publish the port we actually bound
|
|
946
|
-
//
|
|
947
|
-
//
|
|
948
|
-
//
|
|
949
|
-
//
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
945
|
+
// Publish the port we actually bound so the edge forwarder knows where to
|
|
946
|
+
// send traffic. Only meaningful when the supervisor spawned us with port 0
|
|
947
|
+
// (OS-assigned); a dev server on a fixed port (e.g. `bun dev:server` on 8081)
|
|
948
|
+
// serves directly and must NOT overwrite this file — doing so redirects all
|
|
949
|
+
// production tunnel traffic to the dev instance.
|
|
950
|
+
if (port === 0) {
|
|
951
|
+
try {
|
|
952
|
+
writeFileSync(SERVER_PORT_FILE(), String(server.port));
|
|
953
|
+
} catch (e) {
|
|
954
|
+
console.error(`[serve] Failed to publish server port: ${e}`);
|
|
955
|
+
}
|
|
954
956
|
}
|
|
955
957
|
|
|
956
958
|
console.log(`Server child ready on port ${server.port}`);
|
|
@@ -79,7 +79,7 @@ settingsRoutes.put("/device-name", async (c) => {
|
|
|
79
79
|
|
|
80
80
|
/** GET /settings/theme — returns the {style, mode, customThemeId?} object */
|
|
81
81
|
settingsRoutes.get("/theme", (c) => {
|
|
82
|
-
const theme = configService.get("theme") ?? { style: "aurora", mode: "
|
|
82
|
+
const theme = configService.get("theme") ?? { style: "aurora", mode: "system" };
|
|
83
83
|
return c.json(ok({ theme }));
|
|
84
84
|
});
|
|
85
85
|
|
|
@@ -63,6 +63,10 @@ let adoptedTunnelPid: number | null = null; // PID of tunnel kept alive across u
|
|
|
63
63
|
// survives self-replace, so a new supervisor adopts it rather than respawning.
|
|
64
64
|
let edgePid: number | null = null;
|
|
65
65
|
let edgeProbeTimer: ReturnType<typeof setInterval> | null = null;
|
|
66
|
+
// The loopback port our own server child published. Cleared on every respawn so
|
|
67
|
+
// a stale value never fights the incoming generation. Once set, it makes the
|
|
68
|
+
// supervisor the authority on what `.server-port` should contain.
|
|
69
|
+
let serverPublishedPort: number | null = null;
|
|
66
70
|
let shuttingDown = false;
|
|
67
71
|
// Monotonic token for the authoritative tunnel loop. Every EXTERNAL (re)start
|
|
68
72
|
// bumps it; a loop whose captured generation is stale must exit instead of
|
|
@@ -423,6 +427,7 @@ async function mirrorServerPort(): Promise<void> {
|
|
|
423
427
|
_resetTargetCache(); // the memo is for the forwarder's hot path, not this poll
|
|
424
428
|
const port = resolveTargetPort();
|
|
425
429
|
if (port !== null) {
|
|
430
|
+
serverPublishedPort = port;
|
|
426
431
|
updateStatus({ serverPort: port });
|
|
427
432
|
log("INFO", `Server bound loopback port ${port}`);
|
|
428
433
|
return;
|
|
@@ -432,6 +437,38 @@ async function mirrorServerPort(): Promise<void> {
|
|
|
432
437
|
log("WARN", "Server never published its port — status.serverPort left stale");
|
|
433
438
|
}
|
|
434
439
|
|
|
440
|
+
/**
|
|
441
|
+
* Repair `.server-port` when another process overwrites it.
|
|
442
|
+
*
|
|
443
|
+
* The file is the edge's routing table and lives in the shared `~/.ppm`, so
|
|
444
|
+
* ANY process running the `__serve__` entry can clobber it — most easily
|
|
445
|
+
* `bun dev:server`, which is not PPM_HOME-isolated and only differs by DB
|
|
446
|
+
* profile. When that happens the production tunnel silently serves the dev
|
|
447
|
+
* instance. The server-side guard (only a port-0, supervisor-spawned server
|
|
448
|
+
* publishes) stops new writes, but a value left behind by an older build would
|
|
449
|
+
* otherwise persist until the server restarts.
|
|
450
|
+
*
|
|
451
|
+
* After the initial handshake the supervisor knows the port its own child
|
|
452
|
+
* published, so it is the authority. It still does not write the file on the
|
|
453
|
+
* happy path — only to undo someone else's write.
|
|
454
|
+
*/
|
|
455
|
+
function repairServerPortFile(): void {
|
|
456
|
+
if (serverPublishedPort === null || !serverChild) return;
|
|
457
|
+
_resetTargetCache();
|
|
458
|
+
const onDisk = resolveTargetPort();
|
|
459
|
+
if (onDisk === serverPublishedPort) return;
|
|
460
|
+
log(
|
|
461
|
+
"WARN",
|
|
462
|
+
`.server-port says ${onDisk ?? "nothing"} but our server child is on ${serverPublishedPort} — another process (a dev server?) hijacked the edge's target; restoring`,
|
|
463
|
+
);
|
|
464
|
+
try {
|
|
465
|
+
writeFileSync(SERVER_PORT_FILE(), String(serverPublishedPort));
|
|
466
|
+
_resetTargetCache();
|
|
467
|
+
} catch (e) {
|
|
468
|
+
log("ERROR", `Failed to restore .server-port: ${e}`);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
435
472
|
// ─── Server management ─────────────────────────────────────────────────
|
|
436
473
|
export async function spawnServer(
|
|
437
474
|
serverArgs: string[],
|
|
@@ -456,7 +493,9 @@ export async function spawnServer(
|
|
|
456
493
|
// Zombie-port handling now applies only to the edge's public port.
|
|
457
494
|
//
|
|
458
495
|
// Clear the stale port file so the mirror below cannot publish the previous
|
|
459
|
-
// generation's port to `ppm status
|
|
496
|
+
// generation's port to `ppm status`, and drop our record of it so
|
|
497
|
+
// repairServerPortFile does not restore a port that just died.
|
|
498
|
+
serverPublishedPort = null;
|
|
460
499
|
try { unlinkSync(SERVER_PORT_FILE()); } catch {}
|
|
461
500
|
const cmd = isCompiledBinary()
|
|
462
501
|
? [process.execPath, ...serverArgs]
|
|
@@ -784,6 +823,10 @@ function startServerHealthCheck() {
|
|
|
784
823
|
return;
|
|
785
824
|
}
|
|
786
825
|
noServerChildCycles = 0;
|
|
826
|
+
// Undo any foreign write to `.server-port` before reading it, or the probe
|
|
827
|
+
// below would health-check a dev server and report our own as fine while
|
|
828
|
+
// the public tunnel serves the wrong instance.
|
|
829
|
+
repairServerPortFile();
|
|
787
830
|
// Probe the SERVER's own loopback port, never `_opts.port` — that is the
|
|
788
831
|
// public port and belongs to the edge. Probing through the edge would make
|
|
789
832
|
// a dead edge look like a dead server and kill a perfectly healthy one
|
package/src/types/config.ts
CHANGED
|
@@ -98,7 +98,7 @@ export const DEFAULT_CONFIG: PpmConfig = {
|
|
|
98
98
|
device_name: "",
|
|
99
99
|
port: 8080,
|
|
100
100
|
host: "0.0.0.0",
|
|
101
|
-
theme: { style: "aurora", mode: "
|
|
101
|
+
theme: { style: "aurora", mode: "system" },
|
|
102
102
|
auth: { enabled: true, token: "" },
|
|
103
103
|
projects: [],
|
|
104
104
|
ai: {
|
|
@@ -145,24 +145,25 @@ const VALID_THEME_MODES: ThemeMode[] = ["light", "dark", "system"];
|
|
|
145
145
|
/**
|
|
146
146
|
* Coerce a persisted theme value into the `{style, mode}` object shape.
|
|
147
147
|
* Migrates the legacy string form (`"dark"` → `{style:"aurora", mode:"dark"}`).
|
|
148
|
+
* Anything unrecognised falls back to `mode: "system"`, matching DEFAULT_CONFIG.
|
|
148
149
|
* Returns null if the input is already a valid object (no change needed).
|
|
149
150
|
*/
|
|
150
151
|
function migrateThemeValue(theme: unknown): ThemeConfig | null {
|
|
151
152
|
if (typeof theme === "string") {
|
|
152
|
-
const mode = (VALID_THEME_MODES as string[]).includes(theme) ? (theme as ThemeMode) : "
|
|
153
|
+
const mode = (VALID_THEME_MODES as string[]).includes(theme) ? (theme as ThemeMode) : "system";
|
|
153
154
|
return { style: "aurora", mode };
|
|
154
155
|
}
|
|
155
156
|
if (theme && typeof theme === "object") {
|
|
156
157
|
const t = theme as Partial<ThemeConfig>;
|
|
157
158
|
const style = typeof t.style === "string" && t.style ? t.style : "aurora";
|
|
158
|
-
const mode = (VALID_THEME_MODES as string[]).includes(t.mode as string) ? (t.mode as ThemeMode) : "
|
|
159
|
+
const mode = (VALID_THEME_MODES as string[]).includes(t.mode as string) ? (t.mode as ThemeMode) : "system";
|
|
159
160
|
const next: ThemeConfig = { style, mode };
|
|
160
161
|
if (typeof t.customThemeId === "string") next.customThemeId = t.customThemeId;
|
|
161
162
|
// Signal change only when the incoming object was malformed.
|
|
162
163
|
if (t.style === style && t.mode === mode && t.customThemeId === next.customThemeId) return null;
|
|
163
164
|
return next;
|
|
164
165
|
}
|
|
165
|
-
return { style: "aurora", mode: "
|
|
166
|
+
return { style: "aurora", mode: "system" };
|
|
166
167
|
}
|
|
167
168
|
|
|
168
169
|
/** Validate AI provider config fields. Returns array of error messages (empty = valid). */
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
1
|
+
import { useRef, useState } from "react";
|
|
2
2
|
import { Button } from "@/components/ui/button";
|
|
3
3
|
import { Input } from "@/components/ui/input";
|
|
4
4
|
import { setAuthToken } from "@/lib/api-client";
|
|
@@ -17,6 +17,7 @@ import { useIsMobile } from "@/hooks/use-is-mobile";
|
|
|
17
17
|
import { openBugReportPopup } from "@/lib/report-bug";
|
|
18
18
|
import { SupportDialog } from "@/components/auth/support-dialog";
|
|
19
19
|
import { BugReportPopup } from "@/components/shared/bug-report-popup";
|
|
20
|
+
import { ThemeModeMenu } from "@/components/shared/theme-mode-menu";
|
|
20
21
|
import { cn } from "@/lib/utils";
|
|
21
22
|
|
|
22
23
|
interface LoginScreenProps {
|
|
@@ -25,15 +26,17 @@ interface LoginScreenProps {
|
|
|
25
26
|
|
|
26
27
|
const REPO_URL = "https://github.com/hienlh/ppm";
|
|
27
28
|
|
|
28
|
-
// Decorative, one-off background layers (
|
|
29
|
-
//
|
|
29
|
+
// Decorative, one-off background layers (accent glow + faint dot grid). Both
|
|
30
|
+
// derive from theme tokens so they invert with the mode -- the dot grid mixes
|
|
31
|
+
// off --text, which is near-white on dark themes and near-navy on light ones.
|
|
32
|
+
// Kept inline rather than introducing decoration-only tokens.
|
|
30
33
|
const GLOW_STYLE: React.CSSProperties = {
|
|
31
34
|
background:
|
|
32
35
|
"radial-gradient(80% 60% at 50% -10%, color-mix(in srgb, var(--accent) 12%, transparent) 0%, transparent 60%)",
|
|
33
36
|
};
|
|
34
37
|
const DOTS_STYLE: React.CSSProperties = {
|
|
35
38
|
backgroundImage:
|
|
36
|
-
"radial-gradient(circle at 1px 1px,
|
|
39
|
+
"radial-gradient(circle at 1px 1px, color-mix(in srgb, var(--text) 5%, transparent) 1px, transparent 0)",
|
|
37
40
|
backgroundSize: "26px 26px",
|
|
38
41
|
};
|
|
39
42
|
|
|
@@ -47,6 +50,11 @@ export function LoginScreen({ onSuccess }: LoginScreenProps) {
|
|
|
47
50
|
const [loading, setLoading] = useState(false);
|
|
48
51
|
const [supportOpen, setSupportOpen] = useState(false);
|
|
49
52
|
const isMobile = useIsMobile();
|
|
53
|
+
const themeMode = useSettingsStore((s) => s.themeMode);
|
|
54
|
+
const syncThemeToServer = useSettingsStore((s) => s.syncThemeToServer);
|
|
55
|
+
// Only a mode the user actually chose here should overwrite the stored one.
|
|
56
|
+
const initialThemeMode = useRef(themeMode);
|
|
57
|
+
const themeModeTouched = themeMode !== initialThemeMode.current;
|
|
50
58
|
|
|
51
59
|
async function handleSubmit(e: React.FormEvent) {
|
|
52
60
|
e.preventDefault();
|
|
@@ -70,6 +78,11 @@ export function LoginScreen({ onSuccess }: LoginScreenProps) {
|
|
|
70
78
|
throw new Error(json.error ?? "Invalid password");
|
|
71
79
|
}
|
|
72
80
|
|
|
81
|
+
// The token is valid now, so a mode chosen on this screen can finally be
|
|
82
|
+
// persisted server-side. Must complete before onSuccess(): that flips auth
|
|
83
|
+
// state, which refetches the server theme and would otherwise win the race.
|
|
84
|
+
if (themeModeTouched) await syncThemeToServer();
|
|
85
|
+
|
|
73
86
|
onSuccess();
|
|
74
87
|
} catch (err) {
|
|
75
88
|
setError(err instanceof Error ? err.message : "Authentication failed");
|
|
@@ -88,6 +101,11 @@ export function LoginScreen({ onSuccess }: LoginScreenProps) {
|
|
|
88
101
|
<div className="pointer-events-none absolute inset-0" style={GLOW_STYLE} />
|
|
89
102
|
<div className="pointer-events-none absolute inset-0" style={DOTS_STYLE} />
|
|
90
103
|
|
|
104
|
+
{/* Appearance switch. The theme endpoint is auth-gated, so a fresh origin
|
|
105
|
+
has no stored preference to read — without this the login screen would
|
|
106
|
+
be stuck on whatever the OS reports. */}
|
|
107
|
+
<ThemeModeMenu className="absolute right-[max(1rem,env(safe-area-inset-right))] top-[max(1rem,env(safe-area-inset-top))]" />
|
|
108
|
+
|
|
91
109
|
<div className="relative flex w-full max-w-[392px] flex-col items-center gap-[22px] text-center">
|
|
92
110
|
{/* Brand mark */}
|
|
93
111
|
<div className="flex flex-col items-center gap-4">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useState, useCallback, useRef } from "react";
|
|
2
2
|
import {
|
|
3
|
-
|
|
3
|
+
Bell, Check, ChevronRight, ArrowLeft,
|
|
4
4
|
Bot, BellRing, Keyboard, Globe, Puzzle, Bug, FolderSearch, WrapText, CalendarClock, DatabaseZap,
|
|
5
5
|
} from "lucide-react";
|
|
6
6
|
import { Button } from "@/components/ui/button";
|
|
@@ -10,7 +10,6 @@ import { ScrollArea } from "@/components/ui/scroll-area";
|
|
|
10
10
|
import { Separator } from "@/components/ui/separator";
|
|
11
11
|
import { useShallow } from "zustand/react/shallow";
|
|
12
12
|
import { useSettingsStore, type EditorTabStyle } from "@/stores/settings-store";
|
|
13
|
-
import type { PpmThemeMode } from "@/theme/types";
|
|
14
13
|
import { cn } from "@/lib/utils";
|
|
15
14
|
import { AISettingsSection } from "./ai-settings-section";
|
|
16
15
|
import { KeyboardShortcutsSection } from "./keyboard-shortcuts-section";
|
|
@@ -23,11 +22,7 @@ import { SchedulesSettingsSection } from "./schedules/schedules-settings-section
|
|
|
23
22
|
import { ThemeManagerSection } from "./theme-manager-section";
|
|
24
23
|
import { QueryAuditSection } from "./query-audit-section";
|
|
25
24
|
import { ThemeGrid } from "./theme-grid";
|
|
26
|
-
|
|
27
|
-
{ value: "light", label: "Light", icon: Sun },
|
|
28
|
-
{ value: "dark", label: "Dark", icon: Moon },
|
|
29
|
-
{ value: "system", label: "System", icon: Monitor },
|
|
30
|
-
];
|
|
25
|
+
import { THEME_MODE_OPTIONS } from "@/theme/theme-mode-options";
|
|
31
26
|
|
|
32
27
|
const TAB_STYLE_OPTIONS: { value: EditorTabStyle; label: string }[] = [
|
|
33
28
|
{ value: "default", label: "Default" },
|
|
@@ -155,7 +150,7 @@ export function SettingsTab() {
|
|
|
155
150
|
<ThemeGrid />
|
|
156
151
|
{/* Mode override (applies within the selected style; System follows OS) */}
|
|
157
152
|
<div className="flex gap-1.5 pt-1">
|
|
158
|
-
{
|
|
153
|
+
{THEME_MODE_OPTIONS.map((opt) => {
|
|
159
154
|
const Icon = opt.icon;
|
|
160
155
|
return (
|
|
161
156
|
<Button
|