hennery-kernel 0.2.0

Storage, authentication, HTTP kernel and embedded UI for hennery
Documentation
1
(function(){var e=`/__hennery_shell_complete__`;async function t(e){return[...new Uint8Array(await crypto.subtle.digest(`SHA-256`,e))].map(e=>e.toString(16).padStart(2,`0`)).join(``)}async function n(n,r,i,a,o,s={origin:location.origin,digest:t}){let c=`hennery-shell-${a}-${o}`;if((await n.keys()).includes(c))throw Error(`cache attempt already exists`);try{let t=await n.open(c);for(let e of i){let n=await r(new URL(e.url,s.origin).href,{credentials:`omit`,redirect:`error`,cache:`no-store`});if(!n.ok||n.redirected||n.url&&new URL(n.url).origin!==s.origin||n.headers.get(`content-type`)?.split(`;`)[0].trim()!==e.mime||await s.digest(await n.clone().arrayBuffer())!==e.digest)throw Error(`shell verification failed: ${e.url}`);await t.put(e.url,n)}await t.put(e,new Response(a))}catch(e){throw await n.delete(c),e}}async function r(t,n){for(let r of await t.keys()){if(!r.startsWith(`hennery-shell-${n}-`))continue;let i=await t.open(r);if(await(await i.match(e))?.text()===n)return i}return null}function i(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 a(e,t,n,a,o){let s=a&&i(n.split(`?`)[0])?`/index.html`:n;return o.some(e=>e.url===s)?await(await r(e,t))?.match(s)??null:null}var o=(e,t)=>({generation:e,token:crypto.randomUUID(),until:t+12e3}),s=(e,t)=>e?.token===t.token,c=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=o(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||!s(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=>{s(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={...o(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&&!s(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=o(t.generation,e);return t.lease=n,n})}release(e){return this.store.transact(t=>{s(t.lease,e)&&delete t.lease})}current(e){return this.store.transact(t=>t.generation===e.generation&&s(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=o(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},c=0,l=0,u=new AbortController,d=setTimeout(()=>u.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:u.signal});c=r.status;let i=r.headers.get(`Retry-After`);if(l=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)&&(c=0)}}catch{c=0}finally{clearTimeout(d)}return this.store.transact(e=>!e.enabled||e.generation!==r.generation||!s(e.lease,r)||!e.rotation?`stale`:(delete e.lease,c>=200&&c<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`):c===401?(e.repair=`sign_in`,e.rotation.nextAt=t+1e3,`sign_in`):c&&c!==429&&c<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,l||0),Math.min(6e4,1e3*2**(e.rotation.attempts-1))),e.repair=`retry`,`retry`)))}},l=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()}}},u=()=>new c(new l),d={title:`hennery needs your attention`,body:`Open hennery to check the current state.`,url:`/sessions`,tag:`hennery-attention`};function f(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 p(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&&f(t[1])&&(t[2]===void 0||f(t[2]))?e:`/sessions`}function m(e){if(!e||e.length>8192)return{...d};try{let t=JSON.parse(e);if(!t||typeof t!=`object`)return{...d};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)?{...d}:{title:n.title,body:n.body,tag:n.tag,url:p(n.url)}}catch{return{...d}}}function h(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 g(e){return globalThis.navigator?.locks?navigator.locks.request(`hennery-push-effects`,e):Promise.reject(Error(`Safe notification coordination is unavailable in this browser.`))}var _=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+_?!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)}};function v(e,t){try{let n=new URL(e);if(n.origin!==t||n.hash)return null;let r=n.pathname+n.search;return p(r)===r||i(n.pathname)&&!n.search?r:null}catch{return null}}async function y(e,t){let n=crypto.randomUUID(),r=Date.now()+_,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 b(e,t,n){let r=p(e),i=(await t.matchAll({type:`window`,includeUncontrolled:!1})).filter(e=>v(e.url,n)!==null),a=i.find(e=>v(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 y(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(n(caches,fetch,[{url:`/assets/CommandHost-kg8fvvRW.js`,mime:`text/javascript`,digest:`95f47dea0e4e3d33d6a6e355c3b026a3bee3b3c06d65cbafc42148bbf7b724f8`},{url:`/assets/CommandHost-NWL8sjNk.css`,mime:`text/css`,digest:`41e292bb2f98318ce19f5fc32474ef941e08eab2822eeebcc0626241f37c3ef2`},{url:`/assets/Defaults-DLoDGZP1.js`,mime:`text/javascript`,digest:`4058db8f02ee155b6dcbc82453386b8fe1f45c88674a363a2a8bf604223371ed`},{url:`/assets/delegation-Bztd6Cbs.js`,mime:`text/javascript`,digest:`a19ea4448e4bf8cd01d3fccd67c3421eb3b7c5ba22f524584fbc17918a830123`},{url:`/assets/index-BL-J56_I.js`,mime:`text/javascript`,digest:`c4a7e6cfbb2a3d521460c17229c070f3657fa0fb8e9469e07c6b93efa44c47fb`},{url:`/assets/index-Zc8dWC8V.css`,mime:`text/css`,digest:`3d1399dda5f1b55c82433289b6b2cdf81d8c414ffd47a7322f101762f2a3341e`},{url:`/assets/LaunchConfig-BXCVPU_k.js`,mime:`text/javascript`,digest:`2ab9f5c96c0291f5e549ffee5a3549ae458f5c149c43c07ec70e8d462d659f6b`},{url:`/assets/LaunchConfig-nlMA_MS2.css`,mime:`text/css`,digest:`8888a6966dbff1be3668a9e5004e1cfe72ef03080fc3e1e08fc9220cce937791`},{url:`/assets/NewSession-riUG79d-.js`,mime:`text/javascript`,digest:`9b0f6f59f1d1fa6422308270bbd0d89cce4e8622aff49e98804fee361936be8d`},{url:`/assets/NewSessionFrame-BfWh-EK9.js`,mime:`text/javascript`,digest:`e9bb8bebebc394bd2c0da08b729235e4c1dd373474866d7450660bb070f5d797`},{url:`/assets/Settings-Z822tCTT.js`,mime:`text/javascript`,digest:`1b2edd5ea26f722ed206733d862955b639334c7ae7d7f3c6b0901bc1f8595e94`},{url:`/assets/text-BaRty2rc.js`,mime:`text/javascript`,digest:`c37f92937d44e95482daccc2f46665d90e6e5ec521ee5dcb8d26886d5e885860`},{url:`/assets/time-pcgqod1r.js`,mime:`text/javascript`,digest:`e65847dcaf7f4fa15cd8ad45c4d820881db380cc4b6250625c831e9b0cf62f2c`},{url:`/assets/ui-Cvd76qob.js`,mime:`text/javascript`,digest:`c0131a401fc83277c5d44a8db59625879f53da9021a22e835a0a08edbaff8709`},{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-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:`db2e57b880b4cd29147eb6116c05e2899c266fc816cef58b98430bdb1c461040`},{url:`/manifest.webmanifest`,mime:`application/manifest+json`,digest:`6d8317c4ff7455c9dd8852a87dadaa8909044e8f8ff064b697114d1c3c081f2f`},{url:`/theme.js`,mime:`text/javascript`,digest:`6e4e1a5cc59193e9ce1e1cbee66c00eb64a037c1356d5e136c582605197f555c`}],`5e3bc950d1c1110f71901ddcc7e4350ec62f9ff278cd4c7f0b903017477c06dc`,crypto.randomUUID()))}),self.addEventListener(`activate`,e=>{e.waitUntil((async()=>{for(let e of await caches.keys())e.startsWith(`hennery-shell-`)&&!e.startsWith(`hennery-shell-5e3bc950d1c1110f71901ddcc7e4350ec62f9ff278cd4c7f0b903017477c06dc-`)&&await caches.delete(e)})())}),self.addEventListener(`fetch`,e=>{let t=e.request,n=new URL(t.url);if(t.method!==`GET`||n.origin!==location.origin)return;let r=n.pathname+n.search;(t.mode===`navigate`&&i(n.pathname)||[{url:`/assets/CommandHost-kg8fvvRW.js`,mime:`text/javascript`,digest:`95f47dea0e4e3d33d6a6e355c3b026a3bee3b3c06d65cbafc42148bbf7b724f8`},{url:`/assets/CommandHost-NWL8sjNk.css`,mime:`text/css`,digest:`41e292bb2f98318ce19f5fc32474ef941e08eab2822eeebcc0626241f37c3ef2`},{url:`/assets/Defaults-DLoDGZP1.js`,mime:`text/javascript`,digest:`4058db8f02ee155b6dcbc82453386b8fe1f45c88674a363a2a8bf604223371ed`},{url:`/assets/delegation-Bztd6Cbs.js`,mime:`text/javascript`,digest:`a19ea4448e4bf8cd01d3fccd67c3421eb3b7c5ba22f524584fbc17918a830123`},{url:`/assets/index-BL-J56_I.js`,mime:`text/javascript`,digest:`c4a7e6cfbb2a3d521460c17229c070f3657fa0fb8e9469e07c6b93efa44c47fb`},{url:`/assets/index-Zc8dWC8V.css`,mime:`text/css`,digest:`3d1399dda5f1b55c82433289b6b2cdf81d8c414ffd47a7322f101762f2a3341e`},{url:`/assets/LaunchConfig-BXCVPU_k.js`,mime:`text/javascript`,digest:`2ab9f5c96c0291f5e549ffee5a3549ae458f5c149c43c07ec70e8d462d659f6b`},{url:`/assets/LaunchConfig-nlMA_MS2.css`,mime:`text/css`,digest:`8888a6966dbff1be3668a9e5004e1cfe72ef03080fc3e1e08fc9220cce937791`},{url:`/assets/NewSession-riUG79d-.js`,mime:`text/javascript`,digest:`9b0f6f59f1d1fa6422308270bbd0d89cce4e8622aff49e98804fee361936be8d`},{url:`/assets/NewSessionFrame-BfWh-EK9.js`,mime:`text/javascript`,digest:`e9bb8bebebc394bd2c0da08b729235e4c1dd373474866d7450660bb070f5d797`},{url:`/assets/Settings-Z822tCTT.js`,mime:`text/javascript`,digest:`1b2edd5ea26f722ed206733d862955b639334c7ae7d7f3c6b0901bc1f8595e94`},{url:`/assets/text-BaRty2rc.js`,mime:`text/javascript`,digest:`c37f92937d44e95482daccc2f46665d90e6e5ec521ee5dcb8d26886d5e885860`},{url:`/assets/time-pcgqod1r.js`,mime:`text/javascript`,digest:`e65847dcaf7f4fa15cd8ad45c4d820881db380cc4b6250625c831e9b0cf62f2c`},{url:`/assets/ui-Cvd76qob.js`,mime:`text/javascript`,digest:`c0131a401fc83277c5d44a8db59625879f53da9021a22e835a0a08edbaff8709`},{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-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:`db2e57b880b4cd29147eb6116c05e2899c266fc816cef58b98430bdb1c461040`},{url:`/manifest.webmanifest`,mime:`application/manifest+json`,digest:`6d8317c4ff7455c9dd8852a87dadaa8909044e8f8ff064b697114d1c3c081f2f`},{url:`/theme.js`,mime:`text/javascript`,digest:`6e4e1a5cc59193e9ce1e1cbee66c00eb64a037c1356d5e136c582605197f555c`}].some(e=>e.url===r))&&e.respondWith((async()=>await a(caches,`5e3bc950d1c1110f71901ddcc7e4350ec62f9ff278cd4c7f0b903017477c06dc`,r,t.mode===`navigate`,[{url:`/assets/CommandHost-kg8fvvRW.js`,mime:`text/javascript`,digest:`95f47dea0e4e3d33d6a6e355c3b026a3bee3b3c06d65cbafc42148bbf7b724f8`},{url:`/assets/CommandHost-NWL8sjNk.css`,mime:`text/css`,digest:`41e292bb2f98318ce19f5fc32474ef941e08eab2822eeebcc0626241f37c3ef2`},{url:`/assets/Defaults-DLoDGZP1.js`,mime:`text/javascript`,digest:`4058db8f02ee155b6dcbc82453386b8fe1f45c88674a363a2a8bf604223371ed`},{url:`/assets/delegation-Bztd6Cbs.js`,mime:`text/javascript`,digest:`a19ea4448e4bf8cd01d3fccd67c3421eb3b7c5ba22f524584fbc17918a830123`},{url:`/assets/index-BL-J56_I.js`,mime:`text/javascript`,digest:`c4a7e6cfbb2a3d521460c17229c070f3657fa0fb8e9469e07c6b93efa44c47fb`},{url:`/assets/index-Zc8dWC8V.css`,mime:`text/css`,digest:`3d1399dda5f1b55c82433289b6b2cdf81d8c414ffd47a7322f101762f2a3341e`},{url:`/assets/LaunchConfig-BXCVPU_k.js`,mime:`text/javascript`,digest:`2ab9f5c96c0291f5e549ffee5a3549ae458f5c149c43c07ec70e8d462d659f6b`},{url:`/assets/LaunchConfig-nlMA_MS2.css`,mime:`text/css`,digest:`8888a6966dbff1be3668a9e5004e1cfe72ef03080fc3e1e08fc9220cce937791`},{url:`/assets/NewSession-riUG79d-.js`,mime:`text/javascript`,digest:`9b0f6f59f1d1fa6422308270bbd0d89cce4e8622aff49e98804fee361936be8d`},{url:`/assets/NewSessionFrame-BfWh-EK9.js`,mime:`text/javascript`,digest:`e9bb8bebebc394bd2c0da08b729235e4c1dd373474866d7450660bb070f5d797`},{url:`/assets/Settings-Z822tCTT.js`,mime:`text/javascript`,digest:`1b2edd5ea26f722ed206733d862955b639334c7ae7d7f3c6b0901bc1f8595e94`},{url:`/assets/text-BaRty2rc.js`,mime:`text/javascript`,digest:`c37f92937d44e95482daccc2f46665d90e6e5ec521ee5dcb8d26886d5e885860`},{url:`/assets/time-pcgqod1r.js`,mime:`text/javascript`,digest:`e65847dcaf7f4fa15cd8ad45c4d820881db380cc4b6250625c831e9b0cf62f2c`},{url:`/assets/ui-Cvd76qob.js`,mime:`text/javascript`,digest:`c0131a401fc83277c5d44a8db59625879f53da9021a22e835a0a08edbaff8709`},{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-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:`db2e57b880b4cd29147eb6116c05e2899c266fc816cef58b98430bdb1c461040`},{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=m(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&&i(t.pathname)&&e.postMessage({version:1,kind:`mcp_invalidated`})}catch{}})())}),self.addEventListener(`pushsubscriptionchange`,e=>{e.waitUntil((async()=>{let t=u(),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 g(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(h(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(b(e.notification.data?.url,self.clients,location.origin))})})();