@hienlh/ppm 0.17.51 → 0.17.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/.rollout-mark +2 -0
  2. package/CHANGELOG.md +11 -0
  3. package/assets/skills/ppm/SKILL.md +1 -1
  4. package/assets/skills/ppm/references/http-api.md +1 -1
  5. package/dist/web/assets/{ai-resource-editor-x8J0omsj.js → ai-resource-editor-D12van6q.js} +1 -1
  6. package/dist/web/assets/{audio-preview-Bdf_SZHY.js → audio-preview-C3YJNKjD.js} +1 -1
  7. package/dist/web/assets/{chat-tab-CT6SP5D3.js → chat-tab-B6Elb3uK.js} +3 -3
  8. package/dist/web/assets/{code-editor-BgsJkCtK.js → code-editor-DM-ay_BF.js} +2 -2
  9. package/dist/web/assets/{conflict-editor-DdSe9RCG.js → conflict-editor-4rb0oS2i.js} +1 -1
  10. package/dist/web/assets/{csv-preview-DrUfLPRE.js → csv-preview-Bqfk0OeJ.js} +1 -1
  11. package/dist/web/assets/{database-viewer-1NLuRknj.js → database-viewer-CrBOZBE4.js} +1 -1
  12. package/dist/web/assets/{diff-viewer-DPn8QJXG.js → diff-viewer-BX02Fg5_.js} +1 -1
  13. package/dist/web/assets/{docx-preview-BUVtMDQF.js → docx-preview-rR_dLI4P.js} +1 -1
  14. package/dist/web/assets/{extension-webview-CEdJP2XP.js → extension-webview-D4rHB1h7.js} +1 -1
  15. package/dist/web/assets/{git-log-panel-ClLf6-as.js → git-log-panel-BryqAkz2.js} +1 -1
  16. package/dist/web/assets/{glide-data-grid-CBhv99Ii.js → glide-data-grid-CcGfgB3d.js} +1 -1
  17. package/dist/web/assets/{group-chat-tab-KTKtMy6L.js → group-chat-tab-rB8JuZIe.js} +1 -1
  18. package/dist/web/assets/{image-preview-DYyo-Twv.js → image-preview-i-jTDsjR.js} +1 -1
  19. package/dist/web/assets/{index-BiBAhdYZ.js → index-C4m82SWg.js} +22 -22
  20. package/dist/web/assets/{keybindings-store-C1yAVIlX.js → keybindings-store-C3dkxGGX.js} +1 -1
  21. package/dist/web/assets/{markdown-renderer-JNQd7xG0.js → markdown-renderer-DEXzjjQ8.js} +1 -1
  22. package/dist/web/assets/{markdown-renderer-CCBPLJC7.js → markdown-renderer-PbB8SlkU.js} +1 -1
  23. package/dist/web/assets/{notification-store-lQg17iIv.js → notification-store-6-9K7U26.js} +1 -1
  24. package/dist/web/assets/{pdf-preview-CWnXgjqc.js → pdf-preview-k7xI6wlU.js} +1 -1
  25. package/dist/web/assets/{postgres-viewer-BIXfNiGy.js → postgres-viewer-5zQgJlQz.js} +1 -1
  26. package/dist/web/assets/{settings-tab-CpltHPv5.js → settings-tab-DDNHT-XP.js} +1 -1
  27. package/dist/web/assets/{sql-query-editor-BDTzbvEM.js → sql-query-editor-CYLWqNpT.js} +1 -1
  28. package/dist/web/assets/{sqlite-viewer-BkOrBWZP.js → sqlite-viewer-DANvopw7.js} +1 -1
  29. package/dist/web/assets/{system-monitor-tab-s0Jm9zah.js → system-monitor-tab-Cfs1hq4q.js} +1 -1
  30. package/dist/web/assets/{terminal-tab-D3S_kz4Y.js → terminal-tab-CTB-qo9d.js} +1 -1
  31. package/dist/web/assets/{tool-cards-DbhWrJ_o.js → tool-cards-BBr3Pix3.js} +2 -2
  32. package/dist/web/assets/{use-monaco-theme-DKGvvHk1.js → use-monaco-theme-BJHYbrpI.js} +1 -1
  33. package/dist/web/assets/{video-preview-BCU0PfT1.js → video-preview-Dv1PD_Rj.js} +1 -1
  34. package/dist/web/index.html +1 -1
  35. package/dist/web/sw.js +1 -1
  36. package/docker-compose.test.yml +3 -0
  37. package/package.json +2 -2
  38. package/src/cli/commands/init.ts +2 -10
  39. package/src/providers/claude-agent-sdk.ts +19 -10
  40. package/src/server/index.ts +11 -9
  41. package/src/services/supervisor.ts +44 -1
  42. package/src/types/claude-models.ts +41 -0
  43. package/src/types/config.ts +3 -1
  44. package/src/web/components/settings/proxy-test-section.tsx +4 -8
  45. package/src/web/components/shared/theme-mode-menu.tsx +74 -0
  46. package/src/web/theme/theme-mode-options.ts +17 -0
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":"f62c5de1207c3fca4a2426d64b0a1d7c","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-BCU0PfT1.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-DKGvvHk1.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-DbhWrJ_o.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-D3S_kz4Y.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-s0Jm9zah.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-BkOrBWZP.js"},{"revision":null,"url":"assets/sql-query-editor-BDTzbvEM.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-CpltHPv5.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-BIXfNiGy.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-CWnXgjqc.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-lQg17iIv.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-JNQd7xG0.js"},{"revision":null,"url":"assets/markdown-renderer-CCBPLJC7.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-C1yAVIlX.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-BiBAhdYZ.js"},{"revision":null,"url":"assets/index-6_hleyhK.css"},{"revision":null,"url":"assets/imba-aiXalPnK.js"},{"revision":null,"url":"assets/image-preview-DYyo-Twv.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-KTKtMy6L.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-CBhv99Ii.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-ClLf6-as.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-CEdJP2XP.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-BUVtMDQF.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-DPn8QJXG.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-1NLuRknj.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-DrUfLPRE.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-DdSe9RCG.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-BgsJkCtK.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-CT6SP5D3.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-Bdf_SZHY.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-x8J0omsj.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":"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"}]);
@@ -11,6 +11,9 @@ services:
11
11
  build:
12
12
  context: .
13
13
  dockerfile: Dockerfile.test
14
+ # Run under an init process: bun as PID 1 never reaps orphans, so a killed
15
+ # descendant lingers as a zombie and process-liveness checks read it as alive.
16
+ init: true
14
17
  environment:
15
18
  PPM_SKIP_LIVE: "1"
16
19
  volumes:
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hienlh/ppm",
3
- "version": "0.17.51",
4
- "description": "Personal Project Manager — mobile-first web IDE with AI assistance",
3
+ "version": "0.17.53",
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",
@@ -4,6 +4,7 @@ import { input, confirm, select, password } from "@inquirer/prompts";
4
4
  import { configService } from "../../services/config.service.ts";
5
5
  import { projectService } from "../../services/project.service.ts";
6
6
  import { getAllConfig } from "../../services/db.service.ts";
7
+ import { CLAUDE_MODELS, claudeModelInitName } from "../../types/claude-models.ts";
7
8
 
8
9
  const DEFAULT_PORT = 3210;
9
10
 
@@ -118,16 +119,7 @@ export async function initProject(options: InitOptions = {}) {
118
119
  if (wantAdvanced) {
119
120
  aiModel = await select({
120
121
  message: "AI model:",
121
- choices: [
122
- { value: "claude-opus-5", name: "Claude Opus 5 (most powerful)" },
123
- { value: "claude-fable-5", name: "Claude Fable 5 (flagship)" },
124
- { value: "claude-opus-4-8", name: "Claude Opus 4.8 (powerful)" },
125
- { value: "claude-opus-4-7", name: "Claude Opus 4.7 (powerful)" },
126
- { value: "claude-opus-4-6", name: "Claude Opus 4.6 (powerful)" },
127
- { value: "claude-sonnet-5", name: "Claude Sonnet 5 (fast)" },
128
- { value: "claude-sonnet-4-6", name: "Claude Sonnet 4.6 (fast)" },
129
- { value: "claude-haiku-4-5", name: "Claude Haiku 4.5 (cheap)" },
130
- ],
122
+ choices: CLAUDE_MODELS.map((m) => ({ value: m.value, name: claudeModelInitName(m) })),
131
123
  default: "claude-opus-5",
132
124
  });
133
125
 
@@ -5,6 +5,7 @@ import {
5
5
  getSessionMessages,
6
6
  } from "@anthropic-ai/claude-agent-sdk";
7
7
  import { buildModelQueryOptions } from "./claude-agent-sdk-query-options.ts";
8
+ import { CLAUDE_MODELS } from "../types/claude-models.ts";
8
9
  import { isImageLimitRejection } from "./image-limit-detection.ts";
9
10
  import type {
10
11
  AIProvider,
@@ -702,16 +703,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
702
703
  }
703
704
 
704
705
  async listModels(): Promise<ModelOption[]> {
705
- return [
706
- { value: "claude-opus-5", label: "Claude Opus 5" },
707
- { value: "claude-fable-5", label: "Claude Fable 5 (flagship)" },
708
- { value: "claude-opus-4-8", label: "Claude Opus 4.8" },
709
- { value: "claude-opus-4-7", label: "Claude Opus 4.7" },
710
- { value: "claude-opus-4-6", label: "Claude Opus 4.6" },
711
- { value: "claude-sonnet-5", label: "Claude Sonnet 5" },
712
- { value: "claude-sonnet-4-6", label: "Claude Sonnet 4.6" },
713
- { value: "claude-haiku-4-5", label: "Claude Haiku 4.5" },
714
- ];
706
+ return CLAUDE_MODELS.map(({ value, label }) => ({ value, label }));
715
707
  }
716
708
 
717
709
  /**
@@ -1814,6 +1806,23 @@ export class ClaudeAgentSdkProvider implements AIProvider {
1814
1806
  const result = msg as any;
1815
1807
  const subtype = result.subtype as string | undefined;
1816
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
+
1817
1826
  // Write cost to shared usage cache
1818
1827
  if (result.total_cost_usd != null) {
1819
1828
  updateFromSdkEvent(undefined, undefined, result.total_cost_usd);
@@ -942,15 +942,17 @@ if (process.argv.includes("__serve__")) {
942
942
  }, 200);
943
943
  }
944
944
 
945
- // Publish the port we actually bound. With `port: 0` the OS picks it, so this
946
- // file is the only way anything else can find the server — the edge forwarder
947
- // reads it to know where to send traffic, and the supervisor mirrors it into
948
- // status.json. The server is the single writer; see edge-target-resolver.ts
949
- // for why this is not status.json.
950
- try {
951
- writeFileSync(SERVER_PORT_FILE(), String(server.port));
952
- } catch (e) {
953
- console.error(`[serve] Failed to publish server port: ${e}`);
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}`);
@@ -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
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Single source of truth for the Claude models PPM offers.
3
+ *
4
+ * Consumed by config validation, the agent-SDK provider model dropdown,
5
+ * `ppm init`, and the proxy test dialog — adding a model means editing
6
+ * this list only.
7
+ *
8
+ * Invite-only models (e.g. Claude Mythos, Project Glasswing) are omitted on
9
+ * purpose: they would appear as selectable options that fail at request time
10
+ * for accounts without access.
11
+ */
12
+
13
+ export interface ClaudeModelOption {
14
+ /** Model ID sent to the Claude API / Agent SDK. */
15
+ value: string;
16
+ /** Short label for UI dropdowns. */
17
+ label: string;
18
+ /** Capability hint shown next to the label in the `ppm init` prompt. */
19
+ hint: string;
20
+ }
21
+
22
+ /** Ordered newest/most-capable first; the first entry is not automatically the default. */
23
+ export const CLAUDE_MODELS: readonly ClaudeModelOption[] = [
24
+ { value: "claude-opus-5", label: "Claude Opus 5", hint: "most powerful" },
25
+ { value: "claude-fable-5-1", label: "Claude Fable 5.1", hint: "flagship" },
26
+ { value: "claude-fable-5", label: "Claude Fable 5", hint: "flagship" },
27
+ { value: "claude-opus-4-8", label: "Claude Opus 4.8", hint: "powerful" },
28
+ { value: "claude-opus-4-7", label: "Claude Opus 4.7", hint: "powerful" },
29
+ { value: "claude-opus-4-6", label: "Claude Opus 4.6", hint: "powerful" },
30
+ { value: "claude-sonnet-5", label: "Claude Sonnet 5", hint: "fast" },
31
+ { value: "claude-sonnet-4-6", label: "Claude Sonnet 4.6", hint: "fast" },
32
+ { value: "claude-haiku-4-5", label: "Claude Haiku 4.5", hint: "cheap" },
33
+ ];
34
+
35
+ /** Model IDs accepted by config validation. */
36
+ export const CLAUDE_MODEL_IDS: readonly string[] = CLAUDE_MODELS.map((m) => m.value);
37
+
38
+ /** Label used by the `ppm init` model prompt, e.g. "Claude Opus 5 (most powerful)". */
39
+ export function claudeModelInitName(model: ClaudeModelOption): string {
40
+ return `${model.label} (${model.hint})`;
41
+ }
@@ -1,3 +1,5 @@
1
+ import { CLAUDE_MODEL_IDS } from "./claude-models.ts";
2
+
1
3
  export interface TelegramConfig {
2
4
  bot_token: string;
3
5
  }
@@ -133,7 +135,7 @@ export const DEFAULT_CONFIG: PpmConfig = {
133
135
 
134
136
  const VALID_TYPES = ["agent-sdk", "cli", "mock"] as const;
135
137
  const VALID_EFFORTS = ["low", "medium", "high", "xhigh", "max"] as const;
136
- const VALID_MODELS = ["claude-opus-5", "claude-fable-5", "claude-opus-4-8", "claude-opus-4-7", "claude-opus-4-6", "claude-sonnet-5", "claude-sonnet-4-6", "claude-haiku-4-5"] as const;
138
+ const VALID_MODELS = CLAUDE_MODEL_IDS;
137
139
  /** Allowed CLI commands for CLI providers (prevents command injection) */
138
140
  const VALID_CLI_COMMANDS = ["cursor-agent", "codex", "gemini"] as const;
139
141
  /** Only these values are allowed for default_provider in config */
@@ -3,6 +3,7 @@ import { Play, Loader2, FlaskConical } from "lucide-react";
3
3
  import { Button } from "@/components/ui/button";
4
4
  import { Input } from "@/components/ui/input";
5
5
  import { Label } from "@/components/ui/label";
6
+ import { CLAUDE_MODELS } from "../../../types/claude-models";
6
7
  import {
7
8
  Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogTrigger,
8
9
  } from "@/components/ui/dialog";
@@ -159,14 +160,9 @@ function ProxyTestForm({ authKey, baseUrl }: ProxyTestDialogProps) {
159
160
  onChange={(e) => setModel(e.target.value)}
160
161
  className="h-8 w-full rounded-md border bg-background px-2 text-[11px]"
161
162
  >
162
- <option value="claude-opus-5">claude-opus-5</option>
163
- <option value="claude-fable-5">claude-fable-5</option>
164
- <option value="claude-opus-4-8">claude-opus-4-8</option>
165
- <option value="claude-opus-4-7">claude-opus-4-7</option>
166
- <option value="claude-opus-4-6">claude-opus-4-6</option>
167
- <option value="claude-sonnet-5">claude-sonnet-5</option>
168
- <option value="claude-sonnet-4-6">claude-sonnet-4-6</option>
169
- <option value="claude-haiku-4-5">claude-haiku-4-5</option>
163
+ {CLAUDE_MODELS.map((m) => (
164
+ <option key={m.value} value={m.value}>{m.value}</option>
165
+ ))}
170
166
  </select>
171
167
  </div>
172
168
 
@@ -0,0 +1,74 @@
1
+ import { memo } from "react";
2
+ import { Check } from "lucide-react";
3
+ import {
4
+ DropdownMenu,
5
+ DropdownMenuTrigger,
6
+ DropdownMenuContent,
7
+ DropdownMenuLabel,
8
+ DropdownMenuItem,
9
+ } from "@/components/ui/dropdown-menu";
10
+ import { useSettingsStore } from "@/stores/settings-store";
11
+ import { THEME_MODE_OPTIONS } from "@/theme/theme-mode-options";
12
+ import { cn } from "@/lib/utils";
13
+
14
+ interface ThemeModeMenuProps {
15
+ /** Positioning / spacing for the trigger button. */
16
+ className?: string;
17
+ }
18
+
19
+ /**
20
+ * Icon-button dropdown for picking the theme mode (Light / Dark / System).
21
+ *
22
+ * Mode-only on purpose: this is used where the full theme *style* grid does not
23
+ * fit or is not yet reachable (the login screen runs pre-auth, so imported
24
+ * themes cannot be fetched). The trigger is a 44px touch target per the
25
+ * mobile-first UI rules.
26
+ */
27
+ export const ThemeModeMenu = memo(function ThemeModeMenu({ className }: ThemeModeMenuProps) {
28
+ const themeMode = useSettingsStore((s) => s.themeMode);
29
+ const setThemeMode = useSettingsStore((s) => s.setThemeMode);
30
+
31
+ const active = THEME_MODE_OPTIONS.find((o) => o.value === themeMode) ?? THEME_MODE_OPTIONS[2]!;
32
+ const ActiveIcon = active.icon;
33
+
34
+ return (
35
+ <DropdownMenu>
36
+ <DropdownMenuTrigger asChild>
37
+ <button
38
+ type="button"
39
+ title={`Appearance: ${active.label}`}
40
+ aria-label={`Appearance: ${active.label}`}
41
+ className={cn(
42
+ "flex size-11 items-center justify-center rounded-xl text-text-subtle",
43
+ "can-hover:hover:bg-surface-elevated can-hover:hover:text-foreground",
44
+ className,
45
+ )}
46
+ >
47
+ <ActiveIcon className="size-[18px]" />
48
+ </button>
49
+ </DropdownMenuTrigger>
50
+ <DropdownMenuContent align="end" className="w-44">
51
+ <DropdownMenuLabel>Appearance</DropdownMenuLabel>
52
+ {THEME_MODE_OPTIONS.map((opt) => {
53
+ const Icon = opt.icon;
54
+ return (
55
+ <DropdownMenuItem
56
+ key={opt.value}
57
+ onClick={() => setThemeMode(opt.value)}
58
+ className="gap-2"
59
+ >
60
+ <Icon className="size-4 shrink-0" />
61
+ <span className="flex-1 truncate">{opt.label}</span>
62
+ <Check
63
+ className={cn(
64
+ "size-4 shrink-0",
65
+ themeMode === opt.value ? "opacity-100" : "opacity-0",
66
+ )}
67
+ />
68
+ </DropdownMenuItem>
69
+ );
70
+ })}
71
+ </DropdownMenuContent>
72
+ </DropdownMenu>
73
+ );
74
+ });