hennery-kernel 0.3.5

Storage, authentication, HTTP kernel and embedded UI for hennery
Documentation
1
(function(){var e={"/setup":`setup`,"/login":`login`,"/sessions":`sessions`,"/needs-you":`needs-you`,"/more":`more`,"/defaults":`defaults`,"/new":`new`,"/hosts":`hosts`,"/mcp":`mcp`,"/hats":`hats`,"/settings":`settings`};function t(t){let n=t.length>1?t.replace(/\/+$/,``):t;if(n===`/`)return{name:`sessions`};let r=e[n];if(r)return{name:r};let i=/^\/sessions\/([^/]+)$/.exec(n);if(i)try{return{name:`session`,id:decodeURIComponent(i[1])}}catch{return{name:`not_found`}}return{name:`not_found`}}function n(e){return e===`/api`||e.startsWith(`/api/`)||e.startsWith(`/mcp/`)?!1:![`setup`,`login`,`not_found`].includes(t(e).name)}var r=`hennery-shell-`,i=`/__hennery_shell_complete__`,a=`/__hennery_shell_replacement__`;async function o(e){return[...new Uint8Array(await crypto.subtle.digest(`SHA-256`,e))].map(e=>e.toString(16).padStart(2,`0`)).join(``)}async function s(e,t,n,s,c,l={origin:location.origin,digest:o},u=!1){let d=`${r}${s}-${c}`;if((await e.keys()).includes(d))throw Error(`cache attempt already exists`);try{let r=await e.open(d);for(let e of n){let n=await t(new URL(e.url,l.origin).href,{credentials:`omit`,redirect:`error`,cache:`no-store`});if(!n.ok||n.redirected||n.url&&new URL(n.url).origin!==l.origin||n.headers.get(`content-type`)?.split(`;`)[0].trim()!==e.mime||await l.digest(await n.clone().arrayBuffer())!==e.digest)throw Error(`shell verification failed: ${e.url}`);await r.put(e.url,n)}await r.put(a,new Response(u?`1`:`0`)),await r.put(i,new Response(s))}catch(t){throw await e.delete(d),t}}async function c(e,t){for(let n of await e.keys()){if(!n.startsWith(`hennery-shell-${t}-`))continue;let r=await e.open(n);if(await(await r.match(i))?.text()===t)return r}return null}async function l(e,t){let n=await e.keys(),i=n.findIndex(e=>e.startsWith(`${r}${t}-`));for(let t of n.slice(0,Math.max(0,i)))t.startsWith(`hennery-shell-`)&&await e.delete(t)}async function u(e,t){return await(await(await c(e,t))?.match(a))?.text()===`1`}function d(e){return[`/sessions`,`/needs-you`,`/more`,`/defaults`,`/new`,`/hosts`,`/hats`,`/settings`,`/mcp`].includes(e)||/^\/sessions\/[A-Za-z0-9_-]{1,128}$/.test(e)}async function f(e,t,r,i,a){let o=i&&n(r.split(`?`)[0])?`/index.html`:r;return a.some(e=>e.url===o)?await(await c(e,t))?.match(o)??null:null}var p=(e,t)=>({generation:e,token:crypto.randomUUID(),until:t+12e3}),m=(e,t)=>e?.token===t.token,h=class{store;constructor(e){this.store=e}read(){return this.store.transact(e=>structuredClone(e))}beginEnable(e=Date.now()){return this.store.transact(t=>{if(t.lease&&t.lease.until>e)throw Error(`Notification operation busy; retry shortly.`);let n=p(t.generation+1,e);return Object.keys(t).forEach(e=>delete t[e]),Object.assign(t,{generation:n.generation,enabled:!1,lease:n}),n})}finishEnable(e,t,n,r){return this.store.transact(i=>i.generation!==e.generation||!m(i.lease,e)?(!i.enabled&&!i.id&&(i.id=t),!1):(Object.assign(i,{enabled:!0,id:t,endpoint:n,key:r}),delete i.lease,delete i.repair,!0))}abortEnable(e){return this.store.transact(t=>{m(t.lease,e)&&(delete t.lease,t.generation===e.generation&&(t.repair=`reenable`))})}disable(e=Date.now()){return this.store.transact(t=>{if(!t.enabled&&t.lease?.purpose===`disable`)return{generation:t.generation-1,enabled:!1,id:t.id,cleanup:structuredClone(t.lease)};let n=structuredClone(t),r={...p(n.generation+1,e),purpose:`disable`};return Object.keys(t).forEach(e=>delete t[e]),Object.assign(t,{generation:n.generation+1,enabled:!1,lease:r,...n.id?{id:n.id}:{}}),{...n,cleanup:r}})}finishDisable(e,t,n,r){return this.store.transact(i=>{i.enabled||i.generation!==n||r&&!m(i.lease,r)||(delete i.lease,e&&delete i.id,e&&t?delete i.repair:i.repair=e?`remove_browser`:t?`remove_server`:`remove_server_and_browser`)})}beginRenew(e=Date.now()){return this.store.transact(t=>{if(!t.enabled||!t.id||!t.endpoint)throw Error(`Enable again to renew this registration.`);if(t.lease&&t.lease.until>e)throw Error(`Notification operation busy; retry shortly.`);let n=p(t.generation,e);return t.lease=n,n})}release(e){return this.store.transact(t=>{m(t.lease,e)&&delete t.lease})}current(e){return this.store.transact(t=>t.generation===e.generation&&m(t.lease,e))}needsRepair(e){return this.store.transact(t=>{t.generation===e&&(t.enabled=!1,t.repair=`reenable`,delete t.rotation,delete t.key,delete t.lease)})}queueRotation(e,t=Date.now(),n){return this.store.transact(r=>{if(!r.enabled||!r.id||!r.endpoint||n!==void 0&&r.generation!==n)return!1;let i=r.rotation;return r.rotation={oldEndpoint:i?.oldEndpoint??r.endpoint,subscription:e,sequence:(i?.sequence??0)+1,attempts:i?.attempts??0,nextAt:i?.nextAt??t},!0})}async attempt(e=fetch,t=Date.now()){let n=await this.store.transact(e=>{if(!e.enabled||!e.rotation||e.rotation.nextAt>t||e.lease&&e.lease.until>t)return null;let n=p(e.generation,t);return e.lease=n,{attempt:n,id:e.id,rotation:structuredClone(e.rotation)}});if(!n)return`idle`;let{attempt:r,rotation:i}=n,a={old_endpoint:i.oldEndpoint,subscription:i.subscription},o=0,s=0,c=new AbortController,l=setTimeout(()=>c.abort(),1e4);try{let r=await e(`/api/push/subscriptions/rotate`,{method:`POST`,credentials:`include`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify(a),signal:c.signal});o=r.status;let i=r.headers.get(`Retry-After`);if(s=i&&/^\d+$/.test(i)?Number(i)*1e3:i?Math.max(0,Date.parse(i)-t):0,r.ok){let e=await r.json();(!e||typeof e!=`object`||!(`id`in e)||e.id!==n.id)&&(o=0)}}catch{o=0}finally{clearTimeout(l)}return this.store.transact(e=>!e.enabled||e.generation!==r.generation||!m(e.lease,r)||!e.rotation?`stale`:(delete e.lease,o>=200&&o<300?(e.endpoint=i.subscription.endpoint,e.rotation.sequence===i.sequence?delete e.rotation:(e.rotation.oldEndpoint=e.endpoint,e.rotation.attempts=0,e.rotation.nextAt=t),delete e.repair,`success`):o===401?(e.repair=`sign_in`,e.rotation.nextAt=t+1e3,`sign_in`):o&&o!==429&&o<500?(e.enabled=!1,e.repair=`reenable`,delete e.rotation,delete e.key,`reenable`):(e.rotation.attempts=Math.min(16,e.rotation.attempts+1),e.rotation.nextAt=t+Math.max(Math.min(36e5,s||0),Math.min(6e4,1e3*2**(e.rotation.attempts-1))),e.repair=`retry`,`retry`)))}},g=class{async transact(e){let t=await new Promise((e,t)=>{let n=indexedDB.open(`hennery-push`,1);n.onupgradeneeded=()=>n.result.createObjectStore(`registration`),n.onsuccess=()=>e(n.result),n.onerror=()=>t(Error(`Notification storage unavailable.`)),n.onblocked=()=>t(Error(`Notification storage blocked; close other hennery windows.`))});try{return await new Promise((n,r)=>{let i=t.transaction(`registration`,`readwrite`),a=i.objectStore(`registration`),o,s=a.get(`current`);s.onsuccess=()=>{try{let t=s.result??{generation:0,enabled:!1};if(!Number.isSafeInteger(t.generation)||typeof t.enabled!=`boolean`)throw Error(`Notification storage needs repair.`);o=e(t),a.put(t,`current`)}catch(e){i.abort(),r(e)}},i.oncomplete=()=>n(o),i.onabort=i.onerror=()=>r(Error(`Notification storage write failed.`))})}finally{t.close()}}},_=()=>new h(new g),v={title:`hennery needs your attention`,body:`Open hennery to check the current state.`,url:`/sessions`,tag:`hennery-attention`};function y(e){try{let t=decodeURIComponent(e);return!t||new TextEncoder().encode(t).length>256||/[/%\\?#&=\u0000-\u001f\u007f]/.test(t)||t===`.`||t===`..`?!1:e===encodeURIComponent(t).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)}catch{return!1}}function b(e){if(typeof e!=`string`||e.length>1600||/[\\#\s]/.test(e))return`/sessions`;try{let t=new URL(e,`https://hennery.invalid`);if(t.origin!==`https://hennery.invalid`||t.pathname+t.search!==e)return`/sessions`}catch{return`/sessions`}if(e===`/mcp`||e===`/sessions`)return e;let t=/^\/sessions\/([^/?]+)(?:\?pending=([^&?]+))?$/.exec(e);return t&&y(t[1])&&(t[2]===void 0||y(t[2]))?e:`/sessions`}function x(e){if(!e||e.length>8192)return{...v};try{let t=JSON.parse(e);if(!t||typeof t!=`object`)return{...v};let n=t,r=(e,t)=>typeof e==`string`&&e.length<=t;return!r(n.title,256)||!r(n.body,2048)||!r(n.tag,256)?{...v}:{title:n.title,body:n.body,tag:n.tag,url:b(n.url)}}catch{return{...v}}}function S(e,t){let n=e.toJSON();if(!n.endpoint||!n.keys?.p256dh||!n.keys.auth)throw Error(`Browser subscription has no encryption keys.`);return{endpoint:n.endpoint,expirationTime:n.expirationTime,keys:{p256dh:n.keys.p256dh,auth:n.keys.auth},...t?{device_label:t}:{}}}function C(e){return globalThis.navigator?.locks?navigator.locks.request(`hennery-push-effects`,e):Promise.reject(Error(`Safe notification coordination is unavailable in this browser.`))}var w=2e3;new class{dirty=!1;mutations=0;lease=null;frozen(e){return this.lease!==null&&(this.lease.navigating===!0||this.lease.until>e)}edit(e=Date.now()){return!this.frozen(e)&&(this.dirty=!0,!0)}mutation(e=Date.now()){if(this.frozen(e))throw Error(`Opening a notification. Try again in a moment.`);this.mutations++;let t=!1;return()=>{t||(t=!0,this.mutations--)}}reserve(e,t,n,r=Date.now()){return this.dirty||this.mutations>0||this.frozen(r)||n<=r||n>r+w?!1:(this.lease={id:e,target:t,until:n},!0)}release(e){this.lease?.id===e&&(this.lease=null)}begin(e,t=Date.now()){return!this.lease||this.lease.id!==e||this.lease.until<=t?!1:(this.lease.navigating=!0,!0)}expire(e){return this.lease?.id===e&&this.lease.navigating?!1:(this.release(e),!0)}blocked(e=Date.now()){return this.frozen(e)}};async function T(e,t,r=e=>console.warn(`PWA window reload failed.`,e)){for(let i of await e.matchAll({type:`window`,includeUncontrolled:!0})){let e;try{e=new URL(i.url)}catch{continue}if(e.origin===t&&n(e.pathname))try{i.navigate(i.url).catch(r)}catch(e){r(e)}}}function E(e,t){try{let n=new URL(e);if(n.origin!==t||n.hash)return null;let r=n.pathname+n.search;return b(r)===r||d(n.pathname)&&!n.search?r:null}catch{return null}}async function D(e,t){let n=crypto.randomUUID(),r=Date.now()+w,i=new MessageChannel,a=()=>{i.port1.postMessage({version:1,kind:`navigation_release`,id:n}),i.port1.close()};return new Promise(o=>{let s=setTimeout(()=>{a(),o(null)},500);i.port1.onmessage=e=>{let c=e.data;c&&c.version===1&&c.kind===`navigation_ready`&&c.id===n&&c.target===t&&c.until===r&&typeof c.ready==`boolean`&&typeof c.separate==`boolean`&&(clearTimeout(s),Date.now()>=r?(a(),o(null)):o({reply:c,release:a,begin:()=>new Promise(e=>{let a=setTimeout(()=>e(!1),Math.max(0,r-Date.now()));i.port1.onmessage=i=>{let o=i.data;o&&o.version===1&&o.kind===`navigation_started`&&o.id===n&&o.target===t&&o.until===r&&typeof o.started==`boolean`&&(clearTimeout(a),e(o.started&&Date.now()<r))},i.port1.postMessage({version:1,kind:`navigation_start`,id:n,target:t,until:r})})}))};try{e.postMessage({version:1,kind:`navigation_prepare`,id:n,target:t,until:r},[i.port2])}catch{clearTimeout(s),a(),o(null)}})}async function O(e,t,n){let r=b(e),i=(await t.matchAll({type:`window`,includeUncontrolled:!1})).filter(e=>E(e.url,n)!==null),a=i.find(e=>E(e.url,n)===r);if(a){await a.focus().catch(()=>{});return}i.sort((e,t)=>Number(!!t.focused)-Number(!!e.focused)||Number(t.visibilityState===`visible`)-Number(e.visibilityState===`visible`));let o=i.length>0;for(let e of i){let n=await D(e,r);if(!n){o=!1;continue}if(o&&=n.reply.separate,!n.reply.ready){n.release();continue}try{if(!(await t.matchAll({type:`window`,includeUncontrolled:!1})).find(t=>t.id===e.id&&t.url===e.url)||Date.now()>=n.reply.until||!await n.begin())continue;let i=(await t.matchAll({type:`window`,includeUncontrolled:!1})).find(t=>t.id===e.id&&t.url===e.url);if(!i||Date.now()>=n.reply.until)continue;let a=await i.navigate(r);if(a){await a.focus().catch(()=>{});return}}catch{}finally{n.release()}}let s=(await t.matchAll({type:`window`,includeUncontrolled:!0})).filter(e=>{try{return new URL(e.url).origin===n}catch{return!1}}),c=s.length===i.length&&s.every(e=>i.some(t=>t.id===e.id&&t.url===e.url));if(s.length>0&&!(o&&c)){for(let e of i)try{e.postMessage({version:1,kind:`notification_target`,target:r})}catch{}return}try{await t.openWindow(r)}catch{}}self.addEventListener(`install`,e=>{e.waitUntil((async()=>{await s(caches,fetch,[{url:`/assets/CommandHost-CHlIi-74.js`,mime:`text/javascript`,digest:`23ee4e1a9cf56d88d4d35f4f1678381b559207b1c6cd8e190050b555c64d1ee0`},{url:`/assets/CommandHost-DnQatt_J.css`,mime:`text/css`,digest:`43898efa789bb02347a73e2def48d4c3e04b53ec8602d02207f88b2f7824a86e`},{url:`/assets/Defaults-Q0w4utBD.js`,mime:`text/javascript`,digest:`24e725fb56650d7e34e8bc363e0843bb510844871ea2aa0ee75def71e74f9615`},{url:`/assets/delegation-DJGHxM-K.js`,mime:`text/javascript`,digest:`2359a584efcabcd97c0cc824c8bd33fd01ce88b50ddd8cd09572ad0893f42470`},{url:`/assets/index-BY18ZaUP.css`,mime:`text/css`,digest:`d5ada41f269a62a2a6a1fd9a28e377154a8bbf81ee461af29e5564da3c69a814`},{url:`/assets/index-C9e6umvl.js`,mime:`text/javascript`,digest:`ed89b660ce6c3245cc7b749b18c1813cc0f96da81fff32484490333be2a9b1bb`},{url:`/assets/LaunchConfig-0jybcynB.css`,mime:`text/css`,digest:`870add9f37012ed9e18cb7bee8d8aed5b181a48c1deb35712f7a4fd95d6607a8`},{url:`/assets/LaunchConfig-DD75k5QG.js`,mime:`text/javascript`,digest:`e8aa978e32d7e84efbb703a439d48db4b7c0eecfe797df9e0eafc4c64bc2dd6a`},{url:`/assets/NewSession-C_-PFJlw.js`,mime:`text/javascript`,digest:`cef313575937f4f0df08473a7f143b42ac53cc3d202d88ec652b09c2a84b8c60`},{url:`/assets/NewSessionFrame-Dk8KR2NM.js`,mime:`text/javascript`,digest:`48f98c3d9f26450a820f145591721620b5aac5ea7810abcc7a9b5e6eae84af58`},{url:`/assets/Settings-Cq4GuuzN.js`,mime:`text/javascript`,digest:`be09f12b8943bacc7e3c7f40c7efee5212be99565bc76d40dbd117b2d60ed534`},{url:`/assets/text-CA4LmLIt.js`,mime:`text/javascript`,digest:`122ce91a98411e2c5f4e9ad6a15e497e621567fd06a1d6aa602ac7668178ce1f`},{url:`/assets/time-0_jLqdAq.js`,mime:`text/javascript`,digest:`2b077fcf71c76c6f1c36f0c2ad93ddf746648635bb5d37a1902393f38cdca8ec`},{url:`/assets/ui-D0YDKHVt.js`,mime:`text/javascript`,digest:`178729e69ad660844752d08c9a9e9d74af838ea8147fc98894fc485d3ae6b515`},{url:`/favicon.svg`,mime:`image/svg+xml`,digest:`619ca8589501f0dd0d76f4f4df35cd4a745bd29f9bd363de4242aeac32938fc8`},{url:`/fonts/Inter-italic-latin-ext.woff2`,mime:`font/woff2`,digest:`e588010a7c49441d9f37eefb311255ffbe700fc6f753882f36fc6e74c727c42a`},{url:`/fonts/Inter-italic-latin.woff2`,mime:`font/woff2`,digest:`936f815ca529d36d6a669971a4f912788860c315a6c24d3701078cc0c28ad96a`},{url:`/fonts/Inter-normal-latin-ext.woff2`,mime:`font/woff2`,digest:`3f8140c577138b00ac972a9b45490dd010365b1faeb2f245ba9cd4faea936137`},{url:`/fonts/Inter-normal-latin.woff2`,mime:`font/woff2`,digest:`0128ce03860bab4605049a6d38f9bfea2558690fa3e2263c9b9bb14726a7721f`},{url:`/fonts/Roboto-italic-latin-ext.woff2`,mime:`font/woff2`,digest:`735ecb6c0fde118c3ee275149a4a1e4f95dd3040bc768d6fab44060c95c6bbe7`},{url:`/fonts/Roboto-italic-latin.woff2`,mime:`font/woff2`,digest:`055d5e041d7dcca70e871c26bf655dfb1c93fc0363156f427676f5e6e3585ea0`},{url:`/fonts/Roboto-normal-latin-ext.woff2`,mime:`font/woff2`,digest:`5217f6097814b1f0abbfde230ddef8d6918359b55d89db89fa6550f7d9328b11`},{url:`/fonts/Roboto-normal-latin.woff2`,mime:`font/woff2`,digest:`1295cf18edcdcf0f7f3879f6aacdc5cb7d52316b9de83529c69bb02abe4c3fe8`},{url:`/icon-180.png`,mime:`image/png`,digest:`849f83fbd6f420223108c19b4011df1c738df3ceb1c1c9e77bfbb396cd85e6a6`},{url:`/icon-192.png`,mime:`image/png`,digest:`f27f663ccbe612b1eccbb47965744e6bc05c159a933fbfb42bbb7696fb600663`},{url:`/icon-512.png`,mime:`image/png`,digest:`3ea6aef65f6c344bfd37ffc2b755d979d9918388e367cdc31cba1125f657862a`},{url:`/icon-maskable.png`,mime:`image/png`,digest:`3ea6aef65f6c344bfd37ffc2b755d979d9918388e367cdc31cba1125f657862a`},{url:`/index.html`,mime:`text/html`,digest:`aed7cebcfd6f2816b53a620cd1e0b242b40deb440739ed90e78585a7a765e1d0`},{url:`/manifest.webmanifest`,mime:`application/manifest+json`,digest:`6d8317c4ff7455c9dd8852a87dadaa8909044e8f8ff064b697114d1c3c081f2f`},{url:`/theme.js`,mime:`text/javascript`,digest:`6e4e1a5cc59193e9ce1e1cbee66c00eb64a037c1356d5e136c582605197f555c`}],`944421cf597897f0338156e396e848461be54b608171f20e75f80167efe6e69e`,crypto.randomUUID(),void 0,!!self.registration.active),await self.skipWaiting()})())}),self.addEventListener(`activate`,e=>{e.waitUntil((async()=>{let e=await u(caches,`944421cf597897f0338156e396e848461be54b608171f20e75f80167efe6e69e`);await l(caches,`944421cf597897f0338156e396e848461be54b608171f20e75f80167efe6e69e`),await self.clients.claim(),e&&await T(self.clients,location.origin)})())}),self.addEventListener(`fetch`,e=>{let t=e.request,r=new URL(t.url);if(t.method!==`GET`||r.origin!==location.origin)return;let i=r.pathname+r.search;(t.mode===`navigate`&&n(r.pathname)||[{url:`/assets/CommandHost-CHlIi-74.js`,mime:`text/javascript`,digest:`23ee4e1a9cf56d88d4d35f4f1678381b559207b1c6cd8e190050b555c64d1ee0`},{url:`/assets/CommandHost-DnQatt_J.css`,mime:`text/css`,digest:`43898efa789bb02347a73e2def48d4c3e04b53ec8602d02207f88b2f7824a86e`},{url:`/assets/Defaults-Q0w4utBD.js`,mime:`text/javascript`,digest:`24e725fb56650d7e34e8bc363e0843bb510844871ea2aa0ee75def71e74f9615`},{url:`/assets/delegation-DJGHxM-K.js`,mime:`text/javascript`,digest:`2359a584efcabcd97c0cc824c8bd33fd01ce88b50ddd8cd09572ad0893f42470`},{url:`/assets/index-BY18ZaUP.css`,mime:`text/css`,digest:`d5ada41f269a62a2a6a1fd9a28e377154a8bbf81ee461af29e5564da3c69a814`},{url:`/assets/index-C9e6umvl.js`,mime:`text/javascript`,digest:`ed89b660ce6c3245cc7b749b18c1813cc0f96da81fff32484490333be2a9b1bb`},{url:`/assets/LaunchConfig-0jybcynB.css`,mime:`text/css`,digest:`870add9f37012ed9e18cb7bee8d8aed5b181a48c1deb35712f7a4fd95d6607a8`},{url:`/assets/LaunchConfig-DD75k5QG.js`,mime:`text/javascript`,digest:`e8aa978e32d7e84efbb703a439d48db4b7c0eecfe797df9e0eafc4c64bc2dd6a`},{url:`/assets/NewSession-C_-PFJlw.js`,mime:`text/javascript`,digest:`cef313575937f4f0df08473a7f143b42ac53cc3d202d88ec652b09c2a84b8c60`},{url:`/assets/NewSessionFrame-Dk8KR2NM.js`,mime:`text/javascript`,digest:`48f98c3d9f26450a820f145591721620b5aac5ea7810abcc7a9b5e6eae84af58`},{url:`/assets/Settings-Cq4GuuzN.js`,mime:`text/javascript`,digest:`be09f12b8943bacc7e3c7f40c7efee5212be99565bc76d40dbd117b2d60ed534`},{url:`/assets/text-CA4LmLIt.js`,mime:`text/javascript`,digest:`122ce91a98411e2c5f4e9ad6a15e497e621567fd06a1d6aa602ac7668178ce1f`},{url:`/assets/time-0_jLqdAq.js`,mime:`text/javascript`,digest:`2b077fcf71c76c6f1c36f0c2ad93ddf746648635bb5d37a1902393f38cdca8ec`},{url:`/assets/ui-D0YDKHVt.js`,mime:`text/javascript`,digest:`178729e69ad660844752d08c9a9e9d74af838ea8147fc98894fc485d3ae6b515`},{url:`/favicon.svg`,mime:`image/svg+xml`,digest:`619ca8589501f0dd0d76f4f4df35cd4a745bd29f9bd363de4242aeac32938fc8`},{url:`/fonts/Inter-italic-latin-ext.woff2`,mime:`font/woff2`,digest:`e588010a7c49441d9f37eefb311255ffbe700fc6f753882f36fc6e74c727c42a`},{url:`/fonts/Inter-italic-latin.woff2`,mime:`font/woff2`,digest:`936f815ca529d36d6a669971a4f912788860c315a6c24d3701078cc0c28ad96a`},{url:`/fonts/Inter-normal-latin-ext.woff2`,mime:`font/woff2`,digest:`3f8140c577138b00ac972a9b45490dd010365b1faeb2f245ba9cd4faea936137`},{url:`/fonts/Inter-normal-latin.woff2`,mime:`font/woff2`,digest:`0128ce03860bab4605049a6d38f9bfea2558690fa3e2263c9b9bb14726a7721f`},{url:`/fonts/Roboto-italic-latin-ext.woff2`,mime:`font/woff2`,digest:`735ecb6c0fde118c3ee275149a4a1e4f95dd3040bc768d6fab44060c95c6bbe7`},{url:`/fonts/Roboto-italic-latin.woff2`,mime:`font/woff2`,digest:`055d5e041d7dcca70e871c26bf655dfb1c93fc0363156f427676f5e6e3585ea0`},{url:`/fonts/Roboto-normal-latin-ext.woff2`,mime:`font/woff2`,digest:`5217f6097814b1f0abbfde230ddef8d6918359b55d89db89fa6550f7d9328b11`},{url:`/fonts/Roboto-normal-latin.woff2`,mime:`font/woff2`,digest:`1295cf18edcdcf0f7f3879f6aacdc5cb7d52316b9de83529c69bb02abe4c3fe8`},{url:`/icon-180.png`,mime:`image/png`,digest:`849f83fbd6f420223108c19b4011df1c738df3ceb1c1c9e77bfbb396cd85e6a6`},{url:`/icon-192.png`,mime:`image/png`,digest:`f27f663ccbe612b1eccbb47965744e6bc05c159a933fbfb42bbb7696fb600663`},{url:`/icon-512.png`,mime:`image/png`,digest:`3ea6aef65f6c344bfd37ffc2b755d979d9918388e367cdc31cba1125f657862a`},{url:`/icon-maskable.png`,mime:`image/png`,digest:`3ea6aef65f6c344bfd37ffc2b755d979d9918388e367cdc31cba1125f657862a`},{url:`/index.html`,mime:`text/html`,digest:`aed7cebcfd6f2816b53a620cd1e0b242b40deb440739ed90e78585a7a765e1d0`},{url:`/manifest.webmanifest`,mime:`application/manifest+json`,digest:`6d8317c4ff7455c9dd8852a87dadaa8909044e8f8ff064b697114d1c3c081f2f`},{url:`/theme.js`,mime:`text/javascript`,digest:`6e4e1a5cc59193e9ce1e1cbee66c00eb64a037c1356d5e136c582605197f555c`}].some(e=>e.url===i))&&e.respondWith((async()=>await f(caches,`944421cf597897f0338156e396e848461be54b608171f20e75f80167efe6e69e`,i,t.mode===`navigate`,[{url:`/assets/CommandHost-CHlIi-74.js`,mime:`text/javascript`,digest:`23ee4e1a9cf56d88d4d35f4f1678381b559207b1c6cd8e190050b555c64d1ee0`},{url:`/assets/CommandHost-DnQatt_J.css`,mime:`text/css`,digest:`43898efa789bb02347a73e2def48d4c3e04b53ec8602d02207f88b2f7824a86e`},{url:`/assets/Defaults-Q0w4utBD.js`,mime:`text/javascript`,digest:`24e725fb56650d7e34e8bc363e0843bb510844871ea2aa0ee75def71e74f9615`},{url:`/assets/delegation-DJGHxM-K.js`,mime:`text/javascript`,digest:`2359a584efcabcd97c0cc824c8bd33fd01ce88b50ddd8cd09572ad0893f42470`},{url:`/assets/index-BY18ZaUP.css`,mime:`text/css`,digest:`d5ada41f269a62a2a6a1fd9a28e377154a8bbf81ee461af29e5564da3c69a814`},{url:`/assets/index-C9e6umvl.js`,mime:`text/javascript`,digest:`ed89b660ce6c3245cc7b749b18c1813cc0f96da81fff32484490333be2a9b1bb`},{url:`/assets/LaunchConfig-0jybcynB.css`,mime:`text/css`,digest:`870add9f37012ed9e18cb7bee8d8aed5b181a48c1deb35712f7a4fd95d6607a8`},{url:`/assets/LaunchConfig-DD75k5QG.js`,mime:`text/javascript`,digest:`e8aa978e32d7e84efbb703a439d48db4b7c0eecfe797df9e0eafc4c64bc2dd6a`},{url:`/assets/NewSession-C_-PFJlw.js`,mime:`text/javascript`,digest:`cef313575937f4f0df08473a7f143b42ac53cc3d202d88ec652b09c2a84b8c60`},{url:`/assets/NewSessionFrame-Dk8KR2NM.js`,mime:`text/javascript`,digest:`48f98c3d9f26450a820f145591721620b5aac5ea7810abcc7a9b5e6eae84af58`},{url:`/assets/Settings-Cq4GuuzN.js`,mime:`text/javascript`,digest:`be09f12b8943bacc7e3c7f40c7efee5212be99565bc76d40dbd117b2d60ed534`},{url:`/assets/text-CA4LmLIt.js`,mime:`text/javascript`,digest:`122ce91a98411e2c5f4e9ad6a15e497e621567fd06a1d6aa602ac7668178ce1f`},{url:`/assets/time-0_jLqdAq.js`,mime:`text/javascript`,digest:`2b077fcf71c76c6f1c36f0c2ad93ddf746648635bb5d37a1902393f38cdca8ec`},{url:`/assets/ui-D0YDKHVt.js`,mime:`text/javascript`,digest:`178729e69ad660844752d08c9a9e9d74af838ea8147fc98894fc485d3ae6b515`},{url:`/favicon.svg`,mime:`image/svg+xml`,digest:`619ca8589501f0dd0d76f4f4df35cd4a745bd29f9bd363de4242aeac32938fc8`},{url:`/fonts/Inter-italic-latin-ext.woff2`,mime:`font/woff2`,digest:`e588010a7c49441d9f37eefb311255ffbe700fc6f753882f36fc6e74c727c42a`},{url:`/fonts/Inter-italic-latin.woff2`,mime:`font/woff2`,digest:`936f815ca529d36d6a669971a4f912788860c315a6c24d3701078cc0c28ad96a`},{url:`/fonts/Inter-normal-latin-ext.woff2`,mime:`font/woff2`,digest:`3f8140c577138b00ac972a9b45490dd010365b1faeb2f245ba9cd4faea936137`},{url:`/fonts/Inter-normal-latin.woff2`,mime:`font/woff2`,digest:`0128ce03860bab4605049a6d38f9bfea2558690fa3e2263c9b9bb14726a7721f`},{url:`/fonts/Roboto-italic-latin-ext.woff2`,mime:`font/woff2`,digest:`735ecb6c0fde118c3ee275149a4a1e4f95dd3040bc768d6fab44060c95c6bbe7`},{url:`/fonts/Roboto-italic-latin.woff2`,mime:`font/woff2`,digest:`055d5e041d7dcca70e871c26bf655dfb1c93fc0363156f427676f5e6e3585ea0`},{url:`/fonts/Roboto-normal-latin-ext.woff2`,mime:`font/woff2`,digest:`5217f6097814b1f0abbfde230ddef8d6918359b55d89db89fa6550f7d9328b11`},{url:`/fonts/Roboto-normal-latin.woff2`,mime:`font/woff2`,digest:`1295cf18edcdcf0f7f3879f6aacdc5cb7d52316b9de83529c69bb02abe4c3fe8`},{url:`/icon-180.png`,mime:`image/png`,digest:`849f83fbd6f420223108c19b4011df1c738df3ceb1c1c9e77bfbb396cd85e6a6`},{url:`/icon-192.png`,mime:`image/png`,digest:`f27f663ccbe612b1eccbb47965744e6bc05c159a933fbfb42bbb7696fb600663`},{url:`/icon-512.png`,mime:`image/png`,digest:`3ea6aef65f6c344bfd37ffc2b755d979d9918388e367cdc31cba1125f657862a`},{url:`/icon-maskable.png`,mime:`image/png`,digest:`3ea6aef65f6c344bfd37ffc2b755d979d9918388e367cdc31cba1125f657862a`},{url:`/index.html`,mime:`text/html`,digest:`aed7cebcfd6f2816b53a620cd1e0b242b40deb440739ed90e78585a7a765e1d0`},{url:`/manifest.webmanifest`,mime:`application/manifest+json`,digest:`6d8317c4ff7455c9dd8852a87dadaa8909044e8f8ff064b697114d1c3c081f2f`},{url:`/theme.js`,mime:`text/javascript`,digest:`6e4e1a5cc59193e9ce1e1cbee66c00eb64a037c1356d5e136c582605197f555c`}])??fetch(t))())}),self.addEventListener(`push`,e=>{e.waitUntil((async()=>{let t=null;try{t=e.data?.text()??null}catch{}let n=x(t);if(await self.registration.showNotification(n.title,{body:n.body,tag:n.tag,icon:`/icon-192.png`,badge:`/icon-192.png`,data:{url:n.url,tag:n.tag}}),n.url===`/mcp`)for(let e of await self.clients.matchAll({type:`window`,includeUncontrolled:!1}))try{let t=new URL(e.url);t.origin===location.origin&&d(t.pathname)&&e.postMessage({version:1,kind:`mcp_invalidated`})}catch{}})())}),self.addEventListener(`pushsubscriptionchange`,e=>{e.waitUntil((async()=>{let t=_(),n=await t.read();if(!n.enabled||!n.id||!n.endpoint||e.oldSubscription&&e.oldSubscription.endpoint!==n.endpoint&&e.oldSubscription.endpoint!==n.rotation?.subscription.endpoint)return;let r=!!e.newSubscription||!!e.oldSubscription?.options?.applicationServerKey&&await self.registration.pushManager.permissionState({userVisibleOnly:!0})===`granted`;await C(async()=>{let i=await t.read();if(!i.enabled||i.generation!==n.generation||i.id!==n.id||e.oldSubscription&&e.oldSubscription.endpoint!==i.endpoint&&e.oldSubscription.endpoint!==i.rotation?.subscription.endpoint)return;if(!r){await t.needsRepair(n.generation);return}let a;try{a=await t.beginRenew()}catch{return}try{let r=e.newSubscription;if(!await t.current(a))return;if(!r)try{r=await self.registration.pushManager.subscribe(e.oldSubscription.options)}catch{await t.current(a)&&await t.needsRepair(n.generation);return}if(!await t.current(a)){let e=await t.read();(!e.enabled||e.endpoint!==r.endpoint)&&await r.unsubscribe();return}await t.queueRotation(S(r),Date.now(),n.generation),await t.release(a),await t.attempt()}finally{await t.release(a)}})})())}),self.addEventListener(`notificationclick`,e=>{e.notification.close(),e.waitUntil(O(e.notification.data?.url,self.clients,location.origin))})})();