@deepseek-insight/dsi 0.8.1 → 0.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/client/_app/immutable/assets/0.DyOAkKS-.css +2 -0
- package/build/client/_app/immutable/assets/2.BPprd30B.css +1 -0
- package/build/client/_app/immutable/chunks/{CJ1fzlPC.js → BoHeiMOU.js} +1 -1
- package/build/client/_app/immutable/chunks/C9QAOGL1.js +2 -0
- package/build/client/_app/immutable/chunks/QJuSx3RG.js +1 -0
- package/build/client/_app/immutable/chunks/sC_8Ss7w.js +1 -0
- package/build/client/_app/immutable/entry/{app.DP0oSUf-.js → app.S_mxIoOg.js} +2 -2
- package/build/client/_app/immutable/entry/start.BPQAB3iV.js +1 -0
- package/build/client/_app/immutable/nodes/{1.UuScj-IS.js → 1.D20V6eTe.js} +1 -1
- package/build/client/_app/immutable/nodes/{2.CJRPZhbe.js → 2.BHcBdFqH.js} +223 -223
- package/build/client/_app/version.json +1 -1
- package/build/handler.js +4 -4
- package/build/index.js +4 -4
- package/build/server/chunks/chunks/{db.js-B8BUpxGM.js → db.js-DQm6CZ_r.js} +2 -2
- package/build/server/chunks/chunks/{db2.js-CNe3I_g2.js → db2.js-DUhFxA3a.js} +2 -2
- package/build/server/chunks/chunks/{dsh-connection.js-xltcocWy.js → dsh-connection.js-BgeraFA2.js} +2 -2
- package/build/server/chunks/chunks/{dsh-events.js-CGuF_had.js → dsh-events.js-BUkLR6ZV.js} +13 -1
- package/build/server/chunks/chunks/{git-probe.js-CUsTmhmV.js → git-probe.js-CLF37SRh.js} +3 -3
- package/build/server/chunks/chunks/{insight-config.js-CaHHJpFK.js → insight-config.js-Dp_2gB5J.js} +5 -3
- package/build/server/chunks/chunks/{internal2.js-Pv5iygVN.js → internal2.js-Ba5p8uFM.js} +2 -2
- package/build/server/chunks/chunks/registry.js-C2MdrfNv.js +954 -0
- package/build/server/chunks/chunks/{state.js-BCaKzPy6.js → state.js-BSiAgink.js} +2 -2
- package/build/server/chunks/chunks/{watcher.js-DcT3cS4v.js → watcher.js-BVKnoQUw.js} +5 -5
- package/build/server/chunks/entries/endpoints/api/a2a/_id_/{_server.ts.js-19pFOjH8.js → _server.ts.js-BjzdVwdY.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/a2a/{_server.ts.js-BcUn6axe.js → _server.ts.js-3kQCQuHT.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/a2a/register/{_server.ts.js-oMpzLZoy.js → _server.ts.js-BUBTCLFn.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/browser/_id_/activate/_server.ts.js-CogDOHKu.js +45 -0
- package/build/server/chunks/entries/endpoints/api/browser/_id_/close/{_server.ts.js-DC3qPMQS.js → _server.ts.js-xOt7LnS1.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/browser/_id_/closetab/_server.ts.js-CSmVPvSM.js +44 -0
- package/build/server/chunks/entries/endpoints/api/browser/_id_/element/_server.ts.js-BA40oCDW.js +43 -0
- package/build/server/chunks/entries/endpoints/api/browser/_id_/input/{_server.ts.js-CHNcK7BH.js → _server.ts.js-EX7eVzjp.js} +6 -5
- package/build/server/chunks/entries/endpoints/api/browser/_id_/mcp/{_server.ts.js-CYkOJL2O.js → _server.ts.js-B_EcmyFt.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/browser/_id_/navigate/{_server.ts.js-DHTDi8KR.js → _server.ts.js-C3dYbyS3.js} +12 -8
- package/build/server/chunks/entries/endpoints/api/browser/_id_/opentab/_server.ts.js-CMhJJO25.js +45 -0
- package/build/server/chunks/entries/endpoints/api/browser/_id_/page/{_server.ts.js-Y5khEC2l.js → _server.ts.js-DIW4uI2S.js} +5 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/stream/{_server.ts.js-BmjgfZD2.js → _server.ts.js-CIPIlq5X.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/browser/_id_/tabs/_server.ts.js-CoEdOiml.js +34 -0
- package/build/server/chunks/entries/endpoints/api/browser/_id_/viewport/{_server.ts.js-IxS-goi1.js → _server.ts.js-CdELUoGT.js} +7 -5
- package/build/server/chunks/entries/endpoints/api/browser/{_server.ts.js-6STmJ7FD.js → _server.ts.js-ea6HpNGh.js} +15 -5
- package/build/server/chunks/entries/endpoints/api/config/{_server.ts.js-BVyx8gPc.js → _server.ts.js-C8XDnDwe.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/directory/{_server.ts.js-CNJbv6CC.js → _server.ts.js-BFmWshpv.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/jobs/{_server.ts.js-CDWmXDJX.js → _server.ts.js-DATWy5mQ.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/jobs/follow/{_server.ts.js-BDXQcQSL.js → _server.ts.js-CugOD1Zd.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/pick-directory/{_server.ts.js-CgedtzOg.js → _server.ts.js-DCupM4da.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/presets/{_server.ts.js-ut2pK15B.js → _server.ts.js-Bh1btvr9.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/attachment/{_server.ts.js-Ct2W7g4c.js → _server.ts.js-Cb8SBWVw.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/cancel/{_server.ts.js-Rke3V_qh.js → _server.ts.js-WI9yH2iG.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/catalog/{_server.ts.js-BYHm5WBA.js → _server.ts.js-bN9adUqz.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/changes/{_server.ts.js-B_bEUKkt.js → _server.ts.js-Bxlm966G.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/command/{_server.ts.js-D78fGUQk.js → _server.ts.js-CM-raN_Q.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/events/{_server.ts.js-CgB_c7zG.js → _server.ts.js-BzP30TXW.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/fork/{_server.ts.js-dVaW22_K.js → _server.ts.js-DvNkrTaY.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/goal/{_server.ts.js-Dl8SBXdH.js → _server.ts.js-DXbCrefw.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/history/{_server.ts.js-BKDiwMIE.js → _server.ts.js-B7YRQhuJ.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/models/{_server.ts.js-D3FY2Wxt.js → _server.ts.js-C_AEaLLJ.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/path/{_server.ts.js-BWuIEdjl.js → _server.ts.js-Dj-pF5ik.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/permission/{_server.ts.js-CeiQFOGP.js → _server.ts.js-BX9FWJ6g.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/prompt/{_server.ts.js-lMofZOns.js → _server.ts.js-CQ2Bmtu4.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/rename/{_server.ts.js-CNalVHrK.js → _server.ts.js-Ha7xjnKW.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/respond/{_server.ts.js-I2s8qvcV.js → _server.ts.js-BOg6llHk.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/select-model/{_server.ts.js-DTKELD7v.js → _server.ts.js-DBqGALzZ.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/sessions/{_server.ts.js-BXSD__Gg.js → _server.ts.js-CvA8WDDb.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/workspace-file/{_server.ts.js-C9IZl2Qh.js → _server.ts.js-BfjNH40j.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/workspace-tree/{_server.ts.js-BRXu3UtL.js → _server.ts.js-De_qumyr.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/workspaces/{_server.ts.js-DmnpiaD2.js → _server.ts.js-tFpJJHCb.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/delete/{_server.ts.js-C5qCdsdm.js → _server.ts.js-DVx5GGA_.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/rename/{_server.ts.js-BVUn49yf.js → _server.ts.js-DuKT-aZp.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/prompts/_id_/{_server.ts.js-DuCOsoF0.js → _server.ts.js-DsWFidFY.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/prompts/{_server.ts.js-2mcRY7IP.js → _server.ts.js-C6j0adQs.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/prompts/use/{_server.ts.js-DZjaHZxU.js → _server.ts.js-BChAg4hm.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/settings/{_server.ts.js-DTVmsohJ.js → _server.ts.js-BPSHqbZN.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/terminal/{_server.ts.js-DZXTArj7.js → _server.ts.js-D5CbUe5k.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/workspace/file-write/{_server.ts.js-LSc5EKH7.js → _server.ts.js-B-5YihUA.js} +5 -5
- package/build/server/chunks/entries/endpoints/api/workspace/git-events/{_server.ts.js-DNjiScBe.js → _server.ts.js-DT5jRZFE.js} +5 -5
- package/build/server/chunks/entries/endpoints/api/workspace/git-file-head/{_server.ts.js-CHMbLoSn.js → _server.ts.js-DtW-utrd.js} +5 -5
- package/build/server/chunks/entries/endpoints/api/workspace/git-map/{_server.ts.js-BgM4JEAm.js → _server.ts.js-8AIAo9jX.js} +5 -5
- package/build/server/chunks/entries/endpoints/api/workspace/git-status/{_server.ts.js-BH0cLS8o.js → _server.ts.js-CMw96vjY.js} +5 -5
- package/build/server/chunks/entries/endpoints/api/workspace/write-gate/{_server.ts.js-BzlV3cVT.js → _server.ts.js-DKufa14_.js} +5 -5
- package/build/server/chunks/entries/pages/{_error.svelte.js-BRyCyR0c.js → _error.svelte.js-D8-G0evO.js} +3 -3
- package/build/server/chunks/entries/pages/{_page.server.ts.js-DttLUwdf.js → _page.server.ts.js-7x6ZfGoB.js} +3 -3
- package/build/server/chunks/entries/pages/{_page.svelte.js-CKY8hz9T.js → _page.svelte.js-7xWLRsiZ.js} +333 -158
- package/build/server/chunks/{handler-D1oqmwyy.js → handler-BedQ0jP-.js} +3 -3
- package/build/server/chunks/{index.js-BZ8zP9wS.js → index.js-BF6tPPQs.js} +2 -2
- package/build/server/chunks/{manifest.js-CA6PuZTD.js → manifest.js-3c0p7QAl.js} +90 -55
- package/build/server/chunks/nodes/{0.js-DtkNHIFx.js → 0.js-B3i7sGR_.js} +3 -3
- package/build/server/chunks/nodes/1.js-eUf50uxI.js +9 -0
- package/build/server/chunks/nodes/{2.js-P1boc94A.js → 2.js-CgnRGwm6.js} +8 -8
- package/package.json +2 -7
- package/skills/dsi-kb-scenario/SKILL.md +67 -0
- package/template/.dsi/prompts.sqlite-shm +0 -0
- package/template/.dsi/prompts.sqlite-wal +0 -0
- package/template/.dsi/settings.yaml +8 -1
- package/build/client/_app/immutable/assets/0.DBVVEjy9.css +0 -2
- package/build/client/_app/immutable/assets/2.BhBfHqja.css +0 -1
- package/build/client/_app/immutable/chunks/C0tWPpc3.js +0 -2
- package/build/client/_app/immutable/chunks/gZFoJ-NI.js +0 -1
- package/build/client/_app/immutable/chunks/xkjLeSzJ.js +0 -1
- package/build/client/_app/immutable/entry/start.mBp3LB6J.js +0 -1
- package/build/server/chunks/chunks/registry.js-BTiJ1Kaj.js +0 -577
- package/build/server/chunks/nodes/1.js-Q6zZupRG.js +0 -9
- /package/build/client/_app/immutable/nodes/{0.Dm_ry-Pr.js → 0.6dTmg1Xv.js} +0 -0
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{G as e,J as t,K as n,_t as r,dt as i,lt as a,q as o,r as s,t as c}from"./cHj8EuyS.js";var l=class{constructor(e,t){this.status=e,this.body=typeof t==`string`?{message:t}:t||{message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}},u=class{constructor(e,t){try{new Headers({location:t})}catch{throw Error(`Invalid redirect location ${JSON.stringify(t)}: this string contains characters that cannot be used in HTTP headers`)}this.status=e,this.location=t}},d=class extends Error{constructor(e,t,n){super(n),this.status=e,this.text=t}};new URL(`sveltekit-internal://`);function f(e,t){return e===`/`||t===`ignore`?e:t===`never`?e.endsWith(`/`)?e.slice(0,-1):e:t===`always`&&!e.endsWith(`/`)?e+`/`:e}function p(e){return e.split(`%25`).map(decodeURI).join(`%25`)}function m(e){for(let t in e)e[t]=decodeURIComponent(e[t]);return e}function h({href:e}){return e.split(`#`)[0]}function g(e,t,n,r=!1){let i=new URL(e);Object.defineProperty(i,"searchParams",{value:new Proxy(i.searchParams,{get(e,r){if(r===`get`||r===`getAll`||r===`has`)return(t,...i)=>(n(t),e[r](t,...i));t();let i=Reflect.get(e,r);return typeof i==`function`?i.bind(e):i}}),enumerable:!0,configurable:!0});let a=[`href`,`pathname`,`search`,`toString`,`toJSON`];r&&a.push(`hash`);for(let n of a)Object.defineProperty(i,n,{get(){return t(),e[n]},enumerable:!0,configurable:!0});return i}function _(){}function v(...e){let t=5381;for(let n of e)if(typeof n==`string`){let e=n.length;for(;e;)t=t*33^n.charCodeAt(--e)}else if(ArrayBuffer.isView(n)){let e=new Uint8Array(n.buffer,n.byteOffset,n.byteLength),r=e.length;for(;r;)t=t*33^e[--r]}else throw TypeError(`value must be a string or TypedArray`);return(t>>>0).toString(36)}new TextEncoder;function ee(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var y=window.fetch;window.fetch=(e,t)=>((e instanceof Request?e.method:t?.method||`GET`)!==`GET`&&b.delete(ne(e)),y(e,t));var b=new Map;function x(e,t){let n=ne(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:e,...t}=JSON.parse(r.textContent);r.getAttribute(`data-b64`)!==null&&(e=ee(e));let i=r.getAttribute(`data-ttl`);return i&&b.set(n,{body:e,init:t,ttl:1e3*Number(i)}),Promise.resolve(new Response(e,t))}return window.fetch(e,t)}function te(e,t,n){if(b.size>0){let t=ne(e,n),r=b.get(t);if(r){if(performance.now()<r.ttl&&[`default`,`force-cache`,`only-if-cached`,void 0].includes(n?.cache))return new Response(r.body,r.init);b.delete(t)}}return window.fetch(t,n)}function ne(e,t){let n=`script[data-sveltekit-fetched][data-url=${JSON.stringify(e instanceof Request?e.url:e)}]`;if(t?.headers||t?.body){let e=[];t.headers&&e.push([...new Headers(t.headers)].join(`,`)),t.body&&(typeof t.body==`string`||ArrayBuffer.isView(t.body))&&e.push(t.body),n+=`[data-hash="${v(...e)}"]`}return n}var re=/^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/,ie=/^\/\((?:[^)]+)\)$/;function ae(e){let t=[];return{pattern:e===`/`||ie.test(e)?/^\/$/:RegExp(`^${se(e).map(e=>{let n=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(e);if(n)return t.push({name:n[1],matcher:n[2],optional:!1,rest:!0,chained:!0}),`(?:/([^]*))?`;let r=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(e);if(r)return t.push({name:r[1],matcher:r[2],optional:!0,rest:!1,chained:!0}),`(?:/([^/]+))?`;if(!e)return;let i=e.split(/\[(.+?)\](?!\])/);return`/`+i.map((e,n)=>{if(n%2){if(e.startsWith(`x+`))return le(String.fromCharCode(parseInt(e.slice(2),16)));if(e.startsWith(`u+`))return le(String.fromCharCode(...e.slice(2).split(`-`).map(e=>parseInt(e,16))));let[,r,a,o,s]=re.exec(e);return t.push({name:o,matcher:s,optional:!!r,rest:!!a,chained:a?n===1&&i[0]===``:!1}),a?`([^]*?)`:r?`([^/]*)?`:`([^/]+?)`}return le(e)}).join(``)}).join(``)}/?$`),params:t}}function oe(e){return e!==``&&!/^\([^)]+\)$/.test(e)}function se(e){return e.slice(1).split(`/`).filter(oe)}function ce(e,t,n){let r={},i=e.slice(1),a=i.filter(e=>e!==void 0),o=0;for(let e=0;e<t.length;e+=1){let s=t[e],c=i[e-o];if(s.chained&&s.rest&&o&&(c=i.slice(e-o,e+1).filter(e=>e).join(`/`),o=0),c===void 0){if(s.rest)c=``;else continue}if(!s.matcher||n[s.matcher](c)){r[s.name]=c;let n=t[e+1],l=i[e+1];n&&!n.rest&&n.optional&&l&&s.chained&&(o=0),!n&&!l&&Object.keys(r).length===a.length&&(o=0);continue}if(s.optional&&s.chained){o++;continue}return}if(!o)return r}function le(e){return e.normalize().replace(/[[\]]/g,`\\$&`).replace(/%/g,`%25`).replace(/\//g,`%2[Ff]`).replace(/\?/g,`%3[Ff]`).replace(/#/g,`%23`).replace(/[.*+?^${}()|\\]/g,`\\$&`)}function ue({nodes:e,server_loads:t,dictionary:n,matchers:r}){let i=new Set(t);return Object.entries(n).map(([t,[n,i,s]])=>{let{pattern:c,params:l}=ae(t),u={id:t,exec:e=>{let t=c.exec(e);if(t)return ce(t,l,r)},errors:[1,...s||[]].map(t=>e[t]),layouts:[0,...i||[]].map(o),leaf:a(n)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function a(t){let n=t<0;return n&&(t=~t),[n,e[t]]}function o(t){return t===void 0?t:[i.has(t),e[t]]}}function de(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function fe(e,t,n=JSON.stringify){let r=n(t);try{sessionStorage[e]=r}catch{}}var S=globalThis.__sveltekit_eqj778?.base??``,pe=globalThis.__sveltekit_eqj778?.assets??S??``,me=`1792672428054`,he=`sveltekit:snapshot`,ge=`sveltekit:scroll`,_e=`sveltekit:states`,ve=`sveltekit:pageurl`,C=`sveltekit:history`,w=`sveltekit:navigation`,T={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},ye=location.origin;function be(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){let e=document.getElementsByTagName(`base`);t=e.length?e[0].href:document.URL}return new URL(e,t)}function E(){return{x:pageXOffset,y:pageYOffset}}function D(e,t){return e.getAttribute(`data-sveltekit-${t}`)}var xe={...T,"":T.hover};function Se(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function Ce(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()===`A`&&e.hasAttribute(`href`))return e;e=Se(e)}}function we(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){let e=location.hash.split(`#`)[1]||`/`;r.hash=`#${e}${r.hash}`}}catch{}let i=e instanceof SVGAElement?e.target.baseVal:e.target,a=!r||!!i||ke(r,t,n)||(e.getAttribute(`rel`)||``).split(/\s+/).includes(`external`),o=r?.origin===ye&&e.hasAttribute(`download`);return{url:r,external:a,target:i,download:o}}function Te(e){let t=null,n=null,r=null,i=null,a=null,o=null,s=e;for(;s&&s!==document.documentElement;)r===null&&(r=D(s,`preload-code`)),i===null&&(i=D(s,`preload-data`)),t===null&&(t=D(s,`keepfocus`)),n===null&&(n=D(s,`noscroll`)),a===null&&(a=D(s,`reload`)),o===null&&(o=D(s,`replacestate`)),s=Se(s);function c(e){switch(e){case``:case`true`:return!0;case`off`:case`false`:return!1;default:return}}return{preload_code:xe[r??`off`],preload_data:xe[i??`off`],keepfocus:c(t),noscroll:c(n),reload:c(a),replace_state:c(o)}}function Ee(e){let t=r(e),n=!0;function i(){n=!0,t.update(e=>e)}function a(e){n=!1,t.set(e)}function o(e){let r;return t.subscribe(t=>{(r===void 0||n&&t!==r)&&e(r=t)})}return{notify:i,set:a,subscribe:o}}var De={v:_};function Oe(){let{set:e,subscribe:t}=r(!1),n;async function i(){clearTimeout(n);try{let t=await fetch(`${pe}/_app/version.json`,{headers:{pragma:`no-cache`,"cache-control":`no-cache`}});if(!t.ok)return!1;let r=(await t.json()).version!==me;return r&&(e(!0),De.v(),clearTimeout(n)),r}catch{return!1}}return{subscribe:t,check:i}}function ke(e,t,n){return e.origin!==ye||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Ae(e){}var je=2**32-1,Me=je-1,Ne=Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);function Pe(e){let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null||Object.getPrototypeOf(t)===null||Object.getOwnPropertyNames(t).sort().join(`\0`)===Ne}function Fe(e){return Object.prototype.toString.call(e).slice(8,-1)}function Ie(e){return Object.getOwnPropertySymbols(e).filter(t=>Object.getOwnPropertyDescriptor(e,t).enumerable)}function Le(e){return!(!Number.isInteger(e)||e<0||e>Me)}function Re(e){return!(!Number.isInteger(e)||e<0||e>je)}function ze(e){if(e.length===0||e.length>1&&e.charCodeAt(0)===48)return!1;for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n<48||n>57)return!1}return Le(+e)}function Be(e){for(var t=e.length-1;t>=0&&!ze(e[t]);t--);return t+1}function Ve(e){let t=Object.keys(e);return t.length=Be(t),t}function He(e){return Uint8Array.fromBase64(e).buffer}function Ue(e){return Uint8Array.from(Buffer.from(e,`base64`)).buffer}function We(e){let t=atob(e),n=t.length,r=new Uint8Array(n);for(let e=0;e<n;e++)r[e]=t.charCodeAt(e);return r.buffer}var Ge=typeof Uint8Array.fromBase64==`function`,Ke=typeof process==`object`&&process.versions?.node!==void 0,qe=Ge?He:Ke?Ue:We;function Je(e,t){if(!t)return e;let n={};for(let r of Object.keys(e))n[r]=t[r]??e[r];return n}var Ye=Object.freeze({kind:`not-plain`}),Xe=Object.freeze({kind:`symbol-keys`});Object.freeze({identify:e=>e,typeOf:e=>e===null?`null`:typeof e,toPrimitive:e=>e,tagOf:e=>Fe(e),isThenable:e=>typeof e.then==`function`,toPromise:e=>Promise.resolve(e),unbox:e=>e.valueOf(),toISOString:e=>isNaN(e.getDate())?``:e.toISOString(),toStringValue:e=>e.toString(),regExpInfo:e=>({source:e.source,flags:e.flags}),valuesOf:e=>e,entriesOf:e=>e,viewInfo:e=>({buffer:e.buffer,byteOffset:e.byteOffset,byteLength:e.byteLength,length:e.length,bufferByteLength:e.buffer.byteLength}),toArrayBuffer:e=>e,lengthOf:e=>e.length,hasOwn:(e,t)=>Object.hasOwn(e,t),indicesOf:e=>Ve(e),shapeOf:e=>Pe(e)?Ie(e).length>0?Xe:{kind:Object.getPrototypeOf(e)===null?`null-proto`:`plain`,keys:Object.keys(e)}:Ye,get:(e,t)=>e[t]});var Ze=Object.freeze({fromPrimitive:e=>e,fromISOString:e=>new Date(e),fromStringValue:(e,t)=>e===`URL`?new URL(t):e===`URLSearchParams`?new URLSearchParams(t):Temporal[e.slice(9)].from(t),fromArrayBuffer:e=>e,fromRegExpInfo:(e,t)=>new RegExp(e,t),fromViewInfo:(e,t,n,r)=>{let i=globalThis[e];return n===void 0?new i(t):new i(t,n,r)},box:e=>Object(e),createArray:e=>Array(e),createSparseArray:e=>{let t=[];return t[Me]=void 0,delete t[Me],t.length=e,t},createObject:()=>({}),createNullPrototypeObject:()=>Object.create(null),createSet:()=>new Set,createMap:()=>new Map,set:(e,t,n)=>{e[t]=n},addValue:(e,t)=>{e.add(t)},addEntry:(e,t,n)=>{e.set(t,n)}});function Qe(e,t,n){let r=Je(Ze,n?.operations);if(typeof e==`number`)return s(e,!0);if(!Array.isArray(e)||e.length===0)throw Error(`Invalid input`);let i=e,a=Array(i.length),o=null;function s(e,n=!1){if(e===-1)return r.fromPrimitive(void 0);if(e===-3)return r.fromPrimitive(NaN);if(e===-4)return r.fromPrimitive(1/0);if(e===-5)return r.fromPrimitive(-1/0);if(e===-6)return r.fromPrimitive(-0);if(n||typeof e!=`number`)throw Error(`Invalid input`);if(e in a)return a[e];let c=i[e];if(!c||typeof c!=`object`)a[e]=r.fromPrimitive(c);else if(Array.isArray(c)){if(typeof c[0]==`string`){let n=c[0],l=t&&Object.hasOwn(t,n)?t[n]:void 0;if(l){let t=c[1];if(typeof t!=`number`&&(t=i.push(c[1])-1),Object.hasOwn(a,t))return a[e]=l(a[t]);if(o??=new Set,o.has(t))throw Error(`Invalid circular reference`);return o.add(t),a[e]=l(s(t)),o.delete(t),a[e]}switch(n){case`Date`:a[e]=r.fromISOString(c[1]);break;case`Set`:let t=r.createSet();a[e]=t;for(let e=1;e<c.length;e+=1)r.addValue(t,s(c[e]));break;case`Map`:let o=r.createMap();a[e]=o;for(let e=1;e<c.length;e+=2)r.addEntry(o,s(c[e]),s(c[e+1]));break;case`RegExp`:a[e]=r.fromRegExpInfo(c[1],c[2]);break;case`Object`:{let t=c[1];if(typeof i[t]==`object`&&i[t][0]!==`BigInt`)throw Error(`Invalid input`);a[e]=r.box(s(t));break}case`BigInt`:a[e]=r.fromPrimitive(BigInt(c[1]));break;case`null`:let l=r.createNullPrototypeObject();a[e]=l;for(let e=1;e<c.length;e+=2){if(c[e]===`__proto__`)throw Error("Cannot parse an object with a `__proto__` property");r.set(l,c[e],s(c[e+1]))}break;case`Int8Array`:case`Uint8Array`:case`Uint8ClampedArray`:case`Int16Array`:case`Uint16Array`:case`Float16Array`:case`Int32Array`:case`Uint32Array`:case`Float32Array`:case`Float64Array`:case`BigInt64Array`:case`BigUint64Array`:case`DataView`:{if(i[c[1]][0]!==`ArrayBuffer`)throw Error(`Invalid data`);let t=s(c[1]);a[e]=r.fromViewInfo(n,t,c[2],c[3]);break}case`ArrayBuffer`:{let t=c[1];if(typeof t!=`string`)throw Error(`Invalid ArrayBuffer encoding`);a[e]=r.fromArrayBuffer(qe(t));break}case`URL`:case`URLSearchParams`:case`Temporal.Duration`:case`Temporal.Instant`:case`Temporal.PlainDate`:case`Temporal.PlainTime`:case`Temporal.PlainDateTime`:case`Temporal.PlainMonthDay`:case`Temporal.PlainYearMonth`:case`Temporal.ZonedDateTime`:a[e]=r.fromStringValue(n,c[1]);break;default:throw Error(`Unknown type ${n}`)}}else if(c[0]===-7){let t=c[1];if(!Re(t))throw Error(`Invalid input`);let n=r.createSparseArray(t);a[e]=n;for(let e=2;e<c.length;e+=2){let i=c[e];if(!Le(i)||i>=t)throw Error(`Invalid input`);r.set(n,i,s(c[e+1]))}}else{let t=r.createArray(c.length);a[e]=t;for(let e=0;e<c.length;e+=1){let n=c[e];n!==-2&&r.set(t,e,s(n))}}}else{let t=r.createObject();a[e]=t;for(let e of Object.keys(c)){if(e===`__proto__`)throw Error("Cannot parse an object with a `__proto__` property");r.set(t,e,s(c[e]))}}return a[e]}return s(0)}var $e=new Set([`load`,`prerender`,`csr`,`ssr`,`trailingSlash`,`config`]);[...$e],[...new Set([...$e])];function et(e){return e.filter(e=>e!=null)}var tt=`x-sveltekit-invalidated`,nt=`x-sveltekit-trailing-slash`;function O(e,t){return e+`/`+t}function k(e){return e instanceof l||e instanceof d?e.status:500}function rt(e){return e instanceof d?e.text:`Internal Error`}var A,j,it,at=s.toString().includes(`$$`)||/function \w+\(\) \{\}/.test(s.toString()),ot=`a:`;at?(A={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(ot)},j={current:null},it={current:!1}):(A=new class{#e=i({});get data(){return e(this.#e)}set data(e){a(this.#e,e)}#t=i(null);get form(){return e(this.#t)}set form(e){a(this.#t,e)}#n=i(null);get error(){return e(this.#n)}set error(e){a(this.#n,e)}#r=i({});get params(){return e(this.#r)}set params(e){a(this.#r,e)}#i=i({id:null});get route(){return e(this.#i)}set route(e){a(this.#i,e)}#a=i({});get state(){return e(this.#a)}set state(e){a(this.#a,e)}#o=i(-1);get status(){return e(this.#o)}set status(e){a(this.#o,e)}#s=i(new URL(ot));get url(){return e(this.#s)}set url(e){a(this.#s,e)}},j=new class{#e=i(null);get current(){return e(this.#e)}set current(e){a(this.#e,e)}},it=new class{#e=i(!1);get current(){return e(this.#e)}set current(e){a(this.#e,e)}},De.v=()=>it.current=!0);function st(e){Object.assign(A,e)}var ct=`/__data.json`,lt=`.html__data.json`;function ut(e){return e.endsWith(`.html`)?e.replace(/\.html$/,lt):e.replace(/\/$/,``)+ct}var dt={spanContext(){return ft},setAttribute(){return this},setAttributes(){return this},addEvent(){return this},setStatus(){return this},updateName(){return this},end(){return this},isRecording(){return!1},recordException(){return this},addLink(){return this},addLinks(){return this}},ft={traceId:``,spanId:``,traceFlags:0};async function*pt(e,t){let n=!1,r=``,i=new TextDecoder;for(;;){let a=r.indexOf(t);for(;a!==-1;)yield r.slice(0,a),r=r.slice(a+t.length),a=r.indexOf(t);if(n){r&&(yield r);return}let o=await e.read();n=o.done,o.value&&(r+=i.decode(o.value,{stream:!0})),n&&(r+=i.decode())}}async function*mt(e){for await(let t of pt(e,`
|
|
2
|
-
`)){let e=t.trim();e&&(yield JSON.parse(e))}}var{onMount:ht,tick:gt}=c,_t=t??(e=>e()),vt=new Set([`icon`,`shortcut icon`,`apple-touch-icon`]),M=null,N=de(`sveltekit:scroll`)??{},P=de(`sveltekit:snapshot`)??{},F={url:Ee({}),page:Ee({}),navigating:r(null),updated:Oe()};function yt(e){N[e]=E()}function bt(e,t){let n=e+1;for(;N[n];)delete N[n],n+=1;for(n=t+1;P[n];)delete P[n],n+=1}function I(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(_)}async function xt(){if(`serviceWorker`in navigator){let e=await navigator.serviceWorker.getRegistration(S||`/`);e&&await e.update()}}var St,Ct,L,R,wt,z,Tt={},Et={},B=[],V=[],H=null;function Dt(){H?.fork?.then(e=>e?.discard()),H=null,Q={element:void 0,href:void 0}}var Ot=new Map,kt=new Set,At=new Set,U=new Set,W={branch:[],error:null,url:null,nav:null},jt=!1,Mt=!1,Nt=!0,G=!1,K=!1,Pt=!1,Ft=!1,It,q,J,Y,X=new Set,Lt=new Map,Rt=new Map;async function zt(e,t,n){if(globalThis.__sveltekit_eqj778.data){let{q:e={},p:t={},l:n={},f:r={}}=globalThis.__sveltekit_eqj778.data;for(let t in e)Tt[t]=e[t];for(let e in n)Tt[e]=n[e];for(let e in r)Tt[e]=r[e];for(let e in t)Et[e]=t[e]}document.URL!==location.href&&(location.href=location.href),z=e,await e.hooks.init?.(),St=ue(e),R=document.documentElement,wt=t,Ct=e.nodes[0],L=e.nodes[1],Ct(),L(),q=history.state?.[C],J=history.state?.[w],q||(q=J=Date.now(),history.replaceState({...history.state,[C]:q,[w]:J},``));let r=N[q];function i(){r&&(history.scrollRestoration=`manual`,scrollTo(r.x,r.y))}n?(i(),await _n(wt,n)):(await Z({type:`enter`,url:be(z.hash?Tn(new URL(location.href)):location.href),replace_state:!0}),i()),gn()}function Bt(){B.length=0,Ft=!1}function Vt(e){V.some(e=>e?.snapshot)&&(P[e]=V.map(e=>e?.snapshot?.capture()))}function Ht(e){P[e]?.forEach((e,t)=>{V[t]?.snapshot?.restore(e)})}function Ut(){yt(q),fe(ge,N),Vt(J),fe(he,P)}async function Wt(e,t,n,r){let i,a;t.invalidateAll&&Dt(),await Z({type:`goto`,url:be(e),keepfocus:t.keepFocus,noscroll:t.noScroll,replace_state:t.replaceState,state:t.state,redirect_count:n,nav_token:r,accept:()=>{if(t.invalidateAll){Ft=!0,i=new Set;for(let[e,t]of Lt)for(let[n,r]of t)r.resource?.reset(),i.add(O(e,n));a=new Set;for(let[e,t]of Rt)for(let n of t.keys())a.add(O(e,n))}t.invalidate&&t.invalidate.forEach(mn)}}),t.invalidateAll&&o().then(o).then(()=>{for(let[e,t]of Lt)for(let[n,{resource:r}]of t)i?.has(O(e,n))&&r.start();for(let[e,t]of Rt)for(let[n,{resource:r}]of t)a?.has(O(e,n))&&r.reconnect()})}async function Gt(e){if(e.id!==H?.id){Dt();let t={};X.add(t),H={id:e.id,token:t,promise:tn({...e,preload:t}).then(e=>(X.delete(t),e.type===`loaded`&&e.state.error&&Dt(),e)),fork:null}}return H.promise}async function Kt(e){let t=(await on(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(e=>e[1]()))}async function qt(e,t,n){let r={params:W.params,route:{id:W.route?.id??null},url:new URL(location.href)};if(W={...e.state,nav:r},st(e.props.page),It=new z.root({target:t,props:{...e.props,stores:F,components:V},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),n){let e={from:null,to:{...r,scroll:N[q]??E()},willUnload:!1,type:`enter`,complete:Promise.resolve()};U.forEach(t=>t(e))}Ht(J),Mt=!0}async function Jt({url:e,params:t,branch:n,errors:r,status:i,error:a,route:o,form:s}){let c=`never`;if(S&&(e.pathname===S||e.pathname===S+`/`))c=`always`;else for(let e of n)e?.slash!==void 0&&(c=e.slash);e.pathname=f(e.pathname,c),e.search=e.search;let l={type:`loaded`,state:{url:e,params:t,branch:n,error:a,route:o},props:{constructors:et(n).map(e=>e.node.component),page:wn(A)}};s!==void 0&&(l.props.form=s);let u={},d=!A,p=0;for(let e=0;e<Math.max(n.length,W.branch.length);e+=1){let t=n[e],r=W.branch[e];t?.data!==r?.data&&(d=!0),t&&(u={...u,...t.data},d&&(l.props[`data_${p}`]=u),p+=1)}return(!W.url||e.href!==W.url.href||W.error!==a||s!==void 0&&s!==A.form||d)&&(l.props.page={error:a,params:t,route:{id:o?.id??null},state:{},status:i,url:new URL(e),form:s??null,data:d?u:A.data}),l}async function Yt({loader:e,parent:t,url:n,params:r,route:i,server_data_node:a}){let o=null,s=!0,c={dependencies:new Set,params:new Set,parent:!1,route:!1,url:!1,search_params:new Set},l=await e();if(l.universal?.load){function e(...e){for(let t of e){let{href:e}=new URL(t,n);c.dependencies.add(e)}}let u={tracing:{enabled:!1,root:dt,current:dt},route:new Proxy(i,{get:(e,t)=>(s&&(c.route=!0),e[t])}),params:new Proxy(r,{get:(e,t)=>(s&&c.params.add(t),e[t])}),data:a?.data??null,url:g(n,()=>{s&&(c.url=!0)},e=>{s&&c.search_params.add(e)},z.hash),async fetch(t,r){t instanceof Request&&(r={body:t.method===`GET`||t.method===`HEAD`?void 0:await t.blob(),cache:t.cache,credentials:t.credentials,headers:[...t.headers].length>0?t?.headers:void 0,integrity:t.integrity,keepalive:t.keepalive,method:t.method,mode:t.mode,redirect:t.redirect,referrer:t.referrer,referrerPolicy:t.referrerPolicy,signal:t.signal,...r});let{resolved:i,promise:a}=Xt(t,r,n);return s&&e(i.href),a},setHeaders:_,depends:e,parent(){return s&&(c.parent=!0),t()},untrack(e){s=!1;try{return e()}finally{s=!0}}};o=await l.universal.load.call(null,u)??null}return{node:l,loader:e,server:a,universal:l.universal?.load?{type:`data`,data:o,uses:c}:null,data:o??a?.data??null,slash:l.universal?.trailingSlash??a?.slash}}function Xt(e,t,n){let r=e instanceof Request?e.url:e,i=new URL(r,n);return i.origin===n.origin&&(r=i.href.slice(n.origin.length)),{resolved:i,promise:Mt?te(r,i.href,t):x(r,t)}}function Zt(e,t,n,r,i,a){if(Ft)return!0;if(!i)return!1;if(i.parent&&e||i.route&&t||i.url&&n)return!0;for(let e of i.search_params)if(r.has(e))return!0;for(let e of i.params)if(a[e]!==W.params[e])return!0;for(let e of i.dependencies)if(B.some(t=>t(new URL(e))))return!0;return!1}function Qt(e,t){return e?.type===`data`?e:e?.type===`skip`?t??null:null}function $t(e,t){if(!e)return new Set(t.searchParams.keys());let n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(let r of n){let i=e.searchParams.getAll(r),a=t.searchParams.getAll(r);i.every(e=>a.includes(e))&&a.every(e=>i.includes(e))&&n.delete(r)}return n}function en({error:e,url:t,route:n,params:r}){return{type:`loaded`,state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:wn(A),constructors:[]}}}async function tn({id:e,invalidating:t,url:n,params:r,route:i,preload:a}){if(H?.id===e)return X.delete(H.token),H.promise;let{errors:o,layouts:s,leaf:c}=i,d=[...s,c];o.forEach(e=>e?.().catch(_)),d.forEach(e=>e?.[1]().catch(_));let f=null,p=W.url?e!==cn(W.url):!1,m=W.route?i.id!==W.route.id:!1,h=$t(W.url,n),g=!1;{let t=d.map((e,t)=>{let n=W.branch[t],i=!!e?.[0]&&(n?.loader!==e[1]||Zt(g,m,p,h,n.server?.uses,r));return i&&(g=!0),i});if(t.some(Boolean)){try{f=await vn(n,t)}catch(t){let o=await $(t,{url:n,params:r,route:{id:e}});return a&&X.has(a)?en({error:o,url:n,params:r,route:i}):rn({status:k(t),error:o,url:n,route:i})}if(f.type===`redirect`)return f}}let v=f?.nodes,ee=!1,y=d.map(async(e,t)=>{if(!e)return;let a=W.branch[t],o=v?.[t];if((!o||o.type===`skip`)&&e[1]===a?.loader&&!Zt(ee,m,p,h,a.universal?.uses,r))return a;if(ee=!0,o?.type===`error`)throw o;return Yt({loader:e[1],url:n,params:r,route:i,parent:async()=>{let e={};for(let n=0;n<t;n+=1)Object.assign(e,(await y[n])?.data);return e},server_data_node:Qt(o===void 0&&e[0]?{type:`skip`}:o??null,e[0]?a?.server:void 0)})});for(let e of y)e.catch(_);let b=[];for(let e=0;e<d.length;e+=1)if(d[e])try{b.push(await y[e])}catch(t){if(t instanceof u)return{type:`redirect`,location:t.location};if(a&&X.has(a))return en({error:await $(t,{params:r,url:n,route:{id:i.id}}),url:n,params:r,route:i});let s=k(t),c;if(v?.includes(t))s=t.status??s,c=t.error;else if(t instanceof l)c=t.body;else{if(await F.updated.check())return await xt(),await I(n);c=await $(t,{params:r,url:n,route:{id:i.id}})}let d=await nn(e,b,o);return d?Jt({url:n,params:r,branch:b.slice(0,d.idx).concat(d.node),errors:o,status:s,error:c,route:i}):await un(n,{id:i.id},c,s)}else b.push(void 0);return Jt({url:n,params:r,branch:b,errors:o,status:200,error:null,route:i,form:t?void 0:null})}async function nn(e,t,n){for(;e--;)if(n[e]){let r=e;for(;!t[r];)--r;try{return{idx:r+1,node:{node:await n[e](),loader:n[e],data:{},server:null,universal:null}}}catch{continue}}}async function rn({status:e,error:t,url:n,route:r}){let i={},a=null;if(z.server_loads[0]===0)try{let e=await vn(n,[!0]);if(e.type!==`data`||e.nodes[0]&&e.nodes[0].type!==`data`)throw 0;a=e.nodes[0]??null}catch(e){if(!(e instanceof l&&e.status===404)&&(n.origin!==ye||n.pathname!==location.pathname||jt))return await I(n)}try{return Jt({url:n,params:i,branch:[await Yt({loader:Ct,url:n,params:i,route:r,parent:()=>Promise.resolve({}),server_data_node:Qt(a)}),{node:await L(),loader:L,universal:null,server:null,data:null}],status:e,error:t,errors:[],route:null})}catch(t){if(t instanceof u){await Wt(new URL(t.location,location.href),{},0);return}let a=await z.get_error_template(),o=await $(t,{url:n,params:i,route:r}),s=a({status:e,message:String(o?.message??``).replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`)}),c=new DOMParser().parseFromString(s,`text/html`);throw document.documentElement.replaceChild(document.adoptNode(c.head),document.head),document.documentElement.replaceChild(document.adoptNode(c.body),document.body),t}}async function an(e){let t=e.href;if(Ot.has(t))return Ot.get(t);let n;try{let r=(async()=>{let t=await z.hooks.reroute({url:new URL(e),fetch:async(t,n)=>Xt(t,n,e).promise})??e;if(typeof t==`string`){let n=new URL(e);z.hash?n.hash=t:n.pathname=t,t=n}return t})();Ot.set(t,r),n=await r}catch{Ot.delete(t);return}return n}async function on(e,t){if(e&&!ke(e,S,z.hash)){let n=await an(e);if(!n)return;let r=sn(n);for(let n of St){let i=n.exec(r);if(i)return{id:cn(e),invalidating:t,route:n,params:m(i),url:e}}}}function sn(e){return p(z.hash?e.hash.replace(/^#/,``).replace(/[?#].+/,``):e.pathname.slice(S.length))||`/`}function cn(e){return(z.hash?e.hash.replace(/^#/,``):e.pathname)+e.search}function ln({url:e,type:t,intent:n,delta:r,event:i,scroll:a}){let o=!1,s=Cn(W,n,e,t,a??null);r!==void 0&&(s.navigation.delta=r),i!==void 0&&(s.navigation.event=i);let c={...s.navigation,cancel:()=>{o=!0,s.reject(Error(`navigation cancelled`))}};return G||kt.forEach(e=>e(c)),o?null:s}async function Z({type:e,url:t,popped:r,keepfocus:i,noscroll:a,replace_state:s,state:c={},redirect_count:l=0,nav_token:u={},accept:f=_,block:p=_,event:m}){let h=Y;Y=u;let g=await on(t,!1),v=e===`enter`?Cn(W,g,t,e):ln({url:t,type:e,delta:r?.delta,intent:g,scroll:r?.scroll,event:m});if(!v){p(),Y===u&&(Y=h);return}let ee=q,y=J;f(),G=!0,Mt&&v.navigation.type!==`enter`&&F.navigating.set(j.current=v.navigation);let b=g&&await tn(g);if(!b){if(ke(t,S,z.hash))return await I(t,s);b=await un(t,{id:null},await $(new d(404,`Not Found`,`Not found: ${t.pathname}`),{url:t,params:{},route:{id:null}}),404,s)}if(t=g?.url||t,Y!==u){v.reject(Error(`navigation aborted`));return}if(!b)return;if(b.type===`redirect`){if(l<20){await Z({type:e,url:new URL(b.location,t),popped:r,keepfocus:i,noscroll:a,replace_state:s,state:c,redirect_count:l+1,nav_token:u}),v.fulfil(void 0);return}if(b=await rn({status:500,error:await $(Error(`Redirect loop`),{url:t,params:{},route:{id:null}}),url:t,route:{id:null}}),!b)return}else if(b.props.page.status>=400&&await F.updated.check())return await xt(),await I(t,s);if(Bt(),yt(ee),Vt(y),b.props.page.url.pathname!==t.pathname&&(t.pathname=b.props.page.url.pathname),c=r?r.state:c,!r){let e=+!s,n={[C]:q+=e,[w]:J+=e,[_e]:c};(s?history.replaceState:history.pushState).call(history,n,``,t),s||bt(q,J)}let x=g&&H?.id===g.id?H.fork:null;H?.fork&&!x?Dt():(H=null,Q={element:void 0,href:void 0}),b.props.page.state=c;let te;if(Mt){let e=(await Promise.all(Array.from(At,e=>e(v.navigation)))).filter(e=>typeof e==`function`);if(e.length>0){function t(){e.forEach(e=>{U.delete(e)})}e.push(t),e.forEach(e=>{U.add(e)})}let r=v.navigation.to;W={...b.state,nav:{params:r.params,route:r.route,url:r.url}},b.props.page&&(b.props.page.url=t),!i&&document.activeElement instanceof HTMLElement&&document.activeElement!==document.body&&document.activeElement.blur();let a=x&&await x;a?te=a.commit():(M=null,It.$set(b.props),M&&Object.assign(b.props.page,M),st(b.props.page),te=n?.()),Pt=!0}else await qt(b,wt,!1);let{activeElement:ne}=document;if(await te,await o(),await o(),Y!==u){v.reject(Error(`navigation aborted`));return}b.props.page&&M&&Object.assign(b.props.page,M);let re=null;if(Nt){let e=r?r.scroll:a?E():null;e?scrollTo(e.x,e.y):(re=t.hash&&document.getElementById(En(t)))?re.scrollIntoView():scrollTo(0,0)}let ie=document.activeElement!==ne&&document.activeElement!==document.body;!i&&!ie&&Sn(t,!re),Nt=!0,G=!1,v.fulfil(void 0),v.navigation.to&&(v.navigation.to.scroll=E()),U.forEach(e=>e(v.navigation)),e===`popstate`&&Ht(J),F.navigating.set(j.current=null)}async function un(e,t,n,r,i){return e.origin===ye&&e.pathname===location.pathname&&!jt?await rn({status:r,error:n,url:e,route:t}):await I(e,i)}var Q={element:void 0,href:void 0};function dn(){let e,t;R.addEventListener(`mousemove`,t=>{let n=t.target;clearTimeout(e),e=setTimeout(()=>{i(n,T.hover)},20)});function n(e){e.defaultPrevented||i(e.composedPath()[0],T.tap)}R.addEventListener(`mousedown`,n),R.addEventListener(`touchstart`,n,{passive:!0});let r=new IntersectionObserver(e=>{for(let t of e)t.isIntersecting&&(Kt(new URL(t.target.href)),r.unobserve(t.target))},{threshold:0});async function i(e,n){let r=Ce(e,R),i=r===Q.element&&r?.href===Q.href&&n>=t;if(!r||i)return;let{url:a,external:o,download:s}=we(r,S,z.hash);if(o||s)return;let c=Te(r),l=a&&cn(W.url)===cn(a);if(!(c.reload||l)){if(n<=c.preload_data){Q={element:r,href:r.href},t=T.tap;let e=await on(a,!1);if(!e)return;Gt(e)}else n<=c.preload_code&&(Q={element:r,href:r.href},t=n,Kt(a))}}function a(){r.disconnect();for(let e of R.querySelectorAll(`a`)){let{url:t,external:n,download:i}=we(e,S,z.hash);if(n||i)continue;let a=Te(e);a.reload||(a.preload_code===T.viewport&&r.observe(e),a.preload_code===T.eager&&Kt(t))}}U.add(a),a()}function $(e,t){if(e instanceof l)return e.body;let n=k(e),r=rt(e);return z.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function fn(e,t){ht(()=>(e.add(t),()=>{e.delete(t)}))}function pn(e){fn(U,e)}function mn(e){if(typeof e==`function`)B.push(e);else{let{href:t}=new URL(e,location.href);B.push(e=>e.href===t)}}function hn(e,t){let n={[C]:q,[w]:J,[ve]:A.url.href,[_e]:t};history.replaceState(n,``,be(e)),A.state=t,It.$set({page:_t(()=>wn(A))})}function gn(){history.scrollRestoration=`manual`,addEventListener(`beforeunload`,e=>{let t=!1;if(Ut(),!G){let e=Cn(W,void 0,null,`leave`),n={...e.navigation,cancel:()=>{t=!0,e.reject(Error(`navigation cancelled`))}};kt.forEach(e=>e(n))}t?(e.preventDefault(),e.returnValue=``):history.scrollRestoration=`auto`}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&Ut()}),navigator.connection?.saveData||dn(),R.addEventListener(`click`,async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;let n=Ce(t.composedPath()[0],R);if(!n)return;let{url:r,external:i,target:a,download:o}=we(n,S,z.hash);if(!r)return;if(a===`_parent`||a===`_top`){if(window.parent!==window)return}else if(a&&a!==`_self`)return;let s=Te(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&r.protocol!==`https:`&&r.protocol!==`http:`||o)return;let[c,l]=(z.hash?r.hash.replace(/^#/,``):r.href).split(`#`),u=c===h(location);if(i||s.reload&&(!u||!l)){ln({url:r,type:`link`,event:t})?G=!0:t.preventDefault();return}if(l!==void 0&&u){let[,i]=W.url.href.split(`#`);if(i===l){if(t.preventDefault(),l===``||l===`top`&&n.ownerDocument.getElementById(`top`)===null)scrollTo({top:0});else{let e=n.ownerDocument.getElementById(decodeURIComponent(l));e&&(e.scrollIntoView(),e.focus())}return}if(K=!0,yt(q),e(r),!s.replace_state)return;K=!1}t.preventDefault(),await new Promise(e=>{requestAnimationFrame(()=>{setTimeout(e,0)}),setTimeout(e,100)}),await Z({type:`link`,url:r,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??r.href===location.href,event:t})}),R.addEventListener(`submit`,e=>{if(e.defaultPrevented)return;let t=HTMLFormElement.prototype.cloneNode.call(e.target),n=e.submitter;if((n?.formTarget||t.target)===`_blank`||(n?.formMethod||t.method)!==`get`)return;let r=new URL(n?.hasAttribute(`formaction`)&&n?.formAction||t.action);if(ke(r,S,!1))return;let i=e.target,a=Te(i);if(a.reload)return;e.preventDefault(),e.stopPropagation();let o=new FormData(i,n);r.search=new URLSearchParams(o).toString(),Z({type:`form`,url:r,keepfocus:a.keepfocus,noscroll:a.noscroll,replace_state:a.replace_state??r.href===location.href,event:e})}),addEventListener(`popstate`,async t=>{if(!xn){if(t.state?.[`sveltekit:history`]){let n=t.state[C];if(Y={},n===q)return;let r=N[n],i=t.state[`sveltekit:states`]??{},a=new URL(t.state[`sveltekit:pageurl`]??location.href),o=t.state[w],s=W.url?h(location)===h(W.url):!1;if(o===J&&(Pt||s)){i!==A.state&&(A.state=i),e(a),N[q]=E(),r&&scrollTo(r.x,r.y),q=n;return}let c=n-q;await Z({type:`popstate`,url:a,popped:{state:i,scroll:r,delta:c},accept:()=>{q=n,J=o},block:()=>{history.go(-c)},nav_token:Y,event:t})}else K||(e(new URL(location.href)),z.hash&&location.reload())}}),addEventListener(`hashchange`,()=>{K&&(K=!1,history.replaceState({...history.state,[C]:++q,[w]:J},``,location.href))});for(let e of document.querySelectorAll(`link`))vt.has(e.rel)&&(e.href=e.href);addEventListener(`pageshow`,e=>{e.persisted&&F.navigating.set(j.current=null)});function e(e){W.url=A.url=e,F.page.set(wn(A)),F.page.notify()}}async function _n(e,{status:t=200,error:n,node_ids:r,params:i,route:a,server_route:o,data:s,form:c}){jt=!0;let l=new URL(location.href),d;({params:i={},route:a={id:null}}=await on(l,!1)||{}),d=St.find(({id:e})=>e===a.id);let f,p=!0;try{let e=r.map(async(t,n)=>{let r=s[n];return r?.uses&&(r.uses=bn(r.uses)),Yt({loader:z.nodes[t],url:l,params:i,route:a,parent:async()=>{let t={};for(let r=0;r<n;r+=1)Object.assign(t,(await e[r]).data);return t},server_data_node:Qt(r)})}),o=await Promise.all(e);if(d){let e=d.layouts;for(let t=0;t<e.length;t++)e[t]||o.splice(t,0,void 0)}f=await Jt({url:l,params:i,branch:o,status:t,error:n,errors:d?.errors,form:c,route:d??null})}catch(t){if(t instanceof u)return await I(new URL(t.location,location.href));f=await rn({status:k(t),error:await $(t,{url:l,params:i,route:a}),url:l,route:a}),e.textContent=``,p=!1}f&&(f.props.page&&(f.props.page.state={}),await qt(f,e,p))}async function vn(e,t){let n=new URL(e);n.pathname=ut(e.pathname),e.pathname.endsWith(`/`)&&n.searchParams.append(nt,`1`),n.searchParams.append(tt,t.map(e=>e?`1`:`0`).join(``));let r=await(0,window.fetch)(n.href,{});if(!r.ok){let e;throw r.headers.get(`content-type`)?.includes(`application/json`)?e=await r.json():r.status===404?e=`Not Found`:r.status===500&&(e=`Internal Error`),new l(r.status,e)}return new Promise((e,t)=>{yn(e,r).catch(t)})}async function yn(e,t){let n=t.body.getReader(),r=new Map;function i(e){return Qe(e,{...z.decoders,Promise:e=>new Promise((t,n)=>{r.set(e,{fulfil:t,reject:n})})})}for await(let t of mt(n)){if(t.type===`redirect`)return e(t);if(t.type===`data`)t.nodes?.forEach(e=>{e?.type===`data`&&(e.uses=bn(e.uses),e.data=i(e.data))}),e(t);else if(t.type===`chunk`){let{id:e,data:n,error:a}=t,o=r.get(e);r.delete(e),a?o.reject(i(a)):o.fulfil(i(n))}}}function bn(e){return{dependencies:new Set(e?.dependencies??[]),params:new Set(e?.params??[]),parent:!!e?.parent,route:!!e?.route,url:!!e?.url,search_params:new Set(e?.search_params??[])}}var xn=!1;function Sn(e,t=!0){let n=document.querySelector(`[autofocus]`);if(n)n.focus();else{let n=En(e);if(n&&document.getElementById(n)){let{x:r,y:i}=E();setTimeout(()=>{let a=history.state;xn=!0,location.replace(new URL(`#${n}`,location.href)),history.replaceState(a,``,e),t&&scrollTo(r,i),xn=!1})}else{let e=document.body,t=e.getAttribute(`tabindex`);e.tabIndex=-1,e.focus({preventScroll:!0,focusVisible:!1}),t===null?e.removeAttribute(`tabindex`):e.setAttribute(`tabindex`,t)}let r=getSelection();if(r&&r.type!==`None`){let e=[];for(let t=0;t<r.rangeCount;t+=1)e.push(r.getRangeAt(t));setTimeout(()=>{if(r.rangeCount===e.length){for(let t=0;t<r.rangeCount;t+=1){let n=e[t],i=r.getRangeAt(t);if(n.commonAncestorContainer!==i.commonAncestorContainer||n.startContainer!==i.startContainer||n.endContainer!==i.endContainer||n.startOffset!==i.startOffset||n.endOffset!==i.endOffset)return}r.removeAllRanges()}})}}}function Cn(e,t,n,r,i=null){let a,o,s=new Promise((e,t)=>{a=e,o=t});return s.catch(_),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:E()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:i},willUnload:!t,type:r,complete:s},fulfil:a,reject:o}}function wn(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Tn(e){let t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function En(e){let t;if(z.hash){let[,,n]=e.hash.split(`#`,3);t=n??``}else t=e.hash.slice(1);return decodeURIComponent(t)}export{A as a,j as i,hn as n,Ae as o,zt as r,pn as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{U as e}from"../nodes/2.CJRPZhbe.js";export{e as startPanelResize};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"../nodes/2.CJRPZhbe.js";export{e as stringify};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{o as e,r as t}from"../chunks/C0tWPpc3.js";export{e as load_css,t as start};
|
|
@@ -1,577 +0,0 @@
|
|
|
1
|
-
import { d as readBrowserConfig } from './insight-config.js-CaHHJpFK.js';
|
|
2
|
-
import { mkdirSync, rmSync, readdirSync } from 'node:fs';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { spawn, spawnSync } from 'node:child_process';
|
|
5
|
-
import { randomUUID } from 'node:crypto';
|
|
6
|
-
import { chromium } from 'playwright-core';
|
|
7
|
-
|
|
8
|
-
//#region src/lib/server/browser/relay.ts
|
|
9
|
-
var RelayClosedError = class extends Error {
|
|
10
|
-
constructor() {
|
|
11
|
-
super("relay is closed");
|
|
12
|
-
this.name = "RelayClosedError";
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
var BrowserRelay = class {
|
|
16
|
-
quality;
|
|
17
|
-
cdp;
|
|
18
|
-
subscribers = /* @__PURE__ */ new Set();
|
|
19
|
-
seq = 0;
|
|
20
|
-
latest = null;
|
|
21
|
-
chain = Promise.resolve();
|
|
22
|
-
started = false;
|
|
23
|
-
/** JPEG quality 0..100 — from BrowserConfig.screencastQuality
|
|
24
|
-
* (default 90; yaml `browser.screencast:` override, amendment 3). */
|
|
25
|
-
constructor(cdp, quality = 90) {
|
|
26
|
-
this.quality = quality;
|
|
27
|
-
this.cdp = cdp;
|
|
28
|
-
}
|
|
29
|
-
async start() {
|
|
30
|
-
if (!this.cdp || this.started) throw new RelayClosedError();
|
|
31
|
-
this.cdp.on("Page.screencastFrame", (ev) => {
|
|
32
|
-
this.seq += 1;
|
|
33
|
-
this.latest = {
|
|
34
|
-
seq: this.seq,
|
|
35
|
-
jpeg: ev.data,
|
|
36
|
-
metadata: ev.metadata
|
|
37
|
-
};
|
|
38
|
-
for (const sub of this.subscribers) sub(this.latest);
|
|
39
|
-
this.cdp?.send("Page.screencastFrameAck", { sessionId: ev.sessionId }).catch(() => void 0);
|
|
40
|
-
});
|
|
41
|
-
await this.cdp.send("Page.startScreencast", {
|
|
42
|
-
format: "jpeg",
|
|
43
|
-
quality: this.quality,
|
|
44
|
-
everyNthFrame: 1
|
|
45
|
-
});
|
|
46
|
-
this.started = true;
|
|
47
|
-
}
|
|
48
|
-
latestFrame() {
|
|
49
|
-
if (!this.cdp) throw new RelayClosedError();
|
|
50
|
-
return this.latest;
|
|
51
|
-
}
|
|
52
|
-
subscribe(fn) {
|
|
53
|
-
if (!this.cdp) throw new RelayClosedError();
|
|
54
|
-
this.subscribers.add(fn);
|
|
55
|
-
return () => this.subscribers.delete(fn);
|
|
56
|
-
}
|
|
57
|
-
/** Serialized dispatch — every input waits for the previous one. */
|
|
58
|
-
dispatch(input) {
|
|
59
|
-
if (!this.cdp) return Promise.reject(new RelayClosedError());
|
|
60
|
-
const run = async () => {
|
|
61
|
-
if (!this.cdp) throw new RelayClosedError();
|
|
62
|
-
if (input.kind === "mouse") await this.cdp.send("Input.dispatchMouseEvent", {
|
|
63
|
-
type: input.type,
|
|
64
|
-
x: input.x,
|
|
65
|
-
y: input.y,
|
|
66
|
-
button: input.button ?? "none",
|
|
67
|
-
clickCount: input.clickCount,
|
|
68
|
-
deltaX: input.deltaX,
|
|
69
|
-
deltaY: input.deltaY,
|
|
70
|
-
pointerType: "mouse"
|
|
71
|
-
});
|
|
72
|
-
else if (input.kind === "key") await this.cdp.send("Input.dispatchKeyEvent", {
|
|
73
|
-
type: input.type,
|
|
74
|
-
key: input.key,
|
|
75
|
-
code: input.code,
|
|
76
|
-
windowsVirtualKeyCode: input.windowsVirtualKeyCode,
|
|
77
|
-
text: input.text
|
|
78
|
-
});
|
|
79
|
-
else await this.cdp.send("Input.insertText", { text: input.text });
|
|
80
|
-
};
|
|
81
|
-
const next = this.chain.then(run, run);
|
|
82
|
-
this.chain = next.catch(() => void 0);
|
|
83
|
-
return next;
|
|
84
|
-
}
|
|
85
|
-
stop() {
|
|
86
|
-
const cdp = this.cdp;
|
|
87
|
-
this.cdp = null;
|
|
88
|
-
this.subscribers.clear();
|
|
89
|
-
this.latest = null;
|
|
90
|
-
if (cdp && this.started) cdp.send("Page.stopScreencast").catch(() => void 0);
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
|
-
Number(process.env.DSI_MCP_PORT ?? 9515);
|
|
94
|
-
/** The reaper's ONLY test — pure: a session is reaper-eligible when nobody
|
|
95
|
-
* watches its stream AND its last MCP tool traffic is older than idleMs.
|
|
96
|
-
* An active agent (traffic younger than idleMs) is NEVER eligible (D2). */
|
|
97
|
-
function reaperEligible(e, idleMs, now) {
|
|
98
|
-
if (e.streamSubscribers > 0) return false;
|
|
99
|
-
return now - e.lastMcpActivity >= idleMs;
|
|
100
|
-
}
|
|
101
|
-
var BrowserRegistryRefusal = class extends Error {
|
|
102
|
-
code;
|
|
103
|
-
constructor(code, message) {
|
|
104
|
-
super(message);
|
|
105
|
-
this.name = "BrowserRegistryRefusal";
|
|
106
|
-
this.code = code;
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
function state() {
|
|
110
|
-
const p = process;
|
|
111
|
-
if (!p.__DSI_BROWSER_STATE__) {
|
|
112
|
-
p.__DSI_BROWSER_STATE__ = {
|
|
113
|
-
entries: /* @__PURE__ */ new Map(),
|
|
114
|
-
closed: /* @__PURE__ */ new Set()
|
|
115
|
-
};
|
|
116
|
-
sweepOrphanProfiles(new Set([...p.__DSI_BROWSER_STATE__.entries.keys()].map((id) => id.slice(0, 8))));
|
|
117
|
-
}
|
|
118
|
-
return p.__DSI_BROWSER_STATE__;
|
|
119
|
-
}
|
|
120
|
-
/** Boot-time sweep of profile dirs left by sessions that died without a
|
|
121
|
-
* close (crash, kill -9, reaper miss). keep = prefixes of LIVE entries —
|
|
122
|
-
* a module hot reload re-runs state() init against a process-global map
|
|
123
|
-
* that may hold live sessions, and this sweep must never delete one. */
|
|
124
|
-
function sweepOrphanProfiles(keep) {
|
|
125
|
-
try {
|
|
126
|
-
const root = readBrowserConfig().profileRoot;
|
|
127
|
-
for (const name of readdirSync(root)) if (!keep.has(name)) rmSync(join(root, name), {
|
|
128
|
-
recursive: true,
|
|
129
|
-
force: true
|
|
130
|
-
});
|
|
131
|
-
} catch {}
|
|
132
|
-
}
|
|
133
|
-
/** The in-process brain (D7): createConnection attached to the SAME headed
|
|
134
|
-
* browser via cdpEndpoint, served over a SIBLING http listener (SSE +
|
|
135
|
-
* messages endpoints) so a streamable-http MCP client (the DSH agent) can
|
|
136
|
-
* reach it without a child process. Port = session port + 100 (9501...):
|
|
137
|
-
* unique per session, out of the debug-port range. */
|
|
138
|
-
async function startInProcessMcp(browserPort, brainPort, onTraffic) {
|
|
139
|
-
const [{ createConnection }, { StreamableHTTPServerTransport }, http] = await Promise.all([
|
|
140
|
-
import('@playwright/mcp'),
|
|
141
|
-
import('@modelcontextprotocol/sdk/server/streamableHttp.js'),
|
|
142
|
-
import('node:http')
|
|
143
|
-
]);
|
|
144
|
-
const connection = await createConnection({ browser: { cdpEndpoint: "http://127.0.0.1:" + browserPort } });
|
|
145
|
-
const transport = new StreamableHTTPServerTransport({
|
|
146
|
-
sessionIdGenerator: void 0,
|
|
147
|
-
enableJsonResponse: true
|
|
148
|
-
});
|
|
149
|
-
await connection.connect(transport);
|
|
150
|
-
const server = http.createServer(async (req, res) => {
|
|
151
|
-
if (new URL(req.url ?? "/", "http://127.0.0.1").pathname !== "/sse") {
|
|
152
|
-
res.statusCode = 404;
|
|
153
|
-
res.end();
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
onTraffic?.();
|
|
157
|
-
try {
|
|
158
|
-
await transport.handleRequest(req, res);
|
|
159
|
-
} catch {
|
|
160
|
-
if (!res.writableEnded) res.end();
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
let port;
|
|
164
|
-
try {
|
|
165
|
-
port = await listen(server, brainPort);
|
|
166
|
-
} catch {
|
|
167
|
-
let lastErr = null;
|
|
168
|
-
port = 0;
|
|
169
|
-
for (let p = brainPort + 1; p <= brainPort + 60; p++) try {
|
|
170
|
-
port = await listen(server, p);
|
|
171
|
-
break;
|
|
172
|
-
} catch (e) {
|
|
173
|
-
lastErr = e;
|
|
174
|
-
}
|
|
175
|
-
if (port === 0) throw lastErr ?? /* @__PURE__ */ new Error("no free brain port in " + brainPort + "+ range");
|
|
176
|
-
}
|
|
177
|
-
return {
|
|
178
|
-
connection,
|
|
179
|
-
httpServer: server,
|
|
180
|
-
port
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
var listen = (server, port) => new Promise((res, rej) => {
|
|
184
|
-
const onError = () => {
|
|
185
|
-
server.off("listening", onListen);
|
|
186
|
-
rej(/* @__PURE__ */ new Error("EADDRINUSE " + port));
|
|
187
|
-
};
|
|
188
|
-
const onListen = () => {
|
|
189
|
-
server.off("error", onError);
|
|
190
|
-
const a = server.address();
|
|
191
|
-
res(typeof a === "object" && a ? a.port : port);
|
|
192
|
-
};
|
|
193
|
-
server.once("error", onError);
|
|
194
|
-
server.once("listening", onListen);
|
|
195
|
-
server.listen(port, "127.0.0.1");
|
|
196
|
-
});
|
|
197
|
-
function pidOfPort(port) {
|
|
198
|
-
const p = spawnSync("lsof", [
|
|
199
|
-
"-ti",
|
|
200
|
-
"tcp:" + port,
|
|
201
|
-
"-sTCP:LISTEN"
|
|
202
|
-
], { stdio: "pipe" });
|
|
203
|
-
return p.status === 0 ? Number(p.stdout.toString().trim().split("\n")[0]) : null;
|
|
204
|
-
}
|
|
205
|
-
function portFree(port) {
|
|
206
|
-
return spawnSync("lsof", [
|
|
207
|
-
"-ti",
|
|
208
|
-
"tcp:" + port,
|
|
209
|
-
"-sTCP:LISTEN"
|
|
210
|
-
], { stdio: "pipe" }).status !== 0;
|
|
211
|
-
}
|
|
212
|
-
function freePort(preferred) {
|
|
213
|
-
if (preferred && portFree(preferred)) return preferred;
|
|
214
|
-
for (let p = 9400; p < 9500; p++) if (portFree(p)) return p;
|
|
215
|
-
throw new Error("no free debug port in 9400..9499");
|
|
216
|
-
}
|
|
217
|
-
var BrowserRegistry = class {
|
|
218
|
-
list() {
|
|
219
|
-
return [...state().entries.values()].map((e) => ({
|
|
220
|
-
id: e.id,
|
|
221
|
-
port: e.port,
|
|
222
|
-
pid: e.pid,
|
|
223
|
-
profileDir: e.profileDir,
|
|
224
|
-
createdAt: e.createdAt,
|
|
225
|
-
mcp: e.mcpChild ? "child" : e.mcpInProcess ? "in-process" : "none",
|
|
226
|
-
mcpHealth: e.mcpHealth,
|
|
227
|
-
mcpError: e.mcpError
|
|
228
|
-
}));
|
|
229
|
-
}
|
|
230
|
-
peek(id) {
|
|
231
|
-
const e = state().entries.get(id);
|
|
232
|
-
if (!e) throw new BrowserRegistryRefusal("NO_SESSION", "no such browser session");
|
|
233
|
-
return e;
|
|
234
|
-
}
|
|
235
|
-
/** The brain's live SSE URL — the ACTUAL bound port (stable 9515 in the
|
|
236
|
-
* common case, session-relative in the rare fallback). */
|
|
237
|
-
mcpBrainUrl(id) {
|
|
238
|
-
const e = this.peek(id);
|
|
239
|
-
return "http://127.0.0.1:" + (e.mcpInProcess?.port ?? e.brainPort) + "/sse";
|
|
240
|
-
}
|
|
241
|
-
/** True when the id was closed (tombstoned) — routes use it to answer
|
|
242
|
-
* 409 CLOSED instead of a misleading 404. */
|
|
243
|
-
isClosed(id) {
|
|
244
|
-
return state().closed.has(id);
|
|
245
|
-
}
|
|
246
|
-
/** Re-bind lookup (ADR-0030 D1): does this persisted id still own a live
|
|
247
|
-
* session? Pure read — never creates, never throws. */
|
|
248
|
-
findLive(id) {
|
|
249
|
-
if (!id) return false;
|
|
250
|
-
return state().entries.has(id) && !state().closed.has(id);
|
|
251
|
-
}
|
|
252
|
-
/** Reaper inputs — the routes call these so the registry never imports a
|
|
253
|
-
* route (the wiring-point rule stays one-directional). */
|
|
254
|
-
noteStreamOpen(id) {
|
|
255
|
-
const e = state().entries.get(id);
|
|
256
|
-
if (e) e.streamSubscribers += 1;
|
|
257
|
-
}
|
|
258
|
-
noteStreamClose(id) {
|
|
259
|
-
const e = state().entries.get(id);
|
|
260
|
-
if (e) e.streamSubscribers = Math.max(0, e.streamSubscribers - 1);
|
|
261
|
-
}
|
|
262
|
-
noteMcpTraffic(id) {
|
|
263
|
-
const e = state().entries.get(id);
|
|
264
|
-
if (e) e.lastMcpActivity = Date.now();
|
|
265
|
-
}
|
|
266
|
-
/** The idle reaper (ADR-0030 D2): a SAFETY NET, never the owner. A
|
|
267
|
-
* session with zero stream subscribers and no MCP tool traffic for
|
|
268
|
-
* `browser.idleMs` is closed through the SAME idempotent close(id) the
|
|
269
|
-
* panel-close click uses. Headless-default makes this a correctness
|
|
270
|
-
* requirement: an invisible browser must not outlive its last driver. */
|
|
271
|
-
ensureReaper(idleMs) {
|
|
272
|
-
const s = state();
|
|
273
|
-
if (s.reaperTimer) return;
|
|
274
|
-
s.reaperTimer = setInterval(() => {
|
|
275
|
-
const now = Date.now();
|
|
276
|
-
for (const e of state().entries.values()) {
|
|
277
|
-
if (!reaperEligible(e, idleMs, now)) continue;
|
|
278
|
-
this.close(e.id).catch(() => void 0);
|
|
279
|
-
}
|
|
280
|
-
}, Math.min(idleMs / 2, 3e4));
|
|
281
|
-
s.reaperTimer.unref?.();
|
|
282
|
-
}
|
|
283
|
-
relay(id) {
|
|
284
|
-
return this.peek(id).relay;
|
|
285
|
-
}
|
|
286
|
-
async open(options = {}) {
|
|
287
|
-
const cfg = readBrowserConfig();
|
|
288
|
-
const id = randomUUID();
|
|
289
|
-
const port = freePort(options.port);
|
|
290
|
-
const profileDir = join(cfg.profileRoot, id.slice(0, 8));
|
|
291
|
-
mkdirSync(profileDir, { recursive: true });
|
|
292
|
-
const ignoreDefaultArgs = ["--enable-automation", "--mute-audio"];
|
|
293
|
-
const launch = (useChrome) => chromium.launchPersistentContext(profileDir, {
|
|
294
|
-
...useChrome ? { channel: "chrome" } : {},
|
|
295
|
-
headless: options.headless ?? cfg.headless,
|
|
296
|
-
ignoreDefaultArgs,
|
|
297
|
-
args: [
|
|
298
|
-
"--remote-debugging-port=" + port,
|
|
299
|
-
"--no-first-run",
|
|
300
|
-
"--disable-backgrounding-occluded-windows",
|
|
301
|
-
"--disable-renderer-backgrounding",
|
|
302
|
-
"--disable-background-timer-throttling",
|
|
303
|
-
"--disable-blink-features=AutomationControlled",
|
|
304
|
-
"--autoplay-policy=no-user-gesture-required",
|
|
305
|
-
"--window-position=-32000,-32000"
|
|
306
|
-
],
|
|
307
|
-
viewport: null
|
|
308
|
-
});
|
|
309
|
-
let context;
|
|
310
|
-
try {
|
|
311
|
-
context = await launch(true);
|
|
312
|
-
} catch (chromeErr) {
|
|
313
|
-
context = await launch(false);
|
|
314
|
-
}
|
|
315
|
-
context.browser();
|
|
316
|
-
const pid = pidOfPort(port);
|
|
317
|
-
const cdp = await context.newCDPSession(context.pages()[0] ?? await context.newPage());
|
|
318
|
-
const relay = new BrowserRelay(cdp, cfg.screencastQuality);
|
|
319
|
-
await relay.start();
|
|
320
|
-
const start = options.url ?? "data:text/html,<title>Glass Browser</title><body style=\"font-family:system-ui;color:gray;display:grid;place-items:center;height:100vh;margin:0\">Glass Browser — waiting for the agent</body>";
|
|
321
|
-
await cdp.send("Page.enable").catch(() => void 0);
|
|
322
|
-
await cdp.send("Page.navigate", { url: start }).catch(() => void 0);
|
|
323
|
-
await new Promise((r) => setTimeout(r, 600));
|
|
324
|
-
const brainPort = Number(process.env.DSI_MCP_PORT ?? cfg.brainPort);
|
|
325
|
-
if (cfg.enabled) this.ensureReaper(cfg.idleMs);
|
|
326
|
-
const entry = {
|
|
327
|
-
id,
|
|
328
|
-
context,
|
|
329
|
-
cdp,
|
|
330
|
-
relay,
|
|
331
|
-
port,
|
|
332
|
-
pid,
|
|
333
|
-
profileDir,
|
|
334
|
-
brainPort,
|
|
335
|
-
streamSubscribers: 0,
|
|
336
|
-
lastMcpActivity: Date.now(),
|
|
337
|
-
mcpChild: null,
|
|
338
|
-
mcpInProcess: null,
|
|
339
|
-
mcpHealth: "up",
|
|
340
|
-
mcpError: null,
|
|
341
|
-
closed: false,
|
|
342
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
343
|
-
};
|
|
344
|
-
state().entries.set(id, entry);
|
|
345
|
-
if (options.spawnMcp ?? true) {
|
|
346
|
-
if (process.env.DSI_MCP_IN_PROCESS === "1") try {
|
|
347
|
-
entry.mcpInProcess = await startInProcessMcp(entry.port, brainPort, () => {
|
|
348
|
-
entry.lastMcpActivity = Date.now();
|
|
349
|
-
});
|
|
350
|
-
} catch (e) {
|
|
351
|
-
entry.mcpHealth = "down";
|
|
352
|
-
entry.mcpError = e.message;
|
|
353
|
-
}
|
|
354
|
-
else this.spawnMcpChild(entry, cfg.mcpPin);
|
|
355
|
-
}
|
|
356
|
-
return {
|
|
357
|
-
id,
|
|
358
|
-
port,
|
|
359
|
-
pid,
|
|
360
|
-
profileDir,
|
|
361
|
-
createdAt: entry.createdAt,
|
|
362
|
-
mcp: entry.mcpChild ? "child" : entry.mcpInProcess ? "in-process" : "none",
|
|
363
|
-
mcpHealth: entry.mcpHealth,
|
|
364
|
-
mcpError: entry.mcpError
|
|
365
|
-
};
|
|
366
|
-
}
|
|
367
|
-
/** Wave 3 (3.1) owns the real arg matrix; Wave 1 wires the spawn so close
|
|
368
|
-
* ordering (mcp child → cdp → browser) is pinned from day one. */
|
|
369
|
-
spawnMcpChild(entry, mcpPin) {
|
|
370
|
-
const child = spawn("npx", [
|
|
371
|
-
"@playwright/mcp@" + mcpPin,
|
|
372
|
-
"--cdp-endpoint",
|
|
373
|
-
"http://127.0.0.1:" + entry.port
|
|
374
|
-
], {
|
|
375
|
-
stdio: "ignore",
|
|
376
|
-
detached: false
|
|
377
|
-
});
|
|
378
|
-
entry.mcpChild = child;
|
|
379
|
-
child.on("error", (e) => {
|
|
380
|
-
entry.mcpHealth = "down";
|
|
381
|
-
entry.mcpError = String(e);
|
|
382
|
-
});
|
|
383
|
-
child.on("exit", (code) => {
|
|
384
|
-
if (entry.mcpChild === child) {
|
|
385
|
-
entry.mcpHealth = "down";
|
|
386
|
-
entry.mcpError = "mcp child exited code " + code;
|
|
387
|
-
}
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
/** D8 owner-release. Idempotent: closing a closed id resolves cleanly. */
|
|
391
|
-
async close(id) {
|
|
392
|
-
const entry = state().entries.get(id);
|
|
393
|
-
if (!entry) return {
|
|
394
|
-
ok: true,
|
|
395
|
-
alreadyClosed: true
|
|
396
|
-
};
|
|
397
|
-
if (entry.closed) {
|
|
398
|
-
state().entries.delete(id);
|
|
399
|
-
return {
|
|
400
|
-
ok: true,
|
|
401
|
-
alreadyClosed: true
|
|
402
|
-
};
|
|
403
|
-
}
|
|
404
|
-
entry.closed = true;
|
|
405
|
-
state().closed.add(id);
|
|
406
|
-
if (state().closed.size > 256) state().closed.delete(state().closed.values().next().value);
|
|
407
|
-
const errs = [];
|
|
408
|
-
if (entry.mcpInProcess) try {
|
|
409
|
-
const brain = entry.mcpInProcess;
|
|
410
|
-
await new Promise((res) => {
|
|
411
|
-
brain.httpServer?.closeAllConnections?.();
|
|
412
|
-
brain.httpServer?.close?.(() => res());
|
|
413
|
-
setTimeout(res, 2e3);
|
|
414
|
-
});
|
|
415
|
-
await brain.connection?.close?.();
|
|
416
|
-
entry.mcpInProcess = null;
|
|
417
|
-
} catch (e) {
|
|
418
|
-
errs.push(e);
|
|
419
|
-
}
|
|
420
|
-
if (entry.mcpChild?.pid) try {
|
|
421
|
-
entry.mcpChild.kill("SIGTERM");
|
|
422
|
-
} catch (e) {
|
|
423
|
-
errs.push(e);
|
|
424
|
-
}
|
|
425
|
-
try {
|
|
426
|
-
entry.relay.stop();
|
|
427
|
-
} catch (e) {
|
|
428
|
-
errs.push(e);
|
|
429
|
-
}
|
|
430
|
-
try {
|
|
431
|
-
await entry.context.close();
|
|
432
|
-
} catch (e) {
|
|
433
|
-
errs.push(e);
|
|
434
|
-
}
|
|
435
|
-
try {
|
|
436
|
-
rmSync(entry.profileDir, {
|
|
437
|
-
recursive: true,
|
|
438
|
-
force: true
|
|
439
|
-
});
|
|
440
|
-
} catch (e) {
|
|
441
|
-
errs.push(e);
|
|
442
|
-
}
|
|
443
|
-
state().entries.delete(id);
|
|
444
|
-
return {
|
|
445
|
-
ok: errs.length === 0,
|
|
446
|
-
alreadyClosed: false
|
|
447
|
-
};
|
|
448
|
-
}
|
|
449
|
-
/** Wait for the page's next load event, capped — the navigate idiom
|
|
450
|
-
* (a send races the context teardown otherwise) shared by reload and
|
|
451
|
-
* history travel (ADR-0031 D3/D4). */
|
|
452
|
-
async waitLoad(e, capMs = 3e3) {
|
|
453
|
-
await new Promise((res) => {
|
|
454
|
-
const on = (p) => {
|
|
455
|
-
e.cdp.off("Page.loadEventFired", on);
|
|
456
|
-
res();
|
|
457
|
-
};
|
|
458
|
-
e.cdp.on("Page.loadEventFired", on);
|
|
459
|
-
setTimeout(res, capMs);
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
|
-
/** Navigate the session's active page — public because causing page
|
|
463
|
-
* damage is the only reliable way to make screencast emit a frame. */
|
|
464
|
-
async navigate(id, url, opts) {
|
|
465
|
-
const e = this.peek(id);
|
|
466
|
-
await e.cdp.send("Page.enable").catch(() => void 0);
|
|
467
|
-
if (opts?.waitLoad) {
|
|
468
|
-
const loaded = this.waitLoad(e);
|
|
469
|
-
await e.cdp.send("Page.navigate", { url });
|
|
470
|
-
await loaded;
|
|
471
|
-
return;
|
|
472
|
-
}
|
|
473
|
-
await e.cdp.send("Page.navigate", { url });
|
|
474
|
-
}
|
|
475
|
-
/** Match the page viewport to the panel's glass box (ADR-0031
|
|
476
|
-
* amendment 2): the screencast frame then equals the panel size, so
|
|
477
|
-
* the mirror shows content at native scale instead of zooming a
|
|
478
|
-
* fixed default viewport. CDP-side clamps keep hostile sizes out. */
|
|
479
|
-
async setViewport(id, width, height) {
|
|
480
|
-
const w = Math.max(200, Math.min(8192, Math.round(width)));
|
|
481
|
-
const h = Math.max(120, Math.min(8192, Math.round(height)));
|
|
482
|
-
const e = this.peek(id);
|
|
483
|
-
await e.cdp.send("Page.enable").catch(() => void 0);
|
|
484
|
-
await e.cdp.send("Emulation.setDeviceMetricsOverride", {
|
|
485
|
-
width: w,
|
|
486
|
-
height: h,
|
|
487
|
-
deviceScaleFactor: 0,
|
|
488
|
-
mobile: false
|
|
489
|
-
});
|
|
490
|
-
}
|
|
491
|
-
/** The history position (ADR-0031): every proxy-verb answer carries it
|
|
492
|
-
* so the header's back/forward buttons stay honest at the ends. */
|
|
493
|
-
async navInfo(id) {
|
|
494
|
-
const e = this.peek(id);
|
|
495
|
-
await e.cdp.send("Page.enable").catch(() => void 0);
|
|
496
|
-
const hist = await e.cdp.send("Page.getNavigationHistory", {});
|
|
497
|
-
return {
|
|
498
|
-
currentIndex: hist.currentIndex,
|
|
499
|
-
entryCount: hist.entries.length
|
|
500
|
-
};
|
|
501
|
-
}
|
|
502
|
-
/** Reload the session's active page (ADR-0031 D4): Page.reload keeps
|
|
503
|
-
* the history entry, unlike re-navigating the current URL. */
|
|
504
|
-
async reload(id) {
|
|
505
|
-
const e = this.peek(id);
|
|
506
|
-
await e.cdp.send("Page.enable").catch(() => void 0);
|
|
507
|
-
const loaded = this.waitLoad(e);
|
|
508
|
-
await e.cdp.send("Page.reload", {});
|
|
509
|
-
await loaded;
|
|
510
|
-
return this.pageInfo(id);
|
|
511
|
-
}
|
|
512
|
-
/** Travel the browser's OWN back/forward list (ADR-0031 D3):
|
|
513
|
-
* Page.getNavigationHistory picks the entry, Page.navigateToHistoryEntry
|
|
514
|
-
* is the browser's travel verb — never Runtime.evaluate('history.back()'),
|
|
515
|
-
* which races the teardown and lies about the browser-level list.
|
|
516
|
-
* Bounds refusals keep the header buttons honest at the list ends. */
|
|
517
|
-
async pageHistory(id, dir) {
|
|
518
|
-
const e = this.peek(id);
|
|
519
|
-
await e.cdp.send("Page.enable").catch(() => void 0);
|
|
520
|
-
const hist = await e.cdp.send("Page.getNavigationHistory", {});
|
|
521
|
-
const target = dir === "back" ? hist.currentIndex - 1 : hist.currentIndex + 1;
|
|
522
|
-
if (target < 0 || target >= hist.entries.length) throw new BrowserRegistryRefusal("CLOSED", "HISTORY_END — cannot go " + dir + " from index " + hist.currentIndex + " of " + hist.entries.length);
|
|
523
|
-
const loaded = this.waitLoad(e);
|
|
524
|
-
await e.cdp.send("Page.navigateToHistoryEntry", { entryId: hist.entries[target].id });
|
|
525
|
-
await loaded;
|
|
526
|
-
return {
|
|
527
|
-
...await this.pageInfo(id),
|
|
528
|
-
currentIndex: target,
|
|
529
|
-
entryCount: hist.entries.length
|
|
530
|
-
};
|
|
531
|
-
}
|
|
532
|
-
/** Race an evaluate against a cap — a hung evaluate must never wedge a
|
|
533
|
-
* route (the navigate-hang finding, spec W2 2.3 debugging). */
|
|
534
|
-
async evaluateCapped(cdp, expr, capMs = 3e3) {
|
|
535
|
-
let timer;
|
|
536
|
-
const cap = new Promise((res) => {
|
|
537
|
-
timer = setTimeout(() => res(null), capMs);
|
|
538
|
-
});
|
|
539
|
-
try {
|
|
540
|
-
const res = await Promise.race([cdp.send("Runtime.evaluate", {
|
|
541
|
-
expression: expr,
|
|
542
|
-
returnByValue: true
|
|
543
|
-
}), cap]);
|
|
544
|
-
return res ? String(res.result?.value ?? "") : null;
|
|
545
|
-
} finally {
|
|
546
|
-
if (timer) clearTimeout(timer);
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
/** The active page's url + title + inner viewport — the status strip's
|
|
550
|
-
* location read, the e2e's DOM-truth channel (the glass proves clicks
|
|
551
|
-
* by effects the page itself reports), and the viewport-follow witness
|
|
552
|
-
* (innerWidth/innerHeight prove the emulation landed, amend 2). */
|
|
553
|
-
async pageInfo(id) {
|
|
554
|
-
const e = this.peek(id);
|
|
555
|
-
const raw = await this.evaluateCapped(e.cdp, "JSON.stringify({ url: location.href, title: document.title, dpr: window.devicePixelRatio, innerWidth: window.innerWidth, innerHeight: window.innerHeight, playerError: (document.querySelector(\".ytp-error-content-wrap-reason, .ytp-error-content, [role=alert]\")?.textContent || \"\").trim() || null, mediaErrorCode: (document.querySelector(\"video\")?.error?.code) ?? null })", 3e3);
|
|
556
|
-
if (raw === null) return {
|
|
557
|
-
url: "(busy)",
|
|
558
|
-
title: "(busy)",
|
|
559
|
-
dpr: 1,
|
|
560
|
-
innerWidth: 0,
|
|
561
|
-
innerHeight: 0,
|
|
562
|
-
playerError: null,
|
|
563
|
-
mediaErrorCode: null
|
|
564
|
-
};
|
|
565
|
-
return JSON.parse(raw);
|
|
566
|
-
}
|
|
567
|
-
dispatch(id, input) {
|
|
568
|
-
if (!state().entries.has(id) && state().closed.has(id)) throw new BrowserRegistryRefusal("CLOSED", "session was closed");
|
|
569
|
-
const e = this.peek(id);
|
|
570
|
-
if (e.closed) throw new BrowserRegistryRefusal("CLOSED", "session is closing");
|
|
571
|
-
return e.relay.dispatch(input);
|
|
572
|
-
}
|
|
573
|
-
};
|
|
574
|
-
var browserRegistry = new BrowserRegistry();
|
|
575
|
-
|
|
576
|
-
export { BrowserRegistryRefusal as B, browserRegistry as b };
|
|
577
|
-
//# sourceMappingURL=registry.js-BTiJ1Kaj.js.map
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
const index = 1;
|
|
2
|
-
let component_cache;
|
|
3
|
-
const component = async () => component_cache ??= (await import('../entries/pages/_error.svelte.js-BRyCyR0c.js')).default;
|
|
4
|
-
const imports = ["_app/immutable/nodes/1.UuScj-IS.js","_app/immutable/chunks/cHj8EuyS.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/CJ1fzlPC.js","_app/immutable/chunks/C0tWPpc3.js","_app/immutable/chunks/D-Rolhzs.js"];
|
|
5
|
-
const stylesheets = [];
|
|
6
|
-
const fonts = [];
|
|
7
|
-
|
|
8
|
-
export { component, fonts, imports, index, stylesheets };
|
|
9
|
-
//# sourceMappingURL=1.js-Q6zZupRG.js.map
|
|
File without changes
|