wire-mesh 3.6.18 → 3.6.19

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.
@@ -82,4 +82,4 @@ ${Vg.repeat(a.depth)}}`:a.close=`}`;break}case W.TAG:o+=String(c),o+=Wg(W.POS_IN
82
82
 
83
83
  Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){a(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}if(e.metadataRegistry.get(n[0])?.id){a(n);continue}if(r.cycle){a(n);continue}r.count>1&&e.reused===`ref`&&a(n)}e.external&&(e.sharedDefsExtractedFor=e.external)}function BC(e){let t=e.anyOf;if(!Array.isArray(t)||t.length===0||e.type!==void 0)return;let n=[];for(let e of t){if(!e||typeof e!=`object`)return;BC(e);let t=Object.keys(e);if(t.length!==1||t[0]!==`type`)return;let r=e.type;for(let e of Array.isArray(r)?r:[r]){if(typeof e!=`string`)return;n.includes(e)||n.push(e)}}delete e.anyOf,e.type=n.length===1?n[0]:n}var VC=new Set([`type`,`properties`,`required`,`additionalProperties`]),HC=[`oneOf`,`anyOf`];function UC(e){let t=e.additionalProperties;return t===void 0||t===!1||typeof t!=`object`||!t?null:Object.keys(t).length?t:null}function WC(e){let t=[];for(let n of e){if(typeof n!=`object`||n.type!==`object`)return null;for(let e in n)if(!VC.has(e))return null;t.push(n)}let n={},r=new Set;for(let e of t){for(let r in e.properties){if(Object.prototype.hasOwnProperty.call(n,r))continue;let e=[];for(let n of t){let t=n.properties?.[r]??UC(n);t!=null&&(e.some(e=>JSON.stringify(e)===JSON.stringify(t))||e.push(t))}P_(n,r,e.length===1?e[0]:WC(e)??{allOf:e})}for(let t of e.required??[])r.add(t)}let i={type:`object`,properties:n};if(r.size&&(i.required=[...r]),t.every(e=>e.additionalProperties===!1))i.additionalProperties=!1;else{let e=[];for(let n of t){let t=UC(n);t&&!e.some(e=>JSON.stringify(e)===JSON.stringify(t))&&e.push(t)}e.length===1?i.additionalProperties=e[0]:e.length>1&&(i.additionalProperties={allOf:e})}return i}function GC(e){let t=e.allOf;if(!Array.isArray(t)||t.length<2)return;for(let t of VC)if(t in e)return;let n=t.filter(e=>HC.some(t=>Array.isArray(e[t]))),r=null;if(!n.length)r=WC(t);else{let e=n[0],i=HC.find(t=>Array.isArray(e[t]));if(Object.keys(e).length!==1)return;let a=t.filter(t=>t!==e),o=e[i].map(e=>WC([...a,e]));if(o.some(e=>!e))return;r={[i]:o}}r&&(delete e.allOf,PC(e,r))}function KC(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):PC(i,s),PC(i,a),t._zod.parent===o)for(let e in i)e!==`$ref`&&e!==`allOf`&&(e in a||delete i[e]);if(s.$ref&&n.def)for(let e in i)e!==`$ref`&&e!==`allOf`&&e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e!==`$ref`&&e!==`allOf`&&e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};if(!e.external||e.sharedEmitDoneFor!==e.external){for(let t of[...e.seen.entries()].reverse())r(t[0]);if(e.target!==`openapi-3.0`)for(let t of e.seen.entries())BC(t[1].def??t[1].schema);for(let t of e.deferred)t();if(e.intersections.length){let t=new Map;for(let n of e.seen.values())for(let e of[n.schema,n.def]){let n=e?.allOf;if(!Array.isArray(n))continue;let r=t.get(n);r?r.push(e):t.set(n,[e])}for(let n of e.intersections)for(let e of t.get(n)??[])GC(e)}}let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}PC(i,n.defId?n.schema:n.def??n.schema);let a=e.metadataRegistry.get(t)?.id;a!==void 0&&i.id===a&&delete i.id;let o=e.external?.defs??{};if(!e.external||e.sharedEmitDoneFor!==e.external)for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(e.def.id===e.defId&&delete e.def.id,P_(o,e.defId,e.def))}e.external&&(e.sharedEmitDoneFor=e.external),e.external||Object.keys(o).length>0&&(e.target===`draft-2020-12`?i.$defs=o:i.definitions=o);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,"~standard",{value:{...t[`~standard`],jsonSchema:{input:YC(t,`input`,e.processors),output:YC(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function qC(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return qC(r.element,n);if(r.type===`set`)return qC(r.valueType,n);if(r.type===`lazy`)return qC(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type==="default"||r.type===`prefault`||r.type===`catch`)return qC(r.innerType,n);if(r.type===`intersection`)return qC(r.left,n)||qC(r.right,n);if(r.type===`record`||r.type===`map`)return qC(r.keyType,n)||qC(r.valueType,n);if(r.type===`pipe`)return e._zod.traits.has(`$ZodCodec`)?!0:qC(r.in,n)||qC(r.out,n);if(r.type===`object`){for(let e in r.shape)if(qC(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(qC(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(qC(e,n))return!0;return!!(r.rest&&qC(r.rest,n))}return!1}var JC=(e,t={})=>n=>{let r=FC({...n,processors:t});return LC(e,r),zC(r,e),KC(r,e)},YC=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=FC({...i??{},target:a,io:t,processors:n});return LC(e,o),zC(o,e),KC(o,e)},XC=(e,t,n)=>{(e[t]===void 0||n>e[t])&&(e[t]=n)},ZC=(e,t,n)=>{(e[t]===void 0||n<e[t])&&(e[t]=n)},QC=(e,t)=>{XC(e,`minimum`,t),ZC(e,`maximum`,t)},$C=(e,t)=>{e.multipleOf??=[],e.multipleOf.includes(t)||e.multipleOf.push(t)},ew=(e,t)=>{e.patterns??=new Set,e.patterns.add(t)},tw=(e,t)=>{e.mime=e.mime?e.mime.filter(e=>t.includes(e)):[...t]},nw=(e,t)=>{e.format=t,t.includes(`int`)&&(e.isInt=!0)},rw=(e,t)=>XC(e,`minimum`,t.minimum),iw=(e,t)=>ZC(e,`maximum`,t.maximum),aw=e=>(t,n)=>{nw(t,n.format);let[r,i]=e[n.format];XC(t,`minimum`,r),ZC(t,`maximum`,i)},ow={greater_than:(e,t)=>XC(e,t.inclusive?`minimum`:`exclusiveMinimum`,t.value),less_than:(e,t)=>ZC(e,t.inclusive?`maximum`:`exclusiveMaximum`,t.value),multiple_of:(e,t)=>$C(e,t.value),number_format:aw(ev),bigint_format:aw(tv),min_length:rw,max_length:iw,length_equals:(e,t)=>QC(e,t.length),min_size:rw,max_size:iw,size_equals:(e,t)=>QC(e,t.size),string_format:(e,t)=>{nw(e,t.format),t.pattern&&ew(e,t.pattern),(t.format===`base64`||t.format===`base64url`)&&(e.contentEncoding=t.format),(t.local||t.precision===-1)&&(e.laxFormat=!0)},mime_type:(e,t)=>tw(e,t.mime)};function sw(e){let t={},n=e._zod.def,r=e._zod.traits.has(`$ZodCheck`)?[e,...n.checks??[]]:n.checks??[];for(let e of r)ow[e._zod.def.check]?.(t,e._zod.def);let i=e._zod.bag;i.minimum!==void 0&&XC(t,`minimum`,i.minimum),i.exclusiveMinimum!==void 0&&XC(t,`exclusiveMinimum`,i.exclusiveMinimum),i.maximum!==void 0&&ZC(t,`maximum`,i.maximum),i.exclusiveMaximum!==void 0&&ZC(t,`exclusiveMaximum`,i.exclusiveMaximum),i.multipleOf!==void 0&&$C(t,i.multipleOf),i.format!==void 0&&(t.format??=i.format,i.format.includes(`int`)&&(t.isInt=!0)),i.mime&&tw(t,i.mime);for(let e of i.patterns??[])ew(t,e);return t}var cw={guid:`uuid`,url:`uri`,datetime:`date-time`,json_string:`json-string`,regex:``},lw=new Map([[rx,Iy],[ax,Ly]]),uw=e=>lw.get(e)??e,dw=(e,t,n,r)=>{let i=n;i.type=`string`;let{minimum:a,maximum:o,format:s,patterns:c,contentEncoding:l,laxFormat:u}=sw(e);if(typeof a==`number`&&(i.minLength=a),typeof o==`number`&&(i.maxLength=o),s&&(i.format=cw[s]??s,i.format===``&&delete i.format,(s===`time`||u)&&delete i.format),l&&(i.contentEncoding=l),c&&c.size>0){let e=[...c].map(uw);e.length===1?i.pattern=e[0].source:e.length>1&&(i.allOf=[...e.map(e=>({...t.target===`draft-07`||t.target===`draft-04`||t.target===`openapi-3.0`?{type:`string`}:{},pattern:e.source}))])}},fw=(e,t,n,r)=>{let i=n,{minimum:a,maximum:o,multipleOf:s,exclusiveMaximum:c,exclusiveMinimum:l,isInt:u}=sw(e);i.type=u?`integer`:`number`;let d=typeof l==`number`&&l>=(a??-1/0),f=typeof c==`number`&&c<=(o??1/0),p=t.target===`draft-04`||t.target===`openapi-3.0`;if(d?p?(i.minimum=l,i.exclusiveMinimum=!0):i.exclusiveMinimum=l:typeof a==`number`&&(i.minimum=a),f?p?(i.maximum=c,i.exclusiveMaximum=!0):i.exclusiveMaximum=c:typeof o==`number`&&(i.maximum=o),s){let n=new Set;for(let a of s)Number.isFinite(a)&&a!==0?n.add(Math.abs(a)):IC(e,t,i,r,`A multipleOf divisor of ${a} cannot be represented in JSON Schema`);let[a,...o]=n;a!==void 0&&(i.multipleOf=a),o.length&&(i.allOf=[...i.allOf??[],...o.map(e=>({multipleOf:e}))])}},pw=(e,t,n,r)=>{n.type=`boolean`},mw=(e,t,n,r)=>{t.target===`openapi-3.0`?(n.type=`string`,n.nullable=!0,n.enum=[null]):n.type=`null`},hw=(e,t,n,r)=>{n.not={}},gw=(e,t,n,r)=>{let i=e._zod.def,a=w_(i.entries);if(a.length===0){n.not={};return}a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},_w=(e,t,n,r)=>{let i=e._zod.def;if(i.values.length===0){n.not={};return}let a=[];for(let o of i.values)if(o===void 0){if(IC(e,t,n,r,"Literal `undefined` cannot be represented in JSON Schema"))return}else if(typeof o==`bigint`){if(IC(e,t,n,r,`BigInt literals cannot be represented in JSON Schema`))return;a.push(Number(o))}else a.push(o);if(a.length!==0){if(a.length===1){let e=a[0];n.type=e===null?`null`:typeof e,t.target===`draft-04`||t.target===`openapi-3.0`?n.enum=[e]:n.const=e}else a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),a.every(e=>typeof e==`boolean`)&&(n.type=`boolean`),a.every(e=>e===null)&&(n.type=`null`),n.enum=a}},vw=(e,t,n,r)=>{IC(e,t,n,r,`Custom types cannot be represented in JSON Schema`)},yw=(e,t,n,r)=>{IC(e,t,n,r,`Transforms cannot be represented in JSON Schema`)},bw=(e,t,n,r)=>{let i=n,a=e._zod.def,{minimum:o,maximum:s}=sw(e);typeof o==`number`&&(i.minItems=o),typeof s==`number`&&(i.maxItems=s),i.type=`array`,i.items=LC(a.element,t,{...r,path:[...r.path,`items`]})};function xw(e){let t=e._zod.def;return t.type===`pipe`&&t.in._zod.traits.has(`$ZodTransform`)?xw(t.out):t.type===`catch`?xw(t.innerType):e._zod.optin}var Sw=(e,t,n,r)=>{let i=n,a=e._zod.def,o=a.shape;if(Object.getOwnPropertySymbols(o).length&&IC(e,t,i,r,`Symbol keys cannot be represented in JSON Schema`))return;i.type=`object`,i.properties={};for(let e in o)P_(i.properties,e,LC(o[e],t,{...r,path:[...r.path,`properties`,e]}));let s=[];for(let e of Object.keys(o)){let n=a.shape[e];(t.io===`input`?xw(n)===void 0:n._zod.optout===void 0)&&s.push(e)}s.length>0&&(i.required=s),a.catchall?._zod.def.type===`never`?i.additionalProperties=!1:a.catchall?a.catchall&&(i.additionalProperties=LC(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},Cw=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>LC(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},ww=(e,t,n,r)=>{let i=e._zod.def,a=LC(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=LC(i.right,t,{...r,path:[...r.path,`allOf`,1]}),s=e=>`allOf`in e&&Object.keys(e).length===1,c=[...s(a)?a.allOf:[a],...s(o)?o.allOf:[o]];n.allOf=c,t.intersections.push(c)},Tw=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`array`;let o=t.target===`draft-2020-12`?`prefixItems`:`items`,s=t.target===`draft-2020-12`||t.target===`openapi-3.0`?`items`:`additionalItems`,c=a.items.map((e,n)=>LC(e,t,{...r,path:[...r.path,o,n]})),l=a.rest?LC(a.rest,t,{...r,path:[...r.path,s,...t.target===`openapi-3.0`?[a.items.length]:[]]}):null,u=a.items.length;for(;u>0;){let e=a.items[u-1];if(!(t.io===`input`?xw(e)!==void 0:e._zod.optout===`optional`))break;u--}let d=a.items.length,f=!a.rest;t.target===`draft-2020-12`?(i.prefixItems=c,f?i.items=!1:l&&(i.items=l),u>0&&(i.minItems=u),f&&(i.maxItems=d)):t.target===`openapi-3.0`?(i.items={anyOf:c},l&&i.items.anyOf.push(l),u>0&&(i.minItems=u),f&&(i.maxItems=d)):(i.items=c,f?i.additionalItems=!1:l&&(i.additionalItems=l),u>0&&(i.minItems=u),f&&(i.maxItems=d));let{minimum:p,maximum:m}=sw(e);typeof p==`number`&&(i.minItems=p),typeof m==`number`&&(i.maxItems=m)};function Ew(e,t,n){if(t.$ref){if(n.has(t))return t;n.add(t);let r=e.get(t)?.def;if(!r)return t;let i=Ew(e,r,n);return i===r?t:i}for(let r of[`anyOf`,`oneOf`]){let i=t[r];if(!Array.isArray(i))continue;let a=i.map(t=>Ew(e,t,n));a.some((e,t)=>e!==i[t])&&(t={...t,[r]:a})}let r=Array.isArray(t.type)?t.type:[t.type],i=!r.includes(`string`)&&r.some(e=>e===`number`||e===`integer`),a=t.enum??(t.const===void 0?void 0:[t.const]);if(!i&&!a?.some(e=>typeof e==`number`))return t;let{minimum:o,maximum:s,exclusiveMinimum:c,exclusiveMaximum:l,multipleOf:u,format:d,id:f,...p}=t;return p.enum?p.enum=p.enum.map(e=>typeof e==`number`?String(e):e):typeof p.const==`number`&&(p.const=String(p.const)),i?(p.type=`string`,a||(p.pattern=(r.includes(`number`)?Jy:qy).source),p):p}var Dw=new WeakMap;function Ow(e){let t=new Map;for(let n of e.seen.values())n.def&&!t.has(n.schema)&&t.set(n.schema,n);let n=new Map;for(let r of Dw.get(e)??[]){let i=e.seen.get(r),a=(i?.def??i?.schema)?.propertyNames;if(!a||a===!0||n.has(a))continue;let o=Ew(t,a,new Set);o!==a&&n.set(a,o)}if(n.size)for(let t of e.seen.values())for(let e of[t.schema,t.def]){let t=e&&n.get(e.propertyNames);t&&(e.propertyNames=t)}}var kw=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`;let o=a.keyType,s=sw(o).patterns;if(a.mode===`loose`&&s&&s.size>0){let e=LC(a.valueType,t,{...r,path:[...r.path,`patternProperties`,`*`]});i.patternProperties={};for(let t of s)P_(i.patternProperties,uw(t).source,e)}else{if(t.target===`draft-07`||t.target===`draft-2020-12`){i.propertyNames=LC(a.keyType,t,{...r,path:[...r.path,`propertyNames`]});let n=Dw.get(t);n||(n=[],Dw.set(t,n),t.deferred.push(()=>Ow(t))),n.push(e)}i.additionalProperties=LC(a.valueType,t,{...r,path:[...r.path,`additionalProperties`]})}let c=o._zod.values,l=t.io===`input`&&xw(a.valueType)!==void 0;if(c&&!a.partial&&!l){let e=[...c].filter(e=>typeof e==`string`||typeof e==`number`);e.length>0&&(i.required=e.map(String))}},Aw=(e,t,n,r)=>{let i=e._zod.def,a=LC(i.innerType,t,r),o=t.seen.get(e);t.target===`openapi-3.0`?(o.ref=i.innerType,n.nullable=!0):n.anyOf=[a,{type:`null`}]},jw=(e,t,n,r)=>{let i=e._zod.def;LC(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},Mw=Symbol();function Nw(e,t,n,r,i){let a=!1,o=JSON.stringify(e,(e,t)=>typeof t==`bigint`?(a=!0,null):t);return a?(IC(t,n,r,i,`BigInt defaults cannot be represented in JSON Schema`),Mw):JSON.parse(o)}var Pw=(e,t,n,r)=>{let i=e._zod.def;LC(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o=Nw(i.defaultValue,e,t,n,r);o!==Mw&&(n.default=o)},Fw=(e,t,n,r)=>{let i=e._zod.def;LC(i.innerType,t,r);let a=t.seen.get(e);if(a.ref=i.innerType,t.io!==`input`)return;let o=Nw(i.defaultValue,e,t,n,r);o!==Mw&&(n._prefault=o)},Iw=(e,t,n,r)=>{let i=e._zod.def;LC(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o;try{o=i.catchValue(void 0)}catch{IC(e,t,n,r,`Dynamic catch values are not supported in JSON Schema`);return}n.default=o},Lw=(e,t,n,r)=>{let i=e._zod.def,a=i.in._zod.traits.has(`$ZodTransform`),o=t.io===`input`?a?i.out:i.in:i.out;LC(o,t,r);let s=t.seen.get(e);s.ref=o},Rw=(e,t,n,r)=>{let i=e._zod.def;LC(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},zw=(e,t,n,r)=>{let i=e._zod.def;LC(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},Bw=(e,t,n,r)=>{let i=e._zod.innerType;LC(i,t,r);let a=t.seen.get(e);a.ref=i},Vw=new WeakSet([Object.prototype,Error.prototype]);function Hw(e,t,n){Object.defineProperty(e,t,{configurable:!0,enumerable:!1,get(){let e=n(this);return Object.defineProperty(this,t,{value:e,configurable:!0,writable:!0}),e},set(e){Object.defineProperty(this,t,{value:e,configurable:!0,writable:!0})}})}var Uw=K(`ZodError`,(e,t)=>{Xv.init(e,t),e.name=`ZodError`;let n=Object.getPrototypeOf(e);Vw.has(n)||(Vw.add(n),Hw(n,`format`,e=>t=>$v(e,t)),Hw(n,`flatten`,e=>t=>Qv(e,t)),Hw(n,`addIssue`,e=>t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,E_,2)}),Hw(n,`addIssues`,e=>t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,E_,2)}),Object.defineProperty(n,"isEmpty",{configurable:!0,enumerable:!1,get(){return this.issues.length===0}}))},void 0,{Parent:Error}),Ww=ty(Uw),Gw=ny(Uw),Kw=ry(Uw),qw=ay(Uw),Jw=dy(Uw),Yw=fy(Uw),Xw=py(Uw),Zw=my(Uw),Qw=hy(Uw),$w=gy(Uw),eT=_y(Uw),tT=vy(Uw);function nT(){Hv.localeError||Uv(wS())}function rT(){Hv.memoizer||Uv({memoizer:xS()})}var iT=K(`ZodType`,(e,t)=>(nT(),xb.init(e,t),e.def=t,e.type=t.type,e),{check(...e){let t=this.def;return this.clone(V_(t,{checks:[...t.checks??[],...e.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]}),{parent:!0})},with(...e){return this.check(...e)},clone(e,t){return Z_(this,e,t)},brand(){return this},register(e,t){return e.add(this,t),this},refine(e,t){return this.check(DE(e,t))},superRefine(e,t){return this.check(OE(e,t))},overwrite(e){return this.check(wC(e))},optional(){return cE(this)},exactOptional(){return uE(this)},nullable(){return fE(this)},nullish(){return cE(fE(this))},nonoptional(e){return vE(this,e)},array(){return UT(this)},or(e){return qT([this,e])},and(e){return ZT(this,e)},transform(e){return SE(this,oE(e))},default(e){return mE(this,e)},prefault(e){return gE(this,e)},catch(e){return bE(this,e)},pipe(e){return SE(this,e)},readonly(){return wE(this)},describe(e){let t=this.clone();return OS.add(t,{description:e}),t},meta(...e){if(e.length===0)return OS.get(this);let t=this.clone();return OS.add(t,e[0]),t},isOptional(){return this.safeParse(void 0).success},isNullable(){return this.safeParse(null).success},apply(e,...t){return t.length===0?e(this):e(this,...t)},get"~standard"(){return Tv(this,`~standard`,{...wb(this),jsonSchema:{input:YC(this,`input`),output:YC(this,`output`)}})},set"~standard"(e){wv(this,`~standard`,e)},parse:function e(t,n){return Ww(this,t,n,{callee:e})},parseAsync:async function e(t,n){return await Gw(this,t,n,{callee:e})},safeParse(e,t){return Kw(this,e,t)},async safeParseAsync(e,t){return qw(this,e,t)},get spa(){return this?.safeParseAsync},set spa(e){wv(this,`spa`,e)},validate(e,t){return cy(this,e,t)},validateAsync(e,t){return uy(this,e,t)},encode:function e(t,n){return Jw(this,t,n,{callee:e})},decode:function e(t,n){return Yw(this,t,n,{callee:e})},encodeAsync:async function e(t,n){return await Xw(this,t,n,{callee:e})},decodeAsync:async function e(t,n){return await Zw(this,t,n,{callee:e})},safeEncode(e,t){return Qw(this,e,t)},safeDecode(e,t){return $w(this,e,t)},async safeEncodeAsync(e,t){return eT(this,e,t)},async safeDecodeAsync(e,t){return tT(this,e,t)},toJSONSchema(e){return JC(this,{})(e)},get description(){return OS.get(this)?.description},get _def(){return this._zod.def}}),aT=K(`_ZodString`,(e,t)=>{Tb.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>dw(e,t,n,r)},Ev({format:e=>sw(e).format??null,minLength:e=>sw(e).minimum??null,maxLength:e=>sw(e).maximum??null},{regex(...e){return this.check(_C(...e))},includes(...e){return this.check(bC(...e))},startsWith(...e){return this.check(xC(...e))},endsWith(...e){return this.check(SC(...e))},min(...e){return this.check(hC(...e))},max(...e){return this.check(mC(...e))},length(...e){return this.check(gC(...e))},nonempty(...e){return this.check(hC(1,...e))},lowercase(e){return this.check(vC(e))},uppercase(e){return this.check(yC(e))},trim(){return this.check(EC())},normalize(...e){return this.check(TC(...e))},toLowerCase(){return this.check(DC())},toUpperCase(){return this.check(OC())},slugify(){return this.check(kC())}})),oT=K(`ZodString`,(e,t)=>{Tb.init(e,t),aT.init(e,t)},{email(e){return this.check(jS(fT,e))},url(e){return this.check(LS(hT,e))},jwt(e){return this.check(QS(AT,e))},emoji(e){return this.check(RS(gT,e))},guid(e){return this.check(MS(pT,e))},uuid(e){return this.check(NS(mT,e))},uuidv4(e){return this.check(PS(mT,e))},uuidv6(e){return this.check(FS(mT,e))},uuidv7(e){return this.check(IS(mT,e))},nanoid(e){return this.check(zS(_T,e))},cuid(e){return this.check(BS(vT,e))},cuid2(e){return this.check(VS(yT,e))},ulid(e){return this.check(HS(bT,e))},base64(e){return this.check(YS(DT,e))},base64url(e){return this.check(XS(OT,e))},xid(e){return this.check(US(xT,e))},ksuid(e){return this.check(WS(ST,e))},ipv4(e){return this.check(GS(CT,e))},ipv6(e){return this.check(KS(wT,e))},cidrv4(e){return this.check(qS(TT,e))},cidrv6(e){return this.check(JS(ET,e))},e164(e){return this.check(ZS(kT,e))},datetime(e){return this.check($S(cT,e))},date(e){return this.check(eC(lT,e))},time(e){return this.check(tC(uT,e))},duration(e){return this.check(nC(dT,e))}});function q(e){return AS(oT,e)}var sT=K(`ZodStringFormat`,(e,t)=>{Eb.init(e,t),aT.init(e,t)}),cT=K(`ZodISODateTime`,(e,t)=>{Gb.init(e,t),sT.init(e,t)}),lT=K(`ZodISODate`,(e,t)=>{Kb.init(e,t),sT.init(e,t)}),uT=K(`ZodISOTime`,(e,t)=>{qb.init(e,t),sT.init(e,t)}),dT=K(`ZodISODuration`,(e,t)=>{Jb.init(e,t),sT.init(e,t)}),fT=K(`ZodEmail`,(e,t)=>{kb.init(e,t),sT.init(e,t)}),pT=K(`ZodGUID`,(e,t)=>{Db.init(e,t),sT.init(e,t)}),mT=K(`ZodUUID`,(e,t)=>{Ob.init(e,t),sT.init(e,t)}),hT=K(`ZodURL`,(e,t)=>{Lb.init(e,t),sT.init(e,t)}),gT=K(`ZodEmoji`,(e,t)=>{Rb.init(e,t),sT.init(e,t)}),_T=K(`ZodNanoID`,(e,t)=>{zb.init(e,t),sT.init(e,t)}),vT=K(`ZodCUID`,(e,t)=>{Bb.init(e,t),sT.init(e,t)}),yT=K(`ZodCUID2`,(e,t)=>{Vb.init(e,t),sT.init(e,t)}),bT=K(`ZodULID`,(e,t)=>{Hb.init(e,t),sT.init(e,t)}),xT=K(`ZodXID`,(e,t)=>{Ub.init(e,t),sT.init(e,t)}),ST=K(`ZodKSUID`,(e,t)=>{Wb.init(e,t),sT.init(e,t)}),CT=K(`ZodIPv4`,(e,t)=>{Yb.init(e,t),sT.init(e,t)}),wT=K(`ZodIPv6`,(e,t)=>{Qb.init(e,t),sT.init(e,t)}),TT=K(`ZodCIDRv4`,(e,t)=>{$b.init(e,t),sT.init(e,t)}),ET=K(`ZodCIDRv6`,(e,t)=>{tx.init(e,t),sT.init(e,t)}),DT=K(`ZodBase64`,(e,t)=>{ix.init(e,t),sT.init(e,t)}),OT=K(`ZodBase64URL`,(e,t)=>{sx.init(e,t),sT.init(e,t)}),kT=K(`ZodE164`,(e,t)=>{cx.init(e,t),sT.init(e,t)}),AT=K(`ZodJWT`,(e,t)=>{ux.init(e,t),sT.init(e,t)}),jT=K(`ZodNumber`,(e,t)=>{dx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>fw(e,t,n,r),e.isFinite=!0},Ev({minValue:e=>{let{minimum:t,exclusiveMinimum:n}=sw(e);return Math.max(t??-1/0,n??-1/0)},maxValue:e=>{let{maximum:t,exclusiveMaximum:n}=sw(e);return Math.min(t??1/0,n??1/0)},isInt:e=>{let{isInt:t,multipleOf:n}=sw(e);return!!t||!!n?.some(Number.isSafeInteger)},format:e=>sw(e).format??null},{gt(e,t){return this.check(dC(e,t))},gte(e,t){return this.check(fC(e,t))},min(e,t){return this.check(fC(e,t))},lt(e,t){return this.check(lC(e,t))},lte(e,t){return this.check(uC(e,t))},max(e,t){return this.check(uC(e,t))},int(e){return this.check(NT(e))},safe(e){return this.check(NT(e))},positive(e){return this.check(dC(0,e))},nonnegative(e){return this.check(fC(0,e))},negative(e){return this.check(lC(0,e))},nonpositive(e){return this.check(uC(0,e))},multipleOf(e,t){return this.check(pC(e,t))},step(e,t){return this.check(pC(e,t))},finite(){return this}}));function J(e){return rC(jT,e)}var MT=K(`ZodNumberFormat`,(e,t)=>{fx.init(e,t),jT.init(e,t)});function NT(e){return iC(MT,e)}var PT=K(`ZodBoolean`,(e,t)=>{px.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>pw(e,t,n,r)});function FT(e){return aC(PT,e)}var IT=K(`ZodNull`,(e,t)=>{mx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>mw(e,t,n,r)});function LT(e){return oC(IT,e)}var RT=K(`ZodUnknown`,(e,t)=>{hx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function zT(){return sC(RT)}var BT=K(`ZodNever`,(e,t)=>{gx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>hw(e,t,n,r)});function VT(e){return cC(BT,e)}var HT=K(`ZodArray`,(e,t)=>{rT(),bx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>bw(e,t,n,r),e.element=t.element},{min(e,t){return this.check(hC(e,t))},nonempty(e){return this.check(hC(1,e))},max(e,t){return this.check(mC(e,t))},length(e,t){return this.check(gC(e,t))},unwrap(){return this.element}});function UT(e,t){return AC(HT,e,t)}var WT=K(`ZodObject`,(e,t)=>{rT(),Ex.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Sw(e,t,n,r),Nv(e,`shape`,e=>e._zod.def.shape,!1)},{keyof(){return rE(Object.keys(this._zod.def.shape))},catchall(e){return this.clone(V_(this._zod.def,{catchall:e}))},passthrough(){return this.clone(V_(this._zod.def,{catchall:zT()}))},loose(){return this.clone(V_(this._zod.def,{catchall:zT()}))},strict(){return this.clone(V_(this._zod.def,{catchall:VT()}))},strip(){return this.clone(V_(this._zod.def,{catchall:void 0}))},extend(e){return av(this,e)},safeExtend(e){return sv(this,e)},merge(e){return cv(this,e)},pick(e){return nv(this,e)},omit(e){return iv(this,e)},partial(...e){return lv(sE,this,e[0])},exactPartial(...e){return lv(lE,this,e[0],`exactPartial`)},required(...e){return uv(_E,this,e[0])}});function Y(e,t){return new WT({type:`object`,shape:e??{},...G(t)})}function GT(e,t){return new WT({type:`object`,shape:e,catchall:VT(),...G(t)})}var KT=K(`ZodUnion`,(e,t)=>{Ox.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Cw(e,t,n,r),e.options=t.options});function qT(e,t){return new KT({type:`union`,options:e,...G(t)})}var JT=K(`ZodDiscriminatedUnion`,(e,t)=>{KT.init(e,t),Ax.init(e,t)});function YT(e,t,n){return new JT({type:`union`,options:t,discriminator:e,...G(n)})}var XT=K(`ZodIntersection`,(e,t)=>{jx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ww(e,t,n,r)});function ZT(e,t){return new XT({type:`intersection`,left:e,right:t})}var QT=K(`ZodTuple`,(e,t)=>{rT(),Px.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Tw(e,t,n,r)},{rest(e){return this.clone({...this._zod.def,rest:e})},partial(){let e=this._zod.def;if(e.checks?.length)throw Error(`.partial() cannot be used on tuple schemas containing refinements`);return this.clone({...e,items:e.items.map(e=>new sE({type:`optional`,innerType:e}))})}});function $T(e,t,n){let r=t instanceof xb;return new QT({type:`tuple`,items:e,rest:r?t:null,...G(r?n:t)})}var eE=K(`ZodRecord`,(e,t)=>{rT(),Rx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>kw(e,t,n,r),e.keyType=t.keyType,e.valueType=t.valueType});function tE(e,t,n){return!t||!t._zod?new eE({type:`record`,keyType:q(),valueType:e,...G(t)}):new eE({type:`record`,keyType:e,valueType:t,...G(n)})}var nE=K(`ZodEnum`,(e,t)=>{zx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>gw(e,t,n,r),e.enum=t.entries,e.options=[...e._zod.values];let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new nE({...t,checks:[],...G(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new nE({...t,checks:[],...G(r),entries:i})}});function rE(e,t){return new nE({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...G(t)})}var iE=K(`ZodLiteral`,(e,t)=>{Bx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>_w(e,t,n,r),e.values=new Set(t.values),Object.defineProperty(e,"value",{get(){if(t.values.length>1)throw Error("This schema contains multiple valid literal values. Use `.values` instead.");return t.values[0]}})});function X(e,t){return new iE({type:`literal`,values:Array.isArray(e)?e:[e],...G(t)})}var aE=K(`ZodTransform`,(e,t)=>{rT(),Vx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>yw(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Vv(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(Sv(r,n.value,t));else{let t=r;t.fatal&&(t.continue=!1),t.code??=`custom`,`input`in t||(t.input=n.value),t.inst??=e,n.issues.push(Sv(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function oE(e){return new aE({type:`transform`,transform:e})}var sE=K(`ZodOptional`,(e,t)=>{Ux.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>zw(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function cE(e){return new sE({type:`optional`,innerType:e})}var lE=K(`ZodExactOptional`,(e,t)=>{Wx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>zw(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function uE(e){return new lE({type:`optional`,innerType:e})}var dE=K(`ZodNullable`,(e,t)=>{Gx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Aw(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function fE(e){return new dE({type:`nullable`,innerType:e})}var pE=K(`ZodDefault`,(e,t)=>{Kx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Pw(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function mE(e,t){return new pE({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():J_(t)}})}var hE=K(`ZodPrefault`,(e,t)=>{Jx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Fw(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function gE(e,t){return new hE({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():J_(t)}})}var _E=K(`ZodNonOptional`,(e,t)=>{Yx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>jw(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function vE(e,t){return new _E({type:`nonoptional`,innerType:e,...G(t)})}var yE=K(`ZodCatch`,(e,t)=>{Qx.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Iw(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function bE(e,t){return new yE({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:Fv(t)})}var xE=K(`ZodPipe`,(e,t)=>{$x.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Lw(e,t,n,r),e.in=t.in,e.out=t.out});function SE(e,t){return new xE({type:`pipe`,in:e,out:t})}var CE=K(`ZodReadonly`,(e,t)=>{tS.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Rw(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function wE(e){return new CE({type:`readonly`,innerType:e})}var TE=K(`ZodLazy`,(e,t)=>{rS.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Bw(e,t,n,r),e.unwrap=()=>e._zod.def.getter()});function Z(e){return new TE({type:`lazy`,getter:e})}var EE=K(`ZodCustom`,(e,t)=>{iS.init(e,t),iT.init(e,t),e._zod.processJSONSchema=(t,n,r)=>vw(e,t,n,r)});function DE(e,t={}){return jC(EE,e,t)}function OE(e,t){return MC(e,t)}var kE=K(`ZodInstanceOf`,(e,t)=>{EE.init(e,t)},{properties(e,t){return this.check(CC(e,t))}});function AE(e,t={}){let n=new kE({type:`custom`,check:`custom`,fn:t=>t instanceof e,abort:!0,...G(t)});return n._zod.bag.Class=e,n._zod.check=t=>{t.value instanceof e||t.issues.push({code:`invalid_type`,expected:e.name,input:t.value,inst:n,path:[...n._zod.def.path??[]]})},n}var jE=Z(()=>AE(Uint8Array).refine(e=>e.length===16,{message:`expected exactly 16 bytes`})),ME=Z(()=>Y({verb:X(`bulk.open`),"transfer-id":Z(()=>jE),"total-size":J().int().nonnegative().optional(),"content-type":q().optional()}).catchall(zT())),NE=Z(()=>Y({verb:X(`bulk.resume`),"transfer-id":Z(()=>jE),"ack-seq":J().int().nonnegative()}).catchall(zT())),PE=Z(()=>Y({verb:X(`bulk.cancel`),"transfer-id":Z(()=>jE),reason:q().optional()}).catchall(zT())),FE=Z(()=>qT([qT([Z(()=>ME),Z(()=>NE),Z(()=>PE)]),qT([Z(()=>HE),Z(()=>UE),Z(()=>WE),Z(()=>GE),Z(()=>KE),Z(()=>qE),Z(()=>JE),Z(()=>YE)]),Y({}).catchall(zT()),Z(()=>dD),Z(()=>pD),Z(()=>_D),Z(()=>vD),qT([Z(()=>SD),Z(()=>CD),Z(()=>wD),Z(()=>TD)]),qT([Z(()=>DD),Z(()=>OD)]),Z(()=>kD),qT([Z(()=>UD),Z(()=>WD),Z(()=>GD)]),qT([Z(()=>KD),Z(()=>qD),Z(()=>JD)]),Z(()=>yO),qT([Z(()=>SO),Z(()=>CO),Z(()=>wO),Z(()=>bO)])])),IE=Z(()=>Y({type:X(`bulk-data`),"transfer-id":Z(()=>jE),seq:J().int().nonnegative(),bytes:AE(Uint8Array)})),LE=Z(()=>Y({type:X(`bulk-ack`),"transfer-id":Z(()=>jE),"ack-seq":J().int().nonnegative(),window:J().int().nonnegative()})),RE=Z(()=>Y({type:X(`bulk-end`),"transfer-id":Z(()=>jE),digest:AE(Uint8Array)})),zE=Z(()=>Y({type:X(`data-have`),peer:Z(()=>aD),"head-seq":J().int().nonnegative()})),BE=Z(()=>Y({type:X(`data-request`),peer:Z(()=>aD),"from-seq":J().int().nonnegative()})),VE=Z(()=>Y({type:X(`data-entries`),peer:Z(()=>aD),"from-seq":J().int().nonnegative(),entries:UT(AE(Uint8Array))}));Z(()=>Y({handle:q(),"device-id":Z(()=>aD),"identity-key":Z(()=>iD),candidates:UT(Z(()=>uO)).optional(),mailboxes:UT(Z(()=>aD)).optional(),issued:J().int().nonnegative(),expires:J().int().nonnegative()})),Z(()=>Z(()=>tO));var HE=Z(()=>Y({verb:X(`pty.spawn`),shell:q().optional(),argv:UT(q()),cwd:q().optional(),env:Y({}).catchall(q()),cols:J().int().nonnegative(),rows:J().int().nonnegative()})),UE=Z(()=>Y({verb:X(`pty.write`),session:Z(()=>ID),bytes:AE(Uint8Array)})),WE=Z(()=>Y({verb:X(`pty.resize`),session:Z(()=>ID),cols:J().int().nonnegative(),rows:J().int().nonnegative()})),GE=Z(()=>Y({verb:X(`pty.kill`),session:Z(()=>ID),signal:J().int()})),KE=Z(()=>Y({verb:X(`proc.spawn`),argv:UT(q()),cwd:q().optional(),env:Y({}).catchall(q())})),qE=Z(()=>Y({verb:X(`proc.signal`),session:Z(()=>ID),signal:J().int()})),JE=Z(()=>Y({verb:X(`proc.kill`),session:Z(()=>ID)})),YE=Z(()=>Y({verb:X(`exec.list`)}));Z(()=>Y({session:Z(()=>ID),kind:qT([X(`pty`),X(`proc`)]),argv:UT(q()).optional(),cwd:q().optional()}));var XE=Z(()=>qT([Z(()=>rD),Z(()=>iO),Z(()=>aO),Z(()=>oO),Z(()=>cO),Z(()=>dO),Z(()=>fO),Z(()=>pO),Z(()=>mO),Z(()=>hO),Z(()=>gO),Z(()=>_O),Z(()=>vO),Z(()=>sD),Z(()=>uD),Z(()=>gD),Z(()=>LD),Z(()=>RD),Z(()=>zD),Z(()=>zE),Z(()=>BE),Z(()=>VE),Z(()=>IE),Z(()=>LE),Z(()=>RE),Z(()=>PD),Z(()=>FD)])),ZE=Z(()=>Z(()=>XE)),QE=Z(()=>J().int().nonnegative()),$E=Z(()=>qT([Z(()=>eD),Z(()=>tD),Z(()=>nD)])),eD=Z(()=>qT([X(`core/management`),X(`core/exec`),X(`core/data`),X(`core/federation`),X(`core/webrtc`),X(`core/room`),X(`core/bulk`),X(`core/version`)])),tD=Z(()=>q().regex(RegExp(`^(?:[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+/[A-Za-z0-9_.-]+)$`,`u`))),nD=Z(()=>q().regex(RegExp(`^(?:x-[A-Za-z0-9_.-]+)$`,`u`))),rD=Z(()=>Y({type:X(`handshake`),version:Z(()=>QE),domains:UT(Z(()=>$E)),params:Y({}).catchall(zT()).optional()})),iD=Z(()=>Y({alg:J().int(),"public-key":AE(Uint8Array)})),aD=Z(()=>AE(Uint8Array).refine(e=>e.length===32,{message:`expected exactly 32 bytes`}));Z(()=>Y({"device-id":Z(()=>aD),"identity-key":Z(()=>iD),certificate:AE(Uint8Array).optional()}));var oD=Z(()=>Y({verb:Z(()=>YD),params:Z(()=>FE)})),sD=Z(()=>Y({type:X(`manage-request`),"request-id":J().int().nonnegative(),command:Z(()=>oD),scope:Z(()=>$D),token:Z(()=>nO).optional()})),cD=Z(()=>Y({result:X(`ok`)}).catchall(zT())),lD=Z(()=>Y({result:X(`error`),code:q(),message:q().optional()})),uD=Z(()=>Y({type:X(`manage-response`),"request-id":J().int().nonnegative(),outcome:qT([Z(()=>cD),Z(()=>lD)])})),dD=Z(()=>Y({verb:X(`capability.request`),capability:q(),"valid-until":J().int().nonnegative().optional()}).catchall(zT())),fD=Z(()=>Y({result:X(`ok`),"granted-token":Z(()=>nO)}).catchall(zT())),pD=Z(()=>Y({verb:X(`capability.grant`),"granted-token":Z(()=>nO)}).catchall(zT())),mD=Z(()=>Y({"token-id":AE(Uint8Array),issuer:Z(()=>aD),"issuer-key":Z(()=>iD),"revoked-at":J().int().nonnegative(),authorization:AE(Uint8Array).optional()})),hD=Z(()=>Z(()=>tO)),gD=Z(()=>Y({type:X(`revocation-announce`),entries:UT(Z(()=>hD))})),_D=Z(()=>Y({verb:X(`path.trace`)}));Z(()=>Y({result:X(`ok`),relayed:FT(),"hub-address":q().optional()}).catchall(zT())),Z(()=>Y({direct:UT(Z(()=>aD)),relayed:UT(Y({device:Z(()=>aD),via:Z(()=>aD).optional()}))}));var vD=Z(()=>Y({verb:X(`topology.get`)})),yD=Z(()=>qT([Z(()=>bD),Z(()=>xD)]));Z(()=>q().regex(RegExp(`^(?:[0-9a-f]{64})$`,`u`)));var bD=Z(()=>q().regex(RegExp(`^(?:[0-9a-f]{64}/[A-Za-z0-9_-]+)$`,`u`))),xD=Z(()=>q().regex(RegExp(`^(?:[0-9a-f]{64}\\+[0-9a-f]{64})$`,`u`))),SD=Z(()=>Y({verb:X(`room.send`),"message-id":AE(Uint8Array),"sent-at":J().int().nonnegative(),text:q(),"content-type":q().optional(),refs:UT(Z(()=>ED)).optional()}).catchall(zT())),CD=Z(()=>Y({verb:X(`room.read`),messages:UT(AE(Uint8Array)),at:J().int().nonnegative()}).catchall(zT())),wD=Z(()=>Y({verb:X(`room.leave`)}).catchall(zT())),TD=Z(()=>Y({verb:X(`room.members`)}).catchall(zT())),ED=Z(()=>Y({id:AE(Uint8Array),relation:q()})),DD=Z(()=>Y({verb:X(`room.join`)}).catchall(zT())),OD=Z(()=>Y({verb:X(`room.invite`),invitee:Z(()=>aD),token:Z(()=>nO)}).catchall(zT())),kD=Z(()=>Y({verb:X(`room.rekey`),"key-epoch":J().int().nonnegative(),"wrapped-key":qT([AE(Uint8Array),UT(AE(Uint8Array))])}).catchall(zT())),AD=Z(()=>Y({device:Z(()=>aD)}).catchall(zT())),jD=Z(()=>Y({result:X(`ok`),"granted-token":Z(()=>nO),members:UT(Z(()=>AD))}).catchall(zT()));Z(()=>Y({result:X(`ok`),members:UT(Z(()=>AD))}).catchall(zT()));var MD=Z(()=>Z(()=>tO)),ND=Z(()=>Y({room:Z(()=>yD),poster:Z(()=>aD),"poster-key":Z(()=>iD),token:Z(()=>nO),"notice-id":AE(Uint8Array),"posted-at":J().int().nonnegative(),"content-type":q(),content:AE(Uint8Array),refs:UT(Z(()=>ED)).optional(),"valid-until":J().int().nonnegative().optional(),"key-epoch":J().int().nonnegative().optional()}).catchall(zT())),PD=Z(()=>Y({type:X(`secure-hello`),"ephemeral-key":AE(Uint8Array).refine(e=>e.length===65,{message:`expected exactly 65 bytes`}),nonce:AE(Uint8Array).refine(e=>e.length===16,{message:`expected exactly 16 bytes`}),"identity-key":Z(()=>iD),"to-device":Z(()=>aD),signature:AE(Uint8Array)})),FD=Z(()=>Y({type:X(`secure-data`),counter:J().int().nonnegative(),ciphertext:AE(Uint8Array)})),ID=Z(()=>J().int().nonnegative()),LD=Z(()=>Y({type:X(`stream-data`),session:Z(()=>ID),seq:J().int().nonnegative(),channel:q(),bytes:AE(Uint8Array)})),RD=Z(()=>Y({type:X(`stream-ack`),session:Z(()=>ID),"ack-seq":J().int().nonnegative(),window:J().int().nonnegative()})),zD=Z(()=>Y({type:X(`stream-end`),session:Z(()=>ID),"exit-code":J().int().optional(),"exit-signal":J().int().optional()})),BD=Z(()=>J().int().nonnegative()),VD=Z(()=>Y({kind:qT([X(`capability-token`),X(`revocation-entry`),X(`handle-record`),X(`room-notice`),q()]),protected:AE(Uint8Array),payload:AE(Uint8Array)})),HD=Z(()=>Y({participant:Z(()=>aD),hiding:AE(Uint8Array),binding:AE(Uint8Array)})),UD=Z(()=>Y({verb:X(`threshold.commit`),"session-id":Z(()=>BD),group:Z(()=>aD),subject:Z(()=>VD),deadline:J().int().nonnegative()})),WD=Z(()=>Y({verb:X(`threshold.sign`),"session-id":Z(()=>BD),commitments:UT(Z(()=>HD))}));Z(()=>Y({"session-id":Z(()=>BD),group:Z(()=>aD),share:AE(Uint8Array),issuer:Z(()=>aD),"issuer-key":Z(()=>iD)})),Z(()=>Z(()=>tO));var GD=Z(()=>Y({verb:X(`threshold.abort`),"session-id":Z(()=>BD),reason:q().optional()})),KD=Z(()=>Y({verb:X(`threshold.keygen-round1`),"session-id":Z(()=>BD),threshold:J().int().nonnegative(),participants:UT(Z(()=>aD)),commitment:UT(AE(Uint8Array)),"proof-of-knowledge":AE(Uint8Array).optional(),"existing-group-key":AE(Uint8Array).optional()})),qD=Z(()=>Y({verb:X(`threshold.keygen-round2`),"session-id":Z(()=>BD),share:AE(Uint8Array)})),JD=Z(()=>Y({verb:X(`threshold.keygen-confirm`),"session-id":Z(()=>BD),"transcript-digest":AE(Uint8Array),"group-key":AE(Uint8Array)})),YD=Z(()=>qT([Z(()=>XD),Z(()=>ZD),Z(()=>QD)])),XD=Z(()=>q().regex(RegExp(`^(?:[a-z][a-z0-9-]*:[a-z][a-z0-9-]*)$`,`u`))),ZD=Z(()=>q().regex(RegExp(`^(?:[a-z0-9.-]+/[A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+)$`,`u`))),QD=Z(()=>q().regex(RegExp(`^(?:x-[A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+)$`,`u`))),$D=Z(()=>Y({kind:q(),path:q().optional()}));Z(()=>X(1)),Z(()=>X(4)),Z(()=>qT([J().int(),q()]));var eO=Z(()=>Y({1:J().int().optional(),4:AE(Uint8Array).optional()}).catchall(zT())),tO=Z(()=>$T([AE(Uint8Array),Z(()=>eO),qT([AE(Uint8Array),LT()]),AE(Uint8Array)])),nO=Z(()=>Z(()=>tO)),rO=Z(()=>Y({"token-id":AE(Uint8Array),issuer:Z(()=>aD),"issuer-key":Z(()=>iD),bearer:Z(()=>aD),capability:Z(()=>YD),scope:Z(()=>$D),expires:J().int().nonnegative(),"not-before":J().int().nonnegative().optional(),parent:AE(Uint8Array).optional(),"authorised-by":AE(Uint8Array).optional(),"delegations-remaining":J().int().nonnegative().optional(),"valid-until":J().int().nonnegative().optional(),conditions:AE(Uint8Array).optional(),"grants-capability":Z(()=>YD).optional(),"requests-capability":Z(()=>YD).optional()}).catchall(zT())),iO=Z(()=>Y({type:X(`ping`)})),aO=Z(()=>Y({type:X(`pong`)})),oO=Z(()=>Y({type:X(`close`),reason:q().optional()})),sO=Z(()=>Y({device:Z(()=>aD),addresses:UT(q()),"snapshot-seconds":J().int(),"identity-key":Z(()=>iD),signature:AE(Uint8Array)}).catchall(zT())),cO=Z(()=>Y({type:X(`gossip`),peers:UT(Z(()=>sO))})),lO=Z(()=>qT([X(`host`),X(`server-reflexive`),X(`relayed`)])),uO=Z(()=>Y({address:q(),kind:Z(()=>lO),priority:J().int().nonnegative()})),dO=Z(()=>Y({type:X(`candidates`),candidates:UT(Z(()=>uO))})),fO=Z(()=>Y({type:X(`sync-punch`),nonce:J().int().nonnegative(),"deadline-unix-ms":J().int().nonnegative()})),pO=Z(()=>Y({type:X(`observed-address`),address:q()})),mO=Z(()=>Y({type:X(`relay-offer`),addresses:UT(q())})),hO=Z(()=>Y({type:X(`relay-connect`),"target-device":Z(()=>aD),"source-device":Z(()=>aD).optional()})),gO=Z(()=>Y({type:X(`relay-data`),payload:AE(Uint8Array),"to-device":Z(()=>aD).optional(),"from-device":Z(()=>aD).optional()})),_O=Z(()=>Y({type:X(`relay-inbound`),"source-device":Z(()=>aD),"target-device":Z(()=>aD).optional()})),vO=Z(()=>Y({type:X(`coordinator`),term:J().int().nonnegative(),coordinator:Z(()=>aD),"capacity-hint":J().int().nonnegative().optional()})),yO=Z(()=>Y({verb:X(`version.get`)})),bO=Z(()=>Y({verb:X(`webrtc.sfu-track-map`),"negotiation-id":J().int().nonnegative(),tracks:UT(Z(()=>xO))})),xO=Z(()=>Y({mid:q(),member:Z(()=>aD),kind:qT([X(`audio`),X(`video`)])})),SO=Z(()=>Y({verb:X(`webrtc.offer`),"negotiation-id":J().int().nonnegative(),sdp:q()})),CO=Z(()=>Y({verb:X(`webrtc.answer`),"negotiation-id":J().int().nonnegative(),sdp:q()})),wO=Z(()=>Y({verb:X(`webrtc.ice-candidate`),"negotiation-id":J().int().nonnegative(),candidate:Z(()=>TO).optional()})),TO=Z(()=>Y({candidate:q(),"sdp-mid":q().optional(),"sdp-m-line-index":J().int().nonnegative().optional(),"username-fragment":q().optional()})),EO=16,DO=2,OO=64;function kO(e){let t=``;for(let n of e)t+=n.toString(EO).padStart(DO,`0`);return t}function AO(e){return kO(e)}function jO(e){if(!/^([0-9a-f]{2})*$/.test(e))throw Error(`expected an even-length, lowercase hex string, got ${JSON.stringify(e)}`);let t=new Uint8Array(e.length/DO);for(let n=0;n<t.length;n++)t[n]=Number.parseInt(e.slice(n*DO,(n+1)*DO),EO);return t}function MO(e){if(e.length!==OO)throw Error(`expected a 64-character lowercase hex string, got ${JSON.stringify(e)}`);return aD.parse(jO(e))}var NO=8,PO=3,FO=4,IO=8,LO=255,RO=19,zO=252,BO=32,VO=64,HO=BigInt(NO),UO=31,WO=127,GO=BigInt(0),KO=BigInt(1),qO=BigInt(2),JO=(KO<<BigInt(LO))-BigInt(RO),YO=(KO<<BigInt(zO))+BigInt(`27742317777372353535851937790883648493`),XO=BigInt(`37095705934669439343138083508754565189542113879843219016388785533085940283555`),ZO=new Set([`0`,`1`,`7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec`,`5fc536d880238b13933c6d305acdfd5f098eff289f4c345b027b2c28f95e826`,`7a03ac9277fdc74ec6cc392cfa53202a0f67100d760b3cba4fd84d3d706a17c7`].map(e=>BigInt(`0x${e}`)));function QO(e){let t=GO;for(let n=e.length-1;n>=0;--n)t=t<<HO|BigInt(e[n]??0);return t}function $O(e){let t=Uint8Array.from(e);return t[UO]=(t[UO]??0)&WO,QO(t)}function ek(e,t){let n=KO,r=e%JO,i=t;for(;i>GO;)(i&KO)===KO&&(n=n*r%JO),r=r*r%JO,i>>=KO;return n}function tk(e){let t=e%JO;return t>=GO?t:t+JO}var nk=ek(qO,(JO-KO)/BigInt(FO));function rk(e){let t=tk(e*e),n=tk(tk(t-KO)*ek(tk(XO*t+KO),JO-qO)),r=ek(n,(JO+BigInt(PO))/BigInt(IO));for(let t of[r,tk(r*nk)])if(tk(t*t)===n)return{x:t,y:e,z:KO,t:tk(t*e)}}function ik(e,t){let n=tk((e.y-e.x)*(t.y-t.x)),r=tk((e.y+e.x)*(t.y+t.x)),i=tk(e.t*qO*XO*t.t),a=tk(e.z*qO*t.z),o=r-n,s=a-i,c=a+i,l=r+n;return{x:tk(o*s),y:tk(c*l),z:tk(s*c),t:tk(o*l)}}var ak={x:GO,y:KO,z:KO,t:GO};function ok(e){let t=ak;for(let n=zO;n>=0;--n)t=ik(t,t),(YO>>BigInt(n)&KO)===KO&&(t=ik(t,e));return t.x===GO&&t.y===t.z}var sk=1024,ck=new Map;function lk(e){if(e.length!==BO)return`wrong_size`;let t=$O(e);if(t>=JO)return`non_canonical`;let n=rk(t);return n===void 0?`not_a_point`:ZO.has(t)?`small_order`:ok(n)?void 0:`mixed_order`}function uk(e){if(e.length!==BO)return`wrong_size`;let t=kO(e);if(ck.has(t)){let e=ck.get(t);return ck.delete(t),ck.set(t,e),e}let n=lk(e);ck.set(t,n);for(let e of ck.keys()){if(ck.size<=sk)break;ck.delete(e)}return n}function dk(e){if(e.length!==VO)return!1;let t=e.subarray(0,BO),n=e.subarray(BO),r=$O(t);return QO(n)<YO&&r<JO&&!ZO.has(r)}var fk=class extends Error{fault;constructor(e,t,n){super(t,n),this.name=`IdentityKeyError`,this.fault=e}};async function pk(e,t,n,r){try{return await e.verify(t,n,r)}catch(e){if(e instanceof fk)return!1;throw e}}var mk=-7,hk=-8,gk=`web-console/identity/es256`;function _k(e){if(e===mk)return{name:`ECDSA`,hash:`SHA-256`};if(e===hk)return{name:`Ed25519`};throw Error(`unsupported identity-key alg ${String(e)}`)}function vk(e){return Uint8Array.from(e)}async function yk(e){let t=e.alg===mk?{name:`ECDSA`,namedCurve:`P-256`}:e.alg===hk?{name:`Ed25519`}:void 0;if(t===void 0)throw new fk(`unsupported_alg`,`unsupported identity-key alg ${String(e.alg)}`);if(e.alg===hk){let t=uk(e[`public-key`]);if(t!==void 0)throw new fk(`invalid_key`,`identity-key public-key is not a usable Ed25519 key (${t})`)}try{return await crypto.subtle.importKey(`raw`,vk(e[`public-key`]),t,!1,[`verify`])}catch(t){throw new fk(`invalid_key`,`identity-key public-key does not import as an alg ${String(e.alg)} key`,{cause:t})}}async function bk(e){return new Uint8Array(await crypto.subtle.digest(`SHA-256`,vk(e)))}async function xk(e,t,n){let r=await yk(e);return e.alg===hk&&!dk(n)?!1:crypto.subtle.verify(_k(e.alg),r,vk(n),vk(t))}function Sk(e){return typeof e!=`object`||!e||!(`privateJwk`in e)||!(`publicKeyRaw`in e)?!1:typeof e.privateJwk==`object`&&e.privateJwk!==null&&e.publicKeyRaw instanceof Uint8Array}async function Ck(){let e=await crypto.subtle.generateKey({name:`ECDSA`,namedCurve:`P-256`},!0,[`sign`,`verify`]);return{privateJwk:await crypto.subtle.exportKey(`jwk`,e.privateKey),publicKeyRaw:new Uint8Array(await crypto.subtle.exportKey(`raw`,e.publicKey))}}async function wk(e){let t=await crypto.subtle.importKey(`jwk`,e.privateJwk,{name:`ECDSA`,namedCurve:`P-256`},!1,[`sign`]),n={alg:mk,"public-key":e.publicKeyRaw},r=await bk(e.publicKeyRaw),i={...e.privateJwk,key_ops:[`deriveBits`]};delete i.alg;let a=await crypto.subtle.importKey(`jwk`,i,{name:`ECDH`,namedCurve:`P-256`},!1,[`deriveBits`]);return{deviceId:r,identityKey:n,async sign(e){let n=await crypto.subtle.sign(_k(mk),t,vk(e));return new Uint8Array(n)},verify:xk,deriveDeviceId:bk,async deriveSharedSecret(e){if(e.alg!==mk)throw Error(`ECDH is only defined for an ES256 peer identity-key, got alg ${String(e.alg)}`);let t=await crypto.subtle.importKey(`raw`,vk(e[`public-key`]),{name:`ECDH`,namedCurve:`P-256`},!1,[]),n=await crypto.subtle.deriveBits({name:`ECDH`,public:t},a,256);return new Uint8Array(n)}}}async function Tk(e){let t=await e.get(gk);if(t!==void 0){let e=b_(t,x_);if(!Sk(e))throw Error(`stored identity envelope is malformed`);return wk(e)}let n=await Ck();return await e.set(gk,new Uint8Array(Mg(n,hg))),wk(n)}var Ek=`#sha256=`,Dk=`,`,Ok=/^[0-9a-f]{64}$/,kk=16;function Ak(e){let t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n++)t[n]=Number.parseInt(e.slice(n*2,n*2+2),16);return t}function jk(e,t){return`https://${e}${Ek}${t.join(Dk)}`}function Mk(e){return e.startsWith(`https://`)&&e.includes(Ek)}function Nk(e){let t=new URL(e),n=t.hash.startsWith(Ek)?t.hash.slice(8).split(Dk):[];if(t.protocol!==`https:`||n.length===0||!n.every(e=>Ok.test(e)))throw Error(`expected "https://host:port${Ek}<64 hex digits>[${Dk}<64 hex digits>...]", got "${e}"`);return t.hash=``,{url:t.toString(),sha256:n.map(Ak)}}var Pk=32;function Fk(e){return Mg({sha256:e.map(Ak)},hg)}function Ik(e){let t=b_(e,x_);if(typeof t!=`object`||!t||!(`sha256`in t)||!Array.isArray(t.sha256))throw Error(`expected a map with a sha256 array`);let n=t.sha256;if(n.length===0||n.length>8)throw Error(`expected 1 to 8 hashes, got ${String(n.length)}`);let r=[];for(let e of n){if(!(e instanceof Uint8Array)||e.length!==Pk)throw Error(`each hash must be ${String(Pk)} bytes`);r.push(new Uint8Array(e))}return r}function Lk(e,t){let n=new Set(e.map(Rk)),r=[...e];for(let e of t)n.has(Rk(e))||(n.add(Rk(e)),r.push(e));return r}function Rk(e){return Array.from(e,e=>e.toString(kk).padStart(2,`0`)).join(``)}function zk(e,t){let{url:n}=Nk(e);return jk(new URL(n).host,t.map(Rk))}var Bk=`pinned-certificates/`;function Vk(e){return{recall:async t=>{let n=await e.get(Bk+t);return n===void 0?[]:Ik(n)},remember:async(t,n)=>{let r=Fk(n.map(e=>kO(e)));await e.set(Bk+t,new Uint8Array(r))}}}var Hk=`wire-mesh-console-identity`,Uk=`ES256`,Wk=16,Gk=2,Kk=4;function qk(e){let t=new Uint8Array(e.length/Gk);for(let n=0;n<t.length;n++)t[n]=Number.parseInt(e.slice(n*Gk,(n+1)*Gk),Wk);return t}function Jk(e){try{let t=atob(e.replace(/-/g,`+`).replace(/_/g,`/`));return Uint8Array.from(t,e=>e.charCodeAt(0))}catch{throw Error(`the backup's key is not valid base64url`)}}function Yk(e){let{kty:t,crv:n,x:r,y:i,d:a}=e;if(t!==`EC`||n!==`P-256`||typeof r!=`string`||typeof i!=`string`||typeof a!=`string`)throw Error(`the backup does not hold a P-256 private key`);return{kty:t,crv:n,x:r,y:i,d:a}}function Xk(e){return Uint8Array.from([Kk,...Jk(e.x),...Jk(e.y)])}function Zk(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var Qk=new TextEncoder().encode(`wire-mesh console identity backup key-pair check`);async function $k(e,t){let n;try{n=await wk({privateJwk:e,publicKeyRaw:t})}catch(e){throw Error(`the backup's private key cannot be loaded: ${e instanceof Error?e.message:String(e)}`,{cause:e})}let r=await n.sign(Qk);if(!await n.verify(n.identityKey,Qk,r))throw Error(`the private key does not belong to the backup's public key`)}async function eA(e){let t;try{t=JSON.parse(e)}catch{throw Error(`the file is not JSON`)}if(!Zk(t)||t.format!==`wire-mesh-console-identity`||t.version!==1||t.alg!==Uk||typeof t.deviceId!=`string`||typeof t.publicKey!=`string`||!Zk(t.privateJwk))throw Error(`the file is not a wire-mesh console identity backup`);let n=Yk(t.privateJwk),r=Xk(n);if(kO(r)!==t.publicKey)throw Error(`the private key does not match the backup's public key`);if(AO(await bk(r))!==t.deviceId)throw Error(`the backup's device-id does not match its public key`);return await $k(n,r),{format:Hk,version:1,alg:Uk,deviceId:t.deviceId,publicKey:t.publicKey,privateJwk:n}}function tA(e){return{async export(){let t=await e.get(gk);if(t===void 0)throw Error(`no identity is stored on this device`);let n=b_(t,x_);if(!Sk(n))throw Error(`stored identity envelope is malformed`);return{format:Hk,version:1,alg:Uk,deviceId:AO(await bk(n.publicKeyRaw)),publicKey:kO(n.publicKeyRaw),privateJwk:n.privateJwk}},async restore(t){await e.set(gk,new Uint8Array(Mg({privateJwk:t.privateJwk,publicKeyRaw:qk(t.publicKey)},hg)))}}}async function nA(e,t){let[n,...r]=e;if(n!==void 0)return await t(n)?n:nA(r,t)}async function rA(e,t){await e.reduce(async(e,n,r)=>{await e,await t(n,r)},Promise.resolve())}function iA(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1)if(e[n]!==t[n])return!1;return!0}function aA(e){return e.split(`/`).some(e=>e===`.`||e===`..`)}function oA(e,t){return aA(e)||aA(t)?!1:e===t?!0:e.startsWith(t)?t.endsWith(`/`)?!0:e.charAt(t.length)===`/`:!1}function sA(e,t){return e.kind===t.kind?e.path===void 0||t.path!==void 0&&oA(t.path,e.path):!1}var cA=(e,t,n)=>({kind:`complex`,re:e*Math.cos(t),im:e*Math.sin(t),unit:n}),lA=tE(q(),J()),uA=rE([`ms`,`s`,`min`,`h`,`d`]);YT(`kind`,[Y({kind:X(`number`),value:J(),unit:lA.optional()}),Y({kind:X(`text`),value:q()}),Y({kind:X(`boolean`),value:FT()}),Y({kind:X(`instant`),value:q()}),Y({kind:X(`duration`),value:J(),unit:uA}),Y({kind:X(`complex`),re:J(),im:J(),unit:lA.optional()})]);function dA(e){if(e===void 0)return{};let t={};for(let[n,r]of Object.entries(e))r!==0&&(t[n]=r);return t}function fA(e,t){let n=dA(e),r=dA(t),i=Object.keys(n),a=Object.keys(r);return i.length===a.length&&i.every(e=>n[e]===r[e])}function pA(e,t){let n=dA(e),r=dA(t),i={...n};for(let[e,t]of Object.entries(r))i[e]=(i[e]??0)+t;return dA(i)}function mA(e,t){let n=dA(e),r=dA(t),i={...n};for(let[e,t]of Object.entries(r))i[e]=(i[e]??0)-t;return dA(i)}Y({code:rE([`not-found`,`wrong-type`,`domain-error`]),message:q()});function Q(e){return{status:`definite`,value:e}}function $(e,t){return{status:`indeterminate`,reason:{code:e,message:t}}}function hA(...e){for(let t of e)if(t?.status===`indeterminate`)return t.reason}var gA=Z(()=>qT([q(),J(),FT(),LT(),UT(gA),tE(q(),gA)])),_A=rE([`gt`,`gte`,`lt`,`lte`,`eq`,`neq`]),vA=rE([`equals`,`notEquals`,`matches`,`notMatches`,`portableMatches`,`portableNotMatches`]),yA=rE([`in`,`notIn`]),bA=rE([`add`,`subtract`,`multiply`,`divide`,`power`,`modulo`]),xA=rE([`first`,`unique`]),SA=Y({kind:X(`not`),get operand(){return PA}}),CA=Y({kind:X(`and`),get left(){return PA},get right(){return PA}}),wA=Y({kind:X(`or`),get left(){return PA},get right(){return PA}}),TA=Y({kind:X(`allOf`),get operands(){return UT(PA)}}),EA=Y({kind:X(`anyOf`),get operands(){return UT(PA)}}),DA=Y({kind:X(`compare`),op:_A,get left(){return YA},get right(){return YA}}),OA=Y({kind:X(`textCompare`),op:vA,get left(){return YA},get right(){return YA}}),kA=Y({kind:X(`memberOf`),op:yA,get operand(){return YA},get candidates(){return UT(YA)}}),AA=Y({kind:X(`exists`),get operand(){return YA}}),jA=Y({kind:X(`some`),collection:gA,get item(){return PA},get filter(){return PA.optional()}}),MA=Y({kind:X(`every`),collection:gA,get item(){return PA},get filter(){return PA.optional()}}),NA=Y({kind:X(`treeReference`),key:gA}),PA=YT(`kind`,[SA,CA,wA,TA,EA,DA,OA,kA,AA,jA,MA,NA]),FA=Y({kind:X(`numberLiteral`),value:J(),unit:lA.optional()}),IA=Y({kind:X(`textLiteral`),value:q()}),LA=Y({kind:X(`booleanLiteral`),value:FT()}),RA=Y({kind:X(`instantLiteral`),value:q()}),zA=Y({kind:X(`durationLiteral`),value:J(),unit:uA}),BA=qT([GT({kind:X(`complexLiteral`),re:J(),im:J(),unit:lA.optional()}),GT({kind:X(`complexLiteral`),magnitude:J(),phase:J(),unit:lA.optional()})]),VA=Y({kind:X(`reference`),key:gA,unit:lA.optional()}),HA=Y({kind:X(`arithmetic`),op:bA,get left(){return YA},get right(){return YA}}),UA=Y({kind:X(`negate`),get operand(){return YA}}),WA=Y({kind:X(`call`),fn:q(),get args(){return UT(YA)}}),GA=Y({kind:X(`lookup`),table:gA,get keys(){return UT(YA)}}),KA=Y({get when(){return PA},get then(){return YA}}),qA=Y({kind:X(`conditional`),hitPolicy:xA.optional(),get cases(){return UT(KA)},get fallback(){return YA}}),JA=YT(`mode`,[Y({mode:X(`max`),get item(){return YA}}),Y({mode:X(`min`),get item(){return YA}}),Y({mode:X(`reduce`),get initial(){return YA},get combine(){return YA}})]),YA=qT([YT(`kind`,[FA,IA,LA,RA,zA,VA,HA,UA,WA,GA,qA,Y({kind:X(`fold`),collection:gA,get filter(){return PA.optional()},combiner:JA}),Y({kind:X(`accumulator`)}),Y({kind:X(`delegate`),system:q(),payload:gA}),NA]),BA]),XA={},ZA=1e4;function QA(e,t){let n=0;return{checkNode(r){if(n+=1,n>e)return $(`domain-error`,`evaluation exceeded the maximum of ${e.toString()} nodes visited in a single call (resource exhausted)`);if(r>=t)return $(`domain-error`,`evaluation nesting depth exceeds the maximum of ${t.toString()} (resource exhausted)`)}}}async function $A(e,t,n,r,i,a,o,s,c,l){let u=await i.resolveCollection(t,r);return Promise.all(u.map(async t=>{if(n===void 0)return{item:t,filterOutcome:`include`};let r=await e(n,t,i,void 0,a,o,s,c,l+1);return r.status===`indeterminate`?{item:t,filterOutcome:r}:{item:t,filterOutcome:r.value?`include`:`exclude`}}))}function ej(e){for(let{filterOutcome:t}of e)if(t!==`include`&&t!==`exclude`&&t.status===`indeterminate`)return t.reason}function tj(e,t){return t>=e.from&&t<=e.to}function nj(e,t){let n=e.ranges.some(e=>tj(e,t));return e.negated?!n:n}var rj=class extends Error{pattern;index;constructor(e,t,n){super(`invalid pattern at index ${String(t)}: ${n}\n ${e}\n ${` `.repeat(t)}^`),this.name=`RegexParseError`,this.pattern=e,this.index=t}};function ij(e){return e.charCodeAt(0)}function aj(e,t){return{from:ij(e),to:ij(t)}}function oj(e){let t=ij(e);return{from:t,to:t}}var sj=[aj(`0`,`9`)],cj=[aj(`A`,`Z`),aj(`a`,`z`),aj(`0`,`9`),oj(`_`)],lj=[oj(` `),oj(` `),oj(`
84
84
  `),oj(`\r`),oj(`\f`),oj(`\v`)];function uj(e){switch(e){case`d`:return{kind:`charClass`,negated:!1,ranges:sj};case`D`:return{kind:`charClass`,negated:!0,ranges:sj};case`w`:return{kind:`charClass`,negated:!1,ranges:cj};case`W`:return{kind:`charClass`,negated:!0,ranges:cj};case`s`:return{kind:`charClass`,negated:!1,ranges:lj};case`S`:return{kind:`charClass`,negated:!0,ranges:lj};default:throw Error(`unreachable shorthand class letter`)}}var dj=new Set([`|`,`)`]),fj={".":`.`,"*":`*`,"+":`+`,"?":`?`,"(":`(`,")":`)`,"[":`[`,"]":`]`,"{":`{`,"}":`}`,"|":`|`,"^":`^`,$:`$`,"\\":`\\`,"/":`/`,n:`
85
- `,t:` `,r:`\r`,f:`\f`,v:`\v`},pj=class{pattern;pos=0;constructor(e){this.pattern=e}get position(){return this.pos}atEnd(){return this.pos>=this.pattern.length}peek(e=0){return this.pattern[this.pos+e]}advance(){let e=this.pattern[this.pos];if(e===void 0)throw new rj(this.pattern,this.pos,`unexpected end of pattern`);return this.pos+=1,e}parseAlternation(){let e=this.parseSequence(),t=[];for(;this.peek()===`|`;)this.advance(),t.push(this.parseSequence());return t.length===0?e:{kind:`alternation`,branches:[e,...t]}}parseSequence(){if(this.atEnd()||dj.has(this.peek()??``))return{kind:`concat`,operands:[]};let e=this.parseQuantified(),t=[];for(;!this.atEnd()&&!dj.has(this.peek()??``);)t.push(this.parseQuantified());return t.length===0?e:{kind:`concat`,operands:[e,...t]}}parseQuantified(){let e=this.pos,t=this.parseAtom();if(t.kind===`anchorStart`||t.kind===`anchorEnd`){if(this.peekIsQuantifierStart())throw new rj(this.pattern,e,`an anchor ('${t.kind===`anchorStart`?`^`:`$`}') cannot be quantified`);return t}let n=this.tryParseQuantifier();if(n===void 0)return t;if(this.peekIsQuantifierStart())throw new rj(this.pattern,this.pos,`a quantifier cannot itself be quantified -- this grammar has no lazy or possessive modifiers, since a pattern that only ever answers a yes/no match question has no notion for either to change`);switch(n.kind){case`star`:return{kind:`star`,operand:t};case`plus`:return{kind:`plus`,operand:t};case`optional`:return{kind:`optional`,operand:t};case`repeat`:return{kind:`repeat`,operand:t,min:n.min,max:n.max};default:throw Error(`unreachable quantifier kind`)}}peekIsQuantifierStart(){let e=this.peek();if(e===`*`||e===`+`||e===`?`)return!0;if(e===`{`){let e=this.pos,t=this.tryParseBound();return this.pos=e,t!==void 0}return!1}tryParseQuantifier(){let e=this.peek();if(e===`*`)return this.advance(),{kind:`star`};if(e===`+`)return this.advance(),{kind:`plus`};if(e===`?`)return this.advance(),{kind:`optional`};if(e===`{`){let e=this.tryParseBound();return e===void 0?void 0:{kind:`repeat`,min:e.min,max:e.max}}}tryParseBound(){let e=this.pos;this.pos+=1;let t=this.readDigits();if(t===``){this.pos=e;return}let n,r=!1;if(this.peek()===`,`&&(r=!0,this.pos+=1,n=this.readDigits()),this.peek()!==`}`){this.pos=e;return}this.pos+=1;let i=Number.parseInt(t,10),a=r?n===``?void 0:Number.parseInt(n??``,10):i;if(a!==void 0&&a<i)throw new rj(this.pattern,e,`quantifier range is backwards: {${t}${r?`,`+(n??``):``}} would require between ${String(i)} and ${String(a)} repetitions`);return{min:i,max:a}}readDigits(){let e=``;for(;;){let t=this.peek();if(t===void 0||t<`0`||t>`9`)break;e+=t,this.pos+=1}return e}parseAtom(){let e=this.peek();if(e===void 0)throw new rj(this.pattern,this.pos,`unexpected end of pattern`);if(e===`^`)return this.advance(),{kind:`anchorStart`};if(e===`$`)return this.advance(),{kind:`anchorEnd`};if(e===`.`)return this.advance(),{kind:`anyChar`};if(e===`(`)return this.parseGroup();if(e===`[`)return this.parseCharClass();if(e===`\\`)return this.parseEscapedAtom();if(e===`*`||e===`+`||e===`?`)throw new rj(this.pattern,this.pos,`quantifier '${e}' with nothing to repeat`);return this.advance(),{kind:`literal`,codeUnit:e.charCodeAt(0)}}parseGroup(){let e=this.pos;if(this.advance(),this.peek()===`?`&&this.peek(1)===`:`)this.advance(),this.advance();else throw new rj(this.pattern,e,`capturing groups are not supported in this grammar -- there is nothing to capture, since a pattern only ever answers whether it matches. Use '(?:...)' for grouping.`);let t=this.parseAlternation();if(this.peek()!==`)`)throw new rj(this.pattern,this.pos,`expected ')' to close '(?:'`);return this.advance(),t}parseEscapedAtom(){let e=this.pos;if(this.advance(),this.atEnd())throw new rj(this.pattern,e,`trailing backslash with nothing to escape`);let t=this.advance();if(t===`d`||t===`D`||t===`w`||t===`W`||t===`s`||t===`S`)return uj(t);let n=fj[t];if(n!==void 0)return{kind:`literal`,codeUnit:n.charCodeAt(0)};throw new rj(this.pattern,e,`unknown escape sequence '\\${t}'`)}parseCharClass(){let e=this.pos;this.advance();let t=!1;this.peek()===`^`&&(this.advance(),t=!0);let n=[];for(;;){if(this.atEnd())throw new rj(this.pattern,e,`unterminated character class -- missing closing ']'`);if(this.peek()===`]`){if(n.length===0)throw new rj(this.pattern,this.pos,`a character class must contain at least one item -- ']' immediately, or immediately after '[^', is not the empty class here (escape it as '\\]' to match a literal ']')`);this.advance();break}n.push(...this.parseClassItem())}return{kind:`charClass`,negated:t,ranges:n}}parseClassItem(){let e=this.peek();if(e===`\\`){let e=this.pos;if(this.advance(),this.atEnd())throw new rj(this.pattern,e,`trailing backslash with nothing to escape`);let t=this.advance();if(t===`d`||t===`w`||t===`s`)return uj(t).ranges;if(t===`D`||t===`W`||t===`S`)throw new rj(this.pattern,e,`the negated shorthand class '\\${t}' cannot be embedded inside a character class, because its complement cannot be represented as a set of ranges to union with the class's other members -- use it as its own atom instead of embedding it here`);let n=fj[t];if(n===void 0)throw new rj(this.pattern,e,`unknown escape sequence '\\${t}'`);return this.parseOptionalRangeFrom(n.charCodeAt(0))}if(e===void 0)throw new rj(this.pattern,this.pos,`unterminated character class -- missing closing ']'`);return this.advance(),this.parseOptionalRangeFrom(e.charCodeAt(0))}parseOptionalRangeFrom(e){if(this.peek()===`-`&&this.peek(1)!==void 0&&this.peek(1)!==`]`){let t=this.pos;this.advance();let n=this.parseClassRangeEndpoint();if(n<e)throw new rj(this.pattern,t,`invalid range in character class: '${String.fromCharCode(e)}-${String.fromCharCode(n)}' is reversed`);return[{from:e,to:n}]}return[{from:e,to:e}]}parseClassRangeEndpoint(){let e=this.peek();if(e===`\\`){let e=this.pos;if(this.advance(),this.atEnd())throw new rj(this.pattern,e,`trailing backslash with nothing to escape`);let t=this.advance();if(t===`d`||t===`D`||t===`w`||t===`W`||t===`s`||t===`S`)throw new rj(this.pattern,e,`a shorthand class ('\\${t}') cannot be a range endpoint`);let n=fj[t];if(n===void 0)throw new rj(this.pattern,e,`unknown escape sequence '\\${t}'`);return n.charCodeAt(0)}if(e===void 0)throw new rj(this.pattern,this.pos,`unterminated character class -- missing closing ']'`);return this.advance(),e.charCodeAt(0)}};function mj(e){let t=new pj(e),n=t.parseAlternation();if(!t.atEnd())throw new rj(e,t.position,`unexpected character -- if this was meant literally, escape it with a backslash`);return n}var hj=class{states=[];add(e){return this.states.push(e),this.states.length-1}patch(e,t){for(let n of e){let e=this.states[n.state];if(e!==void 0)switch(n.field){case`to`:(e.kind===`char`||e.kind===`anchorStart`||e.kind===`anchorEnd`)&&(e.to=t);break;case`to1`:e.kind===`split`&&(e.to1=t);break;case`to2`:e.kind===`split`&&(e.to2=t)}}}emptyFrag(){let e=this.add({kind:`split`,to1:-1,to2:-1});return{start:e,out:[{state:e,field:`to1`},{state:e,field:`to2`}]}}compileRepeat(e){let{operand:t,min:n,max:r}=e;if(r===void 0){if(n===0)return this.compileNode({kind:`star`,operand:t});let e=[];for(let r=0;r<n-1;r+=1)e.push(t);return e.push({kind:`plus`,operand:t}),this.compileNode({kind:`concat`,operands:e})}let i=[];for(let e=0;e<n;e+=1)i.push(t);for(let e=0;e<r-n;e+=1)i.push({kind:`optional`,operand:t});return i.length===0?this.emptyFrag():this.compileNode({kind:`concat`,operands:i})}compileNode(e){switch(e.kind){case`literal`:{let t=e.codeUnit,n=this.add({kind:`char`,test:e=>e===t,to:-1});return{start:n,out:[{state:n,field:`to`}]}}case`anyChar`:{let e=this.add({kind:`char`,test:()=>!0,to:-1});return{start:e,out:[{state:e,field:`to`}]}}case`charClass`:{let t=this.add({kind:`char`,test:t=>nj(e,t),to:-1});return{start:t,out:[{state:t,field:`to`}]}}case`anchorStart`:{let e=this.add({kind:`anchorStart`,to:-1});return{start:e,out:[{state:e,field:`to`}]}}case`anchorEnd`:{let e=this.add({kind:`anchorEnd`,to:-1});return{start:e,out:[{state:e,field:`to`}]}}case`concat`:{if(e.operands.length===0)return this.emptyFrag();let[t,...n]=e.operands;if(t===void 0)throw Error(`unreachable: a non-empty operands array always has a first element`);let r=this.compileNode(t);for(let e of n){let t=this.compileNode(e);this.patch(r.out,t.start),r={start:r.start,out:t.out}}return r}case`alternation`:{let[t,...n]=e.branches;if(t===void 0)throw Error(`unreachable: AlternationNode always has at least two branches`);let r=this.compileNode(t);for(let e of n){let t=this.compileNode(e);r={start:this.add({kind:`split`,to1:r.start,to2:t.start}),out:[...r.out,...t.out]}}return r}case`star`:{let t=this.compileNode(e.operand),n=this.add({kind:`split`,to1:t.start,to2:-1});return this.patch(t.out,n),{start:n,out:[{state:n,field:`to2`}]}}case`plus`:{let t=this.compileNode(e.operand),n=this.add({kind:`split`,to1:t.start,to2:-1});return this.patch(t.out,n),{start:t.start,out:[{state:n,field:`to2`}]}}case`optional`:{let t=this.compileNode(e.operand),n=this.add({kind:`split`,to1:t.start,to2:-1});return{start:n,out:[...t.out,{state:n,field:`to2`}]}}case`repeat`:return this.compileRepeat(e);default:throw Error(`unreachable regex node kind`)}}build(e){let t=this.compileNode(e),n=this.add({kind:`match`});return this.patch(t.out,n),{states:this.states,start:t.start,matchState:n}}};function gj(e){return new hj().build(e)}function _j(e,t,n,r){let i=new Set,a=new Set,o=[...t];for(;o.length>0;){let t=o.pop();if(t===void 0||a.has(t))continue;a.add(t);let s=e.states[t];if(s!==void 0)switch(s.kind){case`char`:case`match`:i.add(t);break;case`split`:o.push(s.to1,s.to2);break;case`anchorStart`:n===0&&o.push(s.to);break;case`anchorEnd`:n===r&&o.push(s.to)}}return i}function vj(e,t,n){let r=new Set;for(let i of t){let t=e.states[i];t?.kind===`char`&&t.test(n)&&r.add(t.to)}return r}function yj(e,t){let n=t.length,r=_j(e,[e.start],0,n);if(r.has(e.matchState))return!0;for(let i=0;i<n;i+=1){let a=t.charCodeAt(i),o=vj(e,r,a);if(o.add(e.start),r=_j(e,[...o],i+1,n),r.has(e.matchState))return!0}return!1}function bj(e){let t=gj(mj(e));return{test:e=>yj(t,e)}}function xj(e,t){if(e.status===`definite`&&!e.value||t.status===`definite`&&!t.value)return Q(!1);let n=hA(e,t);return n===void 0?Q(!0):{status:`indeterminate`,reason:n}}function Sj(e,t){if(e.status===`definite`&&e.value||t.status===`definite`&&t.value)return Q(!0);let n=hA(e,t);return n===void 0?Q(!1):{status:`indeterminate`,reason:n}}function Cj(e,t,n){switch(e){case`gt`:return t>n;case`gte`:return t>=n;case`lt`:return t<n;case`lte`:return t<=n;case`eq`:return t===n;case`neq`:return t!==n;default:throw Error(`unreachable comparison operator`)}}var wj={ms:1,s:1e3,min:6e4,h:36e5,d:864e5};function Tj(e,t){return e*wj[t]}function Ej(e){let t=Date.parse(e);return Number.isNaN(t)?void 0:t}function Dj(e){return $(`wrong-type`,`'${e}' is not a parseable ISO-8601 timestamp`)}function Oj(e){let t=new Date(e);return Number.isNaN(t.getTime())?$(`domain-error`,`the resulting instant falls outside the representable timestamp range`):Q({kind:`instant`,value:t.toISOString()})}function kj(e,t,n){switch(t.kind){case`number`:return n.kind===`number`?fA(t.unit,n.unit)?Q(Cj(e,t.value,n.value)):$(`wrong-type`,`cannot compare numbers with incompatible units`):$(`wrong-type`,`cannot compare a 'number' value with a '${n.kind}' value`);case`text`:return $(`wrong-type`,`text values are not comparable via 'compare'; use 'textCompare'`);case`boolean`:return n.kind===`boolean`?e!==`eq`&&e!==`neq`?$(`wrong-type`,`booleans have no natural ordering; '${e}' is only defined for 'eq'/'neq'`):Q(e===`eq`?t.value===n.value:t.value!==n.value):$(`wrong-type`,`cannot compare a 'boolean' value with a '${n.kind}' value`);case`instant`:{if(n.kind!==`instant`)return $(`wrong-type`,`cannot compare an 'instant' value with a '${n.kind}' value`);let r=Ej(t.value);if(r===void 0)return Dj(t.value);let i=Ej(n.value);return i===void 0?Dj(n.value):Q(Cj(e,r,i))}case`duration`:return n.kind===`duration`?Q(Cj(e,Tj(t.value,t.unit),Tj(n.value,n.unit))):$(`wrong-type`,`cannot compare a 'duration' value with a '${n.kind}' value`);case`complex`:return e!==`eq`&&e!==`neq`?$(`wrong-type`,`ordering operator '${e}' is not defined for complex values; the complex plane has no total order`):n.kind===`complex`?fA(t.unit,n.unit)?Q(e===`eq`?t.re===n.re&&t.im===n.im:t.re!==n.re||t.im!==n.im):$(`wrong-type`,`cannot compare complex values with incompatible units`):$(`wrong-type`,`cannot compare a 'complex' value with a '${n.kind}' value`);default:throw Error(`unreachable computed-value kind`)}}function Aj(e,t,n){if(t.kind!==`text`)return $(`wrong-type`,`'textCompare' requires 'text' operands; the left operand is '${t.kind}'`);if(n.kind!==`text`)return $(`wrong-type`,`'textCompare' requires 'text' operands; the right operand is '${n.kind}'`);switch(e){case`equals`:return Q(t.value===n.value);case`notEquals`:return Q(t.value!==n.value);case`matches`:case`notMatches`:{let r;try{r=new RegExp(n.value)}catch{return $(`wrong-type`,`'${n.value}' is not a valid regular expression pattern`)}let i=r.test(t.value);return Q(e===`matches`?i:!i)}case`portableMatches`:case`portableNotMatches`:{let r;try{r=bj(n.value)}catch(e){let t=e instanceof rj?e.message:String(e);return $(`wrong-type`,`'${n.value}' is not a valid trilean-regex pattern: ${t}`)}let i=r.test(t.value);return Q(e===`portableMatches`?i:!i)}default:throw Error(`unreachable text comparison operator`)}}function jj(e,t){switch(e.kind){case`number`:return t.kind===`number`?fA(e.unit,t.unit)?Q(e.value===t.value):$(`wrong-type`,`cannot compare numbers with incompatible units for membership`):$(`wrong-type`,`cannot compare a 'number' value with a '${t.kind}' value for membership`);case`text`:return t.kind===`text`?Q(e.value===t.value):$(`wrong-type`,`cannot compare a 'text' value with a '${t.kind}' value for membership`);case`boolean`:return t.kind===`boolean`?Q(e.value===t.value):$(`wrong-type`,`cannot compare a 'boolean' value with a '${t.kind}' value for membership`);case`instant`:{if(t.kind!==`instant`)return $(`wrong-type`,`cannot compare an 'instant' value with a '${t.kind}' value for membership`);let n=Ej(e.value);if(n===void 0)return Dj(e.value);let r=Ej(t.value);return r===void 0?Dj(t.value):Q(n===r)}case`duration`:return t.kind===`duration`?Q(Tj(e.value,e.unit)===Tj(t.value,t.unit)):$(`wrong-type`,`cannot compare a 'duration' value with a '${t.kind}' value for membership`);case`complex`:return t.kind===`complex`?fA(e.unit,t.unit)?Q(e.re===t.re&&e.im===t.im):$(`wrong-type`,`cannot compare complex values with incompatible units for membership`):$(`wrong-type`,`cannot compare a 'complex' value with a '${t.kind}' value for membership`);default:throw Error(`unreachable computed-value kind`)}}function Mj(e){return fA(e,void 0)}function Nj(e){switch(e.kind){case`number`:return Q({kind:`number`,value:-e.value,unit:e.unit});case`duration`:return Q({kind:`duration`,value:-e.value,unit:e.unit});case`complex`:return Q({kind:`complex`,re:-e.re,im:-e.im,unit:e.unit});case`text`:case`instant`:case`boolean`:return $(`wrong-type`,`cannot negate a '${e.kind}' value`);default:throw Error(`unreachable computed-value kind`)}}function Pj(e,t,n){switch(e){case`add`:return fA(t.unit,n.unit)?Q({kind:`number`,value:t.value+n.value,unit:t.unit}):$(`wrong-type`,`cannot add numbers with incompatible units`);case`subtract`:return fA(t.unit,n.unit)?Q({kind:`number`,value:t.value-n.value,unit:t.unit}):$(`wrong-type`,`cannot subtract numbers with incompatible units`);case`multiply`:return Q({kind:`number`,value:t.value*n.value,unit:pA(t.unit,n.unit)});case`divide`:return n.value===0?$(`domain-error`,`division by zero`):Q({kind:`number`,value:t.value/n.value,unit:mA(t.unit,n.unit)});case`power`:return!Mj(t.unit)||!Mj(n.unit)?$(`wrong-type`,`'power' requires dimensionless operands`):t.value<0&&!Number.isInteger(n.value)?$(`domain-error`,`a negative base raised to a non-integer power is not a real number`):t.value===0&&n.value<0?$(`domain-error`,`zero raised to a negative power is a division by zero`):Q({kind:`number`,value:t.value**n.value});case`modulo`:return!Mj(t.unit)||!Mj(n.unit)?$(`wrong-type`,`'modulo' requires dimensionless operands`):n.value===0?$(`domain-error`,`modulo by zero`):Q({kind:`number`,value:t.value%n.value});default:throw Error(`unreachable arithmetic operator`)}}function Fj(e,t,n){switch(e){case`add`:return Q({kind:`duration`,value:Tj(t.value,t.unit)+Tj(n.value,n.unit),unit:`ms`});case`subtract`:return Q({kind:`duration`,value:Tj(t.value,t.unit)-Tj(n.value,n.unit),unit:`ms`});case`multiply`:case`divide`:case`power`:case`modulo`:return $(`wrong-type`,`arithmetic operator '${e}' is not defined between two 'duration' values`);default:throw Error(`unreachable arithmetic operator`)}}function Ij(e){return e.kind===`complex`?e:{kind:`complex`,re:e.value,im:0,unit:e.unit}}function Lj(e,t){return{kind:`complex`,re:e.re*t.re-e.im*t.im,im:e.re*t.im+e.im*t.re,unit:pA(e.unit,t.unit)}}function Rj(e,t,n){switch(e){case`add`:return fA(t.unit,n.unit)?Q({kind:`complex`,re:t.re+n.re,im:t.im+n.im,unit:t.unit}):$(`wrong-type`,`cannot add complex values with incompatible units`);case`subtract`:return fA(t.unit,n.unit)?Q({kind:`complex`,re:t.re-n.re,im:t.im-n.im,unit:t.unit}):$(`wrong-type`,`cannot subtract complex values with incompatible units`);case`multiply`:return Q(Lj(t,n));case`divide`:{let e=n.re*n.re+n.im*n.im;return e===0?$(`domain-error`,`division by zero`):Q({kind:`complex`,re:(t.re*n.re+t.im*n.im)/e,im:(t.im*n.re-t.re*n.im)/e,unit:mA(t.unit,n.unit)})}case`modulo`:return $(`domain-error`,`'modulo' is undefined for complex values`);default:throw Error(`unreachable arithmetic operator`)}}function zj(e,t){if(t.kind!==`number`||!Number.isInteger(t.value))return $(`wrong-type`,`'power' with a complex operand requires a real integer exponent`);if(!Mj(e.unit)||!Mj(t.unit))return $(`wrong-type`,`'power' requires dimensionless operands`);let n={kind:`complex`,re:1,im:0,unit:{}},r=Ij(e),i=n;for(let e=0;e<Math.abs(t.value);e+=1)i=Lj(i,r);return t.value>=0?Q(i):Rj(`divide`,n,i)}function Bj(e,t,n){if(t.kind===`instant`&&n.kind===`instant`&&e===`subtract`){let e=Ej(t.value);if(e===void 0)return Dj(t.value);let r=Ej(n.value);return r===void 0?Dj(n.value):Q({kind:`duration`,value:e-r,unit:`ms`})}if(t.kind===`instant`&&n.kind===`duration`&&e===`add`){let e=Ej(t.value);return e===void 0?Dj(t.value):Oj(e+Tj(n.value,n.unit))}if(t.kind===`duration`&&n.kind===`instant`&&e===`add`){let e=Ej(n.value);return e===void 0?Dj(n.value):Oj(e+Tj(t.value,t.unit))}return t.kind===`instant`||n.kind===`instant`?$(`wrong-type`,`arithmetic operator '${e}' is not defined between a '${t.kind}' and a '${n.kind}' value`):t.kind===`duration`&&n.kind===`duration`?Fj(e,t,n):t.kind===`duration`||n.kind===`duration`?$(`wrong-type`,`arithmetic operator '${e}' is not defined between a '${t.kind}' and a '${n.kind}' value`):t.kind!==`number`&&t.kind!==`complex`?$(`wrong-type`,`arithmetic requires numeric operands; got a '${t.kind}' value`):n.kind!==`number`&&n.kind!==`complex`?$(`wrong-type`,`arithmetic requires numeric operands; got a '${n.kind}' value`):t.kind===`complex`||n.kind===`complex`?e===`power`?zj(t,n):Rj(e,Ij(t),Ij(n)):Pj(e,t,n)}function Vj(e,t){if(e!==void 0){if(t.kind!==`number`&&t.kind!==`complex`)return $(`wrong-type`,`a unit was expected on a reference that resolved to a non-numeric value`);if(!fA(e,t.unit))return $(`wrong-type`,`the resolved value's unit does not match the reference's expected unit`)}}function Hj(e,t,n){let r=Object.hasOwn(e,t)?e[t]:void 0;if(r===void 0)return $(`wrong-type`,`no function registered under the name '${t}'`);let i=r(n);return`domainError`in i?$(`domain-error`,i.domainError):Q(i)}async function Uj(e,t,n,r,i,a,o,s,c){let l=s.checkNode(c);if(l!==void 0)return l;switch(e.kind){case`not`:{let l=await Uj(e.operand,t,n,r,i,a,o,s,c+1);return l.status===`indeterminate`?l:Q(!l.value)}case`and`:{let[l,u]=await Promise.all([Uj(e.left,t,n,r,i,a,o,s,c+1),Uj(e.right,t,n,r,i,a,o,s,c+1)]);return xj(l,u)}case`or`:{let[l,u]=await Promise.all([Uj(e.left,t,n,r,i,a,o,s,c+1),Uj(e.right,t,n,r,i,a,o,s,c+1)]);return Sj(l,u)}case`allOf`:return(await Promise.all(e.operands.map(async e=>Uj(e,t,n,r,i,a,o,s,c+1)))).reduce(xj,Q(!0));case`anyOf`:return(await Promise.all(e.operands.map(async e=>Uj(e,t,n,r,i,a,o,s,c+1)))).reduce(Sj,Q(!1));case`compare`:{let[l,u]=await Promise.all([Wj(e.left,t,n,r,i,a,o,s,c+1),Wj(e.right,t,n,r,i,a,o,s,c+1)]);return l.status===`indeterminate`?l:u.status===`indeterminate`?u:kj(e.op,l.value,u.value)}case`textCompare`:{let[l,u]=await Promise.all([Wj(e.left,t,n,r,i,a,o,s,c+1),Wj(e.right,t,n,r,i,a,o,s,c+1)]);return l.status===`indeterminate`?l:u.status===`indeterminate`?u:Aj(e.op,l.value,u.value)}case`memberOf`:{let l=await Wj(e.operand,t,n,r,i,a,o,s,c+1);if(l.status===`indeterminate`)return l;let u=await Promise.all(e.candidates.map(async e=>{let u=await Wj(e,t,n,r,i,a,o,s,c+1);return u.status===`indeterminate`?u:jj(l.value,u.value)}));for(let t of u)if(t.status===`definite`&&t.value)return Q(e.op===`in`);let d=hA(...u);return d===void 0?Q(e.op===`notIn`):{status:`indeterminate`,reason:d}}case`exists`:{let l=await Wj(e.operand,t,n,r,i,a,o,s,c+1);return l.status===`indeterminate`&&l.reason.code===`not-found`?Q(!1):Q(!0)}case`some`:case`every`:{let r=await $A(Uj,e.collection,e.filter,t,n,i,a,o,s,c+1),l=(await Promise.all(r.map(async({item:t,filterOutcome:r})=>{if(r!==`exclude`)return r===`include`?Uj(e.item,t,n,void 0,i,a,o,s,c+1):r}))).filter(e=>e!==void 0),u=e.kind===`some`?Sj:xj,d=e.kind===`some`?Q(!1):Q(!0);return l.reduce(u,d)}case`treeReference`:{if(n.resolveTree===void 0)return $(`wrong-type`,`no tree resolver registered for treeReference nodes`);let l=JSON.stringify(e.key);if(a.has(l))return $(`domain-error`,`circular treeReference detected`);if(o>=100)return $(`domain-error`,`treeReference chain exceeds the maximum depth of 100`);let u=await n.resolveTree(e.key,t);if(!u.found)return $(`not-found`,`treeReference key did not resolve to a tree`);let d=PA.safeParse(u.node);return d.success?Uj(d.data,t,n,r,i,new Set([...a,l]),o+1,s,c+1):$(`wrong-type`,`the referenced tree is not a valid PredicateNode`)}default:throw Error(`unreachable predicate node kind`)}}async function Wj(e,t,n,r,i,a,o,s,c){let l=s.checkNode(c);if(l!==void 0)return l;switch(e.kind){case`reference`:{let r=await n.resolveValue(e.key,t);if(!r.found)return $(`not-found`,`no value found for reference key ${JSON.stringify(e.key)}`);let i=Vj(e.unit,r.value);return i===void 0?Q(r.value):i}case`accumulator`:return r===void 0?$(`wrong-type`,`accumulator used outside a reduce fold's combine expression`):Q(r);case`call`:{let l=await Promise.all(e.args.map(async e=>Wj(e,t,n,r,i,a,o,s,c+1))),u=[];for(let e of l){if(e.status===`indeterminate`)return e;u.push(e.value)}return Hj(i,e.fn,u)}case`numberLiteral`:return Q({kind:`number`,value:e.value,unit:e.unit});case`textLiteral`:return Q({kind:`text`,value:e.value});case`booleanLiteral`:return Q({kind:`boolean`,value:e.value});case`instantLiteral`:return Q({kind:`instant`,value:e.value});case`durationLiteral`:return Q({kind:`duration`,value:e.value,unit:e.unit});case`complexLiteral`:return`re`in e?Q({kind:`complex`,re:e.re,im:e.im,unit:e.unit}):Q(cA(e.magnitude,e.phase,e.unit));case`arithmetic`:{let[l,u]=await Promise.all([Wj(e.left,t,n,r,i,a,o,s,c+1),Wj(e.right,t,n,r,i,a,o,s,c+1)]);return l.status===`indeterminate`?l:u.status===`indeterminate`?u:Bj(e.op,l.value,u.value)}case`negate`:{let l=await Wj(e.operand,t,n,r,i,a,o,s,c+1);return l.status===`indeterminate`?l:Nj(l.value)}case`lookup`:{let l=await Promise.all(e.keys.map(async e=>Wj(e,t,n,r,i,a,o,s,c+1))),u=[];for(let e of l){if(e.status===`indeterminate`)return e;u.push(e.value)}let d=await n.resolveLookup(e.table,u,t);return d.found?Q(d.value):$(`not-found`,`no match found in lookup table ${JSON.stringify(e.table)}`)}case`conditional`:{if((e.hitPolicy??`first`)===`first`){for(let{when:l,then:u}of e.cases){let e=await Uj(l,t,n,r,i,a,o,s,c+1);if(e.status===`indeterminate`)return e;if(e.value)return Wj(u,t,n,r,i,a,o,s,c+1)}return Wj(e.fallback,t,n,r,i,a,o,s,c+1)}let l=await Promise.all(e.cases.map(async({when:e,then:l})=>({then:l,whenResult:await Uj(e,t,n,r,i,a,o,s,c+1)}))),u=l.filter(({whenResult:e})=>e.status===`definite`&&e.value);if(u.length>=2)return $(`domain-error`,`more than one case matched under the 'unique' hit policy`);let d=hA(...l.map(({whenResult:e})=>e));if(d!==void 0)return{status:`indeterminate`,reason:d};let[f]=u;return Wj(f===void 0?e.fallback:f.then,t,n,r,i,a,o,s,c+1)}case`fold`:{let r=await $A(Uj,e.collection,e.filter,t,n,i,a,o,s,c+1),l=ej(r);if(l!==void 0)return{status:`indeterminate`,reason:l};let u=r.filter(({filterOutcome:e})=>e===`include`).map(({item:e})=>e);if(e.combiner.mode===`reduce`){let r=await Wj(e.combiner.initial,t,n,void 0,i,a,o,s,c+1);if(r.status===`indeterminate`)return r;let l=r.value;for(let t of u){let r=await Wj(e.combiner.combine,t,n,l,i,a,o,s,c+1);if(r.status===`indeterminate`)return r;l=r.value}return Q(l)}if(u.length===0)return $(`domain-error`,`'${e.combiner.mode}' has no participating items to seed a running result from`);let d=e.combiner.mode===`max`?`gt`:`lt`,f;for(let t of u){let r=await Wj(e.combiner.item,t,n,void 0,i,a,o,s,c+1);if(r.status===`indeterminate`)return r;if(f===void 0){f=r.value;continue}let l=kj(d,r.value,f);if(l.status===`indeterminate`)return l;l.value&&(f=r.value)}if(f===void 0)throw Error(`unreachable: max/min over a non-empty participating list produced no running result`);return Q(f)}case`delegate`:{if(n.resolveDelegate===void 0)return $(`wrong-type`,`no delegate handler registered for external system '${e.system}'`);let r=await n.resolveDelegate(e.system,e.payload,t);return r.found?Q(r.value):$(`not-found`,`delegate handler for external system '${e.system}' reported no value`)}case`treeReference`:{if(n.resolveTree===void 0)return $(`wrong-type`,`no tree resolver registered for treeReference nodes`);let l=JSON.stringify(e.key);if(a.has(l))return $(`domain-error`,`circular treeReference detected`);if(o>=100)return $(`domain-error`,`treeReference chain exceeds the maximum depth of 100`);let u=await n.resolveTree(e.key,t);if(!u.found)return $(`not-found`,`treeReference key did not resolve to a tree`);let d=YA.safeParse(u.node);return d.success?Wj(d.data,t,n,r,i,new Set([...a,l]),o+1,s,c+1):$(`wrong-type`,`the referenced tree is not a valid ExpressionNode`)}default:throw Error(`unreachable expression node kind`)}}function Gj({functions:e=XA,maxNodes:t=ZA,maxNestingDepth:n=500}){return{evaluatePredicate:async(r,i,a)=>Uj(r,i,a,void 0,e,new Set,0,QA(t,n),0),evaluateValue:async(r,i,a)=>Wj(r,i,a,void 0,e,new Set,0,QA(t,n),0)}}var{evaluatePredicate:Kj,evaluateValue:qj}=Gj({}),Jj=UT(PA),Yj=`bearer-is`,Xj=`expires-at`,Zj=`scope-narrows`,Qj=`capability-is`,$j=`depth-remaining`,eM=[Yj,Xj,Zj,Qj,$j];function tM(e){return e===`bearer-is`||e===`expires-at`||e===`scope-narrows`||e===`capability-is`||e===`depth-remaining`}var nM=`grantee-is`,rM=`granted-capability-is`;function iM(e){return e===`grantee-is`||e===`granted-capability-is`}var aM={[nM]:(e,t)=>t.subject===void 0||typeof e!=`string`?{found:!1}:sM(AO(t.subject.bearer)===e),[rM]:(e,t)=>t.subject===void 0||typeof e!=`string`?{found:!1}:sM(t.subject.capability===e)};function oM(e,t){return{kind:`not`,operand:{kind:`and`,left:lM(rM,e),right:lM(nM,AO(t))}}}function sM(e){return{found:!0,value:{kind:`boolean`,value:e}}}var cM={[Yj]:(e,t)=>t.parentClaims===void 0?sM(!1):sM(iA(t.parentClaims.bearer,t.childIssuer)),[Xj]:(e,t)=>t.parentClaims===void 0?sM(!1):sM(t.candidate.expires<=t.parentClaims.expires),[Zj]:(e,t)=>t.parentClaims===void 0?sM(!1):sM(sA(t.parentClaims.scope,t.candidate.scope)),[Qj]:(e,t)=>t.parentClaims===void 0?sM(!1):sM(t.parentClaims.capability===t.candidate.capability),[$j]:(e,t)=>{if(t.parentClaims===void 0)return sM(!1);let n=t.parentClaims[`delegations-remaining`];return sM(n===void 0||t.candidate.delegationsRemaining!==void 0&&t.candidate.delegationsRemaining<n)}};function lM(e,t=null){return{kind:`compare`,op:`eq`,left:{kind:`delegate`,system:e,payload:t},right:{kind:`booleanLiteral`,value:!0}}}var uM=async()=>Promise.resolve({found:!1}),dM=async()=>Promise.resolve({found:!1}),fM=async()=>Promise.resolve([]);async function pM(e,t,n){let r={childIssuer:t,candidate:n,parentClaims:e},i={resolveValue:uM,resolveLookup:dM,resolveCollection:fM,resolveDelegate:async(e,t)=>tM(e)?cM[e](t,r):{found:!1}};return nA(eM,async e=>{let t=await Kj(lM(e),r,i);return t.status!==`definite`||!t.value})}async function mM(e,t,n,r={},i){let a=i===void 0?{clock:n,claims:t}:{clock:n,claims:t,subject:i},o={resolveValue:uM,resolveLookup:dM,resolveCollection:fM,resolveDelegate:async(e,t)=>{if(i!==void 0&&iM(e))try{return await aM[e](t,a)}catch{return{found:!1}}let n=Object.hasOwn(r,e)?r[e]:void 0;if(n===void 0)return{found:!1};try{return await n(t,a)}catch{return{found:!1}}}};return await nA(e,async e=>{let t=await Kj(e,a,o);return t.status!==`definite`||!t.value})===void 0?{ok:!0}:{ok:!1,reason:`not_satisfied`}}var hM=`manage:grant`,gM=64;function _M(e,t){return Mg([`Signature1`,e,new Uint8Array,t],hg)}function vM(e){return Uint8Array.from(e)}function yM(e){return vM(Mg(e,hg))}function bM(e){return yM({1:e.identityKey.alg,4:e.deviceId})}function xM(e){let[,,t]=e;if(t===null)return;let n;try{n=b_(t,x_)}catch{return}let r=rO.safeParse(n);return r.success?r.data:void 0}async function SM(e,t){let n=await TM(e,{identity:t.identity,clock:t.clock,revocation:t.revocation,...t.extraPredicateResolvers===void 0?{}:{extraPredicateResolvers:t.extraPredicateResolvers}});return n.ok&&t.expectedBearer!==void 0&&!iA(n.claims.bearer,t.expectedBearer)?{ok:!1,reason:`bearer_mismatch`}:n}async function CM(e,t,n){if(iA(e.issuer,t.issuer))return!0;if(e.authorization===void 0)return!1;let r;try{r=b_(e.authorization,x_)}catch{return!1}let i=nO.safeParse(r);if(!i.success)return!1;let a=await SM(i.data,{...n,expectedBearer:e.issuer});return a.ok&&a.claims.capability===`manage:revoke`&&sA(a.claims.scope,t.scope)}var wM={depth:0,seen:new Set};async function TM(e,t,{subjectClaims:n,depth:r,seen:i}=wM){let[a,,o,s]=e;if(o===null)return{ok:!1,reason:`malformed`};if(r>=gM)return{ok:!1,reason:`chain_too_deep`};let c=kO(o);if(i.has(c))return{ok:!1,reason:`chain_cycle`};let l=new Set(i).add(c),u;try{u=b_(o,x_)}catch{return{ok:!1,reason:`malformed`}}let d=rO.safeParse(u);if(!d.success)return{ok:!1,reason:`malformed`};let f=d.data;if(!await pk(t.identity,f[`issuer-key`],_M(a,o),s))return{ok:!1,reason:`bad_signature`};if(!iA(await t.identity.deriveDeviceId(f[`issuer-key`][`public-key`]),f.issuer))return{ok:!1,reason:`wrong_issuer`};let p=t.clock.now();if(f.expires<=p)return{ok:!1,reason:`expired`};if(f[`not-before`]!==void 0&&f[`not-before`]>p)return{ok:!1,reason:`not_yet_valid`};let m=f[`valid-until`];if(m!==void 0&&m<=p)return{ok:!1,reason:`content_expired`};if(await nA(await t.revocation.entriesFor(f[`token-id`]),async e=>CM(e,f,t))!==void 0)return{ok:!1,reason:`revoked`};if(f.conditions!==void 0){let e;try{e=b_(f.conditions,x_)}catch{return{ok:!1,reason:`conditions_invalid`}}let r=Jj.safeParse(e);if(!r.success)return{ok:!1,reason:`conditions_invalid`};if(!(await mM(r.data,f,t.clock,t.extraPredicateResolvers,n)).ok)return{ok:!1,reason:`conditions_not_satisfied`}}let h=f.parent,g=f[`authorised-by`];if(f.capability===`manage:grant`&&h!==void 0)return{ok:!1,reason:`authorisation_invalid`};if(h!==void 0&&g!==void 0)return{ok:!1,reason:`malformed`};if(h!==void 0){let e;try{e=b_(h,x_)}catch{return{ok:!1,reason:`parent_invalid`}}let n=nO.safeParse(e);if(!n.success)return{ok:!1,reason:`parent_invalid`};let i=await TM(n.data,t,{depth:r+1,seen:l});if(!i.ok)return i.reason===`chain_too_deep`||i.reason===`chain_cycle`?{ok:!1,reason:i.reason}:{ok:!1,reason:`parent_invalid`};let a={capability:f.capability,scope:f.scope,expires:f.expires,...f[`delegations-remaining`]===void 0?{}:{delegationsRemaining:f[`delegations-remaining`]}};return await pM(i.claims,f.issuer,a)===void 0?{ok:!0,claims:f,rootIssuer:i.rootIssuer,rootIssuerKey:i.rootIssuerKey,depth:i.depth+1}:{ok:!1,reason:`delegation_exceeds_parent`}}if(g!==void 0){let e;try{e=b_(g,x_)}catch{return{ok:!1,reason:`authorisation_invalid`}}let n=nO.safeParse(e);if(!n.success)return{ok:!1,reason:`authorisation_invalid`};let i=await TM(n.data,t,{subjectClaims:f,depth:r+1,seen:l});if(!i.ok)return i.reason===`chain_too_deep`||i.reason===`chain_cycle`?{ok:!1,reason:i.reason}:{ok:!1,reason:`authorisation_invalid`};let a=i.claims,o=a[`grants-capability`];return iA(a.bearer,f.issuer)&&a.capability===`manage:grant`&&(o===void 0||o===f.capability)&&sA(a.scope,f.scope)&&f.expires<=a.expires&&(a[`delegations-remaining`]===void 0||f[`delegations-remaining`]!==void 0&&f[`delegations-remaining`]<a[`delegations-remaining`])?{ok:!0,claims:f,rootIssuer:i.rootIssuer,rootIssuerKey:i.rootIssuerKey,depth:i.depth+1}:{ok:!1,reason:`authorisation_invalid`}}return{ok:!0,claims:f,rootIssuer:f.issuer,rootIssuerKey:f[`issuer-key`],depth:0}}async function EM(e,t){let[n,,r,i]=e;if(r===null)return{ok:!1,reason:`malformed`};let a;try{a=b_(r,x_)}catch{return{ok:!1,reason:`malformed`}}let o=mD.safeParse(a);if(!o.success)return{ok:!1,reason:`malformed`};let s=o.data;return await pk(t.identity,s[`issuer-key`],_M(n,r),i)?iA(await t.identity.deriveDeviceId(s[`issuer-key`][`public-key`]),s.issuer)?{ok:!0,claims:s}:{ok:!1,reason:`wrong_issuer`}:{ok:!1,reason:`bad_signature`}}var DM={"bearer-is":`parent_bearer_mismatch`,"expires-at":`expires_exceeds_parent`,"scope-narrows":`scope_does_not_narrow`,"capability-is":`capability_mismatch`,"depth-remaining":`delegation_exceeds_parent`};async function OM(e,t,n){let r=await pM(e,t,n);return r===void 0?void 0:DM[r]}async function kM(e,t,n){if(e.parent!==void 0)return`authorisation_parent_forbidden`;if(!iA(e.bearer,t))return`authorisation_bearer_mismatch`;let r=e[`grants-capability`];if(e.capability!==`manage:grant`||r!==void 0&&r!==n.capability)return`authorisation_capability_mismatch`;if(!sA(e.scope,n.scope))return`authorisation_scope_does_not_narrow`;if(n.expires>e.expires)return`authorisation_exceeds_authoriser`;let i=e[`delegations-remaining`];if(i!==void 0&&(n.delegationsRemaining===void 0||n.delegationsRemaining>=i))return`authorisation_delegation_exceeds`;if(e.conditions!==void 0){let t;try{t=b_(e.conditions,x_)}catch{return`authorisation_malformed`}let r=Jj.safeParse(t);if(!r.success)return`authorisation_malformed`;if(!(await mM(r.data,e,{now:()=>0},{},n)).ok)return`authorisation_conditions_not_satisfied`}}async function AM(e){for(let t of[e.capability,e.grantsCapability,e.requestsCapability])if(t!==void 0&&!YD.safeParse(t).success)return{ok:!1,reason:`invalid_capability`};if(e.expires<=e.clock.now())return{ok:!1,reason:`already_expired`};if(e.parent!==void 0&&e.authorisedBy!==void 0)return{ok:!1,reason:`links_exclusive`};if(e.capability===`manage:grant`&&e.parent!==void 0)return{ok:!1,reason:`authorisation_parent_forbidden`};let t;if(e.parent!==void 0){let n=xM(e.parent);if(n===void 0)return{ok:!1,reason:`parent_malformed`};let r=await OM(n,e.identity.deviceId,{capability:e.capability,scope:e.scope,expires:e.expires,...e.delegationsRemaining===void 0?{}:{delegationsRemaining:e.delegationsRemaining}});if(r!==void 0)return{ok:!1,reason:r};t=yM(e.parent)}let n;if(e.authorisedBy!==void 0){let t=xM(e.authorisedBy);if(t===void 0)return{ok:!1,reason:`authorisation_malformed`};let r=await kM(t,e.identity.deviceId,{capability:e.capability,scope:e.scope,bearer:e.bearer,expires:e.expires,...e.delegationsRemaining===void 0?{}:{delegationsRemaining:e.delegationsRemaining}});if(r!==void 0)return{ok:!1,reason:r};n=yM(e.authorisedBy)}let r=yM({"token-id":e.tokenId,issuer:e.identity.deviceId,"issuer-key":e.identity.identityKey,bearer:e.bearer,capability:e.capability,scope:e.scope,expires:e.expires,...e.notBefore===void 0?{}:{"not-before":e.notBefore},...t===void 0?{}:{parent:t},...e.delegationsRemaining===void 0?{}:{"delegations-remaining":e.delegationsRemaining},...e.conditions===void 0?{}:{conditions:yM(e.conditions)},...n===void 0?{}:{"authorised-by":n},...e.grantsCapability===void 0?{}:{"grants-capability":e.grantsCapability},...e.requestsCapability===void 0?{}:{"requests-capability":e.requestsCapability}}),i=bM(e.identity);return{ok:!0,token:[i,{},r,await e.identity.sign(_M(i,r))]}}async function jM(e){let t=yM({"token-id":e.tokenId,issuer:e.identity.deviceId,"issuer-key":e.identity.identityKey,"revoked-at":e.revokedAt}),n=bM(e.identity);return[n,{},t,await e.identity.sign(_M(n,t))]}var MM=`wm-grant1.`;function NM(e){let t=e[2];if(t===null)return;let n;try{n=b_(t,x_)}catch{return}let r=rO.safeParse(n);return r.success?r.data:void 0}function PM(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function FM(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r}function IM(e){return MM+PM(Mg(e,hg))}function LM(e){let t=e.trim();if(!t.startsWith(`wm-grant1.`))throw Error(`a grant code starts with "${MM}"`);let n;try{n=b_(FM(t.slice(10)),x_)}catch{throw Error(`the grant code is damaged: it does not decode`)}let r=nO.safeParse(n);if(!r.success||NM(r.data)===void 0)throw Error(`the grant code does not carry a capability token`);return r.data}async function RM(e,t){let n=await SM(e,t);return n.ok?{kind:`valid`}:{kind:`invalid`,reason:n.reason}}var zM={malformed:`malformed`,bad_signature:`signature does not verify`,wrong_issuer:`issuer does not match its key`,bearer_mismatch:`names another bearer`,expired:`expired`,not_yet_valid:`not valid yet`,content_expired:`content expired`,revoked:`revoked`,delegation_exceeds_parent:`exceeds what its parent allows`,parent_invalid:`its parent grant is no longer valid`,conditions_invalid:`its conditions are invalid`,conditions_not_satisfied:`its conditions are not met`,authorisation_invalid:`exceeds what its authorising grant allows`,chain_too_deep:`its chain is deeper than allowed`,chain_cycle:`its chain revisits a token`};function BM(e){return e.kind===`valid`?`valid`:zM[e.reason]}var VM=`grant/`;function HM(e,t){return`${VM}${e}/${t}`}function UM(e){let t=e.slice(6).split(`/`)[0];if(t===`held`||t===`issued`)return t;throw Error(`stored grant key ${e} names no direction`)}function WM(e){return typeof e==`object`&&!!e&&`token`in e&&`recordedAt`in e&&typeof e.recordedAt==`number`}function GM(e){let t=new Set;return{async record(n,r,i){let a=NM(r);if(a===void 0)throw Error(`a grant must carry readable token claims`);let o=HM(n,kO(a[`token-id`]));if(await e.get(o)===void 0){await e.set(o,new Uint8Array(Mg({token:r,recordedAt:i},hg)));for(let e of t)e()}},async list(){let t=[],n=await e.keys(VM),r=await Promise.all(n.map(async t=>({key:t,value:await e.get(t)})));for(let{key:e,value:n}of r){if(n===void 0)continue;let r=b_(n,x_);if(!WM(r))throw Error(`stored grant at ${e} is malformed`);let i=nO.safeParse(r.token);if(!i.success)throw Error(`stored grant at ${e} is malformed`);let a=NM(i.data);if(a===void 0)throw Error(`stored grant at ${e} has unreadable claims`);t.push({tokenId:kO(a[`token-id`]),direction:UM(e),token:i.data,claims:a,recordedAt:r.recordedAt})}return t.sort((e,t)=>t.recordedAt-e.recordedAt)},subscribe(e){return t.add(e),()=>{t.delete(e)}}}}function KM(e){return kO(e)}function qM(){let e=new Map;return{async entriesFor(t){return Promise.resolve(e.get(KM(t))??[])},async record(t,n){let r=await EM(t,n);if(r.ok){let t=KM(r.claims[`token-id`]),n=e.get(t);n===void 0?e.set(t,[r.claims]):n.push(r.claims)}return r}}}var JM=`revocation/`;async function YM(e,t,n){let r;try{r=b_(n,x_)}catch{return`it is not valid CBOR`}let i=hD.safeParse(r);if(!i.success)return`it is not a revocation entry`;let a=await e.record(i.data,{identity:t});return a.ok?void 0:`it no longer verifies (${a.reason})`}async function XM(e){let{storage:t,identity:n,clock:r}=e,i=qM(),a=new Set;async function o(e){let r=await i.record(e,{identity:n});if(r.ok){let n=`${JM}${kO(r.claims.issuer)}/${kO(r.claims[`token-id`])}`;await t.set(n,new Uint8Array(Mg(e,hg)));for(let e of a)e()}return r}let s=await t.keys(JM),c=(await Promise.all(s.map(async e=>{let r=await t.get(e);if(r===void 0)return;let a=await YM(i,n,r);return a===void 0?void 0:{key:e,reason:a}}))).filter(e=>e!==void 0);return{view:i,unreadable:()=>c,async discardUnreadable(e){await t.delete(e),c=c.filter(t=>t.key!==e);for(let e of a)e()},subscribe(e){return a.add(e),()=>{a.delete(e)}},ingest:o,async revoke(e){let t=await jM({identity:n,tokenId:e,revokedAt:r.now()}),i=await o(t);if(!i.ok)throw Error(`the revocation this device signed does not verify (${i.reason})`);return t}}}var ZM=`preferences/intro-dismissed`,QM=new Uint8Array([1]);function $M(e){return{async introDismissed(){return await e.get(ZM)!==void 0},async setIntroDismissed(t){t?await e.set(ZM,new Uint8Array(QM)):await e.delete(ZM)}}}var eN=`agent/self`,tN=`wire-mesh-console`;function nN(e){return e.slice(0,12)}var rN=/[\p{Cc}\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/gu;function iN(e){let t=e.replace(rN,``).trim();if(t!==``)return Array.from(t).slice(0,64).join(``).trimEnd()}function aN(e){let t=e[eN];if(typeof t==`object`&&t&&`name`in t&&typeof t.name==`string`)return iN(t.name)}function oN(e){return{[eN]:{name:e,harness:tN}}}function sN(e,t,n,r){return t===void 0?n===void 0?{primary:nN(e),secondary:void 0,source:`id`,matchesPetname:!1}:{primary:n,secondary:nN(e),source:`self`,matchesPetname:r.has(n)}:{primary:t,secondary:n!==void 0&&n!==t?n:void 0,source:`petname`,matchesPetname:!1}}function cN(e){return e.source===`self`&&e.secondary!==void 0?`${e.primary} (${e.secondary})`:e.primary}var lN=`petname/`,uN=`self-name`,dN=new TextEncoder,fN=new TextDecoder;function pN(e){async function t(t,n){let r=iN(n);if(r===void 0){await e.delete(t);return}await e.set(t,new Uint8Array(dN.encode(r)))}return{async petnames(){let t=new Map,n=await e.keys(lN),r=await Promise.all(n.map(async t=>({key:t,value:await e.get(t)})));for(let{key:e,value:n}of r)n!==void 0&&t.set(e.slice(8),fN.decode(n));return t},async setPetname(e,n){await t(lN+e,n)},async selfName(){let t=await e.get(uN);return t===void 0?void 0:fN.decode(t)},async setSelfName(e){await t(uN,e)}}}var mN=String(2**53-1).length,hN=`message`;function gN(e,t){return`${hN}/${e}/${String(t.sentAt).padStart(mN,`0`)}-${kO(t.messageId)}`}function _N(e){let t=e.slice(`${hN}/`.length);return t.slice(0,t.lastIndexOf(`/`))}function vN(e){return e===`sent`||e===`received`}function yN(e){return typeof e!=`object`||!e||!(`direction`in e)||!(`text`in e)||!(`messageId`in e)||!(`sentAt`in e)?!1:vN(e.direction)&&typeof e.text==`string`&&e.messageId instanceof Uint8Array&&typeof e.sentAt==`number`}function bN(e){return{async append(t,n){await e.set(gN(t,n),new Uint8Array(Mg(n,hg)))},async roomPaths(){let t=await e.keys(`${hN}/`);return[...new Set(t.map(_N))]},async list(t){let n=(await e.keys(`${hN}/${t}/`)).sort(),r=[],i=await Promise.all(n.map(async t=>({key:t,value:await e.get(t)})));for(let{key:e,value:t}of i){if(t===void 0)continue;let n=b_(t,x_);if(!yN(n))throw Error(`stored message at ${e} is malformed`);r.push(n)}return r}}}function xN(e){typeof e==`object`&&e&&`unref`in e&&typeof e.unref==`function`&&Reflect.apply(e.unref,e,[])}var SN=1e3;function CN(e){return JSON.stringify(String(e).slice(0,256))}function wN(e,t){let n=e=>{console.error(`the fault callback failed: ${CN(e)}`)};try{let r=e(t);typeof r==`object`&&r&&`then`in r&&typeof r.then==`function`&&Promise.resolve(r).catch(n)}catch(e){n(e)}}function TN(){return performance.now()}function EN(e=TN){let t=new Map,n={since:-1/0,used:0},r={count:0};function i(e){return e-n.since>=1e3&&(n.since=e,n.used=0),n.used>=64?!1:(n.used+=1,!0)}function a(){let e=r.count;return r.count=0,e}function o(n){let r=t.get(n);if(r===void 0||r.timer!==void 0)return;let i=Math.max(0,r.since+SN-e()),a=setTimeout(()=>{s(n)},i);xN(a),r.timer=a}function s(n){let r=t.get(n);if(r===void 0)return;r.timer=void 0;let{latest:s}=r;if(r.pending===0||s===void 0)return;let c=e();if(r.since=c,!i(c)){o(n);return}let l=r.pending-1;r.pending=0,r.latest=void 0,wN(s,l+a())}function c(){let e=t.entries().next();if(e.done===!0)return;let[n,i]=e.value;clearTimeout(i.timer),t.delete(n),r.count+=i.pending}return(n,r)=>{let s=e(),l=t.get(n);if(l!==void 0&&s-l.since<1e3){l.pending+=1,l.latest=r,o(n);return}let u=l?.pending??0;clearTimeout(l?.timer),t.delete(n);let d={since:s,pending:u,latest:l?.latest,timer:void 0};if(t.set(n,d),t.size>1024&&c(),!i(s)){d.pending+=1,d.latest=r,o(n);return}d.pending=0,d.latest=void 0,wN(r,u+a())}}function DN(e,t=ON){e.catch(e=>{t(e)})}function ON(e){console.error(`background work failed: ${CN(e)}`)}async function kN(e,t,n={}){let{onFault:r,signal:i}=n,a=EN(n.now),o=(e,t)=>{if(r!==void 0)try{let i=n.sourceOf?.(t)??``;a(i,async n=>r(e,t,n))}catch(e){console.error(`could not report a failure: ${CN(e)}`)}},s=e=>{r!==void 0&&wN(async t=>r(e,void 0,t),0)},c=e[Symbol.asyncIterator](),l,u=()=>{l??=c.return?.().catch(s)};i?.addEventListener(`abort`,u,{once:!0});async function d(){if(i?.aborted===!0)return!1;let e=await c.next();if(e.done===!0)return!1;try{await t(e.value)}catch(t){o(t,e.value)}return!0}await new Promise(e=>{let t=()=>{d().then(n=>{n?t():e()},t=>{s(t),e()})};t()}),i?.removeEventListener(`abort`,u),i?.aborted===!0&&u(),await l}var AN={result:`error`,code:`internal-error`};async function jN(e,t,n={}){await kN(e,async e=>{let n={answered:!1},r={...e,respond:async t=>{n.answered=!0,await e.respond(t)}};try{await t(r)}catch(t){throw n.answered||await e.respond(AN).catch(()=>void 0),t}},{...n,sourceOf:n.sourceOf??(e=>e.fromDevice===void 0?``:AO(e.fromDevice))})}function MN(e){return new Uint8Array(Mg(e,hg))}function NN(e,t){return{type:`relay-data`,payload:MN(e),...t===void 0?{}:{"to-device":t}}}var PN=class extends Error{constructor(e){super(e),this.name=`SchemaInvalidFrameError`}};function FN(e){let t=b_(new Uint8Array(e),x_),n=ZE.safeParse(t);if(!n.success)throw new PN(n.error.message);return n.data}function IN(e){let t;try{t=b_(e,x_)}catch{return null}let n=ZE.safeParse(t);return n.success?n.data:null}var LN=16,RN=4096;function zN(e){let t=0;for(let n of e)t+=String(n.length).length+1+n.length;return t}function BN(...e){let t=``;for(let n of e){t+=`${String(n.length)}:`;for(let e=0;e<n.length;e+=RN)t+=String.fromCharCode(...n.subarray(e,e+RN))}return t}async function VN(e){return await e()??!1}function HN(e){let t=new Map,n=0,r=0,i=e=>{let r=t.get(e);r!==void 0&&(t.delete(e),n-=r.cost)};return{async verdict(a,o){let s=zN(a)+LN;if(s>e||r+s>e)return VN(o);let c=BN(...a),l=t.get(c);if(l!==void 0)return t.delete(c),t.set(c,l),l.settled;r+=s;let u=o().then(e=>e===void 0?(i(c),!1):e).finally(()=>{r-=s});t.set(c,{settled:u,cost:s}),n+=s;for(let r of t.keys()){if(n<=e)break;i(r)}return u}}}var UN=1024,WN=UN*UN*8,GN=new WeakMap;function KN(e){let t=GN.get(e);if(t!==void 0)return t;let n=HN(WN);return GN.set(e,n),n}var qN=`signature`,JN=`identity-key`,YN=new TextEncoder().encode(`wire-mesh/peer-advert/v1\0`);function XN(e){let t={};for(let[n,r]of Object.entries(e))n!==`signature`&&(t[n]=r);let n=Mg(t,hg),r=new Uint8Array(YN.length+n.length);return r.set(YN,0),r.set(n,YN.length),r}async function ZN(e,t){let n=await e.sign(XN(t));return{...t,[qN]:n}}async function QN(e,t){let n;try{n=XN(t)}catch{return!1}return KN(e).verdict([t[qN],n],async()=>$N(e,t,n))}async function $N(e,t,n){let r=t[JN];try{return iA(await e.deriveDeviceId(r[`public-key`]),t.device)?await e.verify(r,n,t[qN]):!1}catch{return}}var eP={name:`wire-mesh-core`,version:`4.2.0`,dependencies:{cbor2:`2.3.0`,"cddl.js":`2.0.0`,trilean:`1.6.2`,zod:`4.6.6`},devDependencies:{"@arethetypeswrong/cli":`0.18.5`,"@exadev/eslint-config":`3.0.0`,"@stryker-mutator/api":`10.0.0`,"@stryker-mutator/core":`10.0.0`,"@stryker-mutator/typescript-checker":`10.0.0`,"@types/node":`26.4.1`,eslint:`10.10.0`,"eslint-config-prettier":`10.1.8`,"eslint-plugin-prettier":`5.5.6`,globals:`17.12.0`,jiti:`2.7.0`,prettier:`3.9.6`,tsdown:`0.23.0`,turbo:`2.10.12`,typescript:`6.0.3`,vitest:`5.0.0`,"wire-mesh-core-released":`npm:wire-mesh-core@4.1.5`},exports:{"./adapters/byte-stream-connection":{import:`./dist/adapters/byte-stream-connection.mjs`,require:`./dist/adapters/byte-stream-connection.cjs`},"./adapters/frame-codec":{import:`./dist/adapters/frame-codec.mjs`,require:`./dist/adapters/frame-codec.cjs`},"./adapters/memory-storage":{import:`./dist/adapters/memory-storage.mjs`,require:`./dist/adapters/memory-storage.cjs`},"./adapters/node-fs-storage":{import:`./dist/adapters/node-fs-storage.mjs`,require:`./dist/adapters/node-fs-storage.cjs`},"./adapters/node-identity":{import:`./dist/adapters/node-identity.mjs`,require:`./dist/adapters/node-identity.cjs`},"./adapters/system-clock":{import:`./dist/adapters/system-clock.mjs`,require:`./dist/adapters/system-clock.cjs`},"./adapters/tcp-transport":{import:`./dist/adapters/tcp-transport.mjs`,require:`./dist/adapters/tcp-transport.cjs`},"./adapters/threshold-identity":{import:`./dist/adapters/threshold-identity.mjs`,require:`./dist/adapters/threshold-identity.cjs`},"./adapters/threshold-wasm":{import:`./dist/adapters/threshold-wasm.mjs`,require:`./dist/adapters/threshold-wasm.cjs`},"./adapters/tls-transport":{import:`./dist/adapters/tls-transport.mjs`,require:`./dist/adapters/tls-transport.cjs`},"./domain/advert-extension-policy":{import:`./dist/domain/advert-extension-policy.mjs`,require:`./dist/domain/advert-extension-policy.cjs`},"./domain/async-queue":{import:`./dist/domain/async-queue.mjs`,require:`./dist/domain/async-queue.cjs`},"./domain/bulk":{import:`./dist/domain/bulk.mjs`,require:`./dist/domain/bulk.cjs`},"./domain/capability-grant":{import:`./dist/domain/capability-grant.mjs`,require:`./dist/domain/capability-grant.cjs`},"./domain/capability-request":{import:`./dist/domain/capability-request.mjs`,require:`./dist/domain/capability-request.cjs`},"./domain/channel-exhausted-error":{import:`./dist/domain/channel-exhausted-error.mjs`,require:`./dist/domain/channel-exhausted-error.cjs`},"./domain/consume-incoming":{import:`./dist/domain/consume-incoming.mjs`,require:`./dist/domain/consume-incoming.cjs`},"./domain/coordinator-election":{import:`./dist/domain/coordinator-election.mjs`,require:`./dist/domain/coordinator-election.cjs`},"./domain/data-sync":{import:`./dist/domain/data-sync.mjs`,require:`./dist/domain/data-sync.cjs`},"./domain/device-id":{import:`./dist/domain/device-id.mjs`,require:`./dist/domain/device-id.cjs`},"./domain/direct-manage-request":{import:`./dist/domain/direct-manage-request.mjs`,require:`./dist/domain/direct-manage-request.cjs`},"./domain/ed25519-identity-key":{import:`./dist/domain/ed25519-identity-key.mjs`,require:`./dist/domain/ed25519-identity-key.cjs`},"./domain/erasure-coding":{import:`./dist/domain/erasure-coding.mjs`,require:`./dist/domain/erasure-coding.cjs`},"./domain/fault-report":{import:`./dist/domain/fault-report.mjs`,require:`./dist/domain/fault-report.cjs`},"./domain/gossip-expansion":{import:`./dist/domain/gossip-expansion.mjs`,require:`./dist/domain/gossip-expansion.cjs`},"./domain/gossip-extensions":{import:`./dist/domain/gossip-extensions.mjs`,require:`./dist/domain/gossip-extensions.cjs`},"./domain/grant-candidates":{import:`./dist/domain/grant-candidates.mjs`,require:`./dist/domain/grant-candidates.cjs`},"./domain/group-key":{import:`./dist/domain/group-key.mjs`,require:`./dist/domain/group-key.cjs`},"./domain/handshake":{import:`./dist/domain/handshake.mjs`,require:`./dist/domain/handshake.cjs`},"./domain/hub-mailbox":{import:`./dist/domain/hub-mailbox.mjs`,require:`./dist/domain/hub-mailbox.cjs`},"./domain/mesh-session":{import:`./dist/domain/mesh-session.mjs`,require:`./dist/domain/mesh-session.cjs`},"./domain/notice-board":{import:`./dist/domain/notice-board.mjs`,require:`./dist/domain/notice-board.cjs`},"./domain/path-trace":{import:`./dist/domain/path-trace.mjs`,require:`./dist/domain/path-trace.cjs`},"./domain/peer-advert":{import:`./dist/domain/peer-advert.mjs`,require:`./dist/domain/peer-advert.cjs`},"./domain/ping-round-trips":{import:`./dist/domain/ping-round-trips.mjs`,require:`./dist/domain/ping-round-trips.cjs`},"./domain/pinned-address":{import:`./dist/domain/pinned-address.mjs`,require:`./dist/domain/pinned-address.cjs`},"./domain/relay-advert":{import:`./dist/domain/relay-advert.mjs`,require:`./dist/domain/relay-advert.cjs`},"./domain/relay-hub":{import:`./dist/domain/relay-hub.mjs`,require:`./dist/domain/relay-hub.cjs`},"./domain/relay-use-gate":{import:`./dist/domain/relay-use-gate.mjs`,require:`./dist/domain/relay-use-gate.cjs`},"./domain/revocation-view":{import:`./dist/domain/revocation-view.mjs`,require:`./dist/domain/revocation-view.cjs`},"./domain/room":{import:`./dist/domain/room.mjs`,require:`./dist/domain/room.cjs`},"./domain/room-path":{import:`./dist/domain/room-path.mjs`,require:`./dist/domain/room-path.cjs`},"./domain/room-rekey":{import:`./dist/domain/room-rekey.mjs`,require:`./dist/domain/room-rekey.cjs`},"./domain/room-token-verification":{import:`./dist/domain/room-token-verification.mjs`,require:`./dist/domain/room-token-verification.cjs`},"./domain/shard-manifest":{import:`./dist/domain/shard-manifest.mjs`,require:`./dist/domain/shard-manifest.cjs`},"./domain/threshold-subject":{import:`./dist/domain/threshold-subject.mjs`,require:`./dist/domain/threshold-subject.cjs`},"./domain/token-predicates":{import:`./dist/domain/token-predicates.mjs`,require:`./dist/domain/token-predicates.cjs`},"./domain/token-scope":{import:`./dist/domain/token-scope.mjs`,require:`./dist/domain/token-scope.cjs`},"./domain/tokens":{import:`./dist/domain/tokens.mjs`,require:`./dist/domain/tokens.cjs`},"./domain/topology":{import:`./dist/domain/topology.mjs`,require:`./dist/domain/topology.cjs`},"./domain/topology-snapshot":{import:`./dist/domain/topology-snapshot.mjs`,require:`./dist/domain/topology-snapshot.cjs`},"./domain/verdict-cache":{import:`./dist/domain/verdict-cache.mjs`,require:`./dist/domain/verdict-cache.cjs`},"./domain/webrtc-signaling":{import:`./dist/domain/webrtc-signaling.mjs`,require:`./dist/domain/webrtc-signaling.cjs`},"./generated/protocol":{import:`./dist/generated/protocol.mjs`,require:`./dist/generated/protocol.cjs`},"./generated/runtime":{import:`./dist/generated/runtime.mjs`,require:`./dist/generated/runtime.cjs`},"./ports/clock":{import:`./dist/ports/clock.mjs`,require:`./dist/ports/clock.cjs`},"./ports/identity":{import:`./dist/ports/identity.mjs`,require:`./dist/ports/identity.cjs`},"./ports/storage":{import:`./dist/ports/storage.mjs`,require:`./dist/ports/storage.cjs`},"./ports/transport":{import:`./dist/ports/transport.mjs`,require:`./dist/ports/transport.cjs`},"./package.json":`./package.json`},files:[`dist`,`wasm-dist`],license:`MIT`,packageManager:`pnpm@12.4.1+sha512.2e81e399d73fe8390dab25e06aa788ab7a5908248d2f5a370f82b481147a6a7a367bf8048f9a6fdb6460f21a66f0542dedb8b94ca2c8723596741920b1656d4c`,publishConfig:{provenance:!0,access:`public`},repository:{type:`git`,url:`https://github.com/ExaDev/wire-mesh.git`,directory:`ts/packages/core`},scripts:{_build:`tsdown`,"_build-wasm":`./scripts/build-threshold-wasm.sh`,"_conformance-check":`vitest run test/conformance.unit.test.ts`,_generate:`node generate.ts`,_lint:`eslint . --fix --cache --max-warnings 0`,_mutation:`stryker run stryker.config.ts`,_test:`vitest run`,_typecheck:`tsc -p tsconfig.json --noEmit && tsc -p tsconfig.node.json --noEmit`,build:`turbo run _build`,"build-wasm":`turbo run _build-wasm`,"conformance-check":`turbo run _conformance-check`,generate:`turbo run _generate`,lint:`turbo run _lint`,mutation:`turbo run _mutation`,prepack:`node scripts/assert-wasm-dist.ts`,test:`turbo run _test`,typecheck:`turbo run _typecheck`},type:`module`}.version,tP=`wire-mesh/version`,nP=`version.get`;function rP(e){return`verb`in e&&e.verb===nP}function iP(){return{result:`ok`,version:eP}}var aP=new Set([`device`,`addresses`,`snapshot-seconds`,JN,qN]),oP=`topology/peers`,sP=/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/;function cP(e){for(let t of Object.keys(e)){if(aP.has(t))throw Error(`sendGossipUpdate extension key "${t}" collides with a mandatory peer-advert field`);if(t===`topology/peers`)throw Error(`sendGossipUpdate extension key "${t}" collides with a session-managed gossip field`);if(t===`wire-mesh/version`)throw Error(`sendGossipUpdate extension key "${t}" is reserved for wire-mesh-core's own self-reported version`);if(!sP.test(t))throw Error(`sendGossipUpdate extension key "${t}" must be domain-qualified as "<domain>/<field>" (e.g. "presence/status")`)}}function lP(){let e=[],t=[];return{push(n){let r=e.shift();r===void 0?t.push(n):r(n)},stream:{[Symbol.asyncIterator](){let n=!1,r=new Set;return{next:async()=>new Promise(i=>{if(n){i({value:void 0,done:!0});return}let a=t.shift();if(a!==void 0){i({value:a,done:!1});return}let o={},s=e=>{o.release!==void 0&&r.delete(o.release),i({value:e,done:!1})};o.release=()=>{e.splice(e.indexOf(s),1),i({value:void 0,done:!0})},e.push(s),r.add(o.release)}),return:async()=>{n=!0;for(let e of[...r])r.delete(e),e();return Promise.resolve({value:void 0,done:!0})}}}}}}var uP=class extends Error{constructor(){super(`the channel's send counter is exhausted`),this.name=`ChannelExhaustedError`}};function dP(e){return{type:`handshake`,version:1,domains:[...e]}}var fP=[`core/federation`];function pP(e,t){let n=Math.min(e.version,t.version),r=e.domains.filter(e=>!fP.includes(e)&&t.domains.includes(e));return{ok:n>=1&&r.length>0,version:n,sharedDomains:r}}function mP(e){return`data/${AO(e)}/head`}function hP(e,t){return`data/${AO(e)}/entry/${String(t)}`}async function gP(e,t){let n=await e.get(mP(t));return n===void 0?0:Number(new TextDecoder().decode(n))}async function _P(e,t,n){await e.set(mP(t),new TextEncoder().encode(String(n)))}async function vP(e,t){return gP(e,t)}async function yP(e,t){let n=await gP(e.storage,e.identity.deviceId)+1;return await e.storage.set(hP(e.identity.deviceId,n),t),await _P(e.storage,e.identity.deviceId,n),{seq:n,haveFrame:{type:`data-have`,peer:e.identity.deviceId,"head-seq":n}}}async function bP(e,t,n,r){let i=[],a=async n=>{if(n>r)return;let o=await e.get(hP(t,n));o!==void 0&&(i.push(o),await a(n+1))};return await a(n),i}async function xP(e,t,n){let r=await gP(e,t.peer);if(r<=t[`from-seq`])return null;let i=Math.min(r,t[`from-seq`]+n),a=await bP(e,t.peer,t[`from-seq`]+1,i);return a.length===0?null:{type:`data-entries`,peer:t.peer,"from-seq":t[`from-seq`],entries:a}}async function SP(e,t){let n=await gP(e,t.peer);return t[`from-seq`]===n?(await rA(t.entries,async(n,r)=>{await e.set(hP(t.peer,t[`from-seq`]+1+r),n)}),await _P(e,t.peer,t[`from-seq`]+t.entries.length),{ok:!0}):{ok:!1,reason:`gap`}}async function CP(e,t,n){let r=await gP(e,t);return bP(e,t,n+1,r)}function wP(e){return e.type===`data-have`||e.type===`data-request`||e.type===`data-entries`}var TP=class extends Error{constructor(){super(`timed out waiting for pong`),this.name=`PingTimeoutError`}};function EP(){let e=[];function t(t){let n=e.indexOf(t);return n!==-1&&(e.splice(n,1),!0)}return{resolveOldest(t){let n=e.shift();n!==void 0&&n.resolve(t-n.sentAt)},rejectAll(t){for(let n of e.splice(0))n.reject(Error(t))},async sendAndAwait(n,r,i){let a,o=new Promise((t,r)=>{a={sentAt:n,resolve:t,reject:r},e.push(a)});if(a===void 0)throw Error(`the round trip was not registered`);let s=a;o.catch(()=>void 0);try{await r()}catch(e){throw t(s),e}if(i===void 0)return o;let c;return Promise.race([o,new Promise((e,n)=>{c=setTimeout(()=>{t(s)&&n(new TP)},i)})]).finally(()=>{clearTimeout(c)})}}}function DP(e){return e.authenticatedPeer===void 0?e.isAccepted?e.firstAdvertisedPeer??void 0:void 0:e.authenticatedPeer}function OP(e){let t=DP(e);return{direct:t===void 0?[]:[t],relayed:e.relayedDevices.map(e=>({device:e,...t===void 0?{}:{via:t}}))}}function kP(e){let t=null;return{recordAdvert:e=>{t??=e},compute:()=>{let n=e.getAuthenticatedPeer();return OP({...n===void 0?{}:{authenticatedPeer:n},firstAdvertisedPeer:t,isAccepted:e.isAccepted,relayedDevices:e.getRelayedDevices()})}}}function AP(){let e=new Map;return{has:t=>e.has(AO(t)),add:t=>{e.set(AO(t),t)},remove:t=>{e.delete(AO(t))},clear:()=>{e.clear()},list:()=>[...e.values()]}}function jP(e){let t=[];return{record:n=>{t.push(n),t.length>e&&t.splice(0,t.length-e)},entries:()=>[...t]}}var MP=16,NP=256,PP=256,FP=12,IP=4,LP=8,RP=new TextEncoder,zP=RP.encode(`wire-mesh/secure-hello/v1\0`),BP=RP.encode(`wire-mesh/secure-channel/v1\0`),VP=RP.encode(`wire-mesh/secure-data/v1\0`),HP=RP.encode(`lo-to-hi`),UP=RP.encode(`hi-to-lo`),WP={name:`ECDH`,namedCurve:`P-256`};function GP(...e){let t=new Uint8Array(e.reduce((e,t)=>e+t.length,0)),n=0;for(let r of e)t.set(r,n),n+=r.length;return t}function KP(e,t){for(let n=0;n<Math.min(e.length,t.length);n+=1){let r=(e[n]??0)-(t[n]??0);if(r!==0)return r}return e.length-t.length}function qP(e){let t=new Uint8Array(LP);return new DataView(t.buffer).setBigUint64(0,BigInt(e),!1),t}function JP(e,t,n,r){return GP(zP,e,t,n,r)}async function YP(e,t){let n=await crypto.subtle.generateKey(WP,!1,[`deriveBits`]),r=new Uint8Array(await crypto.subtle.exportKey(`raw`,n.publicKey)),i=crypto.getRandomValues(new Uint8Array(MP)),a=await e.sign(JP(r,i,e.deviceId,t));return{peer:t,privateKey:n.privateKey,hello:{type:`secure-hello`,"ephemeral-key":r,nonce:i,"identity-key":e.identityKey,"to-device":t,signature:a}}}async function XP(e,t){let n=t[`identity-key`],r=await e.deriveDeviceId(n[`public-key`]);if(!iA(t[`to-device`],e.deviceId))return{ok:!1,reason:`wrong_recipient`};try{return await e.verify(n,JP(t[`ephemeral-key`],t.nonce,r,e.deviceId),t.signature)?{ok:!0,peer:{deviceId:r,identityKey:n}}:{ok:!1,reason:`bad_signature`}}catch(e){if(!(e instanceof fk))throw e;return{ok:!1,reason:e.fault===`unsupported_alg`?`unsupported_identity_alg`:`invalid_identity_key`}}}async function ZP(e){try{return await crypto.subtle.importKey(`raw`,Uint8Array.from(e),WP,!1,[]),!0}catch{return!1}}var QP=2**53-1;function $P(e){if(!Number.isSafeInteger(e)||e<0)throw RangeError(`firstSendCounter must be a non-negative safe integer`)}function eF(e){if(e>QP)throw new uP;return{counter:e,next:e+1}}function tF(e){let t=new Uint8Array(FP);return t.set(qP(e),IP),t}function nF(e,t,n){return GP(VP,e,t,qP(n))}async function rF({secret:e,salt:t,low:n,high:r,label:i}){let a=await crypto.subtle.importKey(`raw`,Uint8Array.from(e),`HKDF`,!1,[`deriveKey`]);return crypto.subtle.deriveKey({name:`HKDF`,hash:`SHA-256`,salt:Uint8Array.from(t),info:GP(BP,n,r,i)},a,{name:`AES-GCM`,length:NP},!1,[`encrypt`,`decrypt`])}async function iF(e,{pending:t,remote:n,peer:r,firstSendCounter:i=0}){$P(i);let a;try{let e=await crypto.subtle.importKey(`raw`,Uint8Array.from(n[`ephemeral-key`]),WP,!1,[]);a=new Uint8Array(await crypto.subtle.deriveBits({name:`ECDH`,public:e},t.privateKey,PP))}catch{return}let o=KP(e.deviceId,r.deviceId)<0,s=o?e.deviceId:r.deviceId,c=o?r.deviceId:e.deviceId,l=GP(o?t.hello.nonce:n.nonce,o?n.nonce:t.hello.nonce),u=await rF({secret:a,salt:l,low:s,high:c,label:HP}),d=await rF({secret:a,salt:l,low:s,high:c,label:UP}),f=o?u:d,p=o?d:u,m=i,h=-1,g=Promise.resolve(),_=Promise.resolve();async function v(t,n){return{type:`secure-data`,counter:n,ciphertext:new Uint8Array(await crypto.subtle.encrypt({name:`AES-GCM`,iv:tF(n),additionalData:nF(e.deviceId,r.deviceId,n)},f,MN(t)))}}async function y(t){if(t.counter<=h)return{ok:!1,reason:`replayed`};let n;try{n=new Uint8Array(await crypto.subtle.decrypt({name:`AES-GCM`,iv:tF(t.counter),additionalData:nF(r.deviceId,e.deviceId,t.counter)},p,Uint8Array.from(t.ciphertext)))}catch{return{ok:!1,reason:`unauthentic`}}h=Math.max(h,t.counter);let i=IN(n);return i===null?{ok:!1,reason:`undecodable`}:{ok:!0,frame:i}}let b=async e=>{let t=_.then(async()=>y(e));return _=t.catch(()=>void 0),t};return{peer:r,seal:async e=>{let t=eF(m),n=t.counter;m=t.next;let r=g.then(async()=>v(e,n));return g=r.catch(()=>void 0),r},open:async e=>{let t=await b(e);return t.ok?t.frame:void 0},openOutcome:b}}var aF=3e3,oF=class{peer;chosen=!1;lastUsed;current;replaced;hs;pool=[];waiters;opening=Promise.resolve();constructor(e,t){this.peer=e,this.lastUsed=t}get key(){return AO(this.peer)}touch(e){this.lastUsed=e}choose(){this.chosen=!0}holdsKey(e){return[this.current?.remoteKey,this.replaced?.remoteKey,...(this.hs?.cands??[]).map(e=>e.remoteKey),...this.pool.map(e=>e.remoteKey)].some(t=>t!==void 0&&iA(t,e))}outstanding(e){return this.hs!==void 0&&!this.hs.expired&&e<this.hs.sentAt+3e3}expire(e){this.replaced!==void 0&&e>=this.replaced.until&&(this.replaced=void 0);let{hs:t}=this;if(t===void 0||t.expired||e<t.sentAt+3e3)return;let[n,...r]=t.cands;this.current===void 0?n===void 0?t.expired=!0:r.length===0?(this.current={...n,confirmed:!1},this.hs=void 0):(this.pool=t.cands,this.hs=void 0):this.hs=void 0}candidates(){return[...this.hs?.cands??[],...this.pool]}begin(e){this.hs=e}end(e){return this.hs===e&&(this.hs=void 0,!0)}confirmCurrent(){this.current!==void 0&&(this.current.confirmed=!0)}confirm(e,t){this.current!==void 0&&(this.replaced={channel:this.current.channel,remoteKey:this.current.remoteKey,until:t+aF}),this.current={...e,confirmed:!0},this.hs=void 0,this.pool=[]}dropConfirmed(){this.current=void 0,this.replaced=void 0}clearCurrent(e){this.current?.channel===e&&(this.current=void 0)}isEmpty(){return this.current===void 0&&this.replaced===void 0&&this.hs===void 0&&this.pool.length===0}async waitForChannel(){return this.waiters??=(()=>{let e=Promise.withResolvers();return e.promise.catch(()=>void 0),e})(),this.waiters.promise}releaseWaiters(){this.waiters?.resolve(void 0),this.waiters=void 0}rejectWaiters(e){this.waiters?.reject(e),this.waiters=void 0}async serialise(e){let t=this.opening.then(e);return this.opening=t.catch(()=>void 0),t}};function sF(e){return e.ok||e.reason===`undecodable`}async function cF(e,t){let[n,...r]=e;if(n===void 0)return;let i=await n.channel.openOutcome(t);return sF(i)?{cand:n,outcome:i}:cF(r,t)}var lF={now:()=>performance.now()};function uF(e,t,n={}){n.firstSendCounter!==void 0&&$P(n.firstSendCounter);let r=n.newHandshake??(async t=>YP(e,t)),i=-1/0,a=n.clock??lF,o={now:()=>(i=Math.max(i,a.now()),i)},s=new Map,c=EN(()=>o.now());function l(e,t){c(t===void 0?``:AO(t),async r=>n.onFault?.(e,{peer:t,suppressed:r}))}function u(e){e.isEmpty()&&!e.chosen&&s.get(e.key)===e&&s.delete(e.key)}function d(e,t,n){if(!e.end(t))return;let r=n instanceof Error?n:Error(String(n));t.sent.reject(r),e.current===void 0&&e.pool.length===0&&e.rejectWaiters(r),u(e)}function f(e){let t=[...s.values()].filter(e=>e.hs?.origin===`initiated`&&e.hs.cands.length===0&&e.current===void 0),n=t.filter(t=>t!==e).sort((e,t)=>(e.hs?.sentAt??0)-(t.hs?.sentAt??0)).slice(0,Math.max(0,t.length-256));for(let e of n)e.hs!==void 0&&d(e,e.hs,Error(`the handshake was dropped to make room for others`))}function p(e,n){let i=r(e.peer),a={mine:i,origin:n,sentAt:o.now(),cands:[],sent:Promise.withResolvers(),expired:!1};return a.sent.promise.catch(()=>void 0),e.begin(a),i.then(async({hello:r})=>{try{await t(e.peer,r)}catch(t){d(e,a,t),n===`answered`&&l(t,e.peer);return}a.sent.resolve(void 0)},t=>{d(e,a,t)}),a}async function m(t,r,i,a){let o=await iF(e,{pending:await r.mine,remote:i,peer:a,...n.firstSendCounter===void 0?{}:{firstSendCounter:n.firstSendCounter}});o===void 0||t.hs!==r||s.get(t.key)!==t||r.cands.length>=2||t.holdsKey(i[`ephemeral-key`])||(r.cands.push({channel:o,remoteKey:i[`ephemeral-key`]}),t.releaseWaiters())}function h(e){let[t]=[...s.values()].filter(t=>!t.chosen&&e-t.lastUsed>=3e3).sort((e,t)=>e.lastUsed-t.lastUsed);return t}function g(){return[...s.values()].filter(e=>!e.chosen).length<64}function _(e){return g()||h(e)!==void 0}function v(e){if(g())return!0;let t=h(e);return t!==void 0&&(y(t,Error(`the entry was dropped to make room for others`)),!0)}function y(e,t){s.delete(e.key),e.hs?.sent.reject(t),e.rejectWaiters(t)}async function b(e,t,n){try{return await t.seal(n)}catch(n){throw n instanceof uP&&e.clearCurrent(t),n}}async function x(e,t){e.expire(o.now()),e.touch(o.now());let{current:n,hs:r}=e;return n===void 0?e.pool.length>0?Promise.all(e.pool.map(async n=>b(e,n.channel,t))):r===void 0?(p(e,`initiated`),f(e),x(e,t)):r.cands.length>0?(await r.sent.promise,Promise.all(r.cands.map(async n=>b(e,n.channel,t)))):(await e.waitForChannel(),x(e,t)):[await b(e,n.channel,t)]}async function S(e,t){e.expire(o.now());let{current:n}=e;if(n!==void 0){let r=await n.channel.openOutcome(t);if(sF(r))return e.confirmCurrent(),e.touch(o.now()),r.ok?{frame:r.frame,from:n.channel.peer.deviceId}:void 0}let r=await cF(e.candidates(),t);if(r!==void 0)return s.get(e.key)===e?(e.confirm(r.cand,o.now()),e.touch(o.now()),r.outcome.ok?{frame:r.outcome.frame,from:r.cand.channel.peer.deviceId}:void 0):void 0;let{replaced:i}=e;if(i!==void 0&&o.now()<i.until){let e=await i.channel.openOutcome(t);return e.ok?{frame:e.frame,from:i.channel.peer.deviceId}:void 0}}async function C(t,n){let r=AO(n),i=await XP(e,t);if(!i.ok||!await ZP(t[`ephemeral-key`]))return;let a=o.now(),c=s.get(r);if(c?.expire(a),c?.holdsKey(t[`ephemeral-key`])===!0)return;if(c?.hs!==void 0&&c.outstanding(a)){c.hs.cands.length<2&&await m(c,c.hs,t,i.peer);return}if(c===void 0){if(!v(a))return;c=new oF(n,a),s.set(r,c)}let l=p(c,`answered`);c.touch(a);try{await m(c,l,t,i.peer)}catch(e){throw d(c,l,e),e}}return{seal:async(e,t,n)=>{let r=AO(e),i=o.now(),a=s.get(r);if(a===void 0){if(n===`reply`&&!v(i))throw Error(`there is no channel with this peer`);a=new oF(e,i),s.set(r,a)}return n===`request`&&a.choose(),x(a,t)},applyHello:async(t,n)=>{let r;try{if(n===void 0||(r=await e.deriveDeviceId(t[`identity-key`][`public-key`]),!iA(r,n)))return;let i=s.get(AO(r)),a=o.now();if(i?.expire(a),i?.holdsKey(t[`ephemeral-key`])===!0||i?.hs!==void 0&&i.outstanding(a)&&i.hs.cands.length>=2||i===void 0&&!_(a))return;await C(t,r)}catch(e){l(e,r)}},open:async(e,t)=>{if(t===void 0)return;let n=s.get(AO(t));if(n!==void 0)return n.serialise(async()=>S(n,e))},reset:e=>{for(let t of[...s.values()])y(t,Error(e))},forget:e=>{let t=s.get(AO(e));if(t!==void 0){if((t.hs?.cands.length??0)+t.pool.length===0){y(t,Error(`the relay pairing was lost`));return}t.dropConfirmed()}}}}var dF=1e3,fF=3e3;function pF(e,t,n,r,i,a=[],o,s,c){let l=null,u={status:`idle`},d={status:`pending`},f=new Map,p=jP(256),m=p.record,h=!1,g=lP(),_=null,v=null,y=0,b=null,x=0,S=AP(),C=kP({getAuthenticatedPeer:()=>l?.peerDeviceId,isAccepted:r===null,getRelayedDevices:()=>S.list()}),w=new Map,T=uF(e,async(e,t)=>{if(l===null)throw Error(`not connected`);m({direction:`sent`,frame:t}),await l.send(NN(t,e)),M()},{onFault:c}),E=lP(),D=lP(),O=lP(),k=lP(),A=EP();function j(){return{state:u,directory:[...f.values()],frameLog:p.entries()}}function M(){g.push(j())}function N(e){for(let t of w.values())t.reject(Error(e));w.clear()}function ee(e,t,n){let r=x;x+=1;let i=n??b;return{type:`manage-request`,"request-id":r,command:e,scope:t,...i===null?{}:{token:i}}}function P(){if(h||l===null||u.status!==`connected`)throw Error(`not connected`);return l}async function F(e,t,n=`request`){if(l===null)throw Error(`not connected`);if(t===void 0){await l.send(e);return}let r=l,i=await T.seal(t,e,n);await Promise.all(i.map(async e=>r.send(NN(e,t))))}function I(e,t){let n=e[`request-id`],r=w.get(n);if(r===void 0)return;let i=r.expectedFrom;(i===void 0?t===void 0:t!==void 0&&AO(t)===AO(i))&&(w.delete(n),r.resolve(e.outcome))}function te(e,t){let n=e[`request-id`],r=t?.fromDevice,i=t?.toDevice,a={requestId:n,command:e.command,scope:e.scope,...e.token===void 0?{}:{token:e.token},...r===void 0?{}:{fromDevice:r},...i===void 0?{}:{toDevice:i},respond:async e=>{let t={type:`manage-response`,"request-id":n,outcome:e};m({direction:`sent`,frame:t}),await F(t,r,`reply`),M()}};if(rP(e.command.params)){a.respond(iP()).catch(()=>void 0);return}E.push(a)}async function ne(n){if(n.type===`relay-data`){let e=IN(n.payload);if(e?.type===`secure-hello`){m({direction:`received`,frame:e}),await T.applyHello(e,n[`from-device`]);return}if(e?.type===`secure-data`){let t=await T.open(e,n[`from-device`]);t?.frame.type===`manage-response`?(m({direction:`received`,frame:t.frame}),I(t.frame,t.from)):t!==void 0&&wP(t.frame)?(m({direction:`received`,frame:t.frame}),k.push({frame:t.frame,fromDevice:t.from,...n[`to-device`]===void 0?{}:{toDevice:n[`to-device`]}})):t?.frame.type===`manage-request`&&(m({direction:`received`,frame:t.frame}),te(t.frame,{fromDevice:t.from,...n[`to-device`]===void 0?{}:{toDevice:n[`to-device`]}}));return}m({direction:`received`,frame:n});return}if(m({direction:`received`,frame:n}),n.type===`handshake`)L(n);else if(n.type===`gossip`){let t=await Promise.all(n.peers.map(async t=>QN(e,t)));for(let e of n.peers.filter((e,n)=>t[n]===!0)){let t=AO(e.device),n=f.get(t)?.advert[`snapshot-seconds`];n!==void 0&&e[`snapshot-seconds`]<n||(f.set(t,{device:e.device,advert:e}),C.recordAdvert(e.device),i?.(e))}}else if(n.type===`relay-inbound`)S.add(n[`source-device`]);else if(n.type===`manage-response`)I(n);else if(n.type===`manage-request`)te(n);else if(n.type===`pong`)A.resolveOldest(t.now());else if(n.type===`revocation-announce`)for(let e of n.entries)D.push(e);else wP(n)?k.push({frame:n}):n.type===`coordinator`&&O.push(n)}async function re(e){if(l===null)throw Error(`not connected`);if(S.has(e))return;let t={type:`relay-connect`,"target-device":e};m({direction:`sent`,frame:t}),await l.send(t),S.add(e),M()}let ie=dP([]);function L(e){if(d.status!==`pending`)return;_!==null&&(clearTimeout(_),_=null);let t=pP(ie,e);d=t.ok?{status:`negotiated`,version:t.version,sharedDomains:t.sharedDomains}:{status:`rejected`,reason:`no shared domains or version`},u.status===`connected`&&(u={...u,handshake:d})}function R(e,t){return e.redialAddress?.()??t}function ae(e,t,r){if(!h){if(N(`disconnected before a response arrived`),A.rejectAll(`disconnected before a pong arrived`),n!==null&&y<n.maxAttempts){y+=1;let i=y;u={status:`reconnecting`,address:t,attempt:i,reason:e},M(),v=setTimeout(()=>{v=null,le(t,r).catch(e=>{ae(e instanceof Error?e.message:String(e),t,r)})},n.delayMs(i));return}u={status:`closed`,address:t,reason:e},M()}}async function oe(e,t,n){let r=!1;for await(let t of e.receive()){if(h)return;r||(r=!0,y=0),await ne(t),await o?.(e,t),M()}s?.(e),u.status===`connected`&&ae(`node closed the connection`,R(e,t),n)}async function se(n){return n!==void 0&&cP(n),{type:`gossip`,peers:[await ZN(e,{...n,[tP]:eP,[oP]:C.compute(),device:e.deviceId,addresses:[...a],"snapshot-seconds":Math.floor(t.now()/dF),"identity-key":e.identityKey})]}}async function ce(e,t,n){l=e,T.reset(`the connection changed before the channel was ready`),S.clear(),ie=dP(n),d={status:`pending`},u={status:`connected`,address:t,handshake:d},m({direction:`sent`,frame:ie}),await l.send(ie),M();let r=await se();m({direction:`sent`,frame:r}),await l.send(r),M(),_=setTimeout(()=>{_=null,d.status===`pending`&&(d={status:`unanswered`},u.status===`connected`&&(u={...u,handshake:d}),M())},fF),oe(l,t,n).catch(r=>{u.status===`connected`&&ae(r instanceof Error?r.message:String(r),R(e,t),n)})}async function le(e,t){if(r===null)throw Error(`this session is already connected; there is nothing to dial`);_!==null&&(clearTimeout(_),_=null),u={status:`connecting`,address:e},M();let n=await r(e);if(h){await n.close();return}await ce(n,e,t)}return{wireUpConnection:ce,session:{events:g.stream,incomingManageRequests:E.stream,revocationAnnouncements:D.stream,coordinatorFrames:O.stream,incomingDataFrames:k.stream,async connect(e,t){if(l!==null)throw Error(`a session connects once; create a new one to reconnect`);y=0,await le(e,t).catch(n=>{throw ae(n instanceof Error?n.message:String(n),e,t),n})},async sendPing(){let e=P(),t={type:`ping`};m({direction:`sent`,frame:t}),await e.send(t),M()},async sendPingMeasureRtt(e){let n=P();return A.sendAndAwait(t.now(),async()=>{let e={type:`ping`};m({direction:`sent`,frame:e}),await n.send(e),M()},e)},setToken(e){b=e},async sendManageRequest(e,t,n,r,i){P(),n!==void 0&&(await re(n),P());let a=ee(e,t,r),o=a[`request-id`],s=new Promise((e,t)=>{w.set(o,{resolve:e,reject:t,expectedFrom:n})});s.catch(()=>void 0),m({direction:`sent`,frame:a});let c=(async()=>{try{await F(a,n)}catch(e){throw w.delete(o),e}return M(),s})();if(i===void 0)return c;let l;return Promise.race([c,new Promise(e=>{l=setTimeout(()=>{w.delete(o)&&(n!==void 0&&(S.remove(n),T.forget(n)),e({result:`error`,code:`timeout`}))},i)})]).finally(()=>{clearTimeout(l)})},async sendRevocationAnnounce(e){P();let t={type:`revocation-announce`,entries:[...e]};m({direction:`sent`,frame:t}),await F(t),M()},async sendCoordinatorClaim(e){P();let t={...e};m({direction:`sent`,frame:t}),await F(t),M()},async sendGossipUpdate(e){P();let t=await se(e);m({direction:`sent`,frame:t}),await F(t),M()},getTopologyPeers(){return C.compute()},async sendDataFrame(e,t){P(),t!==void 0&&await re(t),m({direction:`sent`,frame:e}),await F(e,t),M()},async close(){h=!0,_!==null&&(clearTimeout(_),_=null),v!==null&&(clearTimeout(v),v=null),N(`connection closed before a response arrived`),T.reset(`the session closed before the channel was ready`),A.rejectAll(`connection closed before a pong arrived`),l!==null&&await l.close(),(u.status===`connected`||u.status===`connecting`||u.status===`reconnecting`)&&(u={status:`closed`,address:u.address,reason:`closed by you`}),M()}}}}function mF(e,t,n={now:()=>Date.now()},r=null,i=[],a,o,s){let{session:c}=pF(t,n,r,async t=>e.connect(t),a,i,o,void 0,s);return c}async function hF(e,t,n,r={}){let i=r.clock??{now:()=>Date.now()},a=null,o=new Promise(e=>{a=e}),s=!1,{session:c,wireUpConnection:l}=pF(t,i,null,null,e=>{s||(s=!0,a?.(e.device)),r.onPeerAdvert?.(e)},r.addresses,r.onFrame,r.onSessionEnd);return await l(e,r.label??`accepted`,n),{...c,peerDeviceId:o}}function gF(e){return e instanceof Error?e:Error(String(e))}function _F(e){let t=AO(e.selfDeviceId),n=new Set;async function r(t){let n;try{n=await e.shouldExpand(t)}catch(n){e.onExpansionFailed?.(t,[gF(n)]);return}if(!n){e.onExpansionDeclined?.(t);return}await i(t,t.addresses,[])}async function i(t,n,r){let[a,...o]=n;if(a===void 0){e.onExpansionFailed?.(t,r);return}try{let n=await e.dial(a);e.onExpanded(t,a,n)}catch(e){await i(t,o,[...r,gF(e)])}}return{considerAdvert(e){let i=AO(e.device);i===t||n.has(i)||e.addresses.length===0||(n.add(i),r({device:e.device,addresses:e.addresses}).catch(()=>void 0))}}}var vF=/^[0-9a-f]{64}$/,yF=/^[A-Za-z0-9_-]+$/;function bF(e,t){if(!vF.test(e))throw Error(`expected ${t} to be a 64-character lowercase hex device-id, got ${JSON.stringify(e)}`)}function xF(e,t){if(bF(e,`a`),bF(t,`b`),e===t)throw Error(`a DM room path cannot name the same device twice (${e})`);return e<t?`${e}+${t}`:`${t}+${e}`}function SF(e){let t=e.indexOf(`/`);if(t!==-1){let n=e.slice(0,t),r=e.slice(t+1);if(vF.test(n)&&yF.test(r))return{kind:`owner-named`,owner:n,localName:r}}let n=e.indexOf(`+`);if(n!==-1){let t=e.slice(0,n),r=e.slice(n+1);if(vF.test(t)&&vF.test(r)&&t!==r)return{kind:`dm`,participants:[t,r]}}throw Error(`${JSON.stringify(e)} is not a valid room-path`)}var CF=5,wF=1e3,TF=3e4,EF=2,DF={maxAttempts:CF,delayMs:e=>Math.min(wF*EF**(e-1),TF)},OF=4,kF=1024,AF=kF*kF*100,jF=new Uint8Array(OF);function MF(e){let t=Mg(e,hg),n=new Uint8Array(OF+t.length);return new DataView(n.buffer).setUint32(0,t.length),n.set(t,OF),n}function NF(e,t){let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n}function PF(e){return{[Symbol.asyncIterator]:()=>({next:async()=>{let t=await e.read();return t.done?{done:!0,value:void 0}:{done:!1,value:t.value}}})}}async function*FF(e){let t=new Uint8Array;try{for await(let n of PF(e))for(t=NF(t,n);t.length>=OF;){let e=new DataView(t.buffer,t.byteOffset).getUint32(0);if(e>104857600)throw Error(`frame of ${String(e)} bytes exceeds the ${String(AF)}-byte limit`);if(t.length<OF+e)break;if(e===0){t=t.slice(OF);continue}let n=t.slice(OF,OF+e);t=t.slice(OF+e);let r=ZE.safeParse(b_(n,x_));r.success&&(yield r.data)}}catch(t){throw await e.cancel(t),t}}function IF(e,t={opened:!1}){let n=e.writable.getWriter(),r=e.readable.getReader(),i=FF(r),a=t.opened?n.write(jF):Promise.resolve();return a.catch(()=>void 0),{send:async e=>{await a,await n.write(MF(e))},receive:()=>i,close:async()=>{await Promise.allSettled([n.close(),r.cancel()])}}}var LF=`/wire-mesh`,RF=8e3,zF=`the web console is a client only: it cannot listen`;async function BF(e){let t=[],n=async()=>{let r=await e.read();if(!r.done){if(!(r.value instanceof Uint8Array))throw Error(`the announcement carried something other than bytes`);t.push(r.value),await n()}};return await n(),t}async function VF(e){let t=e.incomingUnidirectionalStreams.getReader(),n=await t.read();if(t.releaseLock(),n.done)throw Error(`the node opened no announcement stream`);let r=n.value;if(!(r instanceof ReadableStream))throw Error(`the announcement stream is not a readable stream`);let i=await BF(r.getReader()),a=new Uint8Array(i.reduce((e,t)=>e+t.length,0)),o=0;for(let e of i)a.set(e,o),o+=e.length;return Ik(a)}async function HF(e){let t,n=new Promise(e=>{t=setTimeout(()=>{e(`timed out`)},RF)});try{let t=await Promise.race([e.createBidirectionalStream(),n]);if(t===`timed out`)throw e.close(),Error(`this browser cannot open a stream to this node: it is waiting for flow-control credit the node never grants, which is how Safari behaves with the node's HTTP/3 library (fails-components/webtransport#490); reach the node over wss:// instead`);return t}finally{clearTimeout(t)}}function UF(e){return{async connect(t){if(typeof WebTransport>`u`)throw Error(`this browser does not support WebTransport`);let{url:n,sha256:r}=Nk(t),i=new URL(n).host,a=Lk(r,await e.recall(i)),o=new WebTransport(new URL(LF,n).toString(),{serverCertificateHashes:a.map(e=>({algorithm:`sha-256`,value:e}))});await o.ready;let s=IF(await HF(o),{opened:!0});o.closed.catch(()=>void 0).then(async()=>s.close()).catch(()=>void 0);let c;return VF(o).then(async t=>{c=t,await e.remember(i,t)}).catch(()=>void 0),{...s,redialAddress:()=>c===void 0?t:zk(t,c)}},async listen(){return Promise.reject(Error(zF))}}}var WF=1e3,GF=1002,KF=`the web console is a client only: it cannot listen`;function qF(e){let t=[],n=[],r=!1,i=null;function a(){r=!0;for(let e of n.splice(0))e.resolve({value:void 0,done:!0})}function o(e){i=e,r=!0;for(let t of n.splice(0))t.reject(e)}e.addEventListener(`message`,r=>{if(!(r.data instanceof ArrayBuffer)){o(Error(`expected a binary WebSocket message`)),e.close(GF,`protocol error`);return}let i;try{i=FN(r.data)}catch(t){if(t instanceof PN)return;o(t instanceof Error?t:Error(`frame body failed to decode: ${String(t)}`)),e.close(GF,`protocol error`);return}let a=n.shift();a?a.resolve({value:i,done:!1}):t.push(i)}),e.addEventListener(`close`,a),e.addEventListener(`error`,a);let s={[Symbol.asyncIterator](){return{next:async()=>c()}}};async function c(){let e=t.shift();return e===void 0?i===null?r?Promise.resolve({value:void 0,done:!0}):new Promise((e,t)=>{n.push({resolve:e,reject:t})}):Promise.reject(i):Promise.resolve({value:e,done:!1})}return{async send(t){return r?Promise.reject(Error(`connection is closed`)):(e.send(MN(t)),Promise.resolve())},receive:()=>s,async close(){return e.close(WF),Promise.resolve()}}}function JF(){return{async connect(e){let t=new URL(e);if(t.protocol!==`ws:`&&t.protocol!==`wss:`)return Promise.reject(Error(`not a WebSocket address: ${e}`));let n=new WebSocket(t);return n.binaryType=`arraybuffer`,new Promise((e,r)=>{n.addEventListener(`open`,()=>{e()}),n.addEventListener(`error`,()=>{r(Error(`connect to ${t.toString()} failed`))})}).then(()=>qF(n))},async listen(){return Promise.reject(Error(KF))}}}function YF(e){let t=JF(),n=UF(e);return{connect:async e=>Mk(e)?n.connect(e):t.connect(e),listen:async(e,n)=>t.listen(e,n)}}var XF=[{urls:`stun:stun.cloudflare.com:3478`}],ZF=`webrtc:signal`,QF={kind:`node`};function $F(e){return typeof e==`object`&&`verb`in e&&e.verb===`webrtc.offer`}function eI(e){return typeof e==`object`&&`verb`in e&&e.verb===`webrtc.answer`}function tI(e){return typeof e==`object`&&`verb`in e&&e.verb===`webrtc.ice-candidate`}function nI(e,t){return{verb:ZF,params:{verb:`webrtc.offer`,"negotiation-id":e,sdp:t}}}function rI(e,t){return{verb:ZF,params:{verb:`webrtc.answer`,"negotiation-id":e,sdp:t}}}function iI(e,t){return{verb:ZF,params:{verb:`webrtc.ice-candidate`,"negotiation-id":e,...t===void 0?{}:{candidate:t}}}}function aI(e){return{candidate:e.candidate,...e.sdpMid===null?{}:{"sdp-mid":e.sdpMid},...e.sdpMLineIndex===null?{}:{"sdp-m-line-index":e.sdpMLineIndex},...e.usernameFragment===null?{}:{"username-fragment":e.usernameFragment}}}function oI(e){return{candidate:e.candidate,...e[`sdp-mid`]===void 0?{}:{sdpMid:e[`sdp-mid`]},...e[`sdp-m-line-index`]===void 0?{}:{sdpMLineIndex:e[`sdp-m-line-index`]},...e[`username-fragment`]===void 0?{}:{usernameFragment:e[`username-fragment`]}}}function sI(){let e=0;return()=>{let t=e;return e+=1,t}}async function cI(e,t){if(e.token===void 0)return!1;let n=await SM(e.token,t);return n.ok?n.claims.capability===`webrtc:signal`&&n.claims.scope.kind===QF.kind:!1}function lI(e){let t=[],n=[],r=!1,i=null;function a(){r=!0;for(let e of n.splice(0))e.resolve({value:void 0,done:!0})}function o(e){i=e,r=!0;for(let t of n.splice(0))t.reject(e)}e.addEventListener(`message`,r=>{if(!(r.data instanceof ArrayBuffer)){o(Error(`expected a binary data channel message`)),e.close();return}let i;try{i=FN(r.data)}catch(t){if(t instanceof PN)return;o(t instanceof Error?t:Error(`frame body failed to decode: ${String(t)}`)),e.close();return}let a=n.shift();a?a.resolve({value:i,done:!1}):t.push(i)}),e.addEventListener(`close`,a),e.addEventListener(`error`,a);let s={[Symbol.asyncIterator](){return{next:async()=>c()}}};async function c(){let e=t.shift();return e===void 0?i===null?r?Promise.resolve({value:void 0,done:!0}):new Promise((e,t)=>{n.push({resolve:e,reject:t})}):Promise.reject(i):Promise.resolve({value:e,done:!1})}return{async send(t){return e.readyState===`open`?(e.send(MN(t)),Promise.resolve()):Promise.reject(Error(`data channel is not open (state: ${e.readyState})`))},receive:()=>s,async close(){return e.close(),Promise.resolve()}}}var uI=`wire-mesh`;function dI(e,t){for(let n of t.localTracks??[])e.addTrack(n);t.onRemoteTrack!==void 0&&e.addEventListener(`track`,t.onRemoteTrack)}function fI(e,t){e.addEventListener(`open`,()=>{t(lI(e))},{once:!0})}var pI=16,mI=36e5;async function hI(e,t){let n=new Uint8Array(pI);crypto.getRandomValues(n);let r=await AM({identity:e,clock:t,tokenId:n,bearer:e.deviceId,capability:ZF,scope:QF,expires:t.now()+mI});if(!r.ok)throw Error(`could not mint a webrtc:signal token: ${r.reason}`);return r.token}function gI(e,t){let n={identity:t.identity,clock:t.clock,revocation:t.revocation},r=new Map,i=new Map,a=new Map,o=sI();function s(e,t){clearTimeout(a.get(e)),a.delete(e),r.delete(e),i.delete(e),t.close()}function c(e,t){t.addEventListener(`connectionstatechange`,()=>{(t.connectionState===`closed`||t.connectionState===`failed`)&&s(e,t)})}function l(e,n){a.set(e,setTimeout(()=>{s(e,n)},t.channelOpenTimeoutMs??3e4))}function u(e,t){d(e,t).catch(()=>void 0)}async function d(t,n){let r=iI(t,n===null?void 0:aI(n));await e.sendManageRequest(r,QF,i.get(t))}async function f(o,d){if(!await cI(o,n)){await o.respond({result:`error`,code:`unauthorized`});return}let f=d[`negotiation-id`];i.set(f,o.fromDevice);let p=new RTCPeerConnection({iceServers:[...t.iceServers]});r.set(f,p),dI(p,t),p.addEventListener(`icecandidate`,e=>{u(f,e.candidate)}),p.addEventListener(`datachannel`,e=>{let{channel:n}=e;n.binaryType=`arraybuffer`,fI(n,e=>{clearTimeout(a.get(f)),a.delete(f),t.onIncomingConnection(e)})}),c(f,p),l(f,p);try{await p.setRemoteDescription({type:`offer`,sdp:d.sdp});let t=await p.createAnswer();await p.setLocalDescription(t),await o.respond({result:`ok`}),await e.sendManageRequest(rI(f,t.sdp??``),QF,o.fromDevice)}catch(e){throw s(f,p),e}}async function p(e,t){let n=r.get(t[`negotiation-id`]);n!==void 0&&await n.setRemoteDescription({type:`answer`,sdp:t.sdp}),await e.respond({result:`ok`})}async function m(e,t){let n=r.get(t[`negotiation-id`]);n!==void 0&&await n.addIceCandidate(t.candidate===void 0?null:oI(t.candidate)),await e.respond({result:`ok`})}async function h(e){if(e.command.verb!==`webrtc:signal`)return;let t=e.command.params;$F(t)?await f(e,t):eI(t)?await p(e,t):tI(t)&&await m(e,t)}return DN(jN(e.incomingManageRequests,h,{onFault:t.onFault})),{async initiate(n){let a=o();i.set(a,n);let l=new RTCPeerConnection({iceServers:[...t.iceServers]});r.set(a,l),dI(l,t),l.addEventListener(`icecandidate`,e=>{u(a,e.candidate)}),c(a,l);let d=l.createDataChannel(uI);d.binaryType=`arraybuffer`;let f=new Promise((e,t)=>{fI(d,e),d.addEventListener(`error`,()=>{t(Error(`data channel failed to open`))},{once:!0})});f.catch(()=>void 0);let p;try{let r=await l.createOffer();await l.setLocalDescription(r);let i=await e.sendManageRequest(nI(a,r.sdp??``),QF,n,await hI(t.identity,t.clock),t.channelOpenTimeoutMs??3e4);if(i.result===`error`)throw Error(`webrtc offer rejected: ${i.code}`);return await Promise.race([f,new Promise((e,n)=>{p=setTimeout(()=>{n(Error(`data channel did not open in time`))},t.channelOpenTimeoutMs??3e4)})])}catch(e){throw s(a,l),e}finally{clearTimeout(p)}}}}var _I={frames:0,stage:void 0,handshake:void 0,issued:0,seen:new Set};function vI(e){return AO(e)}function yI(e,t){if(t.type===`gossip`)return e===`received`?t.peers.map(e=>({kind:`peer`,summary:`Peer seen:`,peer:vI(e.device)})):[{kind:`peer`,summary:`Advertised this console to the node`,peer:void 0}];if(t.type===`relay-connect`)return[{kind:`pairing`,summary:`Asked the node to pair this console with`,peer:vI(t[`target-device`])}];if(t.type===`relay-inbound`)return[{kind:`pairing`,summary:`Pairing established with`,peer:vI(t[`source-device`])}];if(t.type===`relay-data`){let n=e===`sent`?t[`to-device`]:t[`from-device`];return[{kind:`relay`,summary:e===`sent`?`Relayed a message to`:`Relayed message received from`,peer:n===void 0?void 0:vI(n)}]}return t.type===`close`?[{kind:`connection`,summary:`The node closed the connection`,peer:void 0}]:[]}function bI(e){return e.status===`reconnecting`?`reconnecting:${String(e.attempt)}`:e.status}function xI(e,t,n){let r=[],i=e=>{r.push({kind:`connection`,summary:e,peer:void 0})};if(bI(t)!==e.stage)switch(t.status){case`connecting`:i(`Connecting to ${t.address}`);break;case`connected`:i(`Connected to ${t.address}`);break;case`reconnecting`:i(`${e.stage?.startsWith(`reconnecting`)===!0?`Retry failed`:`Connection lost`} (${t.reason}); retrying, attempt ${String(t.attempt)}`);break;case`closed`:i(`Closed (${t.reason})`)}return t.status===`connected`&&n!==e.handshake&&(t.handshake.status===`negotiated`?i(`Handshake negotiated: ${t.handshake.sharedDomains.join(`, `)}`):t.handshake.status===`unanswered`?i(`The node does not answer handshakes (a relay-only node)`):t.handshake.status===`rejected`&&i(`Handshake rejected (${t.handshake.reason})`)),r}function SI(e){return e.status===`connected`?e.handshake.status:void 0}function CI(e,t,n){let r=SI(t.state),i=new Set(e.seen),a=[...xI(e,t.state,r),...t.frameLog.slice(e.frames).flatMap(e=>yI(e.direction,e.frame)).filter(e=>e.kind!==`peer`||e.peer===void 0||!i.has(e.peer)&&(i.add(e.peer),!0))].map((t,r)=>({...t,key:`activity-${String(e.issued+r)}`,at:n}));return{tracker:{frames:t.frameLog.length,stage:bI(t.state),handshake:r,issued:e.issued+a.length,seen:i},entries:a}}function wI(e){return e.map(e=>({key:`certificate-${e.key}`,at:e.at,kind:`certificate`,summary:`Certificate changed: ${e.node} announced certificates unlike the remembered ones`,peer:void 0}))}function TI(e,t){let[n,r]=(0,k.useState)({event:void 0,activity:[],statusSince:void 0}),i=(0,k.useRef)({session:e,tracker:_I});return(0,k.useEffect)(()=>{let n=new AbortController;return i.current.session!==e&&(i.current={session:e,tracker:_I}),DN(kN(e.events,n=>{let a=t.now(),{tracker:o}=i.current,s=CI(o,n,a),c=s.tracker.stage!==o.stage;i.current={session:e,tracker:s.tracker},r(e=>({event:n,activity:[...e.activity,...s.entries].slice(-500),statusSince:c?a:e.statusSince}))},{signal:n.signal})),()=>{n.abort()}},[e,t]),n}var EI=`local-network-access`,DI=4,OI=255,kI=8,AI=32,jI=[`10.0.0.0/8`,`127.0.0.0/8`,`172.16.0.0/12`,`192.168.0.0/16`,`169.254.0.0/16`,`100.64.0.0/10`];function MI(e){let t=e.split(`.`);if(t.length!==DI)return;let n=0;for(let e of t){let t=/^\d{1,3}$/.test(e)?Number(e):NaN;if(!(t<=OI))return;n=n*2**kI+t}return n}function NI(e,t){let[n,r]=t.split(`/`),i=MI(n??``),a=Number(r);if(i===void 0)return!1;let o=2**(AI-a);return Math.floor(e/o)===Math.floor(i/o)}function PI(e){let t=e.replace(/^\[|\]$/g,``).toLowerCase(),n=MI(t);return n===void 0?t.includes(`:`)?t===`::1`||/^f[cd]/.test(t)||/^fe[89ab]/.test(t):t===`localhost`||t.endsWith(`.local`)||!t.includes(`.`):jI.some(e=>NI(n,e))}function FI(e){try{return new URL(/^[a-z][a-z0-9+.-]*:\/\//i.test(e)?e:`ws://${e}`).hostname}catch{return}}function II(e){return typeof e==`object`&&!!e&&`name`in e&&typeof e.name==`string`}function LI(){if(`permissions`in navigator)return{query:async e=>{if(!II(e))throw TypeError(`not a permission descriptor`);return navigator.permissions.query(e)}}}async function RI(e,t,n){let r=FI(e);if(r!==void 0&&PI(r)&&!PI(t)&&n!==void 0)try{let{state:e}=await n.query({name:EI});return e===`denied`?`Your browser blocked this page from reaching ${r}, a device on your local network. Allow "Local network access" for this site in the browser's site settings (the icon left of the address), then connect again.`:void 0}catch{return}}var zI=(0,k.createContext)(void 0);function BI(){let e=(0,k.useContext)(zI);if(e===void 0)throw Error(`usePeerNames must be used inside PeerNamesProvider`);return e}var VI={pongTimeoutMs:5e3,intervalMs:15e3};function HI(e,t,n=VI){let[r,i]=(0,k.useState)([]),[a,o]=(0,k.useState)(!1),s=(0,k.useRef)(!1),c=(0,k.useCallback)(()=>{e.sendPingMeasureRtt(n.pongTimeoutMs).then(e=>{s.current=!0,o(!1),i(t=>[...t,e].slice(-40))},e=>{e instanceof TP&&(o(!s.current),i(e=>[...e,void 0].slice(-40)))})},[e,n.pongTimeoutMs]);return(0,k.useEffect)(()=>{if(!t||a)return;c();let e=setInterval(c,n.intervalMs);return()=>{clearInterval(e)}},[t,a,c,n.intervalMs]),{samples:r,unresponsive:a,probe:c}}function UI(e,t,n){let[r,i]=(0,k.useState)(()=>e.now());return(0,k.useEffect)(()=>{if(!t)return;let r=setInterval(()=>{i(e.now())},n);return()=>{clearInterval(r)}},[e,t,n]),r}var WI=1e3,GI=60,KI=60,qI=24;function JI(e){let t=Math.floor(e/WI);if(t<1)return;if(t<GI)return`${String(t)} s`;let n=Math.floor(t/GI);if(n<KI)return`${String(n)} min`;let r=Math.floor(n/KI);return r<qI?`${String(r)} h`:`${String(Math.floor(r/qI))} d`}function YI(e){let t=JI(e);return t===void 0?`just now`:`${t} ago`}function XI(e){let t=JI(e);return t===void 0?`in under a second`:`in ${t}`}function ZI(e){return`${String(Math.max(0,Math.ceil(e/WI)))} s`}function QI(e,t,n){if(n.length===0)return{kind:`first-use`,node:e,presented:t};let r=new Set(n),i=t.filter(e=>r.has(e));return i.length>0?{kind:`known`,node:e,trusted:i}:{kind:`changed`,node:e,remembered:n,presented:t}}function $I(e){if(Mk(e))try{let{url:t,sha256:n}=Nk(e);return{node:new URL(t).host,sha256:[...n]}}catch{return}}function eL(e,t){return{recall:e.recall,remember:async(n,r)=>{let i=QI(n,r.map(e=>kO(e)),(await e.recall(n)).map(e=>kO(e)));await e.remember(n,r),i.kind===`changed`&&t({node:n,remembered:i.remembered,presented:i.presented})}}}var tL=2;function nL(e){let t=[];for(let n=0;n<e.length;n+=tL)t.push(e.slice(n,n+tL).toUpperCase());return t.join(`:`)}var rL=/^([a-z][a-z0-9+.-]*):\/\//i,iL={ws:`ws:`,wss:`wss:`,http:`ws:`,https:`wss:`};function aL(e){if(Mk(e))return e;let t=rL.exec(e);if(t===null)return`ws://${e}`;let n=iL[t[1]?.toLowerCase()??``];if(n===void 0)return e;let r=new URL(e);return r.protocol=n,r.hash=``,r.toString()}function oL({deviceHex:e}){return(0,z.jsx)(z.Fragment,{children:cN(BI().labelOf(e))})}function sL(e){return JSON.stringify(e,(e,t)=>t instanceof Uint8Array?`<${String(t.byteLength)} bytes>`:t)}function cL({activity:e,frameLog:t}){let[n,r]=(0,k.useState)(!1);return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(um,{mt:`md`,label:`Show raw frames`,checked:n,onChange:e=>{r(e.currentTarget.checked)}}),n?(0,z.jsx)(km.ScrollContainer,{minWidth:0,h:384,"data-testid":`frame-log`,children:(0,z.jsxs)(km,{children:[(0,z.jsx)(km.Thead,{children:(0,z.jsxs)(km.Tr,{children:[(0,z.jsx)(km.Th,{children:`direction`}),(0,z.jsx)(km.Th,{children:`frame`})]})}),(0,z.jsx)(km.Tbody,{children:t.map((e,t)=>(0,z.jsxs)(km.Tr,{children:[(0,z.jsx)(km.Td,{children:e.direction}),(0,z.jsx)(km.Td,{children:sL(e.frame)})]},t))})]})}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(U,{fw:600,size:`sm`,mt:`md`,children:`Activity`}),e.length===0?(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`Nothing has happened yet.`}):(0,z.jsx)(km.ScrollContainer,{minWidth:0,h:384,"data-testid":`activity-log`,children:(0,z.jsx)(km,{children:(0,z.jsx)(km.Tbody,{children:[...e].reverse().map(e=>(0,z.jsxs)(km.Tr,{children:[(0,z.jsx)(km.Td,{children:new Date(e.at).toLocaleTimeString()}),(0,z.jsxs)(km.Td,{children:[e.summary,e.peer!==void 0&&(0,z.jsxs)(z.Fragment,{children:[` `,(0,z.jsx)(oL,{deviceHex:e.peer})]})]})]},e.key))})})})]})]})}var lL=160,uL=32,dL=3,fL=2,pL=26;function mL(e){let t=e.at(-1);return t===void 0?e.length===0?`No round trips measured yet`:`Last ping got no pong`:`Round trip ${String(Math.round(t))} ms`}function hL({samples:e}){let t=e.filter(e=>e!==void 0),n=Math.max(1,...t),r=lL/39,i=(40-e.length)*r,a=e.map((e,t)=>({x:i+t*r,y:e===void 0?void 0:dL+pL*(1-e/n)})),o=a.filter(e=>e.y!==void 0).map(e=>`${e.x.toFixed(1)},${String(e.y)}`).join(` `);return(0,z.jsxs)(`div`,{"data-testid":`rtt-sparkline`,children:[(0,z.jsxs)(`svg`,{role:`img`,"aria-label":mL(e),width:lL,height:uL,viewBox:`0 0 ${String(lL)} ${String(uL)}`,children:[(0,z.jsx)(`polyline`,{points:o,fill:`none`,stroke:`currentColor`,strokeWidth:1.5}),a.map(e=>e.y===void 0?null:(0,z.jsx)(`circle`,{cx:e.x,cy:e.y,r:fL,fill:`currentColor`},e.x)),a.filter(e=>e.y===void 0).map(e=>(0,z.jsx)(`line`,{x1:e.x,x2:e.x,y1:21,y2:29,stroke:`var(--mantine-color-red-6)`,strokeWidth:2},e.x))]}),(0,z.jsx)(U,{size:`xs`,c:`dimmed`,children:mL(e)})]})}function gL({state:e,statusSince:t,now:n,policy:r}){let i=t===void 0?void 0:t+r.delayMs(e.attempt),a=i===void 0?0:i-n;return(0,z.jsxs)(U,{size:`sm`,c:`orange`,"data-testid":`reconnect-status`,children:[a>0?`Retrying in ${ZI(a)}`:`Retrying now`,` `,`(attempt `,e.attempt,` of `,r.maxAttempts,`). Last failure:`,` `,e.reason]})}function _L({state:e,statusSince:t,now:n,policy:r,health:i}){return e.status===`reconnecting`?(0,z.jsx)(gL,{state:e,statusSince:t,now:n,policy:r}):e.status===`connected`?(0,z.jsxs)(pl,{align:`flex-end`,gap:`md`,mb:`sm`,children:[(0,z.jsx)(hL,{samples:i.samples}),i.unresponsive&&(0,z.jsx)(U,{size:`xs`,c:`dimmed`,children:`This node does not answer pings, so round trips are not measured automatically.`})]}):null}function vL(e){e?.focus()}function yL({deviceHex:e}){let t=BI(),n=t.labelOf(e),[r,i]=(0,k.useState)(void 0);return r===void 0?(0,z.jsxs)(pl,{gap:`xs`,wrap:`nowrap`,children:[(0,z.jsxs)(`div`,{children:[n.source===`self`&&(0,z.jsx)(U,{size:`xs`,c:`dimmed`,children:`calls itself`}),(0,z.jsx)(U,{size:`sm`,fw:n.source===`petname`?`bold`:`normal`,fs:n.source===`self`?`italic`:`normal`,ff:n.source===`id`?`monospace`:`text`,children:n.primary}),n.matchesPetname&&(0,z.jsx)(_d,{size:`xs`,color:`orange`,variant:`light`,children:`same as a name you set`}),n.secondary!==void 0&&(0,z.jsx)(U,{size:`xs`,c:`dimmed`,ff:n.source===`self`?`monospace`:`text`,children:n.secondary})]}),(0,z.jsx)(zd,{value:e,children:({copied:e,copy:t})=>(0,z.jsx)(Zp,{label:e?`Copied`:`Copy device id`,children:(0,z.jsx)(rl,{size:`sm`,variant:`subtle`,"aria-label":`Copy device id of ${n.primary}`,onClick:t,children:`⧉`})})}),(0,z.jsx)(rl,{size:`sm`,variant:`subtle`,"aria-label":`Rename ${n.primary}`,onClick:()=>{i(t.petnameOf(e)??``)},children:`✎`})]}):(0,z.jsx)(`form`,{onSubmit:n=>{n.preventDefault(),DN(t.rename(e,r).then(()=>{i(void 0)}))},children:(0,z.jsxs)(pl,{gap:`xs`,wrap:`nowrap`,children:[(0,z.jsx)(Am,{size:`xs`,"aria-label":`Petname for ${n.primary}`,value:r,ref:vL,onChange:e=>{i(e.currentTarget.value)}}),(0,z.jsx)(rl,{type:`submit`,size:`sm`,"aria-label":`Save petname`,children:`✓`}),(0,z.jsx)(rl,{size:`sm`,variant:`subtle`,"aria-label":`Cancel rename`,onClick:()=>{i(void 0)},children:`×`})]})})}var bL=`q7ltm10`,xL=`q7ltm11`;function SL({columns:e,rows:t}){return(0,z.jsxs)(km,{striped:!0,className:xL,children:[(0,z.jsx)(km.Thead,{role:`rowgroup`,children:(0,z.jsx)(km.Tr,{role:`row`,children:e.map(e=>(0,z.jsx)(km.Th,{role:`columnheader`,children:e.headerless===!0?null:e.label},e.label))})}),(0,z.jsx)(km.Tbody,{role:`rowgroup`,children:t.map(t=>(0,z.jsx)(km.Tr,{role:`row`,children:e.map((e,n)=>(0,z.jsx)(km.Td,{role:`cell`,"data-label":e.label,children:t.cells[n]},e.label))},t.key))})]})}var CL=16,wL=1e3;function TL(e){let t=``;for(let n of e)t+=n.toString(CL).padStart(2,`0`);return t}function EL(e){if(e.state.status!==`connected`)return``;switch(e.state.handshake.status){case`pending`:return` · handshake pending`;case`negotiated`:return` · v${String(e.state.handshake.version)} · ${e.state.handshake.sharedDomains.join(`, `)}`;case`unanswered`:return` · handshake unanswered (relay-only node?)`;case`rejected`:return` · handshake rejected (${e.state.handshake.reason})`}return``}function DL(e){let{state:t}=e;switch(t.status){case`connecting`:return`connecting…`;case`connected`:return`connected${EL(e)}`;case`reconnecting`:return`reconnecting (attempt ${String(t.attempt)}, ${t.reason})…`;case`closed`:return`closed (${t.reason})`;case`idle`:return`idle`}return``}var OL=1e3,kL=[{label:`device`},{label:`addresses`},{label:`advertised`},{label:`actions`,headerless:!0}];function AL({address:e,session:t,clock:n,reconnectPolicy:r,certificateChanges:i,onClose:a,onMessagePeer:o,pageHost:s=window.location.hostname,permissions:c=LI()}){let{event:l,activity:u,statusSince:d}=TI(t,n),f=l?.state.status===`reconnecting`||l?.state.status===`closed`,[p,m]=(0,k.useState)(void 0);(0,k.useEffect)(()=>{let t={value:!0};return f&&DN(RI(e,s,c).then(n=>{t.value&&m({address:e,message:n})})),()=>{t.value=!1}},[f,e,s,c]);let h=f&&p?.address===e?p.message:void 0,{observeDirectory:g,selfName:_}=BI(),v=l?.state.status===`connected`;(0,k.useEffect)(()=>{l!==void 0&&g(l.directory)},[l,g]);let y=(0,k.useRef)(!1),[b,x]=(0,k.useState)(void 0);(0,k.useEffect)(()=>{v&&(_!==void 0||y.current)&&(y.current=_!==void 0,t.sendGossipUpdate(_===void 0?void 0:oN(_)).then(()=>{x(void 0)},e=>{x(e instanceof Error?e.message:String(e))}))},[v,_,t]);let S=l===void 0?`idle`:DL(l),C=l?.directory??[],w=l?.frameLog??[],T=HI(t,v),E=UI(n,l?.state.status===`reconnecting`||C.length>0,OL),D=$I(aL(e))?.node,O=(0,k.useMemo)(()=>[...u,...wI(i.filter(e=>e.node===D))].sort((e,t)=>e.at-t.at),[u,i,D]);return(0,z.jsxs)(Nd,{withBorder:!0,padding:`md`,radius:`md`,children:[(0,z.jsxs)(pl,{justify:`space-between`,mb:`xs`,children:[(0,z.jsx)(U,{fw:600,children:e}),(0,z.jsxs)(pl,{children:[(0,z.jsx)(Ed,{size:`xs`,disabled:!v,onClick:T.probe,children:`Send ping`}),(0,z.jsx)(Ed,{size:`xs`,color:`red`,variant:`light`,onClick:a,children:`Disconnect`})]})]}),(0,z.jsx)(U,{fw:600,size:`sm`,mb:`sm`,children:S}),h===void 0?null:(0,z.jsx)(eu,{color:`yellow`,mb:`sm`,children:h}),b!==void 0&&(0,z.jsx)(eu,{color:`red`,title:`Could not publish your display name`,mb:`sm`,children:b}),l!==void 0&&(0,z.jsx)(_L,{state:l.state,statusSince:d,now:E,policy:r,health:T}),(0,z.jsx)(U,{fw:600,size:`sm`,children:`Peer directory`}),C.length===0?(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`No gossip received yet.`}):(0,z.jsx)(SL,{columns:kL,rows:C.map(e=>({key:TL(e.device),cells:[(0,z.jsx)(yL,{deviceHex:TL(e.device)},`device`),e.advert.addresses.join(`, `),(0,z.jsx)(Zp,{label:`As the peer advertised it, by its own clock`,children:(0,z.jsx)(`span`,{children:YI(E-e.advert[`snapshot-seconds`]*wL)})},`advertised`),(0,z.jsx)(Ed,{size:`xs`,onClick:()=>{o(e.device)},children:`Message`},`actions`)]}))}),(0,z.jsx)(cL,{activity:O,frameLog:w})]})}var jL=[{label:`device`},{label:`addresses`},{label:`gossiped by`},{label:`actions`,headerless:!0}];function ML({peers:e,onConnect:t,onDismiss:n}){return e.length===0?null:(0,z.jsxs)(Nd,{withBorder:!0,padding:`md`,radius:`md`,"data-testid":`discovered-peers`,children:[(0,z.jsx)(U,{fw:600,size:`sm`,mb:`xs`,children:`Discovered peers`}),(0,z.jsx)(U,{size:`sm`,c:`dimmed`,mb:`xs`,children:`Each node below was listed in the directory of a node you are connected to, which is the only thing vouching for it: the address it lists may not be a wire-mesh node at all. Nothing is dialled until you connect.`}),(0,z.jsx)(SL,{columns:jL,rows:e.map(e=>({key:e.key,cells:[(0,z.jsx)(yL,{deviceHex:TL(e.device)},`device`),e.addresses.join(`, `),(0,z.jsxs)(k.Fragment,{children:[e.via.claimedDevice!==void 0&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(U,{size:`xs`,c:`dimmed`,children:`claimed to be`}),(0,z.jsx)(yL,{deviceHex:e.via.claimedDevice})]}),(0,z.jsxs)(U,{size:`xs`,c:`dimmed`,children:[`over `,e.via.address]})]},`via`),(0,z.jsxs)(pl,{gap:`xs`,children:[(0,z.jsx)(Ed,{size:`xs`,onClick:()=>{t(e.key)},children:`Connect`}),(0,z.jsx)(Ed,{size:`xs`,variant:`light`,color:`red`,onClick:()=>{n(e.key)},children:`Dismiss`})]},`actions`)]}))})]})}function NL({label:e,hashes:t}){return(0,z.jsxs)(`div`,{children:[(0,z.jsx)(U,{size:`sm`,fw:600,children:e}),t.map(e=>(0,z.jsx)(Ld,{block:!0,children:nL(e)},e))]})}function PL({prompt:e}){let{assessment:t,decide:n}=e,r=t.kind===`changed`;return(0,z.jsx)(eu,{color:r?`red`:`blue`,title:r?`Certificate changed for ${t.node}`:`First connection to ${t.node}`,"data-testid":`certificate-prompt`,children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{size:`sm`,children:r?`This address presents a certificate that shares nothing with the one remembered for this node. The node may have replaced its certificate, or something else may be answering at this address. Only continue if you expected the change.`:`This console has not connected to this node before. Connecting pins the certificate below as the one to expect from it from now on. Compare it with what the node's operator reports before you trust it.`}),r&&(0,z.jsx)(NL,{label:`Remembered`,hashes:t.remembered}),(0,z.jsx)(NL,{label:r?`Presented now`:`Certificate (SHA-256)`,hashes:t.presented}),(0,z.jsxs)(pl,{children:[(0,z.jsx)(Ed,{size:`xs`,color:r?`red`:`blue`,onClick:()=>{n(!0)},children:r?`Trust the new certificate`:`Trust and connect`}),(0,z.jsx)(Ed,{size:`xs`,variant:`light`,onClick:()=>{n(!1)},children:`Cancel`})]})]})})}function FL({prompts:e,changes:t,onDismissChange:n}){let r=t.filter(e=>!e.dismissed);return e.length===0&&r.length===0?null:(0,z.jsxs)(rm,{gap:`sm`,"data-testid":`certificate-trust`,children:[e.map(e=>(0,z.jsx)(PL,{prompt:e},e.key)),r.map(e=>(0,z.jsx)(eu,{color:`red`,title:`${e.node} announced different certificates`,withCloseButton:!0,closeButtonLabel:`Dismiss`,onClose:()=>{n(e.key)},children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{size:`sm`,children:`The node is still reachable through the certificate you pinned, but it now announces certificates that share nothing with the ones remembered for it, and the announced set is what this console will pin from now on.`}),(0,z.jsx)(NL,{label:`Remembered`,hashes:e.remembered}),(0,z.jsx)(NL,{label:`Announced`,hashes:e.presented})]})},e.key))]})}function IL(e,t){let[n,r]=(0,k.useState)([]),[i,a]=(0,k.useState)([]),o=(0,k.useMemo)(()=>eL(e,e=>{a(n=>[...n,{...e,key:crypto.randomUUID(),at:t.now(),dismissed:!1}])}),[e,t]),s=(0,k.useRef)(new Map),c=(0,k.useRef)(new Map);(0,k.useEffect)(()=>{let e=c.current;return()=>{for(let{refuse:t}of[...e.values()])t()}},[]);let l=(0,k.useCallback)(async e=>{let t=`${e.node} ${[...e.presented].sort().join(`,`)}`,n=s.current.get(t);if(n!==void 0)return n.decision;let i=crypto.randomUUID(),a=new Promise(n=>{let a=!1,o=e=>{a||(a=!0,c.current.get(t)?.promptKey===i&&c.current.delete(t),s.current.get(t)?.promptKey===i&&s.current.delete(t),r(e=>e.filter(e=>e.key!==i)),n(e))};c.current.set(t,{promptKey:i,refuse:()=>{o(!1)}}),r(t=>[...t,{key:i,assessment:e,decide:o}])});return s.current.set(t,{promptKey:i,decision:a}),a},[]);return{prompts:n,changes:i,memory:o,confirmAddress:(0,k.useCallback)(async t=>{let n=$I(t);if(n===void 0)return t;let r=QI(n.node,n.sha256.map(e=>kO(e)),(await e.recall(n.node)).map(e=>kO(e)));if(r.kind===`known`)return zk(t,n.sha256.filter(e=>r.trusted.includes(kO(e))));if(await l(r))return await e.remember(n.node,n.sha256),t},[e,l]),dismissChange:(0,k.useCallback)(e=>{a(t=>t.map(t=>t.key===e?{...t,dismissed:!0}:t))},[])}}function LL({store:e,children:t}){let[n,r]=(0,k.useState)(new Map),[i,a]=(0,k.useState)(new Map),[o,s]=(0,k.useState)(void 0),[c,l]=(0,k.useState)(void 0),u=(0,k.useRef)(Promise.resolve()),d=(0,k.useCallback)(async e=>{u.current=u.current.then(async()=>{try{await e(),l(void 0)}catch(e){l(e instanceof Error?e.message:String(e))}}),await u.current},[]);(0,k.useEffect)(()=>{Promise.all([e.petnames(),e.selfName()]).then(([e,t])=>{r(e),s(t)},e=>{l(e instanceof Error?e.message:String(e))})},[e]);let f=(0,k.useCallback)(async(t,n)=>d(async()=>{await e.setPetname(t,n),r(await e.petnames())}),[e,d]),p=(0,k.useCallback)(async t=>d(async()=>{await e.setSelfName(t),s(await e.selfName())}),[e,d]),m=(0,k.useCallback)(e=>{a(t=>{let n;for(let r of e){let e=aN(r.advert),i=AO(r.device);t.get(i)!==e&&(n??=new Map(t),e===void 0?n.delete(i):n.set(i,e))}return n??t})},[]),h=(0,k.useMemo)(()=>new Set(n.values()),[n]),g=(0,k.useMemo)(()=>({labelOf:e=>sN(e,n.get(e),i.get(e),h),petnameOf:e=>n.get(e),rename:f,selfName:o,setSelfName:p,observeDirectory:m}),[n,h,i,o,f,p,m]);return(0,z.jsxs)(zI.Provider,{value:g,children:[c!==void 0&&(0,z.jsx)(eu,{color:`red`,title:`Saved names are unavailable`,mb:`md`,children:c}),t]})}function RL(){let{selfName:e,setSelfName:t}=BI(),[n,r]=(0,k.useState)(void 0),i=n??e??``;return(0,z.jsx)(`form`,{onSubmit:e=>{e.preventDefault(),DN(t(i).then(()=>{r(void 0)}))},children:(0,z.jsxs)(pl,{align:`flex-end`,wrap:`wrap`,children:[(0,z.jsx)(Am,{label:`Your display name`,description:`Shown to the peers you connect to, signed by this device's key. Leave empty to show only your short id.`,value:i,maxLength:64,onChange:e=>{r(e.currentTarget.value)},style:{flex:1,minWidth:`16rem`}}),(0,z.jsx)(Ed,{type:`submit`,variant:`light`,disabled:(iN(i)??``)===(e??``),children:`Save name`})]})})}function zL({onDismiss:e}){return(0,z.jsxs)(Nd,{withBorder:!0,padding:`md`,radius:`md`,"data-testid":`onboarding-intro`,children:[(0,z.jsx)(Lm,{order:2,size:`h4`,mb:`xs`,children:`Welcome to the wire-mesh console`}),(0,z.jsxs)(vf,{type:`ordered`,spacing:`xs`,size:`sm`,children:[(0,z.jsxs)(vf.Item,{children:[(0,z.jsx)(U,{span:!0,fw:600,children:`Connect.`}),` `,`Enter a node's address in the Node field and press Connect. A console served by a node starts with that node's address filled in, so there is usually nothing to type. The status line shows the connection coming up.`]}),(0,z.jsxs)(vf.Item,{children:[(0,z.jsx)(U,{span:!0,fw:600,children:`See who is here.`}),` `,`Once connected, the node's peer directory lists the devices it knows. Message opens a conversation with one. Devices appear under the name they chose for themselves, or a short id; use the pencil beside a device to give it a name of your own, which only this console keeps.`]}),(0,z.jsxs)(vf.Item,{children:[(0,z.jsx)(U,{span:!0,fw:600,children:`Discovered peers wait for you.`}),` `,`A node you are connected to can tell you about other nodes. Nothing vouches for those addresses except the node that listed them, and one may not be a wire-mesh node at all, so the console never dials one by itself. Each waits in the Discovered peers list until you press Connect or dismiss it.`]}),(0,z.jsxs)(vf.Item,{children:[(0,z.jsx)(U,{span:!0,fw:600,children:`Offline.`}),` `,`The console itself loads without a network, and conversations are kept on this device, so history stays readable. Sending needs a route to the peer, through a node or directly; a message that could not be sent stays with its reason until you retry or dismiss it.`]})]}),(0,z.jsx)(Ed,{mt:`md`,size:`xs`,onClick:e,children:`Got it`})]})}function BL(e,t){return e.sentAt===t.sentAt?kO(e.messageId).localeCompare(kO(t.messageId)):e.sentAt-t.sentAt}function VL(e,t){let n=new Set(e.map(e=>kO(e.messageId))),r=t.filter(e=>!n.has(kO(e.messageId)));return r.length===0?e:[...e,...r].sort(BL)}function HL(e,t,n){let r=e.get(t);return r===void 0?e:new Map(e).set(t,n(r))}function UL(e,t){return{roomPath:e,participants:t,direct:void 0,relay:void 0,via:void 0,token:void 0,status:`closed`,messages:[],notices:[],outgoing:[],pendingJoinRequest:void 0,unread:0}}function WL(e,t,n){let r=t===void 0?n===void 0?void 0:`hub`:`direct`;return{...e,direct:t,relay:n,via:r,status:r===void 0?`closed`:`connected`}}function GL(e,t){switch(t.type){case`direct-opened`:{let n=e.get(t.roomPath)??UL(t.roomPath,t.participants);return new Map(e).set(t.roomPath,{...WL(n,t.session,n.relay),participants:t.participants,notices:[]})}case`relay-opened`:{let n=e.get(t.roomPath)??UL(t.roomPath,t.participants);return new Map(e).set(t.roomPath,WL(n,n.direct,t.route))}case`direct-closed`:return HL(e,t.roomPath,e=>WL(e,void 0,e.relay));case`hub-closed`:{let n=e;for(let r of e.values())r.relay?.hub===t.hub&&(n=HL(n,r.roomPath,e=>WL(e,e.direct,void 0)));return n}case`restored`:return e.get(t.roomPath)===void 0?new Map(e).set(t.roomPath,{...UL(t.roomPath,t.participants),messages:VL([],t.messages)}):HL(e,t.roomPath,e=>({...e,messages:VL(e.messages,t.messages)}));case`notices`:return HL(e,t.roomPath,e=>({...e,notices:t.notices}));case`message`:return HL(e,t.roomPath,e=>{let n=VL(e.messages,[t.message]),r=n!==e.messages;return{...e,messages:n,unread:r&&t.message.direction===`received`?e.unread+1:e.unread}});case`read`:return HL(e,t.roomPath,e=>e.unread===0?e:{...e,unread:0});case`outgoing`:return HL(e,t.roomPath,e=>({...e,outgoing:e.outgoing.some(e=>e.localId===t.entry.localId)?e.outgoing.map(e=>e.localId===t.entry.localId?t.entry:e):[...e.outgoing,t.entry]}));case`outgoing-removed`:return HL(e,t.roomPath,e=>({...e,outgoing:e.outgoing.filter(e=>e.localId!==t.localId)}));case`join-request`:return HL(e,t.roomPath,e=>({...e,pendingJoinRequest:t.request}));case`join-request-settled`:return HL(e,t.roomPath,e=>({...e,pendingJoinRequest:void 0}));case`token`:return HL(e,t.roomPath,e=>({...e,token:t.token}))}return e}function KL(e,t){let n=SF(e);return n.kind===`dm`?n.participants.filter(e=>e!==t):n.owner===t?[]:[n.owner]}function qL(e,t){return e.participants.length===0?e.roomPath:e.participants.map(e=>cN(t.labelOf(e))).join(`, `)}function JL(e){return e.toLowerCase().split(/\s+/).filter(e=>e!==``)}function YL(e,t){let n=e.toLowerCase();return t.every(e=>n.includes(e))}function XL(e,t){let n=JL(t);if(n.length===0)return[];let r=new TextDecoder,i=[];for(let t of e)t.messages.forEach((e,r)=>{YL(e.text,n)&&i.push({key:`${t.roomPath}/message/${String(r)}`,roomPath:t.roomPath,kind:`message`,text:e.text,at:e.sentAt,direction:e.direction})}),t.notices.forEach((e,a)=>{if(e.plaintext===void 0||e.claims===void 0)return;let o=r.decode(e.plaintext);YL(o,n)&&i.push({key:`${t.roomPath}/notice/${String(a)}`,roomPath:t.roomPath,kind:`notice`,text:o,at:e.claims[`posted-at`],direction:void 0})});return i.sort((e,t)=>t.at-e.at).slice(0,50)}function ZL({conversations:e,onSelect:t}){let n=BI(),[r,i]=(0,k.useState)(``);if(e.length===0)return null;let a=XL(e,r),o=JL(r).length>0,s=new Map(e.map(e=>[e.roomPath,e]));return(0,z.jsxs)(rm,{gap:`xs`,"data-testid":`search-panel`,children:[(0,z.jsx)(Am,{type:`search`,label:`Search conversations and notices`,value:r,onChange:e=>{i(e.currentTarget.value)}}),o&&a.length===0&&(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`Nothing matches.`}),a.map(e=>{let i=s.get(e.roomPath);return(0,z.jsx)(Sf,{label:(0,z.jsx)(nf,{highlight:JL(r),size:`sm`,children:e.text}),description:(0,z.jsxs)(pl,{gap:`xs`,children:[(0,z.jsx)(_d,{size:`xs`,variant:`light`,children:e.kind}),(0,z.jsxs)(U,{size:`xs`,c:`dimmed`,children:[i===void 0?e.roomPath:qL(i,n),` · `,new Date(e.at).toLocaleString()]})]}),onClick:()=>{t(e.roomPath)}},e.key)})]})}var QL=16;function $L(){let e=new Uint8Array(QL);return crypto.getRandomValues(e),e}function eR(e,t){return{verb:e,params:{verb:`capability.request`,capability:e,...t===void 0?{}:{"valid-until":t}}}}var tR=class extends Error{capability;code;constructor(e,t){super(`capability request for "${e}" was refused (${t})`),this.name=`CapabilityRequestRefusedError`,this.capability=e,this.code=t}};async function nR(e,t,n,r,i,a,o){let s=await e.sendManageRequest(eR(t,a),n,r,o,i);if(s.result!==`ok`)throw new tR(t,s.code);let c=fD.safeParse(s);if(!c.success)throw Error(`capability request for "${t}" response was malformed`);return c.data}var rR=`manage:request`;async function iR(e,t){if(e.token===void 0)return{ok:!1,code:`token_required`};if(t.revocation===void 0)throw Error(`requireRequestToken needs a revocation view on the handler options`);let n=await SM(e.token,{identity:t.identity,clock:t.clock,revocation:t.revocation,expectedBearer:t.bearerDevice,...t.extraPredicateResolvers===void 0?{}:{extraPredicateResolvers:t.extraPredicateResolvers}});if(!n.ok)return{ok:!1,code:n.reason};if(n.claims.capability!==`manage:request`)return{ok:!1,code:`capability_mismatch`};let r=n.claims[`requests-capability`];return r!==void 0&&r!==t.capability?{ok:!1,code:`capability_mismatch`}:sA(n.claims.scope,e.scope)?{ok:!0}:{ok:!1,code:`scope_mismatch`}}function aR(e){return async function(t){let n=dD.safeParse(t.command.params);if(!n.success||n.data.capability!==e.capability){await t.respond({result:`error`,code:`malformed`});return}let r=n.data;if(e.requireRequestToken===!0){let n=await iR(t,e);if(!n.ok){await t.respond({result:`error`,code:n.code});return}}let i=r[`valid-until`];if(i!==void 0&&i<=e.clock.now()){await t.respond({result:`error`,code:`expired`});return}let a=!1,o=setTimeout(()=>{a||(a=!0,t.respond({result:`error`,code:`timeout`,message:`no decision within the capability-request timeout`}).catch(()=>void 0))},e.timeoutMs);xN(o),e.onRequest({scope:t.scope,requesterDevice:e.bearerDevice,async decide(n){if(a)return;if(a=!0,clearTimeout(o),n.kind===`reject`){await t.respond({result:`error`,code:`denied`,...n.reason===void 0?{}:{message:n.reason}});return}let r=await AM({identity:e.identity,clock:e.clock,tokenId:$L(),bearer:e.bearerDevice,capability:n.capability,scope:t.scope,expires:n.expires,...n.delegationsRemaining===void 0?{}:{delegationsRemaining:n.delegationsRemaining}});if(!r.ok){await t.respond({result:`error`,code:`mint_failed`});return}let i=r.token;await t.respond({result:`ok`,"granted-token":i,...n.extensions??{}})}})}}var oR=16,sR=36e5,cR=[{verb:`room:member`,scopeKind:`room`},{verb:`room:join`,scopeKind:`room`},{verb:`room:invite`,scopeKind:`room`},{verb:`webrtc:signal`,scopeKind:`node`},{verb:`relay:use`,scopeKind:`node`},{verb:`pin:write`,scopeKind:`folder`},{verb:`exec:pty`,scopeKind:`folder`},{verb:`exec:proc`,scopeKind:`folder`},{verb:`group:member`,scopeKind:`group`},{verb:hM,scopeKind:`folder`},{verb:rR,scopeKind:`room`}],lR={[hM]:`grantsCapability`,[rR]:`requestsCapability`},uR={invalid_capability:`its capability is not a valid capability verb`,already_expired:`the grant would already have expired`,parent_malformed:`the grant it delegates from is malformed`,parent_bearer_mismatch:`the grant it delegates from is not held by this device`,expires_exceeds_parent:`it would outlast the grant it delegates from`,scope_does_not_narrow:`its scope is wider than the grant it delegates from`,capability_mismatch:`its capability differs from the grant it delegates from`,delegation_exceeds_parent:`it permits more delegation than its parent does`,links_exclusive:`it would carry both a parent grant and an authorising grant`,authorisation_malformed:`the grant authorising it is malformed`,authorisation_parent_forbidden:`a grant permission cannot be delegated from a parent grant`,authorisation_bearer_mismatch:`the grant authorising it is not held by this device`,authorisation_capability_mismatch:`the grant authorising it names a different capability`,authorisation_scope_does_not_narrow:`its scope is wider than the grant authorising it`,authorisation_exceeds_authoriser:`it would outlast the grant authorising it`,authorisation_delegation_exceeds:`it permits more delegation than the grant authorising it does`,authorisation_conditions_not_satisfied:`the grant authorising it does not allow this mint`};function dR(e,t){let n=(t??``).trim();if(n===``)return{ok:!0};let r=lR[e];if(r===void 0)return{ok:!1,error:`only ${hM} and ${rR} name a verb they cover`};let i=YD.safeParse(n);return i.success?{ok:!0,claim:r,verb:i.data}:{ok:!1,error:`the covered verb must look like subsystem:action, for example room:member`}}function fR(){let e=new Uint8Array(oR);return crypto.getRandomValues(e),e}async function pR(e,t){let n;try{n=MO(e.bearerHex.trim().toLowerCase())}catch{return{ok:!1,error:`the bearer must be a 64-character hex device-id`}}let r=YD.safeParse(e.capability.trim());if(!r.success)return{ok:!1,error:`the capability must look like subsystem:action, for example room:member`};if(e.scopeKind.trim()===``)return{ok:!1,error:`the scope needs a kind, for example room`};if(!Number.isFinite(e.lifetimeHours)||e.lifetimeHours<=0)return{ok:!1,error:`the lifetime must be more than zero hours`};if(e.delegationsRemaining!==void 0&&!(Number.isSafeInteger(e.delegationsRemaining)&&e.delegationsRemaining>=0))return{ok:!1,error:`further delegations must be a whole number, zero or more`};let i=dR(r.data,e.targetVerb);if(!i.ok)return i;let a=e.selfGrantBars??[];if(a.length>0&&r.data!==`manage:grant`)return{ok:!1,error:`only a ${hM} can bar its holder from granting to itself`};let o=[];for(let e of a){let t=YD.safeParse(e.trim());if(!t.success)return{ok:!1,error:`the barred verb "${e}" must look like subsystem:action`};o.push(oM(t.data,n))}let s=e.scopePath.trim(),c=await AM({identity:t.identity,clock:t.clock,tokenId:fR(),bearer:n,capability:r.data,scope:{kind:e.scopeKind.trim(),...s===``?{}:{path:s}},expires:Math.round(t.clock.now()+e.lifetimeHours*sR),...e.delegationsRemaining===void 0?{}:{delegationsRemaining:e.delegationsRemaining},...e.parent===void 0?{}:{parent:e.parent},...e.authorisedBy===void 0?{}:{authorisedBy:e.authorisedBy},...i.claim===void 0||i.verb===void 0?{}:{[i.claim]:i.verb},...o.length===0?{}:{conditions:o}});return c.ok?{ok:!0,token:c.token}:{ok:!1,error:`refused: ${uR[c.reason]}`}}var mR=3e4;function hR(e){let{identity:t,clock:n,grants:r,revocations:i,announce:a}=e,[o,s]=(0,k.useState)([]),[c,l]=(0,k.useState)(void 0);(0,k.useEffect)(()=>{let e={cancelled:!1,latestLoad:0},a=async()=>{e.latestLoad+=1;let a=e.latestLoad,o=await r.list(),c=await Promise.all(o.map(async e=>({...e,status:await RM(e.token,{identity:t,clock:n,revocation:i.view,...e.direction===`held`?{expectedBearer:t.deviceId}:{}})})));!e.cancelled&&a===e.latestLoad&&(s(c),l(void 0))},o=()=>{a().catch(t=>{e.cancelled||l(t instanceof Error?t.message:String(t))})};o();let c=[r.subscribe(o),i.subscribe(o)],u=setInterval(o,mR);return()=>{e.cancelled=!0,clearInterval(u);for(let e of c)e()}},[t,n,r,i]);let u=(0,k.useCallback)(async e=>{let i=await pR(e,{identity:t,clock:n});return i.ok?(await r.record(`issued`,i.token,n.now()),{ok:!0,code:IM(i.token)}):i},[t,n,r]),d=(0,k.useCallback)(async e=>{let a;try{a=LM(e)}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}let o=await RM(a,{identity:t,clock:n,revocation:i.view,expectedBearer:t.deviceId});return o.kind===`invalid`?{ok:!1,error:`this device cannot hold that grant: ${BM(o)}`}:(await r.record(`held`,a,n.now()),{ok:!0})},[t,n,r,i]),f=(0,k.useCallback)(async e=>{try{let t=await i.revoke(e.claims[`token-id`]);return{ok:!0,announced:await a(t)}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}},[i,a]);return(0,k.useMemo)(()=>({rows:o,loadError:c,mint:u,importCode:d,revoke:f}),[o,c,u,d,f])}function gR({label:e,children:t}){return(0,z.jsxs)(U,{size:`sm`,children:[(0,z.jsxs)(U,{span:!0,fw:600,children:[e,`:`]}),` `,t]})}function _R({row:e}){let{claims:t}=e,n=IM(e.token);return(0,z.jsxs)(rm,{gap:4,"data-testid":`grant-details`,children:[(0,z.jsx)(gR,{label:`Token id`,children:(0,z.jsx)(Ld,{children:e.tokenId})}),(0,z.jsx)(gR,{label:`Issuer`,children:(0,z.jsx)(oL,{deviceHex:AO(t.issuer)})}),(0,z.jsx)(gR,{label:`Bearer`,children:(0,z.jsx)(oL,{deviceHex:AO(t.bearer)})}),(0,z.jsxs)(gR,{label:`Allows`,children:[t.capability,` over `,t.scope.kind,t.scope.path===void 0?``:` ${t.scope.path}`]}),(0,z.jsx)(gR,{label:`Expires`,children:new Date(t.expires).toISOString()}),t[`not-before`]!==void 0&&(0,z.jsx)(gR,{label:`Not before`,children:new Date(t[`not-before`]).toISOString()}),t[`delegations-remaining`]!==void 0&&(0,z.jsx)(gR,{label:`Further delegations`,children:t[`delegations-remaining`]}),t.parent!==void 0&&(0,z.jsx)(gR,{label:`Delegated from`,children:`another grant (its parent rides inside this one)`}),(0,z.jsx)(gR,{label:`Status`,children:BM(e.status)}),(0,z.jsx)(df,{readOnly:!0,label:`Grant code`,description:`Paste this into the other device's grant import to give it this grant.`,value:n,autosize:!0,minRows:2,maxRows:4}),(0,z.jsx)(zd,{value:n,children:({copied:e,copy:t})=>(0,z.jsx)(Ed,{size:`xs`,variant:`light`,onClick:t,w:`fit-content`,children:e?`Copied`:`Copy grant code`})})]})}function vR(e,t){return e>t?XI(e-t):YI(t-e)}function yR({title:e,rows:t,other:n,now:r,onRevoke:i}){let[a,o]=(0,k.useState)(void 0),[s,c]=(0,k.useState)(void 0);return(0,z.jsxs)(`div`,{"data-testid":`grants-${e.toLowerCase()}`,children:[(0,z.jsx)(U,{fw:600,size:`sm`,mt:`sm`,children:e}),t.length===0?(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`None.`}):(0,z.jsx)(SL,{columns:[{label:`capability`},{label:`over`},{label:n===`issuer`?`from`:`to`},{label:`expires`},{label:`status`},{label:`actions`,headerless:!0}],rows:t.map(e=>({key:`${e.direction}/${e.tokenId}`,cells:[e.claims.capability,`${e.claims.scope.kind}${e.claims.scope.path===void 0?``:` ${e.claims.scope.path}`}`,(0,z.jsx)(yL,{deviceHex:AO(e.claims[n])},`other`),vR(e.claims.expires,r),(0,z.jsx)(_d,{color:e.status.kind===`valid`?`green`:`red`,variant:`light`,children:BM(e.status)},`status`),(0,z.jsxs)(k.Fragment,{children:[(0,z.jsxs)(pl,{gap:`xs`,children:[(0,z.jsx)(Ed,{size:`xs`,variant:`light`,onClick:()=>{o(a===e.tokenId?void 0:e.tokenId)},children:a===e.tokenId?`Hide`:`Inspect`}),i!==void 0&&e.status.kind===`valid`&&(0,z.jsx)(Ed,{size:`xs`,color:`red`,variant:s===e.tokenId?`filled`:`light`,onClick:()=>{s===e.tokenId?(c(void 0),i(e)):c(e.tokenId)},children:s===e.tokenId?`Confirm: revoke for good`:`Revoke`})]}),a===e.tokenId&&(0,z.jsx)(_R,{row:e})]},`actions`)]}))})]})}function bR({onImport:e}){let[t,n]=(0,k.useState)(``),[r,i]=(0,k.useState)(void 0);return(0,z.jsx)(`form`,{onSubmit:r=>{r.preventDefault(),DN(e(t).then(e=>{i(e),e.ok&&n(``)}))},children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{fw:600,size:`sm`,mt:`md`,children:`Add a grant you were given`}),(0,z.jsx)(df,{label:`Grant code`,value:t,onChange:e=>{n(e.currentTarget.value)},autosize:!0,minRows:2,maxRows:4,required:!0}),(0,z.jsx)(Ed,{type:`submit`,size:`xs`,w:`fit-content`,children:`Add grant`}),r?.ok===!1&&(0,z.jsx)(eu,{color:`red`,title:`Not added`,children:r.error}),r?.ok===!0&&(0,z.jsx)(eu,{color:`green`,title:`Grant added`,children:`It is listed under Held.`})]})})}var xR=24,SR=`root`,CR=`none`;function wR(e){return e.split(`,`).map(e=>e.trim()).filter(e=>e!==``)}function TR({delegable:e,onMint:t}){let[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(``),[o,s]=(0,k.useState)(``),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(xR),[f,p]=(0,k.useState)(``),[m,h]=(0,k.useState)(SR),[g,_]=(0,k.useState)(CR),[v,y]=(0,k.useState)(``),[b,x]=(0,k.useState)(``),[S,C]=(0,k.useState)(void 0),w=e.find(e=>e.tokenId===m),T=e.find(e=>e.tokenId===g),E=e.filter(e=>e.claims.capability===hM),D=i===`manage:grant`||i===`manage:request`;function O(){if(m!==SR&&w===void 0){C({ok:!1,error:`the grant you chose to delegate from is no longer valid; choose another, or choose Root grant to mint without one`});return}if(g!==CR&&T===void 0){C({ok:!1,error:`the grant you chose to authorise this is no longer valid; choose another, or choose None to mint without one`});return}t({bearerHex:n,capability:i,scopeKind:o,scopePath:c,lifetimeHours:u,delegationsRemaining:f===``?void 0:f,parent:w?.token,authorisedBy:T?.token,targetVerb:D?v:``,selfGrantBars:i===`manage:grant`?wR(b):[]}).then(C,e=>{C({ok:!1,error:e instanceof Error?e.message:String(e)})})}return(0,z.jsx)(`form`,{onSubmit:e=>{e.preventDefault(),O()},children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{fw:600,size:`sm`,mt:`md`,children:`Mint a grant`}),(0,z.jsx)(Am,{label:`Bearer device-id`,description:`The device the grant is for: 64 hex characters, copied from a peer's directory row.`,value:n,onChange:e=>{r(e.currentTarget.value)},required:!0}),(0,z.jsx)(md,{label:`Capability`,description:`What it allows, as subsystem:action.`,data:cR.map(e=>e.verb),value:i,onChange:e=>{a(e);let t=cR.find(t=>t.verb===e);t!==void 0&&s(t.scopeKind)},required:!0}),(0,z.jsx)(Am,{label:`Scope kind`,value:o,onChange:e=>{s(e.currentTarget.value)},required:!0}),(0,z.jsx)(Am,{label:`Scope path`,description:`Leave empty for a scope with no path.`,value:c,onChange:e=>{l(e.currentTarget.value)}}),D&&(0,z.jsx)(Am,{label:`Covered verb`,description:i===`manage:grant`?`The one verb the holder may grant, as subsystem:action. Empty means any verb within the scope.`:`The one verb the holder may request, as subsystem:action. Empty means any verb within the scope.`,value:v,onChange:e=>{y(e.currentTarget.value)}}),i===`manage:grant`&&(0,z.jsx)(Am,{label:`Barred from granting to itself`,description:`Comma-separated verbs the holder may not grant to its own device, for example manage:grant to stop it passing on the right to grant.`,value:b,onChange:e=>{x(e.currentTarget.value)}}),(0,z.jsx)(Lp,{label:`Lasts (hours)`,min:0,value:u,onChange:e=>{d(typeof e==`number`?e:0)}}),(0,z.jsx)(Lp,{label:`Further delegations`,description:`How many times the bearer may pass it on. Empty leaves it unset.`,min:0,allowDecimal:!1,value:f,onChange:e=>{p(typeof e==`number`?e:``)}}),(0,z.jsx)($p,{label:`Delegate from`,description:`A grant you hold, which the new grant may only narrow. Root means none.`,allowDeselect:!1,data:[{value:SR,label:`Root grant (none)`},...e.map(e=>({value:e.tokenId,label:`${e.claims.capability} from ${nN(AO(e.claims.issuer))}`}))],value:m,onChange:e=>{h(e??SR)}}),(0,z.jsx)($p,{label:`Authorised by`,description:`A manage:grant you hold that permits this mint; it may bar what you can grant. None means this grant is minted on your own authority.`,allowDeselect:!1,data:[{value:CR,label:`None`},...E.map(e=>({value:e.tokenId,label:`manage:grant from ${nN(AO(e.claims.issuer))}`}))],value:g,onChange:e=>{_(e??CR)}}),(0,z.jsx)(Ed,{type:`submit`,size:`xs`,w:`fit-content`,children:`Mint grant`}),S?.ok===!1&&(0,z.jsx)(eu,{color:`red`,title:`Not minted`,children:S.error}),S?.ok===!0&&(0,z.jsx)(eu,{color:`green`,title:`Grant minted`,children:`It is listed under Issued, where Inspect shows its grant code.`})]})})}var ER=1e3;function DR(e){if(!e.ok)return{color:`red`,title:`Not revoked`,text:e.error};let{attempted:t,reached:n}=e.announced;return t===0?{color:`yellow`,title:`Revoked here only`,text:`No connection was open, so no node was told. This console no longer honours the grant.`}:n<t?{color:`yellow`,title:`Revoked, but not every node was told`,text:`Sent to ${String(n)} of ${String(t)} connected nodes. This console no longer honours the grant.`}:{color:`green`,title:`Revoked`,text:`Sent to ${String(n)} connected ${n===1?`node`:`nodes`}. This console no longer honours the grant.`}}function OR({grants:e,clock:t}){let n=UI(t,!0,ER),[r,i]=(0,k.useState)(void 0),a=r===void 0?void 0:DR(r),o=e.rows.filter(e=>e.direction===`held`),s=e.rows.filter(e=>e.direction===`issued`);return(0,z.jsxs)(rm,{gap:`xs`,"data-testid":`grants-panel`,children:[(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`A grant is a signed statement that one device may do something over something until a time. Revoking one you issued is recorded here, where this console stops honouring it at once, and sent to the nodes you are connected to. A node only passes it on if it relays revocations, which the hub does not.`}),e.loadError!==void 0&&(0,z.jsx)(eu,{color:`red`,title:`Grants could not be read`,children:e.loadError}),(0,z.jsx)(yR,{title:`Held`,rows:o,other:`issuer`,now:n}),(0,z.jsx)(yR,{title:`Issued`,rows:s,other:`bearer`,now:n,onRevoke:t=>{e.revoke(t).then(i,e=>{i({ok:!1,error:e instanceof Error?e.message:String(e)})})}}),a!==void 0&&(0,z.jsx)(eu,{color:a.color,title:a.title,"data-testid":`revocation-report`,children:a.text}),(0,z.jsx)(TR,{delegable:o.filter(e=>e.status.kind===`valid`),onMint:e.mint}),(0,z.jsx)(bR,{onImport:e.importCode})]})}var kR=6e4;function AR(e,t){let n=URL.createObjectURL(new Blob([t],{type:`application/json`})),r=document.createElement(`a`);r.href=n,r.download=e,r.hidden=!0,document.body.append(r),r.click(),r.remove(),setTimeout(()=>{URL.revokeObjectURL(n)},kR)}var jR=`wire-mesh-console-identity.json`,MR=2;function NR(){location.reload()}function PR({identity:e,backup:t,save:n=AR,reload:r=NR}){let i=AO(e.deviceId),[a,o]=(0,k.useState)({kind:`idle`}),[s,c]=(0,k.useState)(!1);async function l(){try{n(jR,JSON.stringify(await t.export(),void 0,MR)),o({kind:`exported`})}catch(e){o({kind:`error`,message:e instanceof Error?e.message:String(e)})}}async function u(e){try{await t.restore(e),o({kind:`restored`})}catch(e){o({kind:`error`,message:e instanceof Error?e.message:String(e)})}}async function d(e){if(e!==null)try{o({kind:`confirm-restore`,backup:await eA(await e.text())})}catch(e){o({kind:`error`,message:e instanceof Error?e.message:String(e)})}}return(0,z.jsxs)(rm,{gap:`xs`,"data-testid":`identity-panel`,children:[(0,z.jsxs)(U,{size:`sm`,children:[`This device is `,(0,z.jsx)(Ld,{"data-testid":`own-device-id`,children:i}),` `,(0,z.jsx)(zd,{value:i,children:({copied:e,copy:t})=>(0,z.jsx)(Ed,{size:`compact-xs`,variant:`subtle`,onClick:t,children:e?`Copied`:`Copy device id`})})]}),(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`Its key is ES256 (P-256) and lives in this browser. If this browser's storage is cleared or the device is lost, the identity is gone, along with every grant made to it. A backup file lets you keep it.`}),a.kind===`confirm-export`&&(0,z.jsx)(eu,{color:`orange`,title:`This file holds your private key`,children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{size:`sm`,children:`Anyone who has it can act as this device. Save it somewhere private, and do not send it to anyone. The console does not show the key or keep a copy of the file.`}),(0,z.jsx)(od,{label:`I understand, and I want a backup file`,checked:s,onChange:e=>{c(e.currentTarget.checked)}}),(0,z.jsxs)(pl,{children:[(0,z.jsx)(Ed,{size:`xs`,color:`orange`,disabled:!s,onClick:()=>{DN(l())},children:`Save backup file`}),(0,z.jsx)(Ed,{size:`xs`,variant:`light`,onClick:()=>{o({kind:`idle`})},children:`Cancel`})]})]})}),a.kind===`exported`&&(0,z.jsxs)(eu,{color:`green`,title:`Backup file handed to your browser`,children:[(0,z.jsx)(U,{size:`sm`,children:`The browser was asked to save it, and may have asked where. Check that the file is there before you rely on it.`}),(0,z.jsx)(U,{size:`sm`,children:`Keep it private. Restoring it on another browser makes that browser this device.`})]}),a.kind===`confirm-restore`&&(0,z.jsx)(eu,{color:`red`,title:`Replace this device's identity?`,children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsxs)(U,{size:`sm`,children:[`This device is now `,(0,z.jsx)(Ld,{children:i}),`. The backup is`,` `,(0,z.jsx)(Ld,{children:a.backup.deviceId}),`. Restoring makes this browser the backup's device the next time the console loads, and this identity, with the grants made to it, is gone unless you have a backup of it.`]}),(0,z.jsxs)(pl,{children:[(0,z.jsx)(Ed,{size:`xs`,color:`red`,onClick:()=>{DN(u(a.backup))},children:`Replace this identity`}),(0,z.jsx)(Ed,{size:`xs`,variant:`light`,onClick:()=>{o({kind:`idle`})},children:`Cancel`})]})]})}),a.kind===`restored`&&(0,z.jsx)(eu,{color:`green`,title:`Identity restored`,children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{size:`sm`,children:`Reload the console to run as the restored identity.`}),(0,z.jsx)(Ed,{size:`xs`,w:`fit-content`,onClick:r,children:`Reload now`})]})}),a.kind===`error`&&(0,z.jsx)(eu,{color:`red`,title:`That did not work`,children:a.message}),(a.kind===`idle`||a.kind===`exported`||a.kind===`error`)&&(0,z.jsxs)(pl,{children:[(0,z.jsx)(Ed,{size:`xs`,variant:`light`,onClick:()=>{c(!1),o({kind:`confirm-export`})},children:`Back up this identity`}),(0,z.jsx)(Wd,{accept:`application/json,.json`,onChange:e=>{DN(d(e))},children:e=>(0,z.jsx)(Ed,{size:`xs`,variant:`light`,color:`red`,...e,children:`Restore from a backup file`})})]})]})}function FR({identity:e,clock:t,grants:n,revocations:r,identityBackup:i,announceRevocation:a}){let o=hR({identity:e,clock:t,grants:n,revocations:r,announce:a});return(0,z.jsxs)(Zl,{multiple:!0,variant:`contained`,"data-testid":`identity-section`,children:[(0,z.jsxs)(Zl.Item,{value:`identity`,children:[(0,z.jsx)(Zl.Control,{children:`Identity`}),(0,z.jsx)(Zl.Panel,{children:(0,z.jsx)(PR,{identity:e,backup:i})})]}),(0,z.jsxs)(Zl.Item,{value:`grants`,children:[(0,z.jsx)(Zl.Control,{children:`Grants`}),(0,z.jsx)(Zl.Panel,{children:(0,z.jsx)(OR,{grants:o,clock:t})})]})]})}function IR({revocations:e,onFailure:t}){let n=(0,k.useSyncExternalStore)(e.subscribe,e.unreadable);return n.length===0?null:(0,z.jsx)(eu,{color:`red`,title:`Some stored revocations could not be loaded`,"data-testid":`unreadable-revocations`,children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{size:`sm`,children:`A grant that one of these revoked may read as valid until it is dealt with. Discarding an entry deletes it from this console's storage.`}),n.map(n=>(0,z.jsxs)(pl,{justify:`space-between`,children:[(0,z.jsxs)(U,{size:`sm`,children:[n.key,`: `,n.reason]}),(0,z.jsx)(Ed,{size:`xs`,color:`red`,variant:`light`,onClick:()=>{e.discardUnreadable(n.key).catch(e=>{t(e instanceof Error?e.message:String(e))})},children:`Discard`})]},n.key))]})})}function LR(e){return e instanceof Error?e.message:String(e)}function RR(e){let[t,n]=(0,k.useState)(void 0),[r,i]=(0,k.useState)(void 0);(0,k.useEffect)(()=>{e.introDismissed().then(n,e=>{n(!1),i(LR(e))})},[e]);let a=(0,k.useCallback)(t=>{n(t),e.setIntroDismissed(t).then(()=>{i(void 0)},e=>{i(LR(e))})},[e]),o=(0,k.useCallback)(()=>{a(!0)},[a]),s=(0,k.useCallback)(()=>{a(!1)},[a]);return{visible:t===!1,ready:t!==void 0,error:r,dismiss:o,show:s}}function zR({conversations:e,selected:t,onSelect:n}){let r=BI();return e.length===0?null:(0,z.jsxs)(rm,{gap:0,"data-testid":`conversation-list`,children:[(0,z.jsx)(U,{fw:600,size:`sm`,mb:`xs`,children:`Conversations`}),e.map(e=>(0,z.jsx)(Sf,{active:e.roomPath===t,label:qL(e,r),description:e.status===`connected`?void 0:`offline`,rightSection:(0,z.jsxs)(pl,{gap:4,wrap:`nowrap`,children:[e.pendingJoinRequest!==void 0&&(0,z.jsx)(_d,{color:`blue`,size:`sm`,children:`request`}),e.unread>0&&(0,z.jsx)(_d,{size:`sm`,"aria-label":`${String(e.unread)} unread`,children:e.unread})]}),onClick:()=>{n(e.roomPath)}},e.roomPath))]})}function BR({placeholder:e,ariaLabel:t,submitLabel:n,onSubmit:r,onCancel:i,size:a,autoFocus:o}){let[s,c]=(0,k.useState)(``),[l,u]=(0,k.useState)(void 0);function d(){let e=s.trim();e!==``&&(u(void 0),Promise.resolve(r(e)).then(()=>{c(``)}).catch(e=>{u(e instanceof Error?e.message:String(e))}))}function f(e){e.key===`Enter`&&d(),e.key===`Escape`&&i?.()}return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(pl,{gap:`xs`,flex:1,children:[(0,z.jsx)(Am,{flex:1,...a===void 0?{}:{size:a},placeholder:e,"aria-label":t,autoComplete:`off`,autoFocus:o,value:s,onChange:e=>{c(e.currentTarget.value)},onKeyDown:f}),(0,z.jsx)(Ed,{...a===void 0?{}:{size:a},onClick:d,children:n})]}),l!==void 0&&(0,z.jsx)(U,{size:`sm`,c:`red`,children:l})]})}var VR=`You`,HR=256,UR=new Intl.DateTimeFormat(void 0,{hour:`2-digit`,minute:`2-digit`});function WR({sentAt:e}){return(0,z.jsx)(U,{component:`time`,size:`xs`,c:`dimmed`,dateTime:new Date(e).toISOString(),children:UR.format(e)})}function GR({messages:e,outgoing:t,peerLabel:n,onRetry:r,onDiscard:i}){let a=(0,k.useRef)(null);return(0,k.useEffect)(()=>{let e=a.current;e!==null&&(e.scrollTop=e.scrollHeight)},[e,t]),(0,z.jsx)(Gs,{h:HR,viewportRef:a,children:(0,z.jsxs)(rm,{gap:4,children:[e.map((t,r)=>{let i=t.direction===`sent`,a=r===0||e[r-1]?.direction!==t.direction;return(0,z.jsxs)(rm,{gap:0,align:i?`flex-end`:`flex-start`,mt:a?`xs`:0,children:[a&&(0,z.jsx)(U,{size:`xs`,fw:600,c:`dimmed`,children:i?VR:n}),(0,z.jsx)(U,{size:`sm`,children:t.text}),(0,z.jsx)(WR,{sentAt:t.sentAt})]},kO(t.messageId))}),t.map(e=>(0,z.jsxs)(rm,{gap:0,align:`flex-end`,mt:`xs`,children:[(0,z.jsx)(U,{size:`xs`,fw:600,c:`dimmed`,children:VR}),(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:e.text}),e.status===`failed`?(0,z.jsxs)(pl,{gap:`xs`,children:[(0,z.jsx)(U,{size:`xs`,c:`red`,children:`Not sent: ${e.error}`}),(0,z.jsx)(Ed,{size:`compact-xs`,variant:`light`,onClick:()=>{r(e.localId)},children:`Retry`}),(0,z.jsx)(Ed,{size:`compact-xs`,variant:`subtle`,color:`gray`,onClick:()=>{i(e.localId)},children:`Dismiss`})]}):(0,z.jsx)(U,{size:`xs`,c:`dimmed`,children:e.status===`awaiting-approval`?`Waiting for ${n} to allow messages`:`Sending`})]},e.localId))]})})}function KR(e){if(e.plaintext!==void 0)return new TextDecoder().decode(e.plaintext)}function qR({notices:e}){if(e.length===0)return null;let t=e.map((e,t)=>{let n=KR(e);return(0,z.jsx)(H,{children:n===void 0?(0,z.jsx)(U,{size:`sm`,c:`dimmed`,fs:`italic`,children:`encrypted notice -- no key held for its epoch`}):(0,z.jsx)(U,{size:`sm`,children:n})},t)});return(0,z.jsxs)(rm,{gap:4,children:[t,(0,z.jsxs)(_d,{variant:`light`,color:`gray`,size:`sm`,w:`fit-content`,children:[e.length,` notice`,e.length===1?``:`s`]})]})}var JR=864e5;function YR(e){return e===`direct`?`direct`:e===`hub`?`via hub`:`offline`}function XR({view:e,onSend:t,onPostNotice:n,onRetry:r,onDiscard:i}){let a=BI();return(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsxs)(pl,{justify:`space-between`,children:[(0,z.jsx)(U,{fw:600,"data-testid":`conversation-header`,children:qL(e,a)}),(0,z.jsx)(U,{size:`sm`,c:e.status===`connected`?`green`:`dimmed`,children:YR(e.via)})]}),e.pendingJoinRequest&&(0,z.jsx)(eu,{color:`blue`,title:`Message request`,children:(0,z.jsxs)(pl,{justify:`space-between`,children:[(0,z.jsxs)(U,{size:`sm`,children:[(0,z.jsx)(oL,{deviceHex:e.pendingJoinRequest.requesterHex}),` `,`wants to message you`]}),(0,z.jsxs)(pl,{children:[(0,z.jsx)(Ed,{size:`xs`,onClick:()=>{DN(e.pendingJoinRequest?.decide({kind:`accept`,capability:`room:member`,expires:Date.now()+JR})??Promise.resolve())},children:`Allow`}),(0,z.jsx)(Ed,{size:`xs`,color:`red`,variant:`light`,onClick:()=>{DN(e.pendingJoinRequest?.decide({kind:`reject`})??Promise.resolve())},children:`Deny`})]})]})}),(0,z.jsx)(GR,{messages:e.messages,outgoing:e.outgoing,peerLabel:qL(e,a),onRetry:r,onDiscard:i}),(0,z.jsx)(pl,{children:(0,z.jsx)(BR,{ariaLabel:`Message`,placeholder:`Message`,submitLabel:`Send`,onSubmit:t})}),(0,z.jsx)(Ud,{label:`Durable notices (encrypted, replicated)`,labelPosition:`center`}),(0,z.jsx)(qR,{notices:e.notices}),e.via===void 0?(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`Durable notices can be posted while the conversation is connected.`}):(0,z.jsx)(pl,{children:(0,z.jsx)(BR,{ariaLabel:`Post a durable notice`,placeholder:`Post a durable notice`,submitLabel:`Post notice`,onSubmit:n})})]})}var ZR=`room:member`;async function QR(e,t){let n=await SM(e,{identity:t.identity,clock:t.clock,revocation:t.revocation,expectedBearer:t.expectedBearer});if(!n.ok)return n;if(n.claims.scope.kind!==`room`)return{ok:!1,reason:`wrong_scope_kind`};if(n.claims.scope.path!==t.roomPath)return{ok:!1,reason:`wrong_scope_path`};let r=SF(t.roomPath),i=AO(n.rootIssuer);if(r.kind===`owner-named`){if(i!==r.owner)return{ok:!1,reason:`wrong_chain_root`}}else if(t.dmRootPolicy===`either-participant`){if(i!==r.participants[0]&&i!==r.participants[1])return{ok:!1,reason:`wrong_chain_root`}}else if(i!==AO(t.identity.deviceId))return{ok:!1,reason:`wrong_chain_root`};return{ok:!0,claims:n.claims,rootIssuerKey:n.rootIssuerKey}}async function $R(e,t,n,r){let i=(await e.list()).filter(e=>{let t=e.claims;if(e.direction!==`held`||t.capability!==`manage:request`)return!1;let i=t[`requests-capability`];return i!==void 0&&i!==n?!1:sA(t.scope,r)}),a=async e=>{let[n,...r]=e;if(n!==void 0)return(await RM(n.token,t)).kind===`valid`?n.token:a(r)};return a(i)}function ez(e){if(e instanceof tR)switch(e.code){case`denied`:return`the other side denied the request`;case`token_required`:return`the other side only accepts requests that present a request permission, and this device holds none that covers this one`;case`capability_mismatch`:return`the request permission presented does not cover this capability`;case`scope_mismatch`:return`the request permission presented does not cover this conversation`;default:return`the request permission presented was refused (${e.code})`}}function tz(e){return async function(t){if(t.command.verb!==e.capability){await t.respond({result:`error`,code:`malformed`});return}let n=pD.safeParse(t.command.params);if(!n.success){await t.respond({result:`error`,code:`malformed`});return}let r=n.data[`granted-token`],i=await SM(r,{identity:e.identity,clock:e.clock,revocation:e.revocation,expectedBearer:e.identity.deviceId});if(!i.ok){await t.respond({result:`error`,code:i.reason});return}if(i.claims.capability!==e.capability){await t.respond({result:`error`,code:`capability_mismatch`});return}if(!sA(i.claims.scope,t.scope)){await t.respond({result:`error`,code:`scope_mismatch`});return}await t.respond({result:`ok`}),e.onGrant({capability:e.capability,grantedToken:r,scope:t.scope,granterDevice:e.granterDevice})}}var nz=16;function rz(){let e=new Uint8Array(nz);return crypto.getRandomValues(e),e}var iz=3e5;function az(e,t,n){return{verb:ZR,params:{verb:`room.send`,"message-id":t,"sent-at":n,text:e}}}async function oz(e,t,n,{token:r,targetDevice:i}){let a=az(n,rz(),Date.now());return e.sendManageRequest(a,{kind:`room`,path:t},i,r)}async function sz(e,t,{targetDevice:n,requestToken:r}={}){let i;try{i=await nR(e,ZR,{kind:`room`,path:t},n,void 0,void 0,r)}catch(e){let t=ez(e);throw t===void 0?e:Error(t)}let a=jD.safeParse(i);if(!a.success)throw Error(`room.join response for ${t} was malformed`);return{token:a.data[`granted-token`],members:a.data.members.map(e=>e.device)}}function cz(e,t,n){async function r(e,r){let i=e.scope.path;if(i===void 0||e.token===void 0){await e.respond({result:`error`,code:`unauthorized`});return}if(!(await QR(e.token,{identity:t.identity,clock:t.clock,revocation:t.revocation,expectedBearer:t.peerDevice,roomPath:i})).ok){await e.respond({result:`error`,code:`unauthorized`});return}await e.respond({result:`ok`});let a=r[`message-id`],o=r[`sent-at`],s=r.text;a instanceof Uint8Array&&typeof o==`number`&&typeof s==`string`&&n.onMessage?.({roomPath:i,text:s,messageId:a,sentAt:o})}function i(e){return async n=>{if(n.kind===`reject`){let t={kind:`reject`,...n.reason===void 0?{}:{reason:n.reason}};await e.decide(t);return}let r=[...t.currentMembers?.()??[],t.peerDevice].map(e=>({device:e})),i={kind:`accept`,capability:n.capability,expires:n.expires,...n.delegationsRemaining===void 0?{}:{delegationsRemaining:n.delegationsRemaining},extensions:{members:r}};await e.decide(i)}}let a=aR({capability:ZR,identity:t.identity,clock:t.clock,bearerDevice:t.peerDevice,timeoutMs:t.joinRequestTimeoutMs??iz,onRequest(e){let t=e.scope.path,r=n.onJoinRequest;if(t===void 0||r===void 0){e.decide({kind:`reject`,reason:`unsupported verb`}).catch(()=>void 0);return}r({roomPath:t,requesterDevice:e.requesterDevice,decide:i(e)})}});async function o(e){if(e.scope.path===void 0){await e.respond({result:`error`,code:`missing_scope_path`});return}if(n.onJoinRequest===void 0){await e.respond({result:`error`,code:`unsupported_verb`});return}await a({...e,respond:async t=>{if(t.result===`ok`){let e=nO.safeParse(t[`granted-token`]);e.success&&n.onGrantIssued?.(e.data)}await e.respond(t)}})}let s=tz({capability:ZR,identity:t.identity,clock:t.clock,revocation:t.revocation,granterDevice:t.peerDevice,onGrant(e){let t=e.scope.path,r=n.onRoomInvite;t!==void 0&&r!==void 0&&r({roomPath:t,granterDevice:e.granterDevice,token:e.grantedToken})}});async function c(e){if(e.scope.path===void 0){await e.respond({result:`error`,code:`missing_scope_path`});return}if(n.onRoomInvite===void 0){await e.respond({result:`error`,code:`unsupported_verb`});return}await s(e)}async function l(e){if(e.command.verb!==`room:member`)return;let t=e.command.params;typeof t==`object`&&`verb`in t&&(t.verb===`room.send`?await r(e,t):t.verb===`capability.request`?await o(e):t.verb===`capability.grant`?await c(e):t.verb===`room.rekey`&&n.onRekey!==void 0&&await n.onRekey(e))}DN(jN(e.incomingManageRequests,l,{onFault:t.onFault}))}var lz=`room-key/`,uz=`room-token/`,dz=`room-key-delivered/`,fz=String(2**53-1).length;function pz(e,t){return`${lz}${e}/${String(t).padStart(fz,`0`)}`}function mz(e){return{get:async(t,n)=>e.get(pz(t,n)),set:async(t,n,r)=>{await e.set(pz(t,n),new Uint8Array(r))},currentEpoch:async t=>{let n=(await e.keys(`${lz}${t}/`)).sort().at(-1);return n===void 0?void 0:Number(n.slice(n.lastIndexOf(`/`)+1))}}}function hz(e,t,n,r){return{get:async i=>{let a=uz+i,o=await e.get(a);if(o===void 0)return;let s=nO.safeParse(b_(o,x_));if(s.success&&(await SM(s.data,{identity:t,clock:n,revocation:r,expectedBearer:t.deviceId})).ok)return s.data;await e.delete(a)},set:async(t,n)=>{await e.set(uz+t,new Uint8Array(Mg(n,hg)))},rooms:async()=>(await e.keys(uz)).map(e=>e.slice(11))}}function gz(e){return{isDelivered:async t=>await e.get(dz+t)!==void 0,markDelivered:async t=>{await e.set(dz+t,new Uint8Array([1]))}}}var _z=32,vz=256,yz=12,bz=4,xz=8,Sz=new TextEncoder().encode(`wire-mesh/room-rekey/v1\0`);function Cz(){return crypto.getRandomValues(new Uint8Array(_z))}function wz(e){let t=new TextEncoder().encode(e.room),n=new Uint8Array(bz);new DataView(n.buffer).setUint32(0,t.length,!1);let r=new Uint8Array(xz);new DataView(r.buffer).setBigUint64(0,BigInt(e.keyEpoch),!1);let i=new Uint8Array(Sz.length+n.length+t.length+r.length),a=0;return i.set(Sz,a),a+=Sz.length,i.set(n,a),a+=n.length,i.set(t,a),a+=t.length,i.set(r,a),i}async function Tz(e,t){let n=await crypto.subtle.importKey(`raw`,Uint8Array.from(e),`HKDF`,!1,[`deriveKey`]);return crypto.subtle.deriveKey({name:`HKDF`,hash:`SHA-256`,salt:Uint8Array.from(new Uint8Array),info:Uint8Array.from(wz(t))},n,{name:`AES-GCM`,length:vz},!1,[`encrypt`,`decrypt`])}async function Ez(e,t){let n=crypto.getRandomValues(new Uint8Array(yz)),r=new Uint8Array(await crypto.subtle.encrypt({name:`AES-GCM`,iv:n},e,Uint8Array.from(t))),i=new Uint8Array(n.length+r.length);return i.set(n,0),i.set(r,n.length),i}async function Dz(e,t){if(t.length<yz)throw Error(`ciphertext shorter than the AES-GCM IV it must carry`);let n=t.slice(0,yz),r=t.slice(yz);return new Uint8Array(await crypto.subtle.decrypt({name:`AES-GCM`,iv:n},e,r))}async function Oz(e,t){return Ez(e,t)}async function kz(e,t){return Dz(e,t)}async function Az(e){return crypto.subtle.importKey(`raw`,Uint8Array.from(e),`AES-GCM`,!1,[`encrypt`,`decrypt`])}async function jz(e,t){return Ez(await Az(e),t)}async function Mz(e,t){return Dz(await Az(e),t)}var Nz=`+aes256gcm`;function Pz(e){return Iz(e)?e:`${e}${Nz}`}function Fz(e){return Iz(e)?e.slice(0,e.length-10):e}function Iz(e){return e.endsWith(Nz)}var Lz=`store_failed`;function Rz(e,t){return{verb:ZR,params:{verb:`room.rekey`,"key-epoch":e,"wrapped-key":t}}}async function zz(e,t,n,r,i,a){return e.sendManageRequest(Rz(n,r),{kind:`room`,path:t},i,a)}function Bz(e){return async function(t){if(t.command.verb!==`room:member`){await t.respond({result:`error`,code:`malformed`});return}let n=kD.safeParse(t.command.params);if(!n.success){await t.respond({result:`error`,code:`malformed`});return}if(t.scope.kind!==`room`||t.scope.path===void 0){await t.respond({result:`error`,code:`scope_mismatch`});return}let r=t.scope.path,i=await QR(e.ownRoomMemberToken,{identity:e.identity,clock:e.clock,revocation:e.revocation,expectedBearer:e.identity.deviceId,roomPath:r,dmRootPolicy:`either-participant`});if(!i.ok){await t.respond({result:`error`,code:i.reason});return}let a=e.identity.deriveSharedSecret;if(a===void 0){await t.respond({result:`error`,code:`ecdh_unsupported`});return}let o=n.data[`key-epoch`],s=Array.isArray(n.data[`wrapped-key`])?n.data[`wrapped-key`]:[n.data[`wrapped-key`]],c=o-s.length+1,l;try{let e=await a(i.rootIssuerKey);l=await Promise.all(s.map(async(t,n)=>kz(await Tz(e,{room:r,keyEpoch:c+n}),t)))}catch{await t.respond({result:`error`,code:`unwrap_failed`});return}try{await e.onRekey({room:r,keyEpoch:o,contentKeys:l})}catch(e){throw await t.respond({result:`error`,code:Lz}),e}await t.respond({result:`ok`})}}async function Vz(e,t){await e.reduce(async(e,n,r)=>{await e,await t(n,r)},Promise.resolve())}function Hz(e){return Uint8Array.from(e)}function Uz(e){return Hz(Mg(e,hg))}function Wz(e){return Uz({1:e.identityKey.alg,4:e.deviceId})}function Gz(e,t){return Mg([`Signature1`,e,new Uint8Array,t],hg)}function Kz(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1)if(e[n]!==t[n])return!1;return!0}async function qz(e,t){let[n,,r,i]=e;if(r===null)return{ok:!1,reason:`malformed`};let a;try{a=b_(r,x_)}catch{return{ok:!1,reason:`malformed`}}let o=ND.safeParse(a);if(!o.success)return{ok:!1,reason:`malformed`};let s=o.data;if(t.expectedRoom!==void 0&&s.room!==t.expectedRoom)return{ok:!1,reason:`wrong_room`};if(!await pk(t.identity,s[`poster-key`],Gz(n,r),i))return{ok:!1,reason:`bad_signature`};if(!Kz(await t.identity.deriveDeviceId(s[`poster-key`][`public-key`]),s.poster))return{ok:!1,reason:`wrong_poster`};let c=s[`valid-until`];if(c!==void 0&&c<=t.clock.now())return{ok:!1,reason:`content_expired`};let l=s[`key-epoch`];if(Iz(s[`content-type`])!==(l!==void 0))return{ok:!1,reason:`key_epoch_mismatch`};let u=await QR(s.token,{identity:t.identity,clock:t.clock,revocation:t.revocation,expectedBearer:s.poster,roomPath:s.room,...t.dmRootPolicy===void 0?{}:{dmRootPolicy:t.dmRootPolicy}});return u.ok?{ok:!0,claims:s}:{ok:!1,reason:u.reason}}async function Jz(e){let t=Uz({room:e.room,poster:e.identity.deviceId,"poster-key":e.identity.identityKey,token:e.token,"notice-id":e.noticeId,"posted-at":e.clock.now(),"content-type":e.contentType,content:e.content,...e.refs===void 0?{}:{refs:[...e.refs]},...e.validUntil===void 0?{}:{"valid-until":e.validUntil},...e.keyEpoch===void 0?{}:{"key-epoch":e.keyEpoch}}),n=Wz(e.identity);return[n,{},t,await e.identity.sign(Gz(n,t))]}var Yz=16;function Xz(e){return new Uint8Array(Mg(e,hg))}function Zz(e){let{identity:t,storage:n,clock:r,revocation:i,roomKeys:a}=e;async function o(e){let i=await a.currentEpoch(e.room);if(i===void 0)throw Error(`no content key held for room ${e.room}: room.rekey this room before posting encrypted notices`);let o=await a.get(e.room,i);if(o===void 0)throw Error(`content key store is inconsistent: epoch ${String(i)} is current for room ${e.room} but holds no key`);let s=e.noticeId??crypto.getRandomValues(new Uint8Array(Yz)),c=await jz(o,e.plaintext),l=await Jz({identity:t,clock:r,room:e.room,token:e.token,noticeId:s,contentType:Pz(e.contentType),content:c,keyEpoch:i}),{haveFrame:u}=await yP({identity:t,storage:n},Xz(l));return{dataHave:u,notice:l,keyEpoch:i}}async function s(e,t){let r=await vP(n,e);if(!(await SP(n,{type:`data-entries`,peer:e,"from-seq":r,entries:[t]})).ok)throw Error(`gap rejecting entry for peer log (head ${String(r)})`)}async function c(e,t,r){let i=await CP(n,e,0),a=[];return await rA(i,async e=>{a.push(await l(e,t,r))}),a}async function l(e,n,o){let s=u(e);if(s===void 0)return{verified:!1,reason:`malformed`};let c=await qz(s,{identity:t,clock:r,revocation:i,expectedRoom:n,dmRootPolicy:o});if(!c.ok)return{verified:!1,reason:c.reason};let l=c.claims;if(!Iz(l[`content-type`]))return{verified:!0,contentType:l[`content-type`],plaintext:l.content,claims:l};let d=l[`key-epoch`];if(d===void 0)return{verified:!1,reason:`key_epoch_mismatch`};let f=await a.get(l.room,d),p={verified:!0,contentType:Fz(l[`content-type`]),claims:l};if(f===void 0)return p;try{let e=await Mz(f,l.content);return{...p,plaintext:e}}catch{return p}}function u(e){try{let t=b_(e,x_),n=MD.safeParse(t);return n.success?n.data:void 0}catch{return}}return{postEncryptedNotice:o,ingestPeerEntry:s,readOwnNotices:async e=>c(t.deviceId,e,`either-participant`),readPeerNotices:async(e,t)=>c(e,t,`self`)}}var Qz=32;function $z(e){let{senders:t,storage:n,identity:r,clock:i,revocation:a,roomKeys:o,onChange:s}=e,c=Zz({identity:r,storage:n,clock:i,revocation:a,roomKeys:o});async function l(e,t){let r=await vP(n,t);await e.sendDataFrame({type:`data-request`,peer:t,"from-seq":r})}async function u(e){let t=await vP(n,r.deviceId);t!==0&&await e.sendDataFrame({type:`data-have`,peer:r.deviceId,"head-seq":t})}function d(e,t){if(e.type===`data-have`){l(t,e.peer).catch(()=>void 0);return}if(e.type===`data-entries`){(async()=>{(await SP(n,e)).ok&&(e.entries.length>=Qz&&await l(t,e.peer).catch(()=>void 0),s())})().catch(()=>void 0);return}e.type===`data-request`&&(async()=>{let r=await xP(n,e,Qz);r!==null&&await t.sendDataFrame(r)})().catch(()=>void 0)}return{handleFrame:d,async post(e){let{dataHave:n}=await c.postEncryptedNotice(e);await Promise.allSettled(t().map(async e=>e.sendDataFrame(n))),s()},async readRoom(e,t){let n=await c.readOwnNotices(e),r=await Promise.all(t.map(async t=>c.readPeerNotices(t,e)));return[...n,...r.flat()]},async sync(e,t){await u(e),await Promise.all(t.map(async t=>l(e,t)))},async pull(e){await Promise.allSettled(t().flatMap(t=>e.map(async e=>l(t,e))))},roomKeys:o}}async function eB(e){let{session:t,target:n,identity:r,clock:i,revocation:a,ownRoomMemberToken:o,roomPath:s,roomKeys:c,delivery:l}=e,u=s.split(`+`)[0]??``;if(u===``||AO(r.deviceId)!==u)return;let d=await c.currentEpoch(s);if(d!==void 0&&d!==1||await l.isDelivered(s))return;let f=await QR(o,{identity:r,clock:i,revocation:a,expectedBearer:r.deviceId,roomPath:s,dmRootPolicy:`either-participant`});if(!f.ok)throw Error(`own room token failed verification: ${f.reason}`);let p=r.deriveSharedSecret;if(p===void 0)throw Error(`this identity cannot derive ECDH shared secrets`);let m=d===void 0?Cz():await c.get(s,1);if(m===void 0)throw Error(`room ${s} lost its epoch 1 key`);let h=await Oz(await Tz(await p(f.rootIssuerKey),{room:s,keyEpoch:1}),m);d===void 0&&await c.set(s,1,m);let g=await zz(t,s,1,h,n,o);if(g.result!==`ok`)throw Error(`room.rekey was refused: ${g.code}`);await l.markDelivered(s)}var tB=[`core/management`,`core/room`],nB=16;function rB(){let e=new Uint8Array(nB);return crypto.getRandomValues(e),e}function iB(e){if(e?.direct!==void 0)return{session:e.direct,target:void 0};if(e?.relay!==void 0)return{session:e.relay.hub,target:e.relay.peer};throw Error(`conversation is not connected`)}function aB({identity:e,clock:t,messageStore:n,roomStorage:r,capabilities:i}){let{revocation:a,grants:o}=i,[s,c]=(0,k.useReducer)(GL,new Map),l=AO(e.deviceId),[u,d]=(0,k.useState)(void 0),f=(0,k.useCallback)(e=>{e.then(void 0,e=>{d(e instanceof Error?e.message:String(e))})},[]),p=(0,k.useRef)(s);(0,k.useEffect)(()=>{p.current=s},[s]);let m=(0,k.useRef)(new Set),h=(0,k.useRef)(new WeakSet),g=(0,k.useMemo)(()=>mz(r),[r]);function _(){return[...p.current.values()].flatMap(e=>e.participants.map(e=>MO(e)))}let v=(0,k.useRef)(()=>void 0),y=(0,k.useMemo)(()=>$z({senders:()=>[...new Set([...[...p.current.values()].flatMap(e=>[...e.direct===void 0?[]:[e.direct],...e.relay===void 0?[]:[e.relay.hub]]),...m.current])],storage:r,identity:e,clock:t,revocation:a,roomKeys:g,onChange:()=>{v.current()}}),[e,t,r,g,a]);function b(e){let t=p.current.get(e)?.participants;t!==void 0&&y.readRoom(e,t.map(e=>MO(e))).then(t=>{c({type:`notices`,roomPath:e,notices:[...t]})}).catch(()=>void 0)}(0,k.useEffect)(()=>{v.current=()=>{for(let e of p.current.keys())b(e)}});let x=(0,k.useRef)(new Map),S=(0,k.useMemo)(()=>gz(r),[r]),C=(0,k.useMemo)(()=>hz(r,e,t,a),[r,e,t,a]);async function w(e,t){x.current.set(e,t),await C.set(e,t)}async function T(e){let t=x.current.get(e);if(t!==void 0)return t;let n=await C.get(e);return n!==void 0&&x.current.set(e,n),n}(0,k.useEffect)(()=>{let e=new AbortController,t=()=>e.signal.aborted;return(async()=>{await Vz([...new Set([...await n.roomPaths(),...await C.rooms()])],async e=>{if(t())return;let r=await n.list(e);if(t())return;let i=KL(e,l);c({type:`restored`,roomPath:e,participants:i,messages:r}),y.readRoom(e,i.map(e=>MO(e))).then(t=>{c({type:`notices`,roomPath:e,notices:[...t]})}).catch(()=>void 0)})})().catch(()=>void 0),()=>{e.abort()}},[n,C,y,l]);let E=(0,k.useRef)(new Map);async function D(n,r,i){let o=E.current.get(n);if(o!==void 0)return o;let s=eB({session:i.session,target:i.target,identity:e,clock:t,revocation:a,ownRoomMemberToken:r,roomPath:n,roomKeys:g,delivery:S}).finally(()=>{E.current.delete(n)});return E.current.set(n,s),s}function O(r){return{onMessage:e=>{let t={direction:`received`,text:e.text,messageId:e.messageId,sentAt:e.sentAt};f(n.append(r,t)),c({type:`message`,roomPath:r,message:t}),y.pull((p.current.get(r)?.participants??[]).map(e=>MO(e))).catch(()=>void 0)},onGrantIssued:e=>{f(o.record(`issued`,e,t.now()))},onJoinRequest:e=>{c({type:`join-request`,roomPath:r,request:{requesterHex:AO(e.requesterDevice),async decide(t){c({type:`join-request-settled`,roomPath:r}),await e.decide(t),(async()=>{let e=await T(r),t=p.current.get(r);e!==void 0&&t!==void 0&&await D(r,e,iB(t))})().catch(()=>void 0)}}})},onRekey:async n=>{let i=await T(r);if(i===void 0){await n.respond({result:`error`,code:`no_token`});return}await Bz({identity:e,clock:t,revocation:a,ownRoomMemberToken:i,onRekey:async e=>{await Vz(e.contentKeys,async(t,n)=>{await g.set(r,e.keyEpoch-e.contentKeys.length+1+n,t)}),b(r)}})(n)}}}let A=(0,k.useCallback)(async(r,i)=>{let o={},u=await hF(r,e,tB,{clock:t,onFrame:(e,t)=>{o.current?.(t)}}),d=i??await u.peerDeviceId,f=AO(d),p=xF(l,f);if(s.get(p)?.direct!==void 0){await u.close();return}o.current=e=>{y.handleFrame(e,u)},c({type:`direct-opened`,roomPath:p,participants:[f],session:u}),c({type:`restored`,roomPath:p,participants:[f],messages:await n.list(p)}),y.sync(u,[d]).catch(()=>void 0),cz(u,{identity:e,clock:t,revocation:a,peerDevice:d,currentMembers:()=>[e.deviceId,d]},O(p)),DN(kN(u.events,e=>{e.state.status===`closed`&&c({type:`direct-closed`,roomPath:p})}))},[e,t,l,s,n,y]),j=(0,k.useCallback)(async n=>$R(o,{identity:e,clock:t,revocation:a,expectedBearer:e.deviceId},ZR,{kind:`room`,path:n}),[o,e,t,a]),M=(0,k.useCallback)(async(e,r,i)=>{let a=s.get(e),{session:l,target:u}=iB(a),d=a?.token;if(d===void 0){i(`awaiting-approval`);let n=await sz(l,e,{targetDevice:u,requestToken:await j(e)});i(`sending`),d=n.token,await w(e,d),f(o.record(`held`,d,t.now())),c({type:`token`,roomPath:e,token:d}),await D(e,d,{session:l,target:u}).catch(()=>void 0)}let p=await oz(l,e,r,{token:d,targetDevice:u});if(p.result!==`ok`)throw Error(`send failed: ${p.code}`);let m={direction:`sent`,text:r,messageId:rB(),sentAt:t.now()};return await n.append(e,m),m},[s,t,n,e,g,j]),N=(0,k.useCallback)(async(e,t,n)=>{c({type:`outgoing`,roomPath:e,entry:{localId:t,text:n,status:`sending`}});try{let r=await M(e,n,r=>{c({type:`outgoing`,roomPath:e,entry:{localId:t,text:n,status:r}})});c({type:`message`,roomPath:e,message:r}),c({type:`outgoing-removed`,roomPath:e,localId:t})}catch(r){c({type:`outgoing`,roomPath:e,entry:{localId:t,text:n,status:`failed`,error:r instanceof Error?r.message:String(r)}})}},[M]),ee=(0,k.useCallback)(async(e,t)=>N(e,crypto.randomUUID(),t),[N]),P=(0,k.useCallback)(async(e,t)=>{let n=s.get(e)?.outgoing.find(e=>e.localId===t);n!==void 0&&await N(e,t,n.text)},[s,N]),F=(0,k.useCallback)((e,t)=>{c({type:`outgoing-removed`,roomPath:e,localId:t})},[]),I=(0,k.useCallback)(async(e,n)=>{let r=s.get(e),{session:i,target:a}=iB(r),l=r?.token??await T(e);l===void 0&&(l=(await sz(i,e,{targetDevice:a,requestToken:await j(e)})).token,await w(e,l),f(o.record(`held`,l,t.now())),c({type:`token`,roomPath:e,token:l})),await D(e,l,{session:i,target:a}),await y.post({room:e,token:l,contentType:`text/plain`,plaintext:new TextEncoder().encode(n)}),b(e)},[s,e,t,g,y,j]),te=(0,k.useCallback)(e=>{c({type:`read`,roomPath:e})},[]),ne=(0,k.useCallback)((e,t)=>{let r=xF(l,AO(t)),i=[AO(t)];c({type:`relay-opened`,roomPath:r,participants:i,route:{hub:e,peer:t}}),n.list(r).then(e=>{c({type:`restored`,roomPath:r,participants:i,messages:e})}).catch(()=>void 0),y.sync(e,[t]).catch(()=>void 0)},[l,n,y]),re=(0,k.useCallback)(n=>{let r=new Map;m.current.add(n),DN(kN(n.incomingManageRequests,i=>{let o=i.fromDevice;if(o===void 0)return;let s=AO(o),c=r.get(s);if(c===void 0){let i=lP(),u=xF(l,s);ne(n,o),cz({incomingManageRequests:i.stream},{identity:e,clock:t,revocation:a,peerDevice:o,currentMembers:()=>[e.deviceId,o]},O(u)),r.set(s,i),c=i}c.push(i)}))},[e,t,l,ne]),ie=(0,k.useCallback)(e=>{m.current.delete(e),c({type:`hub-closed`,hub:e})},[]),L=(0,k.useCallback)((e,t,n)=>{h.current.has(t)||(h.current.add(t),y.sync(e,_()).catch(()=>void 0)),y.handleFrame(n,e)},[y]);return{conversations:[...s.values()],persistenceFailure:u,openRelay:ne,watchHub:re,dropHub:ie,onHubFrame:L,attach:A,send:ee,retry:P,discard:F,postNotice:I,markRead:te}}function oB(e,t,n={}){let r=new Map(t.map(e=>[e,lP()]));return DN(kN(e,e=>{r.get(e.command.verb)?.push(e)},{onFault:n.onFault})),{stream:e=>{let t=r.get(e);if(t===void 0)throw Error(`the demux was not built to carry verb ${e}`);return t.stream}}}var sB=8787,cB=/^(localhost|127\.\d+\.\d+\.\d+)(:\d+)?$/;function lB(e){return cB.test(e)}async function uB(e=sB){try{return await fetch(`http://127.0.0.1:${String(e)}/`,{mode:`no-cors`}),`ws://127.0.0.1:${String(e)}`}catch{return}}async function dB(e=typeof location>`u`?``:location.host){return lB(e)?Promise.resolve(void 0):uB()}var fB=`ws://localhost:8787`,pB=[`core/management`,`core/exec`,`core/data`],mB=[`core/management`,`core/data`],hB=[ZF,ZR];function gB({identity:e,clock:t,messageStore:n,roomStorage:r,certificateMemory:i,nameStore:a,preferences:o,grants:s,revocations:c,identityBackup:l,discoverLocalNode:u=dB,defaultAddress:d=fB}){let[f,p]=(0,k.useState)(d),[m,h]=(0,k.useState)(mB),[g,_]=(0,k.useState)([]),[v,y]=(0,k.useState)([]),[b,x]=(0,k.useState)([]),[S,C]=(0,k.useState)(void 0),w=RR(o),T=IL(i,t),E=(0,k.useMemo)(()=>({revocation:c.view,grants:s}),[c,s]),D=aB({identity:e,clock:t,messageStore:n,roomStorage:r,capabilities:E}),[O,A]=(0,k.useState)(),j=D.conversations.find(e=>e.roomPath===O)??D.conversations[0],{markRead:M}=D,N=j?.roomPath,ee=j?.unread??0;(0,k.useEffect)(()=>{N!==void 0&&ee>0&&M(N)},[N,ee,M]);let P=(0,k.useRef)(new Map),F=(0,k.useRef)(D.onHubFrame);(0,k.useEffect)(()=>{F.current=D.onHubFrame},[D.onHubFrame]);let I=(0,k.useRef)(D.watchHub);(0,k.useEffect)(()=>{I.current=D.watchHub},[D.watchHub]);let te=(0,k.useRef)(D.attach);(0,k.useEffect)(()=>{te.current=D.attach},[D.attach]);let ne=(0,k.useRef)(g);(0,k.useEffect)(()=>{ne.current=g},[g]);let re=(0,k.useRef)(new Set),ie=(0,k.useRef)(new Map),L=(0,k.useRef)(!1),R=()=>L.current;(0,k.useEffect)(()=>(L.current=!1,()=>{L.current=!0;for(let e of ne.current)DN(e.session.close())}),[]);let ae=(0,k.useRef)(m);(0,k.useEffect)(()=>{ae.current=m},[m]);function oe(n,r){let i=oB(r.incomingManageRequests,hB),a=gI({sendManageRequest:async(...e)=>r.sendManageRequest(...e),incomingManageRequests:i.stream(ZF)},{identity:e,clock:t,revocation:E.revocation,iceServers:XF,onIncomingConnection:e=>{DN(te.current(e))}});DN(kN(r.revocationAnnouncements,async e=>{await c.ingest(e)},{onFault:e=>{C(e instanceof Error?e.message:String(e))}}));let o={sendManageRequest:async(...e)=>r.sendManageRequest(...e),sendDataFrame:async e=>r.sendDataFrame(e),incomingManageRequests:i.stream(ZR)};P.current.set(r,o),I.current(o),_(e=>[...e,{address:n,session:r,hub:o,negotiator:a}])}async function se(e,t){let n=TL(e.device);for(let t of e.addresses){let e=ie.current.get(t)??new Set;e.add(n),ie.current.set(t,e)}return new Promise(r=>{y(i=>[...i,{key:n,device:e.device,addresses:e.addresses,via:t,resolve:r}])})}function ce(e,t){y(n=>(n.find(t=>t.key===e)?.resolve(t),n.filter(t=>t.key!==e)))}function le(n){let r={current:null},i={current:null},a=mF(YF(T.memory),e,t,DF,[],e=>{r.current?.considerAdvert(e)},(e,t)=>{let n=i.current===null?void 0:P.current.get(i.current);n!==void 0&&F.current(n,e,t)});return i.current=a,r.current=_F({selfDeviceId:e.deviceId,shouldExpand:async e=>se(e,n),dial:de,onExpanded:(e,t,n)=>{oe(t,n),ue(e)},onExpansionDeclined:ue,onExpansionFailed:ue}),a}function ue(e){let t=TL(e.device);for(let n of e.addresses){let e=ie.current.get(n);e?.delete(t),e?.size===0&&ie.current.delete(n)}}async function de(e){let t=await T.confirmAddress(aL(e));if(t===void 0)throw Error(`the certificate of ${e} was not trusted`);if(R())throw Error(`the console was closed before the dial began`);let n=ie.current.get(e),[r]=n??[],i=le({address:e,claimedDevice:n?.size===1?r:void 0});if(await i.connect(t,ae.current),R())throw await i.close(),Error(`the console was closed while the dial was connecting`);return i}function fe(e){ne.current.some(t=>t.address===e)||re.current.has(e)||(re.current.add(e),T.confirmAddress(aL(e)).then(t=>{if(t===void 0||R())return;let n=le({address:e,claimedDevice:void 0});oe(e,n),n.connect(t,m).catch(()=>{})}).catch(()=>void 0).finally(()=>{re.current.delete(e)}))}let pe=(0,k.useRef)(fe);(0,k.useEffect)(()=>{pe.current=fe});let me=(0,k.useRef)(u);(0,k.useEffect)(()=>{me.current=u},[u]);let he=(0,k.useRef)(!1);(0,k.useEffect)(()=>{he.current||(he.current=!0,me.current().then(e=>{e!==void 0&&pe.current(e)}).catch(()=>void 0))},[]);function ge(e){e.preventDefault(),fe(f)}async function _e(e){let t=await Promise.allSettled(ne.current.map(async t=>t.session.sendRevocationAnnounce([e])));return{attempted:t.length,reached:t.filter(e=>e.status===`fulfilled`).length}}function ve(e){D.dropHub(e.hub),DN(e.session.close()),_(t=>t.filter(t=>t.session!==e.session))}function ye(t,n){D.openRelay(t.hub,n),A(xF(AO(e.deviceId),AO(n))),t.negotiator.initiate(n).then(async e=>D.attach(e,n)).catch(e=>{x(t=>[...t,{key:crypto.randomUUID(),peer:TL(n),reason:e instanceof Error?e.message:String(e)}])})}return(0,z.jsx)(LL,{store:a,children:(0,z.jsxs)(rm,{className:bL,p:`md`,gap:`lg`,children:[(0,z.jsxs)(pl,{justify:`space-between`,children:[(0,z.jsx)(Lm,{order:1,children:`wire-mesh console`}),w.ready&&!w.visible&&(0,z.jsx)(Ed,{size:`xs`,variant:`subtle`,onClick:w.show,children:`How this works`})]}),w.error!==void 0&&(0,z.jsx)(eu,{color:`red`,title:`The first-run intro's setting is unavailable`,children:w.error}),w.visible&&(0,z.jsx)(zL,{onDismiss:w.dismiss}),(0,z.jsx)(RL,{}),(0,z.jsxs)(`form`,{onSubmit:ge,children:[(0,z.jsxs)(pl,{align:`flex-end`,wrap:`wrap`,children:[(0,z.jsx)(Am,{label:`Node`,value:f,onChange:e=>{p(e.currentTarget.value)},required:!0,style:{flex:1,minWidth:`16rem`}}),(0,z.jsx)(Ed,{type:`submit`,children:`Connect`})]}),(0,z.jsx)(od.Group,{label:`Domains offered`,value:m,onChange:h,children:(0,z.jsx)(pl,{mt:`xs`,children:pB.map(e=>(0,z.jsx)(od,{value:e,label:e},e))})})]}),(0,z.jsx)(FL,{prompts:T.prompts,changes:T.changes,onDismissChange:T.dismissChange}),(0,z.jsx)(ML,{peers:v,onConnect:e=>{ce(e,!0)},onDismiss:e=>{ce(e,!1)}}),g.map(e=>(0,z.jsx)(AL,{address:e.address,session:e.session,clock:t,reconnectPolicy:DF,certificateChanges:T.changes,onClose:()=>{ve(e)},onMessagePeer:t=>{ye(e,t)}},e.address)),b.map(e=>(0,z.jsxs)(eu,{color:`yellow`,title:(0,z.jsxs)(z.Fragment,{children:[`No direct connection to `,(0,z.jsx)(oL,{deviceHex:e.peer})]}),withCloseButton:!0,onClose:()=>{x(t=>t.filter(t=>t.key!==e.key))},children:[e.reason,`. Messages go through the hub instead.`]},e.key)),D.persistenceFailure!==void 0&&(0,z.jsxs)(eu,{color:`red`,title:`Could not save to this console's storage`,children:[D.persistenceFailure,`. The conversation carries on, but what failed to save will be missing after a reload.`]}),S!==void 0&&(0,z.jsx)(eu,{color:`red`,title:`A revocation could not be stored`,children:S}),(0,z.jsx)(IR,{revocations:c,onFailure:C}),(0,z.jsx)(ZL,{conversations:D.conversations,onSelect:A}),(0,z.jsx)(FR,{identity:e,clock:t,grants:s,revocations:c,identityBackup:l,announceRevocation:_e}),(0,z.jsx)(zR,{conversations:D.conversations,selected:j?.roomPath,onSelect:A}),j!==void 0&&(0,z.jsx)(XR,{view:j,onSend:async e=>D.send(j.roomPath,e),onPostNotice:async e=>D.postNotice(j.roomPath,e),onRetry:e=>{DN(D.retry(j.roomPath,e))},onDiscard:e=>{D.discard(j.roomPath,e)}},j.roomPath)]})})}var _B=`modulepreload`,vB=function(e){return`/`+e},yB={},bB=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=vB(t,n),t=s(t),t in yB)return;yB[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:_B,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},xB=`false`,SB=`false`,CB=xB===`true`,wB=SB===`true`;function TB(e={}){let{immediate:t=!1,onNeedReload:n,onNeedRefresh:r,onOfflineReady:i,onRegistered:a,onRegisteredSW:o,onRegisterError:s}=e,c,l,u,d=async(e=!0)=>{await l,CB||u?.()};async function f(){if(`serviceWorker`in navigator){if(c=await bB(async()=>{let{Workbox:e}=await import(`./workbox-window.prod.es5-Bd17z0YL.js`);return{Workbox:e}},[]).then(({Workbox:e})=>new e(`/sw.js`,{scope:`/`,type:`classic`})).catch(e=>{s?.(e)}),!c)return;if(u=()=>{c?.messageSkipWaiting()},!wB){if(CB)c.addEventListener(`activated`,e=>{(e.isUpdate||e.isExternal)&&(n?n():window.location.reload())}),c.addEventListener(`installed`,e=>{e.isUpdate||i?.()});else{let e=!1,t=()=>{e=!0,c?.addEventListener(`controlling`,e=>{e.isUpdate&&(n?n():window.location.reload())}),r?.()};c.addEventListener(`installed`,n=>{n.isUpdate===void 0?n.isExternal===void 0?!e&&i?.():n.isExternal?t():!e&&i?.():n.isUpdate||i?.()}),c.addEventListener(`waiting`,t)}}c.register({immediate:t}).then(e=>{o?o(`/sw.js`,e):a?.(e)}).catch(e=>{s?.(e)})}}return l=f(),d}function EB(e={}){let{immediate:t=!0,onNeedReload:n,onNeedRefresh:r,onOfflineReady:i,onRegistered:a,onRegisteredSW:o,onRegisterError:s}=e,[c,l]=(0,k.useState)(!1),[u,d]=(0,k.useState)(!1),[f]=(0,k.useState)(()=>TB({immediate:t,onNeedReload:n,onOfflineReady(){d(!0),i?.()},onNeedRefresh(){l(!0),r?.()},onRegistered:a,onRegisteredSW:o,onRegisterError:s}));return{needRefresh:[c,l],offlineReady:[u,d],updateServiceWorker:f}}function DB(){let{offlineReady:[e,t],needRefresh:[n,r],updateServiceWorker:i}=EB();function a(){t(!1),r(!1)}return!e&&!n?null:(0,z.jsx)(Ef,{onClose:a,closeButtonProps:{"aria-label":`Dismiss`},title:n?`Update available`:`Ready to work offline`,pos:`fixed`,bottom:`1rem`,right:`1rem`,style:{zIndex:1e3},children:(0,z.jsx)(pl,{gap:`xs`,children:n?(0,z.jsx)(Ed,{size:`xs`,onClick:()=>{DN(i(!0))},children:`Reload`}):void 0})})}var OB=`ws://localhost:8787`;function kB(e){return`${e.protocol===`https:`?`wss:`:`ws:`}//${e.host}`}function AB(e,t){return e?OB:kB(t)}var jB=await qm(),MB=await Tk(jB),NB={now:()=>Date.now()},PB=GM(await qm()),FB=await XM({storage:await qm(),identity:MB,clock:NB}),IB=tA(jB),LB=bN(await qm()),RB=await qm(),zB=Vk(await qm()),BB=pN(await qm()),VB=$M(await qm()),HB=AB(!1,window.location),UB=document.getElementById(`root`);if(UB===null)throw Error(`missing #root element`);(0,Rm.createRoot)(UB).render((0,z.jsx)(k.StrictMode,{children:(0,z.jsxs)(xn,{children:[(0,z.jsx)(gB,{identity:MB,clock:NB,messageStore:LB,roomStorage:RB,certificateMemory:zB,nameStore:BB,preferences:VB,grants:PB,revocations:FB,identityBackup:IB,defaultAddress:HB}),(0,z.jsx)(DB,{})]})}));
85
+ `,t:` `,r:`\r`,f:`\f`,v:`\v`},pj=class{pattern;pos=0;constructor(e){this.pattern=e}get position(){return this.pos}atEnd(){return this.pos>=this.pattern.length}peek(e=0){return this.pattern[this.pos+e]}advance(){let e=this.pattern[this.pos];if(e===void 0)throw new rj(this.pattern,this.pos,`unexpected end of pattern`);return this.pos+=1,e}parseAlternation(){let e=this.parseSequence(),t=[];for(;this.peek()===`|`;)this.advance(),t.push(this.parseSequence());return t.length===0?e:{kind:`alternation`,branches:[e,...t]}}parseSequence(){if(this.atEnd()||dj.has(this.peek()??``))return{kind:`concat`,operands:[]};let e=this.parseQuantified(),t=[];for(;!this.atEnd()&&!dj.has(this.peek()??``);)t.push(this.parseQuantified());return t.length===0?e:{kind:`concat`,operands:[e,...t]}}parseQuantified(){let e=this.pos,t=this.parseAtom();if(t.kind===`anchorStart`||t.kind===`anchorEnd`){if(this.peekIsQuantifierStart())throw new rj(this.pattern,e,`an anchor ('${t.kind===`anchorStart`?`^`:`$`}') cannot be quantified`);return t}let n=this.tryParseQuantifier();if(n===void 0)return t;if(this.peekIsQuantifierStart())throw new rj(this.pattern,this.pos,`a quantifier cannot itself be quantified -- this grammar has no lazy or possessive modifiers, since a pattern that only ever answers a yes/no match question has no notion for either to change`);switch(n.kind){case`star`:return{kind:`star`,operand:t};case`plus`:return{kind:`plus`,operand:t};case`optional`:return{kind:`optional`,operand:t};case`repeat`:return{kind:`repeat`,operand:t,min:n.min,max:n.max};default:throw Error(`unreachable quantifier kind`)}}peekIsQuantifierStart(){let e=this.peek();if(e===`*`||e===`+`||e===`?`)return!0;if(e===`{`){let e=this.pos,t=this.tryParseBound();return this.pos=e,t!==void 0}return!1}tryParseQuantifier(){let e=this.peek();if(e===`*`)return this.advance(),{kind:`star`};if(e===`+`)return this.advance(),{kind:`plus`};if(e===`?`)return this.advance(),{kind:`optional`};if(e===`{`){let e=this.tryParseBound();return e===void 0?void 0:{kind:`repeat`,min:e.min,max:e.max}}}tryParseBound(){let e=this.pos;this.pos+=1;let t=this.readDigits();if(t===``){this.pos=e;return}let n,r=!1;if(this.peek()===`,`&&(r=!0,this.pos+=1,n=this.readDigits()),this.peek()!==`}`){this.pos=e;return}this.pos+=1;let i=Number.parseInt(t,10),a=r?n===``?void 0:Number.parseInt(n??``,10):i;if(a!==void 0&&a<i)throw new rj(this.pattern,e,`quantifier range is backwards: {${t}${r?`,`+(n??``):``}} would require between ${String(i)} and ${String(a)} repetitions`);return{min:i,max:a}}readDigits(){let e=``;for(;;){let t=this.peek();if(t===void 0||t<`0`||t>`9`)break;e+=t,this.pos+=1}return e}parseAtom(){let e=this.peek();if(e===void 0)throw new rj(this.pattern,this.pos,`unexpected end of pattern`);if(e===`^`)return this.advance(),{kind:`anchorStart`};if(e===`$`)return this.advance(),{kind:`anchorEnd`};if(e===`.`)return this.advance(),{kind:`anyChar`};if(e===`(`)return this.parseGroup();if(e===`[`)return this.parseCharClass();if(e===`\\`)return this.parseEscapedAtom();if(e===`*`||e===`+`||e===`?`)throw new rj(this.pattern,this.pos,`quantifier '${e}' with nothing to repeat`);return this.advance(),{kind:`literal`,codeUnit:e.charCodeAt(0)}}parseGroup(){let e=this.pos;if(this.advance(),this.peek()===`?`&&this.peek(1)===`:`)this.advance(),this.advance();else throw new rj(this.pattern,e,`capturing groups are not supported in this grammar -- there is nothing to capture, since a pattern only ever answers whether it matches. Use '(?:...)' for grouping.`);let t=this.parseAlternation();if(this.peek()!==`)`)throw new rj(this.pattern,this.pos,`expected ')' to close '(?:'`);return this.advance(),t}parseEscapedAtom(){let e=this.pos;if(this.advance(),this.atEnd())throw new rj(this.pattern,e,`trailing backslash with nothing to escape`);let t=this.advance();if(t===`d`||t===`D`||t===`w`||t===`W`||t===`s`||t===`S`)return uj(t);let n=fj[t];if(n!==void 0)return{kind:`literal`,codeUnit:n.charCodeAt(0)};throw new rj(this.pattern,e,`unknown escape sequence '\\${t}'`)}parseCharClass(){let e=this.pos;this.advance();let t=!1;this.peek()===`^`&&(this.advance(),t=!0);let n=[];for(;;){if(this.atEnd())throw new rj(this.pattern,e,`unterminated character class -- missing closing ']'`);if(this.peek()===`]`){if(n.length===0)throw new rj(this.pattern,this.pos,`a character class must contain at least one item -- ']' immediately, or immediately after '[^', is not the empty class here (escape it as '\\]' to match a literal ']')`);this.advance();break}n.push(...this.parseClassItem())}return{kind:`charClass`,negated:t,ranges:n}}parseClassItem(){let e=this.peek();if(e===`\\`){let e=this.pos;if(this.advance(),this.atEnd())throw new rj(this.pattern,e,`trailing backslash with nothing to escape`);let t=this.advance();if(t===`d`||t===`w`||t===`s`)return uj(t).ranges;if(t===`D`||t===`W`||t===`S`)throw new rj(this.pattern,e,`the negated shorthand class '\\${t}' cannot be embedded inside a character class, because its complement cannot be represented as a set of ranges to union with the class's other members -- use it as its own atom instead of embedding it here`);let n=fj[t];if(n===void 0)throw new rj(this.pattern,e,`unknown escape sequence '\\${t}'`);return this.parseOptionalRangeFrom(n.charCodeAt(0))}if(e===void 0)throw new rj(this.pattern,this.pos,`unterminated character class -- missing closing ']'`);return this.advance(),this.parseOptionalRangeFrom(e.charCodeAt(0))}parseOptionalRangeFrom(e){if(this.peek()===`-`&&this.peek(1)!==void 0&&this.peek(1)!==`]`){let t=this.pos;this.advance();let n=this.parseClassRangeEndpoint();if(n<e)throw new rj(this.pattern,t,`invalid range in character class: '${String.fromCharCode(e)}-${String.fromCharCode(n)}' is reversed`);return[{from:e,to:n}]}return[{from:e,to:e}]}parseClassRangeEndpoint(){let e=this.peek();if(e===`\\`){let e=this.pos;if(this.advance(),this.atEnd())throw new rj(this.pattern,e,`trailing backslash with nothing to escape`);let t=this.advance();if(t===`d`||t===`D`||t===`w`||t===`W`||t===`s`||t===`S`)throw new rj(this.pattern,e,`a shorthand class ('\\${t}') cannot be a range endpoint`);let n=fj[t];if(n===void 0)throw new rj(this.pattern,e,`unknown escape sequence '\\${t}'`);return n.charCodeAt(0)}if(e===void 0)throw new rj(this.pattern,this.pos,`unterminated character class -- missing closing ']'`);return this.advance(),e.charCodeAt(0)}};function mj(e){let t=new pj(e),n=t.parseAlternation();if(!t.atEnd())throw new rj(e,t.position,`unexpected character -- if this was meant literally, escape it with a backslash`);return n}var hj=class{states=[];add(e){return this.states.push(e),this.states.length-1}patch(e,t){for(let n of e){let e=this.states[n.state];if(e!==void 0)switch(n.field){case`to`:(e.kind===`char`||e.kind===`anchorStart`||e.kind===`anchorEnd`)&&(e.to=t);break;case`to1`:e.kind===`split`&&(e.to1=t);break;case`to2`:e.kind===`split`&&(e.to2=t)}}}emptyFrag(){let e=this.add({kind:`split`,to1:-1,to2:-1});return{start:e,out:[{state:e,field:`to1`},{state:e,field:`to2`}]}}compileRepeat(e){let{operand:t,min:n,max:r}=e;if(r===void 0){if(n===0)return this.compileNode({kind:`star`,operand:t});let e=[];for(let r=0;r<n-1;r+=1)e.push(t);return e.push({kind:`plus`,operand:t}),this.compileNode({kind:`concat`,operands:e})}let i=[];for(let e=0;e<n;e+=1)i.push(t);for(let e=0;e<r-n;e+=1)i.push({kind:`optional`,operand:t});return i.length===0?this.emptyFrag():this.compileNode({kind:`concat`,operands:i})}compileNode(e){switch(e.kind){case`literal`:{let t=e.codeUnit,n=this.add({kind:`char`,test:e=>e===t,to:-1});return{start:n,out:[{state:n,field:`to`}]}}case`anyChar`:{let e=this.add({kind:`char`,test:()=>!0,to:-1});return{start:e,out:[{state:e,field:`to`}]}}case`charClass`:{let t=this.add({kind:`char`,test:t=>nj(e,t),to:-1});return{start:t,out:[{state:t,field:`to`}]}}case`anchorStart`:{let e=this.add({kind:`anchorStart`,to:-1});return{start:e,out:[{state:e,field:`to`}]}}case`anchorEnd`:{let e=this.add({kind:`anchorEnd`,to:-1});return{start:e,out:[{state:e,field:`to`}]}}case`concat`:{if(e.operands.length===0)return this.emptyFrag();let[t,...n]=e.operands;if(t===void 0)throw Error(`unreachable: a non-empty operands array always has a first element`);let r=this.compileNode(t);for(let e of n){let t=this.compileNode(e);this.patch(r.out,t.start),r={start:r.start,out:t.out}}return r}case`alternation`:{let[t,...n]=e.branches;if(t===void 0)throw Error(`unreachable: AlternationNode always has at least two branches`);let r=this.compileNode(t);for(let e of n){let t=this.compileNode(e);r={start:this.add({kind:`split`,to1:r.start,to2:t.start}),out:[...r.out,...t.out]}}return r}case`star`:{let t=this.compileNode(e.operand),n=this.add({kind:`split`,to1:t.start,to2:-1});return this.patch(t.out,n),{start:n,out:[{state:n,field:`to2`}]}}case`plus`:{let t=this.compileNode(e.operand),n=this.add({kind:`split`,to1:t.start,to2:-1});return this.patch(t.out,n),{start:t.start,out:[{state:n,field:`to2`}]}}case`optional`:{let t=this.compileNode(e.operand),n=this.add({kind:`split`,to1:t.start,to2:-1});return{start:n,out:[...t.out,{state:n,field:`to2`}]}}case`repeat`:return this.compileRepeat(e);default:throw Error(`unreachable regex node kind`)}}build(e){let t=this.compileNode(e),n=this.add({kind:`match`});return this.patch(t.out,n),{states:this.states,start:t.start,matchState:n}}};function gj(e){return new hj().build(e)}function _j(e,t,n,r){let i=new Set,a=new Set,o=[...t];for(;o.length>0;){let t=o.pop();if(t===void 0||a.has(t))continue;a.add(t);let s=e.states[t];if(s!==void 0)switch(s.kind){case`char`:case`match`:i.add(t);break;case`split`:o.push(s.to1,s.to2);break;case`anchorStart`:n===0&&o.push(s.to);break;case`anchorEnd`:n===r&&o.push(s.to)}}return i}function vj(e,t,n){let r=new Set;for(let i of t){let t=e.states[i];t?.kind===`char`&&t.test(n)&&r.add(t.to)}return r}function yj(e,t){let n=t.length,r=_j(e,[e.start],0,n);if(r.has(e.matchState))return!0;for(let i=0;i<n;i+=1){let a=t.charCodeAt(i),o=vj(e,r,a);if(o.add(e.start),r=_j(e,[...o],i+1,n),r.has(e.matchState))return!0}return!1}function bj(e){let t=gj(mj(e));return{test:e=>yj(t,e)}}function xj(e,t){if(e.status===`definite`&&!e.value||t.status===`definite`&&!t.value)return Q(!1);let n=hA(e,t);return n===void 0?Q(!0):{status:`indeterminate`,reason:n}}function Sj(e,t){if(e.status===`definite`&&e.value||t.status===`definite`&&t.value)return Q(!0);let n=hA(e,t);return n===void 0?Q(!1):{status:`indeterminate`,reason:n}}function Cj(e,t,n){switch(e){case`gt`:return t>n;case`gte`:return t>=n;case`lt`:return t<n;case`lte`:return t<=n;case`eq`:return t===n;case`neq`:return t!==n;default:throw Error(`unreachable comparison operator`)}}var wj={ms:1,s:1e3,min:6e4,h:36e5,d:864e5};function Tj(e,t){return e*wj[t]}function Ej(e){let t=Date.parse(e);return Number.isNaN(t)?void 0:t}function Dj(e){return $(`wrong-type`,`'${e}' is not a parseable ISO-8601 timestamp`)}function Oj(e){let t=new Date(e);return Number.isNaN(t.getTime())?$(`domain-error`,`the resulting instant falls outside the representable timestamp range`):Q({kind:`instant`,value:t.toISOString()})}function kj(e,t,n){switch(t.kind){case`number`:return n.kind===`number`?fA(t.unit,n.unit)?Q(Cj(e,t.value,n.value)):$(`wrong-type`,`cannot compare numbers with incompatible units`):$(`wrong-type`,`cannot compare a 'number' value with a '${n.kind}' value`);case`text`:return $(`wrong-type`,`text values are not comparable via 'compare'; use 'textCompare'`);case`boolean`:return n.kind===`boolean`?e!==`eq`&&e!==`neq`?$(`wrong-type`,`booleans have no natural ordering; '${e}' is only defined for 'eq'/'neq'`):Q(e===`eq`?t.value===n.value:t.value!==n.value):$(`wrong-type`,`cannot compare a 'boolean' value with a '${n.kind}' value`);case`instant`:{if(n.kind!==`instant`)return $(`wrong-type`,`cannot compare an 'instant' value with a '${n.kind}' value`);let r=Ej(t.value);if(r===void 0)return Dj(t.value);let i=Ej(n.value);return i===void 0?Dj(n.value):Q(Cj(e,r,i))}case`duration`:return n.kind===`duration`?Q(Cj(e,Tj(t.value,t.unit),Tj(n.value,n.unit))):$(`wrong-type`,`cannot compare a 'duration' value with a '${n.kind}' value`);case`complex`:return e!==`eq`&&e!==`neq`?$(`wrong-type`,`ordering operator '${e}' is not defined for complex values; the complex plane has no total order`):n.kind===`complex`?fA(t.unit,n.unit)?Q(e===`eq`?t.re===n.re&&t.im===n.im:t.re!==n.re||t.im!==n.im):$(`wrong-type`,`cannot compare complex values with incompatible units`):$(`wrong-type`,`cannot compare a 'complex' value with a '${n.kind}' value`);default:throw Error(`unreachable computed-value kind`)}}function Aj(e,t,n){if(t.kind!==`text`)return $(`wrong-type`,`'textCompare' requires 'text' operands; the left operand is '${t.kind}'`);if(n.kind!==`text`)return $(`wrong-type`,`'textCompare' requires 'text' operands; the right operand is '${n.kind}'`);switch(e){case`equals`:return Q(t.value===n.value);case`notEquals`:return Q(t.value!==n.value);case`matches`:case`notMatches`:{let r;try{r=new RegExp(n.value)}catch{return $(`wrong-type`,`'${n.value}' is not a valid regular expression pattern`)}let i=r.test(t.value);return Q(e===`matches`?i:!i)}case`portableMatches`:case`portableNotMatches`:{let r;try{r=bj(n.value)}catch(e){let t=e instanceof rj?e.message:String(e);return $(`wrong-type`,`'${n.value}' is not a valid trilean-regex pattern: ${t}`)}let i=r.test(t.value);return Q(e===`portableMatches`?i:!i)}default:throw Error(`unreachable text comparison operator`)}}function jj(e,t){switch(e.kind){case`number`:return t.kind===`number`?fA(e.unit,t.unit)?Q(e.value===t.value):$(`wrong-type`,`cannot compare numbers with incompatible units for membership`):$(`wrong-type`,`cannot compare a 'number' value with a '${t.kind}' value for membership`);case`text`:return t.kind===`text`?Q(e.value===t.value):$(`wrong-type`,`cannot compare a 'text' value with a '${t.kind}' value for membership`);case`boolean`:return t.kind===`boolean`?Q(e.value===t.value):$(`wrong-type`,`cannot compare a 'boolean' value with a '${t.kind}' value for membership`);case`instant`:{if(t.kind!==`instant`)return $(`wrong-type`,`cannot compare an 'instant' value with a '${t.kind}' value for membership`);let n=Ej(e.value);if(n===void 0)return Dj(e.value);let r=Ej(t.value);return r===void 0?Dj(t.value):Q(n===r)}case`duration`:return t.kind===`duration`?Q(Tj(e.value,e.unit)===Tj(t.value,t.unit)):$(`wrong-type`,`cannot compare a 'duration' value with a '${t.kind}' value for membership`);case`complex`:return t.kind===`complex`?fA(e.unit,t.unit)?Q(e.re===t.re&&e.im===t.im):$(`wrong-type`,`cannot compare complex values with incompatible units for membership`):$(`wrong-type`,`cannot compare a 'complex' value with a '${t.kind}' value for membership`);default:throw Error(`unreachable computed-value kind`)}}function Mj(e){return fA(e,void 0)}function Nj(e){switch(e.kind){case`number`:return Q({kind:`number`,value:-e.value,unit:e.unit});case`duration`:return Q({kind:`duration`,value:-e.value,unit:e.unit});case`complex`:return Q({kind:`complex`,re:-e.re,im:-e.im,unit:e.unit});case`text`:case`instant`:case`boolean`:return $(`wrong-type`,`cannot negate a '${e.kind}' value`);default:throw Error(`unreachable computed-value kind`)}}function Pj(e,t,n){switch(e){case`add`:return fA(t.unit,n.unit)?Q({kind:`number`,value:t.value+n.value,unit:t.unit}):$(`wrong-type`,`cannot add numbers with incompatible units`);case`subtract`:return fA(t.unit,n.unit)?Q({kind:`number`,value:t.value-n.value,unit:t.unit}):$(`wrong-type`,`cannot subtract numbers with incompatible units`);case`multiply`:return Q({kind:`number`,value:t.value*n.value,unit:pA(t.unit,n.unit)});case`divide`:return n.value===0?$(`domain-error`,`division by zero`):Q({kind:`number`,value:t.value/n.value,unit:mA(t.unit,n.unit)});case`power`:return!Mj(t.unit)||!Mj(n.unit)?$(`wrong-type`,`'power' requires dimensionless operands`):t.value<0&&!Number.isInteger(n.value)?$(`domain-error`,`a negative base raised to a non-integer power is not a real number`):t.value===0&&n.value<0?$(`domain-error`,`zero raised to a negative power is a division by zero`):Q({kind:`number`,value:t.value**n.value});case`modulo`:return!Mj(t.unit)||!Mj(n.unit)?$(`wrong-type`,`'modulo' requires dimensionless operands`):n.value===0?$(`domain-error`,`modulo by zero`):Q({kind:`number`,value:t.value%n.value});default:throw Error(`unreachable arithmetic operator`)}}function Fj(e,t,n){switch(e){case`add`:return Q({kind:`duration`,value:Tj(t.value,t.unit)+Tj(n.value,n.unit),unit:`ms`});case`subtract`:return Q({kind:`duration`,value:Tj(t.value,t.unit)-Tj(n.value,n.unit),unit:`ms`});case`multiply`:case`divide`:case`power`:case`modulo`:return $(`wrong-type`,`arithmetic operator '${e}' is not defined between two 'duration' values`);default:throw Error(`unreachable arithmetic operator`)}}function Ij(e){return e.kind===`complex`?e:{kind:`complex`,re:e.value,im:0,unit:e.unit}}function Lj(e,t){return{kind:`complex`,re:e.re*t.re-e.im*t.im,im:e.re*t.im+e.im*t.re,unit:pA(e.unit,t.unit)}}function Rj(e,t,n){switch(e){case`add`:return fA(t.unit,n.unit)?Q({kind:`complex`,re:t.re+n.re,im:t.im+n.im,unit:t.unit}):$(`wrong-type`,`cannot add complex values with incompatible units`);case`subtract`:return fA(t.unit,n.unit)?Q({kind:`complex`,re:t.re-n.re,im:t.im-n.im,unit:t.unit}):$(`wrong-type`,`cannot subtract complex values with incompatible units`);case`multiply`:return Q(Lj(t,n));case`divide`:{let e=n.re*n.re+n.im*n.im;return e===0?$(`domain-error`,`division by zero`):Q({kind:`complex`,re:(t.re*n.re+t.im*n.im)/e,im:(t.im*n.re-t.re*n.im)/e,unit:mA(t.unit,n.unit)})}case`modulo`:return $(`domain-error`,`'modulo' is undefined for complex values`);default:throw Error(`unreachable arithmetic operator`)}}function zj(e,t){if(t.kind!==`number`||!Number.isInteger(t.value))return $(`wrong-type`,`'power' with a complex operand requires a real integer exponent`);if(!Mj(e.unit)||!Mj(t.unit))return $(`wrong-type`,`'power' requires dimensionless operands`);let n={kind:`complex`,re:1,im:0,unit:{}},r=Ij(e),i=n;for(let e=0;e<Math.abs(t.value);e+=1)i=Lj(i,r);return t.value>=0?Q(i):Rj(`divide`,n,i)}function Bj(e,t,n){if(t.kind===`instant`&&n.kind===`instant`&&e===`subtract`){let e=Ej(t.value);if(e===void 0)return Dj(t.value);let r=Ej(n.value);return r===void 0?Dj(n.value):Q({kind:`duration`,value:e-r,unit:`ms`})}if(t.kind===`instant`&&n.kind===`duration`&&e===`add`){let e=Ej(t.value);return e===void 0?Dj(t.value):Oj(e+Tj(n.value,n.unit))}if(t.kind===`duration`&&n.kind===`instant`&&e===`add`){let e=Ej(n.value);return e===void 0?Dj(n.value):Oj(e+Tj(t.value,t.unit))}return t.kind===`instant`||n.kind===`instant`?$(`wrong-type`,`arithmetic operator '${e}' is not defined between a '${t.kind}' and a '${n.kind}' value`):t.kind===`duration`&&n.kind===`duration`?Fj(e,t,n):t.kind===`duration`||n.kind===`duration`?$(`wrong-type`,`arithmetic operator '${e}' is not defined between a '${t.kind}' and a '${n.kind}' value`):t.kind!==`number`&&t.kind!==`complex`?$(`wrong-type`,`arithmetic requires numeric operands; got a '${t.kind}' value`):n.kind!==`number`&&n.kind!==`complex`?$(`wrong-type`,`arithmetic requires numeric operands; got a '${n.kind}' value`):t.kind===`complex`||n.kind===`complex`?e===`power`?zj(t,n):Rj(e,Ij(t),Ij(n)):Pj(e,t,n)}function Vj(e,t){if(e!==void 0){if(t.kind!==`number`&&t.kind!==`complex`)return $(`wrong-type`,`a unit was expected on a reference that resolved to a non-numeric value`);if(!fA(e,t.unit))return $(`wrong-type`,`the resolved value's unit does not match the reference's expected unit`)}}function Hj(e,t,n){let r=Object.hasOwn(e,t)?e[t]:void 0;if(r===void 0)return $(`wrong-type`,`no function registered under the name '${t}'`);let i=r(n);return`domainError`in i?$(`domain-error`,i.domainError):Q(i)}async function Uj(e,t,n,r,i,a,o,s,c){let l=s.checkNode(c);if(l!==void 0)return l;switch(e.kind){case`not`:{let l=await Uj(e.operand,t,n,r,i,a,o,s,c+1);return l.status===`indeterminate`?l:Q(!l.value)}case`and`:{let[l,u]=await Promise.all([Uj(e.left,t,n,r,i,a,o,s,c+1),Uj(e.right,t,n,r,i,a,o,s,c+1)]);return xj(l,u)}case`or`:{let[l,u]=await Promise.all([Uj(e.left,t,n,r,i,a,o,s,c+1),Uj(e.right,t,n,r,i,a,o,s,c+1)]);return Sj(l,u)}case`allOf`:return(await Promise.all(e.operands.map(async e=>Uj(e,t,n,r,i,a,o,s,c+1)))).reduce(xj,Q(!0));case`anyOf`:return(await Promise.all(e.operands.map(async e=>Uj(e,t,n,r,i,a,o,s,c+1)))).reduce(Sj,Q(!1));case`compare`:{let[l,u]=await Promise.all([Wj(e.left,t,n,r,i,a,o,s,c+1),Wj(e.right,t,n,r,i,a,o,s,c+1)]);return l.status===`indeterminate`?l:u.status===`indeterminate`?u:kj(e.op,l.value,u.value)}case`textCompare`:{let[l,u]=await Promise.all([Wj(e.left,t,n,r,i,a,o,s,c+1),Wj(e.right,t,n,r,i,a,o,s,c+1)]);return l.status===`indeterminate`?l:u.status===`indeterminate`?u:Aj(e.op,l.value,u.value)}case`memberOf`:{let l=await Wj(e.operand,t,n,r,i,a,o,s,c+1);if(l.status===`indeterminate`)return l;let u=await Promise.all(e.candidates.map(async e=>{let u=await Wj(e,t,n,r,i,a,o,s,c+1);return u.status===`indeterminate`?u:jj(l.value,u.value)}));for(let t of u)if(t.status===`definite`&&t.value)return Q(e.op===`in`);let d=hA(...u);return d===void 0?Q(e.op===`notIn`):{status:`indeterminate`,reason:d}}case`exists`:{let l=await Wj(e.operand,t,n,r,i,a,o,s,c+1);return l.status===`indeterminate`&&l.reason.code===`not-found`?Q(!1):Q(!0)}case`some`:case`every`:{let r=await $A(Uj,e.collection,e.filter,t,n,i,a,o,s,c+1),l=(await Promise.all(r.map(async({item:t,filterOutcome:r})=>{if(r!==`exclude`)return r===`include`?Uj(e.item,t,n,void 0,i,a,o,s,c+1):r}))).filter(e=>e!==void 0),u=e.kind===`some`?Sj:xj,d=e.kind===`some`?Q(!1):Q(!0);return l.reduce(u,d)}case`treeReference`:{if(n.resolveTree===void 0)return $(`wrong-type`,`no tree resolver registered for treeReference nodes`);let l=JSON.stringify(e.key);if(a.has(l))return $(`domain-error`,`circular treeReference detected`);if(o>=100)return $(`domain-error`,`treeReference chain exceeds the maximum depth of 100`);let u=await n.resolveTree(e.key,t);if(!u.found)return $(`not-found`,`treeReference key did not resolve to a tree`);let d=PA.safeParse(u.node);return d.success?Uj(d.data,t,n,r,i,new Set([...a,l]),o+1,s,c+1):$(`wrong-type`,`the referenced tree is not a valid PredicateNode`)}default:throw Error(`unreachable predicate node kind`)}}async function Wj(e,t,n,r,i,a,o,s,c){let l=s.checkNode(c);if(l!==void 0)return l;switch(e.kind){case`reference`:{let r=await n.resolveValue(e.key,t);if(!r.found)return $(`not-found`,`no value found for reference key ${JSON.stringify(e.key)}`);let i=Vj(e.unit,r.value);return i===void 0?Q(r.value):i}case`accumulator`:return r===void 0?$(`wrong-type`,`accumulator used outside a reduce fold's combine expression`):Q(r);case`call`:{let l=await Promise.all(e.args.map(async e=>Wj(e,t,n,r,i,a,o,s,c+1))),u=[];for(let e of l){if(e.status===`indeterminate`)return e;u.push(e.value)}return Hj(i,e.fn,u)}case`numberLiteral`:return Q({kind:`number`,value:e.value,unit:e.unit});case`textLiteral`:return Q({kind:`text`,value:e.value});case`booleanLiteral`:return Q({kind:`boolean`,value:e.value});case`instantLiteral`:return Q({kind:`instant`,value:e.value});case`durationLiteral`:return Q({kind:`duration`,value:e.value,unit:e.unit});case`complexLiteral`:return`re`in e?Q({kind:`complex`,re:e.re,im:e.im,unit:e.unit}):Q(cA(e.magnitude,e.phase,e.unit));case`arithmetic`:{let[l,u]=await Promise.all([Wj(e.left,t,n,r,i,a,o,s,c+1),Wj(e.right,t,n,r,i,a,o,s,c+1)]);return l.status===`indeterminate`?l:u.status===`indeterminate`?u:Bj(e.op,l.value,u.value)}case`negate`:{let l=await Wj(e.operand,t,n,r,i,a,o,s,c+1);return l.status===`indeterminate`?l:Nj(l.value)}case`lookup`:{let l=await Promise.all(e.keys.map(async e=>Wj(e,t,n,r,i,a,o,s,c+1))),u=[];for(let e of l){if(e.status===`indeterminate`)return e;u.push(e.value)}let d=await n.resolveLookup(e.table,u,t);return d.found?Q(d.value):$(`not-found`,`no match found in lookup table ${JSON.stringify(e.table)}`)}case`conditional`:{if((e.hitPolicy??`first`)===`first`){for(let{when:l,then:u}of e.cases){let e=await Uj(l,t,n,r,i,a,o,s,c+1);if(e.status===`indeterminate`)return e;if(e.value)return Wj(u,t,n,r,i,a,o,s,c+1)}return Wj(e.fallback,t,n,r,i,a,o,s,c+1)}let l=await Promise.all(e.cases.map(async({when:e,then:l})=>({then:l,whenResult:await Uj(e,t,n,r,i,a,o,s,c+1)}))),u=l.filter(({whenResult:e})=>e.status===`definite`&&e.value);if(u.length>=2)return $(`domain-error`,`more than one case matched under the 'unique' hit policy`);let d=hA(...l.map(({whenResult:e})=>e));if(d!==void 0)return{status:`indeterminate`,reason:d};let[f]=u;return Wj(f===void 0?e.fallback:f.then,t,n,r,i,a,o,s,c+1)}case`fold`:{let r=await $A(Uj,e.collection,e.filter,t,n,i,a,o,s,c+1),l=ej(r);if(l!==void 0)return{status:`indeterminate`,reason:l};let u=r.filter(({filterOutcome:e})=>e===`include`).map(({item:e})=>e);if(e.combiner.mode===`reduce`){let r=await Wj(e.combiner.initial,t,n,void 0,i,a,o,s,c+1);if(r.status===`indeterminate`)return r;let l=r.value;for(let t of u){let r=await Wj(e.combiner.combine,t,n,l,i,a,o,s,c+1);if(r.status===`indeterminate`)return r;l=r.value}return Q(l)}if(u.length===0)return $(`domain-error`,`'${e.combiner.mode}' has no participating items to seed a running result from`);let d=e.combiner.mode===`max`?`gt`:`lt`,f;for(let t of u){let r=await Wj(e.combiner.item,t,n,void 0,i,a,o,s,c+1);if(r.status===`indeterminate`)return r;if(f===void 0){f=r.value;continue}let l=kj(d,r.value,f);if(l.status===`indeterminate`)return l;l.value&&(f=r.value)}if(f===void 0)throw Error(`unreachable: max/min over a non-empty participating list produced no running result`);return Q(f)}case`delegate`:{if(n.resolveDelegate===void 0)return $(`wrong-type`,`no delegate handler registered for external system '${e.system}'`);let r=await n.resolveDelegate(e.system,e.payload,t);return r.found?Q(r.value):$(`not-found`,`delegate handler for external system '${e.system}' reported no value`)}case`treeReference`:{if(n.resolveTree===void 0)return $(`wrong-type`,`no tree resolver registered for treeReference nodes`);let l=JSON.stringify(e.key);if(a.has(l))return $(`domain-error`,`circular treeReference detected`);if(o>=100)return $(`domain-error`,`treeReference chain exceeds the maximum depth of 100`);let u=await n.resolveTree(e.key,t);if(!u.found)return $(`not-found`,`treeReference key did not resolve to a tree`);let d=YA.safeParse(u.node);return d.success?Wj(d.data,t,n,r,i,new Set([...a,l]),o+1,s,c+1):$(`wrong-type`,`the referenced tree is not a valid ExpressionNode`)}default:throw Error(`unreachable expression node kind`)}}function Gj({functions:e=XA,maxNodes:t=ZA,maxNestingDepth:n=500}){return{evaluatePredicate:async(r,i,a)=>Uj(r,i,a,void 0,e,new Set,0,QA(t,n),0),evaluateValue:async(r,i,a)=>Wj(r,i,a,void 0,e,new Set,0,QA(t,n),0)}}var{evaluatePredicate:Kj,evaluateValue:qj}=Gj({}),Jj=UT(PA),Yj=`bearer-is`,Xj=`expires-at`,Zj=`scope-narrows`,Qj=`capability-is`,$j=`depth-remaining`,eM=[Yj,Xj,Zj,Qj,$j];function tM(e){return e===`bearer-is`||e===`expires-at`||e===`scope-narrows`||e===`capability-is`||e===`depth-remaining`}var nM=`grantee-is`,rM=`granted-capability-is`;function iM(e){return e===`grantee-is`||e===`granted-capability-is`}var aM={[nM]:(e,t)=>t.subject===void 0||typeof e!=`string`?{found:!1}:sM(AO(t.subject.bearer)===e),[rM]:(e,t)=>t.subject===void 0||typeof e!=`string`?{found:!1}:sM(t.subject.capability===e)};function oM(e,t){return{kind:`not`,operand:{kind:`and`,left:lM(rM,e),right:lM(nM,AO(t))}}}function sM(e){return{found:!0,value:{kind:`boolean`,value:e}}}var cM={[Yj]:(e,t)=>t.parentClaims===void 0?sM(!1):sM(iA(t.parentClaims.bearer,t.childIssuer)),[Xj]:(e,t)=>t.parentClaims===void 0?sM(!1):sM(t.candidate.expires<=t.parentClaims.expires),[Zj]:(e,t)=>t.parentClaims===void 0?sM(!1):sM(sA(t.parentClaims.scope,t.candidate.scope)),[Qj]:(e,t)=>t.parentClaims===void 0?sM(!1):sM(t.parentClaims.capability===t.candidate.capability),[$j]:(e,t)=>{if(t.parentClaims===void 0)return sM(!1);let n=t.parentClaims[`delegations-remaining`];return sM(n===void 0||t.candidate.delegationsRemaining!==void 0&&t.candidate.delegationsRemaining<n)}};function lM(e,t=null){return{kind:`compare`,op:`eq`,left:{kind:`delegate`,system:e,payload:t},right:{kind:`booleanLiteral`,value:!0}}}var uM=async()=>Promise.resolve({found:!1}),dM=async()=>Promise.resolve({found:!1}),fM=async()=>Promise.resolve([]);async function pM(e,t,n){let r={childIssuer:t,candidate:n,parentClaims:e},i={resolveValue:uM,resolveLookup:dM,resolveCollection:fM,resolveDelegate:async(e,t)=>tM(e)?cM[e](t,r):{found:!1}};return nA(eM,async e=>{let t=await Kj(lM(e),r,i);return t.status!==`definite`||!t.value})}async function mM(e,t,n,r={},i){let a=i===void 0?{clock:n,claims:t}:{clock:n,claims:t,subject:i},o={resolveValue:uM,resolveLookup:dM,resolveCollection:fM,resolveDelegate:async(e,t)=>{if(i!==void 0&&iM(e))try{return await aM[e](t,a)}catch{return{found:!1}}let n=Object.hasOwn(r,e)?r[e]:void 0;if(n===void 0)return{found:!1};try{return await n(t,a)}catch{return{found:!1}}}};return await nA(e,async e=>{let t=await Kj(e,a,o);return t.status!==`definite`||!t.value})===void 0?{ok:!0}:{ok:!1,reason:`not_satisfied`}}var hM=`manage:grant`,gM=64;function _M(e,t){return Mg([`Signature1`,e,new Uint8Array,t],hg)}function vM(e){return Uint8Array.from(e)}function yM(e){return vM(Mg(e,hg))}function bM(e){return yM({1:e.identityKey.alg,4:e.deviceId})}function xM(e){let[,,t]=e;if(t===null)return;let n;try{n=b_(t,x_)}catch{return}let r=rO.safeParse(n);return r.success?r.data:void 0}async function SM(e,t){let n=await TM(e,{identity:t.identity,clock:t.clock,revocation:t.revocation,...t.extraPredicateResolvers===void 0?{}:{extraPredicateResolvers:t.extraPredicateResolvers}});return n.ok&&t.expectedBearer!==void 0&&!iA(n.claims.bearer,t.expectedBearer)?{ok:!1,reason:`bearer_mismatch`}:n}async function CM(e,t,n){if(iA(e.issuer,t.issuer))return!0;if(e.authorization===void 0)return!1;let r;try{r=b_(e.authorization,x_)}catch{return!1}let i=nO.safeParse(r);if(!i.success)return!1;let a=await SM(i.data,{...n,expectedBearer:e.issuer});return a.ok&&a.claims.capability===`manage:revoke`&&sA(a.claims.scope,t.scope)}var wM={depth:0,seen:new Set};async function TM(e,t,{subjectClaims:n,depth:r,seen:i}=wM){let[a,,o,s]=e;if(o===null)return{ok:!1,reason:`malformed`};if(r>=gM)return{ok:!1,reason:`chain_too_deep`};let c=kO(o);if(i.has(c))return{ok:!1,reason:`chain_cycle`};let l=new Set(i).add(c),u;try{u=b_(o,x_)}catch{return{ok:!1,reason:`malformed`}}let d=rO.safeParse(u);if(!d.success)return{ok:!1,reason:`malformed`};let f=d.data;if(!await pk(t.identity,f[`issuer-key`],_M(a,o),s))return{ok:!1,reason:`bad_signature`};if(!iA(await t.identity.deriveDeviceId(f[`issuer-key`][`public-key`]),f.issuer))return{ok:!1,reason:`wrong_issuer`};let p=t.clock.now();if(f.expires<=p)return{ok:!1,reason:`expired`};if(f[`not-before`]!==void 0&&f[`not-before`]>p)return{ok:!1,reason:`not_yet_valid`};let m=f[`valid-until`];if(m!==void 0&&m<=p)return{ok:!1,reason:`content_expired`};if(await nA(await t.revocation.entriesFor(f[`token-id`]),async e=>CM(e,f,t))!==void 0)return{ok:!1,reason:`revoked`};if(f.conditions!==void 0){let e;try{e=b_(f.conditions,x_)}catch{return{ok:!1,reason:`conditions_invalid`}}let r=Jj.safeParse(e);if(!r.success)return{ok:!1,reason:`conditions_invalid`};if(!(await mM(r.data,f,t.clock,t.extraPredicateResolvers,n)).ok)return{ok:!1,reason:`conditions_not_satisfied`}}let h=f.parent,g=f[`authorised-by`];if(f.capability===`manage:grant`&&h!==void 0)return{ok:!1,reason:`authorisation_invalid`};if(h!==void 0&&g!==void 0)return{ok:!1,reason:`malformed`};if(h!==void 0){let e;try{e=b_(h,x_)}catch{return{ok:!1,reason:`parent_invalid`}}let n=nO.safeParse(e);if(!n.success)return{ok:!1,reason:`parent_invalid`};let i=await TM(n.data,t,{depth:r+1,seen:l});if(!i.ok)return i.reason===`chain_too_deep`||i.reason===`chain_cycle`?{ok:!1,reason:i.reason}:{ok:!1,reason:`parent_invalid`};let a={capability:f.capability,scope:f.scope,expires:f.expires,...f[`delegations-remaining`]===void 0?{}:{delegationsRemaining:f[`delegations-remaining`]}};return await pM(i.claims,f.issuer,a)===void 0?{ok:!0,claims:f,rootIssuer:i.rootIssuer,rootIssuerKey:i.rootIssuerKey,depth:i.depth+1}:{ok:!1,reason:`delegation_exceeds_parent`}}if(g!==void 0){let e;try{e=b_(g,x_)}catch{return{ok:!1,reason:`authorisation_invalid`}}let n=nO.safeParse(e);if(!n.success)return{ok:!1,reason:`authorisation_invalid`};let i=await TM(n.data,t,{subjectClaims:f,depth:r+1,seen:l});if(!i.ok)return i.reason===`chain_too_deep`||i.reason===`chain_cycle`?{ok:!1,reason:i.reason}:{ok:!1,reason:`authorisation_invalid`};let a=i.claims,o=a[`grants-capability`];return iA(a.bearer,f.issuer)&&a.capability===`manage:grant`&&(o===void 0||o===f.capability)&&sA(a.scope,f.scope)&&f.expires<=a.expires&&(a[`delegations-remaining`]===void 0||f[`delegations-remaining`]!==void 0&&f[`delegations-remaining`]<a[`delegations-remaining`])?{ok:!0,claims:f,rootIssuer:i.rootIssuer,rootIssuerKey:i.rootIssuerKey,depth:i.depth+1}:{ok:!1,reason:`authorisation_invalid`}}return{ok:!0,claims:f,rootIssuer:f.issuer,rootIssuerKey:f[`issuer-key`],depth:0}}async function EM(e,t){let[n,,r,i]=e;if(r===null)return{ok:!1,reason:`malformed`};let a;try{a=b_(r,x_)}catch{return{ok:!1,reason:`malformed`}}let o=mD.safeParse(a);if(!o.success)return{ok:!1,reason:`malformed`};let s=o.data;return await pk(t.identity,s[`issuer-key`],_M(n,r),i)?iA(await t.identity.deriveDeviceId(s[`issuer-key`][`public-key`]),s.issuer)?{ok:!0,claims:s}:{ok:!1,reason:`wrong_issuer`}:{ok:!1,reason:`bad_signature`}}var DM={"bearer-is":`parent_bearer_mismatch`,"expires-at":`expires_exceeds_parent`,"scope-narrows":`scope_does_not_narrow`,"capability-is":`capability_mismatch`,"depth-remaining":`delegation_exceeds_parent`};async function OM(e,t,n){let r=await pM(e,t,n);return r===void 0?void 0:DM[r]}async function kM(e,t,n){if(e.parent!==void 0)return`authorisation_parent_forbidden`;if(!iA(e.bearer,t))return`authorisation_bearer_mismatch`;let r=e[`grants-capability`];if(e.capability!==`manage:grant`||r!==void 0&&r!==n.capability)return`authorisation_capability_mismatch`;if(!sA(e.scope,n.scope))return`authorisation_scope_does_not_narrow`;if(n.expires>e.expires)return`authorisation_exceeds_authoriser`;let i=e[`delegations-remaining`];if(i!==void 0&&(n.delegationsRemaining===void 0||n.delegationsRemaining>=i))return`authorisation_delegation_exceeds`;if(e.conditions!==void 0){let t;try{t=b_(e.conditions,x_)}catch{return`authorisation_malformed`}let r=Jj.safeParse(t);if(!r.success)return`authorisation_malformed`;if(!(await mM(r.data,e,{now:()=>0},{},n)).ok)return`authorisation_conditions_not_satisfied`}}async function AM(e){for(let t of[e.capability,e.grantsCapability,e.requestsCapability])if(t!==void 0&&!YD.safeParse(t).success)return{ok:!1,reason:`invalid_capability`};if(e.expires<=e.clock.now())return{ok:!1,reason:`already_expired`};if(e.parent!==void 0&&e.authorisedBy!==void 0)return{ok:!1,reason:`links_exclusive`};if(e.capability===`manage:grant`&&e.parent!==void 0)return{ok:!1,reason:`authorisation_parent_forbidden`};let t;if(e.parent!==void 0){let n=xM(e.parent);if(n===void 0)return{ok:!1,reason:`parent_malformed`};let r=await OM(n,e.identity.deviceId,{capability:e.capability,scope:e.scope,expires:e.expires,...e.delegationsRemaining===void 0?{}:{delegationsRemaining:e.delegationsRemaining}});if(r!==void 0)return{ok:!1,reason:r};t=yM(e.parent)}let n;if(e.authorisedBy!==void 0){let t=xM(e.authorisedBy);if(t===void 0)return{ok:!1,reason:`authorisation_malformed`};let r=await kM(t,e.identity.deviceId,{capability:e.capability,scope:e.scope,bearer:e.bearer,expires:e.expires,...e.delegationsRemaining===void 0?{}:{delegationsRemaining:e.delegationsRemaining}});if(r!==void 0)return{ok:!1,reason:r};n=yM(e.authorisedBy)}let r=yM({"token-id":e.tokenId,issuer:e.identity.deviceId,"issuer-key":e.identity.identityKey,bearer:e.bearer,capability:e.capability,scope:e.scope,expires:e.expires,...e.notBefore===void 0?{}:{"not-before":e.notBefore},...t===void 0?{}:{parent:t},...e.delegationsRemaining===void 0?{}:{"delegations-remaining":e.delegationsRemaining},...e.conditions===void 0?{}:{conditions:yM(e.conditions)},...n===void 0?{}:{"authorised-by":n},...e.grantsCapability===void 0?{}:{"grants-capability":e.grantsCapability},...e.requestsCapability===void 0?{}:{"requests-capability":e.requestsCapability}}),i=bM(e.identity);return{ok:!0,token:[i,{},r,await e.identity.sign(_M(i,r))]}}async function jM(e){let t=yM({"token-id":e.tokenId,issuer:e.identity.deviceId,"issuer-key":e.identity.identityKey,"revoked-at":e.revokedAt}),n=bM(e.identity);return[n,{},t,await e.identity.sign(_M(n,t))]}var MM=`wm-grant1.`;function NM(e){let t=e[2];if(t===null)return;let n;try{n=b_(t,x_)}catch{return}let r=rO.safeParse(n);return r.success?r.data:void 0}function PM(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function FM(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r}function IM(e){return MM+PM(Mg(e,hg))}function LM(e){let t=e.trim();if(!t.startsWith(`wm-grant1.`))throw Error(`a grant code starts with "${MM}"`);let n;try{n=b_(FM(t.slice(10)),x_)}catch{throw Error(`the grant code is damaged: it does not decode`)}let r=nO.safeParse(n);if(!r.success||NM(r.data)===void 0)throw Error(`the grant code does not carry a capability token`);return r.data}async function RM(e,t){let n=await SM(e,t);return n.ok?{kind:`valid`}:{kind:`invalid`,reason:n.reason}}var zM={malformed:`malformed`,bad_signature:`signature does not verify`,wrong_issuer:`issuer does not match its key`,bearer_mismatch:`names another bearer`,expired:`expired`,not_yet_valid:`not valid yet`,content_expired:`content expired`,revoked:`revoked`,delegation_exceeds_parent:`exceeds what its parent allows`,parent_invalid:`its parent grant is no longer valid`,conditions_invalid:`its conditions are invalid`,conditions_not_satisfied:`its conditions are not met`,authorisation_invalid:`exceeds what its authorising grant allows`,chain_too_deep:`its chain is deeper than allowed`,chain_cycle:`its chain revisits a token`};function BM(e){return e.kind===`valid`?`valid`:zM[e.reason]}var VM=`grant/`;function HM(e,t){return`${VM}${e}/${t}`}function UM(e){let t=e.slice(6).split(`/`)[0];if(t===`held`||t===`issued`)return t;throw Error(`stored grant key ${e} names no direction`)}function WM(e){return typeof e==`object`&&!!e&&`token`in e&&`recordedAt`in e&&typeof e.recordedAt==`number`}function GM(e){let t=new Set;return{async record(n,r,i){let a=NM(r);if(a===void 0)throw Error(`a grant must carry readable token claims`);let o=HM(n,kO(a[`token-id`]));if(await e.get(o)===void 0){await e.set(o,new Uint8Array(Mg({token:r,recordedAt:i},hg)));for(let e of t)e()}},async list(){let t=[],n=await e.keys(VM),r=await Promise.all(n.map(async t=>({key:t,value:await e.get(t)})));for(let{key:e,value:n}of r){if(n===void 0)continue;let r=b_(n,x_);if(!WM(r))throw Error(`stored grant at ${e} is malformed`);let i=nO.safeParse(r.token);if(!i.success)throw Error(`stored grant at ${e} is malformed`);let a=NM(i.data);if(a===void 0)throw Error(`stored grant at ${e} has unreadable claims`);t.push({tokenId:kO(a[`token-id`]),direction:UM(e),token:i.data,claims:a,recordedAt:r.recordedAt})}return t.sort((e,t)=>t.recordedAt-e.recordedAt)},subscribe(e){return t.add(e),()=>{t.delete(e)}}}}function KM(e){return kO(e)}function qM(){let e=new Map;return{async entriesFor(t){return Promise.resolve(e.get(KM(t))??[])},async record(t,n){let r=await EM(t,n);if(r.ok){let t=KM(r.claims[`token-id`]),n=e.get(t);n===void 0?e.set(t,[r.claims]):n.push(r.claims)}return r}}}var JM=`revocation/`;async function YM(e,t,n){let r;try{r=b_(n,x_)}catch{return`it is not valid CBOR`}let i=hD.safeParse(r);if(!i.success)return`it is not a revocation entry`;let a=await e.record(i.data,{identity:t});return a.ok?void 0:`it no longer verifies (${a.reason})`}async function XM(e){let{storage:t,identity:n,clock:r}=e,i=qM(),a=new Set;async function o(e){let r=await i.record(e,{identity:n});if(r.ok){let n=`${JM}${kO(r.claims.issuer)}/${kO(r.claims[`token-id`])}`;await t.set(n,new Uint8Array(Mg(e,hg)));for(let e of a)e()}return r}let s=await t.keys(JM),c=(await Promise.all(s.map(async e=>{let r=await t.get(e);if(r===void 0)return;let a=await YM(i,n,r);return a===void 0?void 0:{key:e,reason:a}}))).filter(e=>e!==void 0);return{view:i,unreadable:()=>c,async discardUnreadable(e){await t.delete(e),c=c.filter(t=>t.key!==e);for(let e of a)e()},subscribe(e){return a.add(e),()=>{a.delete(e)}},ingest:o,async revoke(e){let t=await jM({identity:n,tokenId:e,revokedAt:r.now()}),i=await o(t);if(!i.ok)throw Error(`the revocation this device signed does not verify (${i.reason})`);return t}}}var ZM=`preferences/intro-dismissed`,QM=new Uint8Array([1]);function $M(e){return{async introDismissed(){return await e.get(ZM)!==void 0},async setIntroDismissed(t){t?await e.set(ZM,new Uint8Array(QM)):await e.delete(ZM)}}}var eN=`agent/self`,tN=`wire-mesh-console`;function nN(e){return e.slice(0,12)}var rN=/[\p{Cc}\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/gu;function iN(e){let t=e.replace(rN,``).trim();if(t!==``)return Array.from(t).slice(0,64).join(``).trimEnd()}function aN(e){let t=e[eN];if(typeof t==`object`&&t&&`name`in t&&typeof t.name==`string`)return iN(t.name)}function oN(e){return{[eN]:{name:e,harness:tN}}}function sN(e,t,n,r){return t===void 0?n===void 0?{primary:nN(e),secondary:void 0,source:`id`,matchesPetname:!1}:{primary:n,secondary:nN(e),source:`self`,matchesPetname:r.has(n)}:{primary:t,secondary:n!==void 0&&n!==t?n:void 0,source:`petname`,matchesPetname:!1}}function cN(e){return e.source===`self`&&e.secondary!==void 0?`${e.primary} (${e.secondary})`:e.primary}var lN=`petname/`,uN=`self-name`,dN=new TextEncoder,fN=new TextDecoder;function pN(e){async function t(t,n){let r=iN(n);if(r===void 0){await e.delete(t);return}await e.set(t,new Uint8Array(dN.encode(r)))}return{async petnames(){let t=new Map,n=await e.keys(lN),r=await Promise.all(n.map(async t=>({key:t,value:await e.get(t)})));for(let{key:e,value:n}of r)n!==void 0&&t.set(e.slice(8),fN.decode(n));return t},async setPetname(e,n){await t(lN+e,n)},async selfName(){let t=await e.get(uN);return t===void 0?void 0:fN.decode(t)},async setSelfName(e){await t(uN,e)}}}var mN=String(2**53-1).length,hN=`message`;function gN(e,t){return`${hN}/${e}/${String(t.sentAt).padStart(mN,`0`)}-${kO(t.messageId)}`}function _N(e){let t=e.slice(`${hN}/`.length);return t.slice(0,t.lastIndexOf(`/`))}function vN(e){return e===`sent`||e===`received`}function yN(e){return typeof e!=`object`||!e||!(`direction`in e)||!(`text`in e)||!(`messageId`in e)||!(`sentAt`in e)?!1:vN(e.direction)&&typeof e.text==`string`&&e.messageId instanceof Uint8Array&&typeof e.sentAt==`number`}function bN(e){return{async append(t,n){await e.set(gN(t,n),new Uint8Array(Mg(n,hg)))},async roomPaths(){let t=await e.keys(`${hN}/`);return[...new Set(t.map(_N))]},async list(t){let n=(await e.keys(`${hN}/${t}/`)).sort(),r=[],i=await Promise.all(n.map(async t=>({key:t,value:await e.get(t)})));for(let{key:e,value:t}of i){if(t===void 0)continue;let n=b_(t,x_);if(!yN(n))throw Error(`stored message at ${e} is malformed`);r.push(n)}return r}}}function xN(e){typeof e==`object`&&e&&`unref`in e&&typeof e.unref==`function`&&Reflect.apply(e.unref,e,[])}var SN=1e3;function CN(e){return JSON.stringify(String(e).slice(0,256))}function wN(e,t){let n=e=>{console.error(`the fault callback failed: ${CN(e)}`)};try{let r=e(t);typeof r==`object`&&r&&`then`in r&&typeof r.then==`function`&&Promise.resolve(r).catch(n)}catch(e){n(e)}}function TN(){return performance.now()}function EN(e=TN){let t=new Map,n={since:-1/0,used:0},r={count:0};function i(e){return e-n.since>=1e3&&(n.since=e,n.used=0),n.used>=64?!1:(n.used+=1,!0)}function a(){let e=r.count;return r.count=0,e}function o(n){let r=t.get(n);if(r===void 0||r.timer!==void 0)return;let i=Math.max(0,r.since+SN-e()),a=setTimeout(()=>{s(n)},i);xN(a),r.timer=a}function s(n){let r=t.get(n);if(r===void 0)return;r.timer=void 0;let{latest:s}=r;if(r.pending===0||s===void 0)return;let c=e();if(r.since=c,!i(c)){o(n);return}let l=r.pending-1;r.pending=0,r.latest=void 0,wN(s,l+a())}function c(){let e=t.entries().next();if(e.done===!0)return;let[n,i]=e.value;clearTimeout(i.timer),t.delete(n),r.count+=i.pending}return(n,r)=>{let s=e(),l=t.get(n);if(l!==void 0&&s-l.since<1e3){l.pending+=1,l.latest=r,o(n);return}let u=l?.pending??0;clearTimeout(l?.timer),t.delete(n);let d={since:s,pending:u,latest:l?.latest,timer:void 0};if(t.set(n,d),t.size>1024&&c(),!i(s)){d.pending+=1,d.latest=r,o(n);return}d.pending=0,d.latest=void 0,wN(r,u+a())}}function DN(e,t=ON){e.catch(e=>{t(e)})}function ON(e){console.error(`background work failed: ${CN(e)}`)}async function kN(e,t,n={}){let{onFault:r,signal:i}=n,a=EN(n.now),o=(e,t)=>{if(r!==void 0)try{let i=n.sourceOf?.(t)??``;a(i,async n=>r(e,t,n))}catch(e){console.error(`could not report a failure: ${CN(e)}`)}},s=e=>{r!==void 0&&wN(async t=>r(e,void 0,t),0)},c=e[Symbol.asyncIterator](),l,u=()=>{l??=c.return?.().catch(s)};i?.addEventListener(`abort`,u,{once:!0});async function d(){if(i?.aborted===!0)return!1;let e=await c.next();if(e.done===!0)return!1;try{await t(e.value)}catch(t){o(t,e.value)}return!0}await new Promise(e=>{let t=()=>{d().then(n=>{n?t():e()},t=>{s(t),e()})};t()}),i?.removeEventListener(`abort`,u),i?.aborted===!0&&u(),await l}var AN={result:`error`,code:`internal-error`};async function jN(e,t,n={}){await kN(e,async e=>{let n={answered:!1},r={...e,respond:async t=>{n.answered=!0,await e.respond(t)}};try{await t(r)}catch(t){throw n.answered||await e.respond(AN).catch(()=>void 0),t}},{...n,sourceOf:n.sourceOf??(e=>e.fromDevice===void 0?``:AO(e.fromDevice))})}function MN(e){return new Uint8Array(Mg(e,hg))}function NN(e,t){return{type:`relay-data`,payload:MN(e),...t===void 0?{}:{"to-device":t}}}var PN=class extends Error{constructor(e){super(e),this.name=`SchemaInvalidFrameError`}};function FN(e){let t=b_(new Uint8Array(e),x_),n=ZE.safeParse(t);if(!n.success)throw new PN(n.error.message);return n.data}function IN(e){let t;try{t=b_(e,x_)}catch{return null}let n=ZE.safeParse(t);return n.success?n.data:null}var LN=16,RN=4096;function zN(e){let t=0;for(let n of e)t+=String(n.length).length+1+n.length;return t}function BN(...e){let t=``;for(let n of e){t+=`${String(n.length)}:`;for(let e=0;e<n.length;e+=RN)t+=String.fromCharCode(...n.subarray(e,e+RN))}return t}async function VN(e){return await e()??!1}function HN(e){let t=new Map,n=0,r=0,i=e=>{let r=t.get(e);r!==void 0&&(t.delete(e),n-=r.cost)};return{async verdict(a,o){let s=zN(a)+LN;if(s>e||r+s>e)return VN(o);let c=BN(...a),l=t.get(c);if(l!==void 0)return t.delete(c),t.set(c,l),l.settled;r+=s;let u=o().then(e=>e===void 0?(i(c),!1):e).finally(()=>{r-=s});t.set(c,{settled:u,cost:s}),n+=s;for(let r of t.keys()){if(n<=e)break;i(r)}return u}}}var UN=1024,WN=UN*UN*8,GN=new WeakMap;function KN(e){let t=GN.get(e);if(t!==void 0)return t;let n=HN(WN);return GN.set(e,n),n}var qN=`signature`,JN=`identity-key`,YN=new TextEncoder().encode(`wire-mesh/peer-advert/v1\0`);function XN(e){let t={};for(let[n,r]of Object.entries(e))n!==`signature`&&(t[n]=r);let n=Mg(t,hg),r=new Uint8Array(YN.length+n.length);return r.set(YN,0),r.set(n,YN.length),r}async function ZN(e,t){let n=await e.sign(XN(t));return{...t,[qN]:n}}async function QN(e,t){let n;try{n=XN(t)}catch{return!1}return KN(e).verdict([t[qN],n],async()=>$N(e,t,n))}async function $N(e,t,n){let r=t[JN];try{return iA(await e.deriveDeviceId(r[`public-key`]),t.device)?await e.verify(r,n,t[qN]):!1}catch{return}}var eP={name:`wire-mesh-core`,version:`4.2.1`,dependencies:{cbor2:`2.3.0`,"cddl.js":`2.0.0`,trilean:`1.6.2`,zod:`4.6.6`},devDependencies:{"@arethetypeswrong/cli":`0.18.5`,"@exadev/eslint-config":`3.0.0`,"@stryker-mutator/api":`10.0.0`,"@stryker-mutator/core":`10.0.0`,"@stryker-mutator/typescript-checker":`10.0.0`,"@types/node":`26.4.1`,eslint:`10.10.0`,"eslint-config-prettier":`10.1.8`,"eslint-plugin-prettier":`5.5.6`,globals:`17.12.0`,jiti:`2.7.0`,prettier:`3.9.6`,tsdown:`0.23.0`,turbo:`2.10.12`,typescript:`6.0.3`,vitest:`5.0.0`,"wire-mesh-core-released":`npm:wire-mesh-core@4.1.5`},exports:{"./adapters/byte-stream-connection":{import:`./dist/adapters/byte-stream-connection.mjs`,require:`./dist/adapters/byte-stream-connection.cjs`},"./adapters/frame-codec":{import:`./dist/adapters/frame-codec.mjs`,require:`./dist/adapters/frame-codec.cjs`},"./adapters/memory-storage":{import:`./dist/adapters/memory-storage.mjs`,require:`./dist/adapters/memory-storage.cjs`},"./adapters/node-fs-storage":{import:`./dist/adapters/node-fs-storage.mjs`,require:`./dist/adapters/node-fs-storage.cjs`},"./adapters/node-identity":{import:`./dist/adapters/node-identity.mjs`,require:`./dist/adapters/node-identity.cjs`},"./adapters/system-clock":{import:`./dist/adapters/system-clock.mjs`,require:`./dist/adapters/system-clock.cjs`},"./adapters/tcp-transport":{import:`./dist/adapters/tcp-transport.mjs`,require:`./dist/adapters/tcp-transport.cjs`},"./adapters/threshold-identity":{import:`./dist/adapters/threshold-identity.mjs`,require:`./dist/adapters/threshold-identity.cjs`},"./adapters/threshold-wasm":{import:`./dist/adapters/threshold-wasm.mjs`,require:`./dist/adapters/threshold-wasm.cjs`},"./adapters/tls-transport":{import:`./dist/adapters/tls-transport.mjs`,require:`./dist/adapters/tls-transport.cjs`},"./domain/advert-extension-policy":{import:`./dist/domain/advert-extension-policy.mjs`,require:`./dist/domain/advert-extension-policy.cjs`},"./domain/async-queue":{import:`./dist/domain/async-queue.mjs`,require:`./dist/domain/async-queue.cjs`},"./domain/bulk":{import:`./dist/domain/bulk.mjs`,require:`./dist/domain/bulk.cjs`},"./domain/capability-grant":{import:`./dist/domain/capability-grant.mjs`,require:`./dist/domain/capability-grant.cjs`},"./domain/capability-request":{import:`./dist/domain/capability-request.mjs`,require:`./dist/domain/capability-request.cjs`},"./domain/channel-exhausted-error":{import:`./dist/domain/channel-exhausted-error.mjs`,require:`./dist/domain/channel-exhausted-error.cjs`},"./domain/consume-incoming":{import:`./dist/domain/consume-incoming.mjs`,require:`./dist/domain/consume-incoming.cjs`},"./domain/coordinator-election":{import:`./dist/domain/coordinator-election.mjs`,require:`./dist/domain/coordinator-election.cjs`},"./domain/data-sync":{import:`./dist/domain/data-sync.mjs`,require:`./dist/domain/data-sync.cjs`},"./domain/device-id":{import:`./dist/domain/device-id.mjs`,require:`./dist/domain/device-id.cjs`},"./domain/direct-manage-request":{import:`./dist/domain/direct-manage-request.mjs`,require:`./dist/domain/direct-manage-request.cjs`},"./domain/ed25519-identity-key":{import:`./dist/domain/ed25519-identity-key.mjs`,require:`./dist/domain/ed25519-identity-key.cjs`},"./domain/erasure-coding":{import:`./dist/domain/erasure-coding.mjs`,require:`./dist/domain/erasure-coding.cjs`},"./domain/fault-report":{import:`./dist/domain/fault-report.mjs`,require:`./dist/domain/fault-report.cjs`},"./domain/gossip-expansion":{import:`./dist/domain/gossip-expansion.mjs`,require:`./dist/domain/gossip-expansion.cjs`},"./domain/gossip-extensions":{import:`./dist/domain/gossip-extensions.mjs`,require:`./dist/domain/gossip-extensions.cjs`},"./domain/grant-candidates":{import:`./dist/domain/grant-candidates.mjs`,require:`./dist/domain/grant-candidates.cjs`},"./domain/group-key":{import:`./dist/domain/group-key.mjs`,require:`./dist/domain/group-key.cjs`},"./domain/handshake":{import:`./dist/domain/handshake.mjs`,require:`./dist/domain/handshake.cjs`},"./domain/hub-mailbox":{import:`./dist/domain/hub-mailbox.mjs`,require:`./dist/domain/hub-mailbox.cjs`},"./domain/mesh-session":{import:`./dist/domain/mesh-session.mjs`,require:`./dist/domain/mesh-session.cjs`},"./domain/notice-board":{import:`./dist/domain/notice-board.mjs`,require:`./dist/domain/notice-board.cjs`},"./domain/path-trace":{import:`./dist/domain/path-trace.mjs`,require:`./dist/domain/path-trace.cjs`},"./domain/peer-advert":{import:`./dist/domain/peer-advert.mjs`,require:`./dist/domain/peer-advert.cjs`},"./domain/ping-round-trips":{import:`./dist/domain/ping-round-trips.mjs`,require:`./dist/domain/ping-round-trips.cjs`},"./domain/pinned-address":{import:`./dist/domain/pinned-address.mjs`,require:`./dist/domain/pinned-address.cjs`},"./domain/relay-advert":{import:`./dist/domain/relay-advert.mjs`,require:`./dist/domain/relay-advert.cjs`},"./domain/relay-hub":{import:`./dist/domain/relay-hub.mjs`,require:`./dist/domain/relay-hub.cjs`},"./domain/relay-use-gate":{import:`./dist/domain/relay-use-gate.mjs`,require:`./dist/domain/relay-use-gate.cjs`},"./domain/revocation-view":{import:`./dist/domain/revocation-view.mjs`,require:`./dist/domain/revocation-view.cjs`},"./domain/room":{import:`./dist/domain/room.mjs`,require:`./dist/domain/room.cjs`},"./domain/room-path":{import:`./dist/domain/room-path.mjs`,require:`./dist/domain/room-path.cjs`},"./domain/room-rekey":{import:`./dist/domain/room-rekey.mjs`,require:`./dist/domain/room-rekey.cjs`},"./domain/room-token-verification":{import:`./dist/domain/room-token-verification.mjs`,require:`./dist/domain/room-token-verification.cjs`},"./domain/shard-manifest":{import:`./dist/domain/shard-manifest.mjs`,require:`./dist/domain/shard-manifest.cjs`},"./domain/threshold-subject":{import:`./dist/domain/threshold-subject.mjs`,require:`./dist/domain/threshold-subject.cjs`},"./domain/token-predicates":{import:`./dist/domain/token-predicates.mjs`,require:`./dist/domain/token-predicates.cjs`},"./domain/token-scope":{import:`./dist/domain/token-scope.mjs`,require:`./dist/domain/token-scope.cjs`},"./domain/tokens":{import:`./dist/domain/tokens.mjs`,require:`./dist/domain/tokens.cjs`},"./domain/topology":{import:`./dist/domain/topology.mjs`,require:`./dist/domain/topology.cjs`},"./domain/topology-snapshot":{import:`./dist/domain/topology-snapshot.mjs`,require:`./dist/domain/topology-snapshot.cjs`},"./domain/verdict-cache":{import:`./dist/domain/verdict-cache.mjs`,require:`./dist/domain/verdict-cache.cjs`},"./domain/webrtc-signaling":{import:`./dist/domain/webrtc-signaling.mjs`,require:`./dist/domain/webrtc-signaling.cjs`},"./generated/protocol":{import:`./dist/generated/protocol.mjs`,require:`./dist/generated/protocol.cjs`},"./generated/runtime":{import:`./dist/generated/runtime.mjs`,require:`./dist/generated/runtime.cjs`},"./ports/clock":{import:`./dist/ports/clock.mjs`,require:`./dist/ports/clock.cjs`},"./ports/identity":{import:`./dist/ports/identity.mjs`,require:`./dist/ports/identity.cjs`},"./ports/storage":{import:`./dist/ports/storage.mjs`,require:`./dist/ports/storage.cjs`},"./ports/transport":{import:`./dist/ports/transport.mjs`,require:`./dist/ports/transport.cjs`},"./package.json":`./package.json`},files:[`dist`,`wasm-dist`],license:`MIT`,packageManager:`pnpm@12.4.1+sha512.2e81e399d73fe8390dab25e06aa788ab7a5908248d2f5a370f82b481147a6a7a367bf8048f9a6fdb6460f21a66f0542dedb8b94ca2c8723596741920b1656d4c`,publishConfig:{provenance:!0,access:`public`},repository:{type:`git`,url:`https://github.com/ExaDev/wire-mesh.git`,directory:`ts/packages/core`},scripts:{_build:`tsdown`,"_build-wasm":`./scripts/build-threshold-wasm.sh`,"_conformance-check":`vitest run test/conformance.unit.test.ts`,_generate:`node generate.ts`,_lint:`eslint . --fix --cache --max-warnings 0`,_mutation:`stryker run stryker.config.ts`,_test:`vitest run`,_typecheck:`tsc -p tsconfig.json --noEmit && tsc -p tsconfig.node.json --noEmit`,build:`turbo run _build`,"build-wasm":`turbo run _build-wasm`,"conformance-check":`turbo run _conformance-check`,generate:`turbo run _generate`,lint:`turbo run _lint`,mutation:`turbo run _mutation`,prepack:`node scripts/assert-wasm-dist.ts`,test:`turbo run _test`,typecheck:`turbo run _typecheck`},type:`module`}.version,tP=`wire-mesh/version`,nP=`version.get`;function rP(e){return`verb`in e&&e.verb===nP}function iP(){return{result:`ok`,version:eP}}var aP=new Set([`device`,`addresses`,`snapshot-seconds`,JN,qN]),oP=`topology/peers`,sP=/^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/;function cP(e){for(let t of Object.keys(e)){if(aP.has(t))throw Error(`sendGossipUpdate extension key "${t}" collides with a mandatory peer-advert field`);if(t===`topology/peers`)throw Error(`sendGossipUpdate extension key "${t}" collides with a session-managed gossip field`);if(t===`wire-mesh/version`)throw Error(`sendGossipUpdate extension key "${t}" is reserved for wire-mesh-core's own self-reported version`);if(!sP.test(t))throw Error(`sendGossipUpdate extension key "${t}" must be domain-qualified as "<domain>/<field>" (e.g. "presence/status")`)}}function lP(){let e=[],t=[];return{push(n){let r=e.shift();r===void 0?t.push(n):r(n)},stream:{[Symbol.asyncIterator](){let n=!1,r=new Set;return{next:async()=>new Promise(i=>{if(n){i({value:void 0,done:!0});return}let a=t.shift();if(a!==void 0){i({value:a,done:!1});return}let o={},s=e=>{o.release!==void 0&&r.delete(o.release),i({value:e,done:!1})};o.release=()=>{e.splice(e.indexOf(s),1),i({value:void 0,done:!0})},e.push(s),r.add(o.release)}),return:async()=>{n=!0;for(let e of[...r])r.delete(e),e();return Promise.resolve({value:void 0,done:!0})}}}}}}var uP=class extends Error{constructor(){super(`the channel's send counter is exhausted`),this.name=`ChannelExhaustedError`}};function dP(e){return{type:`handshake`,version:1,domains:[...e]}}var fP=[`core/federation`];function pP(e,t){let n=Math.min(e.version,t.version),r=e.domains.filter(e=>!fP.includes(e)&&t.domains.includes(e));return{ok:n>=1&&r.length>0,version:n,sharedDomains:r}}function mP(e){return`data/${AO(e)}/head`}function hP(e,t){return`data/${AO(e)}/entry/${String(t)}`}async function gP(e,t){let n=await e.get(mP(t));return n===void 0?0:Number(new TextDecoder().decode(n))}async function _P(e,t,n){await e.set(mP(t),new TextEncoder().encode(String(n)))}async function vP(e,t){return gP(e,t)}async function yP(e,t){let n=await gP(e.storage,e.identity.deviceId)+1;return await e.storage.set(hP(e.identity.deviceId,n),t),await _P(e.storage,e.identity.deviceId,n),{seq:n,haveFrame:{type:`data-have`,peer:e.identity.deviceId,"head-seq":n}}}async function bP(e,t,n,r){let i=[],a=async n=>{if(n>r)return;let o=await e.get(hP(t,n));o!==void 0&&(i.push(o),await a(n+1))};return await a(n),i}async function xP(e,t,n){let r=await gP(e,t.peer);if(r<=t[`from-seq`])return null;let i=Math.min(r,t[`from-seq`]+n),a=await bP(e,t.peer,t[`from-seq`]+1,i);return a.length===0?null:{type:`data-entries`,peer:t.peer,"from-seq":t[`from-seq`],entries:a}}async function SP(e,t){let n=await gP(e,t.peer);return t[`from-seq`]===n?(await rA(t.entries,async(n,r)=>{await e.set(hP(t.peer,t[`from-seq`]+1+r),n)}),await _P(e,t.peer,t[`from-seq`]+t.entries.length),{ok:!0}):{ok:!1,reason:`gap`}}async function CP(e,t,n){let r=await gP(e,t);return bP(e,t,n+1,r)}function wP(e){return e.type===`data-have`||e.type===`data-request`||e.type===`data-entries`}var TP=class extends Error{constructor(){super(`timed out waiting for pong`),this.name=`PingTimeoutError`}};function EP(){let e=[];function t(t){let n=e.indexOf(t);return n!==-1&&(e.splice(n,1),!0)}return{resolveOldest(t){let n=e.shift();n!==void 0&&n.resolve(t-n.sentAt)},rejectAll(t){for(let n of e.splice(0))n.reject(Error(t))},async sendAndAwait(n,r,i){let a,o=new Promise((t,r)=>{a={sentAt:n,resolve:t,reject:r},e.push(a)});if(a===void 0)throw Error(`the round trip was not registered`);let s=a;o.catch(()=>void 0);try{await r()}catch(e){throw t(s),e}if(i===void 0)return o;let c;return Promise.race([o,new Promise((e,n)=>{c=setTimeout(()=>{t(s)&&n(new TP)},i)})]).finally(()=>{clearTimeout(c)})}}}function DP(e){return e.authenticatedPeer===void 0?e.isAccepted?e.firstAdvertisedPeer??void 0:void 0:e.authenticatedPeer}function OP(e){let t=DP(e);return{direct:t===void 0?[]:[t],relayed:e.relayedDevices.map(e=>({device:e,...t===void 0?{}:{via:t}}))}}function kP(e){let t=null;return{recordAdvert:e=>{t??=e},compute:()=>{let n=e.getAuthenticatedPeer();return OP({...n===void 0?{}:{authenticatedPeer:n},firstAdvertisedPeer:t,isAccepted:e.isAccepted,relayedDevices:e.getRelayedDevices()})}}}function AP(){let e=new Map;return{has:t=>e.has(AO(t)),add:t=>{e.set(AO(t),t)},remove:t=>{e.delete(AO(t))},clear:()=>{e.clear()},list:()=>[...e.values()]}}function jP(e){let t=[];return{record:n=>{t.push(n),t.length>e&&t.splice(0,t.length-e)},entries:()=>[...t]}}var MP=16,NP=256,PP=256,FP=12,IP=4,LP=8,RP=new TextEncoder,zP=RP.encode(`wire-mesh/secure-hello/v1\0`),BP=RP.encode(`wire-mesh/secure-channel/v1\0`),VP=RP.encode(`wire-mesh/secure-data/v1\0`),HP=RP.encode(`lo-to-hi`),UP=RP.encode(`hi-to-lo`),WP={name:`ECDH`,namedCurve:`P-256`};function GP(...e){let t=new Uint8Array(e.reduce((e,t)=>e+t.length,0)),n=0;for(let r of e)t.set(r,n),n+=r.length;return t}function KP(e,t){for(let n=0;n<Math.min(e.length,t.length);n+=1){let r=(e[n]??0)-(t[n]??0);if(r!==0)return r}return e.length-t.length}function qP(e){let t=new Uint8Array(LP);return new DataView(t.buffer).setBigUint64(0,BigInt(e),!1),t}function JP(e,t,n,r){return GP(zP,e,t,n,r)}async function YP(e,t){let n=await crypto.subtle.generateKey(WP,!1,[`deriveBits`]),r=new Uint8Array(await crypto.subtle.exportKey(`raw`,n.publicKey)),i=crypto.getRandomValues(new Uint8Array(MP)),a=await e.sign(JP(r,i,e.deviceId,t));return{peer:t,privateKey:n.privateKey,hello:{type:`secure-hello`,"ephemeral-key":r,nonce:i,"identity-key":e.identityKey,"to-device":t,signature:a}}}async function XP(e,t){let n=t[`identity-key`],r=await e.deriveDeviceId(n[`public-key`]);if(!iA(t[`to-device`],e.deviceId))return{ok:!1,reason:`wrong_recipient`};try{return await e.verify(n,JP(t[`ephemeral-key`],t.nonce,r,e.deviceId),t.signature)?{ok:!0,peer:{deviceId:r,identityKey:n}}:{ok:!1,reason:`bad_signature`}}catch(e){if(!(e instanceof fk))throw e;return{ok:!1,reason:e.fault===`unsupported_alg`?`unsupported_identity_alg`:`invalid_identity_key`}}}async function ZP(e){try{return await crypto.subtle.importKey(`raw`,Uint8Array.from(e),WP,!1,[]),!0}catch{return!1}}var QP=2**53-1;function $P(e){if(!Number.isSafeInteger(e)||e<0)throw RangeError(`firstSendCounter must be a non-negative safe integer`)}function eF(e){if(e>QP)throw new uP;return{counter:e,next:e+1}}function tF(e){let t=new Uint8Array(FP);return t.set(qP(e),IP),t}function nF(e,t,n){return GP(VP,e,t,qP(n))}async function rF({secret:e,salt:t,low:n,high:r,label:i}){let a=await crypto.subtle.importKey(`raw`,Uint8Array.from(e),`HKDF`,!1,[`deriveKey`]);return crypto.subtle.deriveKey({name:`HKDF`,hash:`SHA-256`,salt:Uint8Array.from(t),info:GP(BP,n,r,i)},a,{name:`AES-GCM`,length:NP},!1,[`encrypt`,`decrypt`])}async function iF(e,{pending:t,remote:n,peer:r,firstSendCounter:i=0}){$P(i);let a;try{let e=await crypto.subtle.importKey(`raw`,Uint8Array.from(n[`ephemeral-key`]),WP,!1,[]);a=new Uint8Array(await crypto.subtle.deriveBits({name:`ECDH`,public:e},t.privateKey,PP))}catch{return}let o=KP(e.deviceId,r.deviceId)<0,s=o?e.deviceId:r.deviceId,c=o?r.deviceId:e.deviceId,l=GP(o?t.hello.nonce:n.nonce,o?n.nonce:t.hello.nonce),u=await rF({secret:a,salt:l,low:s,high:c,label:HP}),d=await rF({secret:a,salt:l,low:s,high:c,label:UP}),f=o?u:d,p=o?d:u,m=i,h=-1,g=Promise.resolve(),_=Promise.resolve();async function v(t,n){return{type:`secure-data`,counter:n,ciphertext:new Uint8Array(await crypto.subtle.encrypt({name:`AES-GCM`,iv:tF(n),additionalData:nF(e.deviceId,r.deviceId,n)},f,MN(t)))}}async function y(t){if(t.counter<=h)return{ok:!1,reason:`replayed`};let n;try{n=new Uint8Array(await crypto.subtle.decrypt({name:`AES-GCM`,iv:tF(t.counter),additionalData:nF(r.deviceId,e.deviceId,t.counter)},p,Uint8Array.from(t.ciphertext)))}catch{return{ok:!1,reason:`unauthentic`}}h=Math.max(h,t.counter);let i=IN(n);return i===null?{ok:!1,reason:`undecodable`}:{ok:!0,frame:i}}let b=async e=>{let t=_.then(async()=>y(e));return _=t.catch(()=>void 0),t};return{peer:r,seal:async e=>{let t=eF(m),n=t.counter;m=t.next;let r=g.then(async()=>v(e,n));return g=r.catch(()=>void 0),r},open:async e=>{let t=await b(e);return t.ok?t.frame:void 0},openOutcome:b}}var aF=3e3,oF=class{peer;chosen=!1;lastUsed;current;replaced;hs;pool=[];waiters;opening=Promise.resolve();constructor(e,t){this.peer=e,this.lastUsed=t}get key(){return AO(this.peer)}touch(e){this.lastUsed=e}choose(){this.chosen=!0}holdsKey(e){return[this.current?.remoteKey,this.replaced?.remoteKey,...(this.hs?.cands??[]).map(e=>e.remoteKey),...this.pool.map(e=>e.remoteKey)].some(t=>t!==void 0&&iA(t,e))}outstanding(e){return this.hs!==void 0&&!this.hs.expired&&e<this.hs.sentAt+3e3}expire(e){this.replaced!==void 0&&e>=this.replaced.until&&(this.replaced=void 0);let{hs:t}=this;if(t===void 0||t.expired||e<t.sentAt+3e3)return;let[n,...r]=t.cands;this.current===void 0?n===void 0?t.expired=!0:r.length===0?(this.current={...n,confirmed:!1},this.hs=void 0):(this.pool=t.cands,this.hs=void 0):this.hs=void 0}candidates(){return[...this.hs?.cands??[],...this.pool]}begin(e){this.hs=e}end(e){return this.hs===e&&(this.hs=void 0,!0)}confirmCurrent(){this.current!==void 0&&(this.current.confirmed=!0)}confirm(e,t){this.current!==void 0&&(this.replaced={channel:this.current.channel,remoteKey:this.current.remoteKey,until:t+aF}),this.current={...e,confirmed:!0},this.hs=void 0,this.pool=[]}dropConfirmed(){this.current=void 0,this.replaced=void 0}clearCurrent(e){this.current?.channel===e&&(this.current=void 0)}isEmpty(){return this.current===void 0&&this.replaced===void 0&&this.hs===void 0&&this.pool.length===0}async waitForChannel(){return this.waiters??=(()=>{let e=Promise.withResolvers();return e.promise.catch(()=>void 0),e})(),this.waiters.promise}releaseWaiters(){this.waiters?.resolve(void 0),this.waiters=void 0}rejectWaiters(e){this.waiters?.reject(e),this.waiters=void 0}async serialise(e){let t=this.opening.then(e);return this.opening=t.catch(()=>void 0),t}};function sF(e){return e.ok||e.reason===`undecodable`}async function cF(e,t){let[n,...r]=e;if(n===void 0)return;let i=await n.channel.openOutcome(t);return sF(i)?{cand:n,outcome:i}:cF(r,t)}var lF={now:()=>performance.now()};function uF(e,t,n={}){n.firstSendCounter!==void 0&&$P(n.firstSendCounter);let r=n.newHandshake??(async t=>YP(e,t)),i=-1/0,a=n.clock??lF,o={now:()=>(i=Math.max(i,a.now()),i)},s=new Map,c=EN(()=>o.now());function l(e,t){c(t===void 0?``:AO(t),async r=>n.onFault?.(e,{peer:t,suppressed:r}))}function u(e){e.isEmpty()&&!e.chosen&&s.get(e.key)===e&&s.delete(e.key)}function d(e,t,n){if(!e.end(t))return;let r=n instanceof Error?n:Error(String(n));t.sent.reject(r),e.current===void 0&&e.pool.length===0&&e.rejectWaiters(r),u(e)}function f(e){let t=[...s.values()].filter(e=>e.hs?.origin===`initiated`&&e.hs.cands.length===0&&e.current===void 0),n=t.filter(t=>t!==e).sort((e,t)=>(e.hs?.sentAt??0)-(t.hs?.sentAt??0)).slice(0,Math.max(0,t.length-256));for(let e of n)e.hs!==void 0&&d(e,e.hs,Error(`the handshake was dropped to make room for others`))}function p(e,n){let i=r(e.peer),a={mine:i,origin:n,sentAt:o.now(),cands:[],sent:Promise.withResolvers(),expired:!1};return a.sent.promise.catch(()=>void 0),e.begin(a),i.then(async({hello:r})=>{try{await t(e.peer,r)}catch(t){d(e,a,t),n===`answered`&&l(t,e.peer);return}a.sent.resolve(void 0)},t=>{d(e,a,t)}),a}async function m(t,r,i,a){let o=await iF(e,{pending:await r.mine,remote:i,peer:a,...n.firstSendCounter===void 0?{}:{firstSendCounter:n.firstSendCounter}});o===void 0||t.hs!==r||s.get(t.key)!==t||r.cands.length>=2||t.holdsKey(i[`ephemeral-key`])||(r.cands.push({channel:o,remoteKey:i[`ephemeral-key`]}),t.releaseWaiters())}function h(e){let[t]=[...s.values()].filter(t=>!t.chosen&&e-t.lastUsed>=3e3).sort((e,t)=>e.lastUsed-t.lastUsed);return t}function g(){return[...s.values()].filter(e=>!e.chosen).length<64}function _(e){return g()||h(e)!==void 0}function v(e){if(g())return!0;let t=h(e);return t!==void 0&&(y(t,Error(`the entry was dropped to make room for others`)),!0)}function y(e,t){s.delete(e.key),e.hs?.sent.reject(t),e.rejectWaiters(t)}async function b(e,t,n){try{return await t.seal(n)}catch(n){throw n instanceof uP&&e.clearCurrent(t),n}}async function x(e,t){e.expire(o.now()),e.touch(o.now());let{current:n,hs:r}=e;return n===void 0?e.pool.length>0?Promise.all(e.pool.map(async n=>b(e,n.channel,t))):r===void 0?(p(e,`initiated`),f(e),x(e,t)):r.cands.length>0?(await r.sent.promise,Promise.all(r.cands.map(async n=>b(e,n.channel,t)))):(await e.waitForChannel(),x(e,t)):[await b(e,n.channel,t)]}async function S(e,t){e.expire(o.now());let{current:n}=e;if(n!==void 0){let r=await n.channel.openOutcome(t);if(sF(r))return e.confirmCurrent(),e.touch(o.now()),r.ok?{frame:r.frame,from:n.channel.peer.deviceId}:void 0}let r=await cF(e.candidates(),t);if(r!==void 0)return s.get(e.key)===e?(e.confirm(r.cand,o.now()),e.touch(o.now()),r.outcome.ok?{frame:r.outcome.frame,from:r.cand.channel.peer.deviceId}:void 0):void 0;let{replaced:i}=e;if(i!==void 0&&o.now()<i.until){let e=await i.channel.openOutcome(t);return e.ok?{frame:e.frame,from:i.channel.peer.deviceId}:void 0}}async function C(t,n){let r=AO(n),i=await XP(e,t);if(!i.ok||!await ZP(t[`ephemeral-key`]))return;let a=o.now(),c=s.get(r);if(c?.expire(a),c?.holdsKey(t[`ephemeral-key`])===!0)return;if(c?.hs!==void 0&&c.outstanding(a)){c.hs.cands.length<2&&await m(c,c.hs,t,i.peer);return}if(c===void 0){if(!v(a))return;c=new oF(n,a),s.set(r,c)}let l=p(c,`answered`);c.touch(a);try{await m(c,l,t,i.peer)}catch(e){throw d(c,l,e),e}}return{seal:async(e,t,n)=>{let r=AO(e),i=o.now(),a=s.get(r);if(a===void 0){if(n===`reply`&&!v(i))throw Error(`there is no channel with this peer`);a=new oF(e,i),s.set(r,a)}return n===`request`&&a.choose(),x(a,t)},applyHello:async(t,n)=>{let r;try{if(n===void 0||(r=await e.deriveDeviceId(t[`identity-key`][`public-key`]),!iA(r,n)))return;let i=s.get(AO(r)),a=o.now();if(i?.expire(a),i?.holdsKey(t[`ephemeral-key`])===!0||i?.hs!==void 0&&i.outstanding(a)&&i.hs.cands.length>=2||i===void 0&&!_(a))return;await C(t,r)}catch(e){l(e,r)}},open:async(e,t)=>{if(t===void 0)return;let n=s.get(AO(t));if(n!==void 0)return n.serialise(async()=>S(n,e))},reset:e=>{for(let t of[...s.values()])y(t,Error(e))},forget:e=>{let t=s.get(AO(e));if(t!==void 0){if((t.hs?.cands.length??0)+t.pool.length===0){y(t,Error(`the relay pairing was lost`));return}t.dropConfirmed()}}}}var dF=1e3,fF=3e3;function pF(e,t,n,r,i,a=[],o,s,c){let l=null,u={status:`idle`},d={status:`pending`},f=new Map,p=jP(256),m=p.record,h=!1,g=lP(),_=null,v=null,y=0,b=null,x=0,S=AP(),C=kP({getAuthenticatedPeer:()=>l?.peerDeviceId,isAccepted:r===null,getRelayedDevices:()=>S.list()}),w=new Map,T=uF(e,async(e,t)=>{if(l===null)throw Error(`not connected`);m({direction:`sent`,frame:t}),await l.send(NN(t,e)),M()},{onFault:c}),E=lP(),D=lP(),O=lP(),k=lP(),A=EP();function j(){return{state:u,directory:[...f.values()],frameLog:p.entries()}}function M(){g.push(j())}function N(e){for(let t of w.values())t.reject(Error(e));w.clear()}function ee(e,t,n){let r=x;x+=1;let i=n??b;return{type:`manage-request`,"request-id":r,command:e,scope:t,...i===null?{}:{token:i}}}function P(){if(h||l===null||u.status!==`connected`)throw Error(`not connected`);return l}async function F(e,t,n=`request`){if(l===null)throw Error(`not connected`);if(t===void 0){await l.send(e);return}let r=l,i=await T.seal(t,e,n);await Promise.all(i.map(async e=>r.send(NN(e,t))))}function I(e,t){let n=e[`request-id`],r=w.get(n);if(r===void 0)return;let i=r.expectedFrom;(i===void 0?t===void 0:t!==void 0&&AO(t)===AO(i))&&(w.delete(n),r.resolve(e.outcome))}function te(e,t){let n=e[`request-id`],r=t?.fromDevice,i=t?.toDevice,a={requestId:n,command:e.command,scope:e.scope,...e.token===void 0?{}:{token:e.token},...r===void 0?{}:{fromDevice:r},...i===void 0?{}:{toDevice:i},respond:async e=>{let t={type:`manage-response`,"request-id":n,outcome:e};m({direction:`sent`,frame:t}),await F(t,r,`reply`),M()}};if(rP(e.command.params)){a.respond(iP()).catch(()=>void 0);return}E.push(a)}async function ne(n){if(n.type===`relay-data`){let e=IN(n.payload);if(e?.type===`secure-hello`){m({direction:`received`,frame:e}),await T.applyHello(e,n[`from-device`]);return}if(e?.type===`secure-data`){let t=await T.open(e,n[`from-device`]);t?.frame.type===`manage-response`?(m({direction:`received`,frame:t.frame}),I(t.frame,t.from)):t!==void 0&&wP(t.frame)?(m({direction:`received`,frame:t.frame}),k.push({frame:t.frame,fromDevice:t.from,...n[`to-device`]===void 0?{}:{toDevice:n[`to-device`]}})):t?.frame.type===`manage-request`&&(m({direction:`received`,frame:t.frame}),te(t.frame,{fromDevice:t.from,...n[`to-device`]===void 0?{}:{toDevice:n[`to-device`]}}));return}m({direction:`received`,frame:n});return}if(m({direction:`received`,frame:n}),n.type===`handshake`)L(n);else if(n.type===`gossip`){let t=await Promise.all(n.peers.map(async t=>QN(e,t)));for(let e of n.peers.filter((e,n)=>t[n]===!0)){let t=AO(e.device),n=f.get(t)?.advert[`snapshot-seconds`];n!==void 0&&e[`snapshot-seconds`]<n||(f.set(t,{device:e.device,advert:e}),C.recordAdvert(e.device),i?.(e))}}else if(n.type===`relay-inbound`)S.add(n[`source-device`]);else if(n.type===`manage-response`)I(n);else if(n.type===`manage-request`)te(n);else if(n.type===`pong`)A.resolveOldest(t.now());else if(n.type===`revocation-announce`)for(let e of n.entries)D.push(e);else wP(n)?k.push({frame:n}):n.type===`coordinator`&&O.push(n)}async function re(e){if(l===null)throw Error(`not connected`);if(S.has(e))return;let t={type:`relay-connect`,"target-device":e};m({direction:`sent`,frame:t}),await l.send(t),S.add(e),M()}let ie=dP([]);function L(e){if(d.status!==`pending`)return;_!==null&&(clearTimeout(_),_=null);let t=pP(ie,e);d=t.ok?{status:`negotiated`,version:t.version,sharedDomains:t.sharedDomains}:{status:`rejected`,reason:`no shared domains or version`},u.status===`connected`&&(u={...u,handshake:d})}function R(e,t){return e.redialAddress?.()??t}function ae(e,t,r){if(!h){if(N(`disconnected before a response arrived`),A.rejectAll(`disconnected before a pong arrived`),n!==null&&y<n.maxAttempts){y+=1;let i=y;u={status:`reconnecting`,address:t,attempt:i,reason:e},M(),v=setTimeout(()=>{v=null,le(t,r).catch(e=>{ae(e instanceof Error?e.message:String(e),t,r)})},n.delayMs(i));return}u={status:`closed`,address:t,reason:e},M()}}async function oe(e,t,n){let r=!1;for await(let t of e.receive()){if(h)return;r||(r=!0,y=0),await ne(t),await o?.(e,t),M()}s?.(e),u.status===`connected`&&ae(`node closed the connection`,R(e,t),n)}async function se(n){return n!==void 0&&cP(n),{type:`gossip`,peers:[await ZN(e,{...n,[tP]:eP,[oP]:C.compute(),device:e.deviceId,addresses:[...a],"snapshot-seconds":Math.floor(t.now()/dF),"identity-key":e.identityKey})]}}async function ce(e,t,n){l=e,T.reset(`the connection changed before the channel was ready`),S.clear(),ie=dP(n),d={status:`pending`},u={status:`connected`,address:t,handshake:d},m({direction:`sent`,frame:ie}),await l.send(ie),M();let r=await se();m({direction:`sent`,frame:r}),await l.send(r),M(),_=setTimeout(()=>{_=null,d.status===`pending`&&(d={status:`unanswered`},u.status===`connected`&&(u={...u,handshake:d}),M())},fF),oe(l,t,n).catch(r=>{u.status===`connected`&&ae(r instanceof Error?r.message:String(r),R(e,t),n)})}async function le(e,t){if(r===null)throw Error(`this session is already connected; there is nothing to dial`);_!==null&&(clearTimeout(_),_=null),u={status:`connecting`,address:e},M();let n=await r(e);if(h){await n.close();return}await ce(n,e,t)}return{wireUpConnection:ce,session:{events:g.stream,incomingManageRequests:E.stream,revocationAnnouncements:D.stream,coordinatorFrames:O.stream,incomingDataFrames:k.stream,async connect(e,t){if(l!==null)throw Error(`a session connects once; create a new one to reconnect`);y=0,await le(e,t).catch(n=>{throw ae(n instanceof Error?n.message:String(n),e,t),n})},async sendPing(){let e=P(),t={type:`ping`};m({direction:`sent`,frame:t}),await e.send(t),M()},async sendPingMeasureRtt(e){let n=P();return A.sendAndAwait(t.now(),async()=>{let e={type:`ping`};m({direction:`sent`,frame:e}),await n.send(e),M()},e)},setToken(e){b=e},async sendManageRequest(e,t,n,r,i){P(),n!==void 0&&(await re(n),P());let a=ee(e,t,r),o=a[`request-id`],s=new Promise((e,t)=>{w.set(o,{resolve:e,reject:t,expectedFrom:n})});s.catch(()=>void 0),m({direction:`sent`,frame:a});let c=(async()=>{try{await F(a,n)}catch(e){throw w.delete(o),e}return M(),s})();if(i===void 0)return c;let l;return Promise.race([c,new Promise(e=>{l=setTimeout(()=>{w.delete(o)&&(n!==void 0&&(S.remove(n),T.forget(n)),e({result:`error`,code:`timeout`}))},i)})]).finally(()=>{clearTimeout(l)})},async sendRevocationAnnounce(e){P();let t={type:`revocation-announce`,entries:[...e]};m({direction:`sent`,frame:t}),await F(t),M()},async sendCoordinatorClaim(e){P();let t={...e};m({direction:`sent`,frame:t}),await F(t),M()},async sendGossipUpdate(e){P();let t=await se(e);m({direction:`sent`,frame:t}),await F(t),M()},getTopologyPeers(){return C.compute()},async sendDataFrame(e,t){P(),t!==void 0&&await re(t),m({direction:`sent`,frame:e}),await F(e,t),M()},async close(){h=!0,_!==null&&(clearTimeout(_),_=null),v!==null&&(clearTimeout(v),v=null),N(`connection closed before a response arrived`),T.reset(`the session closed before the channel was ready`),A.rejectAll(`connection closed before a pong arrived`),l!==null&&await l.close(),(u.status===`connected`||u.status===`connecting`||u.status===`reconnecting`)&&(u={status:`closed`,address:u.address,reason:`closed by you`}),M()}}}}function mF(e,t,n={now:()=>Date.now()},r=null,i=[],a,o,s){let{session:c}=pF(t,n,r,async t=>e.connect(t),a,i,o,void 0,s);return c}async function hF(e,t,n,r={}){let i=r.clock??{now:()=>Date.now()},a=null,o=new Promise(e=>{a=e}),s=!1,{session:c,wireUpConnection:l}=pF(t,i,null,null,e=>{s||(s=!0,a?.(e.device)),r.onPeerAdvert?.(e)},r.addresses,r.onFrame,r.onSessionEnd);return await l(e,r.label??`accepted`,n),{...c,peerDeviceId:o}}function gF(e){return e instanceof Error?e:Error(String(e))}function _F(e){let t=AO(e.selfDeviceId),n=new Set;async function r(t){let n;try{n=await e.shouldExpand(t)}catch(n){e.onExpansionFailed?.(t,[gF(n)]);return}if(!n){e.onExpansionDeclined?.(t);return}await i(t,t.addresses,[])}async function i(t,n,r){let[a,...o]=n;if(a===void 0){e.onExpansionFailed?.(t,r);return}try{let n=await e.dial(a);e.onExpanded(t,a,n)}catch(e){await i(t,o,[...r,gF(e)])}}return{considerAdvert(e){let i=AO(e.device);i===t||n.has(i)||e.addresses.length===0||(n.add(i),r({device:e.device,addresses:e.addresses}).catch(()=>void 0))}}}var vF=/^[0-9a-f]{64}$/,yF=/^[A-Za-z0-9_-]+$/;function bF(e,t){if(!vF.test(e))throw Error(`expected ${t} to be a 64-character lowercase hex device-id, got ${JSON.stringify(e)}`)}function xF(e,t){if(bF(e,`a`),bF(t,`b`),e===t)throw Error(`a DM room path cannot name the same device twice (${e})`);return e<t?`${e}+${t}`:`${t}+${e}`}function SF(e){let t=e.indexOf(`/`);if(t!==-1){let n=e.slice(0,t),r=e.slice(t+1);if(vF.test(n)&&yF.test(r))return{kind:`owner-named`,owner:n,localName:r}}let n=e.indexOf(`+`);if(n!==-1){let t=e.slice(0,n),r=e.slice(n+1);if(vF.test(t)&&vF.test(r)&&t!==r)return{kind:`dm`,participants:[t,r]}}throw Error(`${JSON.stringify(e)} is not a valid room-path`)}var CF=5,wF=1e3,TF=3e4,EF=2,DF={maxAttempts:CF,delayMs:e=>Math.min(wF*EF**(e-1),TF)},OF=4,kF=1024,AF=kF*kF*100,jF=new Uint8Array(OF);function MF(e){let t=Mg(e,hg),n=new Uint8Array(OF+t.length);return new DataView(n.buffer).setUint32(0,t.length),n.set(t,OF),n}function NF(e,t){let n=new Uint8Array(e.length+t.length);return n.set(e),n.set(t,e.length),n}function PF(e){return{[Symbol.asyncIterator]:()=>({next:async()=>{let t=await e.read();return t.done?{done:!0,value:void 0}:{done:!1,value:t.value}}})}}async function*FF(e){let t=new Uint8Array;try{for await(let n of PF(e))for(t=NF(t,n);t.length>=OF;){let e=new DataView(t.buffer,t.byteOffset).getUint32(0);if(e>104857600)throw Error(`frame of ${String(e)} bytes exceeds the ${String(AF)}-byte limit`);if(t.length<OF+e)break;if(e===0){t=t.slice(OF);continue}let n=t.slice(OF,OF+e);t=t.slice(OF+e);let r=ZE.safeParse(b_(n,x_));r.success&&(yield r.data)}}catch(t){throw await e.cancel(t),t}}function IF(e,t={opened:!1}){let n=e.writable.getWriter(),r=e.readable.getReader(),i=FF(r),a=t.opened?n.write(jF):Promise.resolve();return a.catch(()=>void 0),{send:async e=>{await a,await n.write(MF(e))},receive:()=>i,close:async()=>{await Promise.allSettled([n.close(),r.cancel()])}}}var LF=`/wire-mesh`,RF=8e3,zF=`the web console is a client only: it cannot listen`;async function BF(e){let t=[],n=async()=>{let r=await e.read();if(!r.done){if(!(r.value instanceof Uint8Array))throw Error(`the announcement carried something other than bytes`);t.push(r.value),await n()}};return await n(),t}async function VF(e){let t=e.incomingUnidirectionalStreams.getReader(),n=await t.read();if(t.releaseLock(),n.done)throw Error(`the node opened no announcement stream`);let r=n.value;if(!(r instanceof ReadableStream))throw Error(`the announcement stream is not a readable stream`);let i=await BF(r.getReader()),a=new Uint8Array(i.reduce((e,t)=>e+t.length,0)),o=0;for(let e of i)a.set(e,o),o+=e.length;return Ik(a)}async function HF(e){let t,n=new Promise(e=>{t=setTimeout(()=>{e(`timed out`)},RF)});try{let t=await Promise.race([e.createBidirectionalStream(),n]);if(t===`timed out`)throw e.close(),Error(`this browser cannot open a stream to this node: it is waiting for flow-control credit the node never grants, which is how Safari behaves with the node's HTTP/3 library (fails-components/webtransport#490); reach the node over wss:// instead`);return t}finally{clearTimeout(t)}}function UF(e){return{async connect(t){if(typeof WebTransport>`u`)throw Error(`this browser does not support WebTransport`);let{url:n,sha256:r}=Nk(t),i=new URL(n).host,a=Lk(r,await e.recall(i)),o=new WebTransport(new URL(LF,n).toString(),{serverCertificateHashes:a.map(e=>({algorithm:`sha-256`,value:e}))});await o.ready;let s=IF(await HF(o),{opened:!0});o.closed.catch(()=>void 0).then(async()=>s.close()).catch(()=>void 0);let c;return VF(o).then(async t=>{c=t,await e.remember(i,t)}).catch(()=>void 0),{...s,redialAddress:()=>c===void 0?t:zk(t,c)}},async listen(){return Promise.reject(Error(zF))}}}var WF=1e3,GF=1002,KF=`the web console is a client only: it cannot listen`;function qF(e){let t=[],n=[],r=!1,i=null;function a(){r=!0;for(let e of n.splice(0))e.resolve({value:void 0,done:!0})}function o(e){i=e,r=!0;for(let t of n.splice(0))t.reject(e)}e.addEventListener(`message`,r=>{if(!(r.data instanceof ArrayBuffer)){o(Error(`expected a binary WebSocket message`)),e.close(GF,`protocol error`);return}let i;try{i=FN(r.data)}catch(t){if(t instanceof PN)return;o(t instanceof Error?t:Error(`frame body failed to decode: ${String(t)}`)),e.close(GF,`protocol error`);return}let a=n.shift();a?a.resolve({value:i,done:!1}):t.push(i)}),e.addEventListener(`close`,a),e.addEventListener(`error`,a);let s={[Symbol.asyncIterator](){return{next:async()=>c()}}};async function c(){let e=t.shift();return e===void 0?i===null?r?Promise.resolve({value:void 0,done:!0}):new Promise((e,t)=>{n.push({resolve:e,reject:t})}):Promise.reject(i):Promise.resolve({value:e,done:!1})}return{async send(t){return r?Promise.reject(Error(`connection is closed`)):(e.send(MN(t)),Promise.resolve())},receive:()=>s,async close(){return e.close(WF),Promise.resolve()}}}function JF(){return{async connect(e){let t=new URL(e);if(t.protocol!==`ws:`&&t.protocol!==`wss:`)return Promise.reject(Error(`not a WebSocket address: ${e}`));let n=new WebSocket(t);return n.binaryType=`arraybuffer`,new Promise((e,r)=>{n.addEventListener(`open`,()=>{e()}),n.addEventListener(`error`,()=>{r(Error(`connect to ${t.toString()} failed`))})}).then(()=>qF(n))},async listen(){return Promise.reject(Error(KF))}}}function YF(e){let t=JF(),n=UF(e);return{connect:async e=>Mk(e)?n.connect(e):t.connect(e),listen:async(e,n)=>t.listen(e,n)}}var XF=[{urls:`stun:stun.cloudflare.com:3478`}],ZF=`webrtc:signal`,QF={kind:`node`};function $F(e){return typeof e==`object`&&`verb`in e&&e.verb===`webrtc.offer`}function eI(e){return typeof e==`object`&&`verb`in e&&e.verb===`webrtc.answer`}function tI(e){return typeof e==`object`&&`verb`in e&&e.verb===`webrtc.ice-candidate`}function nI(e,t){return{verb:ZF,params:{verb:`webrtc.offer`,"negotiation-id":e,sdp:t}}}function rI(e,t){return{verb:ZF,params:{verb:`webrtc.answer`,"negotiation-id":e,sdp:t}}}function iI(e,t){return{verb:ZF,params:{verb:`webrtc.ice-candidate`,"negotiation-id":e,...t===void 0?{}:{candidate:t}}}}function aI(e){return{candidate:e.candidate,...e.sdpMid===null?{}:{"sdp-mid":e.sdpMid},...e.sdpMLineIndex===null?{}:{"sdp-m-line-index":e.sdpMLineIndex},...e.usernameFragment===null?{}:{"username-fragment":e.usernameFragment}}}function oI(e){return{candidate:e.candidate,...e[`sdp-mid`]===void 0?{}:{sdpMid:e[`sdp-mid`]},...e[`sdp-m-line-index`]===void 0?{}:{sdpMLineIndex:e[`sdp-m-line-index`]},...e[`username-fragment`]===void 0?{}:{usernameFragment:e[`username-fragment`]}}}function sI(){let e=0;return()=>{let t=e;return e+=1,t}}async function cI(e,t){if(e.token===void 0)return!1;let n=await SM(e.token,t);return n.ok?n.claims.capability===`webrtc:signal`&&n.claims.scope.kind===QF.kind:!1}function lI(e){let t=[],n=[],r=!1,i=null;function a(){r=!0;for(let e of n.splice(0))e.resolve({value:void 0,done:!0})}function o(e){i=e,r=!0;for(let t of n.splice(0))t.reject(e)}e.addEventListener(`message`,r=>{if(!(r.data instanceof ArrayBuffer)){o(Error(`expected a binary data channel message`)),e.close();return}let i;try{i=FN(r.data)}catch(t){if(t instanceof PN)return;o(t instanceof Error?t:Error(`frame body failed to decode: ${String(t)}`)),e.close();return}let a=n.shift();a?a.resolve({value:i,done:!1}):t.push(i)}),e.addEventListener(`close`,a),e.addEventListener(`error`,a);let s={[Symbol.asyncIterator](){return{next:async()=>c()}}};async function c(){let e=t.shift();return e===void 0?i===null?r?Promise.resolve({value:void 0,done:!0}):new Promise((e,t)=>{n.push({resolve:e,reject:t})}):Promise.reject(i):Promise.resolve({value:e,done:!1})}return{async send(t){return e.readyState===`open`?(e.send(MN(t)),Promise.resolve()):Promise.reject(Error(`data channel is not open (state: ${e.readyState})`))},receive:()=>s,async close(){return e.close(),Promise.resolve()}}}var uI=`wire-mesh`;function dI(e,t){for(let n of t.localTracks??[])e.addTrack(n);t.onRemoteTrack!==void 0&&e.addEventListener(`track`,t.onRemoteTrack)}function fI(e,t){e.addEventListener(`open`,()=>{t(lI(e))},{once:!0})}var pI=16,mI=36e5;async function hI(e,t){let n=new Uint8Array(pI);crypto.getRandomValues(n);let r=await AM({identity:e,clock:t,tokenId:n,bearer:e.deviceId,capability:ZF,scope:QF,expires:t.now()+mI});if(!r.ok)throw Error(`could not mint a webrtc:signal token: ${r.reason}`);return r.token}function gI(e,t){let n={identity:t.identity,clock:t.clock,revocation:t.revocation},r=new Map,i=new Map,a=new Map,o=sI();function s(e,t){clearTimeout(a.get(e)),a.delete(e),r.delete(e),i.delete(e),t.close()}function c(e,t){t.addEventListener(`connectionstatechange`,()=>{(t.connectionState===`closed`||t.connectionState===`failed`)&&s(e,t)})}function l(e,n){a.set(e,setTimeout(()=>{s(e,n)},t.channelOpenTimeoutMs??3e4))}function u(e,t){d(e,t).catch(()=>void 0)}async function d(t,n){let r=iI(t,n===null?void 0:aI(n));await e.sendManageRequest(r,QF,i.get(t))}async function f(o,d){if(!await cI(o,n)){await o.respond({result:`error`,code:`unauthorized`});return}let f=d[`negotiation-id`];i.set(f,o.fromDevice);let p=new RTCPeerConnection({iceServers:[...t.iceServers]});r.set(f,p),dI(p,t),p.addEventListener(`icecandidate`,e=>{u(f,e.candidate)}),p.addEventListener(`datachannel`,e=>{let{channel:n}=e;n.binaryType=`arraybuffer`,fI(n,e=>{clearTimeout(a.get(f)),a.delete(f),t.onIncomingConnection(e)})}),c(f,p),l(f,p);try{await p.setRemoteDescription({type:`offer`,sdp:d.sdp});let t=await p.createAnswer();await p.setLocalDescription(t),await o.respond({result:`ok`}),await e.sendManageRequest(rI(f,t.sdp??``),QF,o.fromDevice)}catch(e){throw s(f,p),e}}async function p(e,t){let n=r.get(t[`negotiation-id`]);n!==void 0&&await n.setRemoteDescription({type:`answer`,sdp:t.sdp}),await e.respond({result:`ok`})}async function m(e,t){let n=r.get(t[`negotiation-id`]);n!==void 0&&await n.addIceCandidate(t.candidate===void 0?null:oI(t.candidate)),await e.respond({result:`ok`})}async function h(e){if(e.command.verb!==`webrtc:signal`)return;let t=e.command.params;$F(t)?await f(e,t):eI(t)?await p(e,t):tI(t)&&await m(e,t)}return DN(jN(e.incomingManageRequests,h,{onFault:t.onFault})),{async initiate(n){let a=o();i.set(a,n);let l=new RTCPeerConnection({iceServers:[...t.iceServers]});r.set(a,l),dI(l,t),l.addEventListener(`icecandidate`,e=>{u(a,e.candidate)}),c(a,l);let d=l.createDataChannel(uI);d.binaryType=`arraybuffer`;let f=new Promise((e,t)=>{fI(d,e),d.addEventListener(`error`,()=>{t(Error(`data channel failed to open`))},{once:!0})});f.catch(()=>void 0);let p;try{let r=await l.createOffer();await l.setLocalDescription(r);let i=await e.sendManageRequest(nI(a,r.sdp??``),QF,n,await hI(t.identity,t.clock),t.channelOpenTimeoutMs??3e4);if(i.result===`error`)throw Error(`webrtc offer rejected: ${i.code}`);return await Promise.race([f,new Promise((e,n)=>{p=setTimeout(()=>{n(Error(`data channel did not open in time`))},t.channelOpenTimeoutMs??3e4)})])}catch(e){throw s(a,l),e}finally{clearTimeout(p)}}}}var _I={frames:0,stage:void 0,handshake:void 0,issued:0,seen:new Set};function vI(e){return AO(e)}function yI(e,t){if(t.type===`gossip`)return e===`received`?t.peers.map(e=>({kind:`peer`,summary:`Peer seen:`,peer:vI(e.device)})):[{kind:`peer`,summary:`Advertised this console to the node`,peer:void 0}];if(t.type===`relay-connect`)return[{kind:`pairing`,summary:`Asked the node to pair this console with`,peer:vI(t[`target-device`])}];if(t.type===`relay-inbound`)return[{kind:`pairing`,summary:`Pairing established with`,peer:vI(t[`source-device`])}];if(t.type===`relay-data`){let n=e===`sent`?t[`to-device`]:t[`from-device`];return[{kind:`relay`,summary:e===`sent`?`Relayed a message to`:`Relayed message received from`,peer:n===void 0?void 0:vI(n)}]}return t.type===`close`?[{kind:`connection`,summary:`The node closed the connection`,peer:void 0}]:[]}function bI(e){return e.status===`reconnecting`?`reconnecting:${String(e.attempt)}`:e.status}function xI(e,t,n){let r=[],i=e=>{r.push({kind:`connection`,summary:e,peer:void 0})};if(bI(t)!==e.stage)switch(t.status){case`connecting`:i(`Connecting to ${t.address}`);break;case`connected`:i(`Connected to ${t.address}`);break;case`reconnecting`:i(`${e.stage?.startsWith(`reconnecting`)===!0?`Retry failed`:`Connection lost`} (${t.reason}); retrying, attempt ${String(t.attempt)}`);break;case`closed`:i(`Closed (${t.reason})`)}return t.status===`connected`&&n!==e.handshake&&(t.handshake.status===`negotiated`?i(`Handshake negotiated: ${t.handshake.sharedDomains.join(`, `)}`):t.handshake.status===`unanswered`?i(`The node does not answer handshakes (a relay-only node)`):t.handshake.status===`rejected`&&i(`Handshake rejected (${t.handshake.reason})`)),r}function SI(e){return e.status===`connected`?e.handshake.status:void 0}function CI(e,t,n){let r=SI(t.state),i=new Set(e.seen),a=[...xI(e,t.state,r),...t.frameLog.slice(e.frames).flatMap(e=>yI(e.direction,e.frame)).filter(e=>e.kind!==`peer`||e.peer===void 0||!i.has(e.peer)&&(i.add(e.peer),!0))].map((t,r)=>({...t,key:`activity-${String(e.issued+r)}`,at:n}));return{tracker:{frames:t.frameLog.length,stage:bI(t.state),handshake:r,issued:e.issued+a.length,seen:i},entries:a}}function wI(e){return e.map(e=>({key:`certificate-${e.key}`,at:e.at,kind:`certificate`,summary:`Certificate changed: ${e.node} announced certificates unlike the remembered ones`,peer:void 0}))}function TI(e,t){let[n,r]=(0,k.useState)({event:void 0,activity:[],statusSince:void 0}),i=(0,k.useRef)({session:e,tracker:_I});return(0,k.useEffect)(()=>{let n=new AbortController;return i.current.session!==e&&(i.current={session:e,tracker:_I}),DN(kN(e.events,n=>{let a=t.now(),{tracker:o}=i.current,s=CI(o,n,a),c=s.tracker.stage!==o.stage;i.current={session:e,tracker:s.tracker},r(e=>({event:n,activity:[...e.activity,...s.entries].slice(-500),statusSince:c?a:e.statusSince}))},{signal:n.signal})),()=>{n.abort()}},[e,t]),n}var EI=`local-network-access`,DI=4,OI=255,kI=8,AI=32,jI=[`10.0.0.0/8`,`127.0.0.0/8`,`172.16.0.0/12`,`192.168.0.0/16`,`169.254.0.0/16`,`100.64.0.0/10`];function MI(e){let t=e.split(`.`);if(t.length!==DI)return;let n=0;for(let e of t){let t=/^\d{1,3}$/.test(e)?Number(e):NaN;if(!(t<=OI))return;n=n*2**kI+t}return n}function NI(e,t){let[n,r]=t.split(`/`),i=MI(n??``),a=Number(r);if(i===void 0)return!1;let o=2**(AI-a);return Math.floor(e/o)===Math.floor(i/o)}function PI(e){let t=e.replace(/^\[|\]$/g,``).toLowerCase(),n=MI(t);return n===void 0?t.includes(`:`)?t===`::1`||/^f[cd]/.test(t)||/^fe[89ab]/.test(t):t===`localhost`||t.endsWith(`.local`)||!t.includes(`.`):jI.some(e=>NI(n,e))}function FI(e){try{return new URL(/^[a-z][a-z0-9+.-]*:\/\//i.test(e)?e:`ws://${e}`).hostname}catch{return}}function II(e){return typeof e==`object`&&!!e&&`name`in e&&typeof e.name==`string`}function LI(){if(`permissions`in navigator)return{query:async e=>{if(!II(e))throw TypeError(`not a permission descriptor`);return navigator.permissions.query(e)}}}async function RI(e,t,n){let r=FI(e);if(r!==void 0&&PI(r)&&!PI(t)&&n!==void 0)try{let{state:e}=await n.query({name:EI});return e===`denied`?`Your browser blocked this page from reaching ${r}, a device on your local network. Allow "Local network access" for this site in the browser's site settings (the icon left of the address), then connect again.`:void 0}catch{return}}var zI=(0,k.createContext)(void 0);function BI(){let e=(0,k.useContext)(zI);if(e===void 0)throw Error(`usePeerNames must be used inside PeerNamesProvider`);return e}var VI={pongTimeoutMs:5e3,intervalMs:15e3};function HI(e,t,n=VI){let[r,i]=(0,k.useState)([]),[a,o]=(0,k.useState)(!1),s=(0,k.useRef)(!1),c=(0,k.useCallback)(()=>{e.sendPingMeasureRtt(n.pongTimeoutMs).then(e=>{s.current=!0,o(!1),i(t=>[...t,e].slice(-40))},e=>{e instanceof TP&&(o(!s.current),i(e=>[...e,void 0].slice(-40)))})},[e,n.pongTimeoutMs]);return(0,k.useEffect)(()=>{if(!t||a)return;c();let e=setInterval(c,n.intervalMs);return()=>{clearInterval(e)}},[t,a,c,n.intervalMs]),{samples:r,unresponsive:a,probe:c}}function UI(e,t,n){let[r,i]=(0,k.useState)(()=>e.now());return(0,k.useEffect)(()=>{if(!t)return;let r=setInterval(()=>{i(e.now())},n);return()=>{clearInterval(r)}},[e,t,n]),r}var WI=1e3,GI=60,KI=60,qI=24;function JI(e){let t=Math.floor(e/WI);if(t<1)return;if(t<GI)return`${String(t)} s`;let n=Math.floor(t/GI);if(n<KI)return`${String(n)} min`;let r=Math.floor(n/KI);return r<qI?`${String(r)} h`:`${String(Math.floor(r/qI))} d`}function YI(e){let t=JI(e);return t===void 0?`just now`:`${t} ago`}function XI(e){let t=JI(e);return t===void 0?`in under a second`:`in ${t}`}function ZI(e){return`${String(Math.max(0,Math.ceil(e/WI)))} s`}function QI(e,t,n){if(n.length===0)return{kind:`first-use`,node:e,presented:t};let r=new Set(n),i=t.filter(e=>r.has(e));return i.length>0?{kind:`known`,node:e,trusted:i}:{kind:`changed`,node:e,remembered:n,presented:t}}function $I(e){if(Mk(e))try{let{url:t,sha256:n}=Nk(e);return{node:new URL(t).host,sha256:[...n]}}catch{return}}function eL(e,t){return{recall:e.recall,remember:async(n,r)=>{let i=QI(n,r.map(e=>kO(e)),(await e.recall(n)).map(e=>kO(e)));await e.remember(n,r),i.kind===`changed`&&t({node:n,remembered:i.remembered,presented:i.presented})}}}var tL=2;function nL(e){let t=[];for(let n=0;n<e.length;n+=tL)t.push(e.slice(n,n+tL).toUpperCase());return t.join(`:`)}var rL=/^([a-z][a-z0-9+.-]*):\/\//i,iL={ws:`ws:`,wss:`wss:`,http:`ws:`,https:`wss:`};function aL(e){if(Mk(e))return e;let t=rL.exec(e);if(t===null)return`ws://${e}`;let n=iL[t[1]?.toLowerCase()??``];if(n===void 0)return e;let r=new URL(e);return r.protocol=n,r.hash=``,r.toString()}function oL({deviceHex:e}){return(0,z.jsx)(z.Fragment,{children:cN(BI().labelOf(e))})}function sL(e){return JSON.stringify(e,(e,t)=>t instanceof Uint8Array?`<${String(t.byteLength)} bytes>`:t)}function cL({activity:e,frameLog:t}){let[n,r]=(0,k.useState)(!1);return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(um,{mt:`md`,label:`Show raw frames`,checked:n,onChange:e=>{r(e.currentTarget.checked)}}),n?(0,z.jsx)(km.ScrollContainer,{minWidth:0,h:384,"data-testid":`frame-log`,children:(0,z.jsxs)(km,{children:[(0,z.jsx)(km.Thead,{children:(0,z.jsxs)(km.Tr,{children:[(0,z.jsx)(km.Th,{children:`direction`}),(0,z.jsx)(km.Th,{children:`frame`})]})}),(0,z.jsx)(km.Tbody,{children:t.map((e,t)=>(0,z.jsxs)(km.Tr,{children:[(0,z.jsx)(km.Td,{children:e.direction}),(0,z.jsx)(km.Td,{children:sL(e.frame)})]},t))})]})}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(U,{fw:600,size:`sm`,mt:`md`,children:`Activity`}),e.length===0?(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`Nothing has happened yet.`}):(0,z.jsx)(km.ScrollContainer,{minWidth:0,h:384,"data-testid":`activity-log`,children:(0,z.jsx)(km,{children:(0,z.jsx)(km.Tbody,{children:[...e].reverse().map(e=>(0,z.jsxs)(km.Tr,{children:[(0,z.jsx)(km.Td,{children:new Date(e.at).toLocaleTimeString()}),(0,z.jsxs)(km.Td,{children:[e.summary,e.peer!==void 0&&(0,z.jsxs)(z.Fragment,{children:[` `,(0,z.jsx)(oL,{deviceHex:e.peer})]})]})]},e.key))})})})]})]})}var lL=160,uL=32,dL=3,fL=2,pL=26;function mL(e){let t=e.at(-1);return t===void 0?e.length===0?`No round trips measured yet`:`Last ping got no pong`:`Round trip ${String(Math.round(t))} ms`}function hL({samples:e}){let t=e.filter(e=>e!==void 0),n=Math.max(1,...t),r=lL/39,i=(40-e.length)*r,a=e.map((e,t)=>({x:i+t*r,y:e===void 0?void 0:dL+pL*(1-e/n)})),o=a.filter(e=>e.y!==void 0).map(e=>`${e.x.toFixed(1)},${String(e.y)}`).join(` `);return(0,z.jsxs)(`div`,{"data-testid":`rtt-sparkline`,children:[(0,z.jsxs)(`svg`,{role:`img`,"aria-label":mL(e),width:lL,height:uL,viewBox:`0 0 ${String(lL)} ${String(uL)}`,children:[(0,z.jsx)(`polyline`,{points:o,fill:`none`,stroke:`currentColor`,strokeWidth:1.5}),a.map(e=>e.y===void 0?null:(0,z.jsx)(`circle`,{cx:e.x,cy:e.y,r:fL,fill:`currentColor`},e.x)),a.filter(e=>e.y===void 0).map(e=>(0,z.jsx)(`line`,{x1:e.x,x2:e.x,y1:21,y2:29,stroke:`var(--mantine-color-red-6)`,strokeWidth:2},e.x))]}),(0,z.jsx)(U,{size:`xs`,c:`dimmed`,children:mL(e)})]})}function gL({state:e,statusSince:t,now:n,policy:r}){let i=t===void 0?void 0:t+r.delayMs(e.attempt),a=i===void 0?0:i-n;return(0,z.jsxs)(U,{size:`sm`,c:`orange`,"data-testid":`reconnect-status`,children:[a>0?`Retrying in ${ZI(a)}`:`Retrying now`,` `,`(attempt `,e.attempt,` of `,r.maxAttempts,`). Last failure:`,` `,e.reason]})}function _L({state:e,statusSince:t,now:n,policy:r,health:i}){return e.status===`reconnecting`?(0,z.jsx)(gL,{state:e,statusSince:t,now:n,policy:r}):e.status===`connected`?(0,z.jsxs)(pl,{align:`flex-end`,gap:`md`,mb:`sm`,children:[(0,z.jsx)(hL,{samples:i.samples}),i.unresponsive&&(0,z.jsx)(U,{size:`xs`,c:`dimmed`,children:`This node does not answer pings, so round trips are not measured automatically.`})]}):null}function vL(e){e?.focus()}function yL({deviceHex:e}){let t=BI(),n=t.labelOf(e),[r,i]=(0,k.useState)(void 0);return r===void 0?(0,z.jsxs)(pl,{gap:`xs`,wrap:`nowrap`,children:[(0,z.jsxs)(`div`,{children:[n.source===`self`&&(0,z.jsx)(U,{size:`xs`,c:`dimmed`,children:`calls itself`}),(0,z.jsx)(U,{size:`sm`,fw:n.source===`petname`?`bold`:`normal`,fs:n.source===`self`?`italic`:`normal`,ff:n.source===`id`?`monospace`:`text`,children:n.primary}),n.matchesPetname&&(0,z.jsx)(_d,{size:`xs`,color:`orange`,variant:`light`,children:`same as a name you set`}),n.secondary!==void 0&&(0,z.jsx)(U,{size:`xs`,c:`dimmed`,ff:n.source===`self`?`monospace`:`text`,children:n.secondary})]}),(0,z.jsx)(zd,{value:e,children:({copied:e,copy:t})=>(0,z.jsx)(Zp,{label:e?`Copied`:`Copy device id`,children:(0,z.jsx)(rl,{size:`sm`,variant:`subtle`,"aria-label":`Copy device id of ${n.primary}`,onClick:t,children:`⧉`})})}),(0,z.jsx)(rl,{size:`sm`,variant:`subtle`,"aria-label":`Rename ${n.primary}`,onClick:()=>{i(t.petnameOf(e)??``)},children:`✎`})]}):(0,z.jsx)(`form`,{onSubmit:n=>{n.preventDefault(),DN(t.rename(e,r).then(()=>{i(void 0)}))},children:(0,z.jsxs)(pl,{gap:`xs`,wrap:`nowrap`,children:[(0,z.jsx)(Am,{size:`xs`,"aria-label":`Petname for ${n.primary}`,value:r,ref:vL,onChange:e=>{i(e.currentTarget.value)}}),(0,z.jsx)(rl,{type:`submit`,size:`sm`,"aria-label":`Save petname`,children:`✓`}),(0,z.jsx)(rl,{size:`sm`,variant:`subtle`,"aria-label":`Cancel rename`,onClick:()=>{i(void 0)},children:`×`})]})})}var bL=`q7ltm10`,xL=`q7ltm11`;function SL({columns:e,rows:t}){return(0,z.jsxs)(km,{striped:!0,className:xL,children:[(0,z.jsx)(km.Thead,{role:`rowgroup`,children:(0,z.jsx)(km.Tr,{role:`row`,children:e.map(e=>(0,z.jsx)(km.Th,{role:`columnheader`,children:e.headerless===!0?null:e.label},e.label))})}),(0,z.jsx)(km.Tbody,{role:`rowgroup`,children:t.map(t=>(0,z.jsx)(km.Tr,{role:`row`,children:e.map((e,n)=>(0,z.jsx)(km.Td,{role:`cell`,"data-label":e.label,children:t.cells[n]},e.label))},t.key))})]})}var CL=16,wL=1e3;function TL(e){let t=``;for(let n of e)t+=n.toString(CL).padStart(2,`0`);return t}function EL(e){if(e.state.status!==`connected`)return``;switch(e.state.handshake.status){case`pending`:return` · handshake pending`;case`negotiated`:return` · v${String(e.state.handshake.version)} · ${e.state.handshake.sharedDomains.join(`, `)}`;case`unanswered`:return` · handshake unanswered (relay-only node?)`;case`rejected`:return` · handshake rejected (${e.state.handshake.reason})`}return``}function DL(e){let{state:t}=e;switch(t.status){case`connecting`:return`connecting…`;case`connected`:return`connected${EL(e)}`;case`reconnecting`:return`reconnecting (attempt ${String(t.attempt)}, ${t.reason})…`;case`closed`:return`closed (${t.reason})`;case`idle`:return`idle`}return``}var OL=1e3,kL=[{label:`device`},{label:`addresses`},{label:`advertised`},{label:`actions`,headerless:!0}];function AL({address:e,session:t,clock:n,reconnectPolicy:r,certificateChanges:i,onClose:a,onMessagePeer:o,pageHost:s=window.location.hostname,permissions:c=LI()}){let{event:l,activity:u,statusSince:d}=TI(t,n),f=l?.state.status===`reconnecting`||l?.state.status===`closed`,[p,m]=(0,k.useState)(void 0);(0,k.useEffect)(()=>{let t={value:!0};return f&&DN(RI(e,s,c).then(n=>{t.value&&m({address:e,message:n})})),()=>{t.value=!1}},[f,e,s,c]);let h=f&&p?.address===e?p.message:void 0,{observeDirectory:g,selfName:_}=BI(),v=l?.state.status===`connected`;(0,k.useEffect)(()=>{l!==void 0&&g(l.directory)},[l,g]);let y=(0,k.useRef)(!1),[b,x]=(0,k.useState)(void 0);(0,k.useEffect)(()=>{v&&(_!==void 0||y.current)&&(y.current=_!==void 0,t.sendGossipUpdate(_===void 0?void 0:oN(_)).then(()=>{x(void 0)},e=>{x(e instanceof Error?e.message:String(e))}))},[v,_,t]);let S=l===void 0?`idle`:DL(l),C=l?.directory??[],w=l?.frameLog??[],T=HI(t,v),E=UI(n,l?.state.status===`reconnecting`||C.length>0,OL),D=$I(aL(e))?.node,O=(0,k.useMemo)(()=>[...u,...wI(i.filter(e=>e.node===D))].sort((e,t)=>e.at-t.at),[u,i,D]);return(0,z.jsxs)(Nd,{withBorder:!0,padding:`md`,radius:`md`,children:[(0,z.jsxs)(pl,{justify:`space-between`,mb:`xs`,children:[(0,z.jsx)(U,{fw:600,children:e}),(0,z.jsxs)(pl,{children:[(0,z.jsx)(Ed,{size:`xs`,disabled:!v,onClick:T.probe,children:`Send ping`}),(0,z.jsx)(Ed,{size:`xs`,color:`red`,variant:`light`,onClick:a,children:`Disconnect`})]})]}),(0,z.jsx)(U,{fw:600,size:`sm`,mb:`sm`,children:S}),h===void 0?null:(0,z.jsx)(eu,{color:`yellow`,mb:`sm`,children:h}),b!==void 0&&(0,z.jsx)(eu,{color:`red`,title:`Could not publish your display name`,mb:`sm`,children:b}),l!==void 0&&(0,z.jsx)(_L,{state:l.state,statusSince:d,now:E,policy:r,health:T}),(0,z.jsx)(U,{fw:600,size:`sm`,children:`Peer directory`}),C.length===0?(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`No gossip received yet.`}):(0,z.jsx)(SL,{columns:kL,rows:C.map(e=>({key:TL(e.device),cells:[(0,z.jsx)(yL,{deviceHex:TL(e.device)},`device`),e.advert.addresses.join(`, `),(0,z.jsx)(Zp,{label:`As the peer advertised it, by its own clock`,children:(0,z.jsx)(`span`,{children:YI(E-e.advert[`snapshot-seconds`]*wL)})},`advertised`),(0,z.jsx)(Ed,{size:`xs`,onClick:()=>{o(e.device)},children:`Message`},`actions`)]}))}),(0,z.jsx)(cL,{activity:O,frameLog:w})]})}var jL=[{label:`device`},{label:`addresses`},{label:`gossiped by`},{label:`actions`,headerless:!0}];function ML({peers:e,onConnect:t,onDismiss:n}){return e.length===0?null:(0,z.jsxs)(Nd,{withBorder:!0,padding:`md`,radius:`md`,"data-testid":`discovered-peers`,children:[(0,z.jsx)(U,{fw:600,size:`sm`,mb:`xs`,children:`Discovered peers`}),(0,z.jsx)(U,{size:`sm`,c:`dimmed`,mb:`xs`,children:`Each node below was listed in the directory of a node you are connected to, which is the only thing vouching for it: the address it lists may not be a wire-mesh node at all. Nothing is dialled until you connect.`}),(0,z.jsx)(SL,{columns:jL,rows:e.map(e=>({key:e.key,cells:[(0,z.jsx)(yL,{deviceHex:TL(e.device)},`device`),e.addresses.join(`, `),(0,z.jsxs)(k.Fragment,{children:[e.via.claimedDevice!==void 0&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(U,{size:`xs`,c:`dimmed`,children:`claimed to be`}),(0,z.jsx)(yL,{deviceHex:e.via.claimedDevice})]}),(0,z.jsxs)(U,{size:`xs`,c:`dimmed`,children:[`over `,e.via.address]})]},`via`),(0,z.jsxs)(pl,{gap:`xs`,children:[(0,z.jsx)(Ed,{size:`xs`,onClick:()=>{t(e.key)},children:`Connect`}),(0,z.jsx)(Ed,{size:`xs`,variant:`light`,color:`red`,onClick:()=>{n(e.key)},children:`Dismiss`})]},`actions`)]}))})]})}function NL({label:e,hashes:t}){return(0,z.jsxs)(`div`,{children:[(0,z.jsx)(U,{size:`sm`,fw:600,children:e}),t.map(e=>(0,z.jsx)(Ld,{block:!0,children:nL(e)},e))]})}function PL({prompt:e}){let{assessment:t,decide:n}=e,r=t.kind===`changed`;return(0,z.jsx)(eu,{color:r?`red`:`blue`,title:r?`Certificate changed for ${t.node}`:`First connection to ${t.node}`,"data-testid":`certificate-prompt`,children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{size:`sm`,children:r?`This address presents a certificate that shares nothing with the one remembered for this node. The node may have replaced its certificate, or something else may be answering at this address. Only continue if you expected the change.`:`This console has not connected to this node before. Connecting pins the certificate below as the one to expect from it from now on. Compare it with what the node's operator reports before you trust it.`}),r&&(0,z.jsx)(NL,{label:`Remembered`,hashes:t.remembered}),(0,z.jsx)(NL,{label:r?`Presented now`:`Certificate (SHA-256)`,hashes:t.presented}),(0,z.jsxs)(pl,{children:[(0,z.jsx)(Ed,{size:`xs`,color:r?`red`:`blue`,onClick:()=>{n(!0)},children:r?`Trust the new certificate`:`Trust and connect`}),(0,z.jsx)(Ed,{size:`xs`,variant:`light`,onClick:()=>{n(!1)},children:`Cancel`})]})]})})}function FL({prompts:e,changes:t,onDismissChange:n}){let r=t.filter(e=>!e.dismissed);return e.length===0&&r.length===0?null:(0,z.jsxs)(rm,{gap:`sm`,"data-testid":`certificate-trust`,children:[e.map(e=>(0,z.jsx)(PL,{prompt:e},e.key)),r.map(e=>(0,z.jsx)(eu,{color:`red`,title:`${e.node} announced different certificates`,withCloseButton:!0,closeButtonLabel:`Dismiss`,onClose:()=>{n(e.key)},children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{size:`sm`,children:`The node is still reachable through the certificate you pinned, but it now announces certificates that share nothing with the ones remembered for it, and the announced set is what this console will pin from now on.`}),(0,z.jsx)(NL,{label:`Remembered`,hashes:e.remembered}),(0,z.jsx)(NL,{label:`Announced`,hashes:e.presented})]})},e.key))]})}function IL(e,t){let[n,r]=(0,k.useState)([]),[i,a]=(0,k.useState)([]),o=(0,k.useMemo)(()=>eL(e,e=>{a(n=>[...n,{...e,key:crypto.randomUUID(),at:t.now(),dismissed:!1}])}),[e,t]),s=(0,k.useRef)(new Map),c=(0,k.useRef)(new Map);(0,k.useEffect)(()=>{let e=c.current;return()=>{for(let{refuse:t}of[...e.values()])t()}},[]);let l=(0,k.useCallback)(async e=>{let t=`${e.node} ${[...e.presented].sort().join(`,`)}`,n=s.current.get(t);if(n!==void 0)return n.decision;let i=crypto.randomUUID(),a=new Promise(n=>{let a=!1,o=e=>{a||(a=!0,c.current.get(t)?.promptKey===i&&c.current.delete(t),s.current.get(t)?.promptKey===i&&s.current.delete(t),r(e=>e.filter(e=>e.key!==i)),n(e))};c.current.set(t,{promptKey:i,refuse:()=>{o(!1)}}),r(t=>[...t,{key:i,assessment:e,decide:o}])});return s.current.set(t,{promptKey:i,decision:a}),a},[]);return{prompts:n,changes:i,memory:o,confirmAddress:(0,k.useCallback)(async t=>{let n=$I(t);if(n===void 0)return t;let r=QI(n.node,n.sha256.map(e=>kO(e)),(await e.recall(n.node)).map(e=>kO(e)));if(r.kind===`known`)return zk(t,n.sha256.filter(e=>r.trusted.includes(kO(e))));if(await l(r))return await e.remember(n.node,n.sha256),t},[e,l]),dismissChange:(0,k.useCallback)(e=>{a(t=>t.map(t=>t.key===e?{...t,dismissed:!0}:t))},[])}}function LL({store:e,children:t}){let[n,r]=(0,k.useState)(new Map),[i,a]=(0,k.useState)(new Map),[o,s]=(0,k.useState)(void 0),[c,l]=(0,k.useState)(void 0),u=(0,k.useRef)(Promise.resolve()),d=(0,k.useCallback)(async e=>{u.current=u.current.then(async()=>{try{await e(),l(void 0)}catch(e){l(e instanceof Error?e.message:String(e))}}),await u.current},[]);(0,k.useEffect)(()=>{Promise.all([e.petnames(),e.selfName()]).then(([e,t])=>{r(e),s(t)},e=>{l(e instanceof Error?e.message:String(e))})},[e]);let f=(0,k.useCallback)(async(t,n)=>d(async()=>{await e.setPetname(t,n),r(await e.petnames())}),[e,d]),p=(0,k.useCallback)(async t=>d(async()=>{await e.setSelfName(t),s(await e.selfName())}),[e,d]),m=(0,k.useCallback)(e=>{a(t=>{let n;for(let r of e){let e=aN(r.advert),i=AO(r.device);t.get(i)!==e&&(n??=new Map(t),e===void 0?n.delete(i):n.set(i,e))}return n??t})},[]),h=(0,k.useMemo)(()=>new Set(n.values()),[n]),g=(0,k.useMemo)(()=>({labelOf:e=>sN(e,n.get(e),i.get(e),h),petnameOf:e=>n.get(e),rename:f,selfName:o,setSelfName:p,observeDirectory:m}),[n,h,i,o,f,p,m]);return(0,z.jsxs)(zI.Provider,{value:g,children:[c!==void 0&&(0,z.jsx)(eu,{color:`red`,title:`Saved names are unavailable`,mb:`md`,children:c}),t]})}function RL(){let{selfName:e,setSelfName:t}=BI(),[n,r]=(0,k.useState)(void 0),i=n??e??``;return(0,z.jsx)(`form`,{onSubmit:e=>{e.preventDefault(),DN(t(i).then(()=>{r(void 0)}))},children:(0,z.jsxs)(pl,{align:`flex-end`,wrap:`wrap`,children:[(0,z.jsx)(Am,{label:`Your display name`,description:`Shown to the peers you connect to, signed by this device's key. Leave empty to show only your short id.`,value:i,maxLength:64,onChange:e=>{r(e.currentTarget.value)},style:{flex:1,minWidth:`16rem`}}),(0,z.jsx)(Ed,{type:`submit`,variant:`light`,disabled:(iN(i)??``)===(e??``),children:`Save name`})]})})}function zL({onDismiss:e}){return(0,z.jsxs)(Nd,{withBorder:!0,padding:`md`,radius:`md`,"data-testid":`onboarding-intro`,children:[(0,z.jsx)(Lm,{order:2,size:`h4`,mb:`xs`,children:`Welcome to the wire-mesh console`}),(0,z.jsxs)(vf,{type:`ordered`,spacing:`xs`,size:`sm`,children:[(0,z.jsxs)(vf.Item,{children:[(0,z.jsx)(U,{span:!0,fw:600,children:`Connect.`}),` `,`Enter a node's address in the Node field and press Connect. A console served by a node starts with that node's address filled in, so there is usually nothing to type. The status line shows the connection coming up.`]}),(0,z.jsxs)(vf.Item,{children:[(0,z.jsx)(U,{span:!0,fw:600,children:`See who is here.`}),` `,`Once connected, the node's peer directory lists the devices it knows. Message opens a conversation with one. Devices appear under the name they chose for themselves, or a short id; use the pencil beside a device to give it a name of your own, which only this console keeps.`]}),(0,z.jsxs)(vf.Item,{children:[(0,z.jsx)(U,{span:!0,fw:600,children:`Discovered peers wait for you.`}),` `,`A node you are connected to can tell you about other nodes. Nothing vouches for those addresses except the node that listed them, and one may not be a wire-mesh node at all, so the console never dials one by itself. Each waits in the Discovered peers list until you press Connect or dismiss it.`]}),(0,z.jsxs)(vf.Item,{children:[(0,z.jsx)(U,{span:!0,fw:600,children:`Offline.`}),` `,`The console itself loads without a network, and conversations are kept on this device, so history stays readable. Sending needs a route to the peer, through a node or directly; a message that could not be sent stays with its reason until you retry or dismiss it.`]})]}),(0,z.jsx)(Ed,{mt:`md`,size:`xs`,onClick:e,children:`Got it`})]})}function BL(e,t){return e.sentAt===t.sentAt?kO(e.messageId).localeCompare(kO(t.messageId)):e.sentAt-t.sentAt}function VL(e,t){let n=new Set(e.map(e=>kO(e.messageId))),r=t.filter(e=>!n.has(kO(e.messageId)));return r.length===0?e:[...e,...r].sort(BL)}function HL(e,t,n){let r=e.get(t);return r===void 0?e:new Map(e).set(t,n(r))}function UL(e,t){return{roomPath:e,participants:t,direct:void 0,relay:void 0,via:void 0,token:void 0,status:`closed`,messages:[],notices:[],outgoing:[],pendingJoinRequest:void 0,unread:0}}function WL(e,t,n){let r=t===void 0?n===void 0?void 0:`hub`:`direct`;return{...e,direct:t,relay:n,via:r,status:r===void 0?`closed`:`connected`}}function GL(e,t){switch(t.type){case`direct-opened`:{let n=e.get(t.roomPath)??UL(t.roomPath,t.participants);return new Map(e).set(t.roomPath,{...WL(n,t.session,n.relay),participants:t.participants,notices:[]})}case`relay-opened`:{let n=e.get(t.roomPath)??UL(t.roomPath,t.participants);return new Map(e).set(t.roomPath,WL(n,n.direct,t.route))}case`direct-closed`:return HL(e,t.roomPath,e=>WL(e,void 0,e.relay));case`hub-closed`:{let n=e;for(let r of e.values())r.relay?.hub===t.hub&&(n=HL(n,r.roomPath,e=>WL(e,e.direct,void 0)));return n}case`restored`:return e.get(t.roomPath)===void 0?new Map(e).set(t.roomPath,{...UL(t.roomPath,t.participants),messages:VL([],t.messages)}):HL(e,t.roomPath,e=>({...e,messages:VL(e.messages,t.messages)}));case`notices`:return HL(e,t.roomPath,e=>({...e,notices:t.notices}));case`message`:return HL(e,t.roomPath,e=>{let n=VL(e.messages,[t.message]),r=n!==e.messages;return{...e,messages:n,unread:r&&t.message.direction===`received`?e.unread+1:e.unread}});case`read`:return HL(e,t.roomPath,e=>e.unread===0?e:{...e,unread:0});case`outgoing`:return HL(e,t.roomPath,e=>({...e,outgoing:e.outgoing.some(e=>e.localId===t.entry.localId)?e.outgoing.map(e=>e.localId===t.entry.localId?t.entry:e):[...e.outgoing,t.entry]}));case`outgoing-removed`:return HL(e,t.roomPath,e=>({...e,outgoing:e.outgoing.filter(e=>e.localId!==t.localId)}));case`join-request`:return HL(e,t.roomPath,e=>({...e,pendingJoinRequest:t.request}));case`join-request-settled`:return HL(e,t.roomPath,e=>({...e,pendingJoinRequest:void 0}));case`token`:return HL(e,t.roomPath,e=>({...e,token:t.token}))}return e}function KL(e,t){let n=SF(e);return n.kind===`dm`?n.participants.filter(e=>e!==t):n.owner===t?[]:[n.owner]}function qL(e,t){return e.participants.length===0?e.roomPath:e.participants.map(e=>cN(t.labelOf(e))).join(`, `)}function JL(e){return e.toLowerCase().split(/\s+/).filter(e=>e!==``)}function YL(e,t){let n=e.toLowerCase();return t.every(e=>n.includes(e))}function XL(e,t){let n=JL(t);if(n.length===0)return[];let r=new TextDecoder,i=[];for(let t of e)t.messages.forEach((e,r)=>{YL(e.text,n)&&i.push({key:`${t.roomPath}/message/${String(r)}`,roomPath:t.roomPath,kind:`message`,text:e.text,at:e.sentAt,direction:e.direction})}),t.notices.forEach((e,a)=>{if(e.plaintext===void 0||e.claims===void 0)return;let o=r.decode(e.plaintext);YL(o,n)&&i.push({key:`${t.roomPath}/notice/${String(a)}`,roomPath:t.roomPath,kind:`notice`,text:o,at:e.claims[`posted-at`],direction:void 0})});return i.sort((e,t)=>t.at-e.at).slice(0,50)}function ZL({conversations:e,onSelect:t}){let n=BI(),[r,i]=(0,k.useState)(``);if(e.length===0)return null;let a=XL(e,r),o=JL(r).length>0,s=new Map(e.map(e=>[e.roomPath,e]));return(0,z.jsxs)(rm,{gap:`xs`,"data-testid":`search-panel`,children:[(0,z.jsx)(Am,{type:`search`,label:`Search conversations and notices`,value:r,onChange:e=>{i(e.currentTarget.value)}}),o&&a.length===0&&(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`Nothing matches.`}),a.map(e=>{let i=s.get(e.roomPath);return(0,z.jsx)(Sf,{label:(0,z.jsx)(nf,{highlight:JL(r),size:`sm`,children:e.text}),description:(0,z.jsxs)(pl,{gap:`xs`,children:[(0,z.jsx)(_d,{size:`xs`,variant:`light`,children:e.kind}),(0,z.jsxs)(U,{size:`xs`,c:`dimmed`,children:[i===void 0?e.roomPath:qL(i,n),` · `,new Date(e.at).toLocaleString()]})]}),onClick:()=>{t(e.roomPath)}},e.key)})]})}var QL=16;function $L(){let e=new Uint8Array(QL);return crypto.getRandomValues(e),e}function eR(e,t){return{verb:e,params:{verb:`capability.request`,capability:e,...t===void 0?{}:{"valid-until":t}}}}var tR=class extends Error{capability;code;constructor(e,t){super(`capability request for "${e}" was refused (${t})`),this.name=`CapabilityRequestRefusedError`,this.capability=e,this.code=t}};async function nR(e,t,n,r,i,a,o){let s=await e.sendManageRequest(eR(t,a),n,r,o,i);if(s.result!==`ok`)throw new tR(t,s.code);let c=fD.safeParse(s);if(!c.success)throw Error(`capability request for "${t}" response was malformed`);return c.data}var rR=`manage:request`;async function iR(e,t){if(e.token===void 0)return{ok:!1,code:`token_required`};if(t.revocation===void 0)throw Error(`requireRequestToken needs a revocation view on the handler options`);let n=await SM(e.token,{identity:t.identity,clock:t.clock,revocation:t.revocation,expectedBearer:t.bearerDevice,...t.extraPredicateResolvers===void 0?{}:{extraPredicateResolvers:t.extraPredicateResolvers}});if(!n.ok)return{ok:!1,code:n.reason};if(n.claims.capability!==`manage:request`)return{ok:!1,code:`capability_mismatch`};let r=n.claims[`requests-capability`];return r!==void 0&&r!==t.capability?{ok:!1,code:`capability_mismatch`}:sA(n.claims.scope,e.scope)?{ok:!0}:{ok:!1,code:`scope_mismatch`}}function aR(e){return async function(t){let n=dD.safeParse(t.command.params);if(!n.success||n.data.capability!==e.capability){await t.respond({result:`error`,code:`malformed`});return}let r=n.data;if(e.requireRequestToken===!0){let n=await iR(t,e);if(!n.ok){await t.respond({result:`error`,code:n.code});return}}let i=r[`valid-until`];if(i!==void 0&&i<=e.clock.now()){await t.respond({result:`error`,code:`expired`});return}let a=!1,o=setTimeout(()=>{a||(a=!0,t.respond({result:`error`,code:`timeout`,message:`no decision within the capability-request timeout`}).catch(()=>void 0))},e.timeoutMs);xN(o),e.onRequest({scope:t.scope,requesterDevice:e.bearerDevice,async decide(n){if(a)return;if(a=!0,clearTimeout(o),n.kind===`reject`){await t.respond({result:`error`,code:`denied`,...n.reason===void 0?{}:{message:n.reason}});return}let r=await AM({identity:e.identity,clock:e.clock,tokenId:$L(),bearer:e.bearerDevice,capability:n.capability,scope:t.scope,expires:n.expires,...n.delegationsRemaining===void 0?{}:{delegationsRemaining:n.delegationsRemaining}});if(!r.ok){await t.respond({result:`error`,code:`mint_failed`});return}let i=r.token;await t.respond({result:`ok`,"granted-token":i,...n.extensions??{}})}})}}var oR=16,sR=36e5,cR=[{verb:`room:member`,scopeKind:`room`},{verb:`room:join`,scopeKind:`room`},{verb:`room:invite`,scopeKind:`room`},{verb:`webrtc:signal`,scopeKind:`node`},{verb:`relay:use`,scopeKind:`node`},{verb:`pin:write`,scopeKind:`folder`},{verb:`exec:pty`,scopeKind:`folder`},{verb:`exec:proc`,scopeKind:`folder`},{verb:`group:member`,scopeKind:`group`},{verb:hM,scopeKind:`folder`},{verb:rR,scopeKind:`room`}],lR={[hM]:`grantsCapability`,[rR]:`requestsCapability`},uR={invalid_capability:`its capability is not a valid capability verb`,already_expired:`the grant would already have expired`,parent_malformed:`the grant it delegates from is malformed`,parent_bearer_mismatch:`the grant it delegates from is not held by this device`,expires_exceeds_parent:`it would outlast the grant it delegates from`,scope_does_not_narrow:`its scope is wider than the grant it delegates from`,capability_mismatch:`its capability differs from the grant it delegates from`,delegation_exceeds_parent:`it permits more delegation than its parent does`,links_exclusive:`it would carry both a parent grant and an authorising grant`,authorisation_malformed:`the grant authorising it is malformed`,authorisation_parent_forbidden:`a grant permission cannot be delegated from a parent grant`,authorisation_bearer_mismatch:`the grant authorising it is not held by this device`,authorisation_capability_mismatch:`the grant authorising it names a different capability`,authorisation_scope_does_not_narrow:`its scope is wider than the grant authorising it`,authorisation_exceeds_authoriser:`it would outlast the grant authorising it`,authorisation_delegation_exceeds:`it permits more delegation than the grant authorising it does`,authorisation_conditions_not_satisfied:`the grant authorising it does not allow this mint`};function dR(e,t){let n=(t??``).trim();if(n===``)return{ok:!0};let r=lR[e];if(r===void 0)return{ok:!1,error:`only ${hM} and ${rR} name a verb they cover`};let i=YD.safeParse(n);return i.success?{ok:!0,claim:r,verb:i.data}:{ok:!1,error:`the covered verb must look like subsystem:action, for example room:member`}}function fR(){let e=new Uint8Array(oR);return crypto.getRandomValues(e),e}async function pR(e,t){let n;try{n=MO(e.bearerHex.trim().toLowerCase())}catch{return{ok:!1,error:`the bearer must be a 64-character hex device-id`}}let r=YD.safeParse(e.capability.trim());if(!r.success)return{ok:!1,error:`the capability must look like subsystem:action, for example room:member`};if(e.scopeKind.trim()===``)return{ok:!1,error:`the scope needs a kind, for example room`};if(!Number.isFinite(e.lifetimeHours)||e.lifetimeHours<=0)return{ok:!1,error:`the lifetime must be more than zero hours`};if(e.delegationsRemaining!==void 0&&!(Number.isSafeInteger(e.delegationsRemaining)&&e.delegationsRemaining>=0))return{ok:!1,error:`further delegations must be a whole number, zero or more`};let i=dR(r.data,e.targetVerb);if(!i.ok)return i;let a=e.selfGrantBars??[];if(a.length>0&&r.data!==`manage:grant`)return{ok:!1,error:`only a ${hM} can bar its holder from granting to itself`};let o=[];for(let e of a){let t=YD.safeParse(e.trim());if(!t.success)return{ok:!1,error:`the barred verb "${e}" must look like subsystem:action`};o.push(oM(t.data,n))}let s=e.scopePath.trim(),c=await AM({identity:t.identity,clock:t.clock,tokenId:fR(),bearer:n,capability:r.data,scope:{kind:e.scopeKind.trim(),...s===``?{}:{path:s}},expires:Math.round(t.clock.now()+e.lifetimeHours*sR),...e.delegationsRemaining===void 0?{}:{delegationsRemaining:e.delegationsRemaining},...e.parent===void 0?{}:{parent:e.parent},...e.authorisedBy===void 0?{}:{authorisedBy:e.authorisedBy},...i.claim===void 0||i.verb===void 0?{}:{[i.claim]:i.verb},...o.length===0?{}:{conditions:o}});return c.ok?{ok:!0,token:c.token}:{ok:!1,error:`refused: ${uR[c.reason]}`}}var mR=3e4;function hR(e){let{identity:t,clock:n,grants:r,revocations:i,announce:a}=e,[o,s]=(0,k.useState)([]),[c,l]=(0,k.useState)(void 0);(0,k.useEffect)(()=>{let e={cancelled:!1,latestLoad:0},a=async()=>{e.latestLoad+=1;let a=e.latestLoad,o=await r.list(),c=await Promise.all(o.map(async e=>({...e,status:await RM(e.token,{identity:t,clock:n,revocation:i.view,...e.direction===`held`?{expectedBearer:t.deviceId}:{}})})));!e.cancelled&&a===e.latestLoad&&(s(c),l(void 0))},o=()=>{a().catch(t=>{e.cancelled||l(t instanceof Error?t.message:String(t))})};o();let c=[r.subscribe(o),i.subscribe(o)],u=setInterval(o,mR);return()=>{e.cancelled=!0,clearInterval(u);for(let e of c)e()}},[t,n,r,i]);let u=(0,k.useCallback)(async e=>{let i=await pR(e,{identity:t,clock:n});return i.ok?(await r.record(`issued`,i.token,n.now()),{ok:!0,code:IM(i.token)}):i},[t,n,r]),d=(0,k.useCallback)(async e=>{let a;try{a=LM(e)}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}let o=await RM(a,{identity:t,clock:n,revocation:i.view,expectedBearer:t.deviceId});return o.kind===`invalid`?{ok:!1,error:`this device cannot hold that grant: ${BM(o)}`}:(await r.record(`held`,a,n.now()),{ok:!0})},[t,n,r,i]),f=(0,k.useCallback)(async e=>{try{let t=await i.revoke(e.claims[`token-id`]);return{ok:!0,announced:await a(t)}}catch(e){return{ok:!1,error:e instanceof Error?e.message:String(e)}}},[i,a]);return(0,k.useMemo)(()=>({rows:o,loadError:c,mint:u,importCode:d,revoke:f}),[o,c,u,d,f])}function gR({label:e,children:t}){return(0,z.jsxs)(U,{size:`sm`,children:[(0,z.jsxs)(U,{span:!0,fw:600,children:[e,`:`]}),` `,t]})}function _R({row:e}){let{claims:t}=e,n=IM(e.token);return(0,z.jsxs)(rm,{gap:4,"data-testid":`grant-details`,children:[(0,z.jsx)(gR,{label:`Token id`,children:(0,z.jsx)(Ld,{children:e.tokenId})}),(0,z.jsx)(gR,{label:`Issuer`,children:(0,z.jsx)(oL,{deviceHex:AO(t.issuer)})}),(0,z.jsx)(gR,{label:`Bearer`,children:(0,z.jsx)(oL,{deviceHex:AO(t.bearer)})}),(0,z.jsxs)(gR,{label:`Allows`,children:[t.capability,` over `,t.scope.kind,t.scope.path===void 0?``:` ${t.scope.path}`]}),(0,z.jsx)(gR,{label:`Expires`,children:new Date(t.expires).toISOString()}),t[`not-before`]!==void 0&&(0,z.jsx)(gR,{label:`Not before`,children:new Date(t[`not-before`]).toISOString()}),t[`delegations-remaining`]!==void 0&&(0,z.jsx)(gR,{label:`Further delegations`,children:t[`delegations-remaining`]}),t.parent!==void 0&&(0,z.jsx)(gR,{label:`Delegated from`,children:`another grant (its parent rides inside this one)`}),(0,z.jsx)(gR,{label:`Status`,children:BM(e.status)}),(0,z.jsx)(df,{readOnly:!0,label:`Grant code`,description:`Paste this into the other device's grant import to give it this grant.`,value:n,autosize:!0,minRows:2,maxRows:4}),(0,z.jsx)(zd,{value:n,children:({copied:e,copy:t})=>(0,z.jsx)(Ed,{size:`xs`,variant:`light`,onClick:t,w:`fit-content`,children:e?`Copied`:`Copy grant code`})})]})}function vR(e,t){return e>t?XI(e-t):YI(t-e)}function yR({title:e,rows:t,other:n,now:r,onRevoke:i}){let[a,o]=(0,k.useState)(void 0),[s,c]=(0,k.useState)(void 0);return(0,z.jsxs)(`div`,{"data-testid":`grants-${e.toLowerCase()}`,children:[(0,z.jsx)(U,{fw:600,size:`sm`,mt:`sm`,children:e}),t.length===0?(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`None.`}):(0,z.jsx)(SL,{columns:[{label:`capability`},{label:`over`},{label:n===`issuer`?`from`:`to`},{label:`expires`},{label:`status`},{label:`actions`,headerless:!0}],rows:t.map(e=>({key:`${e.direction}/${e.tokenId}`,cells:[e.claims.capability,`${e.claims.scope.kind}${e.claims.scope.path===void 0?``:` ${e.claims.scope.path}`}`,(0,z.jsx)(yL,{deviceHex:AO(e.claims[n])},`other`),vR(e.claims.expires,r),(0,z.jsx)(_d,{color:e.status.kind===`valid`?`green`:`red`,variant:`light`,children:BM(e.status)},`status`),(0,z.jsxs)(k.Fragment,{children:[(0,z.jsxs)(pl,{gap:`xs`,children:[(0,z.jsx)(Ed,{size:`xs`,variant:`light`,onClick:()=>{o(a===e.tokenId?void 0:e.tokenId)},children:a===e.tokenId?`Hide`:`Inspect`}),i!==void 0&&e.status.kind===`valid`&&(0,z.jsx)(Ed,{size:`xs`,color:`red`,variant:s===e.tokenId?`filled`:`light`,onClick:()=>{s===e.tokenId?(c(void 0),i(e)):c(e.tokenId)},children:s===e.tokenId?`Confirm: revoke for good`:`Revoke`})]}),a===e.tokenId&&(0,z.jsx)(_R,{row:e})]},`actions`)]}))})]})}function bR({onImport:e}){let[t,n]=(0,k.useState)(``),[r,i]=(0,k.useState)(void 0);return(0,z.jsx)(`form`,{onSubmit:r=>{r.preventDefault(),DN(e(t).then(e=>{i(e),e.ok&&n(``)}))},children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{fw:600,size:`sm`,mt:`md`,children:`Add a grant you were given`}),(0,z.jsx)(df,{label:`Grant code`,value:t,onChange:e=>{n(e.currentTarget.value)},autosize:!0,minRows:2,maxRows:4,required:!0}),(0,z.jsx)(Ed,{type:`submit`,size:`xs`,w:`fit-content`,children:`Add grant`}),r?.ok===!1&&(0,z.jsx)(eu,{color:`red`,title:`Not added`,children:r.error}),r?.ok===!0&&(0,z.jsx)(eu,{color:`green`,title:`Grant added`,children:`It is listed under Held.`})]})})}var xR=24,SR=`root`,CR=`none`;function wR(e){return e.split(`,`).map(e=>e.trim()).filter(e=>e!==``)}function TR({delegable:e,onMint:t}){let[n,r]=(0,k.useState)(``),[i,a]=(0,k.useState)(``),[o,s]=(0,k.useState)(``),[c,l]=(0,k.useState)(``),[u,d]=(0,k.useState)(xR),[f,p]=(0,k.useState)(``),[m,h]=(0,k.useState)(SR),[g,_]=(0,k.useState)(CR),[v,y]=(0,k.useState)(``),[b,x]=(0,k.useState)(``),[S,C]=(0,k.useState)(void 0),w=e.find(e=>e.tokenId===m),T=e.find(e=>e.tokenId===g),E=e.filter(e=>e.claims.capability===hM),D=i===`manage:grant`||i===`manage:request`;function O(){if(m!==SR&&w===void 0){C({ok:!1,error:`the grant you chose to delegate from is no longer valid; choose another, or choose Root grant to mint without one`});return}if(g!==CR&&T===void 0){C({ok:!1,error:`the grant you chose to authorise this is no longer valid; choose another, or choose None to mint without one`});return}t({bearerHex:n,capability:i,scopeKind:o,scopePath:c,lifetimeHours:u,delegationsRemaining:f===``?void 0:f,parent:w?.token,authorisedBy:T?.token,targetVerb:D?v:``,selfGrantBars:i===`manage:grant`?wR(b):[]}).then(C,e=>{C({ok:!1,error:e instanceof Error?e.message:String(e)})})}return(0,z.jsx)(`form`,{onSubmit:e=>{e.preventDefault(),O()},children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{fw:600,size:`sm`,mt:`md`,children:`Mint a grant`}),(0,z.jsx)(Am,{label:`Bearer device-id`,description:`The device the grant is for: 64 hex characters, copied from a peer's directory row.`,value:n,onChange:e=>{r(e.currentTarget.value)},required:!0}),(0,z.jsx)(md,{label:`Capability`,description:`What it allows, as subsystem:action.`,data:cR.map(e=>e.verb),value:i,onChange:e=>{a(e);let t=cR.find(t=>t.verb===e);t!==void 0&&s(t.scopeKind)},required:!0}),(0,z.jsx)(Am,{label:`Scope kind`,value:o,onChange:e=>{s(e.currentTarget.value)},required:!0}),(0,z.jsx)(Am,{label:`Scope path`,description:`Leave empty for a scope with no path.`,value:c,onChange:e=>{l(e.currentTarget.value)}}),D&&(0,z.jsx)(Am,{label:`Covered verb`,description:i===`manage:grant`?`The one verb the holder may grant, as subsystem:action. Empty means any verb within the scope.`:`The one verb the holder may request, as subsystem:action. Empty means any verb within the scope.`,value:v,onChange:e=>{y(e.currentTarget.value)}}),i===`manage:grant`&&(0,z.jsx)(Am,{label:`Barred from granting to itself`,description:`Comma-separated verbs the holder may not grant to its own device, for example manage:grant to stop it passing on the right to grant.`,value:b,onChange:e=>{x(e.currentTarget.value)}}),(0,z.jsx)(Lp,{label:`Lasts (hours)`,min:0,value:u,onChange:e=>{d(typeof e==`number`?e:0)}}),(0,z.jsx)(Lp,{label:`Further delegations`,description:`How many times the bearer may pass it on. Empty leaves it unset.`,min:0,allowDecimal:!1,value:f,onChange:e=>{p(typeof e==`number`?e:``)}}),(0,z.jsx)($p,{label:`Delegate from`,description:`A grant you hold, which the new grant may only narrow. Root means none.`,allowDeselect:!1,data:[{value:SR,label:`Root grant (none)`},...e.map(e=>({value:e.tokenId,label:`${e.claims.capability} from ${nN(AO(e.claims.issuer))}`}))],value:m,onChange:e=>{h(e??SR)}}),(0,z.jsx)($p,{label:`Authorised by`,description:`A manage:grant you hold that permits this mint; it may bar what you can grant. None means this grant is minted on your own authority.`,allowDeselect:!1,data:[{value:CR,label:`None`},...E.map(e=>({value:e.tokenId,label:`manage:grant from ${nN(AO(e.claims.issuer))}`}))],value:g,onChange:e=>{_(e??CR)}}),(0,z.jsx)(Ed,{type:`submit`,size:`xs`,w:`fit-content`,children:`Mint grant`}),S?.ok===!1&&(0,z.jsx)(eu,{color:`red`,title:`Not minted`,children:S.error}),S?.ok===!0&&(0,z.jsx)(eu,{color:`green`,title:`Grant minted`,children:`It is listed under Issued, where Inspect shows its grant code.`})]})})}var ER=1e3;function DR(e){if(!e.ok)return{color:`red`,title:`Not revoked`,text:e.error};let{attempted:t,reached:n}=e.announced;return t===0?{color:`yellow`,title:`Revoked here only`,text:`No connection was open, so no node was told. This console no longer honours the grant.`}:n<t?{color:`yellow`,title:`Revoked, but not every node was told`,text:`Sent to ${String(n)} of ${String(t)} connected nodes. This console no longer honours the grant.`}:{color:`green`,title:`Revoked`,text:`Sent to ${String(n)} connected ${n===1?`node`:`nodes`}. This console no longer honours the grant.`}}function OR({grants:e,clock:t}){let n=UI(t,!0,ER),[r,i]=(0,k.useState)(void 0),a=r===void 0?void 0:DR(r),o=e.rows.filter(e=>e.direction===`held`),s=e.rows.filter(e=>e.direction===`issued`);return(0,z.jsxs)(rm,{gap:`xs`,"data-testid":`grants-panel`,children:[(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`A grant is a signed statement that one device may do something over something until a time. Revoking one you issued is recorded here, where this console stops honouring it at once, and sent to the nodes you are connected to. A node only passes it on if it relays revocations, which the hub does not.`}),e.loadError!==void 0&&(0,z.jsx)(eu,{color:`red`,title:`Grants could not be read`,children:e.loadError}),(0,z.jsx)(yR,{title:`Held`,rows:o,other:`issuer`,now:n}),(0,z.jsx)(yR,{title:`Issued`,rows:s,other:`bearer`,now:n,onRevoke:t=>{e.revoke(t).then(i,e=>{i({ok:!1,error:e instanceof Error?e.message:String(e)})})}}),a!==void 0&&(0,z.jsx)(eu,{color:a.color,title:a.title,"data-testid":`revocation-report`,children:a.text}),(0,z.jsx)(TR,{delegable:o.filter(e=>e.status.kind===`valid`),onMint:e.mint}),(0,z.jsx)(bR,{onImport:e.importCode})]})}var kR=6e4;function AR(e,t){let n=URL.createObjectURL(new Blob([t],{type:`application/json`})),r=document.createElement(`a`);r.href=n,r.download=e,r.hidden=!0,document.body.append(r),r.click(),r.remove(),setTimeout(()=>{URL.revokeObjectURL(n)},kR)}var jR=`wire-mesh-console-identity.json`,MR=2;function NR(){location.reload()}function PR({identity:e,backup:t,save:n=AR,reload:r=NR}){let i=AO(e.deviceId),[a,o]=(0,k.useState)({kind:`idle`}),[s,c]=(0,k.useState)(!1);async function l(){try{n(jR,JSON.stringify(await t.export(),void 0,MR)),o({kind:`exported`})}catch(e){o({kind:`error`,message:e instanceof Error?e.message:String(e)})}}async function u(e){try{await t.restore(e),o({kind:`restored`})}catch(e){o({kind:`error`,message:e instanceof Error?e.message:String(e)})}}async function d(e){if(e!==null)try{o({kind:`confirm-restore`,backup:await eA(await e.text())})}catch(e){o({kind:`error`,message:e instanceof Error?e.message:String(e)})}}return(0,z.jsxs)(rm,{gap:`xs`,"data-testid":`identity-panel`,children:[(0,z.jsxs)(U,{size:`sm`,children:[`This device is `,(0,z.jsx)(Ld,{"data-testid":`own-device-id`,children:i}),` `,(0,z.jsx)(zd,{value:i,children:({copied:e,copy:t})=>(0,z.jsx)(Ed,{size:`compact-xs`,variant:`subtle`,onClick:t,children:e?`Copied`:`Copy device id`})})]}),(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`Its key is ES256 (P-256) and lives in this browser. If this browser's storage is cleared or the device is lost, the identity is gone, along with every grant made to it. A backup file lets you keep it.`}),a.kind===`confirm-export`&&(0,z.jsx)(eu,{color:`orange`,title:`This file holds your private key`,children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{size:`sm`,children:`Anyone who has it can act as this device. Save it somewhere private, and do not send it to anyone. The console does not show the key or keep a copy of the file.`}),(0,z.jsx)(od,{label:`I understand, and I want a backup file`,checked:s,onChange:e=>{c(e.currentTarget.checked)}}),(0,z.jsxs)(pl,{children:[(0,z.jsx)(Ed,{size:`xs`,color:`orange`,disabled:!s,onClick:()=>{DN(l())},children:`Save backup file`}),(0,z.jsx)(Ed,{size:`xs`,variant:`light`,onClick:()=>{o({kind:`idle`})},children:`Cancel`})]})]})}),a.kind===`exported`&&(0,z.jsxs)(eu,{color:`green`,title:`Backup file handed to your browser`,children:[(0,z.jsx)(U,{size:`sm`,children:`The browser was asked to save it, and may have asked where. Check that the file is there before you rely on it.`}),(0,z.jsx)(U,{size:`sm`,children:`Keep it private. Restoring it on another browser makes that browser this device.`})]}),a.kind===`confirm-restore`&&(0,z.jsx)(eu,{color:`red`,title:`Replace this device's identity?`,children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsxs)(U,{size:`sm`,children:[`This device is now `,(0,z.jsx)(Ld,{children:i}),`. The backup is`,` `,(0,z.jsx)(Ld,{children:a.backup.deviceId}),`. Restoring makes this browser the backup's device the next time the console loads, and this identity, with the grants made to it, is gone unless you have a backup of it.`]}),(0,z.jsxs)(pl,{children:[(0,z.jsx)(Ed,{size:`xs`,color:`red`,onClick:()=>{DN(u(a.backup))},children:`Replace this identity`}),(0,z.jsx)(Ed,{size:`xs`,variant:`light`,onClick:()=>{o({kind:`idle`})},children:`Cancel`})]})]})}),a.kind===`restored`&&(0,z.jsx)(eu,{color:`green`,title:`Identity restored`,children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{size:`sm`,children:`Reload the console to run as the restored identity.`}),(0,z.jsx)(Ed,{size:`xs`,w:`fit-content`,onClick:r,children:`Reload now`})]})}),a.kind===`error`&&(0,z.jsx)(eu,{color:`red`,title:`That did not work`,children:a.message}),(a.kind===`idle`||a.kind===`exported`||a.kind===`error`)&&(0,z.jsxs)(pl,{children:[(0,z.jsx)(Ed,{size:`xs`,variant:`light`,onClick:()=>{c(!1),o({kind:`confirm-export`})},children:`Back up this identity`}),(0,z.jsx)(Wd,{accept:`application/json,.json`,onChange:e=>{DN(d(e))},children:e=>(0,z.jsx)(Ed,{size:`xs`,variant:`light`,color:`red`,...e,children:`Restore from a backup file`})})]})]})}function FR({identity:e,clock:t,grants:n,revocations:r,identityBackup:i,announceRevocation:a}){let o=hR({identity:e,clock:t,grants:n,revocations:r,announce:a});return(0,z.jsxs)(Zl,{multiple:!0,variant:`contained`,"data-testid":`identity-section`,children:[(0,z.jsxs)(Zl.Item,{value:`identity`,children:[(0,z.jsx)(Zl.Control,{children:`Identity`}),(0,z.jsx)(Zl.Panel,{children:(0,z.jsx)(PR,{identity:e,backup:i})})]}),(0,z.jsxs)(Zl.Item,{value:`grants`,children:[(0,z.jsx)(Zl.Control,{children:`Grants`}),(0,z.jsx)(Zl.Panel,{children:(0,z.jsx)(OR,{grants:o,clock:t})})]})]})}function IR({revocations:e,onFailure:t}){let n=(0,k.useSyncExternalStore)(e.subscribe,e.unreadable);return n.length===0?null:(0,z.jsx)(eu,{color:`red`,title:`Some stored revocations could not be loaded`,"data-testid":`unreadable-revocations`,children:(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsx)(U,{size:`sm`,children:`A grant that one of these revoked may read as valid until it is dealt with. Discarding an entry deletes it from this console's storage.`}),n.map(n=>(0,z.jsxs)(pl,{justify:`space-between`,children:[(0,z.jsxs)(U,{size:`sm`,children:[n.key,`: `,n.reason]}),(0,z.jsx)(Ed,{size:`xs`,color:`red`,variant:`light`,onClick:()=>{e.discardUnreadable(n.key).catch(e=>{t(e instanceof Error?e.message:String(e))})},children:`Discard`})]},n.key))]})})}function LR(e){return e instanceof Error?e.message:String(e)}function RR(e){let[t,n]=(0,k.useState)(void 0),[r,i]=(0,k.useState)(void 0);(0,k.useEffect)(()=>{e.introDismissed().then(n,e=>{n(!1),i(LR(e))})},[e]);let a=(0,k.useCallback)(t=>{n(t),e.setIntroDismissed(t).then(()=>{i(void 0)},e=>{i(LR(e))})},[e]),o=(0,k.useCallback)(()=>{a(!0)},[a]),s=(0,k.useCallback)(()=>{a(!1)},[a]);return{visible:t===!1,ready:t!==void 0,error:r,dismiss:o,show:s}}function zR({conversations:e,selected:t,onSelect:n}){let r=BI();return e.length===0?null:(0,z.jsxs)(rm,{gap:0,"data-testid":`conversation-list`,children:[(0,z.jsx)(U,{fw:600,size:`sm`,mb:`xs`,children:`Conversations`}),e.map(e=>(0,z.jsx)(Sf,{active:e.roomPath===t,label:qL(e,r),description:e.status===`connected`?void 0:`offline`,rightSection:(0,z.jsxs)(pl,{gap:4,wrap:`nowrap`,children:[e.pendingJoinRequest!==void 0&&(0,z.jsx)(_d,{color:`blue`,size:`sm`,children:`request`}),e.unread>0&&(0,z.jsx)(_d,{size:`sm`,"aria-label":`${String(e.unread)} unread`,children:e.unread})]}),onClick:()=>{n(e.roomPath)}},e.roomPath))]})}function BR({placeholder:e,ariaLabel:t,submitLabel:n,onSubmit:r,onCancel:i,size:a,autoFocus:o}){let[s,c]=(0,k.useState)(``),[l,u]=(0,k.useState)(void 0);function d(){let e=s.trim();e!==``&&(u(void 0),Promise.resolve(r(e)).then(()=>{c(``)}).catch(e=>{u(e instanceof Error?e.message:String(e))}))}function f(e){e.key===`Enter`&&d(),e.key===`Escape`&&i?.()}return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(pl,{gap:`xs`,flex:1,children:[(0,z.jsx)(Am,{flex:1,...a===void 0?{}:{size:a},placeholder:e,"aria-label":t,autoComplete:`off`,autoFocus:o,value:s,onChange:e=>{c(e.currentTarget.value)},onKeyDown:f}),(0,z.jsx)(Ed,{...a===void 0?{}:{size:a},onClick:d,children:n})]}),l!==void 0&&(0,z.jsx)(U,{size:`sm`,c:`red`,children:l})]})}var VR=`You`,HR=256,UR=new Intl.DateTimeFormat(void 0,{hour:`2-digit`,minute:`2-digit`});function WR({sentAt:e}){return(0,z.jsx)(U,{component:`time`,size:`xs`,c:`dimmed`,dateTime:new Date(e).toISOString(),children:UR.format(e)})}function GR({messages:e,outgoing:t,peerLabel:n,onRetry:r,onDiscard:i}){let a=(0,k.useRef)(null);return(0,k.useEffect)(()=>{let e=a.current;e!==null&&(e.scrollTop=e.scrollHeight)},[e,t]),(0,z.jsx)(Gs,{h:HR,viewportRef:a,children:(0,z.jsxs)(rm,{gap:4,children:[e.map((t,r)=>{let i=t.direction===`sent`,a=r===0||e[r-1]?.direction!==t.direction;return(0,z.jsxs)(rm,{gap:0,align:i?`flex-end`:`flex-start`,mt:a?`xs`:0,children:[a&&(0,z.jsx)(U,{size:`xs`,fw:600,c:`dimmed`,children:i?VR:n}),(0,z.jsx)(U,{size:`sm`,children:t.text}),(0,z.jsx)(WR,{sentAt:t.sentAt})]},kO(t.messageId))}),t.map(e=>(0,z.jsxs)(rm,{gap:0,align:`flex-end`,mt:`xs`,children:[(0,z.jsx)(U,{size:`xs`,fw:600,c:`dimmed`,children:VR}),(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:e.text}),e.status===`failed`?(0,z.jsxs)(pl,{gap:`xs`,children:[(0,z.jsx)(U,{size:`xs`,c:`red`,children:`Not sent: ${e.error}`}),(0,z.jsx)(Ed,{size:`compact-xs`,variant:`light`,onClick:()=>{r(e.localId)},children:`Retry`}),(0,z.jsx)(Ed,{size:`compact-xs`,variant:`subtle`,color:`gray`,onClick:()=>{i(e.localId)},children:`Dismiss`})]}):(0,z.jsx)(U,{size:`xs`,c:`dimmed`,children:e.status===`awaiting-approval`?`Waiting for ${n} to allow messages`:`Sending`})]},e.localId))]})})}function KR(e){if(e.plaintext!==void 0)return new TextDecoder().decode(e.plaintext)}function qR({notices:e}){if(e.length===0)return null;let t=e.map((e,t)=>{let n=KR(e);return(0,z.jsx)(H,{children:n===void 0?(0,z.jsx)(U,{size:`sm`,c:`dimmed`,fs:`italic`,children:`encrypted notice -- no key held for its epoch`}):(0,z.jsx)(U,{size:`sm`,children:n})},t)});return(0,z.jsxs)(rm,{gap:4,children:[t,(0,z.jsxs)(_d,{variant:`light`,color:`gray`,size:`sm`,w:`fit-content`,children:[e.length,` notice`,e.length===1?``:`s`]})]})}var JR=864e5;function YR(e){return e===`direct`?`direct`:e===`hub`?`via hub`:`offline`}function XR({view:e,onSend:t,onPostNotice:n,onRetry:r,onDiscard:i}){let a=BI();return(0,z.jsxs)(rm,{gap:`xs`,children:[(0,z.jsxs)(pl,{justify:`space-between`,children:[(0,z.jsx)(U,{fw:600,"data-testid":`conversation-header`,children:qL(e,a)}),(0,z.jsx)(U,{size:`sm`,c:e.status===`connected`?`green`:`dimmed`,children:YR(e.via)})]}),e.pendingJoinRequest&&(0,z.jsx)(eu,{color:`blue`,title:`Message request`,children:(0,z.jsxs)(pl,{justify:`space-between`,children:[(0,z.jsxs)(U,{size:`sm`,children:[(0,z.jsx)(oL,{deviceHex:e.pendingJoinRequest.requesterHex}),` `,`wants to message you`]}),(0,z.jsxs)(pl,{children:[(0,z.jsx)(Ed,{size:`xs`,onClick:()=>{DN(e.pendingJoinRequest?.decide({kind:`accept`,capability:`room:member`,expires:Date.now()+JR})??Promise.resolve())},children:`Allow`}),(0,z.jsx)(Ed,{size:`xs`,color:`red`,variant:`light`,onClick:()=>{DN(e.pendingJoinRequest?.decide({kind:`reject`})??Promise.resolve())},children:`Deny`})]})]})}),(0,z.jsx)(GR,{messages:e.messages,outgoing:e.outgoing,peerLabel:qL(e,a),onRetry:r,onDiscard:i}),(0,z.jsx)(pl,{children:(0,z.jsx)(BR,{ariaLabel:`Message`,placeholder:`Message`,submitLabel:`Send`,onSubmit:t})}),(0,z.jsx)(Ud,{label:`Durable notices (encrypted, replicated)`,labelPosition:`center`}),(0,z.jsx)(qR,{notices:e.notices}),e.via===void 0?(0,z.jsx)(U,{size:`sm`,c:`dimmed`,children:`Durable notices can be posted while the conversation is connected.`}):(0,z.jsx)(pl,{children:(0,z.jsx)(BR,{ariaLabel:`Post a durable notice`,placeholder:`Post a durable notice`,submitLabel:`Post notice`,onSubmit:n})})]})}var ZR=`room:member`;async function QR(e,t){let n=await SM(e,{identity:t.identity,clock:t.clock,revocation:t.revocation,expectedBearer:t.expectedBearer});if(!n.ok)return n;if(n.claims.scope.kind!==`room`)return{ok:!1,reason:`wrong_scope_kind`};if(n.claims.scope.path!==t.roomPath)return{ok:!1,reason:`wrong_scope_path`};let r=SF(t.roomPath),i=AO(n.rootIssuer);if(r.kind===`owner-named`){if(i!==r.owner)return{ok:!1,reason:`wrong_chain_root`}}else if(t.dmRootPolicy===`either-participant`){if(i!==r.participants[0]&&i!==r.participants[1])return{ok:!1,reason:`wrong_chain_root`}}else if(i!==AO(t.identity.deviceId))return{ok:!1,reason:`wrong_chain_root`};return{ok:!0,claims:n.claims,rootIssuerKey:n.rootIssuerKey}}async function $R(e,t,n,r){let i=(await e.list()).filter(e=>{let t=e.claims;if(e.direction!==`held`||t.capability!==`manage:request`)return!1;let i=t[`requests-capability`];return i!==void 0&&i!==n?!1:sA(t.scope,r)}),a=async e=>{let[n,...r]=e;if(n!==void 0)return(await RM(n.token,t)).kind===`valid`?n.token:a(r)};return a(i)}function ez(e){if(e instanceof tR)switch(e.code){case`denied`:return`the other side denied the request`;case`token_required`:return`the other side only accepts requests that present a request permission, and this device holds none that covers this one`;case`capability_mismatch`:return`the request permission presented does not cover this capability`;case`scope_mismatch`:return`the request permission presented does not cover this conversation`;default:return`the request permission presented was refused (${e.code})`}}function tz(e){return async function(t){if(t.command.verb!==e.capability){await t.respond({result:`error`,code:`malformed`});return}let n=pD.safeParse(t.command.params);if(!n.success){await t.respond({result:`error`,code:`malformed`});return}let r=n.data[`granted-token`],i=await SM(r,{identity:e.identity,clock:e.clock,revocation:e.revocation,expectedBearer:e.identity.deviceId});if(!i.ok){await t.respond({result:`error`,code:i.reason});return}if(i.claims.capability!==e.capability){await t.respond({result:`error`,code:`capability_mismatch`});return}if(!sA(i.claims.scope,t.scope)){await t.respond({result:`error`,code:`scope_mismatch`});return}await t.respond({result:`ok`}),e.onGrant({capability:e.capability,grantedToken:r,scope:t.scope,granterDevice:e.granterDevice})}}var nz=16;function rz(){let e=new Uint8Array(nz);return crypto.getRandomValues(e),e}var iz=3e5;function az(e,t,n){return{verb:ZR,params:{verb:`room.send`,"message-id":t,"sent-at":n,text:e}}}async function oz(e,t,n,{token:r,targetDevice:i}){let a=az(n,rz(),Date.now());return e.sendManageRequest(a,{kind:`room`,path:t},i,r)}async function sz(e,t,{targetDevice:n,requestToken:r}={}){let i;try{i=await nR(e,ZR,{kind:`room`,path:t},n,void 0,void 0,r)}catch(e){let t=ez(e);throw t===void 0?e:Error(t)}let a=jD.safeParse(i);if(!a.success)throw Error(`room.join response for ${t} was malformed`);return{token:a.data[`granted-token`],members:a.data.members.map(e=>e.device)}}function cz(e,t,n){async function r(e,r){let i=e.scope.path;if(i===void 0||e.token===void 0){await e.respond({result:`error`,code:`unauthorized`});return}if(!(await QR(e.token,{identity:t.identity,clock:t.clock,revocation:t.revocation,expectedBearer:t.peerDevice,roomPath:i})).ok){await e.respond({result:`error`,code:`unauthorized`});return}await e.respond({result:`ok`});let a=r[`message-id`],o=r[`sent-at`],s=r.text;a instanceof Uint8Array&&typeof o==`number`&&typeof s==`string`&&n.onMessage?.({roomPath:i,text:s,messageId:a,sentAt:o})}function i(e){return async n=>{if(n.kind===`reject`){let t={kind:`reject`,...n.reason===void 0?{}:{reason:n.reason}};await e.decide(t);return}let r=[...t.currentMembers?.()??[],t.peerDevice].map(e=>({device:e})),i={kind:`accept`,capability:n.capability,expires:n.expires,...n.delegationsRemaining===void 0?{}:{delegationsRemaining:n.delegationsRemaining},extensions:{members:r}};await e.decide(i)}}let a=aR({capability:ZR,identity:t.identity,clock:t.clock,bearerDevice:t.peerDevice,timeoutMs:t.joinRequestTimeoutMs??iz,onRequest(e){let t=e.scope.path,r=n.onJoinRequest;if(t===void 0||r===void 0){e.decide({kind:`reject`,reason:`unsupported verb`}).catch(()=>void 0);return}r({roomPath:t,requesterDevice:e.requesterDevice,decide:i(e)})}});async function o(e){if(e.scope.path===void 0){await e.respond({result:`error`,code:`missing_scope_path`});return}if(n.onJoinRequest===void 0){await e.respond({result:`error`,code:`unsupported_verb`});return}await a({...e,respond:async t=>{if(t.result===`ok`){let e=nO.safeParse(t[`granted-token`]);e.success&&n.onGrantIssued?.(e.data)}await e.respond(t)}})}let s=tz({capability:ZR,identity:t.identity,clock:t.clock,revocation:t.revocation,granterDevice:t.peerDevice,onGrant(e){let t=e.scope.path,r=n.onRoomInvite;t!==void 0&&r!==void 0&&r({roomPath:t,granterDevice:e.granterDevice,token:e.grantedToken})}});async function c(e){if(e.scope.path===void 0){await e.respond({result:`error`,code:`missing_scope_path`});return}if(n.onRoomInvite===void 0){await e.respond({result:`error`,code:`unsupported_verb`});return}await s(e)}async function l(e){if(e.command.verb!==`room:member`)return;let t=e.command.params;typeof t==`object`&&`verb`in t&&(t.verb===`room.send`?await r(e,t):t.verb===`capability.request`?await o(e):t.verb===`capability.grant`?await c(e):t.verb===`room.rekey`&&n.onRekey!==void 0&&await n.onRekey(e))}DN(jN(e.incomingManageRequests,l,{onFault:t.onFault}))}var lz=`room-key/`,uz=`room-token/`,dz=`room-key-delivered/`,fz=String(2**53-1).length;function pz(e,t){return`${lz}${e}/${String(t).padStart(fz,`0`)}`}function mz(e){return{get:async(t,n)=>e.get(pz(t,n)),set:async(t,n,r)=>{await e.set(pz(t,n),new Uint8Array(r))},currentEpoch:async t=>{let n=(await e.keys(`${lz}${t}/`)).sort().at(-1);return n===void 0?void 0:Number(n.slice(n.lastIndexOf(`/`)+1))}}}function hz(e,t,n,r){return{get:async i=>{let a=uz+i,o=await e.get(a);if(o===void 0)return;let s=nO.safeParse(b_(o,x_));if(s.success&&(await SM(s.data,{identity:t,clock:n,revocation:r,expectedBearer:t.deviceId})).ok)return s.data;await e.delete(a)},set:async(t,n)=>{await e.set(uz+t,new Uint8Array(Mg(n,hg)))},rooms:async()=>(await e.keys(uz)).map(e=>e.slice(11))}}function gz(e){return{isDelivered:async t=>await e.get(dz+t)!==void 0,markDelivered:async t=>{await e.set(dz+t,new Uint8Array([1]))}}}var _z=32,vz=256,yz=12,bz=4,xz=8,Sz=new TextEncoder().encode(`wire-mesh/room-rekey/v1\0`);function Cz(){return crypto.getRandomValues(new Uint8Array(_z))}function wz(e){let t=new TextEncoder().encode(e.room),n=new Uint8Array(bz);new DataView(n.buffer).setUint32(0,t.length,!1);let r=new Uint8Array(xz);new DataView(r.buffer).setBigUint64(0,BigInt(e.keyEpoch),!1);let i=new Uint8Array(Sz.length+n.length+t.length+r.length),a=0;return i.set(Sz,a),a+=Sz.length,i.set(n,a),a+=n.length,i.set(t,a),a+=t.length,i.set(r,a),i}async function Tz(e,t){let n=await crypto.subtle.importKey(`raw`,Uint8Array.from(e),`HKDF`,!1,[`deriveKey`]);return crypto.subtle.deriveKey({name:`HKDF`,hash:`SHA-256`,salt:Uint8Array.from(new Uint8Array),info:Uint8Array.from(wz(t))},n,{name:`AES-GCM`,length:vz},!1,[`encrypt`,`decrypt`])}async function Ez(e,t){let n=crypto.getRandomValues(new Uint8Array(yz)),r=new Uint8Array(await crypto.subtle.encrypt({name:`AES-GCM`,iv:n},e,Uint8Array.from(t))),i=new Uint8Array(n.length+r.length);return i.set(n,0),i.set(r,n.length),i}async function Dz(e,t){if(t.length<yz)throw Error(`ciphertext shorter than the AES-GCM IV it must carry`);let n=t.slice(0,yz),r=t.slice(yz);return new Uint8Array(await crypto.subtle.decrypt({name:`AES-GCM`,iv:n},e,r))}async function Oz(e,t){return Ez(e,t)}async function kz(e,t){return Dz(e,t)}async function Az(e){return crypto.subtle.importKey(`raw`,Uint8Array.from(e),`AES-GCM`,!1,[`encrypt`,`decrypt`])}async function jz(e,t){return Ez(await Az(e),t)}async function Mz(e,t){return Dz(await Az(e),t)}var Nz=`+aes256gcm`;function Pz(e){return Iz(e)?e:`${e}${Nz}`}function Fz(e){return Iz(e)?e.slice(0,e.length-10):e}function Iz(e){return e.endsWith(Nz)}var Lz=`store_failed`;function Rz(e,t){return{verb:ZR,params:{verb:`room.rekey`,"key-epoch":e,"wrapped-key":t}}}async function zz(e,t,n,r,i,a){return e.sendManageRequest(Rz(n,r),{kind:`room`,path:t},i,a)}function Bz(e){return async function(t){if(t.command.verb!==`room:member`){await t.respond({result:`error`,code:`malformed`});return}let n=kD.safeParse(t.command.params);if(!n.success){await t.respond({result:`error`,code:`malformed`});return}if(t.scope.kind!==`room`||t.scope.path===void 0){await t.respond({result:`error`,code:`scope_mismatch`});return}let r=t.scope.path,i=await QR(e.ownRoomMemberToken,{identity:e.identity,clock:e.clock,revocation:e.revocation,expectedBearer:e.identity.deviceId,roomPath:r,dmRootPolicy:`either-participant`});if(!i.ok){await t.respond({result:`error`,code:i.reason});return}let a=e.identity.deriveSharedSecret;if(a===void 0){await t.respond({result:`error`,code:`ecdh_unsupported`});return}let o=n.data[`key-epoch`],s=Array.isArray(n.data[`wrapped-key`])?n.data[`wrapped-key`]:[n.data[`wrapped-key`]],c=o-s.length+1,l;try{let e=await a(i.rootIssuerKey);l=await Promise.all(s.map(async(t,n)=>kz(await Tz(e,{room:r,keyEpoch:c+n}),t)))}catch{await t.respond({result:`error`,code:`unwrap_failed`});return}try{await e.onRekey({room:r,keyEpoch:o,contentKeys:l})}catch(e){throw await t.respond({result:`error`,code:Lz}),e}await t.respond({result:`ok`})}}async function Vz(e,t){await e.reduce(async(e,n,r)=>{await e,await t(n,r)},Promise.resolve())}function Hz(e){return Uint8Array.from(e)}function Uz(e){return Hz(Mg(e,hg))}function Wz(e){return Uz({1:e.identityKey.alg,4:e.deviceId})}function Gz(e,t){return Mg([`Signature1`,e,new Uint8Array,t],hg)}function Kz(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1)if(e[n]!==t[n])return!1;return!0}async function qz(e,t){let[n,,r,i]=e;if(r===null)return{ok:!1,reason:`malformed`};let a;try{a=b_(r,x_)}catch{return{ok:!1,reason:`malformed`}}let o=ND.safeParse(a);if(!o.success)return{ok:!1,reason:`malformed`};let s=o.data;if(t.expectedRoom!==void 0&&s.room!==t.expectedRoom)return{ok:!1,reason:`wrong_room`};if(!await pk(t.identity,s[`poster-key`],Gz(n,r),i))return{ok:!1,reason:`bad_signature`};if(!Kz(await t.identity.deriveDeviceId(s[`poster-key`][`public-key`]),s.poster))return{ok:!1,reason:`wrong_poster`};let c=s[`valid-until`];if(c!==void 0&&c<=t.clock.now())return{ok:!1,reason:`content_expired`};let l=s[`key-epoch`];if(Iz(s[`content-type`])!==(l!==void 0))return{ok:!1,reason:`key_epoch_mismatch`};let u=await QR(s.token,{identity:t.identity,clock:t.clock,revocation:t.revocation,expectedBearer:s.poster,roomPath:s.room,...t.dmRootPolicy===void 0?{}:{dmRootPolicy:t.dmRootPolicy}});return u.ok?{ok:!0,claims:s}:{ok:!1,reason:u.reason}}async function Jz(e){let t=Uz({room:e.room,poster:e.identity.deviceId,"poster-key":e.identity.identityKey,token:e.token,"notice-id":e.noticeId,"posted-at":e.clock.now(),"content-type":e.contentType,content:e.content,...e.refs===void 0?{}:{refs:[...e.refs]},...e.validUntil===void 0?{}:{"valid-until":e.validUntil},...e.keyEpoch===void 0?{}:{"key-epoch":e.keyEpoch}}),n=Wz(e.identity);return[n,{},t,await e.identity.sign(Gz(n,t))]}var Yz=16;function Xz(e){return new Uint8Array(Mg(e,hg))}function Zz(e){let{identity:t,storage:n,clock:r,revocation:i,roomKeys:a}=e;async function o(e){let i=await a.currentEpoch(e.room);if(i===void 0)throw Error(`no content key held for room ${e.room}: room.rekey this room before posting encrypted notices`);let o=await a.get(e.room,i);if(o===void 0)throw Error(`content key store is inconsistent: epoch ${String(i)} is current for room ${e.room} but holds no key`);let s=e.noticeId??crypto.getRandomValues(new Uint8Array(Yz)),c=await jz(o,e.plaintext),l=await Jz({identity:t,clock:r,room:e.room,token:e.token,noticeId:s,contentType:Pz(e.contentType),content:c,keyEpoch:i}),{haveFrame:u}=await yP({identity:t,storage:n},Xz(l));return{dataHave:u,notice:l,keyEpoch:i}}async function s(e,t){let r=await vP(n,e);if(!(await SP(n,{type:`data-entries`,peer:e,"from-seq":r,entries:[t]})).ok)throw Error(`gap rejecting entry for peer log (head ${String(r)})`)}async function c(e,t,r){let i=await CP(n,e,0),a=[];return await rA(i,async e=>{a.push(await l(e,t,r))}),a}async function l(e,n,o){let s=u(e);if(s===void 0)return{verified:!1,reason:`malformed`};let c=await qz(s,{identity:t,clock:r,revocation:i,expectedRoom:n,dmRootPolicy:o});if(!c.ok)return{verified:!1,reason:c.reason};let l=c.claims;if(!Iz(l[`content-type`]))return{verified:!0,contentType:l[`content-type`],plaintext:l.content,claims:l};let d=l[`key-epoch`];if(d===void 0)return{verified:!1,reason:`key_epoch_mismatch`};let f=await a.get(l.room,d),p={verified:!0,contentType:Fz(l[`content-type`]),claims:l};if(f===void 0)return p;try{let e=await Mz(f,l.content);return{...p,plaintext:e}}catch{return p}}function u(e){try{let t=b_(e,x_),n=MD.safeParse(t);return n.success?n.data:void 0}catch{return}}return{postEncryptedNotice:o,ingestPeerEntry:s,readOwnNotices:async e=>c(t.deviceId,e,`either-participant`),readPeerNotices:async(e,t)=>c(e,t,`self`)}}var Qz=32;function $z(e){let{senders:t,storage:n,identity:r,clock:i,revocation:a,roomKeys:o,onChange:s}=e,c=Zz({identity:r,storage:n,clock:i,revocation:a,roomKeys:o});async function l(e,t){let r=await vP(n,t);await e.sendDataFrame({type:`data-request`,peer:t,"from-seq":r})}async function u(e){let t=await vP(n,r.deviceId);t!==0&&await e.sendDataFrame({type:`data-have`,peer:r.deviceId,"head-seq":t})}function d(e,t){if(e.type===`data-have`){l(t,e.peer).catch(()=>void 0);return}if(e.type===`data-entries`){(async()=>{(await SP(n,e)).ok&&(e.entries.length>=Qz&&await l(t,e.peer).catch(()=>void 0),s())})().catch(()=>void 0);return}e.type===`data-request`&&(async()=>{let r=await xP(n,e,Qz);r!==null&&await t.sendDataFrame(r)})().catch(()=>void 0)}return{handleFrame:d,async post(e){let{dataHave:n}=await c.postEncryptedNotice(e);await Promise.allSettled(t().map(async e=>e.sendDataFrame(n))),s()},async readRoom(e,t){let n=await c.readOwnNotices(e),r=await Promise.all(t.map(async t=>c.readPeerNotices(t,e)));return[...n,...r.flat()]},async sync(e,t){await u(e),await Promise.all(t.map(async t=>l(e,t)))},async pull(e){await Promise.allSettled(t().flatMap(t=>e.map(async e=>l(t,e))))},roomKeys:o}}async function eB(e){let{session:t,target:n,identity:r,clock:i,revocation:a,ownRoomMemberToken:o,roomPath:s,roomKeys:c,delivery:l}=e,u=s.split(`+`)[0]??``;if(u===``||AO(r.deviceId)!==u)return;let d=await c.currentEpoch(s);if(d!==void 0&&d!==1||await l.isDelivered(s))return;let f=await QR(o,{identity:r,clock:i,revocation:a,expectedBearer:r.deviceId,roomPath:s,dmRootPolicy:`either-participant`});if(!f.ok)throw Error(`own room token failed verification: ${f.reason}`);let p=r.deriveSharedSecret;if(p===void 0)throw Error(`this identity cannot derive ECDH shared secrets`);let m=d===void 0?Cz():await c.get(s,1);if(m===void 0)throw Error(`room ${s} lost its epoch 1 key`);let h=await Oz(await Tz(await p(f.rootIssuerKey),{room:s,keyEpoch:1}),m);d===void 0&&await c.set(s,1,m);let g=await zz(t,s,1,h,n,o);if(g.result!==`ok`)throw Error(`room.rekey was refused: ${g.code}`);await l.markDelivered(s)}var tB=[`core/management`,`core/room`],nB=16;function rB(){let e=new Uint8Array(nB);return crypto.getRandomValues(e),e}function iB(e){if(e?.direct!==void 0)return{session:e.direct,target:void 0};if(e?.relay!==void 0)return{session:e.relay.hub,target:e.relay.peer};throw Error(`conversation is not connected`)}function aB({identity:e,clock:t,messageStore:n,roomStorage:r,capabilities:i}){let{revocation:a,grants:o}=i,[s,c]=(0,k.useReducer)(GL,new Map),l=AO(e.deviceId),[u,d]=(0,k.useState)(void 0),f=(0,k.useCallback)(e=>{e.then(void 0,e=>{d(e instanceof Error?e.message:String(e))})},[]),p=(0,k.useRef)(s);(0,k.useEffect)(()=>{p.current=s},[s]);let m=(0,k.useRef)(new Set),h=(0,k.useRef)(new WeakSet),g=(0,k.useMemo)(()=>mz(r),[r]);function _(){return[...p.current.values()].flatMap(e=>e.participants.map(e=>MO(e)))}let v=(0,k.useRef)(()=>void 0),y=(0,k.useMemo)(()=>$z({senders:()=>[...new Set([...[...p.current.values()].flatMap(e=>[...e.direct===void 0?[]:[e.direct],...e.relay===void 0?[]:[e.relay.hub]]),...m.current])],storage:r,identity:e,clock:t,revocation:a,roomKeys:g,onChange:()=>{v.current()}}),[e,t,r,g,a]);function b(e){let t=p.current.get(e)?.participants;t!==void 0&&y.readRoom(e,t.map(e=>MO(e))).then(t=>{c({type:`notices`,roomPath:e,notices:[...t]})}).catch(()=>void 0)}(0,k.useEffect)(()=>{v.current=()=>{for(let e of p.current.keys())b(e)}});let x=(0,k.useRef)(new Map),S=(0,k.useMemo)(()=>gz(r),[r]),C=(0,k.useMemo)(()=>hz(r,e,t,a),[r,e,t,a]);async function w(e,t){x.current.set(e,t),await C.set(e,t)}async function T(e){let t=x.current.get(e);if(t!==void 0)return t;let n=await C.get(e);return n!==void 0&&x.current.set(e,n),n}(0,k.useEffect)(()=>{let e=new AbortController,t=()=>e.signal.aborted;return(async()=>{await Vz([...new Set([...await n.roomPaths(),...await C.rooms()])],async e=>{if(t())return;let r=await n.list(e);if(t())return;let i=KL(e,l);c({type:`restored`,roomPath:e,participants:i,messages:r}),y.readRoom(e,i.map(e=>MO(e))).then(t=>{c({type:`notices`,roomPath:e,notices:[...t]})}).catch(()=>void 0)})})().catch(()=>void 0),()=>{e.abort()}},[n,C,y,l]);let E=(0,k.useRef)(new Map);async function D(n,r,i){let o=E.current.get(n);if(o!==void 0)return o;let s=eB({session:i.session,target:i.target,identity:e,clock:t,revocation:a,ownRoomMemberToken:r,roomPath:n,roomKeys:g,delivery:S}).finally(()=>{E.current.delete(n)});return E.current.set(n,s),s}function O(r){return{onMessage:e=>{let t={direction:`received`,text:e.text,messageId:e.messageId,sentAt:e.sentAt};f(n.append(r,t)),c({type:`message`,roomPath:r,message:t}),y.pull((p.current.get(r)?.participants??[]).map(e=>MO(e))).catch(()=>void 0)},onGrantIssued:e=>{f(o.record(`issued`,e,t.now()))},onJoinRequest:e=>{c({type:`join-request`,roomPath:r,request:{requesterHex:AO(e.requesterDevice),async decide(t){c({type:`join-request-settled`,roomPath:r}),await e.decide(t),(async()=>{let e=await T(r),t=p.current.get(r);e!==void 0&&t!==void 0&&await D(r,e,iB(t))})().catch(()=>void 0)}}})},onRekey:async n=>{let i=await T(r);if(i===void 0){await n.respond({result:`error`,code:`no_token`});return}await Bz({identity:e,clock:t,revocation:a,ownRoomMemberToken:i,onRekey:async e=>{await Vz(e.contentKeys,async(t,n)=>{await g.set(r,e.keyEpoch-e.contentKeys.length+1+n,t)}),b(r)}})(n)}}}let A=(0,k.useCallback)(async(r,i)=>{let o={},u=await hF(r,e,tB,{clock:t,onFrame:(e,t)=>{o.current?.(t)}}),d=i??await u.peerDeviceId,f=AO(d),p=xF(l,f);if(s.get(p)?.direct!==void 0){await u.close();return}o.current=e=>{y.handleFrame(e,u)},c({type:`direct-opened`,roomPath:p,participants:[f],session:u}),c({type:`restored`,roomPath:p,participants:[f],messages:await n.list(p)}),y.sync(u,[d]).catch(()=>void 0),cz(u,{identity:e,clock:t,revocation:a,peerDevice:d,currentMembers:()=>[e.deviceId,d]},O(p)),DN(kN(u.events,e=>{e.state.status===`closed`&&c({type:`direct-closed`,roomPath:p})}))},[e,t,l,s,n,y]),j=(0,k.useCallback)(async n=>$R(o,{identity:e,clock:t,revocation:a,expectedBearer:e.deviceId},ZR,{kind:`room`,path:n}),[o,e,t,a]),M=(0,k.useCallback)(async(e,r,i)=>{let a=s.get(e),{session:l,target:u}=iB(a),d=a?.token;if(d===void 0){i(`awaiting-approval`);let n=await sz(l,e,{targetDevice:u,requestToken:await j(e)});i(`sending`),d=n.token,await w(e,d),f(o.record(`held`,d,t.now())),c({type:`token`,roomPath:e,token:d}),await D(e,d,{session:l,target:u}).catch(()=>void 0)}let p=await oz(l,e,r,{token:d,targetDevice:u});if(p.result!==`ok`)throw Error(`send failed: ${p.code}`);let m={direction:`sent`,text:r,messageId:rB(),sentAt:t.now()};return await n.append(e,m),m},[s,t,n,e,g,j]),N=(0,k.useCallback)(async(e,t,n)=>{c({type:`outgoing`,roomPath:e,entry:{localId:t,text:n,status:`sending`}});try{let r=await M(e,n,r=>{c({type:`outgoing`,roomPath:e,entry:{localId:t,text:n,status:r}})});c({type:`message`,roomPath:e,message:r}),c({type:`outgoing-removed`,roomPath:e,localId:t})}catch(r){c({type:`outgoing`,roomPath:e,entry:{localId:t,text:n,status:`failed`,error:r instanceof Error?r.message:String(r)}})}},[M]),ee=(0,k.useCallback)(async(e,t)=>N(e,crypto.randomUUID(),t),[N]),P=(0,k.useCallback)(async(e,t)=>{let n=s.get(e)?.outgoing.find(e=>e.localId===t);n!==void 0&&await N(e,t,n.text)},[s,N]),F=(0,k.useCallback)((e,t)=>{c({type:`outgoing-removed`,roomPath:e,localId:t})},[]),I=(0,k.useCallback)(async(e,n)=>{let r=s.get(e),{session:i,target:a}=iB(r),l=r?.token??await T(e);l===void 0&&(l=(await sz(i,e,{targetDevice:a,requestToken:await j(e)})).token,await w(e,l),f(o.record(`held`,l,t.now())),c({type:`token`,roomPath:e,token:l})),await D(e,l,{session:i,target:a}),await y.post({room:e,token:l,contentType:`text/plain`,plaintext:new TextEncoder().encode(n)}),b(e)},[s,e,t,g,y,j]),te=(0,k.useCallback)(e=>{c({type:`read`,roomPath:e})},[]),ne=(0,k.useCallback)((e,t)=>{let r=xF(l,AO(t)),i=[AO(t)];c({type:`relay-opened`,roomPath:r,participants:i,route:{hub:e,peer:t}}),n.list(r).then(e=>{c({type:`restored`,roomPath:r,participants:i,messages:e})}).catch(()=>void 0),y.sync(e,[t]).catch(()=>void 0)},[l,n,y]),re=(0,k.useCallback)(n=>{let r=new Map;m.current.add(n),DN(kN(n.incomingManageRequests,i=>{let o=i.fromDevice;if(o===void 0)return;let s=AO(o),c=r.get(s);if(c===void 0){let i=lP(),u=xF(l,s);ne(n,o),cz({incomingManageRequests:i.stream},{identity:e,clock:t,revocation:a,peerDevice:o,currentMembers:()=>[e.deviceId,o]},O(u)),r.set(s,i),c=i}c.push(i)}))},[e,t,l,ne]),ie=(0,k.useCallback)(e=>{m.current.delete(e),c({type:`hub-closed`,hub:e})},[]),L=(0,k.useCallback)((e,t,n)=>{h.current.has(t)||(h.current.add(t),y.sync(e,_()).catch(()=>void 0)),y.handleFrame(n,e)},[y]);return{conversations:[...s.values()],persistenceFailure:u,openRelay:ne,watchHub:re,dropHub:ie,onHubFrame:L,attach:A,send:ee,retry:P,discard:F,postNotice:I,markRead:te}}function oB(e,t,n={}){let r=new Map(t.map(e=>[e,lP()]));return DN(kN(e,e=>{r.get(e.command.verb)?.push(e)},{onFault:n.onFault})),{stream:e=>{let t=r.get(e);if(t===void 0)throw Error(`the demux was not built to carry verb ${e}`);return t.stream}}}var sB=8787,cB=/^(localhost|127\.\d+\.\d+\.\d+)(:\d+)?$/;function lB(e){return cB.test(e)}async function uB(e=sB){try{return await fetch(`http://127.0.0.1:${String(e)}/`,{mode:`no-cors`}),`ws://127.0.0.1:${String(e)}`}catch{return}}async function dB(e=typeof location>`u`?``:location.host){return lB(e)?Promise.resolve(void 0):uB()}var fB=`ws://localhost:8787`,pB=[`core/management`,`core/exec`,`core/data`],mB=[`core/management`,`core/data`],hB=[ZF,ZR];function gB({identity:e,clock:t,messageStore:n,roomStorage:r,certificateMemory:i,nameStore:a,preferences:o,grants:s,revocations:c,identityBackup:l,discoverLocalNode:u=dB,defaultAddress:d=fB}){let[f,p]=(0,k.useState)(d),[m,h]=(0,k.useState)(mB),[g,_]=(0,k.useState)([]),[v,y]=(0,k.useState)([]),[b,x]=(0,k.useState)([]),[S,C]=(0,k.useState)(void 0),w=RR(o),T=IL(i,t),E=(0,k.useMemo)(()=>({revocation:c.view,grants:s}),[c,s]),D=aB({identity:e,clock:t,messageStore:n,roomStorage:r,capabilities:E}),[O,A]=(0,k.useState)(),j=D.conversations.find(e=>e.roomPath===O)??D.conversations[0],{markRead:M}=D,N=j?.roomPath,ee=j?.unread??0;(0,k.useEffect)(()=>{N!==void 0&&ee>0&&M(N)},[N,ee,M]);let P=(0,k.useRef)(new Map),F=(0,k.useRef)(D.onHubFrame);(0,k.useEffect)(()=>{F.current=D.onHubFrame},[D.onHubFrame]);let I=(0,k.useRef)(D.watchHub);(0,k.useEffect)(()=>{I.current=D.watchHub},[D.watchHub]);let te=(0,k.useRef)(D.attach);(0,k.useEffect)(()=>{te.current=D.attach},[D.attach]);let ne=(0,k.useRef)(g);(0,k.useEffect)(()=>{ne.current=g},[g]);let re=(0,k.useRef)(new Set),ie=(0,k.useRef)(new Map),L=(0,k.useRef)(!1),R=()=>L.current;(0,k.useEffect)(()=>(L.current=!1,()=>{L.current=!0;for(let e of ne.current)DN(e.session.close())}),[]);let ae=(0,k.useRef)(m);(0,k.useEffect)(()=>{ae.current=m},[m]);function oe(n,r){let i=oB(r.incomingManageRequests,hB),a=gI({sendManageRequest:async(...e)=>r.sendManageRequest(...e),incomingManageRequests:i.stream(ZF)},{identity:e,clock:t,revocation:E.revocation,iceServers:XF,onIncomingConnection:e=>{DN(te.current(e))}});DN(kN(r.revocationAnnouncements,async e=>{await c.ingest(e)},{onFault:e=>{C(e instanceof Error?e.message:String(e))}}));let o={sendManageRequest:async(...e)=>r.sendManageRequest(...e),sendDataFrame:async e=>r.sendDataFrame(e),incomingManageRequests:i.stream(ZR)};P.current.set(r,o),I.current(o),_(e=>[...e,{address:n,session:r,hub:o,negotiator:a}])}async function se(e,t){let n=TL(e.device);for(let t of e.addresses){let e=ie.current.get(t)??new Set;e.add(n),ie.current.set(t,e)}return new Promise(r=>{y(i=>[...i,{key:n,device:e.device,addresses:e.addresses,via:t,resolve:r}])})}function ce(e,t){y(n=>(n.find(t=>t.key===e)?.resolve(t),n.filter(t=>t.key!==e)))}function le(n){let r={current:null},i={current:null},a=mF(YF(T.memory),e,t,DF,[],e=>{r.current?.considerAdvert(e)},(e,t)=>{let n=i.current===null?void 0:P.current.get(i.current);n!==void 0&&F.current(n,e,t)});return i.current=a,r.current=_F({selfDeviceId:e.deviceId,shouldExpand:async e=>se(e,n),dial:de,onExpanded:(e,t,n)=>{oe(t,n),ue(e)},onExpansionDeclined:ue,onExpansionFailed:ue}),a}function ue(e){let t=TL(e.device);for(let n of e.addresses){let e=ie.current.get(n);e?.delete(t),e?.size===0&&ie.current.delete(n)}}async function de(e){let t=await T.confirmAddress(aL(e));if(t===void 0)throw Error(`the certificate of ${e} was not trusted`);if(R())throw Error(`the console was closed before the dial began`);let n=ie.current.get(e),[r]=n??[],i=le({address:e,claimedDevice:n?.size===1?r:void 0});if(await i.connect(t,ae.current),R())throw await i.close(),Error(`the console was closed while the dial was connecting`);return i}function fe(e){ne.current.some(t=>t.address===e)||re.current.has(e)||(re.current.add(e),T.confirmAddress(aL(e)).then(t=>{if(t===void 0||R())return;let n=le({address:e,claimedDevice:void 0});oe(e,n),n.connect(t,m).catch(()=>{})}).catch(()=>void 0).finally(()=>{re.current.delete(e)}))}let pe=(0,k.useRef)(fe);(0,k.useEffect)(()=>{pe.current=fe});let me=(0,k.useRef)(u);(0,k.useEffect)(()=>{me.current=u},[u]);let he=(0,k.useRef)(!1);(0,k.useEffect)(()=>{he.current||(he.current=!0,me.current().then(e=>{e!==void 0&&pe.current(e)}).catch(()=>void 0))},[]);function ge(e){e.preventDefault(),fe(f)}async function _e(e){let t=await Promise.allSettled(ne.current.map(async t=>t.session.sendRevocationAnnounce([e])));return{attempted:t.length,reached:t.filter(e=>e.status===`fulfilled`).length}}function ve(e){D.dropHub(e.hub),DN(e.session.close()),_(t=>t.filter(t=>t.session!==e.session))}function ye(t,n){D.openRelay(t.hub,n),A(xF(AO(e.deviceId),AO(n))),t.negotiator.initiate(n).then(async e=>D.attach(e,n)).catch(e=>{x(t=>[...t,{key:crypto.randomUUID(),peer:TL(n),reason:e instanceof Error?e.message:String(e)}])})}return(0,z.jsx)(LL,{store:a,children:(0,z.jsxs)(rm,{className:bL,p:`md`,gap:`lg`,children:[(0,z.jsxs)(pl,{justify:`space-between`,children:[(0,z.jsx)(Lm,{order:1,children:`wire-mesh console`}),w.ready&&!w.visible&&(0,z.jsx)(Ed,{size:`xs`,variant:`subtle`,onClick:w.show,children:`How this works`})]}),w.error!==void 0&&(0,z.jsx)(eu,{color:`red`,title:`The first-run intro's setting is unavailable`,children:w.error}),w.visible&&(0,z.jsx)(zL,{onDismiss:w.dismiss}),(0,z.jsx)(RL,{}),(0,z.jsxs)(`form`,{onSubmit:ge,children:[(0,z.jsxs)(pl,{align:`flex-end`,wrap:`wrap`,children:[(0,z.jsx)(Am,{label:`Node`,value:f,onChange:e=>{p(e.currentTarget.value)},required:!0,style:{flex:1,minWidth:`16rem`}}),(0,z.jsx)(Ed,{type:`submit`,children:`Connect`})]}),(0,z.jsx)(od.Group,{label:`Domains offered`,value:m,onChange:h,children:(0,z.jsx)(pl,{mt:`xs`,children:pB.map(e=>(0,z.jsx)(od,{value:e,label:e},e))})})]}),(0,z.jsx)(FL,{prompts:T.prompts,changes:T.changes,onDismissChange:T.dismissChange}),(0,z.jsx)(ML,{peers:v,onConnect:e=>{ce(e,!0)},onDismiss:e=>{ce(e,!1)}}),g.map(e=>(0,z.jsx)(AL,{address:e.address,session:e.session,clock:t,reconnectPolicy:DF,certificateChanges:T.changes,onClose:()=>{ve(e)},onMessagePeer:t=>{ye(e,t)}},e.address)),b.map(e=>(0,z.jsxs)(eu,{color:`yellow`,title:(0,z.jsxs)(z.Fragment,{children:[`No direct connection to `,(0,z.jsx)(oL,{deviceHex:e.peer})]}),withCloseButton:!0,onClose:()=>{x(t=>t.filter(t=>t.key!==e.key))},children:[e.reason,`. Messages go through the hub instead.`]},e.key)),D.persistenceFailure!==void 0&&(0,z.jsxs)(eu,{color:`red`,title:`Could not save to this console's storage`,children:[D.persistenceFailure,`. The conversation carries on, but what failed to save will be missing after a reload.`]}),S!==void 0&&(0,z.jsx)(eu,{color:`red`,title:`A revocation could not be stored`,children:S}),(0,z.jsx)(IR,{revocations:c,onFailure:C}),(0,z.jsx)(ZL,{conversations:D.conversations,onSelect:A}),(0,z.jsx)(FR,{identity:e,clock:t,grants:s,revocations:c,identityBackup:l,announceRevocation:_e}),(0,z.jsx)(zR,{conversations:D.conversations,selected:j?.roomPath,onSelect:A}),j!==void 0&&(0,z.jsx)(XR,{view:j,onSend:async e=>D.send(j.roomPath,e),onPostNotice:async e=>D.postNotice(j.roomPath,e),onRetry:e=>{DN(D.retry(j.roomPath,e))},onDiscard:e=>{D.discard(j.roomPath,e)}},j.roomPath)]})})}var _B=`modulepreload`,vB=function(e){return`/`+e},yB={},bB=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=vB(t,n),t=s(t),t in yB)return;yB[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:_B,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},xB=`false`,SB=`false`,CB=xB===`true`,wB=SB===`true`;function TB(e={}){let{immediate:t=!1,onNeedReload:n,onNeedRefresh:r,onOfflineReady:i,onRegistered:a,onRegisteredSW:o,onRegisterError:s}=e,c,l,u,d=async(e=!0)=>{await l,CB||u?.()};async function f(){if(`serviceWorker`in navigator){if(c=await bB(async()=>{let{Workbox:e}=await import(`./workbox-window.prod.es5-Bd17z0YL.js`);return{Workbox:e}},[]).then(({Workbox:e})=>new e(`/sw.js`,{scope:`/`,type:`classic`})).catch(e=>{s?.(e)}),!c)return;if(u=()=>{c?.messageSkipWaiting()},!wB){if(CB)c.addEventListener(`activated`,e=>{(e.isUpdate||e.isExternal)&&(n?n():window.location.reload())}),c.addEventListener(`installed`,e=>{e.isUpdate||i?.()});else{let e=!1,t=()=>{e=!0,c?.addEventListener(`controlling`,e=>{e.isUpdate&&(n?n():window.location.reload())}),r?.()};c.addEventListener(`installed`,n=>{n.isUpdate===void 0?n.isExternal===void 0?!e&&i?.():n.isExternal?t():!e&&i?.():n.isUpdate||i?.()}),c.addEventListener(`waiting`,t)}}c.register({immediate:t}).then(e=>{o?o(`/sw.js`,e):a?.(e)}).catch(e=>{s?.(e)})}}return l=f(),d}function EB(e={}){let{immediate:t=!0,onNeedReload:n,onNeedRefresh:r,onOfflineReady:i,onRegistered:a,onRegisteredSW:o,onRegisterError:s}=e,[c,l]=(0,k.useState)(!1),[u,d]=(0,k.useState)(!1),[f]=(0,k.useState)(()=>TB({immediate:t,onNeedReload:n,onOfflineReady(){d(!0),i?.()},onNeedRefresh(){l(!0),r?.()},onRegistered:a,onRegisteredSW:o,onRegisterError:s}));return{needRefresh:[c,l],offlineReady:[u,d],updateServiceWorker:f}}function DB(){let{offlineReady:[e,t],needRefresh:[n,r],updateServiceWorker:i}=EB();function a(){t(!1),r(!1)}return!e&&!n?null:(0,z.jsx)(Ef,{onClose:a,closeButtonProps:{"aria-label":`Dismiss`},title:n?`Update available`:`Ready to work offline`,pos:`fixed`,bottom:`1rem`,right:`1rem`,style:{zIndex:1e3},children:(0,z.jsx)(pl,{gap:`xs`,children:n?(0,z.jsx)(Ed,{size:`xs`,onClick:()=>{DN(i(!0))},children:`Reload`}):void 0})})}var OB=`ws://localhost:8787`;function kB(e){return`${e.protocol===`https:`?`wss:`:`ws:`}//${e.host}`}function AB(e,t){return e?OB:kB(t)}var jB=await qm(),MB=await Tk(jB),NB={now:()=>Date.now()},PB=GM(await qm()),FB=await XM({storage:await qm(),identity:MB,clock:NB}),IB=tA(jB),LB=bN(await qm()),RB=await qm(),zB=Vk(await qm()),BB=pN(await qm()),VB=$M(await qm()),HB=AB(!1,window.location),UB=document.getElementById(`root`);if(UB===null)throw Error(`missing #root element`);(0,Rm.createRoot)(UB).render((0,z.jsx)(k.StrictMode,{children:(0,z.jsxs)(xn,{children:[(0,z.jsx)(gB,{identity:MB,clock:NB,messageStore:LB,roomStorage:RB,certificateMemory:zB,nameStore:BB,preferences:VB,grants:PB,revocations:FB,identityBackup:IB,defaultAddress:HB}),(0,z.jsx)(DB,{})]})}));
@@ -10,7 +10,7 @@
10
10
  <meta name="theme-color" content="#1971c2" />
11
11
  <link rel="icon" type="image/svg+xml" href="./favicon.svg" />
12
12
  <title>wire-mesh console</title>
13
- <script type="module" crossorigin src="/assets/index-ZtzShU-o.js"></script>
13
+ <script type="module" crossorigin src="/assets/index-CNuITRyk.js"></script>
14
14
  <link rel="stylesheet" crossorigin href="/assets/index-BtvNxMjr.css">
15
15
  <link rel="manifest" href="/manifest.webmanifest"></head>
16
16
  <body>
@@ -1 +1 @@
1
- if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(n,o)=>{const r=e||("document"in self?document.currentScript.src:"")||location.href;if(s[r])return;let t={};const f=e=>i(e,r),l={module:{uri:r},exports:t,require:f};s[r]=Promise.all(n.map(e=>l[e]||f(e))).then(e=>(o(...e),t))}}define(["./workbox-2fbc6a65"],function(e){"use strict";self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.precacheAndRoute([{url:"index.html",revision:"02f7602122f998a4c322211cef9f7c86"},{url:"assets/workbox-window.prod.es5-Bd17z0YL.js",revision:null},{url:"assets/index-ZtzShU-o.js",revision:null},{url:"assets/index-BtvNxMjr.css",revision:null},{url:"favicon.svg",revision:"e9eabed03a72f0df2b347884322f7dfb"},{url:"icons/icon-192x192.svg",revision:"e9eabed03a72f0df2b347884322f7dfb"},{url:"icons/icon-512x512.svg",revision:"e9eabed03a72f0df2b347884322f7dfb"},{url:"manifest.webmanifest",revision:"89b97e994ecf3ebc89bc570153e191ad"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))});
1
+ if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(n,o)=>{const r=e||("document"in self?document.currentScript.src:"")||location.href;if(s[r])return;let t={};const f=e=>i(e,r),l={module:{uri:r},exports:t,require:f};s[r]=Promise.all(n.map(e=>l[e]||f(e))).then(e=>(o(...e),t))}}define(["./workbox-2fbc6a65"],function(e){"use strict";self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.precacheAndRoute([{url:"index.html",revision:"0cc1bf429b35a19b98e9bdef86560ecc"},{url:"assets/workbox-window.prod.es5-Bd17z0YL.js",revision:null},{url:"assets/index-CNuITRyk.js",revision:null},{url:"assets/index-BtvNxMjr.css",revision:null},{url:"favicon.svg",revision:"e9eabed03a72f0df2b347884322f7dfb"},{url:"icons/icon-192x192.svg",revision:"e9eabed03a72f0df2b347884322f7dfb"},{url:"icons/icon-512x512.svg",revision:"e9eabed03a72f0df2b347884322f7dfb"},{url:"manifest.webmanifest",revision:"89b97e994ecf3ebc89bc570153e191ad"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wire-mesh",
3
- "version": "3.6.18",
3
+ "version": "3.6.19",
4
4
  "bin": {
5
5
  "wire-mesh": "./dist/server.mjs"
6
6
  },
@@ -8,13 +8,13 @@
8
8
  "@peculiar/x509": "2.1.0",
9
9
  "cbor2": "2.3.0",
10
10
  "reflect-metadata": "0.2.2",
11
- "wire-mesh-core": "4.2.1",
11
+ "wire-mesh-core": "4.2.2",
12
12
  "ws": "8.21.3"
13
13
  },
14
14
  "devDependencies": {
15
15
  "@arethetypeswrong/cli": "0.18.5",
16
16
  "@exadev/eslint-config": "3.0.0",
17
- "@exadev/wire-mesh-web-console": "2.18.7",
17
+ "@exadev/wire-mesh-web-console": "2.18.8",
18
18
  "@types/node": "26.4.1",
19
19
  "@types/ws": "8.18.1",
20
20
  "eslint": "10.10.0",