hennery-kernel 0.2.1

Storage, authentication, HTTP kernel and embedded UI for hennery
Documentation
1
(function(){var e=`hennery-shell-`,t=`/__hennery_shell_complete__`;async function n(e){return[...new Uint8Array(await crypto.subtle.digest(`SHA-256`,e))].map(e=>e.toString(16).padStart(2,`0`)).join(``)}async function r(r,i,a,o,s,c={origin:location.origin,digest:n}){let l=`${e}${o}-${s}`;if((await r.keys()).includes(l))throw Error(`cache attempt already exists`);try{let e=await r.open(l);for(let t of a){let n=await i(new URL(t.url,c.origin).href,{credentials:`omit`,redirect:`error`,cache:`no-store`});if(!n.ok||n.redirected||n.url&&new URL(n.url).origin!==c.origin||n.headers.get(`content-type`)?.split(`;`)[0].trim()!==t.mime||await c.digest(await n.clone().arrayBuffer())!==t.digest)throw Error(`shell verification failed: ${t.url}`);await e.put(t.url,n)}await e.put(t,new Response(o))}catch(e){throw await r.delete(l),e}}async function i(e,n){for(let r of await e.keys()){if(!r.startsWith(`hennery-shell-${n}-`))continue;let i=await e.open(r);if(await(await i.match(t))?.text()===n)return i}return null}async function a(t,n){let r=await t.keys(),i=r.findIndex(t=>t.startsWith(`${e}${n}-`));for(let e of r.slice(0,Math.max(0,i)))e.startsWith(`hennery-shell-`)&&await t.delete(e)}function o(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 s(e,t,n,r,a){let s=r&&o(n.split(`?`)[0])?`/index.html`:n;return a.some(e=>e.url===s)?await(await i(e,t))?.match(s)??null:null}var c=(e,t)=>({generation:e,token:crypto.randomUUID(),until:t+12e3}),l=(e,t)=>e?.token===t.token,u=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=c(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||!l(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=>{l(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={...c(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&&!l(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=c(t.generation,e);return t.lease=n,n})}release(e){return this.store.transact(t=>{l(t.lease,e)&&delete t.lease})}current(e){return this.store.transact(t=>t.generation===e.generation&&l(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=c(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,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});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(d)}return this.store.transact(e=>!e.enabled||e.generation!==r.generation||!l(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`)))}},d=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()}}},f=()=>new u(new d),p={title:`hennery needs your attention`,body:`Open hennery to check the current state.`,url:`/sessions`,tag:`hennery-attention`};function m(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 h(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&&m(t[1])&&(t[2]===void 0||m(t[2]))?e:`/sessions`}function g(e){if(!e||e.length>8192)return{...p};try{let t=JSON.parse(e);if(!t||typeof t!=`object`)return{...p};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)?{...p}:{title:n.title,body:n.body,tag:n.tag,url:h(n.url)}}catch{return{...p}}}function _(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 v(e){return globalThis.navigator?.locks?navigator.locks.request(`hennery-push-effects`,e):Promise.reject(Error(`Safe notification coordination is unavailable in this browser.`))}var y=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+y?!1:(this.lease={id:e,target:t,until:n},!0)}reserveUpdate(e,t,n=Date.now()){return this.mutations>0||this.frozen(n)||t<=n||t>n+y?!1:(this.lease={id:e,target:``,until:t},!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)}hasMutations(){return this.mutations>0}};function b(e,t){try{let n=new URL(e);if(n.origin!==t||n.hash)return null;let r=n.pathname+n.search;return h(r)===r||o(n.pathname)&&!n.search?r:null}catch{return null}}async function x(e,t){let n=crypto.randomUUID(),r=Date.now()+y,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 S(e,t,n){let r=h(e),i=(await t.matchAll({type:`window`,includeUncontrolled:!1})).filter(e=>b(e.url,n)!==null),a=i.find(e=>b(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 x(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{}}var C={"/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 w(e){let t=e.length>1?e.replace(/\/+$/,``):e;if(t===`/`)return{name:`sessions`};let n=C[t];if(n)return{name:n};let r=/^\/sessions\/([^/]+)$/.exec(t);if(r)try{return{name:`session`,id:decodeURIComponent(r[1])}}catch{return{name:`not_found`}}return{name:`not_found`}}function T(e){return e===`/api`||e.startsWith(`/api/`)||e.startsWith(`/mcp/`)?!1:![`setup`,`login`,`not_found`].includes(w(e).name)}var E=1500;function D(e,t,n,r){let{port1:i,port2:a}=new MessageChannel;return{client:e,port:i,ask:o=>new Promise(s=>{let c=setTimeout(()=>s(null),Math.max(0,Math.min(500,n-Date.now())));i.onmessage=e=>{let r=e.data;r?.version===1&&r.id===t&&r.kind===`${o}_reply`&&typeof r.ready==`boolean`&&(clearTimeout(c),s(Date.now()<n?{ready:r.ready,reason:r.reason}:null))};try{o===`update_prepare`?e.postMessage({version:1,kind:o,id:t,until:n,initiator:r},[a]):i.postMessage({version:1,kind:o,id:t})}catch{clearTimeout(c),s(null)}}),release(){i.postMessage({version:1,kind:`update_release`,id:t}),i.close()}}}async function O(e,t,n,r,i=()=>{}){let a=async()=>(await e.matchAll({type:`window`,includeUncontrolled:!0})).filter(e=>{let n=new URL(e.url);return n.origin===t&&T(n.pathname)}),o=await a();if(!o.some(e=>e.id===n))return!1;let s=crypto.randomUUID(),c=Date.now()+E,l=o.map(e=>D(e,s,c,e.id===n)),u=!1,d=async()=>{let e=await a();return e.length===o.length&&e.every(e=>o.some(t=>t.id===e.id&&t.url===e.url))},f=async e=>{let t=await Promise.all(l.map(t=>t.ask(e))),r=t.findIndex(e=>!e?.ready);if(r<0)return!0;let a=t[r];return i(a?l[r].client.id===n?a.reason===`self-sending`?`self-sending`:`self-changed`:`busy`:`silent`),!1};try{return!await f(`update_prepare`)||!await d()||!await f(`update_commit`)||!await d()||Date.now()>=c?!1:(await r(),u=!0,!0)}finally{for(let e of l)u?e.port.close():e.release()}}var k=!1;self.addEventListener(`message`,e=>{e.data?.version===1&&e.data.kind===`update_request`&&e.ports[0]&&e.source?.id&&e.waitUntil((async()=>{let t=!1,n=`busy`;if(!k&&self.registration.waiting&&(self.serviceWorker===void 0||self.registration.waiting===self.serviceWorker)){k=!0;try{t=await O(self.clients,location.origin,e.source.id,()=>{if(self.serviceWorker!==void 0&&self.registration.waiting!==self.serviceWorker)throw n=`replaced`,Error(`Update replaced`);return self.skipWaiting()},e=>{n=e})}catch{}finally{k=!1}}e.ports[0].postMessage({version:1,kind:`update_result`,ready:t,reason:n}),e.ports[0].close()})())}),self.addEventListener(`install`,e=>{e.waitUntil(r(caches,fetch,[{url:`/assets/CommandHost-ChAng_se.js`,mime:`text/javascript`,digest:`c7e770c83af8058748cb53cc85a3b9f9f20582e71e9f0df047870b247ecf0e87`},{url:`/assets/CommandHost-DnQatt_J.css`,mime:`text/css`,digest:`43898efa789bb02347a73e2def48d4c3e04b53ec8602d02207f88b2f7824a86e`},{url:`/assets/Defaults-CBfr8lXD.js`,mime:`text/javascript`,digest:`1b22c7a84f62148155921d712d78f656bb74a52ec21d3a071fef51345e8b38ab`},{url:`/assets/delegation-BhM1e-SP.js`,mime:`text/javascript`,digest:`20ed02a4245ca7eb5da06f6d888103b57c6c984e4c2e152910524ccd7ba84403`},{url:`/assets/index-BCNmjws_.js`,mime:`text/javascript`,digest:`daf992fc36369e2f2d34baa634d33975860ac5181667a066245996354cca59e5`},{url:`/assets/index-HfspVFEp.css`,mime:`text/css`,digest:`8e20bbe0d10295134dfbf526ae2e1b3e72c5b776a88e5debb60730f88db044fb`},{url:`/assets/LaunchConfig-CaRRzKrL.js`,mime:`text/javascript`,digest:`b9c2b57598e383181f4c89f3795cf30bc9ab9b3e9b27eba12761ff5de4d80642`},{url:`/assets/LaunchConfig-D-YcW6At.css`,mime:`text/css`,digest:`3bf0147452746e341675d350a8b461644af5770cb6564079bf6c10f0abac2806`},{url:`/assets/NewSession-DPq02bqK.js`,mime:`text/javascript`,digest:`e9bf0c06b092a15f25fe435406b01eb5aa4aef3f95091a2c646159497f212633`},{url:`/assets/NewSessionFrame-C9o57KUL.js`,mime:`text/javascript`,digest:`1b36e2969cae6ee981b25bcad397a748789de4315782fdef956c8c3eee8ae539`},{url:`/assets/Settings-DdGnTkWR.js`,mime:`text/javascript`,digest:`b016b3deccace82d53a89e7f18075efb610dec2ced8aa048ee45ede250110837`},{url:`/assets/text-D_b7Odl-.js`,mime:`text/javascript`,digest:`4770c3149295fe6b2bd080d5af7da5bb7004fefb04eee6ee894ca40d3c9a2bc8`},{url:`/assets/time-pcgqod1r.js`,mime:`text/javascript`,digest:`e65847dcaf7f4fa15cd8ad45c4d820881db380cc4b6250625c831e9b0cf62f2c`},{url:`/assets/ui-CKPDYEeX.js`,mime:`text/javascript`,digest:`ece4d75864359ef60e6a00bb6e5a6438405bf615a12e100710580f8bb5c9ea4c`},{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:`392ab4914dd01b7c72d80b0bd9328fcc85adbf2fa1b7e0ac4f17127fcfab9185`},{url:`/manifest.webmanifest`,mime:`application/manifest+json`,digest:`6d8317c4ff7455c9dd8852a87dadaa8909044e8f8ff064b697114d1c3c081f2f`},{url:`/theme.js`,mime:`text/javascript`,digest:`6e4e1a5cc59193e9ce1e1cbee66c00eb64a037c1356d5e136c582605197f555c`}],`34540f0e3142548bb20cb45728c4dceac190bd461f81de397dfa93a55e91d80c`,crypto.randomUUID()))}),self.addEventListener(`activate`,e=>{e.waitUntil(a(caches,`34540f0e3142548bb20cb45728c4dceac190bd461f81de397dfa93a55e91d80c`))}),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`&&o(n.pathname)||[{url:`/assets/CommandHost-ChAng_se.js`,mime:`text/javascript`,digest:`c7e770c83af8058748cb53cc85a3b9f9f20582e71e9f0df047870b247ecf0e87`},{url:`/assets/CommandHost-DnQatt_J.css`,mime:`text/css`,digest:`43898efa789bb02347a73e2def48d4c3e04b53ec8602d02207f88b2f7824a86e`},{url:`/assets/Defaults-CBfr8lXD.js`,mime:`text/javascript`,digest:`1b22c7a84f62148155921d712d78f656bb74a52ec21d3a071fef51345e8b38ab`},{url:`/assets/delegation-BhM1e-SP.js`,mime:`text/javascript`,digest:`20ed02a4245ca7eb5da06f6d888103b57c6c984e4c2e152910524ccd7ba84403`},{url:`/assets/index-BCNmjws_.js`,mime:`text/javascript`,digest:`daf992fc36369e2f2d34baa634d33975860ac5181667a066245996354cca59e5`},{url:`/assets/index-HfspVFEp.css`,mime:`text/css`,digest:`8e20bbe0d10295134dfbf526ae2e1b3e72c5b776a88e5debb60730f88db044fb`},{url:`/assets/LaunchConfig-CaRRzKrL.js`,mime:`text/javascript`,digest:`b9c2b57598e383181f4c89f3795cf30bc9ab9b3e9b27eba12761ff5de4d80642`},{url:`/assets/LaunchConfig-D-YcW6At.css`,mime:`text/css`,digest:`3bf0147452746e341675d350a8b461644af5770cb6564079bf6c10f0abac2806`},{url:`/assets/NewSession-DPq02bqK.js`,mime:`text/javascript`,digest:`e9bf0c06b092a15f25fe435406b01eb5aa4aef3f95091a2c646159497f212633`},{url:`/assets/NewSessionFrame-C9o57KUL.js`,mime:`text/javascript`,digest:`1b36e2969cae6ee981b25bcad397a748789de4315782fdef956c8c3eee8ae539`},{url:`/assets/Settings-DdGnTkWR.js`,mime:`text/javascript`,digest:`b016b3deccace82d53a89e7f18075efb610dec2ced8aa048ee45ede250110837`},{url:`/assets/text-D_b7Odl-.js`,mime:`text/javascript`,digest:`4770c3149295fe6b2bd080d5af7da5bb7004fefb04eee6ee894ca40d3c9a2bc8`},{url:`/assets/time-pcgqod1r.js`,mime:`text/javascript`,digest:`e65847dcaf7f4fa15cd8ad45c4d820881db380cc4b6250625c831e9b0cf62f2c`},{url:`/assets/ui-CKPDYEeX.js`,mime:`text/javascript`,digest:`ece4d75864359ef60e6a00bb6e5a6438405bf615a12e100710580f8bb5c9ea4c`},{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:`392ab4914dd01b7c72d80b0bd9328fcc85adbf2fa1b7e0ac4f17127fcfab9185`},{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 s(caches,`34540f0e3142548bb20cb45728c4dceac190bd461f81de397dfa93a55e91d80c`,r,t.mode===`navigate`,[{url:`/assets/CommandHost-ChAng_se.js`,mime:`text/javascript`,digest:`c7e770c83af8058748cb53cc85a3b9f9f20582e71e9f0df047870b247ecf0e87`},{url:`/assets/CommandHost-DnQatt_J.css`,mime:`text/css`,digest:`43898efa789bb02347a73e2def48d4c3e04b53ec8602d02207f88b2f7824a86e`},{url:`/assets/Defaults-CBfr8lXD.js`,mime:`text/javascript`,digest:`1b22c7a84f62148155921d712d78f656bb74a52ec21d3a071fef51345e8b38ab`},{url:`/assets/delegation-BhM1e-SP.js`,mime:`text/javascript`,digest:`20ed02a4245ca7eb5da06f6d888103b57c6c984e4c2e152910524ccd7ba84403`},{url:`/assets/index-BCNmjws_.js`,mime:`text/javascript`,digest:`daf992fc36369e2f2d34baa634d33975860ac5181667a066245996354cca59e5`},{url:`/assets/index-HfspVFEp.css`,mime:`text/css`,digest:`8e20bbe0d10295134dfbf526ae2e1b3e72c5b776a88e5debb60730f88db044fb`},{url:`/assets/LaunchConfig-CaRRzKrL.js`,mime:`text/javascript`,digest:`b9c2b57598e383181f4c89f3795cf30bc9ab9b3e9b27eba12761ff5de4d80642`},{url:`/assets/LaunchConfig-D-YcW6At.css`,mime:`text/css`,digest:`3bf0147452746e341675d350a8b461644af5770cb6564079bf6c10f0abac2806`},{url:`/assets/NewSession-DPq02bqK.js`,mime:`text/javascript`,digest:`e9bf0c06b092a15f25fe435406b01eb5aa4aef3f95091a2c646159497f212633`},{url:`/assets/NewSessionFrame-C9o57KUL.js`,mime:`text/javascript`,digest:`1b36e2969cae6ee981b25bcad397a748789de4315782fdef956c8c3eee8ae539`},{url:`/assets/Settings-DdGnTkWR.js`,mime:`text/javascript`,digest:`b016b3deccace82d53a89e7f18075efb610dec2ced8aa048ee45ede250110837`},{url:`/assets/text-D_b7Odl-.js`,mime:`text/javascript`,digest:`4770c3149295fe6b2bd080d5af7da5bb7004fefb04eee6ee894ca40d3c9a2bc8`},{url:`/assets/time-pcgqod1r.js`,mime:`text/javascript`,digest:`e65847dcaf7f4fa15cd8ad45c4d820881db380cc4b6250625c831e9b0cf62f2c`},{url:`/assets/ui-CKPDYEeX.js`,mime:`text/javascript`,digest:`ece4d75864359ef60e6a00bb6e5a6438405bf615a12e100710580f8bb5c9ea4c`},{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:`392ab4914dd01b7c72d80b0bd9328fcc85adbf2fa1b7e0ac4f17127fcfab9185`},{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=g(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&&o(t.pathname)&&e.postMessage({version:1,kind:`mcp_invalidated`})}catch{}})())}),self.addEventListener(`pushsubscriptionchange`,e=>{e.waitUntil((async()=>{let t=f(),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 v(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(_(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(S(e.notification.data?.url,self.clients,location.origin))})})();