termbeam 1.17.8 → 1.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/public/assets/{_basePickBy-Bx4czgjK.js → _basePickBy-SVV3-IdA.js} +1 -1
- package/public/assets/{_baseUniq-B_xhLk1b.js → _baseUniq-DOa_cDXJ.js} +1 -1
- package/public/assets/{arc-_Z6A8o27.js → arc-CiPooz6h.js} +1 -1
- package/public/assets/{architectureDiagram-2XIMDMQ5-DDtL0DSL.js → architectureDiagram-2XIMDMQ5-DLhsY97x.js} +1 -1
- package/public/assets/{blockDiagram-WCTKOSBZ-DYgWhdwH.js → blockDiagram-WCTKOSBZ-BmfWKjiE.js} +1 -1
- package/public/assets/{c4Diagram-IC4MRINW-DlbE0l99.js → c4Diagram-IC4MRINW-CHJjiNgt.js} +1 -1
- package/public/assets/channel-BK2nwbl-.js +1 -0
- package/public/assets/{chunk-4BX2VUAB-BbtQtJab.js → chunk-4BX2VUAB-DslNFup8.js} +1 -1
- package/public/assets/{chunk-55IACEB6-Dk_FjBN6.js → chunk-55IACEB6-DF8ZBVw6.js} +1 -1
- package/public/assets/{chunk-FMBD7UC4-BSOODOC9.js → chunk-FMBD7UC4-CVO2u-Sv.js} +1 -1
- package/public/assets/{chunk-JSJVCQXG-B71Oj-xI.js → chunk-JSJVCQXG-CdSwCmzy.js} +1 -1
- package/public/assets/{chunk-KX2RTZJC-Bv_BWOZR.js → chunk-KX2RTZJC-DR85cVBM.js} +1 -1
- package/public/assets/{chunk-NQ4KR5QH-NrpJgmB3.js → chunk-NQ4KR5QH-DENB8fT9.js} +1 -1
- package/public/assets/{chunk-QZHKN3VN-BmrKPCfl.js → chunk-QZHKN3VN-D1hlvsPG.js} +1 -1
- package/public/assets/{chunk-WL4C6EOR-CpglQTvf.js → chunk-WL4C6EOR-BFkfV9d-.js} +1 -1
- package/public/assets/classDiagram-VBA2DB6C-Ca3s5d8r.js +1 -0
- package/public/assets/classDiagram-v2-RAHNMMFH-Ca3s5d8r.js +1 -0
- package/public/assets/clone-Zyw2C-Y3.js +1 -0
- package/public/assets/{cose-bilkent-S5V4N54A-DYL0lt4P.js → cose-bilkent-S5V4N54A-BHgn8K1Z.js} +1 -1
- package/public/assets/{dagre-KLK3FWXG-BNyGQfuq.js → dagre-KLK3FWXG-CK-UftHZ.js} +1 -1
- package/public/assets/{diagram-E7M64L7V-BueAxddl.js → diagram-E7M64L7V-B7XX1Mqr.js} +1 -1
- package/public/assets/{diagram-IFDJBPK2-Dr-u91gt.js → diagram-IFDJBPK2-DtSlXz7u.js} +1 -1
- package/public/assets/{diagram-P4PSJMXO-C1T2kE4V.js → diagram-P4PSJMXO-Cb0uoPeh.js} +1 -1
- package/public/assets/{erDiagram-INFDFZHY-CO2EjQ8J.js → erDiagram-INFDFZHY-D2aAhxDx.js} +1 -1
- package/public/assets/{flowDiagram-PKNHOUZH-T00X36Vw.js → flowDiagram-PKNHOUZH-BxCqn1aV.js} +1 -1
- package/public/assets/{ganttDiagram-A5KZAMGK-DgBggnkU.js → ganttDiagram-A5KZAMGK-oBrRehQA.js} +1 -1
- package/public/assets/{gitGraphDiagram-K3NZZRJ6-BSWTPOpC.js → gitGraphDiagram-K3NZZRJ6-CMuK7hOw.js} +1 -1
- package/public/assets/{graph-BT-QdyLg.js → graph-NJUd-2rr.js} +1 -1
- package/public/assets/{index-XvAS6GsK.css → index-BzV_FYAW.css} +1 -1
- package/public/assets/{index-CZRetRoe.js → index-DBnflEQZ.js} +106 -106
- package/public/assets/{infoDiagram-LFFYTUFH-Dj6pwKgk.js → infoDiagram-LFFYTUFH-C0cd4K10.js} +1 -1
- package/public/assets/{ishikawaDiagram-PHBUUO56-Db8O4ufB.js → ishikawaDiagram-PHBUUO56-Ny_4n8vD.js} +1 -1
- package/public/assets/{journeyDiagram-4ABVD52K-BpZ_Yrqs.js → journeyDiagram-4ABVD52K-2QGufcXt.js} +1 -1
- package/public/assets/{kanban-definition-K7BYSVSG-D3zRUDJP.js → kanban-definition-K7BYSVSG-DDGFShX4.js} +1 -1
- package/public/assets/{layout-BI7uDMCL.js → layout-DTAwaKXg.js} +1 -1
- package/public/assets/{linear-DgP566HT.js → linear-CSYWJnE5.js} +1 -1
- package/public/assets/{mindmap-definition-YRQLILUH-BXNxkbvs.js → mindmap-definition-YRQLILUH-C6Jy7Tz1.js} +1 -1
- package/public/assets/{pieDiagram-SKSYHLDU-CuMBI_xo.js → pieDiagram-SKSYHLDU-DCNv1DYe.js} +1 -1
- package/public/assets/{quadrantDiagram-337W2JSQ-7_kXk56H.js → quadrantDiagram-337W2JSQ-DWGyMcZ6.js} +1 -1
- package/public/assets/{requirementDiagram-Z7DCOOCP-Dc4encPC.js → requirementDiagram-Z7DCOOCP-BC1_RS6p.js} +1 -1
- package/public/assets/{sankeyDiagram-WA2Y5GQK-DSlUG_VS.js → sankeyDiagram-WA2Y5GQK-GoTjgmGo.js} +1 -1
- package/public/assets/{sequenceDiagram-2WXFIKYE-DaWz5El2.js → sequenceDiagram-2WXFIKYE-CjTa5Eua.js} +1 -1
- package/public/assets/{stateDiagram-RAJIS63D-B4oQefUl.js → stateDiagram-RAJIS63D-wf6b0MTk.js} +1 -1
- package/public/assets/stateDiagram-v2-FVOUBMTO-lYMaTr7v.js +1 -0
- package/public/assets/{timeline-definition-YZTLITO2-D9zlUa7w.js → timeline-definition-YZTLITO2-BHWYxexH.js} +1 -1
- package/public/assets/{treemap-KZPCXAKY-RGFpoXIT.js → treemap-KZPCXAKY-0OLZO-76.js} +1 -1
- package/public/assets/{vennDiagram-LZ73GAT5-D5gYnx59.js → vennDiagram-LZ73GAT5-DzlX55oz.js} +1 -1
- package/public/assets/{xychartDiagram-JWTSCODW-C7kxjkz6.js → xychartDiagram-JWTSCODW-DafJ-a-f.js} +1 -1
- package/public/index.html +2 -2
- package/public/sw.js +2 -2
- package/src/server/index.js +43 -15
- package/src/server/routes.js +33 -9
- package/src/server/sessions.js +20 -0
- package/src/tunnel/index.js +200 -55
- package/public/assets/channel-Cw6U4HD8.js +0 -1
- package/public/assets/classDiagram-VBA2DB6C-B8Ph5aUJ.js +0 -1
- package/public/assets/classDiagram-v2-RAHNMMFH-B8Ph5aUJ.js +0 -1
- package/public/assets/clone-tNYKz33q.js +0 -1
- package/public/assets/stateDiagram-v2-FVOUBMTO-C4ooUxXR.js +0 -1
package/public/sw.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
try{self["workbox:core:7.3.0"]&&_()}catch{}const G=(s,...e)=>{let t=s;return e.length>0&&(t+=` :: ${JSON.stringify(e)}`),t},Q=G;class h extends Error{constructor(e,t){const n=Q(e,t);super(n),this.name=e,this.details=t}}const d={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:typeof registration<"u"?registration.scope:""},E=s=>[d.prefix,s,d.suffix].filter(e=>e&&e.length>0).join("-"),z=s=>{for(const e of Object.keys(d))s(e)},b={updateDetails:s=>{z(e=>{typeof s[e]=="string"&&(d[e]=s[e])})},getGoogleAnalyticsName:s=>s||E(d.googleAnalytics),getPrecacheName:s=>s||E(d.precache),getPrefix:()=>d.prefix,getRuntimeName:s=>s||E(d.runtime),getSuffix:()=>d.suffix};function N(s,e){const t=e();return s.waitUntil(t),t}try{self["workbox:precaching:7.3.0"]&&_()}catch{}const J="__WB_REVISION__";function X(s){if(!s)throw new h("add-to-cache-list-unexpected-type",{entry:s});if(typeof s=="string"){const r=new URL(s,location.href);return{cacheKey:r.href,url:r.href}}const{revision:e,url:t}=s;if(!t)throw new h("add-to-cache-list-unexpected-type",{entry:s});if(!e){const r=new URL(t,location.href);return{cacheKey:r.href,url:r.href}}const n=new URL(t,location.href),a=new URL(t,location.href);return n.searchParams.set(J,e),{cacheKey:n.href,url:a.href}}class Y{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){const a=t.originalRequest.url;n?this.notUpdatedURLs.push(a):this.updatedURLs.push(a)}return n}}}class Z{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:t,params:n})=>{const a=(n==null?void 0:n.cacheKey)||this._precacheController.getCacheKeyForURL(t.url);return a?new Request(a,{headers:t.headers}):t},this._precacheController=e}}let m;function ee(){if(m===void 0){const s=new Response("");if("body"in s)try{new Response(s.body),m=!0}catch{m=!1}m=!1}return m}async function te(s,e){let t=null;if(s.url&&(t=new URL(s.url).origin),t!==self.location.origin)throw new h("cross-origin-copy-response",{origin:t});const n=s.clone(),r={headers:new Headers(n.headers),status:n.status,statusText:n.statusText},i=ee()?n.body:await n.blob();return new Response(i,r)}const se=s=>new URL(String(s),location.href).href.replace(new RegExp(`^${location.origin}`),"");function M(s,e){const t=new URL(s);for(const n of e)t.searchParams.delete(n);return t.href}async function ne(s,e,t,n){const a=M(e.url,t);if(e.url===a)return s.match(e,n);const r=Object.assign(Object.assign({},n),{ignoreSearch:!0}),i=await s.keys(e,r);for(const c of i){const o=M(c.url,t);if(a===o)return s.match(c,n)}}class ae{constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}}const B=new Set;async function re(){for(const s of B)await s()}function ie(s){return new Promise(e=>setTimeout(e,s))}try{self["workbox:strategies:7.3.0"]&&_()}catch{}function C(s){return typeof s=="string"?new Request(s):s}class ce{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new ae,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(const n of this._plugins)this._pluginStateMap.set(n,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){const{event:t}=this;let n=C(e);if(n.mode==="navigate"&&t instanceof FetchEvent&&t.preloadResponse){const i=await t.preloadResponse;if(i)return i}const a=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const i of this.iterateCallbacks("requestWillFetch"))n=await i({request:n.clone(),event:t})}catch(i){if(i instanceof Error)throw new h("plugin-error-request-will-fetch",{thrownErrorMessage:i.message})}const r=n.clone();try{let i;i=await fetch(n,n.mode==="navigate"?void 0:this._strategy.fetchOptions);for(const c of this.iterateCallbacks("fetchDidSucceed"))i=await c({event:t,request:r,response:i});return i}catch(i){throw a&&await this.runCallbacks("fetchDidFail",{error:i,event:t,originalRequest:a.clone(),request:r.clone()}),i}}async fetchAndCachePut(e){const t=await this.fetch(e),n=t.clone();return this.waitUntil(this.cachePut(e,n)),t}async cacheMatch(e){const t=C(e);let n;const{cacheName:a,matchOptions:r}=this._strategy,i=await this.getCacheKey(t,"read"),c=Object.assign(Object.assign({},r),{cacheName:a});n=await caches.match(i,c);for(const o of this.iterateCallbacks("cachedResponseWillBeUsed"))n=await o({cacheName:a,matchOptions:r,cachedResponse:n,request:i,event:this.event})||void 0;return n}async cachePut(e,t){const n=C(e);await ie(0);const a=await this.getCacheKey(n,"write");if(!t)throw new h("cache-put-with-no-response",{url:se(a.url)});const r=await this._ensureResponseSafeToCache(t);if(!r)return!1;const{cacheName:i,matchOptions:c}=this._strategy,o=await self.caches.open(i),l=this.hasCallback("cacheDidUpdate"),g=l?await ne(o,a.clone(),["__WB_REVISION__"],c):null;try{await o.put(a,l?r.clone():r)}catch(u){if(u instanceof Error)throw u.name==="QuotaExceededError"&&await re(),u}for(const u of this.iterateCallbacks("cacheDidUpdate"))await u({cacheName:i,oldResponse:g,newResponse:r.clone(),request:a,event:this.event});return!0}async getCacheKey(e,t){const n=`${e.url} | ${t}`;if(!this._cacheKeys[n]){let a=e;for(const r of this.iterateCallbacks("cacheKeyWillBeUsed"))a=C(await r({mode:t,request:a,event:this.event,params:this.params}));this._cacheKeys[n]=a}return this._cacheKeys[n]}hasCallback(e){for(const t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(const n of this.iterateCallbacks(e))await n(t)}*iterateCallbacks(e){for(const t of this._strategy.plugins)if(typeof t[e]=="function"){const n=this._pluginStateMap.get(t);yield r=>{const 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;){const e=this._extendLifetimePromises.splice(0),n=(await Promise.allSettled(e)).find(a=>a.status==="rejected");if(n)throw n.reason}}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let t=e,n=!1;for(const a of this.iterateCallbacks("cacheWillUpdate"))if(t=await a({request:this.request,response:t,event:this.event})||void 0,n=!0,!t)break;return n||t&&t.status!==200&&(t=void 0),t}}class W{constructor(e={}){this.cacheName=b.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){const[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});const t=e.event,n=typeof e.request=="string"?new Request(e.request):e.request,a="params"in e?e.params:void 0,r=new ce(this,{event:t,request:n,params:a}),i=this._getResponse(r,n,t),c=this._awaitComplete(i,r,n,t);return[i,c]}async _getResponse(e,t,n){await e.runCallbacks("handlerWillStart",{event:n,request:t});let a;try{if(a=await this._handle(t,e),!a||a.type==="error")throw new h("no-response",{url:t.url})}catch(r){if(r instanceof Error){for(const i of e.iterateCallbacks("handlerDidError"))if(a=await i({error:r,event:n,request:t}),a)break}if(!a)throw r}for(const r of e.iterateCallbacks("handlerWillRespond"))a=await r({event:n,request:t,response:a});return a}async _awaitComplete(e,t,n,a){let r,i;try{r=await e}catch{}try{await t.runCallbacks("handlerDidRespond",{event:a,request:n,response:r}),await t.doneWaiting()}catch(c){c instanceof Error&&(i=c)}if(await t.runCallbacks("handlerDidComplete",{event:a,request:n,response:r,error:i}),t.destroy(),i)throw i}}class p extends W{constructor(e={}){e.cacheName=b.getPrecacheName(e.cacheName),super(e),this._fallbackToNetwork=e.fallbackToNetwork!==!1,this.plugins.push(p.copyRedirectedCacheableResponsesPlugin)}async _handle(e,t){const n=await t.cacheMatch(e);return n||(t.event&&t.event.type==="install"?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,t){let n;const a=t.params||{};if(this._fallbackToNetwork){const r=a.integrity,i=e.integrity,c=!i||i===r;n=await t.fetch(new Request(e,{integrity:e.mode!=="no-cors"?i||r:void 0})),r&&c&&e.mode!=="no-cors"&&(this._useDefaultCacheabilityPluginIfNeeded(),await t.cachePut(e,n.clone()))}else throw new h("missing-precache-entry",{cacheName:this.cacheName,url:e.url});return n}async _handleInstall(e,t){this._useDefaultCacheabilityPluginIfNeeded();const n=await t.fetch(e);if(!await t.cachePut(e,n.clone()))throw new h("bad-precaching-response",{url:e.url,status:n.status});return n}_useDefaultCacheabilityPluginIfNeeded(){let e=null,t=0;for(const[n,a]of this.plugins.entries())a!==p.copyRedirectedCacheableResponsesPlugin&&(a===p.defaultPrecacheCacheabilityPlugin&&(e=n),a.cacheWillUpdate&&t++);t===0?this.plugins.push(p.defaultPrecacheCacheabilityPlugin):t>1&&e!==null&&this.plugins.splice(e,1)}}p.defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:s}){return!s||s.status>=400?null:s}};p.copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:s}){return s.redirected?await te(s):s}};class oe{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:n=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new p({cacheName:b.getPrecacheName(e),plugins:[...t,new Z({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),this._installAndActiveListenersAdded=!0)}addToCacheList(e){const t=[];for(const n of e){typeof n=="string"?t.push(n):n&&n.revision===void 0&&t.push(n.url);const{cacheKey:a,url:r}=X(n),i=typeof n!="string"&&n.revision?"reload":"default";if(this._urlsToCacheKeys.has(r)&&this._urlsToCacheKeys.get(r)!==a)throw new h("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(r),secondEntry:a});if(typeof n!="string"&&n.integrity){if(this._cacheKeysToIntegrities.has(a)&&this._cacheKeysToIntegrities.get(a)!==n.integrity)throw new h("add-to-cache-list-conflicting-integrities",{url:r});this._cacheKeysToIntegrities.set(a,n.integrity)}if(this._urlsToCacheKeys.set(r,a),this._urlsToCacheModes.set(r,i),t.length>0){const c=`Workbox is precaching URLs without revision info: ${t.join(", ")}
|
|
2
|
-
This is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(c)}}}install(e){return N(e,async()=>{const t=new Y;this.strategy.plugins.push(t);for(const[r,i]of this._urlsToCacheKeys){const c=this._cacheKeysToIntegrities.get(i),o=this._urlsToCacheModes.get(r),l=new Request(r,{integrity:c,cache:o,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:i},request:l,event:e}))}const{updatedURLs:n,notUpdatedURLs:a}=t;return{updatedURLs:n,notUpdatedURLs:a}})}activate(e){return N(e,async()=>{const t=await self.caches.open(this.strategy.cacheName),n=await t.keys(),a=new Set(this._urlsToCacheKeys.values()),r=[];for(const i of n)a.has(i.url)||(await t.delete(i),r.push(i.url));return{deletedURLs:r}})}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){const t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){const 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){const t=this.getCacheKeyForURL(e);if(!t)throw new h("non-precached-url",{url:e});return n=>(n.request=new Request(e),n.params=Object.assign({cacheKey:t},n.params),this.strategy.handle(n))}}let L;const j=()=>(L||(L=new oe),L);try{self["workbox:routing:7.3.0"]&&_()}catch{}const F="GET",x=s=>s&&typeof s=="object"?s:{handle:s};class R{constructor(e,t,n=F){this.handler=x(t),this.match=e,this.method=n}setCatchHandler(e){this.catchHandler=x(e)}}class le extends R{constructor(e,t,n){const a=({url:r})=>{const i=e.exec(r.href);if(i&&!(r.origin!==location.origin&&i.index!==0))return i.slice(1)};super(a,t,n)}}class he{constructor(){this._routes=new Map,this._defaultHandlerMap=new Map}get routes(){return this._routes}addFetchListener(){self.addEventListener("fetch",(e=>{const{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"){const{payload:t}=e.data,n=Promise.all(t.urlsToCache.map(a=>{typeof a=="string"&&(a=[a]);const r=new Request(...a);return this.handleRequest({request:r,event:e})}));e.waitUntil(n),e.ports&&e.ports[0]&&n.then(()=>e.ports[0].postMessage(!0))}}))}handleRequest({request:e,event:t}){const n=new URL(e.url,location.href);if(!n.protocol.startsWith("http"))return;const a=n.origin===location.origin,{params:r,route:i}=this.findMatchingRoute({event:t,request:e,sameOrigin:a,url:n});let c=i&&i.handler;const o=e.method;if(!c&&this._defaultHandlerMap.has(o)&&(c=this._defaultHandlerMap.get(o)),!c)return;let l;try{l=c.handle({url:n,request:e,event:t,params:r})}catch(u){l=Promise.reject(u)}const g=i&&i.catchHandler;return l instanceof Promise&&(this._catchHandler||g)&&(l=l.catch(async u=>{if(g)try{return await g.handle({url:n,request:e,event:t,params:r})}catch(I){I instanceof Error&&(u=I)}if(this._catchHandler)return this._catchHandler.handle({url:n,request:e,event:t});throw u})),l}findMatchingRoute({url:e,sameOrigin:t,request:n,event:a}){const r=this._routes.get(n.method)||[];for(const i of r){let c;const o=i.match({url:e,sameOrigin:t,request:n,event:a});if(o)return c=o,(Array.isArray(c)&&c.length===0||o.constructor===Object&&Object.keys(o).length===0||typeof o=="boolean")&&(c=void 0),{route:i,params:c}}return{}}setDefaultHandler(e,t=F){this._defaultHandlerMap.set(t,x(e))}setCatchHandler(e){this._catchHandler=x(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 h("unregister-route-but-not-found-with-method",{method:e.method});const t=this._routes.get(e.method).indexOf(e);if(t>-1)this._routes.get(e.method).splice(t,1);else throw new h("unregister-route-route-not-registered")}}let w;const ue=()=>(w||(w=new he,w.addFetchListener(),w.addCacheListener()),w);function q(s,e,t){let n;if(typeof s=="string"){const r=new URL(s,location.href),i=({url:c})=>c.href===r.href;n=new R(i,e,t)}else if(s instanceof RegExp)n=new le(s,e,t);else if(typeof s=="function")n=new R(s,e,t);else if(s instanceof R)n=s;else throw new h("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});return ue().registerRoute(n),n}function de(s,e=[]){for(const t of[...s.searchParams.keys()])e.some(n=>n.test(t))&&s.searchParams.delete(t);return s}function*fe(s,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:t="index.html",cleanURLs:n=!0,urlManipulation:a}={}){const r=new URL(s,location.href);r.hash="",yield r.href;const i=de(r,e);if(yield i.href,t&&i.pathname.endsWith("/")){const c=new URL(i.href);c.pathname+=t,yield c.href}if(n){const c=new URL(i.href);c.pathname+=".html",yield c.href}if(a){const c=a({url:r});for(const o of c)yield o.href}}class pe extends R{constructor(e,t){const n=({request:a})=>{const r=e.getURLsToCacheKeys();for(const i of fe(a.url,t)){const c=r.get(i);if(c){const o=e.getIntegrityForCacheKey(c);return{cacheKey:c,integrity:o}}}};super(n,e.strategy)}}function ge(s){const e=j(),t=new pe(e,s);q(t)}const me="-precache-",we=async(s,e=me)=>{const n=(await self.caches.keys()).filter(a=>a.includes(e)&&a.includes(self.registration.scope)&&a!==s);return await Promise.all(n.map(a=>self.caches.delete(a))),n};function ye(){self.addEventListener("activate",(s=>{const e=b.getPrecacheName();s.waitUntil(we(e).then(t=>{}))}))}function _e(s){j().precache(s)}function Re(s,e){_e(s),ge(e)}class be extends W{async _handle(e,t){let n=await t.cacheMatch(e),a;if(!n)try{n=await t.fetchAndCachePut(e)}catch(r){r instanceof Error&&(a=r)}if(!n)throw new h("no-response",{url:e.url,error:a});return n}}function H(s){s.then(()=>{})}const Ce=(s,e)=>e.some(t=>s instanceof t);let A,K;function xe(){return A||(A=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Ee(){return K||(K=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}const V=new WeakMap,k=new WeakMap,$=new WeakMap,D=new WeakMap,v=new WeakMap;function Le(s){const e=new Promise((t,n)=>{const a=()=>{s.removeEventListener("success",r),s.removeEventListener("error",i)},r=()=>{t(f(s.result)),a()},i=()=>{n(s.error),a()};s.addEventListener("success",r),s.addEventListener("error",i)});return e.then(t=>{t instanceof IDBCursor&&V.set(t,s)}).catch(()=>{}),v.set(e,s),e}function De(s){if(k.has(s))return;const e=new Promise((t,n)=>{const a=()=>{s.removeEventListener("complete",r),s.removeEventListener("error",i),s.removeEventListener("abort",i)},r=()=>{t(),a()},i=()=>{n(s.error||new DOMException("AbortError","AbortError")),a()};s.addEventListener("complete",r),s.addEventListener("error",i),s.addEventListener("abort",i)});k.set(s,e)}let P={get(s,e,t){if(s instanceof IDBTransaction){if(e==="done")return k.get(s);if(e==="objectStoreNames")return s.objectStoreNames||$.get(s);if(e==="store")return t.objectStoreNames[1]?void 0:t.objectStore(t.objectStoreNames[0])}return f(s[e])},set(s,e,t){return s[e]=t,!0},has(s,e){return s instanceof IDBTransaction&&(e==="done"||e==="store")?!0:e in s}};function Ue(s){P=s(P)}function Te(s){return s===IDBDatabase.prototype.transaction&&!("objectStoreNames"in IDBTransaction.prototype)?function(e,...t){const n=s.call(U(this),e,...t);return $.set(n,e.sort?e.sort():[e]),f(n)}:Ee().includes(s)?function(...e){return s.apply(U(this),e),f(V.get(this))}:function(...e){return f(s.apply(U(this),e))}}function ke(s){return typeof s=="function"?Te(s):(s instanceof IDBTransaction&&De(s),Ce(s,xe())?new Proxy(s,P):s)}function f(s){if(s instanceof IDBRequest)return Le(s);if(D.has(s))return D.get(s);const e=ke(s);return e!==s&&(D.set(s,e),v.set(e,s)),e}const U=s=>v.get(s);function Pe(s,e,{blocked:t,upgrade:n,blocking:a,terminated:r}={}){const i=indexedDB.open(s,e),c=f(i);return n&&i.addEventListener("upgradeneeded",o=>{n(f(i.result),o.oldVersion,o.newVersion,f(i.transaction),o)}),t&&i.addEventListener("blocked",o=>t(o.oldVersion,o.newVersion,o)),c.then(o=>{r&&o.addEventListener("close",()=>r()),a&&o.addEventListener("versionchange",l=>a(l.oldVersion,l.newVersion,l))}).catch(()=>{}),c}function ve(s,{blocked:e}={}){const t=indexedDB.deleteDatabase(s);return e&&t.addEventListener("blocked",n=>e(n.oldVersion,n)),f(t).then(()=>{})}const Ie=["get","getKey","getAll","getAllKeys","count"],Ne=["put","add","delete","clear"],T=new Map;function S(s,e){if(!(s instanceof IDBDatabase&&!(e in s)&&typeof e=="string"))return;if(T.get(e))return T.get(e);const t=e.replace(/FromIndex$/,""),n=e!==t,a=Ne.includes(t);if(!(t in(n?IDBIndex:IDBObjectStore).prototype)||!(a||Ie.includes(t)))return;const r=async function(i,...c){const o=this.transaction(i,a?"readwrite":"readonly");let l=o.store;return n&&(l=l.index(c.shift())),(await Promise.all([l[t](...c),a&&o.done]))[0]};return T.set(e,r),r}Ue(s=>({...s,get:(e,t,n)=>S(e,t)||s.get(e,t,n),has:(e,t)=>!!S(e,t)||s.has(e,t)}));try{self["workbox:expiration:7.3.0"]&&_()}catch{}const Me="workbox-expiration",y="cache-entries",O=s=>{const e=new URL(s,location.href);return e.hash="",e.href};class Ae{constructor(e){this._db=null,this._cacheName=e}_upgradeDb(e){const t=e.createObjectStore(y,{keyPath:"id"});t.createIndex("cacheName","cacheName",{unique:!1}),t.createIndex("timestamp","timestamp",{unique:!1})}_upgradeDbAndDeleteOldDbs(e){this._upgradeDb(e),this._cacheName&&ve(this._cacheName)}async setTimestamp(e,t){e=O(e);const n={url:e,timestamp:t,cacheName:this._cacheName,id:this._getId(e)},r=(await this.getDb()).transaction(y,"readwrite",{durability:"relaxed"});await r.store.put(n),await r.done}async getTimestamp(e){const n=await(await this.getDb()).get(y,this._getId(e));return n==null?void 0:n.timestamp}async expireEntries(e,t){const n=await this.getDb();let a=await n.transaction(y).store.index("timestamp").openCursor(null,"prev");const r=[];let i=0;for(;a;){const o=a.value;o.cacheName===this._cacheName&&(e&&o.timestamp<e||t&&i>=t?r.push(a.value):i++),a=await a.continue()}const c=[];for(const o of r)await n.delete(y,o.id),c.push(o.url);return c}_getId(e){return this._cacheName+"|"+O(e)}async getDb(){return this._db||(this._db=await Pe(Me,1,{upgrade:this._upgradeDbAndDeleteOldDbs.bind(this)})),this._db}}class Ke{constructor(e,t={}){this._isRunning=!1,this._rerunRequested=!1,this._maxEntries=t.maxEntries,this._maxAgeSeconds=t.maxAgeSeconds,this._matchOptions=t.matchOptions,this._cacheName=e,this._timestampModel=new Ae(e)}async expireEntries(){if(this._isRunning){this._rerunRequested=!0;return}this._isRunning=!0;const e=this._maxAgeSeconds?Date.now()-this._maxAgeSeconds*1e3:0,t=await this._timestampModel.expireEntries(e,this._maxEntries),n=await self.caches.open(this._cacheName);for(const a of t)await n.delete(a,this._matchOptions);this._isRunning=!1,this._rerunRequested&&(this._rerunRequested=!1,H(this.expireEntries()))}async updateTimestamp(e){await this._timestampModel.setTimestamp(e,Date.now())}async isURLExpired(e){if(this._maxAgeSeconds){const t=await this._timestampModel.getTimestamp(e),n=Date.now()-this._maxAgeSeconds*1e3;return t!==void 0?t<n:!0}else return!1}async delete(){this._rerunRequested=!1,await this._timestampModel.expireEntries(1/0)}}function Se(s){B.add(s)}class Oe{constructor(e={}){this.cachedResponseWillBeUsed=async({event:t,request:n,cacheName:a,cachedResponse:r})=>{if(!r)return null;const i=this._isResponseDateFresh(r),c=this._getCacheExpiration(a);H(c.expireEntries());const o=c.updateTimestamp(n.url);if(t)try{t.waitUntil(o)}catch{}return i?r:null},this.cacheDidUpdate=async({cacheName:t,request:n})=>{const a=this._getCacheExpiration(t);await a.updateTimestamp(n.url),await a.expireEntries()},this._config=e,this._maxAgeSeconds=e.maxAgeSeconds,this._cacheExpirations=new Map,e.purgeOnQuotaError&&Se(()=>this.deleteCacheAndMetadata())}_getCacheExpiration(e){if(e===b.getRuntimeName())throw new h("expire-custom-caches-only");let t=this._cacheExpirations.get(e);return t||(t=new Ke(e,this._config),this._cacheExpirations.set(e,t)),t}_isResponseDateFresh(e){if(!this._maxAgeSeconds)return!0;const t=this._getDateHeaderTimestamp(e);if(t===null)return!0;const n=Date.now();return t>=n-this._maxAgeSeconds*1e3}_getDateHeaderTimestamp(e){if(!e.headers.has("date"))return null;const t=e.headers.get("date"),a=new Date(t).getTime();return isNaN(a)?null:a}async deleteCacheAndMetadata(){for(const[e,t]of this._cacheExpirations)await self.caches.delete(e),await t.delete();this._cacheExpirations=new Map}}Re([{"revision":"1872c500de691dce40960bb85481de07","url":"registerSW.js"},{"revision":"0f93805414c783a30b72e0ce88f2c7c4","url":"icons/icon.svg"},{"revision":"5dee5ddcd8e8533edb348118334d9756","url":"icons/icon-512.png"},{"revision":"75734e6b38a556148f51b9e10eeb01c8","url":"icons/icon-192.png"},{"revision":"0362e0eb00358646fd4c97674945adba","url":"icons/icon-180.png"},{"revision":null,"url":"assets/xychartDiagram-JWTSCODW-C7kxjkz6.js"},{"revision":null,"url":"assets/vennDiagram-LZ73GAT5-D5gYnx59.js"},{"revision":null,"url":"assets/treemap-KZPCXAKY-RGFpoXIT.js"},{"revision":null,"url":"assets/timeline-definition-YZTLITO2-D9zlUa7w.js"},{"revision":null,"url":"assets/stateDiagram-v2-FVOUBMTO-C4ooUxXR.js"},{"revision":null,"url":"assets/stateDiagram-RAJIS63D-B4oQefUl.js"},{"revision":null,"url":"assets/sequenceDiagram-2WXFIKYE-DaWz5El2.js"},{"revision":null,"url":"assets/sankeyDiagram-WA2Y5GQK-DSlUG_VS.js"},{"revision":null,"url":"assets/requirementDiagram-Z7DCOOCP-Dc4encPC.js"},{"revision":null,"url":"assets/quadrantDiagram-337W2JSQ-7_kXk56H.js"},{"revision":null,"url":"assets/pieDiagram-SKSYHLDU-CuMBI_xo.js"},{"revision":null,"url":"assets/ordinal-Cboi1Yqb.js"},{"revision":null,"url":"assets/mindmap-definition-YRQLILUH-BXNxkbvs.js"},{"revision":null,"url":"assets/linear-DgP566HT.js"},{"revision":null,"url":"assets/layout-BI7uDMCL.js"},{"revision":null,"url":"assets/katex-B1X10hvy.js"},{"revision":null,"url":"assets/kanban-definition-K7BYSVSG-D3zRUDJP.js"},{"revision":null,"url":"assets/journeyDiagram-4ABVD52K-BpZ_Yrqs.js"},{"revision":null,"url":"assets/ishikawaDiagram-PHBUUO56-Db8O4ufB.js"},{"revision":null,"url":"assets/init-Gi6I4Gst.js"},{"revision":null,"url":"assets/infoDiagram-LFFYTUFH-Dj6pwKgk.js"},{"revision":null,"url":"assets/index-XvAS6GsK.css"},{"revision":null,"url":"assets/index-CZRetRoe.js"},{"revision":null,"url":"assets/graph-BT-QdyLg.js"},{"revision":null,"url":"assets/gitGraphDiagram-K3NZZRJ6-BSWTPOpC.js"},{"revision":null,"url":"assets/ganttDiagram-A5KZAMGK-DgBggnkU.js"},{"revision":null,"url":"assets/flowDiagram-PKNHOUZH-T00X36Vw.js"},{"revision":null,"url":"assets/erDiagram-INFDFZHY-CO2EjQ8J.js"},{"revision":null,"url":"assets/diagram-P4PSJMXO-C1T2kE4V.js"},{"revision":null,"url":"assets/diagram-IFDJBPK2-Dr-u91gt.js"},{"revision":null,"url":"assets/diagram-E7M64L7V-BueAxddl.js"},{"revision":null,"url":"assets/defaultLocale-DX6XiGOO.js"},{"revision":null,"url":"assets/dagre-KLK3FWXG-BNyGQfuq.js"},{"revision":null,"url":"assets/cytoscape.esm-BQaXIfA_.js"},{"revision":null,"url":"assets/cose-bilkent-S5V4N54A-DYL0lt4P.js"},{"revision":null,"url":"assets/clone-tNYKz33q.js"},{"revision":null,"url":"assets/classDiagram-v2-RAHNMMFH-B8Ph5aUJ.js"},{"revision":null,"url":"assets/classDiagram-VBA2DB6C-B8Ph5aUJ.js"},{"revision":null,"url":"assets/chunk-WL4C6EOR-CpglQTvf.js"},{"revision":null,"url":"assets/chunk-QZHKN3VN-BmrKPCfl.js"},{"revision":null,"url":"assets/chunk-NQ4KR5QH-NrpJgmB3.js"},{"revision":null,"url":"assets/chunk-KX2RTZJC-Bv_BWOZR.js"},{"revision":null,"url":"assets/chunk-JSJVCQXG-B71Oj-xI.js"},{"revision":null,"url":"assets/chunk-FMBD7UC4-BSOODOC9.js"},{"revision":null,"url":"assets/chunk-55IACEB6-Dk_FjBN6.js"},{"revision":null,"url":"assets/chunk-4BX2VUAB-BbtQtJab.js"},{"revision":null,"url":"assets/channel-Cw6U4HD8.js"},{"revision":null,"url":"assets/c4Diagram-IC4MRINW-DlbE0l99.js"},{"revision":null,"url":"assets/blockDiagram-WCTKOSBZ-DYgWhdwH.js"},{"revision":null,"url":"assets/architectureDiagram-2XIMDMQ5-DDtL0DSL.js"},{"revision":null,"url":"assets/arc-_Z6A8o27.js"},{"revision":null,"url":"assets/_baseUniq-B_xhLk1b.js"},{"revision":null,"url":"assets/_basePickBy-Bx4czgjK.js"},{"revision":"0362e0eb00358646fd4c97674945adba","url":"icons/icon-180.png"},{"revision":"75734e6b38a556148f51b9e10eeb01c8","url":"icons/icon-192.png"},{"revision":"5dee5ddcd8e8533edb348118334d9756","url":"icons/icon-512.png"},{"revision":"b0747e8d6cde0d45e05be8e5c731729e","url":"manifest.webmanifest"}]);ye();q(({url:s})=>s.hostname==="cdn.jsdelivr.net"&&s.pathname.endsWith(".ttf"),new be({cacheName:"termbeam-fonts",plugins:[new Oe({maxEntries:5,maxAgeSeconds:365*24*60*60})]}));self.addEventListener("message",s=>{var e;((e=s.data)==null?void 0:e.type)==="CLEAR_CACHES"&&caches.keys().then(t=>{for(const n of t)n!=="workbox-precache-v2"&&caches.delete(n)})});self.addEventListener("install",()=>{self.skipWaiting()});self.addEventListener("activate",s=>{s.waitUntil(caches.delete("termbeam-navigation").then(()=>self.clients.claim()))});self.addEventListener("push",s=>{let e={title:"Command finished",body:"TermBeam"};if(s.data)try{e=s.data.json()}catch{}s.waitUntil(self.clients.matchAll({type:"window",includeUncontrolled:!0}).then(async t=>{if(t.some(r=>r.url.includes(self.location.origin)&&r.focused))return;const a={body:e.body||"A command has completed",icon:"/icons/icon-192.png",badge:"/icons/icon-192.png",tag:"termbeam-cmd",renotify:!0,data:{url:"/"},vibrate:[200,100,200]};try{await self.navigator.setAppBadge(1)}catch{}return self.registration.showNotification(e.title||"Command finished",a)}))});self.addEventListener("notificationclick",s=>{var t;s.notification.close();try{self.navigator.clearAppBadge()}catch{}const e=((t=s.notification.data)==null?void 0:t.url)||"/";s.waitUntil(self.clients.matchAll({type:"window",includeUncontrolled:!0}).then(n=>{for(const a of n)if(a.url.includes(self.location.origin)&&"focus"in a)return a.focus();return self.clients.openWindow(e)}))});
|
|
1
|
+
try{self["workbox:core:7.3.0"]&&_()}catch{}const G=(s,...e)=>{let t=s;return e.length>0&&(t+=` :: ${JSON.stringify(e)}`),t},Q=G;class h extends Error{constructor(e,t){const n=Q(e,t);super(n),this.name=e,this.details=t}}const d={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:typeof registration<"u"?registration.scope:""},E=s=>[d.prefix,s,d.suffix].filter(e=>e&&e.length>0).join("-"),z=s=>{for(const e of Object.keys(d))s(e)},b={updateDetails:s=>{z(e=>{typeof s[e]=="string"&&(d[e]=s[e])})},getGoogleAnalyticsName:s=>s||E(d.googleAnalytics),getPrecacheName:s=>s||E(d.precache),getPrefix:()=>d.prefix,getRuntimeName:s=>s||E(d.runtime),getSuffix:()=>d.suffix};function v(s,e){const t=e();return s.waitUntil(t),t}try{self["workbox:precaching:7.3.0"]&&_()}catch{}const J="__WB_REVISION__";function X(s){if(!s)throw new h("add-to-cache-list-unexpected-type",{entry:s});if(typeof s=="string"){const i=new URL(s,location.href);return{cacheKey:i.href,url:i.href}}const{revision:e,url:t}=s;if(!t)throw new h("add-to-cache-list-unexpected-type",{entry:s});if(!e){const i=new URL(t,location.href);return{cacheKey:i.href,url:i.href}}const n=new URL(t,location.href),a=new URL(t,location.href);return n.searchParams.set(J,e),{cacheKey:n.href,url:a.href}}class Y{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){const a=t.originalRequest.url;n?this.notUpdatedURLs.push(a):this.updatedURLs.push(a)}return n}}}class Z{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:t,params:n})=>{const a=(n==null?void 0:n.cacheKey)||this._precacheController.getCacheKeyForURL(t.url);return a?new Request(a,{headers:t.headers}):t},this._precacheController=e}}let m;function ee(){if(m===void 0){const s=new Response("");if("body"in s)try{new Response(s.body),m=!0}catch{m=!1}m=!1}return m}async function te(s,e){let t=null;if(s.url&&(t=new URL(s.url).origin),t!==self.location.origin)throw new h("cross-origin-copy-response",{origin:t});const n=s.clone(),i={headers:new Headers(n.headers),status:n.status,statusText:n.statusText},r=ee()?n.body:await n.blob();return new Response(r,i)}const se=s=>new URL(String(s),location.href).href.replace(new RegExp(`^${location.origin}`),"");function M(s,e){const t=new URL(s);for(const n of e)t.searchParams.delete(n);return t.href}async function ne(s,e,t,n){const a=M(e.url,t);if(e.url===a)return s.match(e,n);const i=Object.assign(Object.assign({},n),{ignoreSearch:!0}),r=await s.keys(e,i);for(const c of r){const o=M(c.url,t);if(a===o)return s.match(c,n)}}class ae{constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}}const B=new Set;async function ie(){for(const s of B)await s()}function re(s){return new Promise(e=>setTimeout(e,s))}try{self["workbox:strategies:7.3.0"]&&_()}catch{}function C(s){return typeof s=="string"?new Request(s):s}class ce{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new ae,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(const n of this._plugins)this._pluginStateMap.set(n,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){const{event:t}=this;let n=C(e);if(n.mode==="navigate"&&t instanceof FetchEvent&&t.preloadResponse){const r=await t.preloadResponse;if(r)return r}const a=this.hasCallback("fetchDidFail")?n.clone():null;try{for(const r of this.iterateCallbacks("requestWillFetch"))n=await r({request:n.clone(),event:t})}catch(r){if(r instanceof Error)throw new h("plugin-error-request-will-fetch",{thrownErrorMessage:r.message})}const i=n.clone();try{let r;r=await fetch(n,n.mode==="navigate"?void 0:this._strategy.fetchOptions);for(const c of this.iterateCallbacks("fetchDidSucceed"))r=await c({event:t,request:i,response:r});return r}catch(r){throw a&&await this.runCallbacks("fetchDidFail",{error:r,event:t,originalRequest:a.clone(),request:i.clone()}),r}}async fetchAndCachePut(e){const t=await this.fetch(e),n=t.clone();return this.waitUntil(this.cachePut(e,n)),t}async cacheMatch(e){const t=C(e);let n;const{cacheName:a,matchOptions:i}=this._strategy,r=await this.getCacheKey(t,"read"),c=Object.assign(Object.assign({},i),{cacheName:a});n=await caches.match(r,c);for(const o of this.iterateCallbacks("cachedResponseWillBeUsed"))n=await o({cacheName:a,matchOptions:i,cachedResponse:n,request:r,event:this.event})||void 0;return n}async cachePut(e,t){const n=C(e);await re(0);const a=await this.getCacheKey(n,"write");if(!t)throw new h("cache-put-with-no-response",{url:se(a.url)});const i=await this._ensureResponseSafeToCache(t);if(!i)return!1;const{cacheName:r,matchOptions:c}=this._strategy,o=await self.caches.open(r),l=this.hasCallback("cacheDidUpdate"),g=l?await ne(o,a.clone(),["__WB_REVISION__"],c):null;try{await o.put(a,l?i.clone():i)}catch(u){if(u instanceof Error)throw u.name==="QuotaExceededError"&&await ie(),u}for(const u of this.iterateCallbacks("cacheDidUpdate"))await u({cacheName:r,oldResponse:g,newResponse:i.clone(),request:a,event:this.event});return!0}async getCacheKey(e,t){const n=`${e.url} | ${t}`;if(!this._cacheKeys[n]){let a=e;for(const i of this.iterateCallbacks("cacheKeyWillBeUsed"))a=C(await i({mode:t,request:a,event:this.event,params:this.params}));this._cacheKeys[n]=a}return this._cacheKeys[n]}hasCallback(e){for(const t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(const n of this.iterateCallbacks(e))await n(t)}*iterateCallbacks(e){for(const t of this._strategy.plugins)if(typeof t[e]=="function"){const n=this._pluginStateMap.get(t);yield i=>{const r=Object.assign(Object.assign({},i),{state:n});return t[e](r)}}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){for(;this._extendLifetimePromises.length;){const e=this._extendLifetimePromises.splice(0),n=(await Promise.allSettled(e)).find(a=>a.status==="rejected");if(n)throw n.reason}}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let t=e,n=!1;for(const a of this.iterateCallbacks("cacheWillUpdate"))if(t=await a({request:this.request,response:t,event:this.event})||void 0,n=!0,!t)break;return n||t&&t.status!==200&&(t=void 0),t}}class W{constructor(e={}){this.cacheName=b.getRuntimeName(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){const[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});const t=e.event,n=typeof e.request=="string"?new Request(e.request):e.request,a="params"in e?e.params:void 0,i=new ce(this,{event:t,request:n,params:a}),r=this._getResponse(i,n,t),c=this._awaitComplete(r,i,n,t);return[r,c]}async _getResponse(e,t,n){await e.runCallbacks("handlerWillStart",{event:n,request:t});let a;try{if(a=await this._handle(t,e),!a||a.type==="error")throw new h("no-response",{url:t.url})}catch(i){if(i instanceof Error){for(const r of e.iterateCallbacks("handlerDidError"))if(a=await r({error:i,event:n,request:t}),a)break}if(!a)throw i}for(const i of e.iterateCallbacks("handlerWillRespond"))a=await i({event:n,request:t,response:a});return a}async _awaitComplete(e,t,n,a){let i,r;try{i=await e}catch{}try{await t.runCallbacks("handlerDidRespond",{event:a,request:n,response:i}),await t.doneWaiting()}catch(c){c instanceof Error&&(r=c)}if(await t.runCallbacks("handlerDidComplete",{event:a,request:n,response:i,error:r}),t.destroy(),r)throw r}}class p extends W{constructor(e={}){e.cacheName=b.getPrecacheName(e.cacheName),super(e),this._fallbackToNetwork=e.fallbackToNetwork!==!1,this.plugins.push(p.copyRedirectedCacheableResponsesPlugin)}async _handle(e,t){const n=await t.cacheMatch(e);return n||(t.event&&t.event.type==="install"?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,t){let n;const a=t.params||{};if(this._fallbackToNetwork){const i=a.integrity,r=e.integrity,c=!r||r===i;n=await t.fetch(new Request(e,{integrity:e.mode!=="no-cors"?r||i:void 0})),i&&c&&e.mode!=="no-cors"&&(this._useDefaultCacheabilityPluginIfNeeded(),await t.cachePut(e,n.clone()))}else throw new h("missing-precache-entry",{cacheName:this.cacheName,url:e.url});return n}async _handleInstall(e,t){this._useDefaultCacheabilityPluginIfNeeded();const n=await t.fetch(e);if(!await t.cachePut(e,n.clone()))throw new h("bad-precaching-response",{url:e.url,status:n.status});return n}_useDefaultCacheabilityPluginIfNeeded(){let e=null,t=0;for(const[n,a]of this.plugins.entries())a!==p.copyRedirectedCacheableResponsesPlugin&&(a===p.defaultPrecacheCacheabilityPlugin&&(e=n),a.cacheWillUpdate&&t++);t===0?this.plugins.push(p.defaultPrecacheCacheabilityPlugin):t>1&&e!==null&&this.plugins.splice(e,1)}}p.defaultPrecacheCacheabilityPlugin={async cacheWillUpdate({response:s}){return!s||s.status>=400?null:s}};p.copyRedirectedCacheableResponsesPlugin={async cacheWillUpdate({response:s}){return s.redirected?await te(s):s}};class oe{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:n=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new p({cacheName:b.getPrecacheName(e),plugins:[...t,new Z({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),this._installAndActiveListenersAdded=!0)}addToCacheList(e){const t=[];for(const n of e){typeof n=="string"?t.push(n):n&&n.revision===void 0&&t.push(n.url);const{cacheKey:a,url:i}=X(n),r=typeof n!="string"&&n.revision?"reload":"default";if(this._urlsToCacheKeys.has(i)&&this._urlsToCacheKeys.get(i)!==a)throw new h("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(i),secondEntry:a});if(typeof n!="string"&&n.integrity){if(this._cacheKeysToIntegrities.has(a)&&this._cacheKeysToIntegrities.get(a)!==n.integrity)throw new h("add-to-cache-list-conflicting-integrities",{url:i});this._cacheKeysToIntegrities.set(a,n.integrity)}if(this._urlsToCacheKeys.set(i,a),this._urlsToCacheModes.set(i,r),t.length>0){const c=`Workbox is precaching URLs without revision info: ${t.join(", ")}
|
|
2
|
+
This is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(c)}}}install(e){return v(e,async()=>{const t=new Y;this.strategy.plugins.push(t);for(const[i,r]of this._urlsToCacheKeys){const c=this._cacheKeysToIntegrities.get(r),o=this._urlsToCacheModes.get(i),l=new Request(i,{integrity:c,cache:o,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:r},request:l,event:e}))}const{updatedURLs:n,notUpdatedURLs:a}=t;return{updatedURLs:n,notUpdatedURLs:a}})}activate(e){return v(e,async()=>{const t=await self.caches.open(this.strategy.cacheName),n=await t.keys(),a=new Set(this._urlsToCacheKeys.values()),i=[];for(const r of n)a.has(r.url)||(await t.delete(r),i.push(r.url));return{deletedURLs:i}})}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){const t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){const 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){const t=this.getCacheKeyForURL(e);if(!t)throw new h("non-precached-url",{url:e});return n=>(n.request=new Request(e),n.params=Object.assign({cacheKey:t},n.params),this.strategy.handle(n))}}let D;const j=()=>(D||(D=new oe),D);try{self["workbox:routing:7.3.0"]&&_()}catch{}const F="GET",x=s=>s&&typeof s=="object"?s:{handle:s};class R{constructor(e,t,n=F){this.handler=x(t),this.match=e,this.method=n}setCatchHandler(e){this.catchHandler=x(e)}}class le extends R{constructor(e,t,n){const a=({url:i})=>{const r=e.exec(i.href);if(r&&!(i.origin!==location.origin&&r.index!==0))return r.slice(1)};super(a,t,n)}}class he{constructor(){this._routes=new Map,this._defaultHandlerMap=new Map}get routes(){return this._routes}addFetchListener(){self.addEventListener("fetch",(e=>{const{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"){const{payload:t}=e.data,n=Promise.all(t.urlsToCache.map(a=>{typeof a=="string"&&(a=[a]);const i=new Request(...a);return this.handleRequest({request:i,event:e})}));e.waitUntil(n),e.ports&&e.ports[0]&&n.then(()=>e.ports[0].postMessage(!0))}}))}handleRequest({request:e,event:t}){const n=new URL(e.url,location.href);if(!n.protocol.startsWith("http"))return;const a=n.origin===location.origin,{params:i,route:r}=this.findMatchingRoute({event:t,request:e,sameOrigin:a,url:n});let c=r&&r.handler;const o=e.method;if(!c&&this._defaultHandlerMap.has(o)&&(c=this._defaultHandlerMap.get(o)),!c)return;let l;try{l=c.handle({url:n,request:e,event:t,params:i})}catch(u){l=Promise.reject(u)}const g=r&&r.catchHandler;return l instanceof Promise&&(this._catchHandler||g)&&(l=l.catch(async u=>{if(g)try{return await g.handle({url:n,request:e,event:t,params:i})}catch(N){N instanceof Error&&(u=N)}if(this._catchHandler)return this._catchHandler.handle({url:n,request:e,event:t});throw u})),l}findMatchingRoute({url:e,sameOrigin:t,request:n,event:a}){const i=this._routes.get(n.method)||[];for(const r of i){let c;const o=r.match({url:e,sameOrigin:t,request:n,event:a});if(o)return c=o,(Array.isArray(c)&&c.length===0||o.constructor===Object&&Object.keys(o).length===0||typeof o=="boolean")&&(c=void 0),{route:r,params:c}}return{}}setDefaultHandler(e,t=F){this._defaultHandlerMap.set(t,x(e))}setCatchHandler(e){this._catchHandler=x(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 h("unregister-route-but-not-found-with-method",{method:e.method});const t=this._routes.get(e.method).indexOf(e);if(t>-1)this._routes.get(e.method).splice(t,1);else throw new h("unregister-route-route-not-registered")}}let y;const ue=()=>(y||(y=new he,y.addFetchListener(),y.addCacheListener()),y);function q(s,e,t){let n;if(typeof s=="string"){const i=new URL(s,location.href),r=({url:c})=>c.href===i.href;n=new R(r,e,t)}else if(s instanceof RegExp)n=new le(s,e,t);else if(typeof s=="function")n=new R(s,e,t);else if(s instanceof R)n=s;else throw new h("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});return ue().registerRoute(n),n}function de(s,e=[]){for(const t of[...s.searchParams.keys()])e.some(n=>n.test(t))&&s.searchParams.delete(t);return s}function*fe(s,{ignoreURLParametersMatching:e=[/^utm_/,/^fbclid$/],directoryIndex:t="index.html",cleanURLs:n=!0,urlManipulation:a}={}){const i=new URL(s,location.href);i.hash="",yield i.href;const r=de(i,e);if(yield r.href,t&&r.pathname.endsWith("/")){const c=new URL(r.href);c.pathname+=t,yield c.href}if(n){const c=new URL(r.href);c.pathname+=".html",yield c.href}if(a){const c=a({url:i});for(const o of c)yield o.href}}class pe extends R{constructor(e,t){const n=({request:a})=>{const i=e.getURLsToCacheKeys();for(const r of fe(a.url,t)){const c=i.get(r);if(c){const o=e.getIntegrityForCacheKey(c);return{cacheKey:c,integrity:o}}}};super(n,e.strategy)}}function ge(s){const e=j(),t=new pe(e,s);q(t)}const me="-precache-",ye=async(s,e=me)=>{const n=(await self.caches.keys()).filter(a=>a.includes(e)&&a.includes(self.registration.scope)&&a!==s);return await Promise.all(n.map(a=>self.caches.delete(a))),n};function we(){self.addEventListener("activate",(s=>{const e=b.getPrecacheName();s.waitUntil(ye(e).then(t=>{}))}))}function _e(s){j().precache(s)}function Re(s,e){_e(s),ge(e)}class be extends W{async _handle(e,t){let n=await t.cacheMatch(e),a;if(!n)try{n=await t.fetchAndCachePut(e)}catch(i){i instanceof Error&&(a=i)}if(!n)throw new h("no-response",{url:e.url,error:a});return n}}function H(s){s.then(()=>{})}const Ce=(s,e)=>e.some(t=>s instanceof t);let A,K;function xe(){return A||(A=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction])}function Ee(){return K||(K=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])}const V=new WeakMap,k=new WeakMap,$=new WeakMap,L=new WeakMap,P=new WeakMap;function De(s){const e=new Promise((t,n)=>{const a=()=>{s.removeEventListener("success",i),s.removeEventListener("error",r)},i=()=>{t(f(s.result)),a()},r=()=>{n(s.error),a()};s.addEventListener("success",i),s.addEventListener("error",r)});return e.then(t=>{t instanceof IDBCursor&&V.set(t,s)}).catch(()=>{}),P.set(e,s),e}function Le(s){if(k.has(s))return;const e=new Promise((t,n)=>{const a=()=>{s.removeEventListener("complete",i),s.removeEventListener("error",r),s.removeEventListener("abort",r)},i=()=>{t(),a()},r=()=>{n(s.error||new DOMException("AbortError","AbortError")),a()};s.addEventListener("complete",i),s.addEventListener("error",r),s.addEventListener("abort",r)});k.set(s,e)}let I={get(s,e,t){if(s instanceof IDBTransaction){if(e==="done")return k.get(s);if(e==="objectStoreNames")return s.objectStoreNames||$.get(s);if(e==="store")return t.objectStoreNames[1]?void 0:t.objectStore(t.objectStoreNames[0])}return f(s[e])},set(s,e,t){return s[e]=t,!0},has(s,e){return s instanceof IDBTransaction&&(e==="done"||e==="store")?!0:e in s}};function Ue(s){I=s(I)}function Te(s){return s===IDBDatabase.prototype.transaction&&!("objectStoreNames"in IDBTransaction.prototype)?function(e,...t){const n=s.call(U(this),e,...t);return $.set(n,e.sort?e.sort():[e]),f(n)}:Ee().includes(s)?function(...e){return s.apply(U(this),e),f(V.get(this))}:function(...e){return f(s.apply(U(this),e))}}function ke(s){return typeof s=="function"?Te(s):(s instanceof IDBTransaction&&Le(s),Ce(s,xe())?new Proxy(s,I):s)}function f(s){if(s instanceof IDBRequest)return De(s);if(L.has(s))return L.get(s);const e=ke(s);return e!==s&&(L.set(s,e),P.set(e,s)),e}const U=s=>P.get(s);function Ie(s,e,{blocked:t,upgrade:n,blocking:a,terminated:i}={}){const r=indexedDB.open(s,e),c=f(r);return n&&r.addEventListener("upgradeneeded",o=>{n(f(r.result),o.oldVersion,o.newVersion,f(r.transaction),o)}),t&&r.addEventListener("blocked",o=>t(o.oldVersion,o.newVersion,o)),c.then(o=>{i&&o.addEventListener("close",()=>i()),a&&o.addEventListener("versionchange",l=>a(l.oldVersion,l.newVersion,l))}).catch(()=>{}),c}function Pe(s,{blocked:e}={}){const t=indexedDB.deleteDatabase(s);return e&&t.addEventListener("blocked",n=>e(n.oldVersion,n)),f(t).then(()=>{})}const Ne=["get","getKey","getAll","getAllKeys","count"],ve=["put","add","delete","clear"],T=new Map;function O(s,e){if(!(s instanceof IDBDatabase&&!(e in s)&&typeof e=="string"))return;if(T.get(e))return T.get(e);const t=e.replace(/FromIndex$/,""),n=e!==t,a=ve.includes(t);if(!(t in(n?IDBIndex:IDBObjectStore).prototype)||!(a||Ne.includes(t)))return;const i=async function(r,...c){const o=this.transaction(r,a?"readwrite":"readonly");let l=o.store;return n&&(l=l.index(c.shift())),(await Promise.all([l[t](...c),a&&o.done]))[0]};return T.set(e,i),i}Ue(s=>({...s,get:(e,t,n)=>O(e,t)||s.get(e,t,n),has:(e,t)=>!!O(e,t)||s.has(e,t)}));try{self["workbox:expiration:7.3.0"]&&_()}catch{}const Me="workbox-expiration",w="cache-entries",S=s=>{const e=new URL(s,location.href);return e.hash="",e.href};class Ae{constructor(e){this._db=null,this._cacheName=e}_upgradeDb(e){const t=e.createObjectStore(w,{keyPath:"id"});t.createIndex("cacheName","cacheName",{unique:!1}),t.createIndex("timestamp","timestamp",{unique:!1})}_upgradeDbAndDeleteOldDbs(e){this._upgradeDb(e),this._cacheName&&Pe(this._cacheName)}async setTimestamp(e,t){e=S(e);const n={url:e,timestamp:t,cacheName:this._cacheName,id:this._getId(e)},i=(await this.getDb()).transaction(w,"readwrite",{durability:"relaxed"});await i.store.put(n),await i.done}async getTimestamp(e){const n=await(await this.getDb()).get(w,this._getId(e));return n==null?void 0:n.timestamp}async expireEntries(e,t){const n=await this.getDb();let a=await n.transaction(w).store.index("timestamp").openCursor(null,"prev");const i=[];let r=0;for(;a;){const o=a.value;o.cacheName===this._cacheName&&(e&&o.timestamp<e||t&&r>=t?i.push(a.value):r++),a=await a.continue()}const c=[];for(const o of i)await n.delete(w,o.id),c.push(o.url);return c}_getId(e){return this._cacheName+"|"+S(e)}async getDb(){return this._db||(this._db=await Ie(Me,1,{upgrade:this._upgradeDbAndDeleteOldDbs.bind(this)})),this._db}}class Ke{constructor(e,t={}){this._isRunning=!1,this._rerunRequested=!1,this._maxEntries=t.maxEntries,this._maxAgeSeconds=t.maxAgeSeconds,this._matchOptions=t.matchOptions,this._cacheName=e,this._timestampModel=new Ae(e)}async expireEntries(){if(this._isRunning){this._rerunRequested=!0;return}this._isRunning=!0;const e=this._maxAgeSeconds?Date.now()-this._maxAgeSeconds*1e3:0,t=await this._timestampModel.expireEntries(e,this._maxEntries),n=await self.caches.open(this._cacheName);for(const a of t)await n.delete(a,this._matchOptions);this._isRunning=!1,this._rerunRequested&&(this._rerunRequested=!1,H(this.expireEntries()))}async updateTimestamp(e){await this._timestampModel.setTimestamp(e,Date.now())}async isURLExpired(e){if(this._maxAgeSeconds){const t=await this._timestampModel.getTimestamp(e),n=Date.now()-this._maxAgeSeconds*1e3;return t!==void 0?t<n:!0}else return!1}async delete(){this._rerunRequested=!1,await this._timestampModel.expireEntries(1/0)}}function Oe(s){B.add(s)}class Se{constructor(e={}){this.cachedResponseWillBeUsed=async({event:t,request:n,cacheName:a,cachedResponse:i})=>{if(!i)return null;const r=this._isResponseDateFresh(i),c=this._getCacheExpiration(a);H(c.expireEntries());const o=c.updateTimestamp(n.url);if(t)try{t.waitUntil(o)}catch{}return r?i:null},this.cacheDidUpdate=async({cacheName:t,request:n})=>{const a=this._getCacheExpiration(t);await a.updateTimestamp(n.url),await a.expireEntries()},this._config=e,this._maxAgeSeconds=e.maxAgeSeconds,this._cacheExpirations=new Map,e.purgeOnQuotaError&&Oe(()=>this.deleteCacheAndMetadata())}_getCacheExpiration(e){if(e===b.getRuntimeName())throw new h("expire-custom-caches-only");let t=this._cacheExpirations.get(e);return t||(t=new Ke(e,this._config),this._cacheExpirations.set(e,t)),t}_isResponseDateFresh(e){if(!this._maxAgeSeconds)return!0;const t=this._getDateHeaderTimestamp(e);if(t===null)return!0;const n=Date.now();return t>=n-this._maxAgeSeconds*1e3}_getDateHeaderTimestamp(e){if(!e.headers.has("date"))return null;const t=e.headers.get("date"),a=new Date(t).getTime();return isNaN(a)?null:a}async deleteCacheAndMetadata(){for(const[e,t]of this._cacheExpirations)await self.caches.delete(e),await t.delete();this._cacheExpirations=new Map}}Re([{"revision":"1872c500de691dce40960bb85481de07","url":"registerSW.js"},{"revision":"0f93805414c783a30b72e0ce88f2c7c4","url":"icons/icon.svg"},{"revision":"5dee5ddcd8e8533edb348118334d9756","url":"icons/icon-512.png"},{"revision":"75734e6b38a556148f51b9e10eeb01c8","url":"icons/icon-192.png"},{"revision":"0362e0eb00358646fd4c97674945adba","url":"icons/icon-180.png"},{"revision":null,"url":"assets/xychartDiagram-JWTSCODW-DafJ-a-f.js"},{"revision":null,"url":"assets/vennDiagram-LZ73GAT5-DzlX55oz.js"},{"revision":null,"url":"assets/treemap-KZPCXAKY-0OLZO-76.js"},{"revision":null,"url":"assets/timeline-definition-YZTLITO2-BHWYxexH.js"},{"revision":null,"url":"assets/stateDiagram-v2-FVOUBMTO-lYMaTr7v.js"},{"revision":null,"url":"assets/stateDiagram-RAJIS63D-wf6b0MTk.js"},{"revision":null,"url":"assets/sequenceDiagram-2WXFIKYE-CjTa5Eua.js"},{"revision":null,"url":"assets/sankeyDiagram-WA2Y5GQK-GoTjgmGo.js"},{"revision":null,"url":"assets/requirementDiagram-Z7DCOOCP-BC1_RS6p.js"},{"revision":null,"url":"assets/quadrantDiagram-337W2JSQ-DWGyMcZ6.js"},{"revision":null,"url":"assets/pieDiagram-SKSYHLDU-DCNv1DYe.js"},{"revision":null,"url":"assets/ordinal-Cboi1Yqb.js"},{"revision":null,"url":"assets/mindmap-definition-YRQLILUH-C6Jy7Tz1.js"},{"revision":null,"url":"assets/linear-CSYWJnE5.js"},{"revision":null,"url":"assets/layout-DTAwaKXg.js"},{"revision":null,"url":"assets/katex-B1X10hvy.js"},{"revision":null,"url":"assets/kanban-definition-K7BYSVSG-DDGFShX4.js"},{"revision":null,"url":"assets/journeyDiagram-4ABVD52K-2QGufcXt.js"},{"revision":null,"url":"assets/ishikawaDiagram-PHBUUO56-Ny_4n8vD.js"},{"revision":null,"url":"assets/init-Gi6I4Gst.js"},{"revision":null,"url":"assets/infoDiagram-LFFYTUFH-C0cd4K10.js"},{"revision":null,"url":"assets/index-DBnflEQZ.js"},{"revision":null,"url":"assets/index-BzV_FYAW.css"},{"revision":null,"url":"assets/graph-NJUd-2rr.js"},{"revision":null,"url":"assets/gitGraphDiagram-K3NZZRJ6-CMuK7hOw.js"},{"revision":null,"url":"assets/ganttDiagram-A5KZAMGK-oBrRehQA.js"},{"revision":null,"url":"assets/flowDiagram-PKNHOUZH-BxCqn1aV.js"},{"revision":null,"url":"assets/erDiagram-INFDFZHY-D2aAhxDx.js"},{"revision":null,"url":"assets/diagram-P4PSJMXO-Cb0uoPeh.js"},{"revision":null,"url":"assets/diagram-IFDJBPK2-DtSlXz7u.js"},{"revision":null,"url":"assets/diagram-E7M64L7V-B7XX1Mqr.js"},{"revision":null,"url":"assets/defaultLocale-DX6XiGOO.js"},{"revision":null,"url":"assets/dagre-KLK3FWXG-CK-UftHZ.js"},{"revision":null,"url":"assets/cytoscape.esm-BQaXIfA_.js"},{"revision":null,"url":"assets/cose-bilkent-S5V4N54A-BHgn8K1Z.js"},{"revision":null,"url":"assets/clone-Zyw2C-Y3.js"},{"revision":null,"url":"assets/classDiagram-v2-RAHNMMFH-Ca3s5d8r.js"},{"revision":null,"url":"assets/classDiagram-VBA2DB6C-Ca3s5d8r.js"},{"revision":null,"url":"assets/chunk-WL4C6EOR-BFkfV9d-.js"},{"revision":null,"url":"assets/chunk-QZHKN3VN-D1hlvsPG.js"},{"revision":null,"url":"assets/chunk-NQ4KR5QH-DENB8fT9.js"},{"revision":null,"url":"assets/chunk-KX2RTZJC-DR85cVBM.js"},{"revision":null,"url":"assets/chunk-JSJVCQXG-CdSwCmzy.js"},{"revision":null,"url":"assets/chunk-FMBD7UC4-CVO2u-Sv.js"},{"revision":null,"url":"assets/chunk-55IACEB6-DF8ZBVw6.js"},{"revision":null,"url":"assets/chunk-4BX2VUAB-DslNFup8.js"},{"revision":null,"url":"assets/channel-BK2nwbl-.js"},{"revision":null,"url":"assets/c4Diagram-IC4MRINW-CHJjiNgt.js"},{"revision":null,"url":"assets/blockDiagram-WCTKOSBZ-BmfWKjiE.js"},{"revision":null,"url":"assets/architectureDiagram-2XIMDMQ5-DLhsY97x.js"},{"revision":null,"url":"assets/arc-CiPooz6h.js"},{"revision":null,"url":"assets/_baseUniq-DOa_cDXJ.js"},{"revision":null,"url":"assets/_basePickBy-SVV3-IdA.js"},{"revision":"0362e0eb00358646fd4c97674945adba","url":"icons/icon-180.png"},{"revision":"75734e6b38a556148f51b9e10eeb01c8","url":"icons/icon-192.png"},{"revision":"5dee5ddcd8e8533edb348118334d9756","url":"icons/icon-512.png"},{"revision":"b0747e8d6cde0d45e05be8e5c731729e","url":"manifest.webmanifest"}]);we();q(({url:s})=>s.hostname==="cdn.jsdelivr.net"&&s.pathname.endsWith(".ttf"),new be({cacheName:"termbeam-fonts",plugins:[new Se({maxEntries:5,maxAgeSeconds:365*24*60*60})]}));self.addEventListener("message",s=>{var e;((e=s.data)==null?void 0:e.type)==="CLEAR_CACHES"&&caches.keys().then(t=>{for(const n of t)n!=="workbox-precache-v2"&&caches.delete(n)})});self.addEventListener("install",()=>{self.skipWaiting()});self.addEventListener("activate",s=>{s.waitUntil(caches.delete("termbeam-navigation").then(()=>self.clients.claim()))});self.addEventListener("push",s=>{let e={title:"Command finished",body:"TermBeam"};if(s.data)try{e=s.data.json()}catch{}s.waitUntil(self.clients.matchAll({type:"window",includeUncontrolled:!0}).then(async t=>{if(t.some(i=>i.url.includes(self.location.origin)&&i.focused))return;const a={body:e.body||"A command has completed",icon:"/icons/icon-192.png",badge:"/icons/icon-192.png",tag:e.tag||"termbeam-cmd",renotify:!0,data:{url:e.url||"/",type:e.type||"command-complete",sessionId:e.sessionId},vibrate:[200,100,200]};try{await self.navigator.setAppBadge(1)}catch{}return self.registration.showNotification(e.title||"Command finished",a)}))});self.addEventListener("notificationclick",s=>{s.notification.close();try{self.navigator.clearAppBadge()}catch{}const e=s.notification.data||{},t=e.url||"/",n=e.type||"";s.waitUntil(self.clients.matchAll({type:"window",includeUncontrolled:!0}).then(a=>{for(const i of a)if(i.url.includes(self.location.origin)&&"focus"in i)return n&&i.postMessage({type:"NOTIFICATION_CLICKED",notificationType:n,sessionId:e.sessionId}),i.focus();return self.clients.openWindow(t)}))});
|
package/src/server/index.js
CHANGED
|
@@ -13,7 +13,13 @@ const { createAuth } = require('./auth');
|
|
|
13
13
|
const { SessionManager } = require('./sessions');
|
|
14
14
|
const { setupRoutes, cleanupUploadedFiles } = require('./routes');
|
|
15
15
|
const { setupWebSocket } = require('./websocket');
|
|
16
|
-
const {
|
|
16
|
+
const {
|
|
17
|
+
startTunnel,
|
|
18
|
+
cleanupTunnel,
|
|
19
|
+
findDevtunnel,
|
|
20
|
+
tunnelEvents,
|
|
21
|
+
getLoginInfo,
|
|
22
|
+
} = require('../tunnel');
|
|
17
23
|
const { createPreviewProxy } = require('./preview');
|
|
18
24
|
const { writeConnectionConfig, removeConnectionConfig } = require('../cli/resume');
|
|
19
25
|
const { checkForUpdate, detectInstallMethod } = require('../utils/update-check');
|
|
@@ -65,6 +71,9 @@ function createTermBeamServer(overrides = {}) {
|
|
|
65
71
|
title: 'Command finished',
|
|
66
72
|
body: `Session: ${sessionName}`,
|
|
67
73
|
tag: `termbeam-cmd-${sessionId}-${Date.now()}`,
|
|
74
|
+
url: `/terminal`,
|
|
75
|
+
type: 'command-complete',
|
|
76
|
+
sessionId,
|
|
68
77
|
})
|
|
69
78
|
.catch((err) => {
|
|
70
79
|
log.warn(`Push notification failed: ${err.message}`);
|
|
@@ -96,7 +105,7 @@ function createTermBeamServer(overrides = {}) {
|
|
|
96
105
|
const server = http.createServer(app);
|
|
97
106
|
const wss = new WebSocketServer({ server, path: '/ws', maxPayload: 1 * 1024 * 1024 });
|
|
98
107
|
|
|
99
|
-
const state = { shareBaseUrl: null, updateInfo: null, wss };
|
|
108
|
+
const state = { shareBaseUrl: null, updateInfo: null, wss, tunnelStatus: null, getLoginInfo };
|
|
100
109
|
app.use('/preview', auth.middleware, createPreviewProxy());
|
|
101
110
|
setupRoutes(app, { auth, sessions, config, state, pushManager });
|
|
102
111
|
setupWebSocket(wss, { auth, sessions });
|
|
@@ -247,33 +256,52 @@ function createTermBeamServer(overrides = {}) {
|
|
|
247
256
|
|
|
248
257
|
let publicUrl = null;
|
|
249
258
|
if (config.useTunnel) {
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
anonymous: config.publicTunnel,
|
|
253
|
-
});
|
|
254
|
-
if (tunnel) {
|
|
255
|
-
publicUrl = tunnel.url;
|
|
256
|
-
state.shareBaseUrl = publicUrl;
|
|
257
|
-
} else {
|
|
258
|
-
log.warn('Tunnel failed to start, falling back to LAN-only');
|
|
259
|
-
console.log(' ⚠️ Tunnel failed to start. Using LAN only.');
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// Tunnel watchdog events
|
|
259
|
+
// Wire up tunnel events BEFORE starting (startTunnel emits during setup)
|
|
260
|
+
tunnelEvents.removeAllListeners();
|
|
263
261
|
tunnelEvents.on('disconnected', () => {
|
|
264
262
|
log.warn('Tunnel disconnected — watchdog will attempt to reconnect');
|
|
263
|
+
state.tunnelStatus = { state: 'disconnected' };
|
|
264
|
+
});
|
|
265
|
+
tunnelEvents.on('auth-expired', () => {
|
|
266
|
+
log.warn('Tunnel auth expired — run "devtunnel user login" on host to restore');
|
|
267
|
+
state.tunnelStatus = { state: 'auth-expired' };
|
|
268
|
+
});
|
|
269
|
+
tunnelEvents.on('auth-restored', () => {
|
|
270
|
+
log.info('Tunnel auth restored — resuming reconnection');
|
|
265
271
|
});
|
|
266
272
|
tunnelEvents.on('reconnecting', ({ attempt, delay }) => {
|
|
267
273
|
log.info(`Tunnel reconnecting (attempt ${attempt}, backoff ${delay}ms)`);
|
|
268
274
|
});
|
|
269
275
|
tunnelEvents.on('connected', ({ url }) => {
|
|
270
276
|
log.info(`Tunnel connected: ${url}`);
|
|
277
|
+
state.tunnelStatus = { state: 'connected' };
|
|
271
278
|
});
|
|
272
279
|
tunnelEvents.on('failed', ({ attempts }) => {
|
|
273
280
|
log.error(
|
|
274
281
|
`Tunnel watchdog gave up after ${attempts} attempts — tunnel URL is unreachable`,
|
|
275
282
|
);
|
|
283
|
+
state.tunnelStatus = { state: 'failed' };
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
const tunnel = await startTunnel(actualPort, {
|
|
287
|
+
persisted: config.persistedTunnel,
|
|
288
|
+
anonymous: config.publicTunnel,
|
|
276
289
|
});
|
|
290
|
+
if (tunnel) {
|
|
291
|
+
publicUrl = tunnel.url;
|
|
292
|
+
state.shareBaseUrl = publicUrl;
|
|
293
|
+
} else {
|
|
294
|
+
// Check if failure is due to missing auth
|
|
295
|
+
const loginInfo = getLoginInfo();
|
|
296
|
+
if (!loginInfo) {
|
|
297
|
+
log.warn('Tunnel failed to start — not authenticated.');
|
|
298
|
+
console.log(' ⚠️ Tunnel auth required. Log in with: devtunnel user login -e -d');
|
|
299
|
+
state.tunnelStatus = { state: 'auth-expired' };
|
|
300
|
+
} else {
|
|
301
|
+
log.warn('Tunnel failed to start, falling back to LAN-only');
|
|
302
|
+
console.log(' ⚠️ Tunnel failed to start. Using LAN only.');
|
|
303
|
+
}
|
|
304
|
+
}
|
|
277
305
|
}
|
|
278
306
|
|
|
279
307
|
console.log(` Shell: ${config.shell}`);
|
package/src/server/routes.js
CHANGED
|
@@ -595,7 +595,7 @@ function setupRoutes(app, { auth, sessions, config, state, pushManager }) {
|
|
|
595
595
|
return res.status(400).json({ error: 'Invalid dir parameter' });
|
|
596
596
|
}
|
|
597
597
|
|
|
598
|
-
const rootDir = path.resolve(
|
|
598
|
+
const rootDir = path.resolve(sessions.getSessionCwd(req.params.id));
|
|
599
599
|
const dir = path.resolve(rootDir, req.query.dir || '.');
|
|
600
600
|
|
|
601
601
|
const MAX_ENTRIES = 1000;
|
|
@@ -666,7 +666,7 @@ function setupRoutes(app, { auth, sessions, config, state, pushManager }) {
|
|
|
666
666
|
depth = parsedDepth;
|
|
667
667
|
}
|
|
668
668
|
depth = Math.min(Math.max(depth, 1), MAX_DEPTH);
|
|
669
|
-
const rootDir = path.resolve(
|
|
669
|
+
const rootDir = path.resolve(sessions.getSessionCwd(req.params.id));
|
|
670
670
|
let totalEntries = 0;
|
|
671
671
|
|
|
672
672
|
function buildTree(dir, currentDepth) {
|
|
@@ -749,7 +749,7 @@ function setupRoutes(app, { auth, sessions, config, state, pushManager }) {
|
|
|
749
749
|
return res.status(400).json({ error: 'Missing file parameter' });
|
|
750
750
|
}
|
|
751
751
|
|
|
752
|
-
const rootDir = path.resolve(
|
|
752
|
+
const rootDir = path.resolve(sessions.getSessionCwd(req.params.id));
|
|
753
753
|
const filePath = path.resolve(rootDir, file);
|
|
754
754
|
|
|
755
755
|
try {
|
|
@@ -780,7 +780,7 @@ function setupRoutes(app, { auth, sessions, config, state, pushManager }) {
|
|
|
780
780
|
return res.status(400).json({ error: 'Missing file parameter' });
|
|
781
781
|
}
|
|
782
782
|
|
|
783
|
-
const rootDir = path.resolve(
|
|
783
|
+
const rootDir = path.resolve(sessions.getSessionCwd(req.params.id));
|
|
784
784
|
const filePath = path.resolve(rootDir, file);
|
|
785
785
|
|
|
786
786
|
try {
|
|
@@ -811,7 +811,7 @@ function setupRoutes(app, { auth, sessions, config, state, pushManager }) {
|
|
|
811
811
|
return res.status(400).json({ error: 'Missing file parameter' });
|
|
812
812
|
}
|
|
813
813
|
|
|
814
|
-
const rootDir = path.resolve(
|
|
814
|
+
const rootDir = path.resolve(sessions.getSessionCwd(req.params.id));
|
|
815
815
|
const filePath = path.resolve(rootDir, file);
|
|
816
816
|
|
|
817
817
|
try {
|
|
@@ -849,7 +849,7 @@ function setupRoutes(app, { auth, sessions, config, state, pushManager }) {
|
|
|
849
849
|
if (!session) return res.status(404).json({ error: 'Session not found' });
|
|
850
850
|
|
|
851
851
|
try {
|
|
852
|
-
const status = await getDetailedStatus(
|
|
852
|
+
const status = await getDetailedStatus(sessions.getSessionCwd(req.params.id));
|
|
853
853
|
res.json(status);
|
|
854
854
|
} catch (err) {
|
|
855
855
|
log.warn(`Git status failed: ${err.message}`);
|
|
@@ -876,7 +876,11 @@ function setupRoutes(app, { auth, sessions, config, state, pushManager }) {
|
|
|
876
876
|
}
|
|
877
877
|
}
|
|
878
878
|
try {
|
|
879
|
-
const diff = await getFileDiff(
|
|
879
|
+
const diff = await getFileDiff(sessions.getSessionCwd(req.params.id), file, {
|
|
880
|
+
staged,
|
|
881
|
+
untracked,
|
|
882
|
+
context,
|
|
883
|
+
});
|
|
880
884
|
res.json(diff);
|
|
881
885
|
} catch (err) {
|
|
882
886
|
log.warn(`Git diff failed: ${err.message}`);
|
|
@@ -894,7 +898,7 @@ function setupRoutes(app, { auth, sessions, config, state, pushManager }) {
|
|
|
894
898
|
}
|
|
895
899
|
|
|
896
900
|
try {
|
|
897
|
-
const blame = await getFileBlame(
|
|
901
|
+
const blame = await getFileBlame(sessions.getSessionCwd(req.params.id), file);
|
|
898
902
|
res.json(blame);
|
|
899
903
|
} catch (err) {
|
|
900
904
|
log.warn(`Git blame failed: ${err.message}`);
|
|
@@ -913,7 +917,10 @@ function setupRoutes(app, { auth, sessions, config, state, pushManager }) {
|
|
|
913
917
|
}
|
|
914
918
|
|
|
915
919
|
try {
|
|
916
|
-
const logResult = await getGitLog(
|
|
920
|
+
const logResult = await getGitLog(sessions.getSessionCwd(req.params.id), {
|
|
921
|
+
limit,
|
|
922
|
+
file: file || null,
|
|
923
|
+
});
|
|
917
924
|
res.json(logResult);
|
|
918
925
|
} catch (err) {
|
|
919
926
|
log.warn(`Git log failed: ${err.message}`);
|
|
@@ -977,6 +984,23 @@ function setupRoutes(app, { auth, sessions, config, state, pushManager }) {
|
|
|
977
984
|
res.json({ ok: true });
|
|
978
985
|
});
|
|
979
986
|
}
|
|
987
|
+
|
|
988
|
+
// --- Tunnel token renewal ---
|
|
989
|
+
app.get('/api/tunnel/status', apiRateLimit, auth.middleware, (_req, res) => {
|
|
990
|
+
const tunnelStatus = state.tunnelStatus || { state: 'unknown' };
|
|
991
|
+
// Injected via state to avoid loading the full tunnel module in test contexts
|
|
992
|
+
const getLoginInfo = state.getLoginInfo;
|
|
993
|
+
const loginInfo = getLoginInfo ? getLoginInfo() : null;
|
|
994
|
+
res.json({
|
|
995
|
+
...tunnelStatus,
|
|
996
|
+
provider: loginInfo?.provider ?? null,
|
|
997
|
+
tokenLifetimeSeconds: loginInfo?.tokenLifetimeSeconds ?? null,
|
|
998
|
+
});
|
|
999
|
+
});
|
|
1000
|
+
|
|
1001
|
+
// Tunnel renew endpoint removed — DevTunnel CLI auto-refreshes OAuth
|
|
1002
|
+
// tokens. If auth truly expires, user must run "devtunnel user login" on
|
|
1003
|
+
// the host machine; the watchdog auto-reconnects after re-auth.
|
|
980
1004
|
}
|
|
981
1005
|
|
|
982
1006
|
function cleanupUploadedFiles() {
|
package/src/server/sessions.js
CHANGED
|
@@ -407,10 +407,30 @@ class SessionManager {
|
|
|
407
407
|
return true;
|
|
408
408
|
}
|
|
409
409
|
|
|
410
|
+
/** Get the live CWD for a session (detected from PTY process). */
|
|
411
|
+
getSessionCwd(id) {
|
|
412
|
+
const s = this.sessions.get(id);
|
|
413
|
+
if (!s) return null;
|
|
414
|
+
const cached = _gitCache.get(id);
|
|
415
|
+
if (cached && cached.cwd) {
|
|
416
|
+
// Update session.cwd so endpoints using session.cwd directly get fresh values
|
|
417
|
+
s.cwd = cached.cwd;
|
|
418
|
+
return cached.cwd;
|
|
419
|
+
}
|
|
420
|
+
// Trigger a refresh for next time
|
|
421
|
+
scheduleGitRefresh(id, s.pty.pid, s.cwd);
|
|
422
|
+
return s.cwd;
|
|
423
|
+
}
|
|
424
|
+
|
|
410
425
|
list() {
|
|
411
426
|
const list = [];
|
|
412
427
|
for (const [id, s] of this.sessions) {
|
|
413
428
|
const { cwd, git } = getCachedGitInfo(id, s.pty.pid, s.cwd);
|
|
429
|
+
// Keep session.cwd in sync with detected live CWD
|
|
430
|
+
if (cwd !== s.cwd) {
|
|
431
|
+
log.debug(`Session ${id} CWD changed: ${s.cwd} → ${cwd}`);
|
|
432
|
+
s.cwd = cwd;
|
|
433
|
+
}
|
|
414
434
|
list.push({
|
|
415
435
|
id,
|
|
416
436
|
name: s.name,
|