@oracle-agent/oracle 0.35.54 → 0.35.55

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.
@@ -1,7 +1,7 @@
1
- var Xn=Object.defineProperty;var X=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Zn=(e,t)=>{for(var r in t)Xn(e,r,{get:t[r],enumerable:!0})};function J(e,t="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${t} must be a number or decimal string`);return e}throw new Error(`${t} must be a number or decimal string`)}function Mr(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function Pt(e,t="amount"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${t} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return BigInt(e)}let r=J(e,t);if(r==="")throw new Error(`${t} is required`);if(!/^-?\d+$/.test(r)&&!/^0x[0-9a-fA-F]+$/.test(r))throw new Error(`${t} must be an integer in decimal or 0x-hex form, got ${JSON.stringify(r)}`);try{return BigInt(r)}catch{throw new Error(`${t} must be an integer, got ${JSON.stringify(r)}`)}}function Z(e,t,r="amount"){let n=J(e,r);if(!/^-?\d*(\.\d+)?$/.test(n)||n===""||n==="."||n==="-")throw new Error(`${r} must be a decimal number, got ${JSON.stringify(n)}`);let o=n.startsWith("-"),i=o?n.slice(1):n,[s="0",l=""]=i.split(".");if(l.length>t)throw new Error(`${r} has more than ${t} decimal places, which would lose precision`);let u=BigInt((s||"0")+l.padEnd(t,"0"));return o?-u:u}var et=X(()=>{});import{AsyncLocalStorage as Si}from"node:async_hooks";function tt(e){let t=ki.getStore();if(!t||t.closed||!Ai.includes(e))return null;if(t.spans.length>=Ti)return t.droppedSpans++,null;let r={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(r),(n,o=null)=>{t.closed||r.durationMs!==null||(r.durationMs=Math.max(0,t.now()-t.start-r.startMs),r.outcome=n==="succeeded"?"succeeded":"failed",r.status=Number.isInteger(o)&&o>=100&&o<=599?o:null)}}var ki,Ai,Ti,Cr=X(()=>{ki=new Si,Ai=["http","retry","shared"],Ti=512});import be from"node:net";import Oi from"node:dns";function rt(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=a=>{if(!a)return[];let p=a.split(":"),E=p.at(-1);if(E?.includes(".")){let w=E.split(".").map(Number);if(w.length!==4||w.some(S=>!Number.isInteger(S)||S<0||S>255))return null;p.splice(p.length-1,1,(w[0]<<8|w[1]).toString(16),(w[2]<<8|w[3]).toString(16))}return p.some(w=>!/^[0-9a-f]{1,4}$/.test(w))?null:p.map(w=>Number.parseInt(w,16))},[n,o]=t.split("::"),i=r(n),s=r(o);if(!i||!s)return null;let l=t.includes("::"),u=8-i.length-s.length;if(!l&&u!==0||l&&u<1)return null;let d=[...i,...Array(Math.max(0,u)).fill(0),...s];return d.length!==8?null:Uint8Array.from(d.flatMap(a=>[a>>8,a&255]))}function Nt(e,t,r){let n=Math.floor(r/8),o=r%8;for(let s=0;s<n;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[n]&i)===(t[n]&i)}function Rt(e){if(be.isIPv4(e)){let t=e.split(".").map(Number);return!(t[0]===0||t[0]===10||t[0]===127||t[0]>=224||t[0]===100&&t[1]>=64&&t[1]<=127||t[0]===169&&t[1]===254||t[0]===172&&t[1]>=16&&t[1]<=31||t[0]===192&&(t[1]===0||t[1]===2||t[1]===168)||t[0]===192&&t[1]===88&&t[2]===99||t[0]===198&&(t[1]===18||t[1]===19||t[1]===51)||t[0]===203&&t[1]===0&&t[2]===113)}if(be.isIPv6(e)){let t=rt(e);if(!t)return!1;let r=rt("::ffff:0:0");return Nt(t,r,96)?Rt([...t.slice(12)].join(".")):Nt(t,rt("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Nt(t,rt(o),i)):!1}return!1}function vi(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}if(t.protocol!=="http:"&&t.protocol!=="https:")return{ok:!1,error:`refused protocol ${t.protocol} (only http/https)`};let r=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(Ii.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=be.isIP(r);return n!==0&&!Rt(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function Lt(e,{lookupFn:t=Oi.promises.lookup}={}){let r=vi(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:be.isIPv6(r.host)?6:4}]};let n;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:r.url,addresses:[]};try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!Rt(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}function _i(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let r;try{r=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(r.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(r.hostname)||!r.port||r.username||r.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let n=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(n))throw new Error("egress-guard: egress proxy token is missing");return{uri:r.origin,token:n}}async function Mt({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n,o;try{o=await t(),r=o.Agent,n=o.fetch}catch(w){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${w?.message||w}`);return null}if(typeof r!="function"||typeof n!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let i=w=>String(w).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),s=new Map,l=w=>(Array.isArray(w)?w:[w]).map(S=>typeof S=="string"?{address:S}:S).filter(S=>S&&S.address).map(S=>({address:S.address,family:S.family||(be.isIPv6(S.address)?6:4)})),u=(w,S,I)=>{s.set(i(w),l(typeof S=="string"?[{address:S,family:I}]:S))},d=w=>{let S=i(w);if(be.isIP(S))return[{address:S,family:be.isIPv6(S)?6:4}];let I=s.get(S);if(!I||!I.length)throw new Error(`refused: unpinned host ${w} during pinned fetch`);return I},a=_i(),p=a&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:a.uri,token:`Bearer ${a.token}`,connectTimeout:1e4}):new r({connect:{lookup(w,S,I){let v;try{v=d(w)}catch(L){return I(L)}return S?.all?I(null,v):I(null,v[0].address,v[0].family)}}}),E=$i((w,S={})=>n(w,{...S,dispatcher:p}),u);return{dispatcher:p,fetch:E,pin:u,resolve:d,async close(){try{await p.destroy()}catch{}}}}function $i(e,t){if(typeof e!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof t!="function")throw new Error("markPinCapableFetch: pin must be a function");return e[Ct]=Object.freeze({pin:t}),e}function jt(e){return typeof e=="function"&&typeof e[Ct]?.pin=="function"}function jr(e,t,r){if(!jt(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Ct].pin(t,r)}var Ii,Ct,Hr=X(()=>{Ii=new Set(["localhost","metadata.google.internal","metadata.goog"]);Ct=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Pi}from"node:crypto";import{types as ce}from"node:util";function K(e){return fe(`HTTP JSON body refused: ${e}`)}function Bi(e){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(t=>typeof ce[t]=="function"&&ce[t](e))}function zi(e){let t=[],r=0,n=0,o=0,i=0,s=new WeakSet,l=a=>{if(r+=Buffer.byteLength(a,"utf8"),r>ae.bytes)throw K("serialized byte limit exceeded");t.push(a)},u=a=>{if(Buffer.byteLength(a,"utf8")>ae.bytes)throw K("serialized byte limit exceeded");return JSON.stringify(a)},d=(a,p)=>{if(n+=1,n>ae.nodes)throw K("node limit exceeded");if(p>ae.depth)throw K("depth limit exceeded");if(a===null){l("null");return}if(typeof a=="string"){l(u(a));return}if(typeof a=="boolean"){l(a?"true":"false");return}if(typeof a=="number"){if(!Number.isFinite(a))throw K("non-finite number");l(Object.is(a,-0)?"0":String(a));return}if(typeof a!="object")throw K("unsupported non-JSON value");if(ce.isProxy(a))throw K("proxy value");if(Bi(a))throw K("unsupported exotic object");if(s.has(a))throw K("cyclic value");s.add(a);try{if(Object.getOwnPropertySymbols(a).length>0)throw K("symbol-keyed fields are unsupported");if(Array.isArray(a)){let S=Object.getPrototypeOf(a),I=0;for(;S!==null;){if(ce.isProxy(S))throw K("proxy array prototype");if(I+=1,I>ae.depth)throw K("array prototype depth limit exceeded");S=Object.getPrototypeOf(S)}if(a.length>ae.arrayLength)throw K("array length limit exceeded");for(let L=0;L<a.length;L+=1){let T=Object.getOwnPropertyDescriptor(a,String(L));if(!T||!Object.hasOwn(T,"value")||T.enumerable!==!0)throw K("array entries must be dense enumerable own data")}let v=0;for(let L in a){if(i+=1,i>ae.fields)throw K("enumeration limit exceeded");if(Object.hasOwn(a,L)&&(v+=1,v>a.length))throw K("named array fields are unsupported")}if(v!==a.length)throw K("array entries must be dense enumerable own data");l("[");for(let L=0;L<a.length;L+=1)L&&l(","),d(Object.getOwnPropertyDescriptor(a,String(L)).value,p+1);l("]");return}let E=Object.getPrototypeOf(a);if(E!==Object.prototype&&E!==null)throw K("non-plain object");let w=[];for(let S in a){if(i+=1,i>ae.fields)throw K("enumeration limit exceeded");if(!Object.hasOwn(a,S))continue;if(o+=1,o>ae.fields)throw K("field limit exceeded");let I=Object.getOwnPropertyDescriptor(a,S);if(!I||!Object.hasOwn(I,"value")||I.enumerable!==!0)throw K("object fields must be enumerable own data");w.push([S,I.value])}l("{");for(let S=0;S<w.length;S+=1)S&&l(","),l(u(w[S][0])),l(":"),d(w[S][1],p+1);l("}")}finally{s.delete(a)}};return d(e,0),t.join("")}function Fi(e){let t=Object.create(null);if(e==null)return t;if(typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP headers must be an object");if(ce.isProxy(e))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let r=new Set;for(let n of Object.keys(e)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(n))throw new TypeError("HTTP header names must be valid tokens");let o=n.toLowerCase();if(r.has(o))throw new TypeError("HTTP headers contain a duplicate canonical name");r.add(o);let i=Object.getOwnPropertyDescriptor(e,n);if(!i||!Object.hasOwn(i,"value"))throw new TypeError("HTTP headers must contain own data properties");let s=i.value;if(s==null||["object","function","symbol"].includes(typeof s))throw new TypeError("HTTP header values must be scalar");t[n]=String(s)}return t}function Ui(){return Object.assign(Object.create(null),{Accept:"application/json"})}function qi(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let r=new URL(String(e),String(t));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${r.protocol}`);return r.toString()}function Ki(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function nt(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Ur.get(e);return t||(t=qr,qr+=1,Ur.set(e,t)),`reference:${t}`}function Kr(e){if(!e||typeof e!="object"||Array.isArray(e)||!Object.hasOwn(e,"jsonrpc")||!Object.hasOwn(e,"method")||e.jsonrpc!=="2.0")return!1;let t=typeof e.method=="string"?e.method:"";return t?Gi.has(t)||/^get[A-Z0-9_]/u.test(t)||/^is[A-Z0-9_]/u.test(t)||/^eth_get[A-Z0-9_]/u.test(t):!1}function Gr(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let r=t;if(typeof t=="string")try{r=JSON.parse(t)}catch{return!1}if(Array.isArray(r))return r.length>0&&r.every(Kr);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Kr(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&Ji.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function Yi(e,t,r,n={},o=null){let i=Pi("sha256"),s=(u,d)=>{let a=String(d);i.update(String(Buffer.byteLength(u,"utf8"))).update(":").update(u),i.update("=").update(String(Buffer.byteLength(a,"utf8"))).update(":").update(a).update(`
2
- `)};s("method",e),s("url",t),Object.keys(r||{}).map((u,d)=>({name:u.toLowerCase(),order:d,value:String(r[u])})).sort((u,d)=>u.name.localeCompare(d.name)||u.order-d.order).forEach((u,d)=>{s(`header-name-${d}`,u.name),s(`header-value-${d}`,u.value)}),s("body",o??"-");for(let u of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${u}`,n[u]??"-");return i.digest("hex")}function Vi(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Br):Math.min(250*2**e,Br)+Math.floor(Math.random()*100)}function fe(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Dt(e,t,r){return fe(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function xe(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Xi(e){return e?e.byteLength??e.length??0:0}async function Zi(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(xe(e),!n))throw Dt(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let p=await e.text(),E=Buffer.byteLength(p,"utf8");if(E>t){if(!n)throw Dt(r,`body ${E} bytes`,t);return Buffer.from(p,"utf8").subarray(0,t).toString("utf8")}return p}let l=[],u=0,d=!1;try{for(;;){let{value:p,done:E}=await s.read();if(E)break;if(p&&(l.push(Buffer.from(p)),u+=Xi(p),u>t)){d=!0;break}}}finally{if(d)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(d&&(typeof o=="function"&&o(),!n))throw Dt(r,`streamed ${u} bytes`,t);let a=Buffer.concat(l);return(d?a.subarray(0,t):a).toString("utf8")}function Qi(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function es(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:l,untrustedUrl:u=!1,maxResponseBytes:d=null,sameOriginRedirectsOnly:a=!1,importUndici:p,validateResponse:E,signal:w,redirectPolicy:S="follow",maxRedirects:I=ot}){let v=null,L=t,T=s?{lookupFn:s}:{};if(u&&!l&&!jt(L))throw fe(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let M=new AbortController,b=setTimeout(()=>M.abort(),i),R=w?Fr?Fr([w,M.signal]):w:M.signal,j=async(O,{status:P=null}={})=>{let F=await Lt(O,T);if(!F.ok)throw fe(P==null?`HTTP refused ${O}: ${F.error}`:`HTTP redirect to ${O} ${F.error}`,P==null?{}:{status:P});let H=new URL(O).hostname;if(l){if(v&&(await v.close(),v=null),!v)try{v=await Mt({requireUndici:!0,...p?{importUndici:p}:{}})}catch(c){throw fe(P==null?`HTTP refused ${O}: ${c?.message||c}`:`HTTP redirect to ${O} refused: ${c?.message||c}`,P==null?{}:{status:P})}v.pin(H,F.addresses),L=v.fetch}else jr(L,H,F.addresses);return F};try{let O=String(e),P=Object.assign(Object.create(null),n||{});u&&await j(O);for(let F=0;F<=I;F+=1){let H=Object.assign(Object.create(null),{method:r,headers:P,body:o,signal:R,redirect:"manual",dispatcher:void 0}),c=await L(O,H);if((S==="error"||I===0)&&c.status>=300&&c.status<400)throw xe(c),fe(`HTTP ${c.status} ${r} redirect refused`,{status:c.status,redirectRefused:!0});if(Di.has(c.status)){let g=a===!0&&r==="POST"&&[307,308].includes(c.status)&&Gr(r,o);if(r!=="GET"&&r!=="HEAD"&&!g){xe(c);let k=new Error(`HTTP ${c.status} ${r} ${O} redirected non-idempotent request`);throw k.status=c.status,k}if(F===I)throw xe(c),fe(`HTTP ${c.status} ${r} redirect budget exhausted`,{status:c.status,redirectRefused:!0});let h=c.headers?.get?.("location"),y;try{y=qi(h,O)}catch(k){throw xe(c),k}let x=!Ki(y,O);if(xe(c),x&&r==="POST"){let k=new Error(`HTTP ${c.status} ${r} cross-origin redirect refused`);throw k.status=c.status,k}if(x&&a){let k=new Error(`HTTP ${c.status} ${r} cross-origin redirect refused`);throw k.status=c.status,k.retryable=!1,k}if(x&&(P=Ui(P)),u)await j(y,{status:c.status});else if(x){let k=await Lt(y,T);if(!k.ok){let A=new Error(`HTTP redirect from ${O} ${k.error}`);throw A.status=c.status,A.retryable=!1,A}l&&k.addresses?.length&&(v||(v=await Mt(p?{importUndici:p}:{})),v&&(v.pin(new URL(y).hostname,k.addresses),L=v.fetch))}O=y;continue}if(typeof E=="function")try{await E(c,{url:O})}catch(g){throw xe(c),fe(g?.message||String(g))}let f=await Zi(c,d,{url:O,onOversize:()=>M.abort()}),m=Qi(f);if(!c.ok){let g=new Error(`HTTP ${c.status} ${r} ${O}`);throw g.status=c.status,g.retryAfter=c.headers?.get?.("retry-after")??null,g.body=m??f.slice(0,300),g}return m??f}throw new Error(`HTTP redirect loop for ${e}`)}catch(O){if(M.signal.aborted&&!Me(w)){let P=O&&(typeof O=="object"||typeof O=="function")&&!ce.isProxy(O)?O:null,F=P?Object.getOwnPropertyDescriptor(P,"oversize"):null;if(!(F&&Object.hasOwn(F,"value")&&F.value===!0))try{if(!P)throw new TypeError("unsafe rejection");Object.defineProperties(P,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let c=new Error("HTTP request timed out");throw Object.defineProperties(c,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),c}}throw O}finally{clearTimeout(b),v&&await v.close()}}async function Jr(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&ce.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let r=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let A of Object.getOwnPropertyNames(t)){let _=Object.getOwnPropertyDescriptor(t,A);if(!(A==="toJSON"&&_&&Object.hasOwn(_,"value")&&_.value===void 0)){if(!r.has(A))throw new TypeError("HTTP options contain unknown fields");if(!_||!_.enumerable||!Object.hasOwn(_,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=A=>{if(t==null||!Object.hasOwn(t,A))return;let _=Object.getOwnPropertyDescriptor(t,A);if(!_||!Object.hasOwn(_,"value"))throw new TypeError("HTTP options must contain own data properties");return _.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=n("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let i=n("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=n("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let l=n("redirectPolicy");if(l!==void 0&&l!=="follow"&&l!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let u=n("maxRedirects");if(u!==void 0&&(!Number.isInteger(u)||u<0||u>ot))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${ot}`);if(l==="error"&&u!==void 0&&u!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let d=l??"follow",a=d==="error"?0:u??ot;for(let A of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let _=n(A);if(_!==void 0&&typeof _!="boolean")throw new TypeError(`HTTP ${A} must be boolean`)}let p=n("maxResponseBytes");if(p!==void 0&&(!Number.isInteger(p)||p<1||p>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let E=n("signal");if(E!==void 0){if(ce.isProxy(E)||!(E instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Me(E)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let A of["importUndici","lookupFn","validateResponse"]){let _=n(A);if(_!==void 0&&typeof _!="function")throw new TypeError(`HTTP ${A} must be a function`)}let w=n("fetchImpl"),S=w||globalThis.fetch;if(typeof S!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let I=i??12e3,v=(o||"GET").toUpperCase(),L=n("headers"),T=Fi(L),M=Object.assign(Object.create(null),T);Object.keys(M).some(A=>A.toLowerCase()==="accept")||(M.Accept="application/json");let b=n("body");b!=null&&typeof b!="string"&&(Object.keys(M).find(_=>_.toLowerCase()==="content-type")||(M["Content-Type"]="application/json"),b=zi(b));let R=s??Ri,j=n("lookupFn"),O=!w,P=n("untrustedUrl")===!0,F=n("sameOriginRedirectsOnly")===!0,H=n("importUndici"),c=n("validateResponse"),f=E,m=p??null,g=async()=>{let A;for(let _=0;_<=R;_++){f&&Ci.call(f);let U=tt("http");try{let N=await es(e,{fetchImpl:S,method:v,headers:M,body:b,timeoutMs:I,lookupFn:j,realFetch:O,untrustedUrl:P,maxResponseBytes:m,sameOriginRedirectsOnly:F,importUndici:H,validateResponse:c,signal:f,redirectPolicy:d,maxRedirects:a});return U?.("succeeded"),N}catch(N){A=N;let D=wt=>{if(!N||typeof N!="object"&&typeof N!="function"||ce.isProxy(N))return;let Ie=Object.getOwnPropertyDescriptor(N,wt);return Ie&&Object.hasOwn(Ie,"value")?Ie.value:void 0},q=D("status");U?.("failed",q);let W=D("oracleTimeout")===!0||D("name")==="AbortError"||D("name")==="TimeoutError"||Me(f),Ue=new Set([408,425,429]),ke=D("retryable")===!1?!1:q!=null?Ue.has(q)||Ni.has(q)&&Dr.has(v):!W&&Dr.has(v);if(_===R||!ke)throw N;let Y=Vi(_,D("retryAfter")),qe=tt("retry"),pr=!1;try{f?await new Promise((wt,Ie)=>{let mr,ve=()=>{clearTimeout(mr),zr.call(f,"abort",ve),Ie(Hi(f)||new DOMException("Aborted","AbortError"))};if(Me(f)){ve();return}mr=setTimeout(()=>{zr.call(f,"abort",ve),wt()},Y),ji.call(f,"abort",ve,{once:!0}),Me(f)&&ve()}):await Wi(Y),pr=!0}finally{qe?.(pr?"succeeded":"failed")}}}throw A};if(!(n("dedupe")!==!1&&!f&&Gr(v,b)))return g();let y=Yi(v,e,M,{untrustedUrl:P,maxResponseBytes:m,sameOriginRedirectsOnly:F,redirectPolicy:d,maxRedirects:a,timeoutMs:I,retries:R,fetchImpl:nt(S),realFetch:O,lookupFn:nt(j),importUndici:nt(H),validateResponse:nt(c)},b),x=Ht.get(y);if(x){let A=tt("shared");try{let _=await x;return A?.("succeeded"),_}catch(_){throw A?.("failed"),_}}let k=g().finally(()=>Ht.delete(y));return Ht.set(y,k),k}var Ni,Dr,Ri,Br,Li,Mi,Ci,ji,zr,Fr,Me,Hi,Di,ot,jc,ae,Ht,Ur,qr,Gi,Ji,Wi,Yr=X(()=>{Cr();Hr();Ni=new Set([408,425,429,500,502,503,504]),Dr=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ri=2,Br=4e3,Li=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Mi=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Ci=AbortSignal.prototype.throwIfAborted,ji=EventTarget.prototype.addEventListener,zr=EventTarget.prototype.removeEventListener,Fr=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Me=e=>e?Li.call(e):!1,Hi=e=>e?Mi.call(e):void 0,Di=new Set([301,302,303,307,308]),ot=3,jc=64*1024,ae=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Ht=new Map,Ur=new WeakMap,qr=1;Gi=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Ji=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);Wi=e=>new Promise(t=>setTimeout(t,e))});import{types as Vr}from"node:util";function ts(e){if(!e||typeof e!="object"||Vr.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function it(e,t="provider response",r=0){if(r>64)throw new Error(`${t} exceeds the JSON nesting bound`);if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(Array.isArray(e)){if(Vr.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let i=0;i<e.length;i+=1){let s=Object.getOwnPropertyDescriptor(e,String(i));if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} arrays must contain dense own data`);o[i]=it(s.value,t,r+1)}return o}if(!ts(e))throw new Error(`${t} contains a non-JSON value`);let n=Object.create(null);for(let o of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,o);if(!i||!Object.hasOwn(i,"value"))throw new Error(`${t} objects must contain own data`);n[o]=it(i.value,t,r+1)}return n}var Wr=X(()=>{});function os({testnet:e,baseUrl:t}={}){if(t)return t.replace(/\/$/,"").endsWith("/info")?t:`${t.replace(/\/$/,"")}/info`;if(process.env.HL_INFO_URL)return process.env.HL_INFO_URL;if(process.env.HL_API_URL){let r=process.env.HL_API_URL.replace(/\/$/,"");return r.endsWith("/info")?r:`${r}/info`}return e||process.env.HL_TESTNET==="1"?ns:rs}async function Ee(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=os(t);return it(await Jr(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,signal:t.signal}),"hyperliquid info response")}async function Xr(e={}){return Ee({type:"allMids"},e)}async function Zr(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),Ee(t,e)}var rs,ns,Bt=X(()=>{Yr();Wr();rs="https://api.hyperliquid.xyz/info",ns="https://api.hyperliquid-testnet.xyz/info"});async function en(e={}){let t=Date.now();if(Ce.dexs&&t-Ce.at<6e4&&!e.fetchImpl)return Ce.dexs;let r=await Ee({type:"perpDexs"},e);return Ce={at:t,dexs:Array.isArray(r)?r:[]},Ce.dexs}async function tn(e="",t={}){let r=e||"",n=Date.now(),o=Qr.get(r);if(o&&n-o.at<3e4&&!t.fetchImpl)return o;let i=e?await Ee({type:"metaAndAssetCtxs",dex:e},t):await Zr(t),s=i?.[0]?.universe??i?.universe??[],l=Array.isArray(i?.[1])?i[1]:[],u={at:n,universe:s,ctxs:l};return Qr.set(r,u),u}function as(e){let t=String(e??"").trim();if(!t)return t;let r=t.toLowerCase().replace(/[\s._-]+/g,"");return ss[r]??t}function st(e){if(typeof e!="string"||!/^#(?:0|[1-9]\d*)$/.test(e))return null;let t=Number(e.slice(1));if(!Number.isSafeInteger(t)||t<0)return null;let r=t%10;if(r!==0&&r!==1)return null;let n=Math.floor(t/10),o=nn+t;return Number.isSafeInteger(o)?{encoding:t,outcome:n,side:r,coin:`#${t}`,assetId:o}:null}function rn(e,t){let r=zt(e),n=zt(t);if(r==null)throw new Error("hl-assets: outcome id must be a non-negative integer");if(n!==0&&n!==1)throw new Error("hl-assets: outcome side must be 0 or 1");let o=10*r+n;if(!Number.isSafeInteger(o))throw new Error("hl-assets: outcome encoding exceeds safe integer range");let i=nn+o;if(!Number.isSafeInteger(i))throw new Error("hl-assets: outcome asset id exceeds safe integer range");return{encoding:o,outcome:r,side:n,coin:`#${o}`,assetId:i}}function zt(e){if(typeof e=="number")return Number.isSafeInteger(e)&&e>=0?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)$/.test(e))return null;let t=Number(e);return Number.isSafeInteger(t)?t:null}async function Ft(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let d=e.coin==null?null:st(e.coin);if(e.coin!=null&&!d)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let a=e.outcome==null?null:rn(e.outcome,0).outcome;if(a!=null&&d&&d.outcome!==a)throw new Error("hl-assets: coin does not match outcome");let p=e.outcomeSide==null?null:cs(e.outcomeSide,"outcomeSide"),E=a??d?.outcome;if(e.outcome!=null&&e.coin==null&&p==null)throw new Error("hl-assets: outcomeSide required");let w=p??d?.side;if(w==null)throw new Error("hl-assets: outcomeSide required");if(E==null)throw new Error("hl-assets: outcome identity required");let S=rn(E,w);if(d&&(d.outcome!==S.outcome||d.side!==S.side))throw new Error("hl-assets: coin does not match outcome side");let I=e.szDecimals!=null?Number(e.szDecimals):2;return{kind:"outcome",coin:S.coin,assetId:S.assetId,encoding:S.encoding,outcome:S.outcome,side:S.side,szDecimals:I,maxLeverage:1,dex:null,markPx:null}}let r=String(e.coin||e.symbol||e.name||"").trim();if(!r)throw new Error("hl-assets: coin required");if(r.includes(":")){let[d,...a]=r.split(":"),p=a.join(":");if(!d||!p)throw new Error(`hl-assets: bad builder coin ${r}`);let E=as(d),w=await en(t),S=w.findIndex(R=>R&&R.name===E);if(S<1)throw new Error(`hl-assets: unknown builder dex "${d}"`);let{universe:I,ctxs:v}=await tn(E,t),L=I.findIndex(R=>R.name===`${E}:${p}`);if(L<0)throw new Error(`hl-assets: ${r} not in dex ${E} meta`);let T=I[L];if(T.isDelisted)throw new Error(`hl-assets: ${r} is delisted`);let M=is+S*1e4+L,b=v[L]||{};return{kind:"hip3",coin:T.name||r,assetId:M,szDecimals:T.szDecimals??0,maxLeverage:T.maxLeverage??null,dex:E,dexName:w[S]?.fullName||E,dexIndex:S,indexInMeta:L,markPx:b.markPx??null}}let{universe:n,ctxs:o}=await tn("",t),i=r.toUpperCase(),s=n.findIndex(d=>d.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let d=await en(t);for(let a=1;a<d.length;a++){let p=d[a];if(!p?.name)continue;let E=`${p.name}:${i}`;try{return await Ft({coin:E},t)}catch{}}}catch{}throw new Error(`hl-perps: ${i} is not a listed perp`)}let l=n[s];if(l.isDelisted)throw new Error(`hl-assets: ${i} is delisted`);let u=o[s]||{};return{kind:"main",coin:l.name,assetId:s,szDecimals:l.szDecimals??0,maxLeverage:l.maxLeverage??null,dex:"",markPx:u.markPx??null}}function cs(e,t){let r=zt(e);if(r!==0&&r!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return r}var nn,is,Ce,Qr,ss,Ut=X(()=>{Bt();nn=1e8,is=1e5,Ce={at:0,dexs:null},Qr=new Map;ss=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"})});import{createHash as ls,createHmac as ds,timingSafeEqual as Jc}from"node:crypto";function qt(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(qt).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${qt(e[r])}`).join(",")}}`}function on(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function sn(e=process.env){return on(process.env)||on(e)}function ms(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function hs(e){let t=ms(e);return ls("sha256").update(qt(t)).digest("hex")}function ws(e,t=sn()){return t?ds("sha256",t).update(String(e)).digest("hex"):""}function Kt(e,{provider:t,kind:r,env:n=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let l={...e,provider:e.provider||t,kind:e.kind||r,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!l.provider)throw new Error("stampPrepared: provider required");if(!l.kind)throw new Error("stampPrepared: kind required");let u=Number(o),d=i==null?u+fs:Number(i),a=d-u;if(!Number.isSafeInteger(u)||!Number.isSafeInteger(d)||a<=0||a>ps)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let E={...l,preparedAt:u,expiresAt:d,prepareVersion:us},w=hs(E),S=sn(n),I=S?ws(w,S):void 0,v={...E,prepareHash:w};return I&&(v.prepareMac=I),v}var us,fs,ps,an=X(()=>{us=2,fs=300*1e3,ps=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function Es(e,t){let r=e.toString().padStart(t+1,"0");if(t===0)return r;let n=r.slice(0,-t),o=r.slice(-t).replace(/0+$/,"");return o?`${n}.${o}`:n}function cn(e,t){let r=J(e,`hl: ${t}`);if(!/^\d+(?:\.\d+)?$/.test(r))throw new Error(`hl: ${t} must be a positive decimal`);let[n,o=""]=r.split("."),i=BigInt(n+o);if(i<=0n)throw new Error(`hl: ${t} must be positive`);return{raw:i,decimals:o.length}}function oe(e,t){if(e===null||typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`hl: ${t} must be finite JSON`);return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(n=>oe(n,t)).join(",")}]`;if(!e||typeof e!="object")throw new Error(`hl: ${t} must be structured JSON`);return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${oe(e[n],t)}`).join(",")}}`}function Ss(e){if(typeof e.orderType!="string"||!e.orderType)throw new Error("hl: order type must be a string");let t=e.orderType,r=e.orderWire;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: declared order wire required");if(t==="limit"){let i=r.limit?.tif;if(!["Gtc","Ioc","Alo"].includes(i)||oe(r,"declared order type")!==oe({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(oe(r,"declared order type")!==oe({limit:{tif:"Ioc"}},"expected order type"))throw new Error("hl: market order type must match its IOC wire shape");return}let n={stopMarket:{isMarket:!0,tpsl:"sl"},stopLimit:{isMarket:!1,tpsl:"sl"},takeProfitMarket:{isMarket:!0,tpsl:"tp"},takeProfitLimit:{isMarket:!1,tpsl:"tp"}}[t];if(!n)throw new Error("hl: unsupported declared order type");let o=r.trigger?.triggerPx;if(o==null||oe(r,"declared order type")!==oe({trigger:{isMarket:n.isMarket,triggerPx:o,tpsl:n.tpsl}},"expected order type"))throw new Error("hl: trigger order type must match its wire shape")}function ks(e,t,r){let n=cn(e.s,"signed size"),o=cn(e.p,"signed price"),i=n.decimals+o.decimals,s=n.raw*o.raw,l=Z(t.notionalUsd,i,"hl: notionalUsd");if(l<=0n||s!==l)throw new Error("hl: signed notional must match");let u=Z(r.maxNotionalUsd,i,"hl: maxNotionalUsd");if(s>u)throw new Error("hl: notional exceeds cap")}function As(e,t){let r=e.action.builder;if(r==null){if(e.builder!=null)throw new Error("hl: declared builder requires a signed builder");return}if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: signed order builder must be structured");let n=pe(r.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(n))throw new Error("hl: order builder address required");if(Mr(e.builder||"","hl: builder").toLowerCase()!==n)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(l=>String(l).toLowerCase()):[]).includes(n))throw new Error("hl: order builder not allowed");let i=Pt(r.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let s=Z(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>s)throw new Error("hl: order builder fee exceeds cap")}function ln(e,t,r){if(!Number.isSafeInteger(e.a)||e.a!==r)throw new Error("hl: signed asset must match assetId");if(typeof e.b!="boolean"||e.b!==(t.side==="buy"))throw new Error("hl: signed side must match exactly");if(J(e.s,"hl: signed size")!==J(t.size,"hl: size"))throw new Error("hl: signed size must match");if(J(e.p,"hl: signed price")!==J(t.price,"hl: price"))throw new Error("hl: signed price must match");if(typeof t.reduceOnly!="boolean"||typeof e.r!="boolean"||e.r!==t.reduceOnly)throw new Error("hl: signed reduceOnly must match exactly");if(oe(e.t,"signed order type")!==oe(t.orderWire,"declared order type"))throw new Error("hl: signed order type must match declared order type");let n=Object.prototype.hasOwnProperty.call(e,"c");if(t.clientOrderId==null){if(n)throw new Error("hl: undeclared signed client order id")}else if(!n||typeof e.c!="string"||e.c!==t.clientOrderId)throw new Error("hl: signed client order id must match")}function dn(e,t,r,n,o){if(!Number.isSafeInteger(e.a)||e.a!==r)throw new Error("hl: bracket protection asset must match");if(typeof e.b!="boolean"||e.b===(t.side==="buy"))throw new Error("hl: bracket protection side must oppose entry");if(J(e.s,"hl: bracket protection size")!==J(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(J(e.p,"hl: bracket protection price")!==J(n,"hl: protection price"))throw new Error("hl: bracket protection price must match");if(e.r!==!0)throw new Error("hl: bracket protection must be reduce-only");let i=e.t?.trigger;if(!i||i.isMarket!==!0||i.tpsl!==o)throw new Error("hl: bracket protection trigger must match");if(J(i.triggerPx,"hl: triggerPx")!==J(n,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function Ts(e){let t=String(e||"").replace(/\/$/,"");if(!gs.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function Gt(e){return st(e)!=null}function Os(e,t){let r=String(e||""),n=Array.isArray(t.coins)?t.coins.map(String):[];if(Gt(r)){if(t.hip4!==!0)throw new Error("hl: HIP-4 outcome orders are disabled without explicit policy enablement");if(n.includes(r)||n.includes("#*")||n.includes("*")||n.length===0)return!0;throw new Error("hl: outcome coin not allowed")}if(n.length&&!n.includes(r)&&!n.includes("*"))throw new Error("hl: coin not allowed");return!0}function Is(e,t,r){let n=Array.isArray(r.hlMarkets)?r.hlMarkets:[];if(n.length){if(!n.some(s=>{if(typeof s=="string"){let[l,u]=String(s).split(":");return l===e&&Number(u)===t}return String(s?.coin)===e&&Number(s?.assetId)===t}))throw new Error("hl: coin/assetId pair not allowed");return!0}if(Gt(e)){let i=Array.isArray(r.coins)?r.coins.map(String):[];if(i.includes("#*")||i.includes("*")||i.length===0)return!0;throw new Error("hl: restricted coin policy requires hlMarkets pairs")}let o=Array.isArray(r.coins)?r.coins.map(String):[];if(o.length&&!o.includes("*"))throw new Error("hl: restricted coin policy requires hlMarkets pairs");return!0}function un(e,t){if(e?.surface!=="hl")throw new Error("hl: surface hl required");let r=e.artifact;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: structured artifact required");let n=pe(r.kind,"kind",48),o=bs[n];if(!o)throw new Error("hl: unsupported Hyperliquid kind");if(e.action!==o)throw new Error("hl: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="hyperliquid")throw new Error("hl: destination must be hyperliquid");if(!/^0x[0-9a-fA-F]{40}$/.test(String(e.owner||"")))throw new Error("hl: owner required");let i=Ts(r.submitTo);if(Object.prototype.hasOwnProperty.call(r,"vaultAddress"))throw new Error("hl: vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(r,"expiresAfter"))throw new Error("hl: expiresAfter is not public");let s=Number(r.nonce);if(!Number.isSafeInteger(s)||s<=0)throw new Error("hl: nonce must be a positive integer");if(!r.action||typeof r.action!="object")throw new Error("hl: signed action required");if(Object.prototype.hasOwnProperty.call(r.action,"vaultAddress"))throw new Error("hl: action vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(r.action,"expiresAfter"))throw new Error("hl: action expiresAfter is not public");if(r.action.type!==xs[n])throw new Error("hl: action type must match kind");let l=r.notionalUsd??0;if(ys.has(n)||n==="perp-cancel"||n==="perp-leverage"||n==="perp-isolated-margin"){let u=pe(r.coin,"coin",64),d=r.assetId??r.assetIndex;if(!Number.isSafeInteger(d)||d<0)throw new Error("hl: assetId required");if(n==="hip4-order"||d>=1e8){let a=st(u);if(!a||a.coin!==u)throw new Error("hl: HIP-4 actions must use a canonical outcome coin");if(a.assetId!==d)throw new Error("hl: HIP-4 coin must bind to its canonical assetId")}if(Os(u,t),Is(u,d,t),n==="hip4-order"&&!Gt(u))throw new Error("hl: HIP-4 orders must use an outcome coin");if(n==="perp-order"||n==="hip3-order"||n==="hip4-order"||n==="perp-bracket"){if(r.side!=="buy"&&r.side!=="sell")throw new Error("hl: side must be buy or sell");if(r.action.type!=="order"||!Array.isArray(r.action.orders))throw new Error("hl: signed orders are required");Ss(r);let a=r.action.orders;if(n==="perp-bracket"){let p=r.takeProfitPx,E=r.stopLossPx,w=1+(p==null?0:1)+(E==null?0:1);if(w<2||a.length!==w||r.grouping!=="normalTpsl"||r.action.grouping!==r.grouping)throw new Error("hl: bracket must contain exactly the declared entry and protection legs");ln(a[0],r,d);let S=1;p!=null&&dn(a[S++],r,d,p,"tp"),E!=null&&dn(a[S],r,d,E,"sl")}else{if(a.length!==1)throw new Error("hl: exactly one signed order is required");if(r.grouping!=="na"||r.action.grouping!==r.grouping)throw new Error("hl: signed grouping must match declared grouping");ln(a[0],r,d)}ks(a[0],r,t),As(r,t),l=J(r.notionalUsd,"hl: notionalUsd")}if(n==="perp-leverage"){let a=r.leverage;if(!Number.isSafeInteger(a)||a<1)throw new Error("hl: leverage must be a positive integer");let p=t.maxLeverage==null?50:t.maxLeverage;if(typeof p!="number"||!Number.isSafeInteger(p)||p<1)throw new Error("hl: maxLeverage must be a positive integer");if(a>p)throw new Error("hl: leverage exceeds cap")}if(n==="perp-cancel"){let a=r.action.cancels;if(!Array.isArray(a)||a.length!==1)throw new Error("hl: exactly one cancel is required");if(!Number.isSafeInteger(a[0].a)||a[0].a!==d)throw new Error("hl: signed cancel asset must match assetId");if(!Number.isSafeInteger(r.orderId)||r.orderId<0)throw new Error("hl: declared order id required");if(!Number.isSafeInteger(a[0].o)||a[0].o!==r.orderId)throw new Error("hl: signed cancel order id must match")}if(n==="perp-leverage"){if(!Number.isSafeInteger(r.action.asset)||r.action.asset!==d)throw new Error("hl: signed leverage asset must match assetId");if(!Number.isSafeInteger(r.action.leverage)||r.action.leverage!==r.leverage)throw new Error("hl: signed leverage must match");if(!["cross","isolated"].includes(r.marginMode))throw new Error("hl: declared margin mode required");let a=r.marginMode==="cross";if(typeof r.action.isCross!="boolean"||r.action.isCross!==a)throw new Error("hl: signed isCross must match declared margin mode")}if(n==="perp-isolated-margin"){if(!Number.isSafeInteger(r.action.asset)||r.action.asset!==d)throw new Error("hl: signed margin asset must match assetId");let a=pe(r.usd,"margin usd",64),p=Z(a,6,"hl: margin usd");if(Pt(r.action.ntli,"hl: signed margin ntli")!==p)throw new Error("hl: signed margin amount must match usd");if(typeof r.isBuy!="boolean"||r.action.isBuy!==r.isBuy)throw new Error("hl: signed margin isBuy must match");let w=Z(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),S=p<0n?-p:p;if(S>w)throw new Error("hl: margin notional exceeds cap");l=Es(S,6)}}if(n==="builder-fee-approval"){let u=pe(r.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(u))throw new Error("hl: builder address required");if(pe(r.action.builder,"signed builder",42).toLowerCase()!==u)throw new Error("hl: signed builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(S=>String(S).toLowerCase()):[]).includes(u))throw new Error("hl: builder not allowed");let a=pe(r.maxFeeRate,"maxFeeRate",32);if(pe(r.action.maxFeeRate,"signed maxFeeRate",32)!==a)throw new Error("hl: signed builder fee must match");if(!/^\d+(?:\.\d+)?%$/.test(a))throw new Error("hl: builder fee rate must be a percent");let p=Z(a.slice(0,-1),12,"hl: builder fee percent"),E=Z(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(E<0n||p*100n>E)throw new Error("hl: builder fee exceeds cap");if(Number(r.action.nonce)!==s)throw new Error("hl: signed builder nonce must match");let w=i.includes("testnet")?"Testnet":"Mainnet";if(r.hyperliquidChain!==w||r.action.hyperliquidChain!==r.hyperliquidChain)throw new Error("hl: signed Hyperliquid chain must match destination");if(r.signatureChainId!=="0x66eee"||r.action.signatureChainId!==r.signatureChainId)throw new Error("hl: signed signature chain id must match")}if(n.startsWith("hype-stake")||n==="hype-delegate"||n==="hype-undelegate"){if(n==="hype-delegate"||n==="hype-undelegate"){let u=n==="hype-undelegate";if(typeof r.action.isUndelegate!="boolean"||r.action.isUndelegate!==u)throw new Error("hl: signed isUndelegate must match delegate kind exactly")}if(t.maxHypeWei!=null&&BigInt(String(r.action.wei??r.caps?.amountHype??"0"))>BigInt(t.maxHypeWei))throw new Error("hl: stake amount exceeds cap")}return Object.freeze({unit:"usd",value:String(l??r.action.wei??0),notional:String(l??0),fee:"0",kind:n,actionType:r.action.type,amount:String(r.action.wei??l??0),coin:r.coin||null,submitTo:i})}var gs,ys,bs,xs,pe,fn=X(()=>{et();Ut();gs=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),ys=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),bs=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),xs=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"}),pe=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`hl: bounded ${t} required`);return e}});function _s(e){let t=e.owner||e.user||e.from||e.recipient;if(!/^0x[0-9a-fA-F]{40}$/.test(String(t||"")))throw new Error("hl: owner/user address required for local-signer envelope");return String(t).toLowerCase()}function pn(e,t={},r={}){let n=String(e?.kind||""),o=vs[n];if(!o)throw new Error("hl: prepared kind is not a local-signer surface");if(!e?.action||typeof e.action!="object")throw new Error("hl: prepared action required");let i=Number(r.nowMs??Date.now()),s=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),l=String(e.submitTo||"").replace(/\/$/,""),u={version:1,surface:"hl",action:o,owner:_s(t),destination:"hyperliquid",tradeId:String(t.tradeId||`hl:${n}:${e.nonce}`),expiresAtMs:i+s,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:e.provider,artifact:{kind:n,coin:e.coin??null,assetId:e.assetId??e.assetIndex??null,side:e.side??null,size:e.size??null,price:e.price??null,reduceOnly:e.reduceOnly??null,orderType:e.orderType??null,orderWire:e.action?.orders?.[0]?.t??null,clientOrderId:e.action?.orders?.[0]?.c??null,grouping:e.action?.grouping??null,orderId:e.orderId??null,leverage:e.leverage??null,marginMode:e.marginMode??null,notionalUsd:e.notionalUsd??0,usd:e.usd??null,isBuy:e.isBuy??null,takeProfitPx:e.takeProfitPx??null,stopLossPx:e.stopLossPx??null,builder:e.builderFee?.address??e.action?.builder??null,maxFeeRate:e.builderFee?.percent??e.action?.maxFeeRate??null,nonce:e.nonce,hyperliquidChain:e.action?.hyperliquidChain??null,signatureChainId:e.signatureChainId||e.action?.signatureChainId||"0xa4b1",submitTo:l,action:e.action,typedData:e.typedData||null,caps:e.caps||null}};return un(u,{coins:t.coins||["*"],hip4:!0,maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,maxLeverage:t.maxLeverage??50,hlBuilders:t.hlBuilders||(e.builderFee?.address?[e.builderFee.address]:[]),maxBuilderFeeBps:t.maxBuilderFeeBps??e.builderFee?.bps}),u}var vs,mn=X(()=>{fn();vs=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"})});import{Contract as $s,JsonRpcProvider as Ps}from"ethers";function js(e){return Cs.test(String(e||""))}async function Jt(e,{contract:t=Ns,rpc:r=Ls,chainId:n=Rs,balanceOf:o}={}){if(!js(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new Ps(r,n,{staticNetwork:!0}),s=new $s(t,Ms,i);return BigInt(await s.balanceOf(e))}var Ns,Rs,Ls,Ms,Cs,Yt=X(()=>{Ns="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",Rs=999,Ls="https://rpc.hyperliquid.xyz/evm",Ms=["function balanceOf(address owner) view returns (uint256)"],Cs=/^0x[a-fA-F0-9]{40}$/});import{existsSync as Hs,readFileSync as Ds,lstatSync as Bs}from"node:fs";import{homedir as hn}from"node:os";import{join as Vt}from"node:path";function zs(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[wn])return String(e[wn]);let t=e.ORACLE_CONFIG_DIR||Vt(hn(),".config","oracle");return Vt(t,"fee-recipient")}return Vt(hn(),".config","oracle","fee-recipient")}function gn(e=process.env){try{let t=zs(e);if(!Hs(t)||Bs(t).isSymbolicLink())return"";let r=Ds(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}var sl,wn,yn=X(()=>{Yt();sl=Object.freeze({swap:5,bridge:5,perps:0,nft:0}),wn="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN"});var On={};Zn(On,{HL_BUILDER_ADDRESS_ENV:()=>at,HL_BUILDER_DEFAULT_FEE_BPS:()=>Fs,HL_BUILDER_FEE_ENV:()=>Xt,HL_BUILDER_FEE_TIERS:()=>je,HL_BUILDER_MAX_FEE_BPS:()=>Wt,HL_PERP_MAX_SIG_FIGS:()=>bn,HL_PERP_PRICE_DECIMALS:()=>xn,HL_SIGNATURE_CHAIN_ID:()=>ct,MARGIN_MODE:()=>He,ORDER_TYPES:()=>V,TIF:()=>De,formatPerpPrice:()=>le,formatPerpSize:()=>An,hlBuilderFeeBpsForKind:()=>kn,hlPerpAssetInfo:()=>Te,hlPrepareApproveAgent:()=>Ws,hlPrepareBracketOrder:()=>ea,hlPrepareBuilderApproval:()=>Vs,hlPrepareCancelOrder:()=>Xs,hlPreparePerpOrder:()=>Tn,hlPrepareUpdateIsolatedMargin:()=>Qs,hlPrepareUpdateLeverage:()=>Zs,resolveBuilderFee:()=>Qt});function En(e,t){if(typeof e=="number"){if(Number.isSafeInteger(e)&&e>=0)return e}else if(typeof e=="string"&&/^(?:0|[1-9]\d*)$/.test(e)){let r=Number(e);if(Number.isSafeInteger(r))return r}throw new Error(`hl-perps: ${t} must be a non-negative safe integer`)}function Us(e,t){let r=En(e,t);if(r<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return r}function qs(e={}){let t={...e};if(t.side==null)return t;if(t.side===0||t.side===1){if(t.outcomeSide!=null&&t.outcomeSide!==t.side)throw new Error("hl-perps: side conflict with outcomeSide");return t.outcomeSide=t.side,delete t.side,t}throw new Error("hl-assets: side must be 0 or 1")}function Sn(e,{defaultBuy:t=!1}={}){if(e.side!=null){if(typeof e.side!="string")throw new Error("hl-perps: side must be buy or sell");let r=e.side.toLowerCase();if(r!=="buy"&&r!=="sell")throw new Error("hl-perps: side must be buy or sell");let n=r==="buy";if(e.isBuy!=null&&(typeof e.isBuy!="boolean"||e.isBuy!==n))throw new Error("hl-perps: side and isBuy conflict");return n}if(e.isBuy==null&&t)return!0;if(typeof e.isBuy!="boolean")throw new Error("hl-perps: isBuy must be boolean when side is omitted");return e.isBuy}function kn(e="perp"){if(e==="perp"||e==="main")return je.perp;if(e==="spot")return je.spot;if(e==="hip3")return je.hip3;if(e==="outcome"||e==="hip4")return je.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function Qt({env:e=process.env,isHolder:t=!1,kind:r="perp"}={}){if(t)return null;let n=String(e?.[at]||"").trim().toLowerCase();if(!n)return null;if(!/^0x[a-f0-9]{40}$/.test(n))throw new Error(`hl-perps: ${at} must be an EVM address`);let o=gn(e);if(!o||o!==n)return null;let i=e?.[Xt],s=kn(r),l=i==null?s:Number(i);if(!Number.isFinite(l)||l<=0||Math.abs(l*10-Math.round(l*10))>1e-9)throw new Error(`hl-perps: ${Xt} must be a positive number in 0.1 bps increments`);if(l>Wt)throw new Error(`hl-perps: builder fee ${l} bps exceeds the ${Wt} bps cap`);if(l>s)throw new Error(`hl-perps: builder fee ${l} bps exceeds the ${s} bps product tier for ${r}`);let u=Math.round(l*10),d=(u/1e3).toFixed(3).replace(/0+$/,"").replace(/\.$/,"");return{wire:{b:n,f:u},disclosure:{address:n,bps:l,percent:`${d}%`}}}async function Ks(e,t={},r={}){if(!e)return{approved:!1,approvedFeeBps:0,status:"not-configured"};let n=String(t.user||r.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(n))return{approved:!1,approvedFeeBps:0,status:"wallet-required"};try{let o=Number(await Ee({type:"maxBuilderFee",user:n,builder:e.disclosure.address},r));return!Number.isInteger(o)||o<0?{approved:!1,approvedFeeBps:0,status:"invalid-response"}:{approved:o>=e.wire.f,approvedFeeBps:o/10,status:o>=e.wire.f?"approved":"insufficient"}}catch{return{approved:!1,approvedFeeBps:0,status:"unavailable"}}}async function Gs(e,t={},r={}){if(!e)return{exempt:!1,status:"not-configured"};let n=String(t.user||r.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(n))return{exempt:!1,status:"wallet-required"};try{let o=r.holderBalance||Jt;return BigInt(await o(n))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function er(e,t,{roundDown:r=null}={}){let n=typeof e=="number"?e.toFixed(Math.min(20,t+8)):e;if(typeof n!="string"||!/^-?\d+(\.\d+)?$/.test(n))throw new Error(`hl-perps: "${e}" is not a decimal number`);let o=n.startsWith("-"),[i,s=""]=n.replace(/^-/,"").split(".");if(s.length<=t){let S=s.replace(/0+$/,"");return(o?"-":"")+(S?`${i}.${S}`:i)}let l=s.slice(0,t),u=Number(s[t]),d=BigInt(i+l),a=s.slice(t).replace(/0+$/,"")!=="";r===!0||(r===!1?a&&(d+=1n):u>=5&&(d+=1n));let p=d.toString().padStart(t+1,"0"),w=(t===0?p:`${p.slice(0,-t)}.${p.slice(-t)}`).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,"");return(o?"-":"")+w}function Js(e,t,r={}){if(typeof e!="number"&&typeof e!="string")throw new Error(`hl-perps: "${e}" is not a decimal number`);let n=typeof e=="number"?String(e):e;if(!n.includes("."))return n;let o=Number(n);if(!Number.isFinite(o)||o===0)return n;let i=Math.floor(Math.log10(Math.abs(o))),s=Math.max(0,t-1-i);return er(n,s,r)}function le(e,t,r={}){let n=xn-Number(t??0);if(n<0)throw new Error("hl-perps: szDecimals out of range");return er(Js(e,bn,r),n,r)}function An(e,t){let r=er(e,Number(t??0));if(BigInt(r.split(".")[0])<0n)throw new Error("hl-perps: size must be positive");if(Number(r)<=0)throw new Error("hl-perps: size rounds to zero at this asset's precision");return r}function Ys(e,t){let r=(a,p)=>{let E=String(a).trim();if(!/^\d+(?:\.\d+)?$/.test(E))throw new Error(`hl-perps: ${p} must be a positive decimal`);let[w,S=""]=E.split(".");return{raw:BigInt(w+S),decimals:S.length}},n=r(e,"size"),o=r(t,"price"),i=n.raw*o.raw,s=n.decimals+o.decimals,l=i.toString().padStart(s+1,"0");if(s===0)return l;let u=l.slice(0,-s),d=l.slice(-s).replace(/0+$/,"");return d?`${u}.${d}`:u}async function Te(e={},t={}){let r=await Ft(e,t);return{coin:r.coin,assetId:r.assetId,szDecimals:r.szDecimals,maxLeverage:r.maxLeverage,markPx:r.markPx,kind:r.kind,dex:r.dex??null,dexName:r.dexName??null,outcome:r.outcome??null,side:r.side??null}}function Zt(e,{tif:t=De.GTC,triggerPx:r,isMarket:n,szDecimals:o}={}){switch(e){case V.LIMIT:return{limit:{tif:t}};case V.MARKET:return{limit:{tif:De.IOC}};case V.STOP_MARKET:case V.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:le(r,o),tpsl:e===V.STOP_MARKET?"sl":"tp"}};case V.STOP_LIMIT:case V.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:le(r,o),tpsl:e===V.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function Se(e,t,r={}){let n=r.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:ct,submitTo:n?"https://api.hyperliquid-testnet.xyz/exchange":"https://api.hyperliquid.xyz/exchange",note:"Sign locally via Oracle local-signer or a wallet. Hosted Oracle does not submit."}}function Oe(e,t={},r={}){let n={...e};try{n.localSignerEnvelope=pn(n,t,r),n.prepared=!0,n.signing="awaiting-hl-signer"}catch(o){n.prepared=!1,n.localSignerEnvelope=null,n.localSignerBlockedReason=String(o?.message||o).slice(0,200),n.signing="blocked"}return n.oraclePrepared=!!n.localSignerEnvelope,Kt(n,{provider:e.provider||"hl-perps",kind:e.kind})}function Vs(e={},t={}){let r=Qt({env:t.env});if(!r)throw new Error(`hl-perps: ${at} is required`);let n=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(n)||n<=0)throw new Error("hl-perps: nonce must be a positive integer");let o={type:"approveBuilderFee",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:ct,maxFeeRate:r.disclosure.percent,builder:r.disclosure.address,nonce:n};return Oe({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:r.disclosure,...Se(o,n,t)},e,t)}function Ws(e={},t={}){let r=String(e.agentAddress||e.agent||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error("hl-perps: agentAddress required");let n=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(n)||n<=0)throw new Error("hl-perps: nonce must be a positive integer");let o=String(e.agentName||"Oracle").slice(0,16),i={type:"approveAgent",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:ct,agentAddress:r.toLowerCase(),agentName:o,nonce:n};return Kt({provider:"hl-perps",venue:"hyperliquid",kind:"hl-approve-agent",unsigned:!0,broadcast:!1,agentAddress:r.toLowerCase(),agentName:o,...Se(i,n,t)},{provider:"hl-perps",kind:"hl-approve-agent",env:t.env})}async function Tn(e={},t={}){let r=await Te(e,t);if(e.type!=null&&(typeof e.type!="string"||!e.type))throw new Error("hl-perps: order type must be a string");let n=e.type??V.LIMIT;if(typeof n!="string"||!n)throw new Error("hl-perps: order type must be a string");let o=Sn(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,s=An(e.size??e.sz,r.szDecimals),l;if(n===V.MARKET){let T=Number(r.markPx);if(!Number.isFinite(T)){let j=await Xr(t);T=Number(j?.[r.coin]??j?.[String(r.assetId)]??NaN)}if(!Number.isFinite(T))throw new Error("hl-perps: no mark price available for a market order");let M=Number(e.maxSlippageBps??50);if(!Number.isInteger(M)||M<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(M>100)throw new Error(`hl-perps: maxSlippageBps ${M} exceeds the hard 100 bps cap`);let b=o?T*(1+M/1e4):T*(1-M/1e4);l=le(b,r.szDecimals,{roundDown:o});let R=Math.abs(Number(l)/T-1)*1e4;if(R>M+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${R.toFixed(2)} bps from mark, above the ${M} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");l=le(e.price??e.limitPx,r.szDecimals)}let u=Zt(n,{tif:e.tif??(n===V.MARKET?De.IOC:De.GTC),triggerPx:e.triggerPx,szDecimals:r.szDecimals}),d={a:r.assetId,b:o,p:l,s,r:i,t:u};if(e.clientOrderId!=null){if(typeof e.clientOrderId!="string"||!e.clientOrderId)throw new Error("hl-perps: clientOrderId must be a string");d.c=e.clientOrderId}if(e.grouping!=null&&(typeof e.grouping!="string"||!e.grouping))throw new Error("hl-perps: grouping must be a string");let a={type:"order",orders:[d],grouping:e.grouping??"na"},p=Qt({env:t.env,kind:r.kind}),E=await Gs(p,e,t),w=E.exempt?null:p,S=await Ks(w,e,t),I=S.approved?w:null;I&&(a.builder=I.wire);let v=Number(e.nonce??Date.now()),L=Ys(s,l);return Oe({provider:"hl-perps",venue:"hyperliquid",kind:r.kind==="outcome"?"hip4-order":r.kind==="hip3"?"hip3-order":"perp-order",coin:r.coin,assetId:r.assetId,assetKind:r.kind,outcome:r.outcome??null,outcomeSide:r.side??null,dex:r.dex??null,dexName:r.dexName??null,side:o?"buy":"sell",orderType:n,price:l,size:s,reduceOnly:i,notionalUsd:L,maxLeverage:r.maxLeverage,markPx:r.markPx,builderFee:I?.disclosure??null,holderExempt:E.exempt,holderVerificationStatus:E.status,builderApprovalRequired:w&&!I?{...p.disclosure,...S}:null,...Se(a,v,t)},e,t)}async function Xs(e={},t={}){let r=await Te(qs(e),t),n=e.orderId??e.oid;if(n==null)throw new Error("hl-perps: orderId required");let o=En(n,"orderId"),i={type:"cancel",cancels:[{a:r.assetId,o}]};return Oe({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:r.coin,assetId:r.assetId,orderId:o,...Se(i,Number(e.nonce??Date.now()),t)},e,t)}async function Zs(e={},t={}){let r=await Te(e,t),n=Us(e.leverage,"leverage");if(r.maxLeverage!=null&&n>r.maxLeverage)throw new Error(`hl-perps: ${r.coin} allows at most ${r.maxLeverage}x, requested ${n}x`);if(e.marginMode!=null&&typeof e.marginMode!="string")throw new Error("hl-perps: marginMode must be a string");let o=(e.marginMode||He.CROSS).toLowerCase();if(o!==He.CROSS&&o!==He.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:r.assetId,isCross:o===He.CROSS,leverage:n};return Oe({provider:"hl-perps",venue:"hyperliquid",kind:"perp-leverage",coin:r.coin,assetId:r.assetId,leverage:n,marginMode:o,maxLeverage:r.maxLeverage,liquidationWarning:n>=20?`${n}x liquidates on roughly a ${(100/n).toFixed(2)}% adverse move before fees`:null,...Se(i,Number(e.nonce??Date.now()),t)},e,t)}async function Qs(e={},t={}){let r=await Te(e,t),n=e.usd??e.amountUsd;if(n==null)throw new Error("hl-perps: usd amount required");if(typeof n!="number"&&typeof n!="string")throw new Error("hl-perps: usd must be a decimal number");let o=typeof n=="number"?String(n):n;if(!/^-?\d+(\.\d+)?$/.test(o))throw new Error("hl-perps: usd must be a decimal number");let i=Z(o,6,"hl-perps: usd"),s=Sn(e,{defaultBuy:!0}),l={type:"updateIsolatedMargin",asset:r.assetId,isBuy:s,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Oe({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:r.coin,assetId:r.assetId,isBuy:s,usd:o,...Se(l,Number(e.nonce??Date.now()),t)},e,t)}async function ea(e={},t={}){let r=await Tn(e,t),n=await Te(e,t),o=r.side==="buy",i=[r.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:n.assetId,b:!o,p:le(e.takeProfitPx,n.szDecimals),s:r.size,r:!0,t:Zt(V.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:n.szDecimals})}),e.stopLossPx!=null&&i.push({a:n.assetId,b:!o,p:le(e.stopLossPx,n.szDecimals),s:r.size,r:!0,t:Zt(V.STOP_MARKET,{triggerPx:e.stopLossPx,szDecimals:n.szDecimals})}),i.length===1)throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");let s={type:"order",orders:i,grouping:"normalTpsl",...r.action.builder?{builder:r.action.builder}:{}};return Oe({provider:"hl-perps",venue:"hyperliquid",kind:"perp-bracket",coin:n.coin,assetId:n.assetId,side:r.side,price:r.price,size:r.size,reduceOnly:r.reduceOnly,orderType:r.orderType,notionalUsd:r.notionalUsd,legs:i.length,entry:{side:r.side,price:r.price,size:r.size},takeProfitPx:e.takeProfitPx==null?null:le(e.takeProfitPx,n.szDecimals),stopLossPx:e.stopLossPx==null?null:le(e.stopLossPx,n.szDecimals),builderFee:r.builderFee,...Se(s,Number(e.nonce??Date.now()),t)},e,t)}var bn,xn,ct,Fs,Wt,at,Xt,je,V,De,He,In=X(()=>{Bt();Ut();et();an();mn();Yt();yn();bn=5,xn=6,ct="0x66eee",Fs=2,Wt=10,at="ORACLE_HL_BUILDER_ADDRESS",Xt="ORACLE_HL_BUILDER_FEE_BPS",je=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),V=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),De=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),He=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});var gt=Object.freeze(["draft","shadow","confirm","armed","autonomous","halted"]),Qn=Object.freeze([["TOTAL","Total crypto market cap, also called TOTAL1"],["TOTAL2","Crypto market cap excluding BTC"],["TOTAL3","Crypto market cap excluding BTC and ETH"],["OTHERS","Crypto market cap outside the largest tracked assets"],["BTC.D","Bitcoin market-cap dominance"],["ETH.D","Ether market-cap dominance"],["USDT.D","Tether market-cap dominance"]].map(([e,t])=>Object.freeze({id:e,description:t}))),eo=Object.freeze([["sma","Simple moving average"],["ema","Exponential moving average"],["rsi","Relative strength index"],["macd","Moving-average convergence divergence"],["bollinger","Bollinger bands"],["atr","Average true range"],["vwap","Volume-weighted average price"],["volume","Traded volume"],["cvd","Cumulative volume delta"],["funding","Perpetual funding rate"],["open-interest","Open interest and change"],["liquidations","Liquidation flow"],["basis","Perpetual-to-spot basis"]].map(([e,t])=>Object.freeze({id:e,description:t}))),to=Object.freeze([["relative-value","Long-short relative value basket"],["beta-neutral","Beta-balanced directional basket"],["spread-mean-reversion","Bounded spread mean reversion"],["funding-carry","Cross-market funding carry"]].map(([e,t])=>Object.freeze({id:e,description:t}))),_e=Object.freeze([["anthropic-oauth","oauth"],["openai-codex","oauth"],["xai-oauth","oauth"],["openrouter","api-key"],["openai","api-key"],["anthropic","api-key"],["xai","api-key"],["deepseek","api-key"],["gemini","api-key"],["kimi","api-key"],["mistral","api-key"],["nous","api-key"],["qwen","api-key"],["glm","api-key"],["local","local"],["ollama","local"]].map(([e,t])=>Object.freeze({id:e,auth:t}))),ro=[["market.scan","Read bounded market observations"],["market.breadth","Read TOTAL, TOTAL2, TOTAL3, OTHERS, and dominance evidence"],["perp.indicators","Calculate bounded price, volume, positioning, and derivatives signals"],["basket.construct","Construct an exact bounded multi-leg basket plan"],["basket.backtest","Backtest a bounded basket against supplied history"],["sentiment.read","Read cited public sentiment"],["wallet.watch","Observe public wallet activity"],["contract.read","Inspect public contract state"],["nft.inspect","Inspect public mint state"],["strategy.analyze","Analyze a strategy without executing it"],["strategy.backtest","Backtest against supplied history"],["risk.evaluate","Summarize a caller-supplied portfolio snapshot; does not fetch accounts or approve intents"],["intent.prepare","Prepare a non-executable intent"],["operator.handoff","Create an operator confirmation handoff"]],$e=Object.freeze(ro.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),no=[["hyperliquid-markets","Research Hyperliquid market evidence"],["crypto-market-breadth","Analyze crypto market breadth and dominance evidence"],["perp-technical-analysis","Analyze bounded perpetual technical and positioning signals"],["perp-strategy-planning","Plan bounded perpetual strategies"],["basket-trading","Construct exact non-atomic multi-leg basket plans"],["relative-value-risk","Evaluate per-leg and aggregate relative-value risk"],["armed-local-routing","Route an approved exact plan to the local operator boundary"],["social-sentiment","Score cited public sentiment"],["wallet-monitoring","Analyze public wallet activity"],["contract-research","Research public contract state"],["mint-research","Research public mint state"],["bounded-strategy-analysis","Analyze bounded strategy evidence"],["bounded-backtesting","Backtest against supplied history"],["bounded-risk","Evaluate evidence against fixed policy"],["prepare-only-execution","Prepare an operator confirmation handoff"]],Pe=Object.freeze(no.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),oo=Object.freeze({autonomousOptIn:!1,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:100,maxDailyLossUsd:10,chainAllowlist:Object.freeze(["ethereum"]),expiresAt:41024448e5});function ge({id:e,name:t,scannerName:r,scannerTool:n,scannerSkill:o,scannerArtifact:i,chainAllowlist:s}){return Object.freeze({id:e,name:t,mode:"draft",agents:Object.freeze([Object.freeze({id:"scanner",name:r,role:"scanner",runtime:"deterministic",soul:"Collect bounded public evidence with source times.",toolIds:Object.freeze([n]),skillIds:Object.freeze([o])}),Object.freeze({id:"sentiment",name:"Grok Sentiment",role:"sentiment",runtime:"model",provider:"xai",model:"grok-4.6",soul:"Score narrative direction and cite every claim.",toolIds:Object.freeze(["sentiment.read"]),skillIds:Object.freeze(["social-sentiment"])}),Object.freeze({id:"strategy",name:"Strategy Analyst",role:"strategy",runtime:"model",provider:"openai",model:"gpt-5.6-sol",soul:"Produce a falsifiable thesis from typed evidence.",toolIds:Object.freeze(["strategy.analyze"]),skillIds:Object.freeze(["bounded-strategy-analysis"])}),Object.freeze({id:"risk",name:"Risk Gate",role:"risk",runtime:"policy",soul:"Enforce every cap exactly and reject unsupported intent.",toolIds:Object.freeze(["risk.evaluate"]),skillIds:Object.freeze(["bounded-risk"])}),Object.freeze({id:"executor",name:"Executor",role:"executor",runtime:"operator",soul:"Prepare an exact operator handoff. Never sign or broadcast.",toolIds:Object.freeze(["intent.prepare","operator.handoff"]),skillIds:Object.freeze(["prepare-only-execution"])})]),edges:Object.freeze([Object.freeze({from:"scanner",to:"sentiment",artifactKind:i}),Object.freeze({from:"sentiment",to:"strategy",artifactKind:"scored-thesis"}),Object.freeze({from:"strategy",to:"risk",artifactKind:"strategy-analysis"}),Object.freeze({from:"risk",to:"executor",artifactKind:"approved-intent"})]),policy:Object.freeze({...oo,chainAllowlist:Object.freeze(s)})})}var io=Object.freeze([ge({id:"hyperliquid-alpha",name:"Hyperliquid Alpha",scannerName:"Market Scanner",scannerTool:"market.scan",scannerSkill:"hyperliquid-markets",scannerArtifact:"market-evidence",chainAllowlist:["hyperliquid"]}),ge({id:"perp-market-breadth",name:"Perp Market Breadth",scannerName:"Breadth Scanner",scannerTool:"market.breadth",scannerSkill:"crypto-market-breadth",scannerArtifact:"breadth-evidence",chainAllowlist:["hyperliquid"]}),ge({id:"perp-technical-strategy",name:"Perp Technical Strategy",scannerName:"Perp Technical Scanner",scannerTool:"perp.indicators",scannerSkill:"perp-technical-analysis",scannerArtifact:"technical-evidence",chainAllowlist:["hyperliquid"]}),ge({id:"basket-relative-value",name:"Basket Relative Value",scannerName:"Basket Constructor",scannerTool:"basket.construct",scannerSkill:"basket-trading",scannerArtifact:"basket-evidence",chainAllowlist:["hyperliquid"]}),ge({id:"wallet-watch",name:"Wallet Watch",scannerName:"Wallet Monitor",scannerTool:"wallet.watch",scannerSkill:"wallet-monitoring",scannerArtifact:"wallet-flow",chainAllowlist:["ethereum","base"]}),ge({id:"evm-launch-radar",name:"EVM Launch Radar",scannerName:"Launch Scanner",scannerTool:"contract.read",scannerSkill:"contract-research",scannerArtifact:"contract-evidence",chainAllowlist:["ethereum","base","arbitrum"]}),ge({id:"nft-mint-guard",name:"NFT Mint Guard",scannerName:"Mint Scanner",scannerTool:"nft.inspect",scannerSkill:"mint-research",scannerArtifact:"mint-evidence",chainAllowlist:["ethereum","base"]})]);import{createHash as Co}from"node:crypto";import{randomBytes as yo}from"node:crypto";import{wordlists as so}from"ethers";var ao=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),co=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],lo=new Set([12,15,18,21,24]);function uo(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return lo.has(t.length)&&t.every(r=>so.en.getWordIndex(r)>=0)}var fo=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,po=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,mo=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function ho(e){let t=hr(e);return mo.has(t)||po.test(t)}var Ne=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function hr(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function wo(e){let t=hr(e);return[...ao].some(r=>t.includes(r))}function go(e,t,r){if(typeof t=="string"){if(co.some(n=>n.test(t))||uo(t))throw new Ne(r);if(fo.test(t)&&!ho(e))throw new Ne(r)}}function yt(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return go(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>yt(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(wo(o))throw new Ne(i);e[o]!==void 0&&(n[o]=yt(e[o],i,o))}return n}function Ke(e){return yt(e)}var bo=/^ses-[0-9a-f]{32}$/,xo=/^(?:sign|broadcast|execute|transaction\.execute|wallet\.sign)$/i,Eo=/sign|broadcast|execute/i,So="team-history-truncated",wr=`
3
- [Message content truncated for durable storage.]`,ko=200,Ao=512*1024,To=64*1024,Oo=48*1024;function B(e){return String(e??"").trim()}function Io(e){return B(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function bt(e){return Buffer.byteLength(JSON.stringify(e),"utf8")}function vo(e,t){let r=String(e??"");if(Buffer.byteLength(r,"utf8")<=t)return r;let n=0,o=r.length;for(;n<o;){let s=Math.ceil((n+o)/2);Buffer.byteLength(r.slice(0,s),"utf8")<=t?n=s:o=s-1}let i=r.slice(0,n);return new RegExp("\\p{Surrogate}$","u").test(i)&&(i=i.slice(0,-1)),i}function _o(e){let t=B(e?.text),r=Math.max(0,Oo-Buffer.byteLength(wr,"utf8")),n=Buffer.byteLength(t,"utf8")>r,o=Array.isArray(e?.artifacts)?e.artifacts:[],i=e?.generator&&typeof e.generator=="object"&&!Array.isArray(e.generator)?{kind:B(e.generator.kind).slice(0,80),provider:B(e.generator.provider).slice(0,120),model:B(e.generator.model).slice(0,160)}:void 0;return{id:B(e?.id).slice(0,200)||"message-compacted",sender:B(e?.sender).slice(0,200)||"system",name:B(e?.name).slice(0,200)||"Oracle",text:`${vo(t,r)}${wr}`,state:B(e?.state).slice(0,80)||"complete",createdAt:B(e?.createdAt).slice(0,80),artifacts:[],...e?.fallback===!0?{fallback:!0}:{},...e?.offline===!0?{offline:!0}:{},...i?{generator:i}:{},contentTruncated:!0,...o.length?{omittedArtifacts:o.length}:{},...!n&&o.length?{artifactPayloadTruncated:!0}:{}}}function $o(e){let t=structuredClone(e);return bt(t)<=To?t:_o(t)}function Po(e){let t=0,r="";for(let n of e){if(n?.historyTruncated!==!0)continue;let o=Number(n.omittedMessages);Number.isSafeInteger(o)&&o>0&&(t+=o),r||(r=B(n.createdAt))}return{omittedMessages:t,createdAt:r}}function No(e,t){return{id:So,sender:"system",name:"Oracle",text:`[Earlier team history omitted: ${e} ${e===1?"message":"messages"} pruned for durable storage.]`,state:"complete",createdAt:B(t),artifacts:[],historyTruncated:!0,omittedMessages:e}}function Ge(e,t={}){if(!e||typeof e!="object"||!Array.isArray(e.messages))throw new TypeError("Invalid team thread state");let r=Number.isSafeInteger(t.maxMessages)&&t.maxMessages>0?t.maxMessages:ko,n=Number.isSafeInteger(t.maxBytes)&&t.maxBytes>0?t.maxBytes:Ao,o=Po(e.messages),i=o.omittedMessages,s=e.messages.filter(a=>a?.historyTruncated!==!0).map($o),l=Number.isSafeInteger(t.dropOldest)&&t.dropOldest>0?Math.min(t.dropOldest,s.length):0;if(l>0&&(s=s.slice(l),i+=l),s.length>r){let a=s.length-r;s=s.slice(a),i+=a}let u=()=>({...e,messages:[...i>0?[No(i,o.createdAt||s[0]?.createdAt)]:[],...s]});for(;s.length>0&&bt(u())>n;)s=s.slice(1),i+=1;let d=u();if(bt(d)>n)throw new Error("team thread metadata exceeds durable size budget");return d}function yr(e,t){let r=Number.isSafeInteger(t)&&t>0?t:0;return Ge(e,{dropOldest:r})}function gr(e,t){return e.slice(t.length).trim()}function xt(e=yo(16)){let t=Buffer.from(e).toString("hex");if(!/^[0-9a-f]{32}$/.test(t))throw new TypeError("Team session entropy must be exactly 16 bytes");return`ses-${t}`}function Je(e){return bo.test(String(e??""))}function Ro({text:e,agents:t,leadAgentId:r}){let n=B(e);if(!n)throw new TypeError("Message is required");if(!Array.isArray(t)||t.length===0)throw new TypeError("Group needs at least one agent");let o=n.match(/^@(team|all)(?:\s+|$)/i);if(o)return{kind:"broadcast",targetAgentIds:t.map(s=>s.id),text:gr(n,o[0])};if(n.startsWith("@")){let l=t.flatMap(d=>[{agent:d,mention:`@${B(d.id)}`},{agent:d,mention:`@${B(d.name)}`},{agent:d,mention:`@${Io(d.name)}`}]).sort((d,a)=>a.mention.length-d.mention.length).find(({mention:d})=>{let a=n.slice(0,d.length),p=n.at(d.length);return a.toLowerCase()===d.toLowerCase()&&(!p||/\s|[:,]/.test(p))});if(!l)throw new TypeError("Unknown agent mention");let u=gr(n,l.mention).replace(/^[:,]\s*/,"");return{kind:"mention",targetAgentIds:[l.agent.id],text:u}}return{kind:"lead",targetAgentIds:[(t.find(s=>s.id===r)??t[0]).id],text:n}}function Lo(e,t=[]){let r=B(e?.provider);return r?new Set(t.map(o=>B(o))).has(r)?{status:"online"}:{status:"offline",reason:`${r} is not connected`}:{status:"online"}}function Mo(e){Ke(e);let t=B(e?.type),r=Array.isArray(e?.actions)?e.actions:[];if(xo.test(t)||r.some(n=>Eo.test(B(n?.type))))throw new TypeError("Chat cannot sign, broadcast, or execute")}function Re(e,t,r,n="complete"){return{id:B(e.id)||`message-${Date.now()}`,sender:t,name:r,text:B(e.text),state:n,createdAt:B(e.createdAt)||new Date().toISOString(),artifacts:[]}}function Et(e,t){if(Mo(t),!e||!Je(e.sessionId)||!Array.isArray(e.messages))throw new TypeError("Invalid team thread state");let r=[...e.messages];if(t.type==="message.user")r.push(Re(t,"user","You"));else if(t.type==="message.system")r.push(Re(t,"system","Oracle"));else if(t.type==="agent.offline"){let n=Re(t,B(t.agentId),B(t.name)||B(t.agentId),"offline");n.offline=!0;let o=r.findIndex(i=>i.id===t.id&&i.sender===t.agentId);o>=0?r.splice(o,1,n):r.push(n)}else if(t.type==="agent.started")r.push(Re(t,B(t.agentId),B(t.name)||B(t.agentId),"thinking"));else if(t.type==="agent.output"){let n=r.findIndex(i=>i.id===t.id&&i.sender===t.agentId),o=Re(t,B(t.agentId),B(t.name)||B(t.agentId));o.fallback=t.generator?.kind==="rules",o.generator=t.generator?{...t.generator}:void 0,o.artifacts=t.artifact?[{...t.artifact}]:[],n>=0?r.splice(n,1,o):r.push(o)}else if(t.type==="artifact.prepared"){let n=r.findIndex(o=>o.id===t.messageId);if(n<0)throw new TypeError("Artifact target message was not found");r[n]={...r[n],artifacts:[...r[n].artifacts,{...t.artifact}]}}else throw new TypeError(`Unsupported team thread event: ${t.type}`);return Ge({...e,messages:r})}var St=2e3,jo=/^[a-z0-9][a-z0-9._-]{0,63}$/,Ho=/^#[0-9a-fA-F]{6}$/,Do=new Set(["deterministic","model","policy","operator"]),Bo=new Set($e.map(({id:e})=>e)),zo=new Set(Pe.map(({id:e})=>e)),Fo=new Set(_e.map(({id:e})=>e)),Uo=/^p-[a-z0-9][a-z0-9_-]{0,62}$/,qo=["secret","privatekey","seed","seedphrase","mnemonic","password","passphrase","credential","apikey","apitoken","accesstoken","authtoken","authorization","signingmaterial","walletexport","keymaterial"],Ye=/(?:\bshell\b|terminal|raw[ _.-]?http|\bmcp\b|private[ _.-]?key|seed[ _.-]?phrase|mnemonic|key[ _.-]?(?:import|export)|wallet[ _.-]?(?:key|custody)|\bcustod(?:y|ial)\b|\bsign(?:ing|er)?\b|\bbroadcast(?:ing)?\b|(?:execute|place)[ _.-]?(?:transaction|trade|order|swap)s?|submit[ _.-]?transactions?|transfer[ _.-]?(?:funds|assets|tokens|coins)|hold[ _.-]?(?:keys|funds|assets)|ignore (?:the )?policy|bypass|widen (?:the )?(?:cap|policy)|reveal (?:credential|secret))/i,Ko=Object.freeze(["market-evidence","breadth-evidence","technical-evidence","basket-evidence","wallet-flow","contract-evidence","mint-evidence","scored-thesis","strategy-analysis","risk-decision","approved-intent","prepared-intent","prepared-basket","receipt"]),Go=new Set(Ko);function $(e){throw new TypeError(e)}function Le(e,t){(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&$(`${t} must be a plain object`)}function Jo(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function br(e){let t=Jo(e);return t==="auth"||qo.some(r=>t.includes(r))}function kt(e,t="team",r=new Set){if(e&&typeof e=="object"){r.has(e)&&$(`unsafe cyclic field at ${t}`),r.add(e);for(let[n,o]of Object.entries(e))br(n)&&$(`forbidden secret-like field ${t}.${n}`),kt(o,`${t}.${n}`,r);r.delete(e)}}function C(e){return e===null||typeof e=="string"||typeof e=="boolean"?e:typeof e=="number"?(Number.isFinite(e)||$("value must be finite"),e):Array.isArray(e)?e.map(C):(Le(e,"value"),Object.fromEntries(Object.keys(e).sort().map(t=>(br(t)&&$(`forbidden secret-like field ${t}`),[t,C(e[t])]))))}function se(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))se(t);Object.freeze(e)}return e}function Ae(e){return Co("sha256").update(JSON.stringify(C(e))).digest("hex")}function ue(e,t,r=500){return(typeof e!="string"||!e.trim()||e.length>r)&&$(`${t} is invalid`),e}function ee(e,t){return ue(e,t,64),jo.test(e)||$(`${t} is invalid`),e}function Yo(e){return(typeof e!="string"||!Ho.test(e))&&$("agent color is invalid"),e}function Vo(e){let t=String.raw`(?:sign(?:ing)?|broadcast(?:ing)?|(?:execute|place|submit|transfer|hold|assume)\b[^.!?\n]*?\b(?:transactions?|trades?|orders?|swaps?|funds|assets|tokens|coins|keys|custody))`,r=e.replace(new RegExp(String.raw`\b(?:never|do not|don't|cannot|can't|must not|may not)\s+(?:directly\s+)?${t}(?:\s+or\s+${t})?`,"gi"),"");return Ye.test(r)||new RegExp(String.raw`\b${t}\b`,"i").test(r)}function We(e){return typeof e=="string"&&Uo.test(e)&&!Ye.test(e)}function At(e){return ee(e,"artifact kind"),Go.has(e)||$(`artifact kind ${e} is not allowed`),e}function Ve(e,{nowMs:t=Date.now(),mode:r="shadow"}={}){Le(e,"policy"),kt(e,"policy");let n=["autonomousOptIn","requiresWalletConfirmation","killSwitchRequired"];for(let i of n)typeof e[i]!="boolean"&&$(`policy.${i} must be boolean`);(!e.requiresWalletConfirmation||!e.killSwitchRequired)&&$("unsafe policy: wallet confirmation and kill switch are required");for(let i of["maxNotionalUsd","maxDailyLossUsd"])(!Number.isFinite(e[i])||e[i]<=0)&&$(`policy.${i} must be a positive finite cap`);(!Array.isArray(e.chainAllowlist)||!e.chainAllowlist.length)&&$("policy.chainAllowlist must be bounded");let o=e.chainAllowlist.map(i=>ee(i,"chain id"));return new Set(o).size!==o.length&&$("duplicate chain id"),(!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=t)&&$("policy expiry must be in the future"),r==="autonomous"&&!e.autonomousOptIn&&$("autonomous mode requires explicit opt-in"),{autonomousOptIn:e.autonomousOptIn,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:e.maxNotionalUsd,maxDailyLossUsd:e.maxDailyLossUsd,chainAllowlist:o,expiresAt:e.expiresAt}}function Xe(e,{nowMs:t=Date.now()}={}){Le(e,"team"),kt(e);let r=e.kind===void 0?"pipeline":e.kind;r!=="pipeline"&&r!=="group"&&$("unsupported team kind");let n=r==="group";ee(e.id,"team id"),ue(e.name,"team name",120),gt.includes(e.mode)||$("unsupported team mode"),(!Array.isArray(e.agents)||!e.agents.length)&&$("agents must be non-empty");let o=new Set,i=e.agents.map((b,R)=>{Le(b,`agent ${R}`);let j=ee(b.id,"agent id");o.has(j)&&$(`duplicate agent id ${j}`),o.add(j),ue(b.name,"agent name",120);let O=n?ue(b.role,"agent role",120):ee(b.role,"agent role"),P=n&&b.color!==void 0?Yo(b.color):void 0;Do.has(b.runtime)||$("invalid agent runtime");let F=ue(b.soul,"agent Soul",St);Vo(F)&&$("unsafe Soul authority"),(!Array.isArray(b.toolIds)||!Array.isArray(b.skillIds))&&$("tool and skill IDs must be arrays");let H=b.toolIds.map(m=>(ee(m,"tool id"),(!Bo.has(m)||Ye.test(m))&&$(`forbidden tool ${m}`),m)),c=b.skillIds.map(m=>(ee(m,"skill id"),(!zo.has(m)&&!We(m)||Ye.test(m))&&$(`forbidden skill ${m}`),m));(new Set(H).size!==H.length||new Set(c).size!==c.length)&&$("duplicate tool or skill ID");let f=b.runtime==="model";return f?(ue(b.provider,"model provider",100),Fo.has(b.provider)||$("unsupported model provider"),ue(b.model,"model",160)):(b.provider!==void 0||b.model!==void 0)&&$("provider/model only allowed for model runtime"),!n&&b.role==="executor"&&b.runtime!=="operator"&&$("executor must use operator runtime"),!n&&b.runtime==="operator"&&b.role!=="executor"&&$("operator runtime is reserved for the executor"),n&&b.runtime==="operator"&&$("group chat agents cannot use operator runtime"),b.role!=="executor"&&H.some(m=>m==="intent.prepare"||m==="operator.handoff")&&$("executor tools require operator authority"),n&&(H.includes("intent.prepare")||H.includes("operator.handoff"))&&$("group chat agents cannot prepare operator actions"),{id:j,name:b.name,role:O,runtime:b.runtime,...f?{provider:b.provider,model:b.model}:{},soul:F,toolIds:H,skillIds:c,...P?{color:P}:{},...n&&b.packId!==void 0?{packId:ee(b.packId,"pack id")}:{},...n?{autoTools:b.autoTools!==!1}:{}}});if(n){(!Array.isArray(e.edges)||e.edges.length!==0)&&$("group chat edges must be empty");let b=ue(e.summary||"A focused agent group.","team summary",500),R=e.sessionId===void 0?xt():e.sessionId;Je(R)||$("group session id must use ses-hex format");let j=e.leadAgentId===void 0?i[0].id:ee(e.leadAgentId,"lead agent id");o.has(j)||$("lead agent is not a group member");let O=Ve(e.policy,{nowMs:t,mode:e.mode}),P=C({kind:"group",id:e.id,sessionId:R,name:e.name,summary:b,mode:e.mode,leadAgentId:j,agents:i,edges:[],policy:O});return se({team:P,teamHash:Ae(P),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}let s=i.filter(b=>b.role==="executor");s.length!==1&&$("exactly one executor operator is required");let l=s[0];(!l.toolIds.includes("intent.prepare")||!l.toolIds.includes("operator.handoff"))&&$("executor requires prepare-only handoff tools"),Array.isArray(e.edges)||$("edges must be an array");let u=new Set,d=new Map([...o].map(b=>[b,[]])),a=e.edges.map(b=>{Le(b,"edge"),ee(b.from,"edge source"),ee(b.to,"edge target");let R=At(b.artifactKind);(!o.has(b.from)||!o.has(b.to))&&$("broken edge references unknown agent"),b.from===b.to&&$("cycle in team DAG");let j=`${b.from}\0${b.to}\0${R}`;return u.has(j)&&$("duplicate edge"),u.add(j),d.get(b.from).push(b.to),{from:b.from,to:b.to,artifactKind:R}}),p=new Set,E=new Set;function w(b){if(p.has(b)&&$("cycle in team DAG"),!E.has(b)){p.add(b);for(let R of d.get(b))w(R);p.delete(b),E.add(b)}}for(let b of o)w(b);d.get(l.id).length&&$("executor must be the terminal team agent");let S=b=>{let R=[b],j=new Set;for(;R.length;){let O=R.shift();if(O===l.id)return!0;j.has(O)||(j.add(O),R.push(...d.get(O)))}return!1};for(let b of o)S(b)||$(`agent ${b} is disconnected from executor`);let I=i.filter(b=>!a.some(R=>R.to===b.id));I.length!==1&&$("team pipeline requires exactly one root agent");for(let b of i){let R=a.filter(O=>O.to===b.id).length,j=a.filter(O=>O.from===b.id).length;(b.id===I[0].id?R!==0:R!==1)&&$("team pipeline requires exactly one incoming handoff per non-root agent"),(b.id===l.id?j!==0:j!==1)&&$("team pipeline requires exactly one outgoing handoff per non-executor agent")}let v=a.filter(b=>b.to===l.id);(v.length!==1||v[0].artifactKind!=="approved-intent")&&$("executor requires exactly one approved-intent input"),i.find(b=>b.id===v[0].from)?.runtime!=="policy"&&$("executor input must come from a policy agent");let T=Ve(e.policy,{nowMs:t,mode:e.mode}),M=C({id:e.id,name:e.name,mode:e.mode,agents:i,edges:a,policy:T});return se({team:M,teamHash:Ae(M),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}var Er=new Set($e.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/intent\.prepare|operator\.handoff|sign|broadcast|execute/i.test(e))),Sr=new Set(Pe.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/armed|execution|sign|broadcast/i.test(e))),Wo=Object.freeze([Object.freeze({pattern:/sentiment|social|narrative|realtime|news/i,toolIds:["sentiment.read"],skillIds:["social-sentiment"]}),Object.freeze({pattern:/risk|review|policy|cap|exposure/i,toolIds:["risk.evaluate"],skillIds:["bounded-risk"]}),Object.freeze({pattern:/wallet|flow|holder/i,toolIds:["wallet.watch"],skillIds:["wallet-monitoring"]}),Object.freeze({pattern:/contract|token|evm|bytecode/i,toolIds:["contract.read"],skillIds:["contract-research"]}),Object.freeze({pattern:/nft|mint|collection/i,toolIds:["nft.inspect"],skillIds:["mint-research"]}),Object.freeze({pattern:/basket|relative.?value|spread/i,toolIds:["basket.construct","basket.backtest"],skillIds:["basket-trading","relative-value-risk"]}),Object.freeze({pattern:/perp|technical|funding|open interest|\boi\b|rsi|macd/i,toolIds:["perp.indicators"],skillIds:["perp-technical-analysis","perp-strategy-planning"]}),Object.freeze({pattern:/breadth|dominance|total2|total3/i,toolIds:["market.breadth"],skillIds:["crypto-market-breadth"]}),Object.freeze({pattern:/backtest|simulation/i,toolIds:["strategy.backtest"],skillIds:["bounded-backtesting"]}),Object.freeze({pattern:/plan|planner|strategy|thesis|analyst/i,toolIds:["strategy.analyze"],skillIds:["bounded-strategy-analysis"]}),Object.freeze({pattern:/research|reader|market|scan/i,toolIds:["market.scan"],skillIds:["hyperliquid-markets"]})]),Ze=Object.freeze({toolIds:Object.freeze(["market.scan"]),skillIds:Object.freeze(["hyperliquid-markets"])});function xr(e,t){return[...new Set(e)].filter(r=>t.has(r))}function Tt({role:e="",soul:t=""}={}){let r=`${String(e)} ${String(t)}`.trim(),n=Wo.filter(s=>s.pattern.test(r));if(n.length===0)return{toolIds:[...Ze.toolIds],skillIds:[...Ze.skillIds]};let o=xr(n.flatMap(s=>s.toolIds),Er),i=xr(n.flatMap(s=>s.skillIds),Sr);return{toolIds:o.length>0?o:[...Ze.toolIds],skillIds:i.length>0?i:[...Ze.skillIds]}}function Xo(e){return Er.has(e)||Sr.has(e)}import G from"node:fs";import Q from"node:path";import{createHash as vr}from"node:crypto";import re from"node:fs";import ye from"node:path";var Ot="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",Zo=/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?:\.[a-z0-9]+(?:[._-][a-z0-9]+)*)*$/;function Qe(e){try{let t=re.lstatSync(e);return t.isDirectory()&&!t.isSymbolicLink()}catch{return!1}}function Qo(){return re.constants.O_NOFOLLOW||0}function It(e){try{let t=re.lstatSync(e);return t.isFile()&&!t.isSymbolicLink()}catch{return!1}}function kr(e){if(!It(e))return null;let t=re.openSync(e,re.constants.O_RDONLY|Qo());try{return re.readFileSync(t,"utf8")}finally{re.closeSync(t)}}function ei(e){let t=[],r=[];if(!e||typeof e!="object"||Array.isArray(e))return t.push("plugin.json must be a JSON object"),{valid:!1,errors:t,warnings:r};e.$schema!==Ot&&(e.$schema?t.push(`unsupported $schema: ${e.$schema} (expected ${Ot})`):t.push("$schema is required \u2014 must be "+Ot)),!e.name||typeof e.name!="string"?t.push("name is required (string)"):Zo.test(e.name)||t.push(`name "${e.name}" must be kebab-case dot-separated (e.g. deployment.tools)`),(e.version===void 0||e.version===null||e.version==="")&&r.push("version is missing \u2014 semantic versioning recommended"),e.description!==void 0&&typeof e.description!="string"&&r.push("description must be a string"),e.author!==void 0&&(typeof e.author!="object"||Array.isArray(e.author))&&r.push("author must be an object with optional name, email, url"),e.keywords!==void 0&&(Array.isArray(e.keywords)||r.push("keywords must be an array")),e.license!==void 0&&typeof e.license!="string"&&r.push("license must be a string");let n=new Set(["$schema","name","version","description","author","homepage","repository","license","keywords","extensions"]);for(let o of Object.keys(e))n.has(o)||r.push(`unknown field "${o}" \u2014 will be ignored (use extensions.<namespace> for client data)`);return{valid:t.length===0,errors:t,warnings:r}}function ti(e){let t=ye.join(e,"skills"),r=[];if(!Qe(t))return r;function n(o,i=""){for(let s of re.readdirSync(o,{withFileTypes:!0})){let l=ye.join(o,s.name);if(s.isDirectory()){if(!Qe(l))continue;n(l,i?`${i}/${s.name}`:s.name)}else if(s.name.endsWith(".md")){if(!It(l))continue;let u=i?`${i}/${s.name.replace(/\.md$/,"")}`:s.name.replace(/\.md$/,"");r.push({name:u,path:l,relativePath:ye.relative(t,l)})}}}return n(t),r}function ri(e){let t=ye.join(e,"mcp"),r=[];if(!Qe(t))return r;for(let n of re.readdirSync(t,{withFileTypes:!0})){if(!n.isFile()||!n.name.endsWith(".json"))continue;let o=ye.join(t,n.name);if(It(o))try{let i=kr(o);if(i===null)continue;let s=JSON.parse(i);r.push({name:n.name.replace(/\.json$/,""),path:o,config:s})}catch(i){r.push({name:n.name.replace(/\.json$/,""),path:o,error:`invalid JSON: ${i.message}`})}}return r}function vt(e){let t=ye.resolve(e);if(!Qe(t))return{ok:!1,error:`plugin directory not found: ${t}`};let r=ye.join(t,"plugin.json");if(!re.existsSync(r))return{ok:!1,error:`missing plugin.json in ${t}`};let n;try{let l=kr(r);if(l===null)return{ok:!1,error:`plugin.json must be a regular file in ${t}`};n=JSON.parse(l)}catch(l){return{ok:!1,error:`invalid plugin.json: ${l.message}`}}let o=ei(n);if(!o.valid)return{ok:!1,error:"manifest validation failed",errors:o.errors};let i=ti(t),s=ri(t);return{ok:!0,plugin:{name:n.name,version:n.version||"0.0.0",description:n.description||"",author:n.author||{},license:n.license||"UNLICENSED",root:t,manifest:n,skills:i,mcpServers:s,warnings:[...o.warnings]}}}var ni=Object.freeze([{name:"private key (hex 64)",re:/\b(?:0x)?[0-9a-fA-F]{64}\b/},{name:"BTC WIF",re:/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{name:"BIP39 seed phrase",re:/\b(?:[a-z]{3,8} ){11}(?:[a-z]{3,8})\b|\b(?:[a-z]{3,8} ){23}(?:[a-z]{3,8})\b/i},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"OpenAI key",re:/\bsk-[A-Za-z0-9_-]{20,}\b/},{name:"Anthropic key",re:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/},{name:"GitHub token",re:/\bgh[pousr]_[A-Za-z0-9]{36,}\b/},{name:"Slack token",re:/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/},{name:"Telegram bot token",re:/\b\d{8,10}:[A-Za-z0-9_-]{35}\b/},{name:"PEM private key",re:/-----BEGIN (?:RSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/},{name:"Solana keypair array",re:/\[\s*(?:\d{1,3}\s*,\s*){63}\d{1,3}\s*\]/},{name:"credential assignment",re:/\b(?:API_?KEY|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED_?PHRASE|AUTH_?TOKEN|ACCESS_?TOKEN)\s*[:=]\s*['"]?[A-Za-z0-9+/=_.-]{12,}/i},{name:"JWT",re:/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/}]),oi=/\b(?:seed|mnemonic|recovery|phrase|backup)\b/i;function Ar(e){let t=String(e??"");if(!t)return null;for(let r of ni){let n=t.match(r.re);if(n&&!(r.name==="BIP39 seed phrase"&&!oi.test(t))){if(r.name==="private key (hex 64)"){let o=n.index||0,i=t.slice(Math.max(0,o-80),o);if(!/priv|secret|wif|seed|mnemonic|signer|wallet|key/i.test(i)||/hash|digest|sha256|txid|commit|blob|sha1/i.test(i))continue}return{name:r.name,index:n.index??0}}}return null}import Tr from"node:path";import{homedir as ii}from"node:os";var si=/^[a-z0-9][a-z0-9_-]{0,63}$/;var hc=64*1024;function ai(e=process.env){return e&&e.ORACLE_CONFIG_DIR||Tr.join(ii(),".config","oracle")}function Or(e=process.env){return Tr.join(ai(e),"plugins")}function Ir(e,t){let r=String(e||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32),n=String(t||"").toLowerCase().replace(/\.md$/i,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,24);if(!r||!n)return null;let o=`p-${r}-${n}`.slice(0,64);return si.test(o)?o:null}var ci=new Set(_e.map(({id:e})=>e)),li=16,di=200,ui=64*1024,fi=new Set(["bash","sh","zsh","fish","cmd","cmd.exe","powershell","pwsh"]),pi=/(?:^|\/)\.(?:env|ssh|gnupg)(?:$|\/)|(?:^|\/)(?:id_rsa|id_ed25519|wallet\.json|keys\.json)(?:$|\.)/i;function z(e){let t=new TypeError(e);throw t.code="ORACLE_TEAM_PACK_REFUSED",t}function ne(e){return typeof e=="string"?e.trim():""}function Pr(e){let t=ne(e);return t?!!(/^(https?:|git@|ssh:|file:|[\\/]{2})/i.test(t)||/\.git(?:$|[?#])/i.test(t)):!1}function mi(e,t){let r=new Set((t||[]).map(s=>String(s))),n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,48)||"pack",o=n,i=2;for(;r.has(o);)o=`${n}-${i}`,i+=1;return o}function Nr(e){let t=[],r=[e];for(;r.length;){let n=r.pop(),o;try{o=G.readdirSync(n,{withFileTypes:!0})}catch{z("pack directory is unreadable")}for(let i of o){let s=Q.join(n,i.name);if((i.isSymbolicLink()||G.lstatSync(s).isSymbolicLink())&&z("pack cannot contain symbolic links"),i.isDirectory()){r.push(s);continue}i.isFile()&&(t.push(s),t.length>di&&z("pack has too many files"))}}return t}function Rr(e){let t=G.lstatSync(e,{bigint:!0});(t.isSymbolicLink()||!t.isFile())&&z("pack files must be regular files");let r=G.openSync(e,G.constants.O_RDONLY|(G.constants.O_NOFOLLOW||0));try{let n=G.fstatSync(r,{bigint:!0});return(n.dev!==t.dev||n.ino!==t.ino)&&z("pack file changed while opening; retry the import"),(!n.isFile()||n.nlink!==1n)&&z("pack files must be regular files"),{fd:r,size:n.size}}catch(n){throw G.closeSync(r),n}}function _r(e){let{fd:t,size:r}=Rr(e);try{return r>BigInt(ui)?null:G.readFileSync(t)}finally{G.closeSync(t)}}function _t(e){let t=Nr(e).map(o=>({file:o,relative:Q.relative(e,o).split(Q.sep).join("/")})).sort((o,i)=>o.relative<i.relative?-1:o.relative>i.relative?1:0),r=vr("sha256"),n=Buffer.alloc(64*1024);for(let{file:o,relative:i}of t){let{fd:s}=Rr(o);try{let l=vr("sha256"),u;for(;(u=G.readSync(s,n,0,n.length,null))>0;)l.update(n.subarray(0,u));r.update(JSON.stringify([i,l.digest("hex")]))}finally{G.closeSync(s)}}return r.digest("hex")}function $r(e,t){let r=Buffer.isBuffer(e)?e.toString("utf8"):String(e||""),n=Ar(r);n&&z(`pack ${t} contains ${n.name}`)}function hi(e){let t=ne(e).replace(/\\/g,"/");return Q.basename(t).toLowerCase()}function wi(e){e?.error&&z(`pack connector ${e.name||"unknown"} is invalid JSON`);let t=e?.config;(!t||typeof t!="object"||Array.isArray(t))&&z("pack connector config is invalid"),(t.url||t.headers||t.oauth||t.token)&&z("pack connectors cannot ship URLs, headers, or tokens"),t.env&&typeof t.env=="object"&&Object.keys(t.env).length&&z("pack connectors cannot ship env secrets; Oracle spawns them empty");let r=ne(t.command);r||z("pack connector is missing a command"),fi.has(hi(r))&&z("pack connectors cannot spawn a shell")}function gi(e,t){let r=String(t||"").match(/^description:\s*(.+)$/m);return r?r[1].trim().slice(0,160):(String(t||"").split(`
4
- `)[0].replace(/^#+\s*/,"").trim()||e).slice(0,160)}function yi({description:e,name:t,playbooks:r}){let n=[ne(e)||`Imported pack ${t}.`,r.length?`Playbooks: ${r.map(o=>o.summary).join("; ")}.`:"","Cite sources and state when required data is unavailable. Never sign or broadcast."].filter(Boolean).join(" ");return n.length>St&&z("pack copy is too long"),n}function bi(e,t=Q){let r=ne(e);r||z("pack path is required"),Pr(r)&&z("private packs are local folders, not git clones");let n=t.resolve(r),o;try{o=G.lstatSync(n)}catch{z("pack directory not found")}return o.isSymbolicLink()&&z("pack cannot be a symbolic link"),o.isDirectory()||z("pack path must be a directory"),n}function Lr(e){return String(e||"").replace(/\//g,"-")}function $t(e={}){let t=bi(e.root||e.path),r=Nr(t);for(let u of r){let d=Q.relative(t,u);pi.test(d)&&z(`pack cannot include ${d}`)}let n=_t(t);for(let u of r){let d=Q.relative(t,u),a=_r(u);a&&/\.(md|json|txt|mjs|js|ts|yml|yaml)$/i.test(u)&&$r(a,d)}let o=vt(t);o.ok||z(o.error||"invalid plugin.json");let i=o.plugin;for(let u of i.mcpServers||[])wi(u);let s=[];for(let u of i.skills||[]){if(s.length>=li)break;let d=Ir(i.name,u?.name||u?.relativePath);if(!d||!We(d))continue;let a=u?.path?_r(u.path):null,p=a?a.toString("utf8"):"",E=gi(d,p);$r(E,d),s.push({id:d,summary:E})}let l=yi({description:i.description,name:i.name,playbooks:s});return _t(t)!==n&&z("pack content changed during scanning; retry the import"),{name:i.name,version:i.version||"0.0.0",description:i.description||"",contentHash:n,root:t,playbooks:s,connectorCount:(i.mcpServers||[]).length,soul:l}}function xi(e,t={}){let r=t.pluginsDir||Or(t.env||process.env);G.mkdirSync(r,{recursive:!0});let n=Lr(e.name),o=Q.join(r,n),i=Q.resolve(o),s=Q.resolve(e.root);if(G.existsSync(i)){let d;try{d=G.lstatSync(i)}catch{z(`plugin "${n}" already installed and unreadable`)}(d.isSymbolicLink()||!d.isDirectory())&&z(`plugin "${n}" already installed at an unsafe path`);let a=vt(i);return a.ok||z(`plugin "${n}" already installed but invalid; remove it first`),(a.plugin.name!==e.name||a.plugin.version!==e.version)&&z(`plugin "${n}" already installed at v${a.plugin.version}; remove it first to import v${e.version}`),_t(i)!==e.contentHash&&z(`plugin "${n}" already installed with different content; remove it first to import this pack`),i}let l=G.mkdtempSync(Q.join(r,".team-pack-")),u=Q.join(l,"pack");try{G.cpSync(s,u,{recursive:!0,dereference:!1}),$t({path:u}).contentHash!==e.contentHash&&z("pack content changed during installation; retry the import"),G.renameSync(u,i)}finally{G.rmSync(l,{recursive:!0,force:!0})}return i}function Ei(e={}){let t=$t(e),r=ne(e.provider),n=ne(e.model);ci.has(r)||z("unsupported model provider"),(!n||n.length>160)&&z("model is invalid"),e.install!==!1&&xi(t,e);let o=Tt({role:ne(e.role)||t.description||t.name,soul:t.soul}),i=[...new Set([...t.playbooks.map(u=>u.id),...o.skillIds])],s=ne(e.name)||t.name,l=ne(e.role)||t.description||"Imported pack";return{preview:t,agent:{id:mi(s,e.existingAgentIds||[]),name:s.slice(0,120),role:l.slice(0,120),runtime:"model",provider:r,model:n,soul:t.soul,toolIds:o.toolIds,skillIds:i,trigger:"Mention",cadence:"On message",autoTools:!0,packId:Lr(t.name).slice(0,64)}}}et();import{createHash as ta}from"node:crypto";var ra=new Set(["coin","side","notionalUsd","leverage","orderType","price","maxSlippageBps"]);function me(e,t="notionalUsd"){if(typeof e!="number"&&typeof e!="string")throw new TypeError(`${t} must use exact USD cents`);let r=String(e).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""),n=Z(r,2,t);if(n<=0n||n>BigInt(Number.MAX_SAFE_INTEGER))throw new TypeError(`${t} must be positive exact USD cents`);return n}function vn(e){if(!e||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError("orderRequest must be a structured object");for(let t of Object.keys(e))if(!ra.has(t))throw new TypeError(`orderRequest.${t} is not allowed`);if(typeof e.coin!="string"||!/^[A-Z0-9][A-Z0-9._-]{0,63}$/.test(e.coin))throw new TypeError("orderRequest.coin must be a perp symbol");if(!["buy","sell"].includes(e.side))throw new TypeError("orderRequest.side must be buy or sell");if(me(e.notionalUsd),!Number.isSafeInteger(e.leverage)||e.leverage<1)throw new TypeError("orderRequest.leverage must be a positive integer");if(!["market","limit"].includes(e.orderType))throw new TypeError("orderRequest.orderType must be market or limit");if(e.orderType==="limit"){if(typeof e.price!="number"&&typeof e.price!="string"||!/^(?:\d+)(?:\.\d+)?$/.test(String(e.price))||Number(e.price)<=0)throw new TypeError("limit order requires a positive price")}else if(e.price!==void 0)throw new TypeError("market order cannot specify price");if(e.maxSlippageBps!==void 0&&(!Number.isSafeInteger(e.maxSlippageBps)||e.maxSlippageBps<0||e.maxSlippageBps>100))throw new TypeError("maxSlippageBps must be an integer from 0 to 100");return e}async function tr({request:e,policy:t,owner:r,nowMs:n=Date.now(),expiresAt:o,deps:i={}}){vn(e);let{formatPerpSize:s,hlPerpAssetInfo:l,hlPreparePerpOrder:u,hlPrepareUpdateLeverage:d}=await Promise.resolve().then(()=>(In(),On));if(!/^0x[0-9a-fA-F]{40}$/.test(String(r||"")))throw new Error("owner wallet address is not configured");if(!Number.isSafeInteger(n)||!Number.isSafeInteger(o)||o<=n||o>n+6e4||o>t.expiresAt)throw new Error("intent expiry must fit the handoff TTL");let a=i.nonce??n;if(!Number.isSafeInteger(a)||a<=0||!Number.isSafeInteger(a+1))throw new Error("intent nonce is invalid");if(typeof i.runId!="string"||!i.runId)throw new Error("intent runId is required");let p=await(i.hlPerpAssetInfo??l)({coin:e.coin});if(p.kind!=="perp"&&p.kind!=="main")throw new Error("Team execution requires a perpetual asset");if(p.coin!==e.coin||!Number.isSafeInteger(p.maxLeverage)||e.leverage>p.maxLeverage)throw new Error("orderRequest.leverage exceeds asset maxLeverage");let E=e.orderType==="limit"?e.price:p.markPx,w=Z(E,18,"order price");if(w<=0n)throw new Error("order price must be positive");let I=(me(e.notionalUsd)*10n**34n/w).toString().padStart(19,"0"),v=s(`${I.slice(0,-18)}.${I.slice(-18)}`,p.szDecimals),L=`0x${ta("sha256").update(`${i.runId}|${p.coin}|${a}`).digest("hex").slice(0,32)}`,T={coin:p.coin,owner:r,user:r,ttlMs:o-n,maxLeverage:p.maxLeverage},M={nowMs:n},b=await(i.hlPrepareUpdateLeverage??d)({...T,leverage:e.leverage,marginMode:"isolated",nonce:a},M),R=await(i.hlPreparePerpOrder??u)({...T,side:e.side,size:v,type:e.orderType,...e.orderType==="limit"?{price:e.price}:{},maxSlippageBps:e.maxSlippageBps??50,slippageBps:e.maxSlippageBps??50,clientOrderId:L,reduceOnly:!1,nonce:a+1},M);if(!b.localSignerEnvelope||!R.localSignerEnvelope)throw new Error("Oracle could not prepare the local signer artifacts");let j=[R.size,R.price].map(h=>{let[y,x=""]=String(h).split(".");return{raw:BigInt(y+x),decimals:x.length}}),O=j[0].decimals+j[1].decimals,P=(j[0].raw*j[1].raw).toString().padStart(O+1,"0"),F=O?`${P.slice(0,-O)}.${P.slice(-O)}`:P,H=me(F,"formatted order notionalUsd");if(me(R.notionalUsd)!==H)throw new Error("prepared order notional mismatch");for(let h of[b,R])delete h.localSignerEnvelope.artifact.signatureChainId;let c=Number(H)/100,f=BigInt(e.leverage),m=(H+f-1n)/f,g=Number(m)/100;if(me(c)!==H||me(g)!==m)throw new Error("intent amounts exceed exact USD cents precision");return{chainId:"hyperliquid",intentType:"perp",notionalUsd:c,maxLossUsd:g,executionPlan:{atomic:!1,partialFillRiskAcknowledged:!1,legs:[{role:"leverage",market:p.coin,side:e.side,notionalUsd:0,weightBps:0,artifact:b.localSignerEnvelope},{role:"order",market:p.coin,side:e.side,notionalUsd:c,weightBps:1e4,artifact:R.localSignerEnvelope}]}}}var na=/^[a-z0-9][a-z0-9._:-]{0,127}$/i,oa=/^[0-9a-f]{64}$/,ia=/^evidence:sha256:[0-9a-f]{64}$/,sa=new Set(["approved-intent","prepared-intent","prepared-basket"]),aa=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),ca=/^[A-Za-z0-9@:_./-]{1,64}$/;function lt(e,t){if(typeof e!="string"||!na.test(e))throw new TypeError(`${t} is invalid`);return e}function la(e,t){if(typeof e!="string"||!oa.test(e))throw new TypeError(`${t} is invalid`);return e}function dt(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`${t} must be a plain object`)}function _n(e,t,r){for(let n of Object.keys(e))if(!t.has(n))throw new TypeError(`${r}.${n} is not allowed`)}function he(e,t,{allowZero:r=!1}={}){if(!Number.isFinite(e)||(r?e<0:e<=0))throw new TypeError(`${t} must be ${r?"non-negative":"positive"}`);let n=e*100;if(!Number.isSafeInteger(Math.round(n))||Math.abs(n-Math.round(n))>1e-8)throw new TypeError(`${t} must use exact USD cents`);return Math.round(n)}function da(e,t,{nowMs:r,expiresAt:n}){if(dt(e,"basket leg artifact"),e.version!==1)throw new TypeError("basket leg artifact must be version 1");if(e.surface!=="hl")throw new TypeError("basket leg artifact surface must be hl");if(e.action!=="order"||e.destination!=="hyperliquid")throw new TypeError("basket leg artifact must be a Hyperliquid order");if(!Number.isSafeInteger(e.expiresAtMs)||e.expiresAtMs<=r||e.expiresAtMs>n)throw new TypeError("basket leg artifact expiry must fit the handoff TTL");if(dt(e.artifact,"basket leg artifact payload"),!aa.has(e.artifact.kind))throw new TypeError("basket leg artifact kind is not an order");if(e.artifact.coin!==t.market)throw new TypeError("basket leg artifact market mismatch");if(e.artifact.side!==t.side)throw new TypeError("basket leg artifact side mismatch");if(me(e.artifact.notionalUsd,"basket leg artifact notional")!==BigInt(he(t.notionalUsd,"basket leg notional")))throw new TypeError("basket leg artifact notional mismatch")}function ua(e,t,r){let n=e.executionPlan;if(n===void 0){if(r.mode==="armed")throw new TypeError("armed intent requires an exact execution plan");return}if(e.chainId!=="hyperliquid")throw new TypeError("armed execution plans require the Hyperliquid chain");if(e.intentType!=="perp"&&e.intentType!=="basket")throw new TypeError("intentType must be perp or basket");if(dt(n,"executionPlan"),_n(n,new Set(["atomic","partialFillRiskAcknowledged","legs"]),"executionPlan"),n.atomic!==!1)throw new TypeError("basket and perp plans must be explicitly non-atomic");if(!Array.isArray(n.legs))throw new TypeError("executionPlan.legs must be an array");let o=2,i=e.intentType==="basket"?12:2;if(n.legs.length<o||n.legs.length>i)throw new TypeError(`${e.intentType} execution plan requires ${o}-${i} legs`);if(e.intentType==="basket"&&n.partialFillRiskAcknowledged!==!0)throw new TypeError("basket partial-fill risk must be acknowledged");if(e.intentType==="perp"&&typeof n.partialFillRiskAcknowledged!="boolean")throw new TypeError("perp partial-fill risk acknowledgement must be boolean");let s=new Set;if(e.intentType==="perp"){let[d,a]=n.legs;if(d.role!=="leverage"||a.role!=="order")throw new TypeError("perp requires isolated leverage followed by one order");let p=d.artifact,E=p?.artifact;if(p?.version!==1||p.surface!=="hl"||p.action!=="leverage"||p.destination!=="hyperliquid"||E?.kind!=="perp-leverage"||E.marginMode!=="isolated"||E.action?.type!=="updateLeverage"||E.action.isCross!==!1||!Number.isSafeInteger(E.leverage)||E.leverage<1||E.action.leverage!==E.leverage||E.action.asset!==E.assetId||E.assetId!==a.artifact?.artifact?.assetId||E.coin!==a.market||d.market!==a.market||d.side!==a.side||p.owner!==a.artifact?.owner)throw new TypeError("perp leverage artifact must bind isolated leverage to the order");if(!Number.isSafeInteger(p.expiresAtMs)||p.expiresAtMs<=r.nowMs||p.expiresAtMs>r.expiresAt)throw new TypeError("leverage artifact expiry must fit the handoff TTL");let w=a.artifact?.artifact;if(w?.kind!=="perp-order"||!["market","limit"].includes(w.orderType)||w.action?.orders?.length!==1)throw new TypeError("perp requires exactly one market or limit order");let S=BigInt(he(e.notionalUsd,"intent notional")),I=BigInt(E.leverage);if(BigInt(he(e.maxLossUsd,"intent max loss"))!==(S+I-1n)/I)throw new TypeError("maxLossUsd must equal isolated margin rounded up to cents")}let l=0,u=0;for(let[d,a]of n.legs.entries()){if(dt(a,`executionPlan.legs[${d}]`),_n(a,new Set(["role","market","side","notionalUsd","weightBps","artifact"]),`executionPlan.legs[${d}]`),typeof a.market!="string"||!ca.test(a.market))throw new TypeError("basket leg market is invalid");if(a.role==="leverage"&&e.intentType==="perp"&&d===0){if(a.notionalUsd!==0||a.weightBps!==0)throw new TypeError("leverage leg carries no notional or weight");continue}if(a.role!==void 0&&a.role!=="order")throw new TypeError("invalid order leg role");if(s.has(a.market))throw new TypeError(`duplicate basket market ${a.market}`);if(s.add(a.market),a.side!=="buy"&&a.side!=="sell")throw new TypeError("basket leg side must be buy or sell");if(l+=he(a.notionalUsd,"basket leg notional"),!Number.isSafeInteger(a.weightBps)||a.weightBps<=0||a.weightBps>1e4)throw new TypeError("basket leg weight must be positive basis points");u+=a.weightBps,da(a.artifact,a,r)}if(u!==1e4)throw new TypeError("basket leg weights must sum to 10000 bps");if(l!==he(e.notionalUsd,"intent notional"))throw new TypeError("basket aggregate notional must equal the exact leg sum");if(l>he(t.maxNotionalUsd,"policy maxNotionalUsd"))throw new TypeError("basket aggregate notional exceeds policy cap")}function rr(e,t,r){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("intent payload must be an object");if(typeof e.chainId!="string"||!t.chainAllowlist.includes(e.chainId))throw new TypeError("intent chain is outside policy allowlist");if(!Number.isFinite(e.notionalUsd)||e.notionalUsd<=0||e.notionalUsd>t.maxNotionalUsd)throw new TypeError("intent notional exceeds policy cap");if(!Number.isFinite(e.maxLossUsd)||e.maxLossUsd<0||e.maxLossUsd>t.maxDailyLossUsd)throw new TypeError("intent loss exceeds policy cap");he(e.notionalUsd,"intent notional"),he(e.maxLossUsd,"intent max loss",{allowZero:!0}),ua(e,t,r)}function nr(e,{compiled:t}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("handoff must be an object");if(!t?.team||typeof t.teamHash!="string")throw new TypeError("compiled team snapshot is required");let r=e.nowMs??Date.now();if(!Number.isSafeInteger(r))throw new TypeError("nowMs is invalid");if(!Number.isSafeInteger(e.ttlMs)||e.ttlMs<=0||e.ttlMs>6e4)throw new TypeError("TTL must be bounded to 60 seconds");let n=lt(e.teamId,"teamId"),o=la(e.teamHash,"teamHash");if(t.team.id!==n||t.teamHash!==o)throw new TypeError("handoff team snapshot mismatch");let i=lt(e.sourceAgentId,"sourceAgentId"),s=lt(e.targetAgentId,"targetAgentId"),l=At(e.artifactKind);if(!t.team.edges.some(w=>w.from===i&&w.to===s&&w.artifactKind===l))throw new TypeError("handoff does not match compiled team edge");if(!Array.isArray(e.evidenceRefs)||!e.evidenceRefs.length)throw new TypeError("evidenceRefs must be non-empty");let u=e.evidenceRefs.map(w=>{if(typeof w!="string"||!ia.test(w))throw new TypeError("evidence reference must be a SHA-256 content hash");return w});if(new Set(u).size!==u.length)throw new TypeError("duplicate evidence reference");let d=C(e.payload),a=Ve(t.team.policy,{nowMs:r,mode:t.team.mode}),p=r+e.ttlMs;if(p>a.expiresAt)throw new TypeError("handoff TTL exceeds policy expiry");sa.has(l)&&rr(d,a,{mode:t.team.mode,nowMs:r,expiresAt:p});let E={teamId:n,teamHash:o,runId:lt(e.runId,"runId"),sourceAgentId:i,targetAgentId:s,artifactKind:l,payload:d,payloadHash:Ae(d),evidenceRefs:u,ttlMs:e.ttlMs,issuedAt:r,expiresAt:p,policy:a,policyHash:Ae(a)};return se(C({...E,handoffHash:Ae(E),executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}))}import{createHash as $n,randomUUID as pa}from"node:crypto";var fa=["chain-allowlist","notional-cap","loss-cap"];function or({evidence:e,intent:t}={}){return{kind:"risk-decision",status:"unknown",liveData:"unavailable",observedAt:null,chainId:null,notionalUsd:null,maxLossUsd:null,executionAllowed:!1,reason:"Trusted runtime observation provenance is unavailable",prompt:typeof e?.prompt=="string"?e.prompt:typeof t?.prompt=="string"?t.prompt:"",riskChecks:fa.map(n=>({check:n,pass:!1,status:"unknown"}))}}function ir({intent:e,policy:t,nowMs:r}){let n=[{check:"chain-allowlist",pass:t.chainAllowlist.includes(e.chainId)},{check:"notional-cap",pass:e.notionalUsd>0&&e.notionalUsd<=t.maxNotionalUsd},{check:"loss-cap",pass:e.maxLossUsd>0&&e.maxLossUsd<=t.maxDailyLossUsd}];return{kind:"risk-decision",status:"measured",source:"oracle-builder",chainId:e.chainId,notionalUsd:e.notionalUsd,maxLossUsd:e.maxLossUsd,executionAllowed:n.every(o=>o.pass),riskChecks:n,observedAt:r}}function Pn(e,t,r){let n=$n("sha256").update(JSON.stringify(t)).digest("hex");return`sha256:${$n("sha256").update(`${e}\0${n}\0${r}`).digest("hex")}`}function ma(e){return{...C({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:!1}),consumedHandoffHashes:[...e.consumedHandoffHashes]}}function ha(e){return{...C(e),consumedHandoffHashes:new Set(e?.consumedHandoffHashes||[]),confirmationPending:!1}}function sr(e){return{...C({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:e.confirmationPending}),consumedHandoffHashes:new Set(e.consumedHandoffHashes)}}var Ln=new Set(["approved-intent","prepared-intent","prepared-basket"]),wa=Object.freeze(["executionAllowed","verified","trusted","status","riskChecks","observedAt","liveData","policy","policyHash","evidenceRefs","handoffHash","signed","broadcast","backendSigner","signingReady","broadcastReady","requiresOperatorConfirmation"]);function de(e,t,r){if(r>=t.compiled.team.policy.expiresAt)throw e.status="expired",e.updatedAt=r,new Error("team policy expired")}function Nn(e,t){if(Ln.has(e)&&!(!t||typeof t!="object"||Array.isArray(t))){if(Object.hasOwn(t,"kind")||"kind"in t)throw new TypeError("intent payload kind is not an intent artifact");for(let r of wa)if(Object.hasOwn(t,r)||r in t)throw new TypeError("intent payload cannot carry authority or provenance claims")}}function ar(e,t){if(!e)throw new TypeError("step must consume the exact prior handoff");if(t<e.issuedAt)throw new Error("prior handoff is not yet valid");if(t>=e.expiresAt)throw new Error("prior handoff expired")}function ut(e,t){e.clear();for(let[r,n]of t)e.set(r,n)}function Rn(e){let t=e?.receipt;if(typeof t?.transactionHash=="string"&&/^0x[0-9a-f]{64}$/i.test(t.transactionHash)){if(t.status===1||t.status==="0x1")return"confirmed";if(t.status===0||t.status==="0x0")return"failed"}let r=e?.order;if(typeof r?.orderId=="string"&&/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(r.orderId)){if(r.status==="filled")return"confirmed";if(r.status==="rejected")return"failed"}return"unknown"}function ga({now:e=Date.now,storage:t,stateStore:r,tenantId:n="local-owner",executionAdapter:o,reconciliationAdapter:i}={}){let s=String(n||"").trim();if(!s)throw new TypeError("tenantId is required");let l=t??new Map,u=new Map,d=new Map,a=new Map,p=!r,E=null,w=0,S=Promise.resolve(),I=async(c,f)=>l.set(c,C(f)),v=async c=>l.get(c),L=async()=>l instanceof Map?[...l.values()]:l.list(),T=c=>se(C(c));function M(c){let f=S.then(c,c);return S=f.catch(()=>{}),f}function b(){if(!(l instanceof Map)){if(r)throw new Error("durable team state requires map-backed definitions");return{definitions:null,runs:new Map([...u].map(([c,f])=>[c,C(f)])),contexts:new Map([...d].map(([c,f])=>[c,sr(f)])),threads:new Map([...a].map(([c,f])=>[c,C(f)]))}}return{definitions:new Map([...l].map(([c,f])=>[c,C(f)])),runs:new Map([...u].map(([c,f])=>[c,C(f)])),contexts:new Map([...d].map(([c,f])=>[c,sr(f)])),threads:new Map([...a].map(([c,f])=>[c,C(f)]))}}function R(c,f){return{version:1,revision:f,tenantId:s,definitions:[...c.definitions.values()].map(C),runs:[...c.runs.values()].map(C),contexts:[...c.contexts.entries()].map(([m,g])=>({runId:m,context:ma(g)})),threads:[...c.threads.values()].map(C)}}function j(c){c.definitions&&ut(l,c.definitions),ut(u,c.runs),ut(d,c.contexts),ut(a,c.threads)}function O(c,{persist:f=!0}={}){return M(async()=>{let m=b(),g=c(m),h=w;if(f&&r){let y=w,x=await r.save(R(m,y),{expectedRevision:y});h=x.revision,m.threads=new Map((x.threads||[]).map(k=>[k.teamId,C(k)]))}return j(m),w=h,g})}async function P(){p||(E||(E=(async()=>{let c=await r.load();if(c.tenantId!==s)throw new Error("team state tenant mismatch");if(!Number.isSafeInteger(c.revision)||c.revision<0)throw new Error("team state revision is invalid");if(!(l instanceof Map))throw new Error("durable team state requires map-backed definitions");let f={definitions:new Map,runs:new Map,contexts:new Map,threads:new Map};for(let h of c.definitions)f.definitions.set(h.team.id,C(h));for(let h of c.runs)f.runs.set(h.id,C(h));for(let h of c.contexts)f.contexts.set(h.runId,ha(h.context));for(let h of c.threads||[])f.threads.set(h.teamId,C(h));let m=!1;for(let h of f.runs.values()){if(!(h.status==="executing"||h.attempts?.some(k=>k.status==="submission-unknown")))continue;h.status="reconciliation-required",h.executionAllowed=!1,h.requiresOperatorConfirmation=!1,h.uncertainExecution=!0,h.updatedAt=e();let x=f.contexts.get(h.id);x&&(x.executionConsumed=!0,x.confirmationPending=!1),m=!0}let g=c.revision;if(m){let h=await r.save(R(f,g),{expectedRevision:g});g=h.revision,f.threads=new Map((h.threads||[]).map(y=>[y.teamId,C(y)]))}j(f),w=g,p=!0})()),await E)}async function F(){if(typeof o?.status!="function")throw new Error("armed mode requires a local execution adapter");let c=await o.status();if(!c?.configured||!c?.reachable||c?.armed!==!0)throw new Error("local signer is not armed and reachable");if(typeof o?.executeConfirmedArtifact!="function")throw new Error("armed mode requires a local execution adapter");return c}function H(c,f,m,g){let h=c.runs.get(f),y=c.contexts.get(f);if(!h||!y)throw new Error(`unknown run ${f}`);if(h.status==="halted")throw new Error("run is halted");if(h.status==="paused")throw new Error("run is paused");if(h.status!=="running"&&h.status!=="shadowing")throw new Error("run cannot step from its current state");let x=e();if(de(h,y,x),h.steps.length>=h.maxSteps)throw new Error("run step budget exhausted");if(m?.agentId!==y.currentAgentId)throw new TypeError("step agent is out of order");let k=y.compiled.team.edges.find(N=>N.from===m.agentId);if(!k||k.to!==m?.targetAgentId||k.artifactKind!==m?.artifactKind)throw new TypeError("artifact does not match the exact next team edge");let A,_=null;if(y.previousHandoffHash===null){if(m.inputHandoffHash!==void 0)throw new TypeError("root step cannot consume a prior handoff");A=m.evidenceRefs}else{if(m.inputHandoffHash!==y.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");if(y.consumedHandoffHashes.has(m.inputHandoffHash))throw new TypeError("handoff was already consumed");let N=h.steps.at(-1);if(!N||N.handoffHash!==m.inputHandoffHash)throw new TypeError("step must consume the exact prior handoff");ar(N,x),_=m.inputHandoffHash,A=[`evidence:sha256:${m.inputHandoffHash}`]}if(g&&(h.riskEvidence=C(g),!g.executionAllowed))return h.status="risk-blocked",h.executionAllowed=!1,h.requiresOperatorConfirmation=!1,h.updatedAt=x,h;if(m.payload?.kind==="risk-decision"&&m.payload.status==="measured")throw new TypeError("measured risk evidence requires trusted runtime provenance");if(m.payload?.kind==="risk-decision"){if(m.payload.status!=="unknown")throw new TypeError("risk evidence status must be unknown");let N=y.compiled.team.agents.find(D=>D.id===k.from);if(N?.role!=="risk"||N.runtime!=="policy")throw new TypeError("only the policy risk agent can block for unknown evidence");if(m.payload.executionAllowed!==!1||m.payload.executionPlan!==void 0||!Array.isArray(m.payload.riskChecks)||m.payload.riskChecks.length!==3)throw new TypeError("unknown risk evidence cannot assert approval or measured amounts");if(m.payload.notionalUsd!==null||m.payload.maxLossUsd!==null||m.payload.chainId!==null||m.payload.observedAt!==null||m.payload.liveData!=="unavailable"||m.payload.riskChecks.some(D=>D.pass!==!1||D.status!=="unknown"))throw new TypeError("unknown risk evidence cannot assert approval or measured amounts");return h.riskEvidence=C(m.payload),h.status="risk-blocked",h.executionAllowed=!1,h.requiresOperatorConfirmation=!1,h.updatedAt=x,h}if(Nn(k.artifactKind,m.payload),!g&&Ln.has(k.artifactKind)&&m.payload?.executionPlan!==void 0)throw new TypeError("executable intent requires the trusted Oracle builder");let U=nr({teamId:h.teamId,teamHash:h.teamHash,runId:f,sourceAgentId:k.from,targetAgentId:k.to,artifactKind:k.artifactKind,payload:m.payload,evidenceRefs:A,ttlMs:m.ttlMs,nowMs:x},{compiled:y.compiled});return _!==null&&y.consumedHandoffHashes.add(_),h.steps.push(U),h.updatedAt=x,y.currentAgentId=k.to,y.previousHandoffHash=U.handoffHash,k.to===y.compiled.team.agents.find(N=>N.role==="executor").id&&(h.status=h.mode==="armed"?"awaiting-confirmation":"prepared",h.preparedAt=x,h.mode!=="armed"&&(h.completedAt=x)),h}return Object.freeze({async save(c){if(await P(),!(l instanceof Map)){let m=await M(async()=>{let g=typeof c?.id=="string"?await v(c.id):null,h=c?.kind==="group"&&c.sessionId===void 0?g:null,y=h?.team?.kind==="group"?{...c,sessionId:h.team.sessionId}:c,x=Xe(y,{nowMs:e()});if(g&&g.team?.kind!==x.team.kind)throw new Error("team kind cannot change");return await I(x.team.id,x),x});return T(m)}let f=await O(m=>{let g=typeof c?.id=="string"?m.definitions.get(c.id):null,h=c?.kind==="group"&&c.sessionId===void 0?g:null,y=h?.team?.kind==="group"?{...c,sessionId:h.team.sessionId}:c,x=Xe(y,{nowMs:e()}),k=m.definitions.get(x.team.id);if(k&&k.team?.kind!==x.team.kind)throw new Error("team kind cannot change");return m.definitions.set(x.team.id,C(x)),x.team.kind==="group"&&!m.threads.has(x.team.id)&&m.threads.set(x.team.id,{teamId:x.team.id,sessionId:x.team.sessionId,messages:[]}),m.definitions.get(x.team.id)});return T(f)},async list(){return await P(),T(await L())},async get(c){await P();let f=await v(c);return f===void 0?null:T(f)},async remove(c){await P();let f=String(c||"").trim();if(!(l instanceof Map)){if(typeof l.delete!="function")throw new Error("team storage does not support deletion");return T(await M(async()=>{let g=await v(f);if(!g||g.team?.kind!=="group")throw new Error(`unknown group ${f}`);if(await l.delete(f)===!1||await v(f)!==void 0)throw new Error(`team deletion failed ${f}`);a.delete(f);for(let[y,x]of u)x.teamId===f&&(u.delete(y),d.delete(y));return{deleted:!0,teamId:f}}))}let m=await O(g=>{let h=g.definitions.get(f);if(!h||h.team?.kind!=="group")throw new Error(`unknown group ${f}`);g.definitions.delete(f),g.threads.delete(f);for(let[y,x]of g.runs)x.teamId===f&&(g.runs.delete(y),g.contexts.delete(y));return{deleted:!0,teamId:f}});return T(m)},async listThreads(){return await P(),T([...a.values()])},async getThread(c){await P();let f=a.get(c);return f===void 0?null:T(f)},async appendThreadEvent(c,f){return await P(),await O(m=>{let g=m.definitions?.get(c);if(!g||g.team.kind!=="group")throw new Error(`unknown group ${c}`);let h=m.threads.get(c)||{teamId:c,sessionId:g.team.sessionId,messages:[]},y=Et(h,f);m.threads.set(c,{...y,teamId:c})}),T(a.get(c))},async getRun(c){await P();let f=u.get(c);return f===void 0?null:T(f)},async getTurnState(c,f){return await P(),M(()=>{let m=u.get(c),g=d.get(c);if(!m||!g)throw new Error(`unknown run ${c}`);if(m.teamId!==f)throw new Error("run team mismatch");if(m.status!=="running"&&m.status!=="shadowing")throw new Error(`run is not active: ${m.status}`);let h=e();if(de(C(m),g,h),g.previousHandoffHash!==null){let y=m.steps.at(-1);if(!y||y.handoffHash!==g.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");ar(y,h)}return T({run:m,compiled:g.compiled,currentAgentId:g.currentAgentId,previousHandoffHash:g.previousHandoffHash,inbound:m.steps.at(-1)?.payload??null})})},async start(c){await P();let f=await v(c);if(!f)throw new Error(`unknown team ${c}`);if(f.team.kind==="group")throw new Error("group chats do not start pipeline runs");let m=se(C(f));m.team.mode==="armed"&&await F();let g=await O(h=>{let y=h.definitions?h.definitions.get(c):m;if(!y)throw new Error(`unknown team ${c}`);if(y.team.mode==="draft")throw new Error("draft team must be promoted before running");if(y.team.mode==="halted")throw new Error("team kill switch is active");let x=e();if(x>=y.team.policy.expiresAt)throw new Error("team policy expired");let k=y.team.mode==="armed",A=y.team.agents.find(U=>!y.team.edges.some(N=>N.to===U.id));if(!A)throw new Error("team pipeline has no root agent");let _={id:pa(),tenantId:s,teamId:c,teamHash:y.teamHash,status:y.team.mode==="shadow"?"shadowing":"running",mode:y.team.mode,armed:k,startedAt:x,updatedAt:x,expiresAt:y.team.policy.expiresAt,maxSteps:y.team.edges.length,steps:[],receipts:[],attempts:[],executionAllowed:!1,backendSigner:k,signingReady:k,broadcastReady:k,requiresOperatorConfirmation:!0,signed:!1,broadcast:!1};return h.runs.set(_.id,_),h.contexts.set(_.id,{compiled:se(C(y)),currentAgentId:A.id,previousHandoffHash:null,consumedHandoffHashes:new Set,executionConsumed:!1,confirmationPending:!1}),_});return T(g)},async step(c,f){await P();let m=await O(g=>H(g,c,f));return T(m)},async submitIntent(c,{request:f,owner:m,builderDeps:g,signal:h}={}){await P();let y=await M(()=>{let U=u.get(c),N=d.get(c);if(!U||!N)throw new Error(`unknown run ${c}`);let D=N.compiled.team.agents.find(W=>W.id===N.currentAgentId),q=N.compiled.team.edges.find(W=>W.from===D?.id);if(U.mode!=="armed")throw new Error("trusted intent requires armed mode");if(D?.runtime!=="policy"||D.role!=="risk"||q?.artifactKind!=="approved-intent")throw new Error("trusted intent requires the policy risk edge");if(U.status!=="running")throw new Error("run cannot submit intent from its current state");return de(C(U),N,e()),ar(U.steps.at(-1),e()),T({policy:N.compiled.team.policy,edge:q,inputHandoffHash:N.previousHandoffHash})});h?.throwIfAborted();let x=e(),k=Math.min(x+3e4,y.policy.expiresAt),A=await tr({request:f,owner:m,policy:y.policy,nowMs:x,expiresAt:k,deps:{...g,runId:c,nonce:x}});h?.throwIfAborted();let _=await O(U=>{let N=e();if(N>=k)throw new Error("prepared intent expired");let D=ir({intent:A,policy:y.policy,nowMs:N});return H(U,c,{agentId:y.edge.from,targetAgentId:y.edge.to,artifactKind:y.edge.artifactKind,inputHandoffHash:y.inputHandoffHash,payload:A,ttlMs:k-N},D)});return T(_)},async confirm(c,f){await P();let m=await O(g=>{let h=g.runs.get(c),y=g.contexts.get(c);if(!h||!y)throw new Error(`unknown run ${c}`);if(h.status==="halted")throw new Error("run is halted");if(h.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state or was already executed");let x=e();de(h,y,x);let k=h.steps.at(-1);if(!k||k.artifactKind!=="approved-intent")throw new Error("approved intent handoff is required");if(x>=k.expiresAt)throw new Error("approved intent handoff expired");if(Nn(k.artifactKind,k.payload),rr(k.payload,y.compiled.team.policy,{mode:h.mode,nowMs:x,expiresAt:k.expiresAt}),f?.handoffHash!==k.handoffHash)throw new TypeError("confirmation must bind the exact handoff hash");if(f?.operatorConfirmed!==!0||f?.sign!==!0||f?.broadcast!==!0)throw new TypeError("explicit confirm, sign, and broadcast instruction is required");if(y.executionConsumed||y.confirmationPending)throw new Error("approved intent is already executing or was already executed");return y.confirmationPending=!0,C(k)},{persist:!1});try{await F();let g=m.payload?.executionPlan?.legs;if(!Array.isArray(g)||!g.length)throw new Error("approved intent has no executable legs");await O(y=>{let x=y.runs.get(c),k=y.contexts.get(c);if(!x||!k)throw new Error(`unknown run ${c}`);let A=e();if(de(x,k,A),x.status==="halted")throw new Error("run was halted before execution");if(x.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state");if(!k.confirmationPending||k.executionConsumed)throw new Error("approved intent is already executing or was already executed");if(A>=m.expiresAt)throw new Error("approved intent handoff expired");k.executionConsumed=!0,x.status="executing",x.updatedAt=A});for(let[y,x]of g.entries()){let k=Pn(s,x.artifact,y);await O(N=>{let D=N.runs.get(c),q=N.contexts.get(c);if(!D||!q)throw new Error(`unknown run ${c}`);if(D.status==="halted")throw new Error("run was halted during sequential basket execution");if(D.status!=="executing")throw new Error("run cannot execute from its current state");let W=e();if(de(D,q,W),W>=m.expiresAt)throw new Error("approved intent handoff expired during execution");D.attempts[y]={legIndex:y,idempotencyKey:k,status:"submission-unknown",submittedAt:W},D.updatedAt=W});let A=await o.executeConfirmedArtifact(C(x.artifact),{tenantId:s,runId:c,handoffHash:m.handoffHash,idempotencyKey:k,legIndex:y,legCount:g.length});await O(N=>{let D=N.runs.get(c);if(!D)throw new Error(`unknown run ${c}`);let q=D.attempts[y];if(!q||q.idempotencyKey!==k)throw new Error("execution attempt state changed before receipt persistence");q.status="receipt-recorded",q.receipt=C(A),q.receivedAt=e(),D.receipts.push(C(A)),D.updatedAt=q.receivedAt});let _=u.get(c),U=d.get(c);if(_?.status==="halted")throw new Error("run was halted during sequential basket execution");if(!_||!U)throw new Error(`unknown run ${c}`);if(de(C(_),sr(U),_.updatedAt),_.updatedAt>=m.expiresAt)throw new Error("approved intent handoff expired during execution")}let h=await O(y=>{let x=y.runs.get(c),k=y.contexts.get(c);if(!x||!k)throw new Error(`unknown run ${c}`);if(x.status==="halted")throw new Error("run was halted during sequential basket execution");if(x.status!=="executing")throw new Error("run cannot complete from its current state");if(de(x,k,x.updatedAt),x.updatedAt>=m.expiresAt)throw new Error("approved intent handoff expired during execution");return x.status="completed",x.executionAllowed=!1,x.requiresOperatorConfirmation=!1,x.signed=!0,x.broadcast=!0,x.completedAt=e(),x.updatedAt=x.completedAt,x});return T(h)}catch(g){if(d.get(c)?.executionConsumed)try{await O(y=>{let x=y.runs.get(c),k=y.contexts.get(c);if(!x||!k)return;let A=x.attempts.some(_=>_.status==="submission-unknown");x.status!=="halted"&&x.status!=="expired"&&(x.status=A?"reconciliation-required":"failed"),x.executionAllowed=!1,x.uncertainExecution=A,x.partialExecution=x.receipts.length>0,x.error=g instanceof Error?g.message:"local execution failed",x.updatedAt=e()})}catch{}throw g}finally{await O(g=>{let h=g.contexts.get(c);h&&(h.confirmationPending=!1)},{persist:!1})}},async reconcile(c){if(typeof c!="string"||!/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(c))throw new TypeError("runId is invalid");let f=await M(async()=>{if(r){let A=await r.load();if(A.tenantId!==s)throw new Error("team state tenant mismatch");return C({run:A.runs.find(_=>_.id===c)??null,revision:A.revision})}return C({run:u.get(c)??null,revision:w})}),m=f.run;if(!m||m.tenantId!==s)throw new Error(`unknown run ${c}`);let g=m.steps.at(-1),h=g?.payload?.executionPlan?.legs??[],y=[];for(let A of m.attempts||[]){let _=h[A.legIndex],U={tenantId:s,runId:c,handoffHash:g?.handoffHash??null,idempotencyKey:A.idempotencyKey,legIndex:A.legIndex,tradeId:_?.artifact?.tradeId??null},N="unknown",D="unavailable",q=null,W="lookup-unavailable",Ue=_&&Number.isSafeInteger(A.legIndex)&&A.legIndex>=0&&A.idempotencyKey===Pn(s,_.artifact,A.legIndex);if(Ue&&A.status==="receipt-recorded"&&Number.isSafeInteger(A.receivedAt)&&A.receivedAt>=A.submittedAt&&A.receivedAt<=e()&&(N=Rn(A.receipt),N!=="unknown"&&(D="stored-receipt",q=A.receivedAt)),Ue&&N==="unknown"){for(let ke of["lookupReceipt","lookupOrder"])if(typeof i?.[ke]=="function")try{let Y=await i[ke](T(U));if(Y?.available===!1){["disabled","hosted","unconfigured","lookup-unavailable","identity-mismatch","invalid-evidence"].includes(Y.reason)&&(W=Y.reason);break}if(!Y||Object.keys(U).some(qe=>Y[qe]!==U[qe])||!Number.isSafeInteger(Y.observedAt)||Y.observedAt<A.submittedAt||Y.observedAt>e())continue;if(N=Rn(ke==="lookupReceipt"?{receipt:Y.receipt}:{order:Y.order}),N!=="unknown"){D=ke,q=Y.observedAt;break}}catch{}}y.push({...U,status:N,source:D,observedAt:q,reason:N==="unknown"?W:null})}let x=Math.max(0,h.length-y.length),k=!y.length||x>0||y.some(A=>A.status==="unknown");return T({runId:c,tenantId:s,runStatus:m.status,revision:f.revision,readOnly:!0,executionAllowed:!1,recoveryRequired:k,status:k?"reconciliation-required":"reconciled",attempts:y,unattemptedLegs:x})},async pause(c){await P();let f=await O(m=>{let g=m.runs.get(c);if(!g)throw new Error(`unknown run ${c}`);if(g.status!=="running"&&g.status!=="shadowing")throw new Error("only an active run can be paused");return g.resumeStatus=g.status,g.status="paused",g.updatedAt=e(),g});return T(f)},async resume(c){await P();let f=await O(m=>{let g=m.runs.get(c),h=m.contexts.get(c);if(!g||!h)throw new Error(`unknown run ${c}`);if(g.status!=="paused")throw new Error("only a paused run can be resumed");let y=e();return de(g,h,y),g.status=g.resumeStatus==="shadowing"?"shadowing":"running",delete g.resumeStatus,g.updatedAt=y,g});return T(f)},async halt(c){await P();let f=await O(m=>{let g=m.runs.get(c);if(!g)throw new Error(`unknown run ${c}`);return g.status="halted",delete g.resumeStatus,g.updatedAt=e(),g});return T(f)}})}import{createHash as ya}from"node:crypto";var ba=/\b[A-Z][A-Z0-9]{1,5}\b/g,xa=3e4;function Ea(e){return ya("sha256").update(e).digest("hex")}function Sa(e){return String(e).replace(/\$\s*\d[\d,.]*/g,"[amount]").slice(0,500)}function ka(e){let t=new Set(e.edges.map(s=>s.to)),r=e.agents.find(s=>!t.has(s.id));if(!r)throw new Error("team pipeline has no root agent");let n=new Map(e.edges.map(s=>[s.from,s])),o=[],i=r.id;for(;n.has(i);){let s=n.get(i);o.push(s),i=s.to}if(o.length!==e.edges.length)throw new Error("team pipeline edges are not a single ordered chain");return o}function Aa({prompt:e,nowMs:t}){let r=[...new Set(e.match(ba)||[])];return{kind:"evidence",prompt:e,observations:r,generatedAt:t,source:"operator-prompt",liveData:"unavailable"}}function Mn({agent:e,prompt:t,inbound:r}){let n=r?.kind==="evidence"?`evidence observations [${(r.observations||[]).join(", ")}]`:r?.kind==="analysis"?`prior ${r.role||"analysis"} thesis`:"operator prompt only",o=Sa(`Rule-based bounded summary: ${e.role} review of ${n} for prompt "${t}". No live market data was read and no prices or market numbers are asserted.`);return{kind:"analysis",role:e.role,thesis:o,generator:{kind:"rules"},degradedReason:"model runtime unavailable"}}function Ta(e){return Array.isArray(e)?e.slice(0,16).flatMap(t=>{let r=typeof t?.name=="string"?t.name.trim():"",n=typeof t?.argsHash=="string"?t.argsHash:"";return!/^[a-z0-9][a-z0-9._:-]{0,63}$/.test(r)||!/^[0-9a-f]{64}$/.test(n)?[]:[{name:r,argsHash:n,ok:t?.ok===!0}]}):[]}async function Oa({agent:e,prompt:t,inbound:r,modelInvoker:n,signal:o}){if(typeof n!="function")return Mn({agent:e,prompt:t,inbound:r});try{let i=await n({agent:e,prompt:t,inbound:r,signal:o});if(typeof i?.text!="string"||!i.text.trim())throw new Error("model invoker returned no text");let s=Ta(i.toolCalls),l=r?.intent&&typeof r.intent=="object"?r.intent:r?.evidence?.intent,u=r?.kind==="evidence"?r:r?.evidence?.kind==="evidence"?r.evidence:void 0;return{kind:"analysis",role:e.role,thesis:i.text,generator:{kind:"model",provider:e.provider,model:e.model},...s.length?{toolCalls:s}:{},...l?{intent:l}:{},...u?{evidence:u}:{}}}catch{return o?.throwIfAborted(),Mn({agent:e,prompt:t,inbound:r})}}function Ia({prompt:e,inbound:t,compiled:r,nowMs:n}){let o=t?.kind==="evidence"?t:t?.evidence?.kind==="evidence"?t.evidence:void 0,i=t?.intent&&typeof t.intent=="object"?t.intent:o?.intent;return{...or({policy:r?.policy,evidence:o,intent:i,nowMs:n}),prompt:e}}function Cn(e,t){if(t.kind==="evidence"){let r=t.observations.length?t.observations.join(", "):"no symbols";return`${e.name}: parsed operator prompt (${r}); live market data unavailable.`}if(t.kind==="analysis"){let r=t.generator.kind==="model"?`${t.generator.provider}/${t.generator.model}`:"bounded rules";return`${e.name}: ${t.thesis.slice(0,160)} (via ${r})`}if(t.status==="measured"){let r=t.riskChecks.every(n=>n.pass===!0)?"bounds satisfied":"a measured bound failed";return`${e.name}: measured risk ${r}; execution blocked pending operator confirmation.`}return`${e.name}: risk unknown; live timestamped observations unavailable. No intent approved; execution blocked.`}async function va({service:e,team:t,teamId:r,runId:n,prompt:o,nowMs:i,modelInvoker:s,onEvent:l,orderRequest:u,owner:d,builderDeps:a,signal:p}={}){let E=typeof l=="function"?w=>{l(w)}:()=>{};try{if(p?.throwIfAborted(),!e)throw new TypeError("service is required");if(typeof o!="string"||!o.trim())throw new TypeError("prompt is required");if(o.length>4e3)throw new TypeError("prompt exceeds 4000 characters");let w=String(r||t?.team?.id||t?.id||"");if(!w)throw new TypeError("teamId is required");let S=await e.get(w);if(!S)throw new Error(`unknown team ${w}`);if(S.team.kind==="group")throw new Error("group chats do not run pipeline turns");let I=Number.isSafeInteger(i)?i:Date.now();if(n!==void 0&&(typeof n!="string"||!/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(n)))throw new TypeError("runId is invalid");let v=n??(await e.start(w)).id,L=await e.getTurnState(v,w),T=L.run,M=L.compiled.team,b=ka(M),R=b.findIndex(H=>H.from===L.currentAgentId),j=T.steps.at(-1);if(R<0||R!==T.steps.length||L.previousHandoffHash!==(j?.handoffHash??null)||j&&j.targetAgentId!==L.currentAgentId)throw new Error("persisted run cursor mismatch");if(T.steps.length>0){let H=T.steps[0]?.payload?.prompt;if(typeof H!="string")throw new Error("committed prompt unavailable");o=H}E({type:"run.started",run:T});let O=new Map(M.agents.map(H=>[H.id,H])),P=L.previousHandoffHash,F=L.inbound;for(let H=R;H<b.length;H+=1){p?.throwIfAborted();let c=b[H],f=O.get(c.from);if(E({type:"agent.started",agentId:f.id,name:f.name,role:f.role,runtime:f.runtime}),f.runtime==="policy"&&M.mode==="armed"&&u!==void 0){if(T=await e.submitIntent(T.id,{request:u,owner:d,builderDeps:a,signal:p}),E({type:"agent.output",agentId:f.id,text:Cn(f,T.riskEvidence),payload:T.riskEvidence}),T.status==="awaiting-confirmation"){let y=T.steps.at(-1),[x,k]=y.payload.executionPlan.legs;E({type:"intent.prepared",coin:k.market,side:k.side,notionalUsd:y.payload.notionalUsd,leverage:x.artifact.artifact.leverage,maxLossUsd:y.payload.maxLossUsd,handoffHash:y.handoffHash,expiresAt:y.expiresAt}),E({type:"run.awaiting-confirmation",run:T})}break}let m;if(f.runtime==="deterministic")m=Aa({prompt:o,nowMs:I});else if(f.runtime==="model")m=await Oa({agent:f,prompt:o,inbound:F,modelInvoker:s,signal:p});else if(f.runtime==="policy")m=Ia({prompt:o,inbound:F,compiled:M,nowMs:I});else throw new Error(`agent runtime ${f.runtime} cannot produce a handoff artifact`);E({type:"agent.output",agentId:f.id,text:Cn(f,m),payload:m});let g={agentId:c.from,targetAgentId:c.to,artifactKind:c.artifactKind,payload:m,ttlMs:xa};if(H===0?g.evidenceRefs=[`evidence:sha256:${Ea(`${w}\0${o}`)}`]:g.inputHandoffHash=P,p?.throwIfAborted(),T=await e.step(T.id,g),T.status==="risk-blocked")break;let h=T.steps.at(-1);P=h.handoffHash,F=m,E({type:"handoff.verified",handoff:{sourceAgentId:h.sourceAgentId,targetAgentId:h.targetAgentId,artifactKind:h.artifactKind,handoffHash:h.handoffHash}})}return E({type:"run.status",run:T}),T}catch(w){throw E({type:"error",message:w instanceof Error?w.message:"team turn failed"}),w}}import{closeSync as Be,constants as ie,fchmodSync as jn,fstatSync as Gn,fsyncSync as cr,linkSync as _a,lstatSync as we,mkdirSync as $a,openSync as ze,readFileSync as Fe,readlinkSync as Hn,realpathSync as Pa,renameSync as Na,rmSync as lr,writeFileSync as Dn}from"node:fs";import{createHash as Ra,randomBytes as Bn}from"node:crypto";import{homedir as La}from"node:os";import{basename as Ma,dirname as pt,join as mt,resolve as Ca}from"node:path";var Jn=1,fr=ie.O_NOFOLLOW??0,ja=16*1024*1024,dr=15*1024*1024;function Ha(e){let t=String(e||"").trim();if(!t||t.length>200||/[\u0000-\u001f\u007f]/.test(t))throw new TypeError("tenantId is required");return t}function Yn(e){return e==null?e:structuredClone(e)}function ht(e,t,r=!1,n=process.platform){let o=r?!e.isDirectory():!e.isFile(),i=n!=="win32",s=i&&typeof process.getuid=="function"&&Number(e.uid)!==process.getuid(),l=i&&(Number(e.mode)&18)!==0;if(e.isSymbolicLink()||o||s||l)throw new Error(`${t} must be an owner-controlled ${r?"directory":"regular file"}`)}function zn(e,t){$a(e,{recursive:!0,mode:448});let r=we(e);ht(r,"team state directory",!0,t)}function Da(e,t){let r=Ra("sha256").update(t).digest("hex");return mt(e,`${r}.json`)}function Fn(e){return Buffer.byteLength(`${JSON.stringify(e)}
5
- `,"utf8")}function Un(e){let t=Date.parse(String(e?.createdAt||""));return Number.isFinite(t)?t:Number.MIN_SAFE_INTEGER}function Ba(e){let t={...e,threads:e.threads.map(n=>Ge(n))},r=Fn(t);for(;r>dr;){let n=t.threads.flatMap((l,u)=>l.messages.map((d,a)=>({message:d,messageIndex:a,thread:l,threadIndex:u})).filter(({message:d})=>d?.historyTruncated!==!0));if(n.length===0)throw new Error("team state non-thread data exceeds durable size budget");n.sort((l,u)=>{let d=Un(l.message)-Un(u.message);if(d!==0)return d;let a=String(l.thread.teamId||""),p=String(u.thread.teamId||"");return a<p?-1:a>p?1:l.messageIndex!==u.messageIndex?l.messageIndex-u.messageIndex:l.threadIndex-u.threadIndex});let o=r-dr,i=new Map,s=0;for(let l of n)if(i.set(l.threadIndex,(i.get(l.threadIndex)||0)+1),s+=Buffer.byteLength(JSON.stringify(l.message),"utf8")+1,s>=o+i.size*512)break;t={...t,threads:t.threads.map((l,u)=>{let d=i.get(u)||0;return d>0?yr(l,d):l})},r=Fn(t)}return t}function Vn(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("team state snapshot must be an object");let r={...e,threads:e.threads===void 0?[]:e.threads};if(r.version!==Jn||r.tenantId!==t)throw new TypeError("team state tenant or version mismatch");if(!Number.isSafeInteger(r.revision)||r.revision<0)throw new TypeError("team state revision must be a non-negative safe integer");for(let n of["definitions","runs","contexts","threads"])if(!Array.isArray(r[n]))throw new TypeError(`team state ${n} must be an array`);return Ke(r),Ba(Yn(r))}function za(e){return{version:Jn,revision:0,tenantId:e,definitions:[],runs:[],contexts:[],threads:[]}}function qn(e,t,r){try{let n=we(e);if(ht(n,"team state file",!1,r),n.size>ja)throw new Error("team state file is too large");return Vn(JSON.parse(Fe(e,"utf8")),t)}catch(n){if(n?.code==="ENOENT")return za(t);throw n}}function te(e,t){return Object.assign(new Error(`team state lock recovery refused: ${e}`,{cause:t}),{code:"ETEAMLOCKRECOVERY"})}function Fa(e){if(e!=="linux"||process.platform!=="linux")return null;try{let t=Fe("/proc/self/stat","utf8"),r=Number(t.slice(0,t.indexOf(" "))),n=t.slice(t.lastIndexOf(")")+2).split(" ")[19],o=Fe("/proc/sys/kernel/random/boot_id","utf8").trim(),i=Hn("/proc/self/ns/pid");return r!==process.pid||!/^[0-9]+$/.test(n)||!/^[0-9a-f-]{36}$/.test(o)||!/^pid:\[[0-9]+\]$/.test(i)||Hn(`/proc/${r}/ns/pid`)!==i?null:{pid:r,uid:process.getuid(),startedAt:n,bootId:o,pidNamespace:i}}catch{return null}}function Ua(e){let t=Pa(pt(e)),r=we(t,{bigint:!0});return{file:mt(t,Ma(e)),device:String(r.dev),inode:String(r.ino)}}function ft(e,t){return e.dev===t.dev&&e.ino===t.ino}function Kn(e,t){try{if(ft(Gn(t,{bigint:!0}),we(e,{bigint:!0})))return}catch(r){throw te("lock ownership could not be verified",r)}throw te("lock ownership changed")}function ur(e){let t=ze(e,ie.O_RDONLY);try{cr(t)}finally{Be(t)}}function qa(e,t){let r=e?.owner,n=t.owner;if(e?.version!==1||typeof e?.nonce!="string"||!/^[0-9a-f]{32}$/.test(e.nonce)||!n||!r||!Number.isSafeInteger(r.pid)||r.pid<=0||typeof r.startedAt!="string"||!/^[0-9]+$/.test(r.startedAt)||r.uid!==n.uid||r.bootId!==n.bootId||r.pidNamespace!==n.pidNamespace||e.store?.file!==t.store.file||e.store?.device!==t.store.device||e.store?.inode!==t.store.inode)throw te("foreign or unverifiable owner/store identity");try{process.kill(r.pid,0)}catch(o){if(o?.code!=="ESRCH")throw te("owner liveness is unknown",o);try{we(`/proc/${r.pid}`)}catch(i){if(i?.code==="ENOENT")return;throw te("owner proc identity is inaccessible",i)}throw te("owner still has a proc identity")}throw te("owner is live")}function Ka(e,t,r){let n;try{let o=we(e,{bigint:!0});ht(o,"team state lock",!1,r),n=ze(e,ie.O_RDONLY|ie.O_NONBLOCK|fr);let i=Gn(n,{bigint:!0});if(ht(i,"team state lock",!1,r),!ft(o,i)||i.size>8192)throw te("lock changed or is oversized");let s=Fe(n,"utf8"),l=JSON.parse(s);qa(l,t);let u=`${e}.recovered-${l.nonce}`;if(_a(e,u),!ft(i,we(u,{bigint:!0})))throw te("lock replaced during recovery election");if(ur(pt(e)),!ft(i,we(e,{bigint:!0}))||Fe(e,"utf8")!==s)throw te("lock changed during recovery");lr(e),ur(pt(e))}catch(o){throw o?.code==="ETEAMLOCKRECOVERY"?o:te("lock is ambiguous, unsafe, or recovery is already fenced",o)}finally{n!==void 0&&Be(n)}}function Ga(e,t,r){let n=ie.O_CREAT|ie.O_EXCL|ie.O_WRONLY|fr;try{return ze(e,n,384)}catch(o){if(o?.code!=="EEXIST")throw o;return Ka(e,t,r),ze(e,n,384)}}function Wn(e=process.env){let t=String(e?.ORACLE_CONFIG_DIR||"").trim()||mt(La(),".config","oracle");return mt(t,"teams","state")}function Ja(e={}){let{rootDir:t=Wn(),tenantId:r,platform:n=process.platform}=e,o=Ha(r),i=Ca(t),s=Da(i,o),l=`${s}.lock`;return Object.freeze({tenantId:o,file:s,async load(){return zn(i,n),qn(s,o,n)},async save(u,{expectedRevision:d}={}){if(zn(i,n),!Number.isSafeInteger(d)||d<0)throw new TypeError("team state expectedRevision must be a non-negative safe integer");let a={version:1,nonce:Bn(16).toString("hex"),store:Ua(s),owner:Fa(n)},p,E=`${s}.${process.pid}.${Bn(8).toString("hex")}.tmp`,w;try{p=Ga(l,a,n),Dn(p,`${JSON.stringify(a)}
6
- `,"utf8"),cr(p),jn(p,384);let S=qn(s,o,n);if(S.revision!==d)throw new Error(`team state changed: stale revision ${d}; current revision ${S.revision}`);let I=Vn({...u,revision:d+1},o),v=`${JSON.stringify(I)}
7
- `;if(Buffer.byteLength(v,"utf8")>dr)throw new Error("team state exceeds durable serialized size budget");return w=ze(E,ie.O_CREAT|ie.O_EXCL|ie.O_WRONLY|fr,384),Dn(w,v,"utf8"),cr(w),jn(w,384),Be(w),w=void 0,Kn(l,p),Na(E,s),n!=="win32"&&ur(pt(s)),Yn(I)}finally{try{w!==void 0&&Be(w),lr(E,{force:!0})}finally{if(p!==void 0)try{Kn(l,p),lr(l)}finally{Be(p)}}}}})}export{to as BASKET_STRATEGY_CATALOG,Pe as CRYPTO_SKILL_CATALOG,$e as CRYPTO_TOOL_CATALOG,Qn as MARKET_BREADTH_CATALOG,_e as MODEL_PROVIDER_CATALOG,eo as PERP_SIGNAL_CATALOG,gt as TEAM_MODES,io as TEAM_TEMPLATES,Tt as autoSelectAgentCapabilities,tr as buildTeamHlIntent,Xe as compileTeamDefinition,Ja as createDurableTeamStore,nr as createTeamHandoff,ga as createTeamService,xt as createTeamSessionId,Wn as defaultTeamStateRoot,or as evaluateRiskEvidence,ir as evaluateTeamIntent,Lo as getAgentPresence,Ei as importTeamAgentFromPack,Xo as isAutoSelectableCapability,We as isPackSkillId,Je as isTeamSessionId,Pr as looksRemotePackSource,Et as reduceTeamThread,Ro as routeTeamMessage,va as runTeamTurn,$t as scanTeamAgentPack,vn as validateTeamHlRequest};
1
+ var Xn=Object.defineProperty;var Z=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};var Zn=(e,t)=>{for(var r in t)Xn(e,r,{get:t[r],enumerable:!0})};function V(e,t="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${t} must be a number or decimal string`);return e}throw new Error(`${t} must be a number or decimal string`)}function Mr(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function Pt(e,t="amount"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${t} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return BigInt(e)}let r=V(e,t);if(r==="")throw new Error(`${t} is required`);if(!/^-?\d+$/.test(r)&&!/^0x[0-9a-fA-F]+$/.test(r))throw new Error(`${t} must be an integer in decimal or 0x-hex form, got ${JSON.stringify(r)}`);try{return BigInt(r)}catch{throw new Error(`${t} must be an integer, got ${JSON.stringify(r)}`)}}function J(e,t,r="amount"){let n=V(e,r);if(!/^-?\d*(\.\d+)?$/.test(n)||n===""||n==="."||n==="-")throw new Error(`${r} must be a decimal number, got ${JSON.stringify(n)}`);let o=n.startsWith("-"),i=o?n.slice(1):n,[s="0",l=""]=i.split(".");if(l.length>t)throw new Error(`${r} has more than ${t} decimal places, which would lose precision`);let u=BigInt((s||"0")+l.padEnd(t,"0"));return o?-u:u}var et=Z(()=>{});import{AsyncLocalStorage as Si}from"node:async_hooks";function tt(e){let t=ki.getStore();if(!t||t.closed||!Ai.includes(e))return null;if(t.spans.length>=Ti)return t.droppedSpans++,null;let r={stage:e,startMs:t.now()-t.start,durationMs:null,outcome:"pending",status:null};return t.spans.push(r),(n,o=null)=>{t.closed||r.durationMs!==null||(r.durationMs=Math.max(0,t.now()-t.start-r.startMs),r.outcome=n==="succeeded"?"succeeded":"failed",r.status=Number.isInteger(o)&&o>=100&&o<=599?o:null)}}var ki,Ai,Ti,Cr=Z(()=>{ki=new Si,Ai=["http","retry","shared"],Ti=512});import xe from"node:net";import Oi from"node:dns";function rt(e){let t=String(e).toLowerCase().split("%")[0];if((t.match(/::/g)||[]).length>1)return null;let r=a=>{if(!a)return[];let p=a.split(":"),b=p.at(-1);if(b?.includes(".")){let w=b.split(".").map(Number);if(w.length!==4||w.some(S=>!Number.isInteger(S)||S<0||S>255))return null;p.splice(p.length-1,1,(w[0]<<8|w[1]).toString(16),(w[2]<<8|w[3]).toString(16))}return p.some(w=>!/^[0-9a-f]{1,4}$/.test(w))?null:p.map(w=>Number.parseInt(w,16))},[n,o]=t.split("::"),i=r(n),s=r(o);if(!i||!s)return null;let l=t.includes("::"),u=8-i.length-s.length;if(!l&&u!==0||l&&u<1)return null;let d=[...i,...Array(Math.max(0,u)).fill(0),...s];return d.length!==8?null:Uint8Array.from(d.flatMap(a=>[a>>8,a&255]))}function Nt(e,t,r){let n=Math.floor(r/8),o=r%8;for(let s=0;s<n;s+=1)if(e[s]!==t[s])return!1;if(!o)return!0;let i=255<<8-o;return(e[n]&i)===(t[n]&i)}function Rt(e){if(xe.isIPv4(e)){let t=e.split(".").map(Number);return!(t[0]===0||t[0]===10||t[0]===127||t[0]>=224||t[0]===100&&t[1]>=64&&t[1]<=127||t[0]===169&&t[1]===254||t[0]===172&&t[1]>=16&&t[1]<=31||t[0]===192&&(t[1]===0||t[1]===2||t[1]===168)||t[0]===192&&t[1]===88&&t[2]===99||t[0]===198&&(t[1]===18||t[1]===19||t[1]===51)||t[0]===203&&t[1]===0&&t[2]===113)}if(xe.isIPv6(e)){let t=rt(e);if(!t)return!1;let r=rt("::ffff:0:0");return Nt(t,r,96)?Rt([...t.slice(12)].join(".")):Nt(t,rt("2000::"),3)?![["2001::",23],["2001:db8::",32],["2001:10::",28],["2001:2::",48],["2002::",16],["3fff::",20]].some(([o,i])=>Nt(t,rt(o),i)):!1}return!1}function vi(e){let t;try{t=new URL(String(e))}catch{return{ok:!1,error:`not a valid URL: ${String(e).slice(0,120)}`}}if(t.protocol!=="http:"&&t.protocol!=="https:")return{ok:!1,error:`refused protocol ${t.protocol} (only http/https)`};let r=t.hostname.toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,"");if(Ii.has(r)||r.endsWith(".localhost")||r.endsWith(".internal"))return{ok:!1,error:`refused internal host ${r}`};let n=xe.isIP(r);return n!==0&&!Rt(r)?{ok:!1,error:`refused private address ${r}`}:{ok:!0,url:t,host:r,isLiteralIp:n!==0}}async function Lt(e,{lookupFn:t=Oi.promises.lookup}={}){let r=vi(e);if(!r.ok)return r;if(r.isLiteralIp)return{ok:!0,url:r.url,addresses:[{address:r.host,family:xe.isIPv6(r.host)?6:4}]};let n;if(process.env.ORACLE_HOSTED_EGRESS_PROXY)return{ok:!0,url:r.url,addresses:[]};try{n=await t(r.host,{all:!0,verbatim:!0})}catch{return{ok:!1,error:`refused: ${r.host} did not resolve`}}return!Array.isArray(n)||n.length===0||n.some(o=>!Rt(o.address))?{ok:!1,error:`refused: ${r.host} resolves to a non-public address`}:{ok:!0,url:r.url,addresses:n}}function _i(e=process.env){let t=e.ORACLE_HOSTED_EGRESS_PROXY||"";if(!t)return null;let r;try{r=new URL(t)}catch{throw new Error("egress-guard: ORACLE_HOSTED_EGRESS_PROXY is not a URL")}if(r.protocol!=="http:"||!["127.0.0.1","::1","localhost","[::1]"].includes(r.hostname)||!r.port||r.username||r.password)throw new Error("egress-guard: egress proxy must be an exact loopback http origin");let n=e.ORACLE_HOSTED_EGRESS_TOKEN||"";if(!/^[A-Za-z0-9_-]{43}$/.test(n))throw new Error("egress-guard: egress proxy token is missing");return{uri:r.origin,token:n}}async function Mt({requireUndici:e=!1,importUndici:t=()=>import("undici")}={}){let r,n,o;try{o=await t(),r=o.Agent,n=o.fetch}catch(w){if(e)throw new Error(`egress-guard: untrustedUrl pinning requires the undici package, which failed to load: ${w?.message||w}`);return null}if(typeof r!="function"||typeof n!="function"){if(e)throw new Error("egress-guard: untrustedUrl pinning requires undici's Agent and fetch exports, which were not found on the imported module");return null}let i=w=>String(w).toLowerCase().replace(/^\[|\]$/g,"").replace(/\.+$/,""),s=new Map,l=w=>(Array.isArray(w)?w:[w]).map(S=>typeof S=="string"?{address:S}:S).filter(S=>S&&S.address).map(S=>({address:S.address,family:S.family||(xe.isIPv6(S.address)?6:4)})),u=(w,S,v)=>{s.set(i(w),l(typeof S=="string"?[{address:S,family:v}]:S))},d=w=>{let S=i(w);if(xe.isIP(S))return[{address:S,family:xe.isIPv6(S)?6:4}];let v=s.get(S);if(!v||!v.length)throw new Error(`refused: unpinned host ${w} during pinned fetch`);return v},a=_i(),p=a&&typeof o.ProxyAgent=="function"?new o.ProxyAgent({uri:a.uri,token:`Bearer ${a.token}`,connectTimeout:1e4}):new r({connect:{lookup(w,S,v){let _;try{_=d(w)}catch(R){return v(R)}return S?.all?v(null,_):v(null,_[0].address,_[0].family)}}}),b=$i((w,S={})=>n(w,{...S,dispatcher:p}),u);return{dispatcher:p,fetch:b,pin:u,resolve:d,async close(){try{await p.destroy()}catch{}}}}function $i(e,t){if(typeof e!="function")throw new Error("markPinCapableFetch: fetchImpl must be a function");if(typeof t!="function")throw new Error("markPinCapableFetch: pin must be a function");return e[Ct]=Object.freeze({pin:t}),e}function jt(e){return typeof e=="function"&&typeof e[Ct]?.pin=="function"}function jr(e,t,r){if(!jt(e))throw new Error("pinFetchToAddresses: fetchImpl is not pin-capable");e[Ct].pin(t,r)}var Ii,Ct,Hr=Z(()=>{Ii=new Set(["localhost","metadata.google.internal","metadata.goog"]);Ct=Symbol.for("oracle.egressGuard.pinCapableFetch")});import{createHash as Pi}from"node:crypto";import{types as le}from"node:util";function K(e){return pe(`HTTP JSON body refused: ${e}`)}function Bi(e){return["isArgumentsObject","isArrayBuffer","isAnyArrayBuffer","isArrayBufferView","isBoxedPrimitive","isDataView","isDate","isExternal","isGeneratorObject","isKeyObject","isCryptoKey","isMap","isMapIterator","isModuleNamespaceObject","isNativeError","isPromise","isRegExp","isSet","isSetIterator","isTypedArray","isWeakMap","isWeakSet"].some(t=>typeof le[t]=="function"&&le[t](e))}function zi(e){let t=[],r=0,n=0,o=0,i=0,s=new WeakSet,l=a=>{if(r+=Buffer.byteLength(a,"utf8"),r>ce.bytes)throw K("serialized byte limit exceeded");t.push(a)},u=a=>{if(Buffer.byteLength(a,"utf8")>ce.bytes)throw K("serialized byte limit exceeded");return JSON.stringify(a)},d=(a,p)=>{if(n+=1,n>ce.nodes)throw K("node limit exceeded");if(p>ce.depth)throw K("depth limit exceeded");if(a===null){l("null");return}if(typeof a=="string"){l(u(a));return}if(typeof a=="boolean"){l(a?"true":"false");return}if(typeof a=="number"){if(!Number.isFinite(a))throw K("non-finite number");l(Object.is(a,-0)?"0":String(a));return}if(typeof a!="object")throw K("unsupported non-JSON value");if(le.isProxy(a))throw K("proxy value");if(Bi(a))throw K("unsupported exotic object");if(s.has(a))throw K("cyclic value");s.add(a);try{if(Object.getOwnPropertySymbols(a).length>0)throw K("symbol-keyed fields are unsupported");if(Array.isArray(a)){let S=Object.getPrototypeOf(a),v=0;for(;S!==null;){if(le.isProxy(S))throw K("proxy array prototype");if(v+=1,v>ce.depth)throw K("array prototype depth limit exceeded");S=Object.getPrototypeOf(S)}if(a.length>ce.arrayLength)throw K("array length limit exceeded");for(let R=0;R<a.length;R+=1){let O=Object.getOwnPropertyDescriptor(a,String(R));if(!O||!Object.hasOwn(O,"value")||O.enumerable!==!0)throw K("array entries must be dense enumerable own data")}let _=0;for(let R in a){if(i+=1,i>ce.fields)throw K("enumeration limit exceeded");if(Object.hasOwn(a,R)&&(_+=1,_>a.length))throw K("named array fields are unsupported")}if(_!==a.length)throw K("array entries must be dense enumerable own data");l("[");for(let R=0;R<a.length;R+=1)R&&l(","),d(Object.getOwnPropertyDescriptor(a,String(R)).value,p+1);l("]");return}let b=Object.getPrototypeOf(a);if(b!==Object.prototype&&b!==null)throw K("non-plain object");let w=[];for(let S in a){if(i+=1,i>ce.fields)throw K("enumeration limit exceeded");if(!Object.hasOwn(a,S))continue;if(o+=1,o>ce.fields)throw K("field limit exceeded");let v=Object.getOwnPropertyDescriptor(a,S);if(!v||!Object.hasOwn(v,"value")||v.enumerable!==!0)throw K("object fields must be enumerable own data");w.push([S,v.value])}l("{");for(let S=0;S<w.length;S+=1)S&&l(","),l(u(w[S][0])),l(":"),d(w[S][1],p+1);l("}")}finally{s.delete(a)}};return d(e,0),t.join("")}function Fi(e){let t=Object.create(null);if(e==null)return t;if(typeof e!="object"&&typeof e!="function")throw new TypeError("HTTP headers must be an object");if(le.isProxy(e))throw new TypeError("HTTP headers must not be a proxy");if(Object.getOwnPropertySymbols(e).length>0)throw new TypeError("HTTP headers must not contain symbol fields");let r=new Set;for(let n of Object.keys(e)){if(!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/u.test(n))throw new TypeError("HTTP header names must be valid tokens");let o=n.toLowerCase();if(r.has(o))throw new TypeError("HTTP headers contain a duplicate canonical name");r.add(o);let i=Object.getOwnPropertyDescriptor(e,n);if(!i||!Object.hasOwn(i,"value"))throw new TypeError("HTTP headers must contain own data properties");let s=i.value;if(s==null||["object","function","symbol"].includes(typeof s))throw new TypeError("HTTP header values must be scalar");t[n]=String(s)}return t}function Ui(){return Object.assign(Object.create(null),{Accept:"application/json"})}function qi(e,t){if(!e)throw new Error(`HTTP redirect from ${t} missing Location`);let r=new URL(String(e),String(t));if(r.protocol!=="http:"&&r.protocol!=="https:")throw new Error(`HTTP redirect from ${t} used unsupported protocol ${r.protocol}`);return r.toString()}function Ki(e,t){return new URL(String(e)).origin===new URL(String(t)).origin}function nt(e){if((typeof e!="object"||e===null)&&typeof e!="function")return`${typeof e}:${String(e)}`;let t=Ur.get(e);return t||(t=qr,qr+=1,Ur.set(e,t)),`reference:${t}`}function Kr(e){if(!e||typeof e!="object"||Array.isArray(e)||!Object.hasOwn(e,"jsonrpc")||!Object.hasOwn(e,"method")||e.jsonrpc!=="2.0")return!1;let t=typeof e.method=="string"?e.method:"";return t?Gi.has(t)||/^get[A-Z0-9_]/u.test(t)||/^is[A-Z0-9_]/u.test(t)||/^eth_get[A-Z0-9_]/u.test(t):!1}function Gr(e,t){if(e==="GET"&&t==null)return!0;if(e!=="POST"||t==null)return!1;let r=t;if(typeof t=="string")try{r=JSON.parse(t)}catch{return!1}if(Array.isArray(r))return r.length>0&&r.every(Kr);if(!r||typeof r!="object")return!1;if(Object.hasOwn(r,"jsonrpc")||Object.hasOwn(r,"method"))return Kr(r);let n=Object.hasOwn(r,"type")?r.type:null;return typeof n=="string"&&Ji.has(n)&&(!Object.hasOwn(r,"action")||r.action==null)&&(!Object.hasOwn(r,"signature")||r.signature==null)&&(!Object.hasOwn(r,"nonce")||r.nonce==null)}function Yi(e,t,r,n={},o=null){let i=Pi("sha256"),s=(u,d)=>{let a=String(d);i.update(String(Buffer.byteLength(u,"utf8"))).update(":").update(u),i.update("=").update(String(Buffer.byteLength(a,"utf8"))).update(":").update(a).update(`
2
+ `)};s("method",e),s("url",t),Object.keys(r||{}).map((u,d)=>({name:u.toLowerCase(),order:d,value:String(r[u])})).sort((u,d)=>u.name.localeCompare(d.name)||u.order-d.order).forEach((u,d)=>{s(`header-name-${d}`,u.name),s(`header-value-${d}`,u.value)}),s("body",o??"-");for(let u of["untrustedUrl","maxResponseBytes","sameOriginRedirectsOnly","redirectPolicy","maxRedirects","timeoutMs","retries","fetchImpl","realFetch","lookupFn","importUndici","validateResponse"])s(`context-${u}`,n[u]??"-");return i.digest("hex")}function Vi(e,t){let r=Number(t);return Number.isFinite(r)&&r>0?Math.min(r*1e3,Br):Math.min(250*2**e,Br)+Math.floor(Math.random()*100)}function pe(e,t={}){let r=new Error(e);return r.retryable=!1,Object.assign(r,t),r}function Dt(e,t,r){return pe(`HTTP response from ${e} exceeded maxResponseBytes ${r} (${t})`,{oversize:!0})}function Ee(e){try{let t=e?.body?.cancel?.();t&&typeof t.then=="function"&&t.catch(()=>{})}catch{}}function Xi(e){return e?e.byteLength??e.length??0:0}async function Zi(e,t,{url:r,truncate:n=!1,onOversize:o}={}){if(t==null)return await e.text();let i=Number(e.headers?.get?.("content-length"));if(Number.isFinite(i)&&i>t&&(Ee(e),!n))throw Dt(r,`content-length ${i}`,t);let s=e.body?.getReader?.();if(!s){let p=await e.text(),b=Buffer.byteLength(p,"utf8");if(b>t){if(!n)throw Dt(r,`body ${b} bytes`,t);return Buffer.from(p,"utf8").subarray(0,t).toString("utf8")}return p}let l=[],u=0,d=!1;try{for(;;){let{value:p,done:b}=await s.read();if(b)break;if(p&&(l.push(Buffer.from(p)),u+=Xi(p),u>t)){d=!0;break}}}finally{if(d)try{await s.cancel()}catch{}try{s.releaseLock?.()}catch{}}if(d&&(typeof o=="function"&&o(),!n))throw Dt(r,`streamed ${u} bytes`,t);let a=Buffer.concat(l);return(d?a.subarray(0,t):a).toString("utf8")}function Qi(e){if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function es(e,{fetchImpl:t,method:r,headers:n,body:o,timeoutMs:i,lookupFn:s,realFetch:l,untrustedUrl:u=!1,maxResponseBytes:d=null,sameOriginRedirectsOnly:a=!1,importUndici:p,validateResponse:b,signal:w,redirectPolicy:S="follow",maxRedirects:v=ot}){let _=null,R=t,O=s?{lookupFn:s}:{};if(u&&!l&&!jt(R))throw pe(`HTTP refused ${e}: untrustedUrl requires a pin-capable fetchImpl (see markPinCapableFetch in egress-guard.mjs) or no fetchImpl override so Oracle can pin the connection itself`);let C=new AbortController,x=setTimeout(()=>C.abort(),i),L=w?Fr?Fr([w,C.signal]):w:C.signal,j=async(T,{status:N=null}={})=>{let B=await Lt(T,O);if(!B.ok)throw pe(N==null?`HTTP refused ${T}: ${B.error}`:`HTTP redirect to ${T} ${B.error}`,N==null?{}:{status:N});let D=new URL(T).hostname;if(l){if(_&&(await _.close(),_=null),!_)try{_=await Mt({requireUndici:!0,...p?{importUndici:p}:{}})}catch(c){throw pe(N==null?`HTTP refused ${T}: ${c?.message||c}`:`HTTP redirect to ${T} refused: ${c?.message||c}`,N==null?{}:{status:N})}_.pin(D,B.addresses),R=_.fetch}else jr(R,D,B.addresses);return B};try{let T=String(e),N=Object.assign(Object.create(null),n||{});u&&await j(T);for(let B=0;B<=v;B+=1){let D=Object.assign(Object.create(null),{method:r,headers:N,body:o,signal:L,redirect:"manual",dispatcher:void 0}),c=await R(T,D);if((S==="error"||v===0)&&c.status>=300&&c.status<400)throw Ee(c),pe(`HTTP ${c.status} ${r} redirect refused`,{status:c.status,redirectRefused:!0});if(Di.has(c.status)){let y=a===!0&&r==="POST"&&[307,308].includes(c.status)&&Gr(r,o);if(r!=="GET"&&r!=="HEAD"&&!y){Ee(c);let k=new Error(`HTTP ${c.status} ${r} ${T} redirected non-idempotent request`);throw k.status=c.status,k}if(B===v)throw Ee(c),pe(`HTTP ${c.status} ${r} redirect budget exhausted`,{status:c.status,redirectRefused:!0});let h=c.headers?.get?.("location"),g;try{g=qi(h,T)}catch(k){throw Ee(c),k}let E=!Ki(g,T);if(Ee(c),E&&r==="POST"){let k=new Error(`HTTP ${c.status} ${r} cross-origin redirect refused`);throw k.status=c.status,k}if(E&&a){let k=new Error(`HTTP ${c.status} ${r} cross-origin redirect refused`);throw k.status=c.status,k.retryable=!1,k}if(E&&(N=Ui(N)),u)await j(g,{status:c.status});else if(E){let k=await Lt(g,O);if(!k.ok){let A=new Error(`HTTP redirect from ${T} ${k.error}`);throw A.status=c.status,A.retryable=!1,A}l&&k.addresses?.length&&(_||(_=await Mt(p?{importUndici:p}:{})),_&&(_.pin(new URL(g).hostname,k.addresses),R=_.fetch))}T=g;continue}if(typeof b=="function")try{await b(c,{url:T})}catch(y){throw Ee(c),pe(y?.message||String(y))}let f=await Zi(c,d,{url:T,onOversize:()=>C.abort()}),m=Qi(f);if(!c.ok){let y=new Error(`HTTP ${c.status} ${r} ${T}`);throw y.status=c.status,y.retryAfter=c.headers?.get?.("retry-after")??null,y.body=m??f.slice(0,300),y}return m??f}throw new Error(`HTTP redirect loop for ${e}`)}catch(T){if(C.signal.aborted&&!Ce(w)){let N=T&&(typeof T=="object"||typeof T=="function")&&!le.isProxy(T)?T:null,B=N?Object.getOwnPropertyDescriptor(N,"oversize"):null;if(!(B&&Object.hasOwn(B,"value")&&B.value===!0))try{if(!N)throw new TypeError("unsafe rejection");Object.defineProperties(N,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}})}catch{let c=new Error("HTTP request timed out");throw Object.defineProperties(c,{oracleTimeout:{value:!0,enumerable:!1},retryable:{value:!1,enumerable:!1}}),c}}throw T}finally{clearTimeout(x),_&&await _.close()}}async function Jr(e,t={}){if(t!=null&&typeof t!="object"&&typeof t!="function")throw new TypeError("HTTP options must be an object");if(t!=null&&le.isProxy(t))throw new TypeError("HTTP options must not be a proxy");let r=new Set(["body","dedupe","fetchImpl","headers","importUndici","lookupFn","maxRedirects","maxResponseBytes","method","redirectPolicy","retries","sameOriginRedirectsOnly","signal","timeoutMs","untrustedUrl","validateResponse"]);if(t!=null){if(Object.getOwnPropertySymbols(t).length>0)throw new TypeError("HTTP options contain unknown fields");for(let A of Object.getOwnPropertyNames(t)){let I=Object.getOwnPropertyDescriptor(t,A);if(!(A==="toJSON"&&I&&Object.hasOwn(I,"value")&&I.value===void 0)){if(!r.has(A))throw new TypeError("HTTP options contain unknown fields");if(!I||!I.enumerable||!Object.hasOwn(I,"value"))throw new TypeError("HTTP options must contain enumerable own data properties")}}}let n=A=>{if(t==null||!Object.hasOwn(t,A))return;let I=Object.getOwnPropertyDescriptor(t,A);if(!I||!Object.hasOwn(I,"value"))throw new TypeError("HTTP options must contain own data properties");return I.value};if(typeof e!="string"||e.length===0||e.length>8192)throw new TypeError("HTTP URL must be a bounded string");let o=n("method");if(o!==void 0&&(typeof o!="string"||!/^[A-Za-z]+$/u.test(o)))throw new TypeError("HTTP method must be a string token");let i=n("timeoutMs");if(i!==void 0&&(!Number.isInteger(i)||i<1||i>12e4))throw new TypeError("HTTP timeoutMs must be a bounded integer");let s=n("retries");if(s!==void 0&&(!Number.isInteger(s)||s<0||s>10))throw new TypeError("HTTP retries must be a bounded integer");let l=n("redirectPolicy");if(l!==void 0&&l!=="follow"&&l!=="error")throw new TypeError('HTTP redirectPolicy must be "follow" or "error"');let u=n("maxRedirects");if(u!==void 0&&(!Number.isInteger(u)||u<0||u>ot))throw new TypeError(`HTTP maxRedirects must be an integer from 0 through ${ot}`);if(l==="error"&&u!==void 0&&u!==0)throw new TypeError('HTTP redirectPolicy "error" requires maxRedirects 0 when supplied');let d=l??"follow",a=d==="error"?0:u??ot;for(let A of["dedupe","untrustedUrl","sameOriginRedirectsOnly"]){let I=n(A);if(I!==void 0&&typeof I!="boolean")throw new TypeError(`HTTP ${A} must be boolean`)}let p=n("maxResponseBytes");if(p!==void 0&&(!Number.isInteger(p)||p<1||p>64*1024*1024))throw new TypeError("HTTP maxResponseBytes must be a bounded integer");let b=n("signal");if(b!==void 0){if(le.isProxy(b)||!(b instanceof AbortSignal))throw new TypeError("HTTP signal must be a native AbortSignal");try{Ce(b)}catch{throw new TypeError("HTTP signal must be a native AbortSignal")}}for(let A of["importUndici","lookupFn","validateResponse"]){let I=n(A);if(I!==void 0&&typeof I!="function")throw new TypeError(`HTTP ${A} must be a function`)}let w=n("fetchImpl"),S=w||globalThis.fetch;if(typeof S!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let v=i??12e3,_=(o||"GET").toUpperCase(),R=n("headers"),O=Fi(R),C=Object.assign(Object.create(null),O);Object.keys(C).some(A=>A.toLowerCase()==="accept")||(C.Accept="application/json");let x=n("body");x!=null&&typeof x!="string"&&(Object.keys(C).find(I=>I.toLowerCase()==="content-type")||(C["Content-Type"]="application/json"),x=zi(x));let L=s??Ri,j=n("lookupFn"),T=!w,N=n("untrustedUrl")===!0,B=n("sameOriginRedirectsOnly")===!0,D=n("importUndici"),c=n("validateResponse"),f=b,m=p??null,y=async()=>{let A;for(let I=0;I<=L;I++){f&&Ci.call(f);let q=tt("http");try{let $=await es(e,{fetchImpl:S,method:_,headers:C,body:x,timeoutMs:v,lookupFn:j,realFetch:T,untrustedUrl:N,maxResponseBytes:m,sameOriginRedirectsOnly:B,importUndici:D,validateResponse:c,signal:f,redirectPolicy:d,maxRedirects:a});return q?.("succeeded"),$}catch($){A=$;let H=wt=>{if(!$||typeof $!="object"&&typeof $!="function"||le.isProxy($))return;let ve=Object.getOwnPropertyDescriptor($,wt);return ve&&Object.hasOwn(ve,"value")?ve.value:void 0},U=H("status");q?.("failed",U);let Y=H("oracleTimeout")===!0||H("name")==="AbortError"||H("name")==="TimeoutError"||Ce(f),ge=new Set([408,425,429]),Ae=H("retryable")===!1?!1:U!=null?ge.has(U)||Ni.has(U)&&Dr.has(_):!Y&&Dr.has(_);if(I===L||!Ae)throw $;let W=Vi(I,H("retryAfter")),qe=tt("retry"),pr=!1;try{f?await new Promise((wt,ve)=>{let mr,_e=()=>{clearTimeout(mr),zr.call(f,"abort",_e),ve(Hi(f)||new DOMException("Aborted","AbortError"))};if(Ce(f)){_e();return}mr=setTimeout(()=>{zr.call(f,"abort",_e),wt()},W),ji.call(f,"abort",_e,{once:!0}),Ce(f)&&_e()}):await Wi(W),pr=!0}finally{qe?.(pr?"succeeded":"failed")}}}throw A};if(!(n("dedupe")!==!1&&!f&&Gr(_,x)))return y();let g=Yi(_,e,C,{untrustedUrl:N,maxResponseBytes:m,sameOriginRedirectsOnly:B,redirectPolicy:d,maxRedirects:a,timeoutMs:v,retries:L,fetchImpl:nt(S),realFetch:T,lookupFn:nt(j),importUndici:nt(D),validateResponse:nt(c)},x),E=Ht.get(g);if(E){let A=tt("shared");try{let I=await E;return A?.("succeeded"),I}catch(I){throw A?.("failed"),I}}let k=y().finally(()=>Ht.delete(g));return Ht.set(g,k),k}var Ni,Dr,Ri,Br,Li,Mi,Ci,ji,zr,Fr,Ce,Hi,Di,ot,jc,ce,Ht,Ur,qr,Gi,Ji,Wi,Yr=Z(()=>{Cr();Hr();Ni=new Set([408,425,429,500,502,503,504]),Dr=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),Ri=2,Br=4e3,Li=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,Mi=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,Ci=AbortSignal.prototype.throwIfAborted,ji=EventTarget.prototype.addEventListener,zr=EventTarget.prototype.removeEventListener,Fr=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null,Ce=e=>e?Li.call(e):!1,Hi=e=>e?Mi.call(e):void 0,Di=new Set([301,302,303,307,308]),ot=3,jc=64*1024,ce=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});Ht=new Map,Ur=new WeakMap,qr=1;Gi=new Set(["eth_blockNumber","eth_call","eth_chainId","eth_estimateGas","getHealth","minimumLedgerSlot","net_version","simulateTransaction","web3_clientVersion"]),Ji=new Set(["allMids","l2Book","outcomeMeta","spotClearinghouseState","userFills","meta","metaAndAssetCtxs","perpDexs","candleSnapshot","fundingHistory","openOrders","frontendOpenOrders","clearinghouseState","spotMeta","validatorSummaries","delegatorSummary","delegations","delegatorRewards","delegatorHistory","maxBuilderFee"]);Wi=e=>new Promise(t=>setTimeout(t,e))});import{types as Vr}from"node:util";function ts(e){if(!e||typeof e!="object"||Vr.isProxy(e)||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function it(e,t="provider response",r=0){if(r>64)throw new Error(`${t} exceeds the JSON nesting bound`);if(e===null||typeof e=="string"||typeof e=="boolean"||typeof e=="number"&&Number.isFinite(e))return e;if(Array.isArray(e)){if(Vr.isProxy(e)||e.length>1e5)throw new Error(`${t} contains an invalid array`);let o=new Array(e.length);for(let i=0;i<e.length;i+=1){let s=Object.getOwnPropertyDescriptor(e,String(i));if(!s||!Object.hasOwn(s,"value"))throw new Error(`${t} arrays must contain dense own data`);o[i]=it(s.value,t,r+1)}return o}if(!ts(e))throw new Error(`${t} contains a non-JSON value`);let n=Object.create(null);for(let o of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,o);if(!i||!Object.hasOwn(i,"value"))throw new Error(`${t} objects must contain own data`);n[o]=it(i.value,t,r+1)}return n}var Wr=Z(()=>{});function os({testnet:e,baseUrl:t}={}){if(t)return t.replace(/\/$/,"").endsWith("/info")?t:`${t.replace(/\/$/,"")}/info`;if(process.env.HL_INFO_URL)return process.env.HL_INFO_URL;if(process.env.HL_API_URL){let r=process.env.HL_API_URL.replace(/\/$/,"");return r.endsWith("/info")?r:`${r}/info`}return e||process.env.HL_TESTNET==="1"?ns:rs}async function Se(e,t={}){if(!e||!e.type)throw new Error("hlInfo requires body.type");let r=os(t);return it(await Jr(r,{method:"POST",body:e,fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs,maxResponseBytes:t.maxResponseBytes,sameOriginRedirectsOnly:t.sameOriginRedirectsOnly,signal:t.signal}),"hyperliquid info response")}async function Xr(e={}){return Se({type:"allMids"},e)}async function Zr(e={}){let t={type:"metaAndAssetCtxs"};return e.dex&&(t.dex=e.dex),Se(t,e)}var rs,ns,Bt=Z(()=>{Yr();Wr();rs="https://api.hyperliquid.xyz/info",ns="https://api.hyperliquid-testnet.xyz/info"});async function en(e={}){let t=Date.now();if(je.dexs&&t-je.at<6e4&&!e.fetchImpl)return je.dexs;let r=await Se({type:"perpDexs"},e);return je={at:t,dexs:Array.isArray(r)?r:[]},je.dexs}async function tn(e="",t={}){let r=e||"",n=Date.now(),o=Qr.get(r);if(o&&n-o.at<3e4&&!t.fetchImpl)return o;let i=e?await Se({type:"metaAndAssetCtxs",dex:e},t):await Zr(t),s=i?.[0]?.universe??i?.universe??[],l=Array.isArray(i?.[1])?i[1]:[],u={at:n,universe:s,ctxs:l};return Qr.set(r,u),u}function as(e){let t=String(e??"").trim();if(!t)return t;let r=t.toLowerCase().replace(/[\s._-]+/g,"");return ss[r]??t}function st(e){if(typeof e!="string"||!/^#(?:0|[1-9]\d*)$/.test(e))return null;let t=Number(e.slice(1));if(!Number.isSafeInteger(t)||t<0)return null;let r=t%10;if(r!==0&&r!==1)return null;let n=Math.floor(t/10),o=nn+t;return Number.isSafeInteger(o)?{encoding:t,outcome:n,side:r,coin:`#${t}`,assetId:o}:null}function rn(e,t){let r=zt(e),n=zt(t);if(r==null)throw new Error("hl-assets: outcome id must be a non-negative integer");if(n!==0&&n!==1)throw new Error("hl-assets: outcome side must be 0 or 1");let o=10*r+n;if(!Number.isSafeInteger(o))throw new Error("hl-assets: outcome encoding exceeds safe integer range");let i=nn+o;if(!Number.isSafeInteger(i))throw new Error("hl-assets: outcome asset id exceeds safe integer range");return{encoding:o,outcome:r,side:n,coin:`#${o}`,assetId:i}}function zt(e){if(typeof e=="number")return Number.isSafeInteger(e)&&e>=0?e:null;if(typeof e!="string"||!/^(?:0|[1-9]\d*)$/.test(e))return null;let t=Number(e);return Number.isSafeInteger(t)?t:null}async function Ft(e={},t={}){if(e.outcome!=null||typeof e.coin=="string"&&e.coin.startsWith("#")){let d=e.coin==null?null:st(e.coin);if(e.coin!=null&&!d)throw new Error(`hl-assets: invalid outcome coin ${e.coin}`);let a=e.outcome==null?null:rn(e.outcome,0).outcome;if(a!=null&&d&&d.outcome!==a)throw new Error("hl-assets: coin does not match outcome");let p=e.outcomeSide==null?null:cs(e.outcomeSide,"outcomeSide"),b=a??d?.outcome;if(e.outcome!=null&&e.coin==null&&p==null)throw new Error("hl-assets: outcomeSide required");let w=p??d?.side;if(w==null)throw new Error("hl-assets: outcomeSide required");if(b==null)throw new Error("hl-assets: outcome identity required");let S=rn(b,w);if(d&&(d.outcome!==S.outcome||d.side!==S.side))throw new Error("hl-assets: coin does not match outcome side");let v=e.szDecimals!=null?Number(e.szDecimals):2;return{kind:"outcome",coin:S.coin,assetId:S.assetId,encoding:S.encoding,outcome:S.outcome,side:S.side,szDecimals:v,maxLeverage:1,dex:null,markPx:null}}let r=String(e.coin||e.symbol||e.name||"").trim();if(!r)throw new Error("hl-assets: coin required");if(r.includes(":")){let[d,...a]=r.split(":"),p=a.join(":");if(!d||!p)throw new Error(`hl-assets: bad builder coin ${r}`);let b=as(d),w=await en(t),S=w.findIndex(L=>L&&L.name===b);if(S<1)throw new Error(`hl-assets: unknown builder dex "${d}"`);let{universe:v,ctxs:_}=await tn(b,t),R=v.findIndex(L=>L.name===`${b}:${p}`);if(R<0)throw new Error(`hl-assets: ${r} not in dex ${b} meta`);let O=v[R];if(O.isDelisted)throw new Error(`hl-assets: ${r} is delisted`);let C=is+S*1e4+R,x=_[R]||{};return{kind:"hip3",coin:O.name||r,assetId:C,szDecimals:O.szDecimals??0,maxLeverage:O.maxLeverage??null,dex:b,dexName:w[S]?.fullName||b,dexIndex:S,indexInMeta:R,markPx:x.markPx??null}}let{universe:n,ctxs:o}=await tn("",t),i=r.toUpperCase(),s=n.findIndex(d=>d.name===i);if(s<0){if(t.allowBareBuilderLeaf===!0)try{let d=await en(t);for(let a=1;a<d.length;a++){let p=d[a];if(!p?.name)continue;let b=`${p.name}:${i}`;try{return await Ft({coin:b},t)}catch{}}}catch{}throw new Error(`hl-perps: ${i} is not a listed perp`)}let l=n[s];if(l.isDelisted)throw new Error(`hl-assets: ${i} is delisted`);let u=o[s]||{};return{kind:"main",coin:l.name,assetId:s,szDecimals:l.szDecimals??0,maxLeverage:l.maxLeverage??null,dex:"",markPx:u.markPx??null}}function cs(e,t){let r=zt(e);if(r!==0&&r!==1)throw new Error(`hl-assets: ${t} must be 0 or 1`);return r}var nn,is,je,Qr,ss,Ut=Z(()=>{Bt();nn=1e8,is=1e5,je={at:0,dexs:null},Qr=new Map;ss=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"})});import{createHash as ls,createHmac as ds,timingSafeEqual as Jc}from"node:crypto";function qt(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(qt).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${qt(e[r])}`).join(",")}}`}function on(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function sn(e=process.env){return on(process.env)||on(e)}function ms(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function hs(e){let t=ms(e);return ls("sha256").update(qt(t)).digest("hex")}function ws(e,t=sn()){return t?ds("sha256",t).update(String(e)).digest("hex"):""}function Kt(e,{provider:t,kind:r,env:n=process.env,nowMs:o=Date.now(),expiresAtMs:i}={}){if(!e||typeof e!="object")throw new Error("stampPrepared: payload object required");let s=Object.prototype.hasOwnProperty.call(e,"oraclePrepared");if(s&&typeof e.oraclePrepared!="boolean")throw new Error("stampPrepared: oraclePrepared must be boolean");let l={...e,provider:e.provider||t,kind:e.kind||r,requiresUserSignature:e.requiresUserSignature!==!1,signingReady:!1,broadcastReady:!1,executionReady:!1,oraclePrepared:s?e.oraclePrepared:!0};if(!l.provider)throw new Error("stampPrepared: provider required");if(!l.kind)throw new Error("stampPrepared: kind required");let u=Number(o),d=i==null?u+fs:Number(i),a=d-u;if(!Number.isSafeInteger(u)||!Number.isSafeInteger(d)||a<=0||a>ps)throw new Error("stampPrepared: bounded preparedAt/expiresAt required");let b={...l,preparedAt:u,expiresAt:d,prepareVersion:us},w=hs(b),S=sn(n),v=S?ws(w,S):void 0,_={...b,prepareHash:w};return v&&(_.prepareMac=v),_}var us,fs,ps,an=Z(()=>{us=2,fs=300*1e3,ps=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});function Es(e,t){let r=e.toString().padStart(t+1,"0");if(t===0)return r;let n=r.slice(0,-t),o=r.slice(-t).replace(/0+$/,"");return o?`${n}.${o}`:n}function cn(e,t){let r=V(e,`hl: ${t}`);if(!/^\d+(?:\.\d+)?$/.test(r))throw new Error(`hl: ${t} must be a positive decimal`);let[n,o=""]=r.split("."),i=BigInt(n+o);if(i<=0n)throw new Error(`hl: ${t} must be positive`);return{raw:i,decimals:o.length}}function oe(e,t){if(e===null||typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`hl: ${t} must be finite JSON`);return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(n=>oe(n,t)).join(",")}]`;if(!e||typeof e!="object")throw new Error(`hl: ${t} must be structured JSON`);return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${oe(e[n],t)}`).join(",")}}`}function Ss(e){if(typeof e.orderType!="string"||!e.orderType)throw new Error("hl: order type must be a string");let t=e.orderType,r=e.orderWire;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: declared order wire required");if(t==="limit"){let i=r.limit?.tif;if(!["Gtc","Ioc","Alo"].includes(i)||oe(r,"declared order type")!==oe({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(oe(r,"declared order type")!==oe({limit:{tif:"Ioc"}},"expected order type"))throw new Error("hl: market order type must match its IOC wire shape");return}let n={stopMarket:{isMarket:!0,tpsl:"sl"},stopLimit:{isMarket:!1,tpsl:"sl"},takeProfitMarket:{isMarket:!0,tpsl:"tp"},takeProfitLimit:{isMarket:!1,tpsl:"tp"}}[t];if(!n)throw new Error("hl: unsupported declared order type");let o=r.trigger?.triggerPx;if(o==null||oe(r,"declared order type")!==oe({trigger:{isMarket:n.isMarket,triggerPx:o,tpsl:n.tpsl}},"expected order type"))throw new Error("hl: trigger order type must match its wire shape")}function ks(e,t,r){let n=cn(e.s,"signed size"),o=cn(e.p,"signed price"),i=n.decimals+o.decimals,s=n.raw*o.raw,l=J(t.notionalUsd,i,"hl: notionalUsd");if(l<=0n||s!==l)throw new Error("hl: signed notional must match");let u=J(r.maxNotionalUsd,i,"hl: maxNotionalUsd");if(s>u)throw new Error("hl: notional exceeds cap")}function As(e,t){let r=e.action.builder;if(r==null){if(e.builder!=null)throw new Error("hl: declared builder requires a signed builder");return}if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: signed order builder must be structured");let n=me(r.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(n))throw new Error("hl: order builder address required");if(Mr(e.builder||"","hl: builder").toLowerCase()!==n)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(l=>String(l).toLowerCase()):[]).includes(n))throw new Error("hl: order builder not allowed");let i=Pt(r.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let s=J(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>s)throw new Error("hl: order builder fee exceeds cap")}function ln(e,t,r){if(!Number.isSafeInteger(e.a)||e.a!==r)throw new Error("hl: signed asset must match assetId");if(typeof e.b!="boolean"||e.b!==(t.side==="buy"))throw new Error("hl: signed side must match exactly");if(V(e.s,"hl: signed size")!==V(t.size,"hl: size"))throw new Error("hl: signed size must match");if(V(e.p,"hl: signed price")!==V(t.price,"hl: price"))throw new Error("hl: signed price must match");if(typeof t.reduceOnly!="boolean"||typeof e.r!="boolean"||e.r!==t.reduceOnly)throw new Error("hl: signed reduceOnly must match exactly");if(oe(e.t,"signed order type")!==oe(t.orderWire,"declared order type"))throw new Error("hl: signed order type must match declared order type");let n=Object.prototype.hasOwnProperty.call(e,"c");if(t.clientOrderId==null){if(n)throw new Error("hl: undeclared signed client order id")}else if(!n||typeof e.c!="string"||e.c!==t.clientOrderId)throw new Error("hl: signed client order id must match")}function dn(e,t,r,n,o){if(!Number.isSafeInteger(e.a)||e.a!==r)throw new Error("hl: bracket protection asset must match");if(typeof e.b!="boolean"||e.b===(t.side==="buy"))throw new Error("hl: bracket protection side must oppose entry");if(V(e.s,"hl: bracket protection size")!==V(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(V(e.p,"hl: bracket protection price")!==V(n,"hl: protection price"))throw new Error("hl: bracket protection price must match");if(e.r!==!0)throw new Error("hl: bracket protection must be reduce-only");let i=e.t?.trigger;if(!i||i.isMarket!==!0||i.tpsl!==o)throw new Error("hl: bracket protection trigger must match");if(V(i.triggerPx,"hl: triggerPx")!==V(n,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function Ts(e){let t=String(e||"").replace(/\/$/,"");if(!gs.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function Gt(e){return st(e)!=null}function Os(e,t){let r=String(e||""),n=Array.isArray(t.coins)?t.coins.map(String):[];if(Gt(r)){if(t.hip4!==!0)throw new Error("hl: HIP-4 outcome orders are disabled without explicit policy enablement");if(n.includes(r)||n.includes("#*")||n.includes("*")||n.length===0)return!0;throw new Error("hl: outcome coin not allowed")}if(n.length&&!n.includes(r)&&!n.includes("*"))throw new Error("hl: coin not allowed");return!0}function Is(e,t,r){let n=Array.isArray(r.hlMarkets)?r.hlMarkets:[];if(n.length){if(!n.some(s=>{if(typeof s=="string"){let[l,u]=String(s).split(":");return l===e&&Number(u)===t}return String(s?.coin)===e&&Number(s?.assetId)===t}))throw new Error("hl: coin/assetId pair not allowed");return!0}if(Gt(e)){let i=Array.isArray(r.coins)?r.coins.map(String):[];if(i.includes("#*")||i.includes("*")||i.length===0)return!0;throw new Error("hl: restricted coin policy requires hlMarkets pairs")}let o=Array.isArray(r.coins)?r.coins.map(String):[];if(o.length&&!o.includes("*"))throw new Error("hl: restricted coin policy requires hlMarkets pairs");return!0}function un(e,t){if(e?.surface!=="hl")throw new Error("hl: surface hl required");let r=e.artifact;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: structured artifact required");let n=me(r.kind,"kind",48),o=bs[n];if(!o)throw new Error("hl: unsupported Hyperliquid kind");if(e.action!==o)throw new Error("hl: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="hyperliquid")throw new Error("hl: destination must be hyperliquid");if(!/^0x[0-9a-fA-F]{40}$/.test(String(e.owner||"")))throw new Error("hl: owner required");let i=Ts(r.submitTo);if(Object.prototype.hasOwnProperty.call(r,"vaultAddress"))throw new Error("hl: vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(r,"expiresAfter"))throw new Error("hl: expiresAfter is not public");let s=Number(r.nonce);if(!Number.isSafeInteger(s)||s<=0)throw new Error("hl: nonce must be a positive integer");if(!r.action||typeof r.action!="object")throw new Error("hl: signed action required");if(Object.prototype.hasOwnProperty.call(r.action,"vaultAddress"))throw new Error("hl: action vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(r.action,"expiresAfter"))throw new Error("hl: action expiresAfter is not public");if(r.action.type!==xs[n])throw new Error("hl: action type must match kind");let l=r.notionalUsd??0;if(ys.has(n)||n==="perp-cancel"||n==="perp-leverage"||n==="perp-isolated-margin"){let u=me(r.coin,"coin",64),d=r.assetId??r.assetIndex;if(!Number.isSafeInteger(d)||d<0)throw new Error("hl: assetId required");if(n==="hip4-order"||d>=1e8){let a=st(u);if(!a||a.coin!==u)throw new Error("hl: HIP-4 actions must use a canonical outcome coin");if(a.assetId!==d)throw new Error("hl: HIP-4 coin must bind to its canonical assetId")}if(Os(u,t),Is(u,d,t),n==="hip4-order"&&!Gt(u))throw new Error("hl: HIP-4 orders must use an outcome coin");if(n==="perp-order"||n==="hip3-order"||n==="hip4-order"||n==="perp-bracket"){if(r.side!=="buy"&&r.side!=="sell")throw new Error("hl: side must be buy or sell");if(r.action.type!=="order"||!Array.isArray(r.action.orders))throw new Error("hl: signed orders are required");Ss(r);let a=r.action.orders;if(n==="perp-bracket"){let p=r.takeProfitPx,b=r.stopLossPx,w=1+(p==null?0:1)+(b==null?0:1);if(w<2||a.length!==w||r.grouping!=="normalTpsl"||r.action.grouping!==r.grouping)throw new Error("hl: bracket must contain exactly the declared entry and protection legs");ln(a[0],r,d);let S=1;p!=null&&dn(a[S++],r,d,p,"tp"),b!=null&&dn(a[S],r,d,b,"sl")}else{if(a.length!==1)throw new Error("hl: exactly one signed order is required");if(r.grouping!=="na"||r.action.grouping!==r.grouping)throw new Error("hl: signed grouping must match declared grouping");ln(a[0],r,d)}ks(a[0],r,t),As(r,t),l=V(r.notionalUsd,"hl: notionalUsd")}if(n==="perp-leverage"){let a=r.leverage;if(!Number.isSafeInteger(a)||a<1)throw new Error("hl: leverage must be a positive integer");let p=t.maxLeverage==null?50:t.maxLeverage;if(typeof p!="number"||!Number.isSafeInteger(p)||p<1)throw new Error("hl: maxLeverage must be a positive integer");if(a>p)throw new Error("hl: leverage exceeds cap")}if(n==="perp-cancel"){let a=r.action.cancels;if(!Array.isArray(a)||a.length!==1)throw new Error("hl: exactly one cancel is required");if(!Number.isSafeInteger(a[0].a)||a[0].a!==d)throw new Error("hl: signed cancel asset must match assetId");if(!Number.isSafeInteger(r.orderId)||r.orderId<0)throw new Error("hl: declared order id required");if(!Number.isSafeInteger(a[0].o)||a[0].o!==r.orderId)throw new Error("hl: signed cancel order id must match")}if(n==="perp-leverage"){if(!Number.isSafeInteger(r.action.asset)||r.action.asset!==d)throw new Error("hl: signed leverage asset must match assetId");if(!Number.isSafeInteger(r.action.leverage)||r.action.leverage!==r.leverage)throw new Error("hl: signed leverage must match");if(!["cross","isolated"].includes(r.marginMode))throw new Error("hl: declared margin mode required");let a=r.marginMode==="cross";if(typeof r.action.isCross!="boolean"||r.action.isCross!==a)throw new Error("hl: signed isCross must match declared margin mode")}if(n==="perp-isolated-margin"){if(!Number.isSafeInteger(r.action.asset)||r.action.asset!==d)throw new Error("hl: signed margin asset must match assetId");let a=me(r.usd,"margin usd",64),p=J(a,6,"hl: margin usd");if(Pt(r.action.ntli,"hl: signed margin ntli")!==p)throw new Error("hl: signed margin amount must match usd");if(typeof r.isBuy!="boolean"||r.action.isBuy!==r.isBuy)throw new Error("hl: signed margin isBuy must match");let w=J(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),S=p<0n?-p:p;if(S>w)throw new Error("hl: margin notional exceeds cap");l=Es(S,6)}}if(n==="builder-fee-approval"){let u=me(r.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(u))throw new Error("hl: builder address required");if(me(r.action.builder,"signed builder",42).toLowerCase()!==u)throw new Error("hl: signed builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(S=>String(S).toLowerCase()):[]).includes(u))throw new Error("hl: builder not allowed");let a=me(r.maxFeeRate,"maxFeeRate",32);if(me(r.action.maxFeeRate,"signed maxFeeRate",32)!==a)throw new Error("hl: signed builder fee must match");if(!/^\d+(?:\.\d+)?%$/.test(a))throw new Error("hl: builder fee rate must be a percent");let p=J(a.slice(0,-1),12,"hl: builder fee percent"),b=J(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(b<0n||p*100n>b)throw new Error("hl: builder fee exceeds cap");if(Number(r.action.nonce)!==s)throw new Error("hl: signed builder nonce must match");let w=i.includes("testnet")?"Testnet":"Mainnet";if(r.hyperliquidChain!==w||r.action.hyperliquidChain!==r.hyperliquidChain)throw new Error("hl: signed Hyperliquid chain must match destination");if(r.signatureChainId!=="0x66eee"||r.action.signatureChainId!==r.signatureChainId)throw new Error("hl: signed signature chain id must match")}if(n.startsWith("hype-stake")||n==="hype-delegate"||n==="hype-undelegate"){if(n==="hype-delegate"||n==="hype-undelegate"){let u=n==="hype-undelegate";if(typeof r.action.isUndelegate!="boolean"||r.action.isUndelegate!==u)throw new Error("hl: signed isUndelegate must match delegate kind exactly")}if(t.maxHypeWei!=null&&BigInt(String(r.action.wei??r.caps?.amountHype??"0"))>BigInt(t.maxHypeWei))throw new Error("hl: stake amount exceeds cap")}return Object.freeze({unit:"usd",value:String(l??r.action.wei??0),notional:String(l??0),fee:"0",kind:n,actionType:r.action.type,amount:String(r.action.wei??l??0),coin:r.coin||null,submitTo:i})}var gs,ys,bs,xs,me,fn=Z(()=>{et();Ut();gs=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),ys=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),bs=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),xs=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"}),me=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`hl: bounded ${t} required`);return e}});function _s(e){let t=e.owner||e.user||e.from||e.recipient;if(!/^0x[0-9a-fA-F]{40}$/.test(String(t||"")))throw new Error("hl: owner/user address required for local-signer envelope");return String(t).toLowerCase()}function pn(e,t={},r={}){let n=String(e?.kind||""),o=vs[n];if(!o)throw new Error("hl: prepared kind is not a local-signer surface");if(!e?.action||typeof e.action!="object")throw new Error("hl: prepared action required");let i=Number(r.nowMs??Date.now()),s=Math.min(6e4,Math.max(1e3,Number(t.ttlMs??t.expiresInMs??3e4)||3e4)),l=String(e.submitTo||"").replace(/\/$/,""),u={version:1,surface:"hl",action:o,owner:_s(t),destination:"hyperliquid",tradeId:String(t.tradeId||`hl:${n}:${e.nonce}`),expiresAtMs:i+s,slippageBps:Number(t.slippageBps??0),fee:{oracleFeeBps:0},provider:e.provider,artifact:{kind:n,coin:e.coin??null,assetId:e.assetId??e.assetIndex??null,side:e.side??null,size:e.size??null,price:e.price??null,reduceOnly:e.reduceOnly??null,orderType:e.orderType??null,orderWire:e.action?.orders?.[0]?.t??null,clientOrderId:e.action?.orders?.[0]?.c??null,grouping:e.action?.grouping??null,orderId:e.orderId??null,leverage:e.leverage??null,marginMode:e.marginMode??null,notionalUsd:e.notionalUsd??0,usd:e.usd??null,isBuy:e.isBuy??null,takeProfitPx:e.takeProfitPx??null,stopLossPx:e.stopLossPx??null,builder:e.builderFee?.address??e.action?.builder??null,maxFeeRate:e.builderFee?.percent??e.action?.maxFeeRate??null,nonce:e.nonce,hyperliquidChain:e.action?.hyperliquidChain??null,signatureChainId:e.signatureChainId||e.action?.signatureChainId||"0xa4b1",submitTo:l,action:e.action,typedData:e.typedData||null,caps:e.caps||null}};return un(u,{coins:t.coins||["*"],hip4:!0,maxNotionalUsd:t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,maxLeverage:t.maxLeverage??50,hlBuilders:t.hlBuilders||(e.builderFee?.address?[e.builderFee.address]:[]),maxBuilderFeeBps:t.maxBuilderFeeBps??e.builderFee?.bps}),u}var vs,mn=Z(()=>{fn();vs=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"})});import{Contract as $s,JsonRpcProvider as Ps}from"ethers";function js(e){return Cs.test(String(e||""))}async function Jt(e,{contract:t=Ns,rpc:r=Ls,chainId:n=Rs,balanceOf:o}={}){if(!js(e))throw new Error("invalid-address");if(o)return BigInt(await o(e));let i=new Ps(r,n,{staticNetwork:!0}),s=new $s(t,Ms,i);return BigInt(await s.balanceOf(e))}var Ns,Rs,Ls,Ms,Cs,Yt=Z(()=>{Ns="0x62FCFAf7573AD8B41a0FBF347AfEb85e06599A75",Rs=999,Ls="https://rpc.hyperliquid.xyz/evm",Ms=["function balanceOf(address owner) view returns (uint256)"],Cs=/^0x[a-fA-F0-9]{40}$/});import{existsSync as Hs,readFileSync as Ds,lstatSync as Bs}from"node:fs";import{homedir as hn}from"node:os";import{join as Vt}from"node:path";function zs(e=process.env){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){if(e[wn])return String(e[wn]);let t=e.ORACLE_CONFIG_DIR||Vt(hn(),".config","oracle");return Vt(t,"fee-recipient")}return Vt(hn(),".config","oracle","fee-recipient")}function gn(e=process.env){try{let t=zs(e);if(!Hs(t)||Bs(t).isSymbolicLink())return"";let r=Ds(t,"utf8").trim().toLowerCase();return/^0x[a-f0-9]{40}$/.test(r)?r:""}catch{return""}}var sl,wn,yn=Z(()=>{Yt();sl=Object.freeze({swap:5,bridge:5,perps:0,nft:0}),wn="ORACLE_INTEGRATOR_FEE_RECIPIENT_PIN"});var On={};Zn(On,{HL_BUILDER_ADDRESS_ENV:()=>at,HL_BUILDER_DEFAULT_FEE_BPS:()=>Fs,HL_BUILDER_FEE_ENV:()=>Xt,HL_BUILDER_FEE_TIERS:()=>He,HL_BUILDER_MAX_FEE_BPS:()=>Wt,HL_PERP_MAX_SIG_FIGS:()=>bn,HL_PERP_PRICE_DECIMALS:()=>xn,HL_SIGNATURE_CHAIN_ID:()=>ct,MARGIN_MODE:()=>De,ORDER_TYPES:()=>X,TIF:()=>Be,formatPerpPrice:()=>de,formatPerpSize:()=>An,hlBuilderFeeBpsForKind:()=>kn,hlPerpAssetInfo:()=>Oe,hlPrepareApproveAgent:()=>Ws,hlPrepareBracketOrder:()=>ea,hlPrepareBuilderApproval:()=>Vs,hlPrepareCancelOrder:()=>Xs,hlPreparePerpOrder:()=>Tn,hlPrepareUpdateIsolatedMargin:()=>Qs,hlPrepareUpdateLeverage:()=>Zs,resolveBuilderFee:()=>Qt});function En(e,t){if(typeof e=="number"){if(Number.isSafeInteger(e)&&e>=0)return e}else if(typeof e=="string"&&/^(?:0|[1-9]\d*)$/.test(e)){let r=Number(e);if(Number.isSafeInteger(r))return r}throw new Error(`hl-perps: ${t} must be a non-negative safe integer`)}function Us(e,t){let r=En(e,t);if(r<1)throw new Error(`hl-perps: ${t} must be a positive integer`);return r}function qs(e={}){let t={...e};if(t.side==null)return t;if(t.side===0||t.side===1){if(t.outcomeSide!=null&&t.outcomeSide!==t.side)throw new Error("hl-perps: side conflict with outcomeSide");return t.outcomeSide=t.side,delete t.side,t}throw new Error("hl-assets: side must be 0 or 1")}function Sn(e,{defaultBuy:t=!1}={}){if(e.side!=null){if(typeof e.side!="string")throw new Error("hl-perps: side must be buy or sell");let r=e.side.toLowerCase();if(r!=="buy"&&r!=="sell")throw new Error("hl-perps: side must be buy or sell");let n=r==="buy";if(e.isBuy!=null&&(typeof e.isBuy!="boolean"||e.isBuy!==n))throw new Error("hl-perps: side and isBuy conflict");return n}if(e.isBuy==null&&t)return!0;if(typeof e.isBuy!="boolean")throw new Error("hl-perps: isBuy must be boolean when side is omitted");return e.isBuy}function kn(e="perp"){if(e==="perp"||e==="main")return He.perp;if(e==="spot")return He.spot;if(e==="hip3")return He.hip3;if(e==="outcome"||e==="hip4")return He.hip4;throw new Error(`hl-perps: unknown builder fee kind ${e}`)}function Qt({env:e=process.env,isHolder:t=!1,kind:r="perp"}={}){if(t)return null;let n=String(e?.[at]||"").trim().toLowerCase();if(!n)return null;if(!/^0x[a-f0-9]{40}$/.test(n))throw new Error(`hl-perps: ${at} must be an EVM address`);let o=gn(e);if(!o||o!==n)return null;let i=e?.[Xt],s=kn(r),l=i==null?s:Number(i);if(!Number.isFinite(l)||l<=0||Math.abs(l*10-Math.round(l*10))>1e-9)throw new Error(`hl-perps: ${Xt} must be a positive number in 0.1 bps increments`);if(l>Wt)throw new Error(`hl-perps: builder fee ${l} bps exceeds the ${Wt} bps cap`);if(l>s)throw new Error(`hl-perps: builder fee ${l} bps exceeds the ${s} bps product tier for ${r}`);let u=Math.round(l*10),d=(u/1e3).toFixed(3).replace(/0+$/,"").replace(/\.$/,"");return{wire:{b:n,f:u},disclosure:{address:n,bps:l,percent:`${d}%`}}}async function Ks(e,t={},r={}){if(!e)return{approved:!1,approvedFeeBps:0,status:"not-configured"};let n=String(t.user||r.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(n))return{approved:!1,approvedFeeBps:0,status:"wallet-required"};try{let o=Number(await Se({type:"maxBuilderFee",user:n,builder:e.disclosure.address},r));return!Number.isInteger(o)||o<0?{approved:!1,approvedFeeBps:0,status:"invalid-response"}:{approved:o>=e.wire.f,approvedFeeBps:o/10,status:o>=e.wire.f?"approved":"insufficient"}}catch{return{approved:!1,approvedFeeBps:0,status:"unavailable"}}}async function Gs(e,t={},r={}){if(!e)return{exempt:!1,status:"not-configured"};let n=String(t.user||r.user||"").trim().toLowerCase();if(!/^0x[a-f0-9]{40}$/.test(n))return{exempt:!1,status:"wallet-required"};try{let o=r.holderBalance||Jt;return BigInt(await o(n))>0n?{exempt:!0,status:"holder"}:{exempt:!1,status:"non-holder"}}catch{return{exempt:!1,status:"unavailable"}}}function er(e,t,{roundDown:r=null}={}){let n=typeof e=="number"?e.toFixed(Math.min(20,t+8)):e;if(typeof n!="string"||!/^-?\d+(\.\d+)?$/.test(n))throw new Error(`hl-perps: "${e}" is not a decimal number`);let o=n.startsWith("-"),[i,s=""]=n.replace(/^-/,"").split(".");if(s.length<=t){let S=s.replace(/0+$/,"");return(o?"-":"")+(S?`${i}.${S}`:i)}let l=s.slice(0,t),u=Number(s[t]),d=BigInt(i+l),a=s.slice(t).replace(/0+$/,"")!=="";r===!0||(r===!1?a&&(d+=1n):u>=5&&(d+=1n));let p=d.toString().padStart(t+1,"0"),w=(t===0?p:`${p.slice(0,-t)}.${p.slice(-t)}`).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,"");return(o?"-":"")+w}function Js(e,t,r={}){if(typeof e!="number"&&typeof e!="string")throw new Error(`hl-perps: "${e}" is not a decimal number`);let n=typeof e=="number"?String(e):e;if(!n.includes("."))return n;let o=Number(n);if(!Number.isFinite(o)||o===0)return n;let i=Math.floor(Math.log10(Math.abs(o))),s=Math.max(0,t-1-i);return er(n,s,r)}function de(e,t,r={}){let n=xn-Number(t??0);if(n<0)throw new Error("hl-perps: szDecimals out of range");return er(Js(e,bn,r),n,r)}function An(e,t){let r=er(e,Number(t??0));if(BigInt(r.split(".")[0])<0n)throw new Error("hl-perps: size must be positive");if(Number(r)<=0)throw new Error("hl-perps: size rounds to zero at this asset's precision");return r}function Ys(e,t){let r=(a,p)=>{let b=String(a).trim();if(!/^\d+(?:\.\d+)?$/.test(b))throw new Error(`hl-perps: ${p} must be a positive decimal`);let[w,S=""]=b.split(".");return{raw:BigInt(w+S),decimals:S.length}},n=r(e,"size"),o=r(t,"price"),i=n.raw*o.raw,s=n.decimals+o.decimals,l=i.toString().padStart(s+1,"0");if(s===0)return l;let u=l.slice(0,-s),d=l.slice(-s).replace(/0+$/,"");return d?`${u}.${d}`:u}async function Oe(e={},t={}){let r=await Ft(e,t);return{coin:r.coin,assetId:r.assetId,szDecimals:r.szDecimals,maxLeverage:r.maxLeverage,markPx:r.markPx,kind:r.kind,dex:r.dex??null,dexName:r.dexName??null,outcome:r.outcome??null,side:r.side??null}}function Zt(e,{tif:t=Be.GTC,triggerPx:r,isMarket:n,szDecimals:o}={}){switch(e){case X.LIMIT:return{limit:{tif:t}};case X.MARKET:return{limit:{tif:Be.IOC}};case X.STOP_MARKET:case X.TAKE_PROFIT_MARKET:return{trigger:{isMarket:!0,triggerPx:de(r,o),tpsl:e===X.STOP_MARKET?"sl":"tp"}};case X.STOP_LIMIT:case X.TAKE_PROFIT_LIMIT:return{trigger:{isMarket:!1,triggerPx:de(r,o),tpsl:e===X.STOP_LIMIT?"sl":"tp"}};default:throw new Error(`hl-perps: unknown order type ${e}`)}}function ke(e,t,r={}){let n=r.testnet||process.env.HL_TESTNET==="1";return{action:e,nonce:t,signatureChainId:ct,submitTo:n?"https://api.hyperliquid-testnet.xyz/exchange":"https://api.hyperliquid.xyz/exchange",note:"Sign locally via Oracle local-signer or a wallet. Hosted Oracle does not submit."}}function Ie(e,t={},r={}){let n={...e};try{n.localSignerEnvelope=pn(n,t,r),n.prepared=!0,n.signing="awaiting-hl-signer"}catch(o){n.prepared=!1,n.localSignerEnvelope=null,n.localSignerBlockedReason=String(o?.message||o).slice(0,200),n.signing="blocked"}return n.oraclePrepared=!!n.localSignerEnvelope,Kt(n,{provider:e.provider||"hl-perps",kind:e.kind})}function Vs(e={},t={}){let r=Qt({env:t.env});if(!r)throw new Error(`hl-perps: ${at} is required`);let n=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(n)||n<=0)throw new Error("hl-perps: nonce must be a positive integer");let o={type:"approveBuilderFee",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:ct,maxFeeRate:r.disclosure.percent,builder:r.disclosure.address,nonce:n};return Ie({provider:"hl-perps",venue:"hyperliquid",kind:"builder-fee-approval",builderFee:r.disclosure,...ke(o,n,t)},e,t)}function Ws(e={},t={}){let r=String(e.agentAddress||e.agent||"").trim();if(!/^0x[0-9a-fA-F]{40}$/.test(r))throw new Error("hl-perps: agentAddress required");let n=Number(e.nonce??t.nonce??Date.now());if(!Number.isSafeInteger(n)||n<=0)throw new Error("hl-perps: nonce must be a positive integer");let o=String(e.agentName||"Oracle").slice(0,16),i={type:"approveAgent",hyperliquidChain:t.testnet||process.env.HL_TESTNET==="1"?"Testnet":"Mainnet",signatureChainId:ct,agentAddress:r.toLowerCase(),agentName:o,nonce:n};return Kt({provider:"hl-perps",venue:"hyperliquid",kind:"hl-approve-agent",unsigned:!0,broadcast:!1,agentAddress:r.toLowerCase(),agentName:o,...ke(i,n,t)},{provider:"hl-perps",kind:"hl-approve-agent",env:t.env})}async function Tn(e={},t={}){let r=await Oe(e,t);if(e.type!=null&&(typeof e.type!="string"||!e.type))throw new Error("hl-perps: order type must be a string");let n=e.type??X.LIMIT;if(typeof n!="string"||!n)throw new Error("hl-perps: order type must be a string");let o=Sn(e);if(e.reduceOnly!=null&&typeof e.reduceOnly!="boolean")throw new Error("hl-perps: reduceOnly must be boolean");let i=e.reduceOnly===!0,s=An(e.size??e.sz,r.szDecimals),l;if(n===X.MARKET){let O=Number(r.markPx);if(!Number.isFinite(O)){let j=await Xr(t);O=Number(j?.[r.coin]??j?.[String(r.assetId)]??NaN)}if(!Number.isFinite(O))throw new Error("hl-perps: no mark price available for a market order");let C=Number(e.maxSlippageBps??50);if(!Number.isInteger(C)||C<0)throw new Error("hl-perps: maxSlippageBps must be a non-negative integer");if(C>100)throw new Error(`hl-perps: maxSlippageBps ${C} exceeds the hard 100 bps cap`);let x=o?O*(1+C/1e4):O*(1-C/1e4);l=de(x,r.szDecimals,{roundDown:o});let L=Math.abs(Number(l)/O-1)*1e4;if(L>C+1e-9)throw new Error(`hl-perps: tick rounding makes the limit ${L.toFixed(2)} bps from mark, above the ${C} bps cap`)}else{if(e.price==null&&e.limitPx==null)throw new Error("hl-perps: a limit order requires an explicit price");l=de(e.price??e.limitPx,r.szDecimals)}let u=Zt(n,{tif:e.tif??(n===X.MARKET?Be.IOC:Be.GTC),triggerPx:e.triggerPx,szDecimals:r.szDecimals}),d={a:r.assetId,b:o,p:l,s,r:i,t:u};if(e.clientOrderId!=null){if(typeof e.clientOrderId!="string"||!e.clientOrderId)throw new Error("hl-perps: clientOrderId must be a string");d.c=e.clientOrderId}if(e.grouping!=null&&(typeof e.grouping!="string"||!e.grouping))throw new Error("hl-perps: grouping must be a string");let a={type:"order",orders:[d],grouping:e.grouping??"na"},p=Qt({env:t.env,kind:r.kind}),b=await Gs(p,e,t),w=b.exempt?null:p,S=await Ks(w,e,t),v=S.approved?w:null;v&&(a.builder=v.wire);let _=Number(e.nonce??Date.now()),R=Ys(s,l);return Ie({provider:"hl-perps",venue:"hyperliquid",kind:r.kind==="outcome"?"hip4-order":r.kind==="hip3"?"hip3-order":"perp-order",coin:r.coin,assetId:r.assetId,assetKind:r.kind,outcome:r.outcome??null,outcomeSide:r.side??null,dex:r.dex??null,dexName:r.dexName??null,side:o?"buy":"sell",orderType:n,price:l,size:s,reduceOnly:i,notionalUsd:R,maxLeverage:r.maxLeverage,markPx:r.markPx,builderFee:v?.disclosure??null,holderExempt:b.exempt,holderVerificationStatus:b.status,builderApprovalRequired:w&&!v?{...p.disclosure,...S}:null,...ke(a,_,t)},e,t)}async function Xs(e={},t={}){let r=await Oe(qs(e),t),n=e.orderId??e.oid;if(n==null)throw new Error("hl-perps: orderId required");let o=En(n,"orderId"),i={type:"cancel",cancels:[{a:r.assetId,o}]};return Ie({provider:"hl-perps",venue:"hyperliquid",kind:"perp-cancel",coin:r.coin,assetId:r.assetId,orderId:o,...ke(i,Number(e.nonce??Date.now()),t)},e,t)}async function Zs(e={},t={}){let r=await Oe(e,t),n=Us(e.leverage,"leverage");if(r.maxLeverage!=null&&n>r.maxLeverage)throw new Error(`hl-perps: ${r.coin} allows at most ${r.maxLeverage}x, requested ${n}x`);if(e.marginMode!=null&&typeof e.marginMode!="string")throw new Error("hl-perps: marginMode must be a string");let o=(e.marginMode||De.CROSS).toLowerCase();if(o!==De.CROSS&&o!==De.ISOLATED)throw new Error('hl-perps: marginMode must be "cross" or "isolated"');let i={type:"updateLeverage",asset:r.assetId,isCross:o===De.CROSS,leverage:n};return Ie({provider:"hl-perps",venue:"hyperliquid",kind:"perp-leverage",coin:r.coin,assetId:r.assetId,leverage:n,marginMode:o,maxLeverage:r.maxLeverage,liquidationWarning:n>=20?`${n}x liquidates on roughly a ${(100/n).toFixed(2)}% adverse move before fees`:null,...ke(i,Number(e.nonce??Date.now()),t)},e,t)}async function Qs(e={},t={}){let r=await Oe(e,t),n=e.usd??e.amountUsd;if(n==null)throw new Error("hl-perps: usd amount required");if(typeof n!="number"&&typeof n!="string")throw new Error("hl-perps: usd must be a decimal number");let o=typeof n=="number"?String(n):n;if(!/^-?\d+(\.\d+)?$/.test(o))throw new Error("hl-perps: usd must be a decimal number");let i=J(o,6,"hl-perps: usd"),s=Sn(e,{defaultBuy:!0}),l={type:"updateIsolatedMargin",asset:r.assetId,isBuy:s,ntli:i<=BigInt(Number.MAX_SAFE_INTEGER)?Number(i):i.toString()};return Ie({provider:"hl-perps",venue:"hyperliquid",kind:"perp-isolated-margin",coin:r.coin,assetId:r.assetId,isBuy:s,usd:o,...ke(l,Number(e.nonce??Date.now()),t)},e,t)}async function ea(e={},t={}){let r=await Tn(e,t),n=await Oe(e,t),o=r.side==="buy",i=[r.action.orders[0]];if(e.takeProfitPx!=null&&i.push({a:n.assetId,b:!o,p:de(e.takeProfitPx,n.szDecimals),s:r.size,r:!0,t:Zt(X.TAKE_PROFIT_MARKET,{triggerPx:e.takeProfitPx,szDecimals:n.szDecimals})}),e.stopLossPx!=null&&i.push({a:n.assetId,b:!o,p:de(e.stopLossPx,n.szDecimals),s:r.size,r:!0,t:Zt(X.STOP_MARKET,{triggerPx:e.stopLossPx,szDecimals:n.szDecimals})}),i.length===1)throw new Error("hl-perps: a bracket needs takeProfitPx and/or stopLossPx");let s={type:"order",orders:i,grouping:"normalTpsl",...r.action.builder?{builder:r.action.builder}:{}};return Ie({provider:"hl-perps",venue:"hyperliquid",kind:"perp-bracket",coin:n.coin,assetId:n.assetId,side:r.side,price:r.price,size:r.size,reduceOnly:r.reduceOnly,orderType:r.orderType,notionalUsd:r.notionalUsd,legs:i.length,entry:{side:r.side,price:r.price,size:r.size},takeProfitPx:e.takeProfitPx==null?null:de(e.takeProfitPx,n.szDecimals),stopLossPx:e.stopLossPx==null?null:de(e.stopLossPx,n.szDecimals),builderFee:r.builderFee,...ke(s,Number(e.nonce??Date.now()),t)},e,t)}var bn,xn,ct,Fs,Wt,at,Xt,He,X,Be,De,In=Z(()=>{Bt();Ut();et();an();mn();Yt();yn();bn=5,xn=6,ct="0x66eee",Fs=2,Wt=10,at="ORACLE_HL_BUILDER_ADDRESS",Xt="ORACLE_HL_BUILDER_FEE_BPS",He=Object.freeze({perp:2,spot:1,hip3:1,hip4:1}),X=Object.freeze({LIMIT:"limit",MARKET:"market",STOP_MARKET:"stopMarket",STOP_LIMIT:"stopLimit",TAKE_PROFIT_MARKET:"takeProfitMarket",TAKE_PROFIT_LIMIT:"takeProfitLimit"}),Be=Object.freeze({GTC:"Gtc",IOC:"Ioc",ALO:"Alo"}),De=Object.freeze({CROSS:"cross",ISOLATED:"isolated"})});var gt=Object.freeze(["draft","shadow","confirm","armed","autonomous","halted"]),Qn=Object.freeze([["TOTAL","Total crypto market cap, also called TOTAL1"],["TOTAL2","Crypto market cap excluding BTC"],["TOTAL3","Crypto market cap excluding BTC and ETH"],["OTHERS","Crypto market cap outside the largest tracked assets"],["BTC.D","Bitcoin market-cap dominance"],["ETH.D","Ether market-cap dominance"],["USDT.D","Tether market-cap dominance"]].map(([e,t])=>Object.freeze({id:e,description:t}))),eo=Object.freeze([["sma","Simple moving average"],["ema","Exponential moving average"],["rsi","Relative strength index"],["macd","Moving-average convergence divergence"],["bollinger","Bollinger bands"],["atr","Average true range"],["vwap","Volume-weighted average price"],["volume","Traded volume"],["cvd","Cumulative volume delta"],["funding","Perpetual funding rate"],["open-interest","Open interest and change"],["liquidations","Liquidation flow"],["basis","Perpetual-to-spot basis"]].map(([e,t])=>Object.freeze({id:e,description:t}))),to=Object.freeze([["relative-value","Long-short relative value basket"],["beta-neutral","Beta-balanced directional basket"],["spread-mean-reversion","Bounded spread mean reversion"],["funding-carry","Cross-market funding carry"]].map(([e,t])=>Object.freeze({id:e,description:t}))),$e=Object.freeze([["anthropic-oauth","oauth"],["openai-codex","oauth"],["xai-oauth","oauth"],["openrouter","api-key"],["openai","api-key"],["anthropic","api-key"],["xai","api-key"],["deepseek","api-key"],["gemini","api-key"],["kimi","api-key"],["mistral","api-key"],["nous","api-key"],["qwen","api-key"],["glm","api-key"],["local","local"],["ollama","local"]].map(([e,t])=>Object.freeze({id:e,auth:t}))),ro=[["market.scan","Read bounded market observations"],["market.breadth","Read TOTAL, TOTAL2, TOTAL3, OTHERS, and dominance evidence"],["perp.indicators","Calculate bounded price, volume, positioning, and derivatives signals"],["basket.construct","Construct an exact bounded multi-leg basket plan"],["basket.backtest","Backtest a bounded basket against supplied history"],["sentiment.read","Read cited public sentiment"],["wallet.watch","Observe public wallet activity"],["contract.read","Inspect public contract state"],["nft.inspect","Inspect public mint state"],["strategy.analyze","Analyze a strategy without executing it"],["strategy.backtest","Backtest against supplied history"],["risk.evaluate","Summarize a caller-supplied portfolio snapshot; does not fetch accounts or approve intents"],["intent.prepare","Prepare a non-executable intent"],["operator.handoff","Create an operator confirmation handoff"]],Pe=Object.freeze(ro.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),no=[["hyperliquid-markets","Research Hyperliquid market evidence"],["crypto-market-breadth","Analyze crypto market breadth and dominance evidence"],["perp-technical-analysis","Analyze bounded perpetual technical and positioning signals"],["perp-strategy-planning","Plan bounded perpetual strategies"],["basket-trading","Construct exact non-atomic multi-leg basket plans"],["relative-value-risk","Evaluate per-leg and aggregate relative-value risk"],["armed-local-routing","Route an approved exact plan to the local operator boundary"],["social-sentiment","Score cited public sentiment"],["wallet-monitoring","Analyze public wallet activity"],["contract-research","Research public contract state"],["mint-research","Research public mint state"],["bounded-strategy-analysis","Analyze bounded strategy evidence"],["bounded-backtesting","Backtest against supplied history"],["bounded-risk","Evaluate evidence against fixed policy"],["prepare-only-execution","Prepare an operator confirmation handoff"]],Ne=Object.freeze(no.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),oo=Object.freeze({autonomousOptIn:!1,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:100,maxDailyLossUsd:10,chainAllowlist:Object.freeze(["ethereum"]),expiresAt:41024448e5});function ye({id:e,name:t,scannerName:r,scannerTool:n,scannerSkill:o,scannerArtifact:i,chainAllowlist:s}){return Object.freeze({id:e,name:t,mode:"draft",agents:Object.freeze([Object.freeze({id:"scanner",name:r,role:"scanner",runtime:"deterministic",soul:"Collect bounded public evidence with source times.",toolIds:Object.freeze([n]),skillIds:Object.freeze([o])}),Object.freeze({id:"sentiment",name:"Grok Sentiment",role:"sentiment",runtime:"model",provider:"xai",model:"grok-4.6",soul:"Score narrative direction and cite every claim.",toolIds:Object.freeze(["sentiment.read"]),skillIds:Object.freeze(["social-sentiment"])}),Object.freeze({id:"strategy",name:"Strategy Analyst",role:"strategy",runtime:"model",provider:"openai",model:"gpt-5.6-sol",soul:"Produce a falsifiable thesis from typed evidence.",toolIds:Object.freeze(["strategy.analyze"]),skillIds:Object.freeze(["bounded-strategy-analysis"])}),Object.freeze({id:"risk",name:"Risk Gate",role:"risk",runtime:"policy",soul:"Enforce every cap exactly and reject unsupported intent.",toolIds:Object.freeze(["risk.evaluate"]),skillIds:Object.freeze(["bounded-risk"])}),Object.freeze({id:"executor",name:"Executor",role:"executor",runtime:"operator",soul:"Prepare an exact operator handoff. Never sign or broadcast.",toolIds:Object.freeze(["intent.prepare","operator.handoff"]),skillIds:Object.freeze(["prepare-only-execution"])})]),edges:Object.freeze([Object.freeze({from:"scanner",to:"sentiment",artifactKind:i}),Object.freeze({from:"sentiment",to:"strategy",artifactKind:"scored-thesis"}),Object.freeze({from:"strategy",to:"risk",artifactKind:"strategy-analysis"}),Object.freeze({from:"risk",to:"executor",artifactKind:"approved-intent"})]),policy:Object.freeze({...oo,chainAllowlist:Object.freeze(s)})})}var io=Object.freeze([ye({id:"hyperliquid-alpha",name:"Hyperliquid Alpha",scannerName:"Market Scanner",scannerTool:"market.scan",scannerSkill:"hyperliquid-markets",scannerArtifact:"market-evidence",chainAllowlist:["hyperliquid"]}),ye({id:"perp-market-breadth",name:"Perp Market Breadth",scannerName:"Breadth Scanner",scannerTool:"market.breadth",scannerSkill:"crypto-market-breadth",scannerArtifact:"breadth-evidence",chainAllowlist:["hyperliquid"]}),ye({id:"perp-technical-strategy",name:"Perp Technical Strategy",scannerName:"Perp Technical Scanner",scannerTool:"perp.indicators",scannerSkill:"perp-technical-analysis",scannerArtifact:"technical-evidence",chainAllowlist:["hyperliquid"]}),ye({id:"basket-relative-value",name:"Basket Relative Value",scannerName:"Basket Constructor",scannerTool:"basket.construct",scannerSkill:"basket-trading",scannerArtifact:"basket-evidence",chainAllowlist:["hyperliquid"]}),ye({id:"wallet-watch",name:"Wallet Watch",scannerName:"Wallet Monitor",scannerTool:"wallet.watch",scannerSkill:"wallet-monitoring",scannerArtifact:"wallet-flow",chainAllowlist:["ethereum","base"]}),ye({id:"evm-launch-radar",name:"EVM Launch Radar",scannerName:"Launch Scanner",scannerTool:"contract.read",scannerSkill:"contract-research",scannerArtifact:"contract-evidence",chainAllowlist:["ethereum","base","arbitrum"]}),ye({id:"nft-mint-guard",name:"NFT Mint Guard",scannerName:"Mint Scanner",scannerTool:"nft.inspect",scannerSkill:"mint-research",scannerArtifact:"mint-evidence",chainAllowlist:["ethereum","base"]})]);import{createHash as Co}from"node:crypto";import{randomBytes as yo}from"node:crypto";import{wordlists as so}from"ethers";var ao=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),co=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],lo=new Set([12,15,18,21,24]);function uo(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return lo.has(t.length)&&t.every(r=>so.en.getWordIndex(r)>=0)}var fo=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,po=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,mo=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);function ho(e){let t=hr(e);return mo.has(t)||po.test(t)}var Re=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}};function hr(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function wo(e){let t=hr(e);return[...ao].some(r=>t.includes(r))}function go(e,t,r){if(typeof t=="string"){if(co.some(n=>n.test(t))||uo(t))throw new Re(r);if(fo.test(t)&&!ho(e))throw new Re(r)}}function yt(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return go(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>yt(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(wo(o))throw new Re(i);e[o]!==void 0&&(n[o]=yt(e[o],i,o))}return n}function Ke(e){return yt(e)}var bo=/^ses-[0-9a-f]{32}$/,xo=/^(?:sign|broadcast|execute|transaction\.execute|wallet\.sign)$/i,Eo=/sign|broadcast|execute/i,So="team-history-truncated",wr=`
3
+ [Message content truncated for durable storage.]`,ko=200,Ao=512*1024,To=64*1024,Oo=48*1024;function z(e){return String(e??"").trim()}function Io(e){return z(e).toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")}function bt(e){return Buffer.byteLength(JSON.stringify(e),"utf8")}function vo(e,t){let r=String(e??"");if(Buffer.byteLength(r,"utf8")<=t)return r;let n=0,o=r.length;for(;n<o;){let s=Math.ceil((n+o)/2);Buffer.byteLength(r.slice(0,s),"utf8")<=t?n=s:o=s-1}let i=r.slice(0,n);return new RegExp("\\p{Surrogate}$","u").test(i)&&(i=i.slice(0,-1)),i}function _o(e){let t=z(e?.text),r=Math.max(0,Oo-Buffer.byteLength(wr,"utf8")),n=Buffer.byteLength(t,"utf8")>r,o=Array.isArray(e?.artifacts)?e.artifacts:[],i=e?.generator&&typeof e.generator=="object"&&!Array.isArray(e.generator)?{kind:z(e.generator.kind).slice(0,80),provider:z(e.generator.provider).slice(0,120),model:z(e.generator.model).slice(0,160)}:void 0;return{id:z(e?.id).slice(0,200)||"message-compacted",sender:z(e?.sender).slice(0,200)||"system",name:z(e?.name).slice(0,200)||"Oracle",text:`${vo(t,r)}${wr}`,state:z(e?.state).slice(0,80)||"complete",createdAt:z(e?.createdAt).slice(0,80),artifacts:[],...e?.fallback===!0?{fallback:!0}:{},...e?.offline===!0?{offline:!0}:{},...i?{generator:i}:{},contentTruncated:!0,...o.length?{omittedArtifacts:o.length}:{},...!n&&o.length?{artifactPayloadTruncated:!0}:{}}}function $o(e){let t=structuredClone(e);return bt(t)<=To?t:_o(t)}function Po(e){let t=0,r="";for(let n of e){if(n?.historyTruncated!==!0)continue;let o=Number(n.omittedMessages);Number.isSafeInteger(o)&&o>0&&(t+=o),r||(r=z(n.createdAt))}return{omittedMessages:t,createdAt:r}}function No(e,t){return{id:So,sender:"system",name:"Oracle",text:`[Earlier team history omitted: ${e} ${e===1?"message":"messages"} pruned for durable storage.]`,state:"complete",createdAt:z(t),artifacts:[],historyTruncated:!0,omittedMessages:e}}function Ge(e,t={}){if(!e||typeof e!="object"||!Array.isArray(e.messages))throw new TypeError("Invalid team thread state");let r=Number.isSafeInteger(t.maxMessages)&&t.maxMessages>0?t.maxMessages:ko,n=Number.isSafeInteger(t.maxBytes)&&t.maxBytes>0?t.maxBytes:Ao,o=Po(e.messages),i=o.omittedMessages,s=e.messages.filter(a=>a?.historyTruncated!==!0).map($o),l=Number.isSafeInteger(t.dropOldest)&&t.dropOldest>0?Math.min(t.dropOldest,s.length):0;if(l>0&&(s=s.slice(l),i+=l),s.length>r){let a=s.length-r;s=s.slice(a),i+=a}let u=()=>({...e,messages:[...i>0?[No(i,o.createdAt||s[0]?.createdAt)]:[],...s]});for(;s.length>0&&bt(u())>n;)s=s.slice(1),i+=1;let d=u();if(bt(d)>n)throw new Error("team thread metadata exceeds durable size budget");return d}function yr(e,t){let r=Number.isSafeInteger(t)&&t>0?t:0;return Ge(e,{dropOldest:r})}function gr(e,t){return e.slice(t.length).trim()}function xt(e=yo(16)){let t=Buffer.from(e).toString("hex");if(!/^[0-9a-f]{32}$/.test(t))throw new TypeError("Team session entropy must be exactly 16 bytes");return`ses-${t}`}function Je(e){return bo.test(String(e??""))}function Ro({text:e,agents:t,leadAgentId:r}){let n=z(e);if(!n)throw new TypeError("Message is required");if(!Array.isArray(t)||t.length===0)throw new TypeError("Group needs at least one agent");let o=n.match(/^@(team|all)(?:\s+|$)/i);if(o)return{kind:"broadcast",targetAgentIds:t.map(s=>s.id),text:gr(n,o[0])};if(n.startsWith("@")){let l=t.flatMap(d=>[{agent:d,mention:`@${z(d.id)}`},{agent:d,mention:`@${z(d.name)}`},{agent:d,mention:`@${Io(d.name)}`}]).sort((d,a)=>a.mention.length-d.mention.length).find(({mention:d})=>{let a=n.slice(0,d.length),p=n.at(d.length);return a.toLowerCase()===d.toLowerCase()&&(!p||/\s|[:,]/.test(p))});if(!l)throw new TypeError("Unknown agent mention");let u=gr(n,l.mention).replace(/^[:,]\s*/,"");return{kind:"mention",targetAgentIds:[l.agent.id],text:u}}return{kind:"lead",targetAgentIds:[(t.find(s=>s.id===r)??t[0]).id],text:n}}function Lo(e,t=[]){let r=z(e?.provider);return r?new Set(t.map(o=>z(o))).has(r)?{status:"online"}:{status:"offline",reason:`${r} is not connected`}:{status:"online"}}function Mo(e){Ke(e);let t=z(e?.type),r=Array.isArray(e?.actions)?e.actions:[];if(xo.test(t)||r.some(n=>Eo.test(z(n?.type))))throw new TypeError("Chat cannot sign, broadcast, or execute")}function Le(e,t,r,n="complete"){return{id:z(e.id)||`message-${Date.now()}`,sender:t,name:r,text:z(e.text),state:n,createdAt:z(e.createdAt)||new Date().toISOString(),artifacts:[]}}function Et(e,t){if(Mo(t),!e||!Je(e.sessionId)||!Array.isArray(e.messages))throw new TypeError("Invalid team thread state");let r=[...e.messages];if(t.type==="message.user")r.push(Le(t,"user","You"));else if(t.type==="message.system")r.push(Le(t,"system","Oracle"));else if(t.type==="agent.offline"){let n=Le(t,z(t.agentId),z(t.name)||z(t.agentId),"offline");n.offline=!0;let o=r.findIndex(i=>i.id===t.id&&i.sender===t.agentId);o>=0?r.splice(o,1,n):r.push(n)}else if(t.type==="agent.started")r.push(Le(t,z(t.agentId),z(t.name)||z(t.agentId),"thinking"));else if(t.type==="agent.output"){let n=r.findIndex(i=>i.id===t.id&&i.sender===t.agentId),o=Le(t,z(t.agentId),z(t.name)||z(t.agentId));o.fallback=t.generator?.kind==="rules",o.generator=t.generator?{...t.generator}:void 0,o.artifacts=t.artifact?[{...t.artifact}]:[],n>=0?r.splice(n,1,o):r.push(o)}else if(t.type==="artifact.prepared"){let n=r.findIndex(o=>o.id===t.messageId);if(n<0)throw new TypeError("Artifact target message was not found");r[n]={...r[n],artifacts:[...r[n].artifacts,{...t.artifact}]}}else throw new TypeError(`Unsupported team thread event: ${t.type}`);return Ge({...e,messages:r})}var St=2e3,jo=/^[a-z0-9][a-z0-9._-]{0,63}$/,Ho=/^#[0-9a-fA-F]{6}$/,Do=new Set(["deterministic","model","policy","operator"]),Bo=new Set(Pe.map(({id:e})=>e)),zo=new Set(Ne.map(({id:e})=>e)),Fo=new Set($e.map(({id:e})=>e)),Uo=/^p-[a-z0-9][a-z0-9_-]{0,62}$/,qo=["secret","privatekey","seed","seedphrase","mnemonic","password","passphrase","credential","apikey","apitoken","accesstoken","authtoken","authorization","signingmaterial","walletexport","keymaterial"],Ye=/(?:\bshell\b|terminal|raw[ _.-]?http|\bmcp\b|private[ _.-]?key|seed[ _.-]?phrase|mnemonic|key[ _.-]?(?:import|export)|wallet[ _.-]?(?:key|custody)|\bcustod(?:y|ial)\b|\bsign(?:ing|er)?\b|\bbroadcast(?:ing)?\b|(?:execute|place)[ _.-]?(?:transaction|trade|order|swap)s?|submit[ _.-]?transactions?|transfer[ _.-]?(?:funds|assets|tokens|coins)|hold[ _.-]?(?:keys|funds|assets)|ignore (?:the )?policy|bypass|widen (?:the )?(?:cap|policy)|reveal (?:credential|secret))/i,Ko=Object.freeze(["market-evidence","breadth-evidence","technical-evidence","basket-evidence","wallet-flow","contract-evidence","mint-evidence","scored-thesis","strategy-analysis","risk-decision","approved-intent","prepared-intent","prepared-basket","receipt"]),Go=new Set(Ko);function P(e){throw new TypeError(e)}function Me(e,t){(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&P(`${t} must be a plain object`)}function Jo(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function br(e){let t=Jo(e);return t==="auth"||qo.some(r=>t.includes(r))}function kt(e,t="team",r=new Set){if(e&&typeof e=="object"){r.has(e)&&P(`unsafe cyclic field at ${t}`),r.add(e);for(let[n,o]of Object.entries(e))br(n)&&P(`forbidden secret-like field ${t}.${n}`),kt(o,`${t}.${n}`,r);r.delete(e)}}function M(e){return e===null||typeof e=="string"||typeof e=="boolean"?e:typeof e=="number"?(Number.isFinite(e)||P("value must be finite"),e):Array.isArray(e)?e.map(M):(Me(e,"value"),Object.fromEntries(Object.keys(e).sort().map(t=>(br(t)&&P(`forbidden secret-like field ${t}`),[t,M(e[t])]))))}function ae(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))ae(t);Object.freeze(e)}return e}function Te(e){return Co("sha256").update(JSON.stringify(M(e))).digest("hex")}function fe(e,t,r=500){return(typeof e!="string"||!e.trim()||e.length>r)&&P(`${t} is invalid`),e}function ee(e,t){return fe(e,t,64),jo.test(e)||P(`${t} is invalid`),e}function Yo(e){return(typeof e!="string"||!Ho.test(e))&&P("agent color is invalid"),e}function Vo(e){let t=String.raw`(?:sign(?:ing)?|broadcast(?:ing)?|(?:execute|place|submit|transfer|hold|assume)\b[^.!?\n]*?\b(?:transactions?|trades?|orders?|swaps?|funds|assets|tokens|coins|keys|custody))`,r=e.replace(new RegExp(String.raw`\b(?:never|do not|don't|cannot|can't|must not|may not)\s+(?:directly\s+)?${t}(?:\s+or\s+${t})?`,"gi"),"");return Ye.test(r)||new RegExp(String.raw`\b${t}\b`,"i").test(r)}function We(e){return typeof e=="string"&&Uo.test(e)&&!Ye.test(e)}function At(e){return ee(e,"artifact kind"),Go.has(e)||P(`artifact kind ${e} is not allowed`),e}function Ve(e,{nowMs:t=Date.now(),mode:r="shadow"}={}){Me(e,"policy"),kt(e,"policy");let n=["autonomousOptIn","requiresWalletConfirmation","killSwitchRequired"];for(let i of n)typeof e[i]!="boolean"&&P(`policy.${i} must be boolean`);(!e.requiresWalletConfirmation||!e.killSwitchRequired)&&P("unsafe policy: wallet confirmation and kill switch are required");for(let i of["maxNotionalUsd","maxDailyLossUsd"])(!Number.isFinite(e[i])||e[i]<=0)&&P(`policy.${i} must be a positive finite cap`);(!Array.isArray(e.chainAllowlist)||!e.chainAllowlist.length)&&P("policy.chainAllowlist must be bounded");let o=e.chainAllowlist.map(i=>ee(i,"chain id"));return new Set(o).size!==o.length&&P("duplicate chain id"),(!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=t)&&P("policy expiry must be in the future"),r==="autonomous"&&!e.autonomousOptIn&&P("autonomous mode requires explicit opt-in"),{autonomousOptIn:e.autonomousOptIn,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:e.maxNotionalUsd,maxDailyLossUsd:e.maxDailyLossUsd,chainAllowlist:o,expiresAt:e.expiresAt}}function Xe(e,{nowMs:t=Date.now()}={}){Me(e,"team"),kt(e);let r=e.kind===void 0?"pipeline":e.kind;r!=="pipeline"&&r!=="group"&&P("unsupported team kind");let n=r==="group";ee(e.id,"team id"),fe(e.name,"team name",120),gt.includes(e.mode)||P("unsupported team mode"),(!Array.isArray(e.agents)||!e.agents.length)&&P("agents must be non-empty");let o=new Set,i=e.agents.map((x,L)=>{Me(x,`agent ${L}`);let j=ee(x.id,"agent id");o.has(j)&&P(`duplicate agent id ${j}`),o.add(j),fe(x.name,"agent name",120);let T=n?fe(x.role,"agent role",120):ee(x.role,"agent role"),N=n&&x.color!==void 0?Yo(x.color):void 0;Do.has(x.runtime)||P("invalid agent runtime");let B=fe(x.soul,"agent Soul",St);Vo(B)&&P("unsafe Soul authority"),(!Array.isArray(x.toolIds)||!Array.isArray(x.skillIds))&&P("tool and skill IDs must be arrays");let D=x.toolIds.map(m=>(ee(m,"tool id"),(!Bo.has(m)||Ye.test(m))&&P(`forbidden tool ${m}`),m)),c=x.skillIds.map(m=>(ee(m,"skill id"),(!zo.has(m)&&!We(m)||Ye.test(m))&&P(`forbidden skill ${m}`),m));(new Set(D).size!==D.length||new Set(c).size!==c.length)&&P("duplicate tool or skill ID");let f=x.runtime==="model";return f?(fe(x.provider,"model provider",100),Fo.has(x.provider)||P("unsupported model provider"),fe(x.model,"model",160)):(x.provider!==void 0||x.model!==void 0)&&P("provider/model only allowed for model runtime"),!n&&x.role==="executor"&&x.runtime!=="operator"&&P("executor must use operator runtime"),!n&&x.runtime==="operator"&&x.role!=="executor"&&P("operator runtime is reserved for the executor"),n&&x.runtime==="operator"&&P("group chat agents cannot use operator runtime"),x.role!=="executor"&&D.some(m=>m==="intent.prepare"||m==="operator.handoff")&&P("executor tools require operator authority"),n&&(D.includes("intent.prepare")||D.includes("operator.handoff"))&&P("group chat agents cannot prepare operator actions"),{id:j,name:x.name,role:T,runtime:x.runtime,...f?{provider:x.provider,model:x.model}:{},soul:B,toolIds:D,skillIds:c,...N?{color:N}:{},...n&&x.packId!==void 0?{packId:ee(x.packId,"pack id")}:{},...n?{autoTools:x.autoTools!==!1}:{}}});if(n){(!Array.isArray(e.edges)||e.edges.length!==0)&&P("group chat edges must be empty");let x=fe(e.summary||"A focused agent group.","team summary",500),L=e.sessionId===void 0?xt():e.sessionId;Je(L)||P("group session id must use ses-hex format");let j=e.leadAgentId===void 0?i[0].id:ee(e.leadAgentId,"lead agent id");o.has(j)||P("lead agent is not a group member");let T=Ve(e.policy,{nowMs:t,mode:e.mode}),N=M({kind:"group",id:e.id,sessionId:L,name:e.name,summary:x,mode:e.mode,leadAgentId:j,agents:i,edges:[],policy:T});return ae({team:N,teamHash:Te(N),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}let s=i.filter(x=>x.role==="executor");s.length!==1&&P("exactly one executor operator is required");let l=s[0];(!l.toolIds.includes("intent.prepare")||!l.toolIds.includes("operator.handoff"))&&P("executor requires prepare-only handoff tools"),Array.isArray(e.edges)||P("edges must be an array");let u=new Set,d=new Map([...o].map(x=>[x,[]])),a=e.edges.map(x=>{Me(x,"edge"),ee(x.from,"edge source"),ee(x.to,"edge target");let L=At(x.artifactKind);(!o.has(x.from)||!o.has(x.to))&&P("broken edge references unknown agent"),x.from===x.to&&P("cycle in team DAG");let j=`${x.from}\0${x.to}\0${L}`;return u.has(j)&&P("duplicate edge"),u.add(j),d.get(x.from).push(x.to),{from:x.from,to:x.to,artifactKind:L}}),p=new Set,b=new Set;function w(x){if(p.has(x)&&P("cycle in team DAG"),!b.has(x)){p.add(x);for(let L of d.get(x))w(L);p.delete(x),b.add(x)}}for(let x of o)w(x);d.get(l.id).length&&P("executor must be the terminal team agent");let S=x=>{let L=[x],j=new Set;for(;L.length;){let T=L.shift();if(T===l.id)return!0;j.has(T)||(j.add(T),L.push(...d.get(T)))}return!1};for(let x of o)S(x)||P(`agent ${x} is disconnected from executor`);let v=i.filter(x=>!a.some(L=>L.to===x.id));v.length!==1&&P("team pipeline requires exactly one root agent");for(let x of i){let L=a.filter(T=>T.to===x.id).length,j=a.filter(T=>T.from===x.id).length;(x.id===v[0].id?L!==0:L!==1)&&P("team pipeline requires exactly one incoming handoff per non-root agent"),(x.id===l.id?j!==0:j!==1)&&P("team pipeline requires exactly one outgoing handoff per non-executor agent")}let _=a.filter(x=>x.to===l.id);(_.length!==1||_[0].artifactKind!=="approved-intent")&&P("executor requires exactly one approved-intent input"),i.find(x=>x.id===_[0].from)?.runtime!=="policy"&&P("executor input must come from a policy agent");let O=Ve(e.policy,{nowMs:t,mode:e.mode}),C=M({id:e.id,name:e.name,mode:e.mode,agents:i,edges:a,policy:O});return ae({team:C,teamHash:Te(C),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}var Er=new Set(Pe.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/intent\.prepare|operator\.handoff|sign|broadcast|execute/i.test(e))),Sr=new Set(Ne.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/armed|execution|sign|broadcast/i.test(e))),Wo=Object.freeze([Object.freeze({pattern:/sentiment|social|narrative|realtime|news/i,toolIds:["sentiment.read"],skillIds:["social-sentiment"]}),Object.freeze({pattern:/risk|review|policy|cap|exposure/i,toolIds:["risk.evaluate"],skillIds:["bounded-risk"]}),Object.freeze({pattern:/wallet|flow|holder/i,toolIds:["wallet.watch"],skillIds:["wallet-monitoring"]}),Object.freeze({pattern:/contract|token|evm|bytecode/i,toolIds:["contract.read"],skillIds:["contract-research"]}),Object.freeze({pattern:/nft|mint|collection/i,toolIds:["nft.inspect"],skillIds:["mint-research"]}),Object.freeze({pattern:/basket|relative.?value|spread/i,toolIds:["basket.construct","basket.backtest"],skillIds:["basket-trading","relative-value-risk"]}),Object.freeze({pattern:/perp|technical|funding|open interest|\boi\b|rsi|macd/i,toolIds:["perp.indicators"],skillIds:["perp-technical-analysis","perp-strategy-planning"]}),Object.freeze({pattern:/breadth|dominance|total2|total3/i,toolIds:["market.breadth"],skillIds:["crypto-market-breadth"]}),Object.freeze({pattern:/backtest|simulation/i,toolIds:["strategy.backtest"],skillIds:["bounded-backtesting"]}),Object.freeze({pattern:/plan|planner|strategy|thesis|analyst/i,toolIds:["strategy.analyze"],skillIds:["bounded-strategy-analysis"]}),Object.freeze({pattern:/research|reader|market|scan/i,toolIds:["market.scan"],skillIds:["hyperliquid-markets"]})]),Ze=Object.freeze({toolIds:Object.freeze(["market.scan"]),skillIds:Object.freeze(["hyperliquid-markets"])});function xr(e,t){return[...new Set(e)].filter(r=>t.has(r))}function Tt({role:e="",soul:t=""}={}){let r=`${String(e)} ${String(t)}`.trim(),n=Wo.filter(s=>s.pattern.test(r));if(n.length===0)return{toolIds:[...Ze.toolIds],skillIds:[...Ze.skillIds]};let o=xr(n.flatMap(s=>s.toolIds),Er),i=xr(n.flatMap(s=>s.skillIds),Sr);return{toolIds:o.length>0?o:[...Ze.toolIds],skillIds:i.length>0?i:[...Ze.skillIds]}}function Xo(e){return Er.has(e)||Sr.has(e)}import G from"node:fs";import Q from"node:path";import{createHash as vr}from"node:crypto";import re from"node:fs";import be from"node:path";var Ot="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",Zo=/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?:\.[a-z0-9]+(?:[._-][a-z0-9]+)*)*$/;function Qe(e){try{let t=re.lstatSync(e);return t.isDirectory()&&!t.isSymbolicLink()}catch{return!1}}function Qo(){return re.constants.O_NOFOLLOW||0}function It(e){try{let t=re.lstatSync(e);return t.isFile()&&!t.isSymbolicLink()}catch{return!1}}function kr(e){if(!It(e))return null;let t=re.openSync(e,re.constants.O_RDONLY|Qo());try{return re.readFileSync(t,"utf8")}finally{re.closeSync(t)}}function ei(e){let t=[],r=[];if(!e||typeof e!="object"||Array.isArray(e))return t.push("plugin.json must be a JSON object"),{valid:!1,errors:t,warnings:r};e.$schema!==Ot&&(e.$schema?t.push(`unsupported $schema: ${e.$schema} (expected ${Ot})`):t.push("$schema is required \u2014 must be "+Ot)),!e.name||typeof e.name!="string"?t.push("name is required (string)"):Zo.test(e.name)||t.push(`name "${e.name}" must be kebab-case dot-separated (e.g. deployment.tools)`),(e.version===void 0||e.version===null||e.version==="")&&r.push("version is missing \u2014 semantic versioning recommended"),e.description!==void 0&&typeof e.description!="string"&&r.push("description must be a string"),e.author!==void 0&&(typeof e.author!="object"||Array.isArray(e.author))&&r.push("author must be an object with optional name, email, url"),e.keywords!==void 0&&(Array.isArray(e.keywords)||r.push("keywords must be an array")),e.license!==void 0&&typeof e.license!="string"&&r.push("license must be a string");let n=new Set(["$schema","name","version","description","author","homepage","repository","license","keywords","extensions"]);for(let o of Object.keys(e))n.has(o)||r.push(`unknown field "${o}" \u2014 will be ignored (use extensions.<namespace> for client data)`);return{valid:t.length===0,errors:t,warnings:r}}function ti(e){let t=be.join(e,"skills"),r=[];if(!Qe(t))return r;function n(o,i=""){for(let s of re.readdirSync(o,{withFileTypes:!0})){let l=be.join(o,s.name);if(s.isDirectory()){if(!Qe(l))continue;n(l,i?`${i}/${s.name}`:s.name)}else if(s.name.endsWith(".md")){if(!It(l))continue;let u=i?`${i}/${s.name.replace(/\.md$/,"")}`:s.name.replace(/\.md$/,"");r.push({name:u,path:l,relativePath:be.relative(t,l)})}}}return n(t),r}function ri(e){let t=be.join(e,"mcp"),r=[];if(!Qe(t))return r;for(let n of re.readdirSync(t,{withFileTypes:!0})){if(!n.isFile()||!n.name.endsWith(".json"))continue;let o=be.join(t,n.name);if(It(o))try{let i=kr(o);if(i===null)continue;let s=JSON.parse(i);r.push({name:n.name.replace(/\.json$/,""),path:o,config:s})}catch(i){r.push({name:n.name.replace(/\.json$/,""),path:o,error:`invalid JSON: ${i.message}`})}}return r}function vt(e){let t=be.resolve(e);if(!Qe(t))return{ok:!1,error:`plugin directory not found: ${t}`};let r=be.join(t,"plugin.json");if(!re.existsSync(r))return{ok:!1,error:`missing plugin.json in ${t}`};let n;try{let l=kr(r);if(l===null)return{ok:!1,error:`plugin.json must be a regular file in ${t}`};n=JSON.parse(l)}catch(l){return{ok:!1,error:`invalid plugin.json: ${l.message}`}}let o=ei(n);if(!o.valid)return{ok:!1,error:"manifest validation failed",errors:o.errors};let i=ti(t),s=ri(t);return{ok:!0,plugin:{name:n.name,version:n.version||"0.0.0",description:n.description||"",author:n.author||{},license:n.license||"UNLICENSED",root:t,manifest:n,skills:i,mcpServers:s,warnings:[...o.warnings]}}}var ni=Object.freeze([{name:"private key (hex 64)",re:/\b(?:0x)?[0-9a-fA-F]{64}\b/},{name:"BTC WIF",re:/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{name:"BIP39 seed phrase",re:/\b(?:[a-z]{3,8} ){11}(?:[a-z]{3,8})\b|\b(?:[a-z]{3,8} ){23}(?:[a-z]{3,8})\b/i},{name:"AWS access key",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"OpenAI key",re:/\bsk-[A-Za-z0-9_-]{20,}\b/},{name:"Anthropic key",re:/\bsk-ant-[A-Za-z0-9_-]{20,}\b/},{name:"GitHub token",re:/\bgh[pousr]_[A-Za-z0-9]{36,}\b/},{name:"Slack token",re:/\bxox[baprs]-[A-Za-z0-9-]{10,}\b/},{name:"Telegram bot token",re:/\b\d{8,10}:[A-Za-z0-9_-]{35}\b/},{name:"PEM private key",re:/-----BEGIN (?:RSA |EC |OPENSSH |PGP )?PRIVATE KEY-----/},{name:"Solana keypair array",re:/\[\s*(?:\d{1,3}\s*,\s*){63}\d{1,3}\s*\]/},{name:"credential assignment",re:/\b(?:API_?KEY|SECRET|PASSWORD|PASSWD|PRIVATE_?KEY|MNEMONIC|SEED_?PHRASE|AUTH_?TOKEN|ACCESS_?TOKEN)\s*[:=]\s*['"]?[A-Za-z0-9+/=_.-]{12,}/i},{name:"JWT",re:/\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/}]),oi=/\b(?:seed|mnemonic|recovery|phrase|backup)\b/i;function Ar(e){let t=String(e??"");if(!t)return null;for(let r of ni){let n=t.match(r.re);if(n&&!(r.name==="BIP39 seed phrase"&&!oi.test(t))){if(r.name==="private key (hex 64)"){let o=n.index||0,i=t.slice(Math.max(0,o-80),o);if(!/priv|secret|wif|seed|mnemonic|signer|wallet|key/i.test(i)||/hash|digest|sha256|txid|commit|blob|sha1/i.test(i))continue}return{name:r.name,index:n.index??0}}}return null}import Tr from"node:path";import{homedir as ii}from"node:os";var si=/^[a-z0-9][a-z0-9_-]{0,63}$/;var hc=64*1024;function ai(e=process.env){return e&&e.ORACLE_CONFIG_DIR||Tr.join(ii(),".config","oracle")}function Or(e=process.env){return Tr.join(ai(e),"plugins")}function Ir(e,t){let r=String(e||"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32),n=String(t||"").toLowerCase().replace(/\.md$/i,"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,24);if(!r||!n)return null;let o=`p-${r}-${n}`.slice(0,64);return si.test(o)?o:null}var ci=new Set($e.map(({id:e})=>e)),li=16,di=200,ui=64*1024,fi=new Set(["bash","sh","zsh","fish","cmd","cmd.exe","powershell","pwsh"]),pi=/(?:^|\/)\.(?:env|ssh|gnupg)(?:$|\/)|(?:^|\/)(?:id_rsa|id_ed25519|wallet\.json|keys\.json)(?:$|\.)/i;function F(e){let t=new TypeError(e);throw t.code="ORACLE_TEAM_PACK_REFUSED",t}function ne(e){return typeof e=="string"?e.trim():""}function Pr(e){let t=ne(e);return t?!!(/^(https?:|git@|ssh:|file:|[\\/]{2})/i.test(t)||/\.git(?:$|[?#])/i.test(t)):!1}function mi(e,t){let r=new Set((t||[]).map(s=>String(s))),n=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"").slice(0,48)||"pack",o=n,i=2;for(;r.has(o);)o=`${n}-${i}`,i+=1;return o}function Nr(e){let t=[],r=[e];for(;r.length;){let n=r.pop(),o;try{o=G.readdirSync(n,{withFileTypes:!0})}catch{F("pack directory is unreadable")}for(let i of o){let s=Q.join(n,i.name);if((i.isSymbolicLink()||G.lstatSync(s).isSymbolicLink())&&F("pack cannot contain symbolic links"),i.isDirectory()){r.push(s);continue}i.isFile()&&(t.push(s),t.length>di&&F("pack has too many files"))}}return t}function Rr(e){let t=G.lstatSync(e,{bigint:!0});(t.isSymbolicLink()||!t.isFile())&&F("pack files must be regular files");let r=G.openSync(e,G.constants.O_RDONLY|(G.constants.O_NOFOLLOW||0));try{let n=G.fstatSync(r,{bigint:!0});return(n.dev!==t.dev||n.ino!==t.ino)&&F("pack file changed while opening; retry the import"),(!n.isFile()||n.nlink!==1n)&&F("pack files must be regular files"),{fd:r,size:n.size}}catch(n){throw G.closeSync(r),n}}function _r(e){let{fd:t,size:r}=Rr(e);try{return r>BigInt(ui)?null:G.readFileSync(t)}finally{G.closeSync(t)}}function _t(e){let t=Nr(e).map(o=>({file:o,relative:Q.relative(e,o).split(Q.sep).join("/")})).sort((o,i)=>o.relative<i.relative?-1:o.relative>i.relative?1:0),r=vr("sha256"),n=Buffer.alloc(64*1024);for(let{file:o,relative:i}of t){let{fd:s}=Rr(o);try{let l=vr("sha256"),u;for(;(u=G.readSync(s,n,0,n.length,null))>0;)l.update(n.subarray(0,u));r.update(JSON.stringify([i,l.digest("hex")]))}finally{G.closeSync(s)}}return r.digest("hex")}function $r(e,t){let r=Buffer.isBuffer(e)?e.toString("utf8"):String(e||""),n=Ar(r);n&&F(`pack ${t} contains ${n.name}`)}function hi(e){let t=ne(e).replace(/\\/g,"/");return Q.basename(t).toLowerCase()}function wi(e){e?.error&&F(`pack connector ${e.name||"unknown"} is invalid JSON`);let t=e?.config;(!t||typeof t!="object"||Array.isArray(t))&&F("pack connector config is invalid"),(t.url||t.headers||t.oauth||t.token)&&F("pack connectors cannot ship URLs, headers, or tokens"),t.env&&typeof t.env=="object"&&Object.keys(t.env).length&&F("pack connectors cannot ship env secrets; Oracle spawns them empty");let r=ne(t.command);r||F("pack connector is missing a command"),fi.has(hi(r))&&F("pack connectors cannot spawn a shell")}function gi(e,t){let r=String(t||"").match(/^description:\s*(.+)$/m);return r?r[1].trim().slice(0,160):(String(t||"").split(`
4
+ `)[0].replace(/^#+\s*/,"").trim()||e).slice(0,160)}function yi({description:e,name:t,playbooks:r}){let n=[ne(e)||`Imported pack ${t}.`,r.length?`Playbooks: ${r.map(o=>o.summary).join("; ")}.`:"","Cite sources and state when required data is unavailable. Never sign or broadcast."].filter(Boolean).join(" ");return n.length>St&&F("pack copy is too long"),n}function bi(e,t=Q){let r=ne(e);r||F("pack path is required"),Pr(r)&&F("private packs are local folders, not git clones");let n=t.resolve(r),o;try{o=G.lstatSync(n)}catch{F("pack directory not found")}return o.isSymbolicLink()&&F("pack cannot be a symbolic link"),o.isDirectory()||F("pack path must be a directory"),n}function Lr(e){return String(e||"").replace(/\//g,"-")}function $t(e={}){let t=bi(e.root||e.path),r=Nr(t);for(let u of r){let d=Q.relative(t,u);pi.test(d)&&F(`pack cannot include ${d}`)}let n=_t(t);for(let u of r){let d=Q.relative(t,u),a=_r(u);a&&/\.(md|json|txt|mjs|js|ts|yml|yaml)$/i.test(u)&&$r(a,d)}let o=vt(t);o.ok||F(o.error||"invalid plugin.json");let i=o.plugin;for(let u of i.mcpServers||[])wi(u);let s=[];for(let u of i.skills||[]){if(s.length>=li)break;let d=Ir(i.name,u?.name||u?.relativePath);if(!d||!We(d))continue;let a=u?.path?_r(u.path):null,p=a?a.toString("utf8"):"",b=gi(d,p);$r(b,d),s.push({id:d,summary:b})}let l=yi({description:i.description,name:i.name,playbooks:s});return _t(t)!==n&&F("pack content changed during scanning; retry the import"),{name:i.name,version:i.version||"0.0.0",description:i.description||"",contentHash:n,root:t,playbooks:s,connectorCount:(i.mcpServers||[]).length,soul:l}}function xi(e,t={}){let r=t.pluginsDir||Or(t.env||process.env);G.mkdirSync(r,{recursive:!0});let n=Lr(e.name),o=Q.join(r,n),i=Q.resolve(o),s=Q.resolve(e.root);if(G.existsSync(i)){let d;try{d=G.lstatSync(i)}catch{F(`plugin "${n}" already installed and unreadable`)}(d.isSymbolicLink()||!d.isDirectory())&&F(`plugin "${n}" already installed at an unsafe path`);let a=vt(i);return a.ok||F(`plugin "${n}" already installed but invalid; remove it first`),(a.plugin.name!==e.name||a.plugin.version!==e.version)&&F(`plugin "${n}" already installed at v${a.plugin.version}; remove it first to import v${e.version}`),_t(i)!==e.contentHash&&F(`plugin "${n}" already installed with different content; remove it first to import this pack`),i}let l=G.mkdtempSync(Q.join(r,".team-pack-")),u=Q.join(l,"pack");try{G.cpSync(s,u,{recursive:!0,dereference:!1}),$t({path:u}).contentHash!==e.contentHash&&F("pack content changed during installation; retry the import"),G.renameSync(u,i)}finally{G.rmSync(l,{recursive:!0,force:!0})}return i}function Ei(e={}){let t=$t(e),r=ne(e.provider),n=ne(e.model);ci.has(r)||F("unsupported model provider"),(!n||n.length>160)&&F("model is invalid"),e.install!==!1&&xi(t,e);let o=Tt({role:ne(e.role)||t.description||t.name,soul:t.soul}),i=[...new Set([...t.playbooks.map(u=>u.id),...o.skillIds])],s=ne(e.name)||t.name,l=ne(e.role)||t.description||"Imported pack";return{preview:t,agent:{id:mi(s,e.existingAgentIds||[]),name:s.slice(0,120),role:l.slice(0,120),runtime:"model",provider:r,model:n,soul:t.soul,toolIds:o.toolIds,skillIds:i,trigger:"Mention",cadence:"On message",autoTools:!0,packId:Lr(t.name).slice(0,64)}}}et();import{createHash as ta}from"node:crypto";var ra=new Set(["coin","side","notionalUsd","leverage","orderType","price","maxSlippageBps"]);function ie(e,t="notionalUsd"){if(typeof e!="number"&&typeof e!="string")throw new TypeError(`${t} must use exact USD cents`);let r=String(e).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""),n=J(r,2,t);if(n<=0n||n>BigInt(Number.MAX_SAFE_INTEGER))throw new TypeError(`${t} must be positive exact USD cents`);return n}function vn(e){if(!e||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError("orderRequest must be a structured object");for(let t of Object.keys(e))if(!ra.has(t))throw new TypeError(`orderRequest.${t} is not allowed`);if(typeof e.coin!="string"||!/^[A-Z0-9][A-Z0-9._-]{0,63}$/.test(e.coin))throw new TypeError("orderRequest.coin must be a perp symbol");if(!["buy","sell"].includes(e.side))throw new TypeError("orderRequest.side must be buy or sell");if(ie(e.notionalUsd),!Number.isSafeInteger(e.leverage)||e.leverage<1)throw new TypeError("orderRequest.leverage must be a positive integer");if(!["market","limit"].includes(e.orderType))throw new TypeError("orderRequest.orderType must be market or limit");if(e.orderType==="limit"){if(typeof e.price!="number"&&typeof e.price!="string"||!/^(?:\d+)(?:\.\d+)?$/.test(String(e.price))||Number(e.price)<=0)throw new TypeError("limit order requires a positive price")}else if(e.price!==void 0)throw new TypeError("market order cannot specify price");if(e.maxSlippageBps!==void 0&&(!Number.isSafeInteger(e.maxSlippageBps)||e.maxSlippageBps<0||e.maxSlippageBps>100))throw new TypeError("maxSlippageBps must be an integer from 0 to 100");return e}async function tr({request:e,policy:t,owner:r,nowMs:n=Date.now(),expiresAt:o,deps:i={}}){vn(e);let{formatPerpSize:s,hlPerpAssetInfo:l,hlPreparePerpOrder:u,hlPrepareUpdateLeverage:d}=await Promise.resolve().then(()=>(In(),On));if(!/^0x[0-9a-fA-F]{40}$/.test(String(r||"")))throw new Error("owner wallet address is not configured");if(!Number.isSafeInteger(n)||!Number.isSafeInteger(o)||o<=n||o>n+6e4||o>t.expiresAt)throw new Error("intent expiry must fit the handoff TTL");let a=i.nonce??n;if(!Number.isSafeInteger(a)||a<=0||!Number.isSafeInteger(a+1))throw new Error("intent nonce is invalid");if(typeof i.runId!="string"||!i.runId)throw new Error("intent runId is required");let p=await(i.hlPerpAssetInfo??l)({coin:e.coin});if(p.kind!=="perp"&&p.kind!=="main")throw new Error("Team execution requires a perpetual asset");if(p.coin!==e.coin||!Number.isSafeInteger(p.maxLeverage)||e.leverage>p.maxLeverage)throw new Error("orderRequest.leverage exceeds asset maxLeverage");let b=J(String(p.markPx??""),18,"mark price");if(b<=0n)throw new Error("no mark price available for this perp");let w=BigInt(e.maxSlippageBps??50),S=e.orderType==="limit"?J(String(e.price),18,"order price"):b;if(S<=0n)throw new Error("order price must be positive");if(e.orderType==="limit"){if(e.side==="sell"&&S*10000n<b*(10000n-w))throw new Error("limit sell price is below the mark price slippage band");if(e.side==="buy"&&S*10000n>b*(10000n+w))throw new Error("limit buy price is above the mark price slippage band")}let v=S>b?S:b,R=(ie(e.notionalUsd)*10n**34n/v).toString().padStart(19,"0"),O=s(`${R.slice(0,-18)}.${R.slice(-18)}`,p.szDecimals),C=`0x${ta("sha256").update(`${i.runId}|${p.coin}|${a}`).digest("hex").slice(0,32)}`,x={coin:p.coin,owner:r,user:r,ttlMs:o-n,maxLeverage:p.maxLeverage},L={nowMs:n},j=await(i.hlPrepareUpdateLeverage??d)({...x,leverage:e.leverage,marginMode:"isolated",nonce:a},L),T=await(i.hlPreparePerpOrder??u)({...x,side:e.side,size:O,type:e.orderType,...e.orderType==="limit"?{price:e.price}:{},maxSlippageBps:e.maxSlippageBps??50,slippageBps:e.maxSlippageBps??50,clientOrderId:C,reduceOnly:!1,nonce:a+1},L);if(!j.localSignerEnvelope||!T.localSignerEnvelope)throw new Error("Oracle could not prepare the local signer artifacts");let N=[T.size,T.price].map(U=>{let[Y,ge=""]=String(U).split(".");return{raw:BigInt(Y+ge),decimals:ge.length}}),B=N[0].decimals+N[1].decimals,D=(N[0].raw*N[1].raw).toString().padStart(B+1,"0"),c=B?`${D.slice(0,-B)}.${D.slice(-B)}`:D,f=ie(c,"formatted order notionalUsd");if(ie(T.notionalUsd)!==f)throw new Error("prepared order notional mismatch");for(let U of[j,T])delete U.localSignerEnvelope.artifact.signatureChainId;let m=(()=>{let U=J(String(T.price),18,"order price");return U>b?U:b})(),h=(J(String(T.size),18,"order size")*m*100n+10n**36n-1n)/10n**36n,g=(h+BigInt(e.leverage)-1n)/BigInt(e.leverage),E=ie(t.maxNotionalUsd,"policy.maxNotionalUsd"),k=ie(t.maxDailyLossUsd,"policy.maxDailyLossUsd"),A=(f+BigInt(e.leverage)-1n)/BigInt(e.leverage);if(f<=E&&h>E)throw new Error("worst-case order notional exceeds the team notional cap");if(A<=k&&g>k)throw new Error("worst-case isolated margin exceeds the team loss cap");let I=Number(f)/100,q=BigInt(e.leverage),$=(f+q-1n)/q,H=Number($)/100;if(ie(I)!==f||ie(H)!==$)throw new Error("intent amounts exceed exact USD cents precision");return{chainId:"hyperliquid",intentType:"perp",notionalUsd:I,maxLossUsd:H,executionPlan:{atomic:!1,partialFillRiskAcknowledged:!1,legs:[{role:"leverage",market:p.coin,side:e.side,notionalUsd:0,weightBps:0,artifact:j.localSignerEnvelope},{role:"order",market:p.coin,side:e.side,notionalUsd:I,weightBps:1e4,artifact:T.localSignerEnvelope}]}}}var na=/^[a-z0-9][a-z0-9._:-]{0,127}$/i,oa=/^[0-9a-f]{64}$/,ia=/^evidence:sha256:[0-9a-f]{64}$/,sa=new Set(["approved-intent","prepared-intent","prepared-basket"]),aa=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),ca=/^[A-Za-z0-9@:_./-]{1,64}$/;function lt(e,t){if(typeof e!="string"||!na.test(e))throw new TypeError(`${t} is invalid`);return e}function la(e,t){if(typeof e!="string"||!oa.test(e))throw new TypeError(`${t} is invalid`);return e}function dt(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`${t} must be a plain object`)}function _n(e,t,r){for(let n of Object.keys(e))if(!t.has(n))throw new TypeError(`${r}.${n} is not allowed`)}function he(e,t,{allowZero:r=!1}={}){if(!Number.isFinite(e)||(r?e<0:e<=0))throw new TypeError(`${t} must be ${r?"non-negative":"positive"}`);let n=e*100;if(!Number.isSafeInteger(Math.round(n))||Math.abs(n-Math.round(n))>1e-8)throw new TypeError(`${t} must use exact USD cents`);return Math.round(n)}function da(e,t,{nowMs:r,expiresAt:n}){if(dt(e,"basket leg artifact"),e.version!==1)throw new TypeError("basket leg artifact must be version 1");if(e.surface!=="hl")throw new TypeError("basket leg artifact surface must be hl");if(e.action!=="order"||e.destination!=="hyperliquid")throw new TypeError("basket leg artifact must be a Hyperliquid order");if(!Number.isSafeInteger(e.expiresAtMs)||e.expiresAtMs<=r||e.expiresAtMs>n)throw new TypeError("basket leg artifact expiry must fit the handoff TTL");if(dt(e.artifact,"basket leg artifact payload"),!aa.has(e.artifact.kind))throw new TypeError("basket leg artifact kind is not an order");if(e.artifact.coin!==t.market)throw new TypeError("basket leg artifact market mismatch");if(e.artifact.side!==t.side)throw new TypeError("basket leg artifact side mismatch");if(ie(e.artifact.notionalUsd,"basket leg artifact notional")!==BigInt(he(t.notionalUsd,"basket leg notional")))throw new TypeError("basket leg artifact notional mismatch")}function ua(e,t,r){let n=e.executionPlan;if(n===void 0){if(r.mode==="armed")throw new TypeError("armed intent requires an exact execution plan");return}if(e.chainId!=="hyperliquid")throw new TypeError("armed execution plans require the Hyperliquid chain");if(e.intentType!=="perp"&&e.intentType!=="basket")throw new TypeError("intentType must be perp or basket");if(dt(n,"executionPlan"),_n(n,new Set(["atomic","partialFillRiskAcknowledged","legs"]),"executionPlan"),n.atomic!==!1)throw new TypeError("basket and perp plans must be explicitly non-atomic");if(!Array.isArray(n.legs))throw new TypeError("executionPlan.legs must be an array");let o=2,i=e.intentType==="basket"?12:2;if(n.legs.length<o||n.legs.length>i)throw new TypeError(`${e.intentType} execution plan requires ${o}-${i} legs`);if(e.intentType==="basket"&&n.partialFillRiskAcknowledged!==!0)throw new TypeError("basket partial-fill risk must be acknowledged");if(e.intentType==="perp"&&typeof n.partialFillRiskAcknowledged!="boolean")throw new TypeError("perp partial-fill risk acknowledgement must be boolean");let s=new Set;if(e.intentType==="perp"){let[d,a]=n.legs;if(d.role!=="leverage"||a.role!=="order")throw new TypeError("perp requires isolated leverage followed by one order");let p=d.artifact,b=p?.artifact;if(p?.version!==1||p.surface!=="hl"||p.action!=="leverage"||p.destination!=="hyperliquid"||b?.kind!=="perp-leverage"||b.marginMode!=="isolated"||b.action?.type!=="updateLeverage"||b.action.isCross!==!1||!Number.isSafeInteger(b.leverage)||b.leverage<1||b.action.leverage!==b.leverage||b.action.asset!==b.assetId||b.assetId!==a.artifact?.artifact?.assetId||b.coin!==a.market||d.market!==a.market||d.side!==a.side||p.owner!==a.artifact?.owner)throw new TypeError("perp leverage artifact must bind isolated leverage to the order");if(!Number.isSafeInteger(p.expiresAtMs)||p.expiresAtMs<=r.nowMs||p.expiresAtMs>r.expiresAt)throw new TypeError("leverage artifact expiry must fit the handoff TTL");let w=a.artifact?.artifact;if(w?.kind!=="perp-order"||!["market","limit"].includes(w.orderType)||w.action?.orders?.length!==1)throw new TypeError("perp requires exactly one market or limit order");let S=BigInt(he(e.notionalUsd,"intent notional")),v=BigInt(b.leverage);if(BigInt(he(e.maxLossUsd,"intent max loss"))!==(S+v-1n)/v)throw new TypeError("maxLossUsd must equal isolated margin rounded up to cents")}let l=0,u=0;for(let[d,a]of n.legs.entries()){if(dt(a,`executionPlan.legs[${d}]`),_n(a,new Set(["role","market","side","notionalUsd","weightBps","artifact"]),`executionPlan.legs[${d}]`),typeof a.market!="string"||!ca.test(a.market))throw new TypeError("basket leg market is invalid");if(a.role==="leverage"&&e.intentType==="perp"&&d===0){if(a.notionalUsd!==0||a.weightBps!==0)throw new TypeError("leverage leg carries no notional or weight");continue}if(a.role!==void 0&&a.role!=="order")throw new TypeError("invalid order leg role");if(s.has(a.market))throw new TypeError(`duplicate basket market ${a.market}`);if(s.add(a.market),a.side!=="buy"&&a.side!=="sell")throw new TypeError("basket leg side must be buy or sell");if(l+=he(a.notionalUsd,"basket leg notional"),!Number.isSafeInteger(a.weightBps)||a.weightBps<=0||a.weightBps>1e4)throw new TypeError("basket leg weight must be positive basis points");u+=a.weightBps,da(a.artifact,a,r)}if(u!==1e4)throw new TypeError("basket leg weights must sum to 10000 bps");if(l!==he(e.notionalUsd,"intent notional"))throw new TypeError("basket aggregate notional must equal the exact leg sum");if(l>he(t.maxNotionalUsd,"policy maxNotionalUsd"))throw new TypeError("basket aggregate notional exceeds policy cap")}function rr(e,t,r){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("intent payload must be an object");if(typeof e.chainId!="string"||!t.chainAllowlist.includes(e.chainId))throw new TypeError("intent chain is outside policy allowlist");if(!Number.isFinite(e.notionalUsd)||e.notionalUsd<=0||e.notionalUsd>t.maxNotionalUsd)throw new TypeError("intent notional exceeds policy cap");if(!Number.isFinite(e.maxLossUsd)||e.maxLossUsd<0||e.maxLossUsd>t.maxDailyLossUsd)throw new TypeError("intent loss exceeds policy cap");he(e.notionalUsd,"intent notional"),he(e.maxLossUsd,"intent max loss",{allowZero:!0}),ua(e,t,r)}function nr(e,{compiled:t}={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("handoff must be an object");if(!t?.team||typeof t.teamHash!="string")throw new TypeError("compiled team snapshot is required");let r=e.nowMs??Date.now();if(!Number.isSafeInteger(r))throw new TypeError("nowMs is invalid");if(!Number.isSafeInteger(e.ttlMs)||e.ttlMs<=0||e.ttlMs>6e4)throw new TypeError("TTL must be bounded to 60 seconds");let n=lt(e.teamId,"teamId"),o=la(e.teamHash,"teamHash");if(t.team.id!==n||t.teamHash!==o)throw new TypeError("handoff team snapshot mismatch");let i=lt(e.sourceAgentId,"sourceAgentId"),s=lt(e.targetAgentId,"targetAgentId"),l=At(e.artifactKind);if(!t.team.edges.some(w=>w.from===i&&w.to===s&&w.artifactKind===l))throw new TypeError("handoff does not match compiled team edge");if(!Array.isArray(e.evidenceRefs)||!e.evidenceRefs.length)throw new TypeError("evidenceRefs must be non-empty");let u=e.evidenceRefs.map(w=>{if(typeof w!="string"||!ia.test(w))throw new TypeError("evidence reference must be a SHA-256 content hash");return w});if(new Set(u).size!==u.length)throw new TypeError("duplicate evidence reference");let d=M(e.payload),a=Ve(t.team.policy,{nowMs:r,mode:t.team.mode}),p=r+e.ttlMs;if(p>a.expiresAt)throw new TypeError("handoff TTL exceeds policy expiry");sa.has(l)&&rr(d,a,{mode:t.team.mode,nowMs:r,expiresAt:p});let b={teamId:n,teamHash:o,runId:lt(e.runId,"runId"),sourceAgentId:i,targetAgentId:s,artifactKind:l,payload:d,payloadHash:Te(d),evidenceRefs:u,ttlMs:e.ttlMs,issuedAt:r,expiresAt:p,policy:a,policyHash:Te(a)};return ae(M({...b,handoffHash:Te(b),executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}))}import{createHash as $n,randomUUID as pa}from"node:crypto";var fa=["chain-allowlist","notional-cap","loss-cap"];function or({evidence:e,intent:t}={}){return{kind:"risk-decision",status:"unknown",liveData:"unavailable",observedAt:null,chainId:null,notionalUsd:null,maxLossUsd:null,executionAllowed:!1,reason:"Trusted runtime observation provenance is unavailable",prompt:typeof e?.prompt=="string"?e.prompt:typeof t?.prompt=="string"?t.prompt:"",riskChecks:fa.map(n=>({check:n,pass:!1,status:"unknown"}))}}function ir({intent:e,policy:t,nowMs:r}){let n=[{check:"chain-allowlist",pass:t.chainAllowlist.includes(e.chainId)},{check:"notional-cap",pass:e.notionalUsd>0&&e.notionalUsd<=t.maxNotionalUsd},{check:"loss-cap",pass:e.maxLossUsd>0&&e.maxLossUsd<=t.maxDailyLossUsd}];return{kind:"risk-decision",status:"measured",source:"oracle-builder",chainId:e.chainId,notionalUsd:e.notionalUsd,maxLossUsd:e.maxLossUsd,executionAllowed:n.every(o=>o.pass),riskChecks:n,observedAt:r}}function Pn(e,t,r){let n=$n("sha256").update(JSON.stringify(t)).digest("hex");return`sha256:${$n("sha256").update(`${e}\0${n}\0${r}`).digest("hex")}`}function ma(e){return{...M({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:!1}),consumedHandoffHashes:[...e.consumedHandoffHashes]}}function ha(e){return{...M(e),consumedHandoffHashes:new Set(e?.consumedHandoffHashes||[]),confirmationPending:!1}}function sr(e){return{...M({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:e.confirmationPending}),consumedHandoffHashes:new Set(e.consumedHandoffHashes)}}var Ln=new Set(["approved-intent","prepared-intent","prepared-basket"]),wa=Object.freeze(["executionAllowed","verified","trusted","status","riskChecks","observedAt","liveData","policy","policyHash","evidenceRefs","handoffHash","signed","broadcast","backendSigner","signingReady","broadcastReady","requiresOperatorConfirmation"]);function ue(e,t,r){if(r>=t.compiled.team.policy.expiresAt)throw e.status="expired",e.updatedAt=r,new Error("team policy expired")}function Nn(e,t){if(Ln.has(e)&&!(!t||typeof t!="object"||Array.isArray(t))){if(Object.hasOwn(t,"kind")||"kind"in t)throw new TypeError("intent payload kind is not an intent artifact");for(let r of wa)if(Object.hasOwn(t,r)||r in t)throw new TypeError("intent payload cannot carry authority or provenance claims")}}function ar(e,t){if(!e)throw new TypeError("step must consume the exact prior handoff");if(t<e.issuedAt)throw new Error("prior handoff is not yet valid");if(t>=e.expiresAt)throw new Error("prior handoff expired")}function ut(e,t){e.clear();for(let[r,n]of t)e.set(r,n)}function Rn(e){let t=e?.receipt;if(typeof t?.transactionHash=="string"&&/^0x[0-9a-f]{64}$/i.test(t.transactionHash)){if(t.status===1||t.status==="0x1")return"confirmed";if(t.status===0||t.status==="0x0")return"failed"}let r=e?.order;if(typeof r?.orderId=="string"&&/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(r.orderId)){if(r.status==="filled")return"confirmed";if(r.status==="rejected")return"failed"}return"unknown"}function ga({now:e=Date.now,storage:t,stateStore:r,tenantId:n="local-owner",executionAdapter:o,reconciliationAdapter:i}={}){let s=String(n||"").trim();if(!s)throw new TypeError("tenantId is required");let l=t??new Map,u=new Map,d=new Map,a=new Map,p=!r,b=null,w=0,S=Promise.resolve(),v=async(c,f)=>l.set(c,M(f)),_=async c=>l.get(c),R=async()=>l instanceof Map?[...l.values()]:l.list(),O=c=>ae(M(c));function C(c){let f=S.then(c,c);return S=f.catch(()=>{}),f}function x(){if(!(l instanceof Map)){if(r)throw new Error("durable team state requires map-backed definitions");return{definitions:null,runs:new Map([...u].map(([c,f])=>[c,M(f)])),contexts:new Map([...d].map(([c,f])=>[c,sr(f)])),threads:new Map([...a].map(([c,f])=>[c,M(f)]))}}return{definitions:new Map([...l].map(([c,f])=>[c,M(f)])),runs:new Map([...u].map(([c,f])=>[c,M(f)])),contexts:new Map([...d].map(([c,f])=>[c,sr(f)])),threads:new Map([...a].map(([c,f])=>[c,M(f)]))}}function L(c,f){return{version:1,revision:f,tenantId:s,definitions:[...c.definitions.values()].map(M),runs:[...c.runs.values()].map(M),contexts:[...c.contexts.entries()].map(([m,y])=>({runId:m,context:ma(y)})),threads:[...c.threads.values()].map(M)}}function j(c){c.definitions&&ut(l,c.definitions),ut(u,c.runs),ut(d,c.contexts),ut(a,c.threads)}function T(c,{persist:f=!0}={}){return C(async()=>{let m=x(),y=c(m),h=w;if(f&&r){let g=w,E=await r.save(L(m,g),{expectedRevision:g});h=E.revision,m.threads=new Map((E.threads||[]).map(k=>[k.teamId,M(k)]))}return j(m),w=h,y})}async function N(){p||(b||(b=(async()=>{let c=await r.load();if(c.tenantId!==s)throw new Error("team state tenant mismatch");if(!Number.isSafeInteger(c.revision)||c.revision<0)throw new Error("team state revision is invalid");if(!(l instanceof Map))throw new Error("durable team state requires map-backed definitions");let f={definitions:new Map,runs:new Map,contexts:new Map,threads:new Map};for(let h of c.definitions)f.definitions.set(h.team.id,M(h));for(let h of c.runs)f.runs.set(h.id,M(h));for(let h of c.contexts)f.contexts.set(h.runId,ha(h.context));for(let h of c.threads||[])f.threads.set(h.teamId,M(h));let m=!1;for(let h of f.runs.values()){if(!(h.status==="executing"||h.attempts?.some(k=>k.status==="submission-unknown")))continue;h.status="reconciliation-required",h.executionAllowed=!1,h.requiresOperatorConfirmation=!1,h.uncertainExecution=!0,h.updatedAt=e();let E=f.contexts.get(h.id);E&&(E.executionConsumed=!0,E.confirmationPending=!1),m=!0}let y=c.revision;if(m){let h=await r.save(L(f,y),{expectedRevision:y});y=h.revision,f.threads=new Map((h.threads||[]).map(g=>[g.teamId,M(g)]))}j(f),w=y,p=!0})()),await b)}async function B(){if(typeof o?.status!="function")throw new Error("armed mode requires a local execution adapter");let c=await o.status();if(!c?.configured||!c?.reachable||c?.armed!==!0)throw new Error("local signer is not armed and reachable");if(typeof o?.executeConfirmedArtifact!="function")throw new Error("armed mode requires a local execution adapter");return c}function D(c,f,m,y){let h=c.runs.get(f),g=c.contexts.get(f);if(!h||!g)throw new Error(`unknown run ${f}`);if(h.status==="halted")throw new Error("run is halted");if(h.status==="paused")throw new Error("run is paused");if(h.status!=="running"&&h.status!=="shadowing")throw new Error("run cannot step from its current state");let E=e();if(ue(h,g,E),h.steps.length>=h.maxSteps)throw new Error("run step budget exhausted");if(m?.agentId!==g.currentAgentId)throw new TypeError("step agent is out of order");let k=g.compiled.team.edges.find($=>$.from===m.agentId);if(!k||k.to!==m?.targetAgentId||k.artifactKind!==m?.artifactKind)throw new TypeError("artifact does not match the exact next team edge");let A,I=null;if(g.previousHandoffHash===null){if(m.inputHandoffHash!==void 0)throw new TypeError("root step cannot consume a prior handoff");A=m.evidenceRefs}else{if(m.inputHandoffHash!==g.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");if(g.consumedHandoffHashes.has(m.inputHandoffHash))throw new TypeError("handoff was already consumed");let $=h.steps.at(-1);if(!$||$.handoffHash!==m.inputHandoffHash)throw new TypeError("step must consume the exact prior handoff");ar($,E),I=m.inputHandoffHash,A=[`evidence:sha256:${m.inputHandoffHash}`]}if(y&&(h.riskEvidence=M(y),!y.executionAllowed))return h.status="risk-blocked",h.executionAllowed=!1,h.requiresOperatorConfirmation=!1,h.updatedAt=E,h;if(m.payload?.kind==="risk-decision"&&m.payload.status==="measured")throw new TypeError("measured risk evidence requires trusted runtime provenance");if(m.payload?.kind==="risk-decision"){if(m.payload.status!=="unknown")throw new TypeError("risk evidence status must be unknown");let $=g.compiled.team.agents.find(H=>H.id===k.from);if($?.role!=="risk"||$.runtime!=="policy")throw new TypeError("only the policy risk agent can block for unknown evidence");if(m.payload.executionAllowed!==!1||m.payload.executionPlan!==void 0||!Array.isArray(m.payload.riskChecks)||m.payload.riskChecks.length!==3)throw new TypeError("unknown risk evidence cannot assert approval or measured amounts");if(m.payload.notionalUsd!==null||m.payload.maxLossUsd!==null||m.payload.chainId!==null||m.payload.observedAt!==null||m.payload.liveData!=="unavailable"||m.payload.riskChecks.some(H=>H.pass!==!1||H.status!=="unknown"))throw new TypeError("unknown risk evidence cannot assert approval or measured amounts");return h.riskEvidence=M(m.payload),h.status="risk-blocked",h.executionAllowed=!1,h.requiresOperatorConfirmation=!1,h.updatedAt=E,h}if(Nn(k.artifactKind,m.payload),!y&&Ln.has(k.artifactKind)&&m.payload?.executionPlan!==void 0)throw new TypeError("executable intent requires the trusted Oracle builder");let q=nr({teamId:h.teamId,teamHash:h.teamHash,runId:f,sourceAgentId:k.from,targetAgentId:k.to,artifactKind:k.artifactKind,payload:m.payload,evidenceRefs:A,ttlMs:m.ttlMs,nowMs:E},{compiled:g.compiled});return I!==null&&g.consumedHandoffHashes.add(I),h.steps.push(q),h.updatedAt=E,g.currentAgentId=k.to,g.previousHandoffHash=q.handoffHash,k.to===g.compiled.team.agents.find($=>$.role==="executor").id&&(h.status=h.mode==="armed"?"awaiting-confirmation":"prepared",h.preparedAt=E,h.mode!=="armed"&&(h.completedAt=E)),h}return Object.freeze({async save(c){if(await N(),!(l instanceof Map)){let m=await C(async()=>{let y=typeof c?.id=="string"?await _(c.id):null,h=c?.kind==="group"&&c.sessionId===void 0?y:null,g=h?.team?.kind==="group"?{...c,sessionId:h.team.sessionId}:c,E=Xe(g,{nowMs:e()});if(y&&y.team?.kind!==E.team.kind)throw new Error("team kind cannot change");return await v(E.team.id,E),E});return O(m)}let f=await T(m=>{let y=typeof c?.id=="string"?m.definitions.get(c.id):null,h=c?.kind==="group"&&c.sessionId===void 0?y:null,g=h?.team?.kind==="group"?{...c,sessionId:h.team.sessionId}:c,E=Xe(g,{nowMs:e()}),k=m.definitions.get(E.team.id);if(k&&k.team?.kind!==E.team.kind)throw new Error("team kind cannot change");return m.definitions.set(E.team.id,M(E)),E.team.kind==="group"&&!m.threads.has(E.team.id)&&m.threads.set(E.team.id,{teamId:E.team.id,sessionId:E.team.sessionId,messages:[]}),m.definitions.get(E.team.id)});return O(f)},async list(){return await N(),O(await R())},async get(c){await N();let f=await _(c);return f===void 0?null:O(f)},async remove(c){await N();let f=String(c||"").trim();if(!(l instanceof Map)){if(typeof l.delete!="function")throw new Error("team storage does not support deletion");return O(await C(async()=>{let y=await _(f);if(!y||y.team?.kind!=="group")throw new Error(`unknown group ${f}`);if(await l.delete(f)===!1||await _(f)!==void 0)throw new Error(`team deletion failed ${f}`);a.delete(f);for(let[g,E]of u)E.teamId===f&&(u.delete(g),d.delete(g));return{deleted:!0,teamId:f}}))}let m=await T(y=>{let h=y.definitions.get(f);if(!h||h.team?.kind!=="group")throw new Error(`unknown group ${f}`);y.definitions.delete(f),y.threads.delete(f);for(let[g,E]of y.runs)E.teamId===f&&(y.runs.delete(g),y.contexts.delete(g));return{deleted:!0,teamId:f}});return O(m)},async listThreads(){return await N(),O([...a.values()])},async getThread(c){await N();let f=a.get(c);return f===void 0?null:O(f)},async appendThreadEvent(c,f){return await N(),await T(m=>{let y=m.definitions?.get(c);if(!y||y.team.kind!=="group")throw new Error(`unknown group ${c}`);let h=m.threads.get(c)||{teamId:c,sessionId:y.team.sessionId,messages:[]},g=Et(h,f);m.threads.set(c,{...g,teamId:c})}),O(a.get(c))},async getRun(c){await N();let f=u.get(c);return f===void 0?null:O(f)},async getTurnState(c,f){return await N(),C(()=>{let m=u.get(c),y=d.get(c);if(!m||!y)throw new Error(`unknown run ${c}`);if(m.teamId!==f)throw new Error("run team mismatch");if(m.status!=="running"&&m.status!=="shadowing")throw new Error(`run is not active: ${m.status}`);let h=e();if(ue(M(m),y,h),y.previousHandoffHash!==null){let g=m.steps.at(-1);if(!g||g.handoffHash!==y.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");ar(g,h)}return O({run:m,compiled:y.compiled,currentAgentId:y.currentAgentId,previousHandoffHash:y.previousHandoffHash,inbound:m.steps.at(-1)?.payload??null})})},async start(c){await N();let f=await _(c);if(!f)throw new Error(`unknown team ${c}`);if(f.team.kind==="group")throw new Error("group chats do not start pipeline runs");let m=ae(M(f));m.team.mode==="armed"&&await B();let y=await T(h=>{let g=h.definitions?h.definitions.get(c):m;if(!g)throw new Error(`unknown team ${c}`);if(g.team.mode==="draft")throw new Error("draft team must be promoted before running");if(g.team.mode==="halted")throw new Error("team kill switch is active");let E=e();if(E>=g.team.policy.expiresAt)throw new Error("team policy expired");let k=g.team.mode==="armed",A=g.team.agents.find(q=>!g.team.edges.some($=>$.to===q.id));if(!A)throw new Error("team pipeline has no root agent");let I={id:pa(),tenantId:s,teamId:c,teamHash:g.teamHash,status:g.team.mode==="shadow"?"shadowing":"running",mode:g.team.mode,armed:k,startedAt:E,updatedAt:E,expiresAt:g.team.policy.expiresAt,maxSteps:g.team.edges.length,steps:[],receipts:[],attempts:[],executionAllowed:!1,backendSigner:k,signingReady:k,broadcastReady:k,requiresOperatorConfirmation:!0,signed:!1,broadcast:!1};return h.runs.set(I.id,I),h.contexts.set(I.id,{compiled:ae(M(g)),currentAgentId:A.id,previousHandoffHash:null,consumedHandoffHashes:new Set,executionConsumed:!1,confirmationPending:!1}),I});return O(y)},async step(c,f){await N();let m=await T(y=>D(y,c,f));return O(m)},async submitIntent(c,{request:f,owner:m,builderDeps:y,signal:h}={}){await N();let g=await C(()=>{let q=u.get(c),$=d.get(c);if(!q||!$)throw new Error(`unknown run ${c}`);let H=$.compiled.team.agents.find(Y=>Y.id===$.currentAgentId),U=$.compiled.team.edges.find(Y=>Y.from===H?.id);if(q.mode!=="armed")throw new Error("trusted intent requires armed mode");if(H?.runtime!=="policy"||H.role!=="risk"||U?.artifactKind!=="approved-intent")throw new Error("trusted intent requires the policy risk edge");if(q.status!=="running")throw new Error("run cannot submit intent from its current state");return ue(M(q),$,e()),ar(q.steps.at(-1),e()),O({policy:$.compiled.team.policy,edge:U,inputHandoffHash:$.previousHandoffHash})});h?.throwIfAborted();let E=e(),k=Math.min(E+3e4,g.policy.expiresAt),A=await tr({request:f,owner:m,policy:g.policy,nowMs:E,expiresAt:k,deps:{...y,runId:c,nonce:E}});h?.throwIfAborted();let I=await T(q=>{let $=e();if($>=k)throw new Error("prepared intent expired");let H=ir({intent:A,policy:g.policy,nowMs:$});return D(q,c,{agentId:g.edge.from,targetAgentId:g.edge.to,artifactKind:g.edge.artifactKind,inputHandoffHash:g.inputHandoffHash,payload:A,ttlMs:k-$},H)});return O(I)},async confirm(c,f){await N();let m=await T(y=>{let h=y.runs.get(c),g=y.contexts.get(c);if(!h||!g)throw new Error(`unknown run ${c}`);if(h.status==="halted")throw new Error("run is halted");if(h.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state or was already executed");let E=e();ue(h,g,E);let k=h.steps.at(-1);if(!k||k.artifactKind!=="approved-intent")throw new Error("approved intent handoff is required");if(E>=k.expiresAt)throw new Error("approved intent handoff expired");if(Nn(k.artifactKind,k.payload),rr(k.payload,g.compiled.team.policy,{mode:h.mode,nowMs:E,expiresAt:k.expiresAt}),f?.handoffHash!==k.handoffHash)throw new TypeError("confirmation must bind the exact handoff hash");if(f?.operatorConfirmed!==!0||f?.sign!==!0||f?.broadcast!==!0)throw new TypeError("explicit confirm, sign, and broadcast instruction is required");if(g.executionConsumed||g.confirmationPending)throw new Error("approved intent is already executing or was already executed");return g.confirmationPending=!0,M(k)},{persist:!1});try{await B();let y=m.payload?.executionPlan?.legs;if(!Array.isArray(y)||!y.length)throw new Error("approved intent has no executable legs");await T(g=>{let E=g.runs.get(c),k=g.contexts.get(c);if(!E||!k)throw new Error(`unknown run ${c}`);let A=e();if(ue(E,k,A),E.status==="halted")throw new Error("run was halted before execution");if(E.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state");if(!k.confirmationPending||k.executionConsumed)throw new Error("approved intent is already executing or was already executed");if(A>=m.expiresAt)throw new Error("approved intent handoff expired");k.executionConsumed=!0,E.status="executing",E.updatedAt=A});for(let[g,E]of y.entries()){let k=Pn(s,E.artifact,g);await T($=>{let H=$.runs.get(c),U=$.contexts.get(c);if(!H||!U)throw new Error(`unknown run ${c}`);if(H.status==="halted")throw new Error("run was halted during sequential basket execution");if(H.status!=="executing")throw new Error("run cannot execute from its current state");let Y=e();if(ue(H,U,Y),Y>=m.expiresAt)throw new Error("approved intent handoff expired during execution");H.attempts[g]={legIndex:g,idempotencyKey:k,status:"submission-unknown",submittedAt:Y},H.updatedAt=Y});let A=await o.executeConfirmedArtifact(M(E.artifact),{tenantId:s,runId:c,handoffHash:m.handoffHash,idempotencyKey:k,legIndex:g,legCount:y.length});await T($=>{let H=$.runs.get(c);if(!H)throw new Error(`unknown run ${c}`);let U=H.attempts[g];if(!U||U.idempotencyKey!==k)throw new Error("execution attempt state changed before receipt persistence");U.status="receipt-recorded",U.receipt=M(A),U.receivedAt=e(),H.receipts.push(M(A)),H.updatedAt=U.receivedAt});let I=u.get(c),q=d.get(c);if(I?.status==="halted")throw new Error("run was halted during sequential basket execution");if(!I||!q)throw new Error(`unknown run ${c}`);if(ue(M(I),sr(q),I.updatedAt),I.updatedAt>=m.expiresAt)throw new Error("approved intent handoff expired during execution")}let h=await T(g=>{let E=g.runs.get(c),k=g.contexts.get(c);if(!E||!k)throw new Error(`unknown run ${c}`);if(E.status==="halted")throw new Error("run was halted during sequential basket execution");if(E.status!=="executing")throw new Error("run cannot complete from its current state");if(ue(E,k,E.updatedAt),E.updatedAt>=m.expiresAt)throw new Error("approved intent handoff expired during execution");return E.status="completed",E.executionAllowed=!1,E.requiresOperatorConfirmation=!1,E.signed=!0,E.broadcast=!0,E.completedAt=e(),E.updatedAt=E.completedAt,E});return O(h)}catch(y){if(d.get(c)?.executionConsumed)try{await T(g=>{let E=g.runs.get(c),k=g.contexts.get(c);if(!E||!k)return;let A=E.attempts.some(I=>I.status==="submission-unknown");E.status!=="halted"&&E.status!=="expired"&&(E.status=A?"reconciliation-required":"failed"),E.executionAllowed=!1,E.uncertainExecution=A,E.partialExecution=E.receipts.length>0,E.error=y instanceof Error?y.message:"local execution failed",E.updatedAt=e()})}catch{}throw y}finally{await T(y=>{let h=y.contexts.get(c);h&&(h.confirmationPending=!1)},{persist:!1})}},async reconcile(c){if(typeof c!="string"||!/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(c))throw new TypeError("runId is invalid");let f=await C(async()=>{if(r){let A=await r.load();if(A.tenantId!==s)throw new Error("team state tenant mismatch");return M({run:A.runs.find(I=>I.id===c)??null,revision:A.revision})}return M({run:u.get(c)??null,revision:w})}),m=f.run;if(!m||m.tenantId!==s)throw new Error(`unknown run ${c}`);let y=m.steps.at(-1),h=y?.payload?.executionPlan?.legs??[],g=[];for(let A of m.attempts||[]){let I=h[A.legIndex],q={tenantId:s,runId:c,handoffHash:y?.handoffHash??null,idempotencyKey:A.idempotencyKey,legIndex:A.legIndex,tradeId:I?.artifact?.tradeId??null},$="unknown",H="unavailable",U=null,Y="lookup-unavailable",ge=I&&Number.isSafeInteger(A.legIndex)&&A.legIndex>=0&&A.idempotencyKey===Pn(s,I.artifact,A.legIndex);if(ge&&A.status==="receipt-recorded"&&Number.isSafeInteger(A.receivedAt)&&A.receivedAt>=A.submittedAt&&A.receivedAt<=e()&&($=Rn(A.receipt),$!=="unknown"&&(H="stored-receipt",U=A.receivedAt)),ge&&$==="unknown"){for(let Ae of["lookupReceipt","lookupOrder"])if(typeof i?.[Ae]=="function")try{let W=await i[Ae](O(q));if(W?.available===!1){["disabled","hosted","unconfigured","lookup-unavailable","identity-mismatch","invalid-evidence"].includes(W.reason)&&(Y=W.reason);break}if(!W||Object.keys(q).some(qe=>W[qe]!==q[qe])||!Number.isSafeInteger(W.observedAt)||W.observedAt<A.submittedAt||W.observedAt>e())continue;if($=Rn(Ae==="lookupReceipt"?{receipt:W.receipt}:{order:W.order}),$!=="unknown"){H=Ae,U=W.observedAt;break}}catch{}}g.push({...q,status:$,source:H,observedAt:U,reason:$==="unknown"?Y:null})}let E=Math.max(0,h.length-g.length),k=!g.length||E>0||g.some(A=>A.status==="unknown");return O({runId:c,tenantId:s,runStatus:m.status,revision:f.revision,readOnly:!0,executionAllowed:!1,recoveryRequired:k,status:k?"reconciliation-required":"reconciled",attempts:g,unattemptedLegs:E})},async pause(c){await N();let f=await T(m=>{let y=m.runs.get(c);if(!y)throw new Error(`unknown run ${c}`);if(y.status!=="running"&&y.status!=="shadowing")throw new Error("only an active run can be paused");return y.resumeStatus=y.status,y.status="paused",y.updatedAt=e(),y});return O(f)},async resume(c){await N();let f=await T(m=>{let y=m.runs.get(c),h=m.contexts.get(c);if(!y||!h)throw new Error(`unknown run ${c}`);if(y.status!=="paused")throw new Error("only a paused run can be resumed");let g=e();return ue(y,h,g),y.status=y.resumeStatus==="shadowing"?"shadowing":"running",delete y.resumeStatus,y.updatedAt=g,y});return O(f)},async halt(c){await N();let f=await T(m=>{let y=m.runs.get(c);if(!y)throw new Error(`unknown run ${c}`);return y.status="halted",delete y.resumeStatus,y.updatedAt=e(),y});return O(f)}})}import{createHash as ya}from"node:crypto";var ba=/\b[A-Z][A-Z0-9]{1,5}\b/g,xa=3e4;function Ea(e){return ya("sha256").update(e).digest("hex")}function Sa(e){return String(e).replace(/\$\s*\d[\d,.]*/g,"[amount]").slice(0,500)}function ka(e){let t=new Set(e.edges.map(s=>s.to)),r=e.agents.find(s=>!t.has(s.id));if(!r)throw new Error("team pipeline has no root agent");let n=new Map(e.edges.map(s=>[s.from,s])),o=[],i=r.id;for(;n.has(i);){let s=n.get(i);o.push(s),i=s.to}if(o.length!==e.edges.length)throw new Error("team pipeline edges are not a single ordered chain");return o}function Aa({prompt:e,nowMs:t}){let r=[...new Set(e.match(ba)||[])];return{kind:"evidence",prompt:e,observations:r,generatedAt:t,source:"operator-prompt",liveData:"unavailable"}}function Mn({agent:e,prompt:t,inbound:r}){let n=r?.kind==="evidence"?`evidence observations [${(r.observations||[]).join(", ")}]`:r?.kind==="analysis"?`prior ${r.role||"analysis"} thesis`:"operator prompt only",o=Sa(`Rule-based bounded summary: ${e.role} review of ${n} for prompt "${t}". No live market data was read and no prices or market numbers are asserted.`);return{kind:"analysis",role:e.role,thesis:o,generator:{kind:"rules"},degradedReason:"model runtime unavailable"}}function Ta(e){return Array.isArray(e)?e.slice(0,16).flatMap(t=>{let r=typeof t?.name=="string"?t.name.trim():"",n=typeof t?.argsHash=="string"?t.argsHash:"";return!/^[a-z0-9][a-z0-9._:-]{0,63}$/.test(r)||!/^[0-9a-f]{64}$/.test(n)?[]:[{name:r,argsHash:n,ok:t?.ok===!0}]}):[]}async function Oa({agent:e,prompt:t,inbound:r,modelInvoker:n,signal:o}){if(typeof n!="function")return Mn({agent:e,prompt:t,inbound:r});try{let i=await n({agent:e,prompt:t,inbound:r,signal:o});if(typeof i?.text!="string"||!i.text.trim())throw new Error("model invoker returned no text");let s=Ta(i.toolCalls),l=r?.intent&&typeof r.intent=="object"?r.intent:r?.evidence?.intent,u=r?.kind==="evidence"?r:r?.evidence?.kind==="evidence"?r.evidence:void 0;return{kind:"analysis",role:e.role,thesis:i.text,generator:{kind:"model",provider:e.provider,model:e.model},...s.length?{toolCalls:s}:{},...l?{intent:l}:{},...u?{evidence:u}:{}}}catch{return o?.throwIfAborted(),Mn({agent:e,prompt:t,inbound:r})}}function Ia({prompt:e,inbound:t,compiled:r,nowMs:n}){let o=t?.kind==="evidence"?t:t?.evidence?.kind==="evidence"?t.evidence:void 0,i=t?.intent&&typeof t.intent=="object"?t.intent:o?.intent;return{...or({policy:r?.policy,evidence:o,intent:i,nowMs:n}),prompt:e}}function Cn(e,t){if(t.kind==="evidence"){let r=t.observations.length?t.observations.join(", "):"no symbols";return`${e.name}: parsed operator prompt (${r}); live market data unavailable.`}if(t.kind==="analysis"){let r=t.generator.kind==="model"?`${t.generator.provider}/${t.generator.model}`:"bounded rules";return`${e.name}: ${t.thesis.slice(0,160)} (via ${r})`}if(t.status==="measured"){let r=t.riskChecks.every(n=>n.pass===!0)?"bounds satisfied":"a measured bound failed";return`${e.name}: measured risk ${r}; execution blocked pending operator confirmation.`}return`${e.name}: risk unknown; live timestamped observations unavailable. No intent approved; execution blocked.`}async function va({service:e,team:t,teamId:r,runId:n,prompt:o,nowMs:i,modelInvoker:s,onEvent:l,orderRequest:u,owner:d,builderDeps:a,signal:p}={}){let b=typeof l=="function"?w=>{l(w)}:()=>{};try{if(p?.throwIfAborted(),!e)throw new TypeError("service is required");if(typeof o!="string"||!o.trim())throw new TypeError("prompt is required");if(o.length>4e3)throw new TypeError("prompt exceeds 4000 characters");let w=String(r||t?.team?.id||t?.id||"");if(!w)throw new TypeError("teamId is required");let S=await e.get(w);if(!S)throw new Error(`unknown team ${w}`);if(S.team.kind==="group")throw new Error("group chats do not run pipeline turns");let v=Number.isSafeInteger(i)?i:Date.now();if(n!==void 0&&(typeof n!="string"||!/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(n)))throw new TypeError("runId is invalid");let _=n??(await e.start(w)).id,R=await e.getTurnState(_,w),O=R.run,C=R.compiled.team,x=ka(C),L=x.findIndex(D=>D.from===R.currentAgentId),j=O.steps.at(-1);if(L<0||L!==O.steps.length||R.previousHandoffHash!==(j?.handoffHash??null)||j&&j.targetAgentId!==R.currentAgentId)throw new Error("persisted run cursor mismatch");if(O.steps.length>0){let D=O.steps[0]?.payload?.prompt;if(typeof D!="string")throw new Error("committed prompt unavailable");o=D}b({type:"run.started",run:O});let T=new Map(C.agents.map(D=>[D.id,D])),N=R.previousHandoffHash,B=R.inbound;for(let D=L;D<x.length;D+=1){p?.throwIfAborted();let c=x[D],f=T.get(c.from);if(b({type:"agent.started",agentId:f.id,name:f.name,role:f.role,runtime:f.runtime}),f.runtime==="policy"&&C.mode==="armed"&&u!==void 0){if(O=await e.submitIntent(O.id,{request:u,owner:d,builderDeps:a,signal:p}),b({type:"agent.output",agentId:f.id,text:Cn(f,O.riskEvidence),payload:O.riskEvidence}),O.status==="awaiting-confirmation"){let g=O.steps.at(-1),[E,k]=g.payload.executionPlan.legs;b({type:"intent.prepared",coin:k.market,side:k.side,notionalUsd:g.payload.notionalUsd,leverage:E.artifact.artifact.leverage,maxLossUsd:g.payload.maxLossUsd,handoffHash:g.handoffHash,expiresAt:g.expiresAt}),b({type:"run.awaiting-confirmation",run:O})}break}let m;if(f.runtime==="deterministic")m=Aa({prompt:o,nowMs:v});else if(f.runtime==="model")m=await Oa({agent:f,prompt:o,inbound:B,modelInvoker:s,signal:p});else if(f.runtime==="policy")m=Ia({prompt:o,inbound:B,compiled:C,nowMs:v});else throw new Error(`agent runtime ${f.runtime} cannot produce a handoff artifact`);b({type:"agent.output",agentId:f.id,text:Cn(f,m),payload:m});let y={agentId:c.from,targetAgentId:c.to,artifactKind:c.artifactKind,payload:m,ttlMs:xa};if(D===0?y.evidenceRefs=[`evidence:sha256:${Ea(`${w}\0${o}`)}`]:y.inputHandoffHash=N,p?.throwIfAborted(),O=await e.step(O.id,y),O.status==="risk-blocked")break;let h=O.steps.at(-1);N=h.handoffHash,B=m,b({type:"handoff.verified",handoff:{sourceAgentId:h.sourceAgentId,targetAgentId:h.targetAgentId,artifactKind:h.artifactKind,handoffHash:h.handoffHash}})}return b({type:"run.status",run:O}),O}catch(w){throw b({type:"error",message:w instanceof Error?w.message:"team turn failed"}),w}}import{closeSync as ze,constants as se,fchmodSync as jn,fstatSync as Gn,fsyncSync as cr,linkSync as _a,lstatSync as we,mkdirSync as $a,openSync as Fe,readFileSync as Ue,readlinkSync as Hn,realpathSync as Pa,renameSync as Na,rmSync as lr,writeFileSync as Dn}from"node:fs";import{createHash as Ra,randomBytes as Bn}from"node:crypto";import{homedir as La}from"node:os";import{basename as Ma,dirname as pt,join as mt,resolve as Ca}from"node:path";var Jn=1,fr=se.O_NOFOLLOW??0,ja=16*1024*1024,dr=15*1024*1024;function Ha(e){let t=String(e||"").trim();if(!t||t.length>200||/[\u0000-\u001f\u007f]/.test(t))throw new TypeError("tenantId is required");return t}function Yn(e){return e==null?e:structuredClone(e)}function ht(e,t,r=!1,n=process.platform){let o=r?!e.isDirectory():!e.isFile(),i=n!=="win32",s=i&&typeof process.getuid=="function"&&Number(e.uid)!==process.getuid(),l=i&&(Number(e.mode)&18)!==0;if(e.isSymbolicLink()||o||s||l)throw new Error(`${t} must be an owner-controlled ${r?"directory":"regular file"}`)}function zn(e,t){$a(e,{recursive:!0,mode:448});let r=we(e);ht(r,"team state directory",!0,t)}function Da(e,t){let r=Ra("sha256").update(t).digest("hex");return mt(e,`${r}.json`)}function Fn(e){return Buffer.byteLength(`${JSON.stringify(e)}
5
+ `,"utf8")}function Un(e){let t=Date.parse(String(e?.createdAt||""));return Number.isFinite(t)?t:Number.MIN_SAFE_INTEGER}function Ba(e){let t={...e,threads:e.threads.map(n=>Ge(n))},r=Fn(t);for(;r>dr;){let n=t.threads.flatMap((l,u)=>l.messages.map((d,a)=>({message:d,messageIndex:a,thread:l,threadIndex:u})).filter(({message:d})=>d?.historyTruncated!==!0));if(n.length===0)throw new Error("team state non-thread data exceeds durable size budget");n.sort((l,u)=>{let d=Un(l.message)-Un(u.message);if(d!==0)return d;let a=String(l.thread.teamId||""),p=String(u.thread.teamId||"");return a<p?-1:a>p?1:l.messageIndex!==u.messageIndex?l.messageIndex-u.messageIndex:l.threadIndex-u.threadIndex});let o=r-dr,i=new Map,s=0;for(let l of n)if(i.set(l.threadIndex,(i.get(l.threadIndex)||0)+1),s+=Buffer.byteLength(JSON.stringify(l.message),"utf8")+1,s>=o+i.size*512)break;t={...t,threads:t.threads.map((l,u)=>{let d=i.get(u)||0;return d>0?yr(l,d):l})},r=Fn(t)}return t}function Vn(e,t){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("team state snapshot must be an object");let r={...e,threads:e.threads===void 0?[]:e.threads};if(r.version!==Jn||r.tenantId!==t)throw new TypeError("team state tenant or version mismatch");if(!Number.isSafeInteger(r.revision)||r.revision<0)throw new TypeError("team state revision must be a non-negative safe integer");for(let n of["definitions","runs","contexts","threads"])if(!Array.isArray(r[n]))throw new TypeError(`team state ${n} must be an array`);return Ke(r),Ba(Yn(r))}function za(e){return{version:Jn,revision:0,tenantId:e,definitions:[],runs:[],contexts:[],threads:[]}}function qn(e,t,r){try{let n=we(e);if(ht(n,"team state file",!1,r),n.size>ja)throw new Error("team state file is too large");return Vn(JSON.parse(Ue(e,"utf8")),t)}catch(n){if(n?.code==="ENOENT")return za(t);throw n}}function te(e,t){return Object.assign(new Error(`team state lock recovery refused: ${e}`,{cause:t}),{code:"ETEAMLOCKRECOVERY"})}function Fa(e){if(e!=="linux"||process.platform!=="linux")return null;try{let t=Ue("/proc/self/stat","utf8"),r=Number(t.slice(0,t.indexOf(" "))),n=t.slice(t.lastIndexOf(")")+2).split(" ")[19],o=Ue("/proc/sys/kernel/random/boot_id","utf8").trim(),i=Hn("/proc/self/ns/pid");return r!==process.pid||!/^[0-9]+$/.test(n)||!/^[0-9a-f-]{36}$/.test(o)||!/^pid:\[[0-9]+\]$/.test(i)||Hn(`/proc/${r}/ns/pid`)!==i?null:{pid:r,uid:process.getuid(),startedAt:n,bootId:o,pidNamespace:i}}catch{return null}}function Ua(e){let t=Pa(pt(e)),r=we(t,{bigint:!0});return{file:mt(t,Ma(e)),device:String(r.dev),inode:String(r.ino)}}function ft(e,t){return e.dev===t.dev&&e.ino===t.ino}function Kn(e,t){try{if(ft(Gn(t,{bigint:!0}),we(e,{bigint:!0})))return}catch(r){throw te("lock ownership could not be verified",r)}throw te("lock ownership changed")}function ur(e){let t=Fe(e,se.O_RDONLY);try{cr(t)}finally{ze(t)}}function qa(e,t){let r=e?.owner,n=t.owner;if(e?.version!==1||typeof e?.nonce!="string"||!/^[0-9a-f]{32}$/.test(e.nonce)||!n||!r||!Number.isSafeInteger(r.pid)||r.pid<=0||typeof r.startedAt!="string"||!/^[0-9]+$/.test(r.startedAt)||r.uid!==n.uid||r.bootId!==n.bootId||r.pidNamespace!==n.pidNamespace||e.store?.file!==t.store.file||e.store?.device!==t.store.device||e.store?.inode!==t.store.inode)throw te("foreign or unverifiable owner/store identity");try{process.kill(r.pid,0)}catch(o){if(o?.code!=="ESRCH")throw te("owner liveness is unknown",o);try{we(`/proc/${r.pid}`)}catch(i){if(i?.code==="ENOENT")return;throw te("owner proc identity is inaccessible",i)}throw te("owner still has a proc identity")}throw te("owner is live")}function Ka(e,t,r){let n;try{let o=we(e,{bigint:!0});ht(o,"team state lock",!1,r),n=Fe(e,se.O_RDONLY|se.O_NONBLOCK|fr);let i=Gn(n,{bigint:!0});if(ht(i,"team state lock",!1,r),!ft(o,i)||i.size>8192)throw te("lock changed or is oversized");let s=Ue(n,"utf8"),l=JSON.parse(s);qa(l,t);let u=`${e}.recovered-${l.nonce}`;if(_a(e,u),!ft(i,we(u,{bigint:!0})))throw te("lock replaced during recovery election");if(ur(pt(e)),!ft(i,we(e,{bigint:!0}))||Ue(e,"utf8")!==s)throw te("lock changed during recovery");lr(e),ur(pt(e))}catch(o){throw o?.code==="ETEAMLOCKRECOVERY"?o:te("lock is ambiguous, unsafe, or recovery is already fenced",o)}finally{n!==void 0&&ze(n)}}function Ga(e,t,r){let n=se.O_CREAT|se.O_EXCL|se.O_WRONLY|fr;try{return Fe(e,n,384)}catch(o){if(o?.code!=="EEXIST")throw o;return Ka(e,t,r),Fe(e,n,384)}}function Wn(e=process.env){let t=String(e?.ORACLE_CONFIG_DIR||"").trim()||mt(La(),".config","oracle");return mt(t,"teams","state")}function Ja(e={}){let{rootDir:t=Wn(),tenantId:r,platform:n=process.platform}=e,o=Ha(r),i=Ca(t),s=Da(i,o),l=`${s}.lock`;return Object.freeze({tenantId:o,file:s,async load(){return zn(i,n),qn(s,o,n)},async save(u,{expectedRevision:d}={}){if(zn(i,n),!Number.isSafeInteger(d)||d<0)throw new TypeError("team state expectedRevision must be a non-negative safe integer");let a={version:1,nonce:Bn(16).toString("hex"),store:Ua(s),owner:Fa(n)},p,b=`${s}.${process.pid}.${Bn(8).toString("hex")}.tmp`,w;try{p=Ga(l,a,n),Dn(p,`${JSON.stringify(a)}
6
+ `,"utf8"),cr(p),jn(p,384);let S=qn(s,o,n);if(S.revision!==d)throw new Error(`team state changed: stale revision ${d}; current revision ${S.revision}`);let v=Vn({...u,revision:d+1},o),_=`${JSON.stringify(v)}
7
+ `;if(Buffer.byteLength(_,"utf8")>dr)throw new Error("team state exceeds durable serialized size budget");return w=Fe(b,se.O_CREAT|se.O_EXCL|se.O_WRONLY|fr,384),Dn(w,_,"utf8"),cr(w),jn(w,384),ze(w),w=void 0,Kn(l,p),Na(b,s),n!=="win32"&&ur(pt(s)),Yn(v)}finally{try{w!==void 0&&ze(w),lr(b,{force:!0})}finally{if(p!==void 0)try{Kn(l,p),lr(l)}finally{ze(p)}}}}})}export{to as BASKET_STRATEGY_CATALOG,Ne as CRYPTO_SKILL_CATALOG,Pe as CRYPTO_TOOL_CATALOG,Qn as MARKET_BREADTH_CATALOG,$e as MODEL_PROVIDER_CATALOG,eo as PERP_SIGNAL_CATALOG,gt as TEAM_MODES,io as TEAM_TEMPLATES,Tt as autoSelectAgentCapabilities,tr as buildTeamHlIntent,Xe as compileTeamDefinition,Ja as createDurableTeamStore,nr as createTeamHandoff,ga as createTeamService,xt as createTeamSessionId,Wn as defaultTeamStateRoot,or as evaluateRiskEvidence,ir as evaluateTeamIntent,Lo as getAgentPresence,Ei as importTeamAgentFromPack,Xo as isAutoSelectableCapability,We as isPackSkillId,Je as isTeamSessionId,Pr as looksRemotePackSource,Et as reduceTeamThread,Ro as routeTeamMessage,va as runTeamTurn,$t as scanTeamAgentPack,vn as validateTeamHlRequest};