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.
Files changed (60) hide show
  1. package/package.json +1 -1
  2. package/public/assets/{_basePickBy-Bx4czgjK.js → _basePickBy-SVV3-IdA.js} +1 -1
  3. package/public/assets/{_baseUniq-B_xhLk1b.js → _baseUniq-DOa_cDXJ.js} +1 -1
  4. package/public/assets/{arc-_Z6A8o27.js → arc-CiPooz6h.js} +1 -1
  5. package/public/assets/{architectureDiagram-2XIMDMQ5-DDtL0DSL.js → architectureDiagram-2XIMDMQ5-DLhsY97x.js} +1 -1
  6. package/public/assets/{blockDiagram-WCTKOSBZ-DYgWhdwH.js → blockDiagram-WCTKOSBZ-BmfWKjiE.js} +1 -1
  7. package/public/assets/{c4Diagram-IC4MRINW-DlbE0l99.js → c4Diagram-IC4MRINW-CHJjiNgt.js} +1 -1
  8. package/public/assets/channel-BK2nwbl-.js +1 -0
  9. package/public/assets/{chunk-4BX2VUAB-BbtQtJab.js → chunk-4BX2VUAB-DslNFup8.js} +1 -1
  10. package/public/assets/{chunk-55IACEB6-Dk_FjBN6.js → chunk-55IACEB6-DF8ZBVw6.js} +1 -1
  11. package/public/assets/{chunk-FMBD7UC4-BSOODOC9.js → chunk-FMBD7UC4-CVO2u-Sv.js} +1 -1
  12. package/public/assets/{chunk-JSJVCQXG-B71Oj-xI.js → chunk-JSJVCQXG-CdSwCmzy.js} +1 -1
  13. package/public/assets/{chunk-KX2RTZJC-Bv_BWOZR.js → chunk-KX2RTZJC-DR85cVBM.js} +1 -1
  14. package/public/assets/{chunk-NQ4KR5QH-NrpJgmB3.js → chunk-NQ4KR5QH-DENB8fT9.js} +1 -1
  15. package/public/assets/{chunk-QZHKN3VN-BmrKPCfl.js → chunk-QZHKN3VN-D1hlvsPG.js} +1 -1
  16. package/public/assets/{chunk-WL4C6EOR-CpglQTvf.js → chunk-WL4C6EOR-BFkfV9d-.js} +1 -1
  17. package/public/assets/classDiagram-VBA2DB6C-Ca3s5d8r.js +1 -0
  18. package/public/assets/classDiagram-v2-RAHNMMFH-Ca3s5d8r.js +1 -0
  19. package/public/assets/clone-Zyw2C-Y3.js +1 -0
  20. package/public/assets/{cose-bilkent-S5V4N54A-DYL0lt4P.js → cose-bilkent-S5V4N54A-BHgn8K1Z.js} +1 -1
  21. package/public/assets/{dagre-KLK3FWXG-BNyGQfuq.js → dagre-KLK3FWXG-CK-UftHZ.js} +1 -1
  22. package/public/assets/{diagram-E7M64L7V-BueAxddl.js → diagram-E7M64L7V-B7XX1Mqr.js} +1 -1
  23. package/public/assets/{diagram-IFDJBPK2-Dr-u91gt.js → diagram-IFDJBPK2-DtSlXz7u.js} +1 -1
  24. package/public/assets/{diagram-P4PSJMXO-C1T2kE4V.js → diagram-P4PSJMXO-Cb0uoPeh.js} +1 -1
  25. package/public/assets/{erDiagram-INFDFZHY-CO2EjQ8J.js → erDiagram-INFDFZHY-D2aAhxDx.js} +1 -1
  26. package/public/assets/{flowDiagram-PKNHOUZH-T00X36Vw.js → flowDiagram-PKNHOUZH-BxCqn1aV.js} +1 -1
  27. package/public/assets/{ganttDiagram-A5KZAMGK-DgBggnkU.js → ganttDiagram-A5KZAMGK-oBrRehQA.js} +1 -1
  28. package/public/assets/{gitGraphDiagram-K3NZZRJ6-BSWTPOpC.js → gitGraphDiagram-K3NZZRJ6-CMuK7hOw.js} +1 -1
  29. package/public/assets/{graph-BT-QdyLg.js → graph-NJUd-2rr.js} +1 -1
  30. package/public/assets/{index-XvAS6GsK.css → index-BzV_FYAW.css} +1 -1
  31. package/public/assets/{index-CZRetRoe.js → index-DBnflEQZ.js} +106 -106
  32. package/public/assets/{infoDiagram-LFFYTUFH-Dj6pwKgk.js → infoDiagram-LFFYTUFH-C0cd4K10.js} +1 -1
  33. package/public/assets/{ishikawaDiagram-PHBUUO56-Db8O4ufB.js → ishikawaDiagram-PHBUUO56-Ny_4n8vD.js} +1 -1
  34. package/public/assets/{journeyDiagram-4ABVD52K-BpZ_Yrqs.js → journeyDiagram-4ABVD52K-2QGufcXt.js} +1 -1
  35. package/public/assets/{kanban-definition-K7BYSVSG-D3zRUDJP.js → kanban-definition-K7BYSVSG-DDGFShX4.js} +1 -1
  36. package/public/assets/{layout-BI7uDMCL.js → layout-DTAwaKXg.js} +1 -1
  37. package/public/assets/{linear-DgP566HT.js → linear-CSYWJnE5.js} +1 -1
  38. package/public/assets/{mindmap-definition-YRQLILUH-BXNxkbvs.js → mindmap-definition-YRQLILUH-C6Jy7Tz1.js} +1 -1
  39. package/public/assets/{pieDiagram-SKSYHLDU-CuMBI_xo.js → pieDiagram-SKSYHLDU-DCNv1DYe.js} +1 -1
  40. package/public/assets/{quadrantDiagram-337W2JSQ-7_kXk56H.js → quadrantDiagram-337W2JSQ-DWGyMcZ6.js} +1 -1
  41. package/public/assets/{requirementDiagram-Z7DCOOCP-Dc4encPC.js → requirementDiagram-Z7DCOOCP-BC1_RS6p.js} +1 -1
  42. package/public/assets/{sankeyDiagram-WA2Y5GQK-DSlUG_VS.js → sankeyDiagram-WA2Y5GQK-GoTjgmGo.js} +1 -1
  43. package/public/assets/{sequenceDiagram-2WXFIKYE-DaWz5El2.js → sequenceDiagram-2WXFIKYE-CjTa5Eua.js} +1 -1
  44. package/public/assets/{stateDiagram-RAJIS63D-B4oQefUl.js → stateDiagram-RAJIS63D-wf6b0MTk.js} +1 -1
  45. package/public/assets/stateDiagram-v2-FVOUBMTO-lYMaTr7v.js +1 -0
  46. package/public/assets/{timeline-definition-YZTLITO2-D9zlUa7w.js → timeline-definition-YZTLITO2-BHWYxexH.js} +1 -1
  47. package/public/assets/{treemap-KZPCXAKY-RGFpoXIT.js → treemap-KZPCXAKY-0OLZO-76.js} +1 -1
  48. package/public/assets/{vennDiagram-LZ73GAT5-D5gYnx59.js → vennDiagram-LZ73GAT5-DzlX55oz.js} +1 -1
  49. package/public/assets/{xychartDiagram-JWTSCODW-C7kxjkz6.js → xychartDiagram-JWTSCODW-DafJ-a-f.js} +1 -1
  50. package/public/index.html +2 -2
  51. package/public/sw.js +2 -2
  52. package/src/server/index.js +43 -15
  53. package/src/server/routes.js +33 -9
  54. package/src/server/sessions.js +20 -0
  55. package/src/tunnel/index.js +200 -55
  56. package/public/assets/channel-Cw6U4HD8.js +0 -1
  57. package/public/assets/classDiagram-VBA2DB6C-B8Ph5aUJ.js +0 -1
  58. package/public/assets/classDiagram-v2-RAHNMMFH-B8Ph5aUJ.js +0 -1
  59. package/public/assets/clone-tNYKz33q.js +0 -1
  60. 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)}))});
@@ -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 { startTunnel, cleanupTunnel, findDevtunnel, tunnelEvents } = require('../tunnel');
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
- const tunnel = await startTunnel(actualPort, {
251
- persisted: config.persistedTunnel,
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}`);
@@ -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(session.cwd);
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(session.cwd);
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(session.cwd);
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(session.cwd);
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(session.cwd);
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(session.cwd);
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(session.cwd, file, { staged, untracked, context });
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(session.cwd, file);
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(session.cwd, { limit, file: file || null });
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() {
@@ -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,