@oracle-agent/oracle 0.35.47 → 0.35.48

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -250,7 +250,7 @@ ${n.join(`
250
250
  `),c=[],l=new Map,u=new Set,d=new Set;for(let f=0;f<a.length;f+=1){let m=a[f];if(Buffer.byteLength(m,"utf8")>eK)return{ok:!1,reason:"event-size-limit",line:f+1,count:c.length,workflows:l.size,events:c,paths:r};let h;try{h=JSON.parse(m)}catch{return{ok:!1,reason:"malformed-json",line:f+1,count:c.length,workflows:l.size,events:c,paths:r}}let y;try{y=M_e(h)}catch(b){return{ok:!1,reason:"event-invalid",line:f+1,detail:String(b?.message||b),count:c.length,workflows:l.size,events:c,paths:r}}if(u.has(y.id))return{ok:!1,reason:"duplicate-event-id",line:f+1,count:c.length,workflows:l.size,events:c,paths:r};let g=GT(y),w=G0(y.tenantId,y.workflowId,y.idempotencyKey);if(d.has(w))return{ok:!1,reason:"duplicate-idempotency-key",line:f+1,count:c.length,workflows:l.size,events:c,paths:r};let A=l.get(g)??null,E=String(BigInt(A?.sequence??"0")+1n);if(y.sequence!==E)return{ok:!1,reason:"sequence-gap",line:f+1,count:c.length,workflows:l.size,events:c,paths:r};if(y.previousEventHash!==(A?.eventHash??null))return{ok:!1,reason:"previous-event-hash-mismatch",line:f+1,count:c.length,workflows:l.size,events:c,paths:r};if(A&&Date.parse(y.recordedAt)<Date.parse(A.recordedAt))return{ok:!1,reason:"recorded-at-regression",line:f+1,count:c.length,workflows:l.size,events:c,paths:r};u.add(y.id),d.add(w),l.set(g,y),c.push(y)}let p=new Map;for(let f of c){let m=GT(f);p.has(m)||p.set(m,[]),p.get(m).push(f)}for(let[f,m]of p)try{Aa(m)}catch(h){return{ok:!1,reason:"workflow-invalid",streamKey:f,detail:String(h?.message||h),count:c.length,workflows:l.size,events:c,heads:l,paths:r}}if(n){if(!Fc(r.checkpoint))return c.length===0?{ok:!0,count:0,workflows:0,events:c,heads:l,paths:r,empty:!0}:{ok:!1,reason:"checkpoint-missing",recoverable:!0,count:c.length,workflows:l.size,events:c,heads:l,paths:r};let f;try{tE(r.checkpoint,"checkpoint");let y=eE(r.checkpoint,"utf8");if(!y.endsWith(`
251
251
  `))throw new Ne("checkpoint truncated","CHECKPOINT_INVALID");f=JSON.parse(y),B_e(f)}catch(y){return{ok:!1,reason:"checkpoint-invalid",recoverable:!1,detail:String(y?.message||y),count:c.length,workflows:l.size,events:c,heads:l,paths:r}}let m=tK(r.ledger,c,i),h=U_e(f,m);if(!h.ok)return{...h,count:c.length,workflows:l.size,events:c,heads:l,paths:r}}return{ok:!0,count:c.length,workflows:l.size,events:c,heads:l,paths:r,raw:i,lastEventHash:c.at(-1)?.eventHash??null}}catch(o){return{ok:!1,reason:"io-error",detail:String(o?.message||o),count:0,workflows:0,events:[],paths:r}}}function ah(e){let t={ok:e.ok,count:e.count,workflows:e.workflows,...e.reason?{reason:e.reason}:{},...e.line?{line:e.line}:{},...e.detail?{detail:e.detail}:{},...e.recoverable!==void 0?{recoverable:e.recoverable}:{},...e.lastEventHash!==void 0?{lastEventHash:e.lastEventHash}:{}};return fn(t)}function oK(e={}){return ah(sh(e))}function eC({path:e,tenantId:t,workflowId:n,maxBytes:r=rd}={}){let o=sh({path:e,maxBytes:r});if(!o.ok)throw new Ne(`cannot read corrupt ledger: ${o.reason}`,"LEDGER_CORRUPT",ah(o));t!==void 0&&Ae(t,"tenantId"),n!==void 0&&Ae(n,"workflowId");let i=o.events.filter(s=>(t===void 0||s.tenantId===t)&&(n===void 0||s.workflowId===n));return fn([...i])}function iK({path:e,tenantId:t,workflowId:n,maxBytes:r=rd}={}){Ae(t,"tenantId"),Ae(n,"workflowId");let o=eC({path:e,tenantId:t,workflowId:n,maxBytes:r});if(o.length===0)throw new Ne(`workflow ${t}:${n} not found`,"WORKFLOW_NOT_FOUND");return Aa(o)}function sK(e){if(!Number.isSafeInteger(e)||e<=0)return"invalid";try{return process.kill(e,0),"active"}catch(t){return t?.code==="ESRCH"?"stale":"active"}}function tC(e){let{lock:t}=ls(e);tE(t,"lock");let n=JSON.parse(eE(t,"utf8"));if(vt(n,Y7,Y7,"workflow ledger lock"),n.schemaVersion!==QT)throw new Ne("lock schema mismatch","LOCK_INVALID");if(Ae(n.token,"workflow ledger lock.token"),!Number.isSafeInteger(n.pid)||n.pid<=0)throw new Ne("lock pid invalid","LOCK_INVALID");return Hn(n.createdAt,"workflow ledger lock.createdAt"),n}function oE({path:e}={}){let{lock:t}=ls(e);if(!Fc(t))return fn({state:"unlocked",lock:null});try{let n=tC(e);return fn({state:sK(n.pid),lock:n})}catch(n){return fn({state:"invalid",lock:null,error:String(n?.message||n)})}}function aK(e){let t=ls(e);L_e(t.directory);let n={schemaVersion:QT,token:X7(),pid:process.pid,createdAt:new Date().toISOString()},r;try{return r=rE(t.lock,Lr.O_WRONLY|Lr.O_CREAT|Lr.O_EXCL|(Lr.O_NOFOLLOW||0),384),ZT(r,Buffer.from(`${JSON.stringify(n)}
252
252
  `,"utf8")),nE(r),qc(r),r=void 0,YT(t.lock,384),ch(t.directory),n}catch(o){throw r!==void 0&&qc(r),o}}async function F_e(e,t){if(!Number.isSafeInteger(t)||t<0||t>12e4)throw new Ne("lockTimeoutMs out of bounds","LOCK_TIMEOUT_INVALID");let n=Date.now();for(;;)try{return aK(e)}catch(r){if(r?.code!=="EEXIST")throw r;if(Date.now()-n>=t){let o=oE({path:e});throw new Ne(`ledger busy (${o.state} lock); explicit token-bound recovery is required for stale locks`,"LEDGER_BUSY",o)}await P_e(10)}}function nd(e,t){let n=tC(e);if(n.token!==t||n.pid!==process.pid)throw new Ne("lock fencing token no longer owned","LOCK_FENCED");return!0}function cK(e,t){let n=ls(e);nd(e,t),XT(n.lock),ch(n.directory)}function lK({path:e,expectedToken:t}={}){Ae(t,"expectedToken");let n=oE({path:e});if(n.state==="unlocked")throw new Ne("lock is already absent","LOCK_ABSENT");if(n.state==="invalid")throw new Ne("invalid lock is not recoverable automatically","LOCK_INVALID");if(n.lock.token!==t)throw new Ne("lock token mismatch","LOCK_TOKEN_MISMATCH");if(n.state==="active")throw new Ne("active lock owner cannot be recovered","LOCK_ACTIVE");let r=tC(e);if(r.token!==t||sK(r.pid)!=="stale")throw new Ne("lock changed during recovery","LOCK_FENCED");let o=ls(e);return XT(o.lock),ch(o.directory),fn({recovered:!0,token:t})}function q_e(e){return{tenantId:e.tenantId,id:e.id,workflowId:e.workflowId,idempotencyKey:e.idempotencyKey,occurredAt:e.occurredAt,recordedAt:e.recordedAt,type:e.type,external:e.external,evidence:e.evidence,data:e.data}}async function uK(e={}){vt(e,["path","event","lockTimeoutMs","maxBytes"],["path","event"],"appendWorkflowEvent options");let t=ls(e.path).ledger,n=KT(e.event),r=e.lockTimeoutMs??Z7,o=e.maxBytes??rd,i=await F_e(t,r),s=null;try{nd(t,i.token);let a=sh({path:t,maxBytes:o});if(!a.ok)throw new Ne(`append refused until ledger recovery: ${a.reason}`,"LEDGER_CORRUPT",ah(a));let c=a.events.find(A=>A.tenantId===n.tenantId&&A.workflowId===n.workflowId&&A.idempotencyKey===n.idempotencyKey);if(c){if(Ea(q_e(c))!==Ea(n))throw new Ne("idempotency key reused with different payload","IDEMPOTENCY_CONFLICT");return fn({event:c,duplicate:!0})}if(a.events.some(A=>A.id===n.id))throw new Ne("event id already exists","EVENT_ID_CONFLICT");let l=Po(n.tenantId,n.workflowId),u=a.heads.get(l)??null,d=ih({...n,sequence:String(BigInt(u?.sequence??"0")+1n),previousEventHash:u?.eventHash??null}),p=a.events.filter(A=>Po(A.tenantId,A.workflowId)===l);Aa([...p,d]);let f=Buffer.from(`${JSON.stringify(d)}
253
- `,"utf8");if(f.length>eK)throw new Ne("event exceeds size limit","EVENT_SIZE_LIMIT");let m=Buffer.concat([a.raw??Buffer.alloc(0),f]);if(m.length>o)throw new Ne("append would exceed ledger size limit","LEDGER_SIZE_LIMIT");let h=[...a.events,d],y=nK(t,h,m),g=Fc(t);g&&tE(t,"ledger"),nd(t,i.token);let w;try{w=$_e(t),ZT(w,f),nE(w)}finally{w!==void 0&&qc(w)}return YT(t,384),g||ch(J7(t)),nd(t,i.token),rK(t,h,m,y),fn({event:d,duplicate:!1})}catch(a){throw s=a,a}finally{try{cK(t,i.token)}catch(a){if(s===null)throw a}}}function dK({path:e,expectedLastEventHash:t,maxBytes:n=rd}={}){let r=ls(e).ledger,o=aK(r);try{nd(r,o.token);let i=sh({path:r,maxBytes:n,checkCheckpoint:!1});if(!i.ok)throw new Ne(`ledger content is not recoverable: ${i.reason}`,"LEDGER_CORRUPT",ah(i));if(i.events.length===0)throw new Ne("empty ledger has no checkpoint head to recover","LEDGER_EMPTY");if(i.events.at(-1).eventHash!==t)throw new Ne("expected head does not match verified ledger head","RECOVERY_HEAD_MISMATCH");return nd(r,o.token),rK(r,i.events,i.raw),ah(sh({path:r,maxBytes:n}))}finally{cK(r,o.token)}}var rC=Object.freeze({intent:"draft",quote_comparison:"draft",simulation:"draft",prepared:"checked",approval:"approval",signed:"signed",broadcast:"submitted",settlement:"finalized",balance_delta:"compensated",position:"compensated"});function nC(e,t,n){if(typeof e=="string")return e;if(Number.isFinite(Number(e)))return new Date(Number(e)).toISOString();if(t!==void 0)return t;throw new F(`${n} must be supplied explicitly`)}function H_e(e){return{status:"verified",source:"external",reference:`trade-lifecycle:${e.state}:${e.hash}`,observedAt:nC(e.asOf,void 0,"legacy trade event asOf")}}function j_e(e){if(e.state==="signed")return{artifactHash:e.hash,signer:e.evidence?.signer??e.evidence?.from??"legacy-owner-wallet"};if(e.state==="broadcast"){let t=e.evidence?.txHash??e.evidence?.transactionHash;return{transactionHash:typeof t=="string"&&/^0x[a-f0-9]{64}$/.test(t)?t:`0x${e.hash}`,endpoint:e.evidence?.endpoint??e.evidence?.provider??"legacy-broadcast-endpoint"}}return e.evidence&&typeof e.evidence=="object"?e.evidence:{}}function oC(e,t={}){vt(t,["tenantId","runId","intentSpecId","createdAt","updatedAt","metadata"],["tenantId","runId","createdAt"],"bridgeTradeLifecycle options"),Ae(t.tenantId,"bridgeTradeLifecycle.tenantId"),Qm(e);let n=rC[e.state];if(!n)throw new F(`legacy trade state ${String(e.state)} has no compatibility mapping`);let r=nC(t.createdAt,void 0,"bridgeTradeLifecycle.createdAt"),o=nC(t.updatedAt??r,r,"bridgeTradeLifecycle.updatedAt"),i=e.events.filter(s=>s.external===!0).map(s=>({source:"trade-lifecycle-v1",state:s.state,eventHash:s.hash,asOf:s.asOf,evidence:H_e(s),data:j_e(s)}));return ed({tenantId:t.tenantId,id:t.runId,workflowId:e.tradeId,intentSpecId:t.intentSpecId??`${e.tradeId}:intent`,createdAt:r,updatedAt:o,state:n,eventCount:String(e.events.length),headEventHash:e.headHash,externalFacts:i,authority:"projection",sourceKind:"legacy-trade-lifecycle",metadata:{...t.metadata??{},compatibility:{source:"trade-lifecycle-v1",authority:"projection",legacyState:e.state,legacyHeadHash:e.headHash,legacyEventCount:String(e.events.length),mapping:"conservative-v1"}}})}var pK=oC;function z_e(e){return Array.isArray(e)?e.map((t,n)=>typeof t=="function"?{id:t.name||`provider-${n}`,health:t}:t):Object.entries(e||{}).map(([t,n])=>({id:t,health:typeof n=="function"?n:n?.health}))}async function V_e(e,t){let n;try{let r=new Promise((i,s)=>{n=setTimeout(()=>s(Object.assign(new Error(`health timeout after ${t}ms`),{code:"TIMEOUT"})),t)});return{detail:await Promise.race([Promise.resolve().then(()=>e.health()),r]),transportOk:!0}}catch(r){return{error:r?.message||String(r),timedOut:r?.code==="TIMEOUT",transportOk:!1}}finally{clearTimeout(n)}}function iE(e,t,n,r,o=!1){let i=Number(e??t);if(!Number.isFinite(i)||i<r||o&&!Number.isInteger(i)){let s=o?"a positive integer":r===Number.NEGATIVE_INFINITY?"finite":r===0?"a nonnegative finite number":"a positive finite number";throw new TypeError(`${n} must be ${s}`)}return i}async function iC(e,t={}){let n=z_e(e),r=iE(t.concurrency,4,"concurrency",1,!0),o=iE(t.timeoutMs,5e3,"timeoutMs",Number.EPSILON),i=iE(t.asOf,Date.now(),"asOf",Number.NEGATIVE_INFINITY),s=iE(t.ttlMs,6e4,"ttlMs",0),a=new Array(n.length),c=0;async function l(){for(;c<n.length;){let d=c++,p=n[d];if(!p?.id||typeof p.health!="function"){a[d]={id:p?.id??`provider-${d}`,ok:!1,state:"error",stale:!1,asOf:i,ttlMs:s,error:"health function is required"};continue}let f=await V_e(p,o),m=Number(f.detail?.asOf??f.detail?.updatedAt??i),h=f.transportOk&&i-m>s,y=!(f.detail&&typeof f.detail=="object"&&f.detail.ok===!1),g=f.transportOk&&y&&!h;a[d]={id:String(p.id),ok:g,state:f.timedOut?"timeout":!f.transportOk||!y?"error":h?"stale":"fresh",stale:h,asOf:m,checkedAsOf:i,ttlMs:s,...f.detail===void 0?{}:{detail:f.detail},...f.error?{error:f.error}:{}}}}await Promise.all(Array.from({length:Math.min(r,Math.max(1,n.length))},l));let u={fresh:0,stale:0,error:0,timeout:0};for(let d of a)u[d.state]+=1;return{ok:a.every(d=>d.ok),asOf:i,ttlMs:s,timeoutMs:o,counts:u,providers:a}}var W_e=iC,K_e=iC;Nn();import{createHash as G_e}from"node:crypto";var sC=1,AK=/^[a-z0-9][a-z0-9._-]{0,63}$/,vK=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,Y_e=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),X_e=new Set(["sma","ema","rsi","macd","bollinger","atr"]),J_e=new Set(["gt","gte","lt","lte","eq"]),Q_e=new Set(["and","or","not"]),Z_e=new Set(["above","below"]),eNe=new Set(["line","signal","histogram"]),tNe=new Set(["upper","middle","lower"]),aC=new Set(["compare","logic","cross"]),fK=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),mK=new Set(["value","min","max","step"]),cC=new Set(["entryLong","entryShort","exitLong","exitShort"]),hK=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),nNe=new Set(["id","type"]),yK={input:new Set(["id","type","field"]),constant:new Set(["id","type","value"]),indicator:new Set(["id","type","indicator","input","period","fastPeriod","slowPeriod","signalPeriod","stdDev","output"]),compare:new Set(["id","type","op","left","right"]),logic:new Set(["id","type","op","inputs"]),cross:new Set(["id","type","direction","left","right"])},gK=16,bK=128,wK=100,od=class extends Error{constructor(t){let n=t.map(r=>`${r.path}: ${r.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="StrategyValidationError",this.errors=t}};function io(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function _t(e){return typeof e=="number"&&Number.isFinite(e)}function EK(e){return Number.isInteger(e)&&e>0}function uC(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)uC(t);return Object.freeze(e)}for(let t of Object.keys(e))uC(e[t]);return Object.freeze(e)}function dC(e){if(Array.isArray(e))return e.map(dC);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=dC(e[n]);return t}return e}function K(e,t,n){e.push({path:t,message:n})}function va(e,t,n,r){for(let o of Object.keys(e))t.has(o)||K(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function IK(e,t,n,r){if(!_t(e)||!_t(t)||!_t(n)||!_t(r)||r<=0||e<t||e>n)return!1;let o=(e-t)/r;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function lC(e,t,n,r){if(io(e)){if(va(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return K(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return K(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!io(o)||![o.value,o.min,o.max,o.step].every(EK)?(K(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return EK(e)?e:(K(r,t,"must be a positive integer or {param}"),null)}function SK(e,t,n,r){return io(e)?(va(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(K(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(K(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):_t(e)?e:(K(r,t,"must be a finite number or {param}"),null)}function sE(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function rNe(e){let t=new Map,n=r=>{let o=t.get(r)||0;if(o===1)return!0;if(o===2)return!1;t.set(r,1);let i=e.get(r);if(i){for(let s of sE(i))if(e.has(s)&&n(s))return!0}return t.set(r,2),!1};for(let r of e.keys())if(n(r))return!0;return!1}function oNe(e,t){if(!io(e))return K(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>gK)return K(t,"parameters",`too many parameters (max ${gK})`),null;let r={};for(let o of n){if(!AK.test(o)){K(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!io(i)){K(t,s,"must be a plain object");continue}va(i,mK,s,t);for(let d of mK)d in i||K(t,`${s}.${d}`,"required field is missing");let{value:a,min:c,max:l,step:u}=i;_t(c)||K(t,`${s}.min`,"must be a finite number"),_t(l)||K(t,`${s}.max`,"must be a finite number"),(!_t(u)||u<=0)&&K(t,`${s}.step`,"must be a positive finite number"),_t(a)||K(t,`${s}.value`,"must be a finite number"),_t(c)&&_t(l)&&c>l&&K(t,`${s}.min`,"min must be <= max"),_t(a)&&_t(c)&&_t(l)&&_t(u)&&u>0&&(IK(a,c,l,u)||K(t,`${s}.value`,"value must lie on the declared min/max/step grid")),r[o]={value:a,min:c,max:l,step:u}}return r}function iNe(e,t,n,r){let o=`nodes.${t}`;if(!io(e))return K(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!yK[e.type])return K(r,`${o}.type`,"unknown or missing node type"),va(e,nNe,o,r),null;switch(va(e,yK[e.type],o,r),(typeof e.id!="string"||!vK.test(e.id))&&K(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!Y_e.has(e.field))&&K(r,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest|premium|oiDelta|bookImbalance"),{id:e.id,type:"input",field:e.field};case"constant":{let i=SK(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!X_e.has(e.indicator))&&K(r,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,s={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?K(r,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=lC(e.period,`${o}.period`,n,r);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?K(r,`${o}.input`,"must be a node id string"):s.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))K(r,`${o}.period`,"required field is missing");else{let a=lC(e.period,`${o}.period`,n,r);a!=null&&(s.period=a)}if(i==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))K(r,`${o}.${a}`,"required field is missing");else{let c=lC(e[a],`${o}.${a}`,n,r);c!=null&&(s[a]=c)}"output"in e?eNe.has(e.output)?s.output=e.output:K(r,`${o}.output`,"must be line|signal|histogram"):K(r,`${o}.output`,"required field is missing"),"period"in e&&K(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&K(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))K(r,`${o}.stdDev`,"required field is missing");else{let a=SK(e.stdDev,`${o}.stdDev`,n,r);a!=null&&(typeof a=="number"&&a<=0?K(r,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?tNe.has(e.output)?s.output=e.output:K(r,`${o}.output`,"must be upper|middle|lower"):K(r,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&K(r,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&K(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&K(r,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&K(r,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!J_e.has(e.op))&&K(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&K(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&K(r,`${o}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!Q_e.has(e.op))&&K(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return K(r,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let s=0;s<e.inputs.length;s++){let a=e.inputs[s];typeof a!="string"||!a?K(r,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&K(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&K(r,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!Z_e.has(e.direction))&&K(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&K(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&K(r,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function sNe(e,t,n){if(!io(e))return K(t,"risk","must be a plain object"),null;va(e,hK,"risk",t);for(let p of hK)(!(p in e)||e[p]==null)&&K(t,`risk.${p}`,"required field is missing");let r={},o=e.maxLeverage;!_t(o)||o<=0||o>50?K(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!_t(i)||i<=0?K(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let s=e.positionSizePct;!_t(s)||s<=0||s>100?K(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=s;let a=e.stopLossPct;!_t(a)||a<=0||a>100?K(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=a;let c=e.takeProfitPct;!_t(c)||c<=0||c>1e3?K(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let l=e.cooldownBars;!Number.isInteger(l)||l<0||l>1e5?K(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=l;let u=e.maxDailyLossPct;!_t(u)||u<=0||u>100?K(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=u;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?K(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&K(t,"risk.expiresAt","must be strictly greater than nowMs"):K(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function aNe(e,t={}){let n=[];if(!io(e))return K(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};va(e,fK,"",n);for(let d of fK)(!(d in e)||e[d]==null)&&K(n,d,"required field is missing");e.version!==sC&&K(n,"version",`must be ${sC}`),(typeof e.id!="string"||!AK.test(e.id))&&K(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>wK)&&K(n,"name",`must be a non-empty string max ${wK}`);let r=aE(e.venue);r||K(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)io(e.market)||K(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))K(n,"market",`venue ${r.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let p of d.errors)K(n,p.path,p.message)}let i=oNe(e.parameters,n),s=null,a=new Map;if(!Array.isArray(e.nodes))K(n,"nodes","must be an array");else if(e.nodes.length>bK)K(n,"nodes",`too many nodes (max ${bK})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=iNe(e.nodes[d],d,i||{},n);p&&(typeof p.id=="string"&&vK.test(p.id)&&(a.has(p.id)?K(n,`nodes.${d}.id`,`duplicate node id "${p.id}"`):a.set(p.id,p)),s.push(p))}for(let d=0;d<s.length;d++){let p=s[d],f=`nodes.${d}`;for(let m of sE(p))a.has(m)||K(n,f,`unknown node ref "${m}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let m of sE(p)){let h=a.get(m);h&&aC.has(h.type)&&K(n,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of sE(p)){let h=a.get(m);h&&!aC.has(h.type)&&K(n,f,`node ref "${m}" must be boolean`)}}rNe(a)&&K(n,"nodes","graph contains a cycle")}let c=null;if(!io(e.rules))K(n,"rules","must be a plain object");else{va(e.rules,cC,"rules",n);for(let d of cC)d in e.rules||K(n,`rules.${d}`,"required field is missing");c={};for(let d of cC){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){K(n,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!a.has(p)){K(n,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let f=a.get(p);aC.has(f.type)||K(n,`rules.${d}`,`rule must reference a boolean node, not ${f.type}`),c[d]=p}}let l=sNe(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=uC({version:sC,id:e.id,name:e.name,venue:r.id,market:o,parameters:i,nodes:s,rules:c,risk:l});return{ok:!0,errors:[],strategy:u}}function us(e,t={}){let n=aNe(e,t);if(!n.ok)throw new od(n.errors);return n.strategy}function cNe(e){let t=us(e);return JSON.stringify(dC(t))}function pC(e){let t=cNe(e);return G_e("sha256").update(t,"utf8").digest("hex")}function xK(e,t){if(!io(e))throw new od([{path:"",message:"strategy must be a plain object"}]);if(!io(t))throw new od([{path:"overrides",message:"must be a plain object"}]);let n=us(e),r={};for(let[i,s]of Object.entries(n.parameters))r[i]={value:s.value,min:s.min,max:s.max,step:s.step};let o=[];for(let[i,s]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(r,i)){K(o,i,`unknown parameter "${i}"`);continue}let a=r[i];if(!_t(s)){K(o,i,"override must be a finite number");continue}if(!IK(s,a.min,a.max,a.step)){K(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...a,value:s}}if(o.length)throw new od(o);return us({version:n.version,id:n.id,name:n.name,venue:n.venue,market:{coin:n.market.coin,interval:n.market.interval},parameters:r,nodes:n.nodes.map(i=>{let s={...i};return Array.isArray(i.inputs)&&(s.inputs=[...i.inputs]),s}),rules:{...n.rules},risk:{...n.risk}})}function lh(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(typeof n!="number"||!Number.isFinite(n))throw new TypeError(`values[${t}] must be a finite number`)}}function Ia(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function lNe(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(n==null||typeof n!="object")throw new TypeError(`bars[${t}] must be an object`);for(let r of["o","h","l","c"]){let o=n[r];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${r} must be a finite number`)}if(n.h<n.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function OK(e,t){lh(e),Ia(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let o=0;o<e.length;o++)r+=e[o],o>=t&&(r-=e[o-t]),o>=t-1&&(n[o]=r/t);return n}function cE(e,t){lh(e),Ia(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let s=0;s<t;s++)r+=e[s];let o=r/t;n[t-1]=o;let i=2/(t+1);for(let s=t;s<e.length;s++)o=i*e[s]+(1-i)*o,n[s]=o;return n}function _K(e,t){lh(e),Ia(t);let n=new Array(e.length).fill(null);if(e.length<=t)return n;let r=0,o=0;for(let a=1;a<=t;a++){let c=e[a]-e[a-1];c>=0?r+=c:o-=c}let i=r/t,s=o/t;n[t]=kK(i,s);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],l=c>0?c:0,u=c<0?-c:0;i=(i*(t-1)+l)/t,s=(s*(t-1)+u)/t,n[a]=kK(i,s)}return n}function kK(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function NK(e,t={}){lh(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(Ia(n),Ia(r),Ia(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=cE(e,n),s=cE(e,r),a=new Array(e.length).fill(null);for(let d=0;d<e.length;d++)i[d]!=null&&s[d]!=null&&(a[d]=i[d]-s[d]);let c=new Array(e.length).fill(null),l=new Array(e.length).fill(null),u=[];for(let d=0;d<a.length;d++)a[d]!=null&&u.push(d);if(u.length>=o){let d=0;for(let h=0;h<o;h++)d+=a[u[h]];let p=d/o,f=u[o-1];c[f]=p,l[f]=a[f]-p;let m=2/(o+1);for(let h=o;h<u.length;h++){let y=u[h];p=m*a[y]+(1-m)*p,c[y]=p,l[y]=a[y]-p}}return{line:a,signal:c,histogram:l}}function TK(e,t={}){lh(e);let n=t.period,r=t.stdDev;if(Ia(n),typeof r!="number"||!Number.isFinite(r)||r<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),s=new Array(e.length).fill(null);if(e.length<n)return{upper:i,middle:o,lower:s};let a=0,c=0;for(let l=0;l<e.length;l++){let u=e[l];if(a+=u,c+=u*u,l>=n){let d=e[l-n];a-=d,c-=d*d}if(l>=n-1){let d=a/n,p=c/n-d*d;p<0&&p>-1e-12&&(p=0);let f=Math.sqrt(p);o[l]=d,i[l]=d+r*f,s[l]=d-r*f}}return{upper:i,middle:o,lower:s}}function CK(e,t){lNe(e),Ia(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=new Array(e.length);for(let s=0;s<e.length;s++){let a=e[s];if(s===0)r[s]=a.h-a.l;else{let c=e[s-1].c;r[s]=Math.max(a.h-a.l,Math.abs(a.h-c),Math.abs(a.l-c))}}let o=0;for(let s=0;s<t;s++)o+=r[s];let i=o/t;n[t-1]=i;for(let s=t;s<e.length;s++)i=(i*(t-1)+r[s])/t,n[s]=i;return n}import{createHash as uNe}from"node:crypto";var fC=3,dNe="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",pNe="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",fNe="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",RK=uNe("sha256").update(JSON.stringify({version:fC,compilerSourceHash:dNe,indicatorsSourceHash:pNe,schemaSourceHash:fNe})).digest("hex");var lE=fC,mC=RK,mNe=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),hNe=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5});function $r(e){return typeof e=="number"&&Number.isFinite(e)}function yNe(e){let t=new Map(e.map(a=>[a.id,a])),n=a=>{switch(a.type){case"indicator":return a.input?[a.input]:[];case"compare":case"cross":return[a.left,a.right];case"logic":return[...a.inputs];default:return[]}},r=new Map,o=new Map;for(let a of e)r.set(a.id,0),o.set(a.id,[]);for(let a of e)for(let c of n(a))t.has(c)&&(o.get(c).push(a.id),r.set(a.id,r.get(a.id)+1));let i=[];for(let[a,c]of r)c===0&&i.push(a);let s=[];for(;i.length;){let a=i.shift();s.push(a);for(let c of o.get(a))r.set(c,r.get(c)-1),r.get(c)===0&&i.push(c)}if(s.length!==e.length)throw new Error("strategy graph is cyclic");return s}function id(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function gNe(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let r=null;for(let o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:s,o:a,h:c,l,c:u,v:d}=i;if(!$r(s)&&(typeof s=="number"&&Number.isFinite(s)),!Number.isFinite(s))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,f]of[["o",a],["h",c],["l",l],["c",u],["v",d]])if(!$r(f))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,f]of[["o",a],["h",c],["l",l],["c",u]])if(!(f>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(d<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(a,u,l))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(l>Math.min(a,u,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(r!=null){if(!(s>r))throw new TypeError("bars t must be strictly increasing");if(s-r!==hNe[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=s,"fundingRate"in i&&i.fundingRate!=null&&!$r(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!$r(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}for(let p of["premium","oiDelta"])if(p in i&&i[p]!=null&&!$r(i[p]))throw new TypeError(`bars[${o}].${p} must be finite when present`);if("bookImbalance"in i&&i.bookImbalance!=null){if(!$r(i.bookImbalance))throw new TypeError(`bars[${o}].bookImbalance must be finite when present`);if(i.bookImbalance<-1||i.bookImbalance>1)throw new TypeError(`bars[${o}].bookImbalance must be within [-1, 1]`)}}}function Hc(e,t,n,r,o,i){if(i.has(e))return i.get(e);let s=t.get(e),a;switch(s.type){case"input":{let c=mNe[s.field];a=new Array(o+1);for(let l=0;l<=o;l++){let u=r[l][c];a[l]=u===void 0?null:u}break}case"constant":{let c=id(s.value,n);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?id(s.period,n):void 0;if(s.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let f=r[p];d.push({o:f.o,h:f.h,l:f.l,c:f.c})}a=CK(d,c);break}let u=Hc(s.input,t,n,r,o,i).map((d,p)=>{if(d==null||!$r(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return d});if(s.indicator==="sma")a=OK(u,c);else if(s.indicator==="ema")a=cE(u,c);else if(s.indicator==="rsi")a=_K(u,c);else if(s.indicator==="macd")a=NK(u,{fastPeriod:id(s.fastPeriod,n),slowPeriod:id(s.slowPeriod,n),signalPeriod:id(s.signalPeriod,n)})[s.output];else if(s.indicator==="bollinger")a=TK(u,{period:c,stdDev:id(s.stdDev,n)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=Hc(s.left,t,n,r,o,i),l=Hc(s.right,t,n,r,o,i);a=new Array(o+1);for(let u=0;u<=o;u++){let d=c[u],p=l[u];if(d==null||p==null||!$r(d)||!$r(p)){a[u]=!1;continue}switch(s.op){case"gt":a[u]=d>p;break;case"gte":a[u]=d>=p;break;case"lt":a[u]=d<p;break;case"lte":a[u]=d<=p;break;case"eq":a[u]=d===p;break;default:a[u]=!1}}break}case"logic":{let c=s.inputs.map(l=>Hc(l,t,n,r,o,i));a=new Array(o+1);for(let l=0;l<=o;l++)if(s.op==="not"){let u=c[0][l];a[l]=u===!0?!1:u===!1}else if(s.op==="and"){let u=!0;for(let d of c)if(d[l]!==!0){u=!1;break}a[l]=u}else if(s.op==="or"){let u=!1;for(let d of c)if(d[l]===!0){u=!0;break}a[l]=u}else a[l]=!1;break}case"cross":{let c=Hc(s.left,t,n,r,o,i),l=Hc(s.right,t,n,r,o,i);a=new Array(o+1),a[0]=!1;for(let u=1;u<=o;u++){let d=c[u-1],p=l[u-1],f=c[u],m=l[u];if(d==null||p==null||f==null||m==null||!$r(d)||!$r(p)||!$r(f)||!$r(m)){a[u]=!1;continue}s.direction==="above"?a[u]=d<=p&&f>m:a[u]=d>=p&&f<m}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function hC(e,t={}){let n=us(e);t&&Object.keys(t).length&&(n=xK(n,t));let r=new Map(n.nodes.map(f=>[f.id,f])),o=Object.freeze(yNe(n.nodes)),i=n.parameters,s=new Set(n.nodes.filter(f=>f.type==="input").map(f=>f.field));if(n.nodes.some(f=>f.type==="indicator"&&f.indicator==="atr"))for(let f of["open","high","low","close"])s.add(f);let a=Object.freeze([...s].sort()),c=pC(n);function l(f,m){let h={};for(let g of o){let w=f.get(g);h[g]=w[m]}let y=g=>g!=null&&h[g]===!0;return{values:h,signals:{entryLong:y(n.rules.entryLong),entryShort:y(n.rules.entryShort),exitLong:y(n.rules.exitLong),exitShort:y(n.rules.exitShort)}}}function u(f,m){gNe(f,m,n.market.interval);let h=new Map;for(let y of o)Hc(y,r,i,f,m,h);return h}function d(f,m){return l(u(f,m),m)}function p(f){if(!Array.isArray(f)||f.length===0)throw new TypeError("bars must be a non-empty array");let m=f.length-1,h=u(f,m);return Object.freeze(f.map((y,g)=>Object.freeze(l(h,g))))}return Object.freeze({strategy:n,strategyHash:c,compilerVersion:lE,compilerHash:mC,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}import{createHash as bNe}from"node:crypto";var oze=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});var ize=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"]);var wNe=Object.freeze(["fail","pass_paper_only","pass_live_eligible"]);function xa(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function uh(e){return typeof e=="number"&&Number.isFinite(e)}function sd(e){if(Array.isArray(e))return e.map(sd);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=sd(e[n]);return t}return e}function PK(e){if(!xa(e))throw new TypeError("evidence artifact must be a plain object");if(!wNe.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!xa(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!xa(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!xa(e.train)||!xa(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return sd({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>sd(t)),holdout:e.holdout??null,split:e.split,status:e.status,strategyHash:e.strategyHash,train:e.train??null,walkForward:{passRate:e.walkForward.passRate,windowsRun:e.walkForward.windowsRun??e.walkForward.windows.length,windows:e.walkForward.windows.map(t=>({index:t.index,trainStartIndex:t.trainStartIndex,trainEndIndex:t.trainEndIndex,passed:t.passed,reason:t.reason,evalStartIndex:t.evalStartIndex,evalEndIndex:t.evalEndIndex,metrics:t.metrics}))}})}function ENe(e){return bNe("sha256").update(JSON.stringify(PK(e)),"utf8").digest("hex")}function Lo(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function yC(e,t){if(!xa(e)||!xa(e.metrics))throw new Error(`${t} metrics required`);let n=Lo(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==n)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let r of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!uh(e.metrics[r]))throw new Error(`${t}.metrics.${r} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function SNe(e,{maxDailyLossPct:t}={}){let n=e.split,r=Lo(n.trainStartIndex,"split.trainStartIndex"),o=Lo(n.trainEndIndex,"split.trainEndIndex"),i=Lo(n.trainBarCount,"split.trainBarCount",1),s=Lo(n.holdoutStartIndex,"split.holdoutStartIndex"),a=Lo(n.holdoutEndIndex,"split.holdoutEndIndex"),c=Lo(n.holdoutBarCount,"split.holdoutBarCount",1);if(r!==0||o-r+1!==i||s!==o+1||a-s+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!uh(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");yC(e.train,"train");let l=yC(e.holdout,"holdout");if(l.tradeCount<1||l.netPnlUsd<=0||l.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(uh(t)&&l.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let u=e.walkForward,d=u.windows;if(d.length<1||u.windowsRun!==d.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,f=-1;for(let h=0;h<d.length;h++){let y=d[h];if(!xa(y)||y.index!==h||typeof y.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let g=Lo(y.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),w=Lo(y.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),A=Lo(y.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),E=Lo(y.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(g!==0||w>=A||A>E||A<=f)throw new Error("walk-forward windows must be chronological and disjoint");if(f=E,y.passed){if(p+=1,y.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let b=yC({metrics:y.metrics,tradeCount:y.metrics?.tradeCount},`walkForward.windows[${h}]`);if(b.tradeCount<1||b.netPnlUsd<=0||b.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(uh(t)&&b.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(y.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let m=p/d.length;if(!uh(u.passRate)||Math.abs(u.passRate-m)>Number.EPSILON||m<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function LK(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let n=PK(e),r=sd({id:e.id,...n});if(JSON.stringify(sd(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=ENe(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&SNe(e,t),e}de();var ANe=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];function dh(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function vNe(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function bC(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>bC(n,`${t}[${r}]`));return}if(dh(e))for(let[n,r]of Object.entries(e)){let o=vNe(n);if(ANe.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);bC(r,`${t}.${n}`)}}function gC(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function $K({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(bC({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!dh(e))throw new Error("handoff: strategy required");if(!dh(t))throw new Error("handoff: evidence required");if(!dh(n))throw new Error("handoff: shadow required");if(!dh(r))throw new Error("handoff: caps required");if(typeof n.id!="string"||!n.id.trim())throw new Error("handoff: shadow.id required");if(typeof n.stateHash!="string"||!/^[0-9a-f]{64}$/.test(n.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(n.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(n.cursor)||n.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(n.updatedAt)||n.updatedAt<=0||n.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let s=us(e,{nowMs:o}),a=hC(s);if(LK(t,{maxDailyLossPct:s.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==a.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==a.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let p of c)if(!(p in r)||r[p]==null)throw new Error(`handoff: caps.${p} required`);if(!gC(r.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(r.perStrategyNotionalUsd>a.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!gC(r.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(r.maxLeverage>a.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!gC(r.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let l=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(r.dailyLossCapUsd>l)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(r.chainAllowlist)||r.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!r.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!r.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(r.assetAllowlist)||r.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(r.assetAllowlist.length!==1||r.assetAllowlist[0]!==a.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(r.expiresAt)||!(r.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(r.expiresAt>a.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(r.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let u={perStrategyNotionalUsd:r.perStrategyNotionalUsd,maxLeverage:r.maxLeverage,dailyLossCapUsd:r.dailyLossCapUsd,chainAllowlist:[...r.chainAllowlist],assetAllowlist:[...r.assetAllowlist],expiresAt:r.expiresAt,killSwitchRequired:!0},d={strategyHash:a.strategyHash,compilerHash:a.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:n.id,stateHash:n.stateHash,status:n.status,cursor:n.cursor,updatedAt:n.updatedAt},compiled:{strategyHash:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:lE,venue:"hyperliquid",market:{coin:a.strategy.market.coin,kind:"perp",interval:a.strategy.market.interval},risk:{...a.strategy.risk},strategy:JSON.parse(JSON.stringify(a.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:u},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return j(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}Nn();var INe=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5});function ad(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function cd(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function ph(e){if(Array.isArray(e))for(let t of e)ph(t);else if(e&&typeof e=="object")for(let t of Object.values(e))ph(t);return Object.freeze(e)}function xNe(e){let t=INe[e];if(!t)throw new TypeError(`unsupported strategy interval: ${e}`);return t}function kNe(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");cd(t,"endTime");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${r}] must be an object`);let i=cd(Number(o.t),`candles[${r}].t`);if(cd(Number(o.T),`candles[${r}].T`)>t)continue;let a={t:i,o:ad(o.o,`candles[${r}].o`),h:ad(o.h,`candles[${r}].h`),l:ad(o.l,`candles[${r}].l`),c:ad(o.c,`candles[${r}].c`),v:ad(o.v,`candles[${r}].v`)};if(a.h<Math.max(a.o,a.c,a.l))throw new TypeError(`candles[${r}].h is below another price`);if(a.l>Math.min(a.o,a.c,a.h))throw new TypeError(`candles[${r}].l is above another price`);if(a.v<0)throw new TypeError(`candles[${r}].v must be non-negative`);let c=n.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||n.set(i,a)}return ph([...n.values()].sort((r,o)=>r.t-o.t))}function ONe(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${r}] must be an object`);let i=cd(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:ad(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function _Ne({coin:e,startTime:t,endTime:n},r){let o=[],i=Math.max(0,t-288e5),s=!1;for(let a=0;a<16&&i<=n;a++){let c=await Ly({coin:e,startTime:i,endTime:n},r);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let l=i;for(let u of c){let d=Number(u?.time);Number.isSafeInteger(d)&&d>l&&(l=d)}if(c.length<500||l>=n){s=!0;break}if(l<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=l+1}if(!s)throw new Error("strategy history exceeds the bounded funding history limit");return ONe(o,n)}function NNe(e,t,n){let r=0,o=null;return e.map(i=>{let s=i.t+n,a=0;for(;r<t.length&&t[r].time<s;){let c=t[r];o=c.fundingRate,c.time>=i.t&&(a+=c.fundingRate),r+=1}return o==null?{...i,fundingPaymentRate:a}:{...i,fundingRate:o,fundingPaymentRate:a}})}async function MK(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let n=String(e.coin||"").trim().toUpperCase();if(!/^[A-Z0-9][A-Z0-9._-]{0,11}$/.test(n))throw new TypeError("coin must be an uppercase Hyperliquid asset id");let r=String(e.interval||"15m"),o=xNe(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=cd(e.endTime,"endTime"),s=e.count==null?1500:e.count;if(!Number.isInteger(s)||s<20||s>5e3)throw new TypeError("count must be an integer from 20 to 5000");let a=e.startTime==null?Math.max(0,i-s*o):cd(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,l]=await Promise.all([Sl({coin:n,interval:r,startTime:a,endTime:i},t),_Ne({coin:n,startTime:a,endTime:i},t)]),u=kNe(c,{endTime:i}),d=ph(NNe(u,l,o));return ph({coin:n,interval:r,range:{startTime:a,endTime:i},bars:d})}var TNe=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),CNe=new Set(["coin","interval"]);function RNe(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let n of Object.keys(e))CNe.has(n)||t.push({path:`market.${n}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!TNe.has(e.interval))&&t.push({path:"market.interval",message:"must be a supported interval"}),t.length?{ok:!1,errors:t,market:null}:{ok:!0,errors:[],market:{coin:e.coin,interval:e.interval}}}async function PNe(e={}){let t=await Py(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((n,r)=>{if(!n||typeof n.name!="string"||!n.name)throw new TypeError(`Hyperliquid market metadata universe[${r}].name is invalid`);return n.name}))}var DK=Object.freeze({id:"hyperliquid",validateMarket:RNe,fetchBars:MK,listMarkets:PNe,prepareIntent(e){return $K(e)}});var LNe=Object.freeze(["id","validateMarket","prepareIntent"]);function $Ne(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy venue adapter must be an object");if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id))throw new TypeError("strategy venue adapter id is malformed");for(let t of LNe.slice(1))if(typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} requires ${t}()`);for(let t of["fetchBars","listMarkets"])if(e[t]!=null&&typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} ${t} must be a function`);return e}var BK=[DK].map($Ne),MNe=new Map(BK.map(e=>[e.id,e])),DNe=Object.freeze([...BK]);function aE(e){return typeof e!="string"?null:MNe.get(e)??null}function BNe(e){let t=aE(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var uE=Object.freeze(["price","wallet","risk","execution","security","nft","governance","system"]),UNe=new Set(uE);function dE(e){if(!UNe.has(e))throw new TypeError(`Unknown watch category: ${String(e)}`);return e}function wC(e={}){let t=e.subscribedCategories??[];if(!Array.isArray(t))throw new TypeError("subscribedCategories must be an array");return t}function UK(){return{subscribedCategories:[]}}function FNe(e,t){dE(t);let n=wC(e);return n.includes(t)?{...e,subscribedCategories:[...n]}:{...e,subscribedCategories:[...n,t]}}function qNe(e,t){dE(t);let n=wC(e);return{...e,subscribedCategories:n.filter(r=>r!==t)}}function HNe({category:e,notify:t=!1,...n}={}){if(dE(e),typeof t!="boolean")throw new TypeError("watch notify must be a boolean");return{...n,category:e,notify:t}}function jNe(e,t){return!(!t||t.notify!==!0||t.category!==e.category||e.watchId!==void 0&&t.id!==e.watchId)}function pE(e,t=UK(),n){if(!e||typeof e!="object")throw new TypeError("alert must be an object");return dE(e.category),wC(t).includes(e.category)?{deliver:!0,reason:"category-subscribed"}:jNe(e,n)?{deliver:!0,reason:"watch-opt-in"}:{deliver:!1,reason:"not-subscribed"}}function zNe(e,t,n){return pE(e,t,n).deliver}var FK=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),VNe=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),xn=(e,t=0,n=1)=>Math.min(n,Math.max(t,e)),ar=e=>Number.isFinite(Number(e))?Number(e):null,fE=e=>Math.round(e*1e4)/1e4;function qK(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return VNe[t]??t}function WNe(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${qK(e)}:${t}`)}function so(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:fE(n)})}function KNe(e,t){let n=ar(e.repeatBuys??e.repeat_buys??e.buyCount),r=ar(e.walletWinRate??e.winRate);so(t,"repeat_buys",n===null?null:xn((n-1)/4)*.38),so(t,"wallet_win_rate",r===null?null:(xn(r)-.5)*.5)}function GNe(e,t){let n=ar(e.ageHours??e.poolAgeHours),r=ar(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;so(t,"pool_age",n===null?null:n<24?-.42:xn(n/720)*.12),so(t,"liquidity",r===null?null:(xn(Math.log10(Math.max(1,r))/7)-.5)*.28),so(t,"liquidity_lock",o==null?null:o?.12:-.28)}function YNe(e,t){let n=ar(e.floorChange??e.floorChangePct),r=ar(e.sales??e.saleCount);so(t,"floor_change",n===null?null:xn(n,-1,1)*.35),so(t,"sales_depth",r===null?null:xn(r/50)*.18)}function XNe(e,t){let n=ar(e.flowImbalance??e.imbalance),r=ar(e.fundingRate??e.funding);so(t,"flow_imbalance",n===null?null:xn(n,-1,1)*.42),so(t,"funding",r===null?null:-xn(r*100,-1,1)*.12)}function JNe(e,t){let n=ar(e.marketProbability??e.marketPrice??e.probability),r=ar(e.fairProbability??e.referenceProbability??e.fairValue);so(t,"probability_mispricing",n===null||r===null?null:xn(r-n,-1,1)*.65);let o=ar(e.liquidityUsd??e.liquidity);so(t,"market_liquidity",o===null?null:xn(Math.log10(Math.max(1,o))/6)*.12)}var QNe=Object.freeze({wallet:KNe,pool:GNe,nft_floor:YNe,hl_flow:XNe,prediction_market:JNe});function ZNe(e,t,n){let r=n.filter(i=>{let s=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return s!=null&&String(s)===t});if(r.length===0)return null;let o=r.map(i=>ar(i.return??i.markout??i.pnl??i.value)).filter(i=>i!==null);return o.length===0?null:o.reduce((i,s)=>i+s,0)/o.length}function EC(e=[],t=[],n={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let r=xn(ar(n.minimumCoverage)??.5);return e.map((o,i)=>{let s=qK(o),a=WNe(o,i),c=QNe[s],l=[];c&&c(o,l);let u=s==="wallet"?2:s==="pool"?3:2,d=fE(xn(l.length/u)),p=l.reduce((A,E)=>A+E.value,0),f=ZNe(o,a,t),m=f===null?0:xn(f,-1,1)*.35;f!==null&&so(l,"shadow_markout",m);let h=fE(xn(.5+p+m)),y=f===null?.8:xn(.85+f*.3,.35,1),g=fE(xn(d*y)),w=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||w.push("UNSUPPORTED_SIGNAL_TYPE"),d<r&&w.push("LOW_COVERAGE","NO_TRADE"),g<.5&&w.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(ar(o.ageHours??o.poolAgeHours)??1/0)<24&&w.push("NEW_POOL_RISK","NO_TRADE"),f!==null&&f<0&&w.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:h,confidence:g,coverage:d,contributions:l,flags:[...new Set(w)],noTrade:w.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}function HK(e={}){return Object.freeze({score(t,n=[],r={}){return EC(t,n,{...e,...r})}})}var mE=Object.freeze(["draft","shadow","confirm","armed","autonomous","halted"]),eTe=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}))),tTe=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}))),nTe=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}))),ld=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}))),rTe=[["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"]],ud=Object.freeze(rTe.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),oTe=[["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"]],fh=Object.freeze(oTe.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),iTe=Object.freeze({autonomousOptIn:!1,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:100,maxDailyLossUsd:10,chainAllowlist:Object.freeze(["ethereum"]),expiresAt:41024448e5});function jc({id:e,name:t,scannerName:n,scannerTool:r,scannerSkill:o,scannerArtifact:i,chainAllowlist:s}){return Object.freeze({id:e,name:t,mode:"draft",agents:Object.freeze([Object.freeze({id:"scanner",name:n,role:"scanner",runtime:"deterministic",soul:"Collect bounded public evidence with source times.",toolIds:Object.freeze([r]),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({...iTe,chainAllowlist:Object.freeze(s)})})}var jK=Object.freeze([jc({id:"hyperliquid-alpha",name:"Hyperliquid Alpha",scannerName:"Market Scanner",scannerTool:"market.scan",scannerSkill:"hyperliquid-markets",scannerArtifact:"market-evidence",chainAllowlist:["hyperliquid"]}),jc({id:"perp-market-breadth",name:"Perp Market Breadth",scannerName:"Breadth Scanner",scannerTool:"market.breadth",scannerSkill:"crypto-market-breadth",scannerArtifact:"breadth-evidence",chainAllowlist:["hyperliquid"]}),jc({id:"perp-technical-strategy",name:"Perp Technical Strategy",scannerName:"Perp Technical Scanner",scannerTool:"perp.indicators",scannerSkill:"perp-technical-analysis",scannerArtifact:"technical-evidence",chainAllowlist:["hyperliquid"]}),jc({id:"basket-relative-value",name:"Basket Relative Value",scannerName:"Basket Constructor",scannerTool:"basket.construct",scannerSkill:"basket-trading",scannerArtifact:"basket-evidence",chainAllowlist:["hyperliquid"]}),jc({id:"wallet-watch",name:"Wallet Watch",scannerName:"Wallet Monitor",scannerTool:"wallet.watch",scannerSkill:"wallet-monitoring",scannerArtifact:"wallet-flow",chainAllowlist:["ethereum","base"]}),jc({id:"evm-launch-radar",name:"EVM Launch Radar",scannerName:"Launch Scanner",scannerTool:"contract.read",scannerSkill:"contract-research",scannerArtifact:"contract-evidence",chainAllowlist:["ethereum","base","arbitrum"]}),jc({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 STe}from"node:crypto";import{randomBytes as sTe}from"node:crypto";var aTe=/^ses-[0-9a-f]{32}$/,cTe=/^(?:sign|broadcast|execute|transaction\.execute|wallet\.sign)$/i,lTe=/sign|broadcast|execute/i,uTe="team-history-truncated",zK=`
253
+ `,"utf8");if(f.length>eK)throw new Ne("event exceeds size limit","EVENT_SIZE_LIMIT");let m=Buffer.concat([a.raw??Buffer.alloc(0),f]);if(m.length>o)throw new Ne("append would exceed ledger size limit","LEDGER_SIZE_LIMIT");let h=[...a.events,d],y=nK(t,h,m),g=Fc(t);g&&tE(t,"ledger"),nd(t,i.token);let w;try{w=$_e(t),ZT(w,f),nE(w)}finally{w!==void 0&&qc(w)}return YT(t,384),g||ch(J7(t)),nd(t,i.token),rK(t,h,m,y),fn({event:d,duplicate:!1})}catch(a){throw s=a,a}finally{try{cK(t,i.token)}catch(a){if(s===null)throw a}}}function dK({path:e,expectedLastEventHash:t,maxBytes:n=rd}={}){let r=ls(e).ledger,o=aK(r);try{nd(r,o.token);let i=sh({path:r,maxBytes:n,checkCheckpoint:!1});if(!i.ok)throw new Ne(`ledger content is not recoverable: ${i.reason}`,"LEDGER_CORRUPT",ah(i));if(i.events.length===0)throw new Ne("empty ledger has no checkpoint head to recover","LEDGER_EMPTY");if(i.events.at(-1).eventHash!==t)throw new Ne("expected head does not match verified ledger head","RECOVERY_HEAD_MISMATCH");return nd(r,o.token),rK(r,i.events,i.raw),ah(sh({path:r,maxBytes:n}))}finally{cK(r,o.token)}}var rC=Object.freeze({intent:"draft",quote_comparison:"draft",simulation:"draft",prepared:"checked",approval:"approval",signed:"signed",broadcast:"submitted",settlement:"finalized",balance_delta:"compensated",position:"compensated"});function nC(e,t,n){if(typeof e=="string")return e;if(Number.isFinite(Number(e)))return new Date(Number(e)).toISOString();if(t!==void 0)return t;throw new F(`${n} must be supplied explicitly`)}function H_e(e){return{status:"verified",source:"external",reference:`trade-lifecycle:${e.state}:${e.hash}`,observedAt:nC(e.asOf,void 0,"legacy trade event asOf")}}function j_e(e){if(e.state==="signed")return{artifactHash:e.hash,signer:e.evidence?.signer??e.evidence?.from??"legacy-owner-wallet"};if(e.state==="broadcast"){let t=e.evidence?.txHash??e.evidence?.transactionHash;return{transactionHash:typeof t=="string"&&/^0x[a-f0-9]{64}$/.test(t)?t:`0x${e.hash}`,endpoint:e.evidence?.endpoint??e.evidence?.provider??"legacy-broadcast-endpoint"}}return e.evidence&&typeof e.evidence=="object"?e.evidence:{}}function oC(e,t={}){vt(t,["tenantId","runId","intentSpecId","createdAt","updatedAt","metadata"],["tenantId","runId","createdAt"],"bridgeTradeLifecycle options"),Ae(t.tenantId,"bridgeTradeLifecycle.tenantId"),Qm(e);let n=rC[e.state];if(!n)throw new F(`legacy trade state ${String(e.state)} has no compatibility mapping`);let r=nC(t.createdAt,void 0,"bridgeTradeLifecycle.createdAt"),o=nC(t.updatedAt??r,r,"bridgeTradeLifecycle.updatedAt"),i=e.events.filter(s=>s.external===!0).map(s=>({source:"trade-lifecycle-v1",state:s.state,eventHash:s.hash,asOf:s.asOf,evidence:H_e(s),data:j_e(s)}));return ed({tenantId:t.tenantId,id:t.runId,workflowId:e.tradeId,intentSpecId:t.intentSpecId??`${e.tradeId}:intent`,createdAt:r,updatedAt:o,state:n,eventCount:String(e.events.length),headEventHash:e.headHash,externalFacts:i,authority:"projection",sourceKind:"legacy-trade-lifecycle",metadata:{...t.metadata??{},compatibility:{source:"trade-lifecycle-v1",authority:"projection",legacyState:e.state,legacyHeadHash:e.headHash,legacyEventCount:String(e.events.length),mapping:"conservative-v1"}}})}var pK=oC;function z_e(e){return Array.isArray(e)?e.map((t,n)=>typeof t=="function"?{id:t.name||`provider-${n}`,health:t}:t):Object.entries(e||{}).map(([t,n])=>({id:t,health:typeof n=="function"?n:n?.health}))}async function V_e(e,t){let n;try{let r=new Promise((i,s)=>{n=setTimeout(()=>s(Object.assign(new Error(`health timeout after ${t}ms`),{code:"TIMEOUT"})),t)});return{detail:await Promise.race([Promise.resolve().then(()=>e.health()),r]),transportOk:!0}}catch(r){return{error:r?.message||String(r),timedOut:r?.code==="TIMEOUT",transportOk:!1}}finally{clearTimeout(n)}}function iE(e,t,n,r,o=!1){let i=Number(e??t);if(!Number.isFinite(i)||i<r||o&&!Number.isInteger(i)){let s=o?"a positive integer":r===Number.NEGATIVE_INFINITY?"finite":r===0?"a nonnegative finite number":"a positive finite number";throw new TypeError(`${n} must be ${s}`)}return i}async function iC(e,t={}){let n=z_e(e),r=iE(t.concurrency,4,"concurrency",1,!0),o=iE(t.timeoutMs,5e3,"timeoutMs",Number.EPSILON),i=iE(t.asOf,Date.now(),"asOf",Number.NEGATIVE_INFINITY),s=iE(t.ttlMs,6e4,"ttlMs",0),a=new Array(n.length),c=0;async function l(){for(;c<n.length;){let d=c++,p=n[d];if(!p?.id||typeof p.health!="function"){a[d]={id:p?.id??`provider-${d}`,ok:!1,state:"error",stale:!1,asOf:i,ttlMs:s,error:"health function is required"};continue}let f=await V_e(p,o),m=Number(f.detail?.asOf??f.detail?.updatedAt??i),h=f.transportOk&&i-m>s,y=!(f.detail&&typeof f.detail=="object"&&f.detail.ok===!1),g=f.transportOk&&y&&!h;a[d]={id:String(p.id),ok:g,state:f.timedOut?"timeout":!f.transportOk||!y?"error":h?"stale":"fresh",stale:h,asOf:m,checkedAsOf:i,ttlMs:s,...f.detail===void 0?{}:{detail:f.detail},...f.error?{error:f.error}:{}}}}await Promise.all(Array.from({length:Math.min(r,Math.max(1,n.length))},l));let u={fresh:0,stale:0,error:0,timeout:0};for(let d of a)u[d.state]+=1;return{ok:a.every(d=>d.ok),asOf:i,ttlMs:s,timeoutMs:o,counts:u,providers:a}}var W_e=iC,K_e=iC;Nn();import{createHash as G_e}from"node:crypto";var sC=1,AK=/^[a-z0-9][a-z0-9._-]{0,63}$/,vK=/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/,Y_e=new Set(["open","high","low","close","volume","fundingRate","openInterest","premium","oiDelta","bookImbalance"]),X_e=new Set(["sma","ema","rsi","macd","bollinger","atr"]),J_e=new Set(["gt","gte","lt","lte","eq"]),Q_e=new Set(["and","or","not"]),Z_e=new Set(["above","below"]),eNe=new Set(["line","signal","histogram"]),tNe=new Set(["upper","middle","lower"]),aC=new Set(["compare","logic","cross"]),fK=new Set(["version","id","name","venue","market","parameters","nodes","rules","risk"]),mK=new Set(["value","min","max","step"]),cC=new Set(["entryLong","entryShort","exitLong","exitShort"]),hK=new Set(["maxLeverage","maxNotionalUsd","positionSizePct","stopLossPct","takeProfitPct","cooldownBars","maxDailyLossPct","expiresAt"]),nNe=new Set(["id","type"]),yK={input:new Set(["id","type","field"]),constant:new Set(["id","type","value"]),indicator:new Set(["id","type","indicator","input","period","fastPeriod","slowPeriod","signalPeriod","stdDev","output"]),compare:new Set(["id","type","op","left","right"]),logic:new Set(["id","type","op","inputs"]),cross:new Set(["id","type","direction","left","right"])},gK=16,bK=128,wK=100,od=class extends Error{constructor(t){let n=t.map(r=>`${r.path}: ${r.message}`);super(`invalid strategy (${t.length} error${t.length===1?"":"s"}): ${n.join("; ")}`),this.name="StrategyValidationError",this.errors=t}};function io(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function _t(e){return typeof e=="number"&&Number.isFinite(e)}function EK(e){return Number.isInteger(e)&&e>0}function uC(e){if(e==null||typeof e!="object"||Object.isFrozen(e))return e;if(Array.isArray(e)){for(let t of e)uC(t);return Object.freeze(e)}for(let t of Object.keys(e))uC(e[t]);return Object.freeze(e)}function dC(e){if(Array.isArray(e))return e.map(dC);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=dC(e[n]);return t}return e}function K(e,t,n){e.push({path:t,message:n})}function va(e,t,n,r){for(let o of Object.keys(e))t.has(o)||K(r,n?`${n}.${o}`:o,"unknown field is not allowed")}function IK(e,t,n,r){if(!_t(e)||!_t(t)||!_t(n)||!_t(r)||r<=0||e<t||e>n)return!1;let o=(e-t)/r;if(!Number.isFinite(o))return!1;let i=Math.round(o);return Math.abs(o-i)<=1e-9}function lC(e,t,n,r){if(io(e)){if(va(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param)return K(r,`${t}.param`,"must be a parameter name string"),null;if(!Object.prototype.hasOwnProperty.call(n,e.param))return K(r,`${t}.param`,`unknown parameter "${e.param}"`),null;let o=n[e.param];return!io(o)||![o.value,o.min,o.max,o.step].every(EK)?(K(r,`${t}.param`,"referenced period parameter value min max and step must be positive integers"),null):{param:e.param}}return EK(e)?e:(K(r,t,"must be a positive integer or {param}"),null)}function SK(e,t,n,r){return io(e)?(va(e,new Set(["param"]),t,r),typeof e.param!="string"||!e.param?(K(r,`${t}.param`,"must be a parameter name string"),null):Object.prototype.hasOwnProperty.call(n,e.param)?{param:e.param}:(K(r,`${t}.param`,`unknown parameter "${e.param}"`),null)):_t(e)?e:(K(r,t,"must be a finite number or {param}"),null)}function sE(e){switch(e.type){case"input":case"constant":return[];case"indicator":return e.input?[e.input]:[];case"compare":case"cross":return[e.left,e.right].filter(Boolean);case"logic":return Array.isArray(e.inputs)?[...e.inputs]:[];default:return[]}}function rNe(e){let t=new Map,n=r=>{let o=t.get(r)||0;if(o===1)return!0;if(o===2)return!1;t.set(r,1);let i=e.get(r);if(i){for(let s of sE(i))if(e.has(s)&&n(s))return!0}return t.set(r,2),!1};for(let r of e.keys())if(n(r))return!0;return!1}function oNe(e,t){if(!io(e))return K(t,"parameters","must be a plain object"),null;let n=Object.keys(e);if(n.length>gK)return K(t,"parameters",`too many parameters (max ${gK})`),null;let r={};for(let o of n){if(!AK.test(o)){K(t,`parameters.${o}`,"parameter name is malformed");continue}let i=e[o],s=`parameters.${o}`;if(!io(i)){K(t,s,"must be a plain object");continue}va(i,mK,s,t);for(let d of mK)d in i||K(t,`${s}.${d}`,"required field is missing");let{value:a,min:c,max:l,step:u}=i;_t(c)||K(t,`${s}.min`,"must be a finite number"),_t(l)||K(t,`${s}.max`,"must be a finite number"),(!_t(u)||u<=0)&&K(t,`${s}.step`,"must be a positive finite number"),_t(a)||K(t,`${s}.value`,"must be a finite number"),_t(c)&&_t(l)&&c>l&&K(t,`${s}.min`,"min must be <= max"),_t(a)&&_t(c)&&_t(l)&&_t(u)&&u>0&&(IK(a,c,l,u)||K(t,`${s}.value`,"value must lie on the declared min/max/step grid")),r[o]={value:a,min:c,max:l,step:u}}return r}function iNe(e,t,n,r){let o=`nodes.${t}`;if(!io(e))return K(r,o,"must be a plain object"),null;if(typeof e.type!="string"||!yK[e.type])return K(r,`${o}.type`,"unknown or missing node type"),va(e,nNe,o,r),null;switch(va(e,yK[e.type],o,r),(typeof e.id!="string"||!vK.test(e.id))&&K(r,`${o}.id`,"must be a 1-64 char id starting with alphanumeric"),e.type){case"input":return(typeof e.field!="string"||!Y_e.has(e.field))&&K(r,`${o}.field`,"must be one of open|high|low|close|volume|fundingRate|openInterest|premium|oiDelta|bookImbalance"),{id:e.id,type:"input",field:e.field};case"constant":{let i=SK(e.value,`${o}.value`,n,r);return{id:e.id,type:"constant",value:i}}case"indicator":{(typeof e.indicator!="string"||!X_e.has(e.indicator))&&K(r,`${o}.indicator`,"must be one of sma|ema|rsi|macd|bollinger|atr");let i=e.indicator,s={id:e.id,type:"indicator",indicator:i};if(i==="atr"){"input"in e&&(typeof e.input!="string"||!e.input?K(r,`${o}.input`,"must be a node id string when provided"):s.input=e.input);let a=lC(e.period,`${o}.period`,n,r);a!=null&&(s.period=a)}else typeof e.input!="string"||!e.input?K(r,`${o}.input`,"must be a node id string"):s.input=e.input;if((i==="sma"||i==="ema"||i==="rsi"||i==="bollinger"||i==="atr")&&("period"in e,i!=="macd"))if(!("period"in e))K(r,`${o}.period`,"required field is missing");else{let a=lC(e.period,`${o}.period`,n,r);a!=null&&(s.period=a)}if(i==="macd"){for(let a of["fastPeriod","slowPeriod","signalPeriod"])if(!(a in e))K(r,`${o}.${a}`,"required field is missing");else{let c=lC(e[a],`${o}.${a}`,n,r);c!=null&&(s[a]=c)}"output"in e?eNe.has(e.output)?s.output=e.output:K(r,`${o}.output`,"must be line|signal|histogram"):K(r,`${o}.output`,"required field is missing"),"period"in e&&K(r,`${o}.period`,"forbidden for macd"),"stdDev"in e&&K(r,`${o}.stdDev`,"forbidden for macd")}else if(i==="bollinger"){if(!("stdDev"in e))K(r,`${o}.stdDev`,"required field is missing");else{let a=SK(e.stdDev,`${o}.stdDev`,n,r);a!=null&&(typeof a=="number"&&a<=0?K(r,`${o}.stdDev`,"must be > 0"):s.stdDev=a)}"output"in e?tNe.has(e.output)?s.output=e.output:K(r,`${o}.output`,"must be upper|middle|lower"):K(r,`${o}.output`,"required field is missing");for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&K(r,`${o}.${a}`,`forbidden for ${i}`)}else{"output"in e&&K(r,`${o}.output`,`forbidden for ${i}`),"stdDev"in e&&i!=="bollinger"&&K(r,`${o}.stdDev`,`forbidden for ${i}`);for(let a of["fastPeriod","slowPeriod","signalPeriod"])a in e&&K(r,`${o}.${a}`,`forbidden for ${i}`)}return s}case"compare":return(typeof e.op!="string"||!J_e.has(e.op))&&K(r,`${o}.op`,"must be gt|gte|lt|lte|eq"),(typeof e.left!="string"||!e.left)&&K(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&K(r,`${o}.right`,"must be a node id"),{id:e.id,type:"compare",op:e.op,left:e.left,right:e.right};case"logic":{if((typeof e.op!="string"||!Q_e.has(e.op))&&K(r,`${o}.op`,"must be and|or|not"),!Array.isArray(e.inputs))return K(r,`${o}.inputs`,"must be an array of node ids"),{id:e.id,type:"logic",op:e.op,inputs:[]};let i=[];for(let s=0;s<e.inputs.length;s++){let a=e.inputs[s];typeof a!="string"||!a?K(r,`${o}.inputs.${s}`,"must be a node id"):i.push(a)}return e.op==="not"?i.length!==1&&K(r,`${o}.inputs`,"not requires exactly one input"):(e.op==="and"||e.op==="or")&&i.length<2&&K(r,`${o}.inputs`,`${e.op} requires at least two inputs`),{id:e.id,type:"logic",op:e.op,inputs:i}}case"cross":return(typeof e.direction!="string"||!Z_e.has(e.direction))&&K(r,`${o}.direction`,"must be above|below"),(typeof e.left!="string"||!e.left)&&K(r,`${o}.left`,"must be a node id"),(typeof e.right!="string"||!e.right)&&K(r,`${o}.right`,"must be a node id"),{id:e.id,type:"cross",direction:e.direction,left:e.left,right:e.right};default:return null}}function sNe(e,t,n){if(!io(e))return K(t,"risk","must be a plain object"),null;va(e,hK,"risk",t);for(let p of hK)(!(p in e)||e[p]==null)&&K(t,`risk.${p}`,"required field is missing");let r={},o=e.maxLeverage;!_t(o)||o<=0||o>50?K(t,"risk.maxLeverage","must be a number > 0 and <= 50"):r.maxLeverage=o;let i=e.maxNotionalUsd;!_t(i)||i<=0?K(t,"risk.maxNotionalUsd","must be a number > 0"):r.maxNotionalUsd=i;let s=e.positionSizePct;!_t(s)||s<=0||s>100?K(t,"risk.positionSizePct","must be a number > 0 and <= 100"):r.positionSizePct=s;let a=e.stopLossPct;!_t(a)||a<=0||a>100?K(t,"risk.stopLossPct","must be a number > 0 and <= 100"):r.stopLossPct=a;let c=e.takeProfitPct;!_t(c)||c<=0||c>1e3?K(t,"risk.takeProfitPct","must be a number > 0 and <= 1000"):r.takeProfitPct=c;let l=e.cooldownBars;!Number.isInteger(l)||l<0||l>1e5?K(t,"risk.cooldownBars","must be an integer >= 0 and <= 100000"):r.cooldownBars=l;let u=e.maxDailyLossPct;!_t(u)||u<=0||u>100?K(t,"risk.maxDailyLossPct","must be a number > 0 and <= 100"):r.maxDailyLossPct=u;let d=e.expiresAt;return!Number.isInteger(d)||d<=0?K(t,"risk.expiresAt","must be an integer epoch milliseconds > 0"):(n.nowMs!==void 0&&(Number.isInteger(n.nowMs)?d<=n.nowMs&&K(t,"risk.expiresAt","must be strictly greater than nowMs"):K(t,"nowMs","must be an integer epoch milliseconds")),r.expiresAt=d),r}function aNe(e,t={}){let n=[];if(!io(e))return K(n,"","strategy must be a plain object"),{ok:!1,errors:n,strategy:null};va(e,fK,"",n);for(let d of fK)(!(d in e)||e[d]==null)&&K(n,d,"required field is missing");e.version!==sC&&K(n,"version",`must be ${sC}`),(typeof e.id!="string"||!AK.test(e.id))&&K(n,"id","must match /^[a-z0-9][a-z0-9._-]{0,63}$/"),(typeof e.name!="string"||e.name.length===0||e.name.length>wK)&&K(n,"name",`must be a non-empty string max ${wK}`);let r=aE(e.venue);r||K(n,"venue",`unknown strategy venue "${String(e.venue)}"`);let o=null;if(!r)io(e.market)||K(n,"market","must be a plain object");else{let d=r.validateMarket(e.market);if(!d||typeof d.ok!="boolean"||!Array.isArray(d.errors))K(n,"market",`venue ${r.id} returned an invalid market validation result`);else if(d.ok)o=d.market;else for(let p of d.errors)K(n,p.path,p.message)}let i=oNe(e.parameters,n),s=null,a=new Map;if(!Array.isArray(e.nodes))K(n,"nodes","must be an array");else if(e.nodes.length>bK)K(n,"nodes",`too many nodes (max ${bK})`);else{s=[];for(let d=0;d<e.nodes.length;d++){let p=iNe(e.nodes[d],d,i||{},n);p&&(typeof p.id=="string"&&vK.test(p.id)&&(a.has(p.id)?K(n,`nodes.${d}.id`,`duplicate node id "${p.id}"`):a.set(p.id,p)),s.push(p))}for(let d=0;d<s.length;d++){let p=s[d],f=`nodes.${d}`;for(let m of sE(p))a.has(m)||K(n,f,`unknown node ref "${m}"`);if(p.type==="indicator"||p.type==="compare"||p.type==="cross")for(let m of sE(p)){let h=a.get(m);h&&aC.has(h.type)&&K(n,f,`node ref "${m}" must be numeric`)}if(p.type==="logic")for(let m of sE(p)){let h=a.get(m);h&&!aC.has(h.type)&&K(n,f,`node ref "${m}" must be boolean`)}}rNe(a)&&K(n,"nodes","graph contains a cycle")}let c=null;if(!io(e.rules))K(n,"rules","must be a plain object");else{va(e.rules,cC,"rules",n);for(let d of cC)d in e.rules||K(n,`rules.${d}`,"required field is missing");c={};for(let d of cC){let p=e.rules[d];if(p===null){c[d]=null;continue}if(typeof p!="string"||!p){K(n,`rules.${d}`,"must be a node id or null"),c[d]=p;continue}if(!a.has(p)){K(n,`rules.${d}`,`unknown node ref "${p}"`),c[d]=p;continue}let f=a.get(p);aC.has(f.type)||K(n,`rules.${d}`,`rule must reference a boolean node, not ${f.type}`),c[d]=p}}let l=sNe(e.risk,n,t);if(n.length)return{ok:!1,errors:n,strategy:null};let u=uC({version:sC,id:e.id,name:e.name,venue:r.id,market:o,parameters:i,nodes:s,rules:c,risk:l});return{ok:!0,errors:[],strategy:u}}function us(e,t={}){let n=aNe(e,t);if(!n.ok)throw new od(n.errors);return n.strategy}function cNe(e){let t=us(e);return JSON.stringify(dC(t))}function pC(e){let t=cNe(e);return G_e("sha256").update(t,"utf8").digest("hex")}function xK(e,t){if(!io(e))throw new od([{path:"",message:"strategy must be a plain object"}]);if(!io(t))throw new od([{path:"overrides",message:"must be a plain object"}]);let n=us(e),r={};for(let[i,s]of Object.entries(n.parameters))r[i]={value:s.value,min:s.min,max:s.max,step:s.step};let o=[];for(let[i,s]of Object.entries(t)){if(!Object.prototype.hasOwnProperty.call(r,i)){K(o,i,`unknown parameter "${i}"`);continue}let a=r[i];if(!_t(s)){K(o,i,"override must be a finite number");continue}if(!IK(s,a.min,a.max,a.step)){K(o,i,"override must lie on the declared min/max/step grid");continue}r[i]={...a,value:s}}if(o.length)throw new od(o);return us({version:n.version,id:n.id,name:n.name,venue:n.venue,market:{coin:n.market.coin,interval:n.market.interval},parameters:r,nodes:n.nodes.map(i=>{let s={...i};return Array.isArray(i.inputs)&&(s.inputs=[...i.inputs]),s}),rules:{...n.rules},risk:{...n.risk}})}function lh(e){if(!Array.isArray(e))throw new TypeError("values must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(typeof n!="number"||!Number.isFinite(n))throw new TypeError(`values[${t}] must be a finite number`)}}function Ia(e){if(!Number.isInteger(e)||e<=0)throw new TypeError("period must be a positive integer")}function lNe(e){if(!Array.isArray(e))throw new TypeError("bars must be an array");for(let t=0;t<e.length;t++){let n=e[t];if(n==null||typeof n!="object")throw new TypeError(`bars[${t}] must be an object`);for(let r of["o","h","l","c"]){let o=n[r];if(typeof o!="number"||!Number.isFinite(o))throw new TypeError(`bars[${t}].${r} must be a finite number`)}if(n.h<n.l)throw new TypeError(`bars[${t}] high must be >= low`)}}function OK(e,t){lh(e),Ia(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let o=0;o<e.length;o++)r+=e[o],o>=t&&(r-=e[o-t]),o>=t-1&&(n[o]=r/t);return n}function cE(e,t){lh(e),Ia(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=0;for(let s=0;s<t;s++)r+=e[s];let o=r/t;n[t-1]=o;let i=2/(t+1);for(let s=t;s<e.length;s++)o=i*e[s]+(1-i)*o,n[s]=o;return n}function _K(e,t){lh(e),Ia(t);let n=new Array(e.length).fill(null);if(e.length<=t)return n;let r=0,o=0;for(let a=1;a<=t;a++){let c=e[a]-e[a-1];c>=0?r+=c:o-=c}let i=r/t,s=o/t;n[t]=kK(i,s);for(let a=t+1;a<e.length;a++){let c=e[a]-e[a-1],l=c>0?c:0,u=c<0?-c:0;i=(i*(t-1)+l)/t,s=(s*(t-1)+u)/t,n[a]=kK(i,s)}return n}function kK(e,t){return e===0&&t===0?50:t===0?100:e===0?0:100-100/(1+e/t)}function NK(e,t={}){lh(e);let n=t.fastPeriod,r=t.slowPeriod,o=t.signalPeriod;if(Ia(n),Ia(r),Ia(o),n>=r)throw new TypeError("fastPeriod must be < slowPeriod");let i=cE(e,n),s=cE(e,r),a=new Array(e.length).fill(null);for(let d=0;d<e.length;d++)i[d]!=null&&s[d]!=null&&(a[d]=i[d]-s[d]);let c=new Array(e.length).fill(null),l=new Array(e.length).fill(null),u=[];for(let d=0;d<a.length;d++)a[d]!=null&&u.push(d);if(u.length>=o){let d=0;for(let h=0;h<o;h++)d+=a[u[h]];let p=d/o,f=u[o-1];c[f]=p,l[f]=a[f]-p;let m=2/(o+1);for(let h=o;h<u.length;h++){let y=u[h];p=m*a[y]+(1-m)*p,c[y]=p,l[y]=a[y]-p}}return{line:a,signal:c,histogram:l}}function TK(e,t={}){lh(e);let n=t.period,r=t.stdDev;if(Ia(n),typeof r!="number"||!Number.isFinite(r)||r<=0)throw new TypeError("stdDev must be a finite number > 0");let o=new Array(e.length).fill(null),i=new Array(e.length).fill(null),s=new Array(e.length).fill(null);if(e.length<n)return{upper:i,middle:o,lower:s};let a=0,c=0;for(let l=0;l<e.length;l++){let u=e[l];if(a+=u,c+=u*u,l>=n){let d=e[l-n];a-=d,c-=d*d}if(l>=n-1){let d=a/n,p=c/n-d*d;p<0&&p>-1e-12&&(p=0);let f=Math.sqrt(p);o[l]=d,i[l]=d+r*f,s[l]=d-r*f}}return{upper:i,middle:o,lower:s}}function CK(e,t){lNe(e),Ia(t);let n=new Array(e.length).fill(null);if(e.length<t)return n;let r=new Array(e.length);for(let s=0;s<e.length;s++){let a=e[s];if(s===0)r[s]=a.h-a.l;else{let c=e[s-1].c;r[s]=Math.max(a.h-a.l,Math.abs(a.h-c),Math.abs(a.l-c))}}let o=0;for(let s=0;s<t;s++)o+=r[s];let i=o/t;n[t-1]=i;for(let s=t;s<e.length;s++)i=(i*(t-1)+r[s])/t,n[s]=i;return n}import{createHash as uNe}from"node:crypto";var fC=3,dNe="7477966facc4ef928a94e6221c8fd238eef4fcbeec46b96ae1b89178e13c2d5f",pNe="68f5b412a9975f04024cf9b9b6209b4bccedd52f176e95f34f786b3f53479c6a",fNe="967fd45ecddd0d59ac0f662fe92ea813c32620ba751f249b4ace6cb6b809fb5e",RK=uNe("sha256").update(JSON.stringify({version:fC,compilerSourceHash:dNe,indicatorsSourceHash:pNe,schemaSourceHash:fNe})).digest("hex");var lE=fC,mC=RK,mNe=Object.freeze({open:"o",high:"h",low:"l",close:"c",volume:"v",fundingRate:"fundingRate",openInterest:"openInterest",premium:"premium",oiDelta:"oiDelta",bookImbalance:"bookImbalance"}),hNe=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5});function $r(e){return typeof e=="number"&&Number.isFinite(e)}function yNe(e){let t=new Map(e.map(a=>[a.id,a])),n=a=>{switch(a.type){case"indicator":return a.input?[a.input]:[];case"compare":case"cross":return[a.left,a.right];case"logic":return[...a.inputs];default:return[]}},r=new Map,o=new Map;for(let a of e)r.set(a.id,0),o.set(a.id,[]);for(let a of e)for(let c of n(a))t.has(c)&&(o.get(c).push(a.id),r.set(a.id,r.get(a.id)+1));let i=[];for(let[a,c]of r)c===0&&i.push(a);let s=[];for(;i.length;){let a=i.shift();s.push(a);for(let c of o.get(a))r.set(c,r.get(c)-1),r.get(c)===0&&i.push(c)}if(s.length!==e.length)throw new Error("strategy graph is cyclic");return s}function id(e,t){return e!=null&&typeof e=="object"&&"param"in e?t[e.param].value:e}function gNe(e,t,n){if(!Array.isArray(e)||e.length===0)throw new TypeError("bars must be a non-empty array");if(!Number.isInteger(t)||t<0||t>=e.length)throw new RangeError("index out of range");let r=null;for(let o=0;o<=t;o++){let i=e[o];if(i==null||typeof i!="object"||Array.isArray(i))throw new TypeError(`bars[${o}] must be an object`);let{t:s,o:a,h:c,l,c:u,v:d}=i;if(!$r(s)&&(typeof s=="number"&&Number.isFinite(s)),!Number.isFinite(s))throw new TypeError(`bars[${o}].t must be finite`);for(let[p,f]of[["o",a],["h",c],["l",l],["c",u],["v",d]])if(!$r(f))throw new TypeError(`bars[${o}].${p} must be a finite number`);for(let[p,f]of[["o",a],["h",c],["l",l],["c",u]])if(!(f>0))throw new TypeError(`bars[${o}].${p} price must be positive`);if(d<0)throw new TypeError(`bars[${o}].v volume must be non-negative`);if(c<Math.max(a,u,l))throw new TypeError(`bars[${o}] high must be >= max(open, close, low)`);if(l>Math.min(a,u,c))throw new TypeError(`bars[${o}] low must be <= min(open, close, high)`);if(r!=null){if(!(s>r))throw new TypeError("bars t must be strictly increasing");if(s-r!==hNe[n])throw new TypeError(`bars t must match ${n} cadence`)}if(r=s,"fundingRate"in i&&i.fundingRate!=null&&!$r(i.fundingRate))throw new TypeError(`bars[${o}].fundingRate must be finite when present`);if("openInterest"in i&&i.openInterest!=null){if(!$r(i.openInterest))throw new TypeError(`bars[${o}].openInterest must be finite when present`);if(i.openInterest<0)throw new TypeError(`bars[${o}].openInterest must be non-negative`)}for(let p of["premium","oiDelta"])if(p in i&&i[p]!=null&&!$r(i[p]))throw new TypeError(`bars[${o}].${p} must be finite when present`);if("bookImbalance"in i&&i.bookImbalance!=null){if(!$r(i.bookImbalance))throw new TypeError(`bars[${o}].bookImbalance must be finite when present`);if(i.bookImbalance<-1||i.bookImbalance>1)throw new TypeError(`bars[${o}].bookImbalance must be within [-1, 1]`)}}}function Hc(e,t,n,r,o,i){if(i.has(e))return i.get(e);let s=t.get(e),a;switch(s.type){case"input":{let c=mNe[s.field];a=new Array(o+1);for(let l=0;l<=o;l++){let u=r[l][c];a[l]=u===void 0?null:u}break}case"constant":{let c=id(s.value,n);a=new Array(o+1).fill(c);break}case"indicator":{let c=s.period!=null?id(s.period,n):void 0;if(s.indicator==="atr"){let d=[];for(let p=0;p<=o;p++){let f=r[p];d.push({o:f.o,h:f.h,l:f.l,c:f.c})}a=CK(d,c);break}let u=Hc(s.input,t,n,r,o,i).map((d,p)=>{if(d==null||!$r(d))throw new TypeError(`indicator input ${s.input} has non-finite value at ${p}`);return d});if(s.indicator==="sma")a=OK(u,c);else if(s.indicator==="ema")a=cE(u,c);else if(s.indicator==="rsi")a=_K(u,c);else if(s.indicator==="macd")a=NK(u,{fastPeriod:id(s.fastPeriod,n),slowPeriod:id(s.slowPeriod,n),signalPeriod:id(s.signalPeriod,n)})[s.output];else if(s.indicator==="bollinger")a=TK(u,{period:c,stdDev:id(s.stdDev,n)})[s.output];else throw new Error(`unsupported indicator ${s.indicator}`);break}case"compare":{let c=Hc(s.left,t,n,r,o,i),l=Hc(s.right,t,n,r,o,i);a=new Array(o+1);for(let u=0;u<=o;u++){let d=c[u],p=l[u];if(d==null||p==null||!$r(d)||!$r(p)){a[u]=!1;continue}switch(s.op){case"gt":a[u]=d>p;break;case"gte":a[u]=d>=p;break;case"lt":a[u]=d<p;break;case"lte":a[u]=d<=p;break;case"eq":a[u]=d===p;break;default:a[u]=!1}}break}case"logic":{let c=s.inputs.map(l=>Hc(l,t,n,r,o,i));a=new Array(o+1);for(let l=0;l<=o;l++)if(s.op==="not"){let u=c[0][l];a[l]=u===!0?!1:u===!1}else if(s.op==="and"){let u=!0;for(let d of c)if(d[l]!==!0){u=!1;break}a[l]=u}else if(s.op==="or"){let u=!1;for(let d of c)if(d[l]===!0){u=!0;break}a[l]=u}else a[l]=!1;break}case"cross":{let c=Hc(s.left,t,n,r,o,i),l=Hc(s.right,t,n,r,o,i);a=new Array(o+1),a[0]=!1;for(let u=1;u<=o;u++){let d=c[u-1],p=l[u-1],f=c[u],m=l[u];if(d==null||p==null||f==null||m==null||!$r(d)||!$r(p)||!$r(f)||!$r(m)){a[u]=!1;continue}s.direction==="above"?a[u]=d<=p&&f>m:a[u]=d>=p&&f<m}break}default:throw new Error(`unknown node type ${s.type}`)}return i.set(e,a),a}function hC(e,t={}){let n=us(e);t&&Object.keys(t).length&&(n=xK(n,t));let r=new Map(n.nodes.map(f=>[f.id,f])),o=Object.freeze(yNe(n.nodes)),i=n.parameters,s=new Set(n.nodes.filter(f=>f.type==="input").map(f=>f.field));if(n.nodes.some(f=>f.type==="indicator"&&f.indicator==="atr"))for(let f of["open","high","low","close"])s.add(f);let a=Object.freeze([...s].sort()),c=pC(n);function l(f,m){let h={};for(let g of o){let w=f.get(g);h[g]=w[m]}let y=g=>g!=null&&h[g]===!0;return{values:h,signals:{entryLong:y(n.rules.entryLong),entryShort:y(n.rules.entryShort),exitLong:y(n.rules.exitLong),exitShort:y(n.rules.exitShort)}}}function u(f,m){gNe(f,m,n.market.interval);let h=new Map;for(let y of o)Hc(y,r,i,f,m,h);return h}function d(f,m){return l(u(f,m),m)}function p(f){if(!Array.isArray(f)||f.length===0)throw new TypeError("bars must be a non-empty array");let m=f.length-1,h=u(f,m);return Object.freeze(f.map((y,g)=>Object.freeze(l(h,g))))}return Object.freeze({strategy:n,strategyHash:c,compilerVersion:lE,compilerHash:mC,requiredSeries:a,nodeOrder:o,evaluate:d,evaluateAll:p})}import{createHash as bNe}from"node:crypto";var oze=Object.freeze({initialEquityUsd:1e4,takerFeeBps:3.5,builderFeeBps:2,slippageBps:2,latencyBars:1,maxVolumeParticipationPct:100});var ize=Object.freeze(["fundingRate","openInterest","premium","oiDelta","bookImbalance"]);var wNe=Object.freeze(["fail","pass_paper_only","pass_live_eligible"]);function xa(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function uh(e){return typeof e=="number"&&Number.isFinite(e)}function sd(e){if(Array.isArray(e))return e.map(sd);if(e!=null&&typeof e=="object"){let t={};for(let n of Object.keys(e).sort())t[n]=sd(e[n]);return t}return e}function PK(e){if(!xa(e))throw new TypeError("evidence artifact must be a plain object");if(!wNe.includes(e.status))throw new TypeError("evidence artifact status is invalid");for(let t of["strategyHash","compilerHash","barsHash"])if(typeof e[t]!="string"||!/^[0-9a-f]{64}$/.test(e[t]))throw new TypeError(`evidence artifact ${t} must be a sha256 hash`);if(!xa(e.split))throw new TypeError("evidence artifact split required");if(!Array.isArray(e.flags))throw new TypeError("evidence artifact flags must be an array");if(!xa(e.walkForward)||!Array.isArray(e.walkForward.windows))throw new TypeError("evidence artifact walkForward windows required");if(e.status==="pass_live_eligible"&&(!xa(e.train)||!xa(e.holdout)))throw new TypeError("live-eligible evidence artifact requires train and holdout facts");return sd({barsHash:e.barsHash,compilerHash:e.compilerHash,flags:e.flags.map(t=>sd(t)),holdout:e.holdout??null,split:e.split,status:e.status,strategyHash:e.strategyHash,train:e.train??null,walkForward:{passRate:e.walkForward.passRate,windowsRun:e.walkForward.windowsRun??e.walkForward.windows.length,windows:e.walkForward.windows.map(t=>({index:t.index,trainStartIndex:t.trainStartIndex,trainEndIndex:t.trainEndIndex,passed:t.passed,reason:t.reason,evalStartIndex:t.evalStartIndex,evalEndIndex:t.evalEndIndex,metrics:t.metrics}))}})}function ENe(e){return bNe("sha256").update(JSON.stringify(PK(e)),"utf8").digest("hex")}function Lo(e,t,n=0){if(!Number.isInteger(e)||e<n)throw new Error(`${t} must be an integer >= ${n}`);return e}function yC(e,t){if(!xa(e)||!xa(e.metrics))throw new Error(`${t} metrics required`);let n=Lo(e.tradeCount,`${t}.tradeCount`);if(e.metrics.tradeCount!==n)throw new Error(`${t} tradeCount contradicts metrics.tradeCount`);for(let r of["netPnlUsd","profitFactor","maxDrawdownPct"])if(!uh(e.metrics[r]))throw new Error(`${t}.metrics.${r} must be finite`);if(e.metrics.maxDrawdownPct<0)throw new Error(`${t}.metrics.maxDrawdownPct must be >= 0`);return e.metrics}function SNe(e,{maxDailyLossPct:t}={}){let n=e.split,r=Lo(n.trainStartIndex,"split.trainStartIndex"),o=Lo(n.trainEndIndex,"split.trainEndIndex"),i=Lo(n.trainBarCount,"split.trainBarCount",1),s=Lo(n.holdoutStartIndex,"split.holdoutStartIndex"),a=Lo(n.holdoutEndIndex,"split.holdoutEndIndex"),c=Lo(n.holdoutBarCount,"split.holdoutBarCount",1);if(r!==0||o-r+1!==i||s!==o+1||a-s+1!==c)throw new Error("evidence split must be contiguous, chronological, and count-consistent");if(!uh(n.trainFraction)||n.trainFraction<=0||n.trainFraction>=1)throw new Error("split.trainFraction must be in (0,1)");yC(e.train,"train");let l=yC(e.holdout,"holdout");if(l.tradeCount<1||l.netPnlUsd<=0||l.profitFactor<=1)throw new Error("live-eligible holdout metrics do not pass");if(uh(t)&&l.maxDrawdownPct>t)throw new Error("live-eligible holdout drawdown exceeds strategy risk");if(e.flags.length>0)throw new Error("live-eligible evidence cannot contain failure flags");let u=e.walkForward,d=u.windows;if(d.length<1||u.windowsRun!==d.length)throw new Error("live-eligible walk-forward windowsRun must match nonempty windows");let p=0,f=-1;for(let h=0;h<d.length;h++){let y=d[h];if(!xa(y)||y.index!==h||typeof y.passed!="boolean")throw new Error("walk-forward windows must be ordered and structurally valid");let g=Lo(y.trainStartIndex,`walkForward.windows[${h}].trainStartIndex`),w=Lo(y.trainEndIndex,`walkForward.windows[${h}].trainEndIndex`),A=Lo(y.evalStartIndex,`walkForward.windows[${h}].evalStartIndex`),E=Lo(y.evalEndIndex,`walkForward.windows[${h}].evalEndIndex`);if(g!==0||w>=A||A>E||A<=f)throw new Error("walk-forward windows must be chronological and disjoint");if(f=E,y.passed){if(p+=1,y.reason!=="pass")throw new Error("passed walk-forward window reason must be pass");let b=yC({metrics:y.metrics,tradeCount:y.metrics?.tradeCount},`walkForward.windows[${h}]`);if(b.tradeCount<1||b.netPnlUsd<=0||b.profitFactor<=1)throw new Error("passed walk-forward window metrics do not pass");if(uh(t)&&b.maxDrawdownPct>t)throw new Error("passed walk-forward drawdown exceeds strategy risk")}else if(y.reason==="pass")throw new Error("failed walk-forward window cannot have pass reason")}let m=p/d.length;if(!uh(u.passRate)||Math.abs(u.passRate-m)>Number.EPSILON||m<.6)throw new Error("walk-forward passRate contradicts concrete windows or is below live threshold")}function LK(e,t={}){if(typeof e?.id!="string"||!/^[0-9a-f]{64}$/.test(e.id))throw new Error("evidence.id must be a sha256 evidence artifact hash");let n=PK(e),r=sd({id:e.id,...n});if(JSON.stringify(sd(e))!==JSON.stringify(r))throw new Error("evidence artifact contains fields unbound from its deterministic identity");let o=ENe(e);if(e.id!==o)throw new Error("evidence.id does not match its deterministic artifact facts digest");return e.status==="pass_live_eligible"&&SNe(e,t),e}de();var ANe=["privatekey","secretkey","seed","mnemonic","passphrase","password","keystore","keymaterial","apikey","authtoken","accesstoken","refreshtoken","credential","bearer","signature","authorization","xprv","xpriv","wif"];function dh(e){return e!=null&&typeof e=="object"&&!Array.isArray(e)}function vNe(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function bC(e,t="value"){if(Array.isArray(e)){e.forEach((n,r)=>bC(n,`${t}[${r}]`));return}if(dh(e))for(let[n,r]of Object.entries(e)){let o=vNe(n);if(ANe.some(i=>o.includes(i)))throw new Error(`handoff: forbidden secret-like field at ${t}.${n}`);bC(r,`${t}.${n}`)}}function gC(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function $K({strategy:e,evidence:t,shadow:n,caps:r,nowMs:o=Date.now(),env:i=process.env}={}){if(bC({strategy:e,evidence:t,shadow:n,caps:r},"handoff"),!dh(e))throw new Error("handoff: strategy required");if(!dh(t))throw new Error("handoff: evidence required");if(!dh(n))throw new Error("handoff: shadow required");if(!dh(r))throw new Error("handoff: caps required");if(typeof n.id!="string"||!n.id.trim())throw new Error("handoff: shadow.id required");if(typeof n.stateHash!="string"||!/^[0-9a-f]{64}$/.test(n.stateHash))throw new Error("handoff: shadow.stateHash must be a sha256 hash");if(n.status!=="running")throw new Error("handoff: shadow.status must be running");if(!Number.isInteger(n.cursor)||n.cursor<=0)throw new Error("handoff: shadow.cursor must be a positive integer");if(!Number.isInteger(n.updatedAt)||n.updatedAt<=0||n.updatedAt>o)throw new Error("handoff: shadow.updatedAt must be a positive integer <= nowMs");let s=us(e,{nowMs:o}),a=hC(s);if(LK(t,{maxDailyLossPct:s.risk.maxDailyLossPct}),t.status!=="pass_live_eligible")throw new Error("handoff: evidence.status must be pass_live_eligible");if(t.strategyHash!==a.strategyHash)throw new Error("handoff: evidence.strategyHash mismatch");if(t.compilerHash!==a.compilerHash)throw new Error("handoff: evidence.compilerHash mismatch");let c=["perStrategyNotionalUsd","maxLeverage","dailyLossCapUsd","chainAllowlist","assetAllowlist","expiresAt","killSwitchRequired"];for(let p of c)if(!(p in r)||r[p]==null)throw new Error(`handoff: caps.${p} required`);if(!gC(r.perStrategyNotionalUsd))throw new Error("handoff: caps.perStrategyNotionalUsd must be positive");if(r.perStrategyNotionalUsd>a.strategy.risk.maxNotionalUsd)throw new Error("handoff: caps.perStrategyNotionalUsd exceeds strategy.risk.maxNotionalUsd");if(!gC(r.maxLeverage))throw new Error("handoff: caps.maxLeverage must be positive");if(r.maxLeverage>a.strategy.risk.maxLeverage)throw new Error("handoff: caps.maxLeverage exceeds strategy.risk.maxLeverage");if(!gC(r.dailyLossCapUsd))throw new Error("handoff: caps.dailyLossCapUsd must be positive");let l=a.strategy.risk.maxNotionalUsd*(a.strategy.risk.maxDailyLossPct/100);if(r.dailyLossCapUsd>l)throw new Error("handoff: caps.dailyLossCapUsd exceeds strategy daily loss ceiling");if(!Array.isArray(r.chainAllowlist)||r.chainAllowlist.length===0)throw new Error("handoff: caps.chainAllowlist must be a non-empty array");if(!r.chainAllowlist.every(p=>p==="hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include only hyperliquid");if(!r.chainAllowlist.includes("hyperliquid"))throw new Error("handoff: caps.chainAllowlist must include hyperliquid");if(!Array.isArray(r.assetAllowlist)||r.assetAllowlist.length===0)throw new Error("handoff: caps.assetAllowlist must be a non-empty array");if(r.assetAllowlist.length!==1||r.assetAllowlist[0]!==a.strategy.market.coin)throw new Error("handoff: caps.assetAllowlist must contain only the strategy market coin");if(!Number.isInteger(r.expiresAt)||!(r.expiresAt>o))throw new Error("handoff: caps.expiresAt must be an integer > nowMs");if(r.expiresAt>a.strategy.risk.expiresAt)throw new Error("handoff: caps.expiresAt exceeds strategy.risk.expiresAt");if(r.killSwitchRequired!==!0)throw new Error("handoff: caps.killSwitchRequired must be exactly true");let u={perStrategyNotionalUsd:r.perStrategyNotionalUsd,maxLeverage:r.maxLeverage,dailyLossCapUsd:r.dailyLossCapUsd,chainAllowlist:[...r.chainAllowlist],assetAllowlist:[...r.assetAllowlist],expiresAt:r.expiresAt,killSwitchRequired:!0},d={strategyHash:a.strategyHash,compilerHash:a.compilerHash,evidence:JSON.parse(JSON.stringify(t)),shadow:{id:n.id,stateHash:n.stateHash,status:n.status,cursor:n.cursor,updatedAt:n.updatedAt},compiled:{strategyHash:a.strategyHash,compilerHash:a.compilerHash,compilerVersion:lE,venue:"hyperliquid",market:{coin:a.strategy.market.coin,kind:"perp",interval:a.strategy.market.interval},risk:{...a.strategy.risk},strategy:JSON.parse(JSON.stringify(a.strategy))},arming:{liveBroadcast:!1,requiresExplicitUserArm:!0,caps:u},requiresUserSignature:!0,signingReady:!1,broadcastReady:!1,executionReady:!1};return j(d,{provider:"hl-strategy",kind:"strategy-live-handoff",env:i})}Nn();var INe=Object.freeze({"1m":6e4,"3m":18e4,"5m":3e5,"15m":9e5,"30m":18e5,"1h":36e5,"2h":72e5,"4h":144e5,"8h":288e5,"12h":432e5,"1d":864e5});function ad(e,t){let n=Number(e);if(!Number.isFinite(n))throw new TypeError(`${t} must be finite`);return n}function cd(e,t){if(!Number.isSafeInteger(e)||e<0)throw new TypeError(`${t} must be a non-negative safe integer`);return e}function ph(e){if(Array.isArray(e))for(let t of e)ph(t);else if(e&&typeof e=="object")for(let t of Object.values(e))ph(t);return Object.freeze(e)}function xNe(e){if(typeof e!="string")throw new TypeError("unsupported strategy interval");let t=INe[e];if(typeof t!="number")throw new TypeError("unsupported strategy interval");return t}function kNe(e,{endTime:t=Number.MAX_SAFE_INTEGER}={}){if(!Array.isArray(e))throw new TypeError("Hyperliquid candles must be an array");cd(t,"endTime");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`candles[${r}] must be an object`);let i=cd(Number(o.t),`candles[${r}].t`);if(cd(Number(o.T),`candles[${r}].T`)>t)continue;let a={t:i,o:ad(o.o,`candles[${r}].o`),h:ad(o.h,`candles[${r}].h`),l:ad(o.l,`candles[${r}].l`),c:ad(o.c,`candles[${r}].c`),v:ad(o.v,`candles[${r}].v`)};if(a.h<Math.max(a.o,a.c,a.l))throw new TypeError(`candles[${r}].h is below another price`);if(a.l>Math.min(a.o,a.c,a.h))throw new TypeError(`candles[${r}].l is above another price`);if(a.v<0)throw new TypeError(`candles[${r}].v must be non-negative`);let c=n.get(i);if(c&&JSON.stringify(c)!==JSON.stringify(a))throw new TypeError(`conflicting duplicate candle at timestamp ${i}`);c||n.set(i,a)}return ph([...n.values()].sort((r,o)=>r.t-o.t))}function ONe(e,t){if(!Array.isArray(e))throw new TypeError("Hyperliquid funding history must be an array");let n=new Map;for(let r=0;r<e.length;r++){let o=e[r];if(!o||typeof o!="object"||Array.isArray(o))throw new TypeError(`funding[${r}] must be an object`);let i=cd(Number(o.time),`funding[${r}].time`);i>t||n.set(i,{time:i,fundingRate:ad(o.fundingRate,`funding[${r}].fundingRate`)})}return[...n.values()].sort((r,o)=>r.time-o.time)}async function _Ne({coin:e,startTime:t,endTime:n},r){let o=[],i=Math.max(0,t-288e5),s=!1;for(let a=0;a<16&&i<=n;a++){let c=await Ly({coin:e,startTime:i,endTime:n},r);if(!Array.isArray(c))throw new TypeError("Hyperliquid funding history must be an array");o.push(...c);let l=i;for(let u of c){let d=Number(u?.time);Number.isSafeInteger(d)&&d>l&&(l=d)}if(c.length<500||l>=n){s=!0;break}if(l<=i)throw new Error("Hyperliquid funding history pagination did not advance");i=l+1}if(!s)throw new Error("strategy history exceeds the bounded funding history limit");return ONe(o,n)}function NNe(e,t,n){let r=0,o=null;return e.map(i=>{let s=i.t+n,a=0;for(;r<t.length&&t[r].time<s;){let c=t[r];o=c.fundingRate,c.time>=i.t&&(a+=c.fundingRate),r+=1}return o==null?{...i,fundingPaymentRate:a}:{...i,fundingRate:o,fundingPaymentRate:a}})}async function MK(e,t={}){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy history input must be an object");let n=e.coin;if(typeof n!="string"||n.length>32||!/^(?:[A-Za-z0-9][A-Za-z0-9._-]{0,31}|[a-z][a-z0-9]{0,15}:[A-Za-z0-9][A-Za-z0-9._-]{0,15})$/.test(n))throw new TypeError("coin must be a Hyperliquid market identifier");let r=String(e.interval||"15m"),o=xNe(r);if(e.endTime==null)throw new TypeError("endTime is required for deterministic history");let i=cd(e.endTime,"endTime"),s=e.count==null?1500:e.count;if(!Number.isInteger(s)||s<20||s>5e3)throw new TypeError("count must be an integer from 20 to 5000");let a=e.startTime==null?Math.max(0,i-s*o):cd(e.startTime,"startTime");if(a>=i)throw new TypeError("startTime must be before endTime");let[c,l]=await Promise.all([Sl({coin:n,interval:r,startTime:a,endTime:i},t),_Ne({coin:n,startTime:a,endTime:i},t)]),u=kNe(c,{endTime:i}),d=ph(NNe(u,l,o));return ph({coin:n,interval:r,range:{startTime:a,endTime:i},bars:d})}var TNe=new Set(["1m","3m","5m","15m","30m","1h","2h","4h","8h","12h","1d"]),CNe=new Set(["coin","interval"]);function RNe(e){let t=[];if(!e||typeof e!="object"||Array.isArray(e))return{ok:!1,errors:[{path:"market",message:"must be a plain object"}],market:null};for(let n of Object.keys(e))CNe.has(n)||t.push({path:`market.${n}`,message:"unknown field is not allowed"});return(typeof e.coin!="string"||e.coin.length===0||e.coin.length>32)&&t.push({path:"market.coin",message:"must be a non-empty string max 32"}),(typeof e.interval!="string"||!TNe.has(e.interval))&&t.push({path:"market.interval",message:"must be a supported interval"}),t.length?{ok:!1,errors:t,market:null}:{ok:!0,errors:[],market:{coin:e.coin,interval:e.interval}}}async function PNe(e={}){let t=await Py(e);if(!t||!Array.isArray(t.universe))throw new TypeError("Hyperliquid market metadata must contain universe");return Object.freeze(t.universe.map((n,r)=>{if(!n||typeof n.name!="string"||!n.name)throw new TypeError(`Hyperliquid market metadata universe[${r}].name is invalid`);return n.name}))}var DK=Object.freeze({id:"hyperliquid",validateMarket:RNe,fetchBars:MK,listMarkets:PNe,prepareIntent(e){return $K(e)}});var LNe=Object.freeze(["id","validateMarket","prepareIntent"]);function $Ne(e){if(!e||typeof e!="object"||Array.isArray(e))throw new TypeError("strategy venue adapter must be an object");if(typeof e.id!="string"||!/^[a-z0-9][a-z0-9._-]{0,63}$/.test(e.id))throw new TypeError("strategy venue adapter id is malformed");for(let t of LNe.slice(1))if(typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} requires ${t}()`);for(let t of["fetchBars","listMarkets"])if(e[t]!=null&&typeof e[t]!="function")throw new TypeError(`strategy venue adapter ${e.id} ${t} must be a function`);return e}var BK=[DK].map($Ne),MNe=new Map(BK.map(e=>[e.id,e])),DNe=Object.freeze([...BK]);function aE(e){return typeof e!="string"?null:MNe.get(e)??null}function BNe(e){let t=aE(e);if(!t)throw new Error(`unknown strategy venue: ${String(e)}`);return t}var uE=Object.freeze(["price","wallet","risk","execution","security","nft","governance","system"]),UNe=new Set(uE);function dE(e){if(!UNe.has(e))throw new TypeError(`Unknown watch category: ${String(e)}`);return e}function wC(e={}){let t=e.subscribedCategories??[];if(!Array.isArray(t))throw new TypeError("subscribedCategories must be an array");return t}function UK(){return{subscribedCategories:[]}}function FNe(e,t){dE(t);let n=wC(e);return n.includes(t)?{...e,subscribedCategories:[...n]}:{...e,subscribedCategories:[...n,t]}}function qNe(e,t){dE(t);let n=wC(e);return{...e,subscribedCategories:n.filter(r=>r!==t)}}function HNe({category:e,notify:t=!1,...n}={}){if(dE(e),typeof t!="boolean")throw new TypeError("watch notify must be a boolean");return{...n,category:e,notify:t}}function jNe(e,t){return!(!t||t.notify!==!0||t.category!==e.category||e.watchId!==void 0&&t.id!==e.watchId)}function pE(e,t=UK(),n){if(!e||typeof e!="object")throw new TypeError("alert must be an object");return dE(e.category),wC(t).includes(e.category)?{deliver:!0,reason:"category-subscribed"}:jNe(e,n)?{deliver:!0,reason:"watch-opt-in"}:{deliver:!1,reason:"not-subscribed"}}function zNe(e,t,n){return pE(e,t,n).deliver}var FK=Object.freeze(["wallet","pool","nft_floor","hl_flow","prediction_market"]),VNe=Object.freeze({wallets:"wallet",smart_wallet:"wallet",pools:"pool",new_pool:"pool",nft:"nft_floor",nft_floors:"nft_floor",hyperliquid:"hl_flow",prediction:"prediction_market",prediction_markets:"prediction_market"}),xn=(e,t=0,n=1)=>Math.min(n,Math.max(t,e)),ar=e=>Number.isFinite(Number(e))?Number(e):null,fE=e=>Math.round(e*1e4)/1e4;function qK(e){let t=String(e?.type??e?.surface??e?.kind??"").toLowerCase();return VNe[t]??t}function WNe(e,t){return String(e?.id??e?.signalId??e?.asset??e?.market??e?.pool??e?.collection??`${qK(e)}:${t}`)}function so(e,t,n,r=!0){!r||n===null||!Number.isFinite(n)||e.push({feature:t,value:fE(n)})}function KNe(e,t){let n=ar(e.repeatBuys??e.repeat_buys??e.buyCount),r=ar(e.walletWinRate??e.winRate);so(t,"repeat_buys",n===null?null:xn((n-1)/4)*.38),so(t,"wallet_win_rate",r===null?null:(xn(r)-.5)*.5)}function GNe(e,t){let n=ar(e.ageHours??e.poolAgeHours),r=ar(e.liquidityUsd??e.liquidity),o=e.liquidityLocked??e.locked;so(t,"pool_age",n===null?null:n<24?-.42:xn(n/720)*.12),so(t,"liquidity",r===null?null:(xn(Math.log10(Math.max(1,r))/7)-.5)*.28),so(t,"liquidity_lock",o==null?null:o?.12:-.28)}function YNe(e,t){let n=ar(e.floorChange??e.floorChangePct),r=ar(e.sales??e.saleCount);so(t,"floor_change",n===null?null:xn(n,-1,1)*.35),so(t,"sales_depth",r===null?null:xn(r/50)*.18)}function XNe(e,t){let n=ar(e.flowImbalance??e.imbalance),r=ar(e.fundingRate??e.funding);so(t,"flow_imbalance",n===null?null:xn(n,-1,1)*.42),so(t,"funding",r===null?null:-xn(r*100,-1,1)*.12)}function JNe(e,t){let n=ar(e.marketProbability??e.marketPrice??e.probability),r=ar(e.fairProbability??e.referenceProbability??e.fairValue);so(t,"probability_mispricing",n===null||r===null?null:xn(r-n,-1,1)*.65);let o=ar(e.liquidityUsd??e.liquidity);so(t,"market_liquidity",o===null?null:xn(Math.log10(Math.max(1,o))/6)*.12)}var QNe=Object.freeze({wallet:KNe,pool:GNe,nft_floor:YNe,hl_flow:XNe,prediction_market:JNe});function ZNe(e,t,n){let r=n.filter(i=>{let s=i?.signalId??i?.eventId??i?.id??i?.asset??i?.market;return s!=null&&String(s)===t});if(r.length===0)return null;let o=r.map(i=>ar(i.return??i.markout??i.pnl??i.value)).filter(i=>i!==null);return o.length===0?null:o.reduce((i,s)=>i+s,0)/o.length}function EC(e=[],t=[],n={}){if(!Array.isArray(e)||!Array.isArray(t))throw new TypeError("events and markouts must be arrays");let r=xn(ar(n.minimumCoverage)??.5);return e.map((o,i)=>{let s=qK(o),a=WNe(o,i),c=QNe[s],l=[];c&&c(o,l);let u=s==="wallet"?2:s==="pool"?3:2,d=fE(xn(l.length/u)),p=l.reduce((A,E)=>A+E.value,0),f=ZNe(o,a,t),m=f===null?0:xn(f,-1,1)*.35;f!==null&&so(l,"shadow_markout",m);let h=fE(xn(.5+p+m)),y=f===null?.8:xn(.85+f*.3,.35,1),g=fE(xn(d*y)),w=["COLD_INTELLIGENCE_ONLY","NO_HOT_EXECUTION"];return c||w.push("UNSUPPORTED_SIGNAL_TYPE"),d<r&&w.push("LOW_COVERAGE","NO_TRADE"),g<.5&&w.push("LOW_CONFIDENCE","NO_TRADE"),s==="pool"&&(ar(o.ageHours??o.poolAgeHours)??1/0)<24&&w.push("NEW_POOL_RISK","NO_TRADE"),f!==null&&f<0&&w.push("NEGATIVE_MARKOUT"),{id:a,type:s,score:h,confidence:g,coverage:d,contributions:l,flags:[...new Set(w)],noTrade:w.includes("NO_TRADE"),executionAllowed:!1}}).sort((o,i)=>i.score-o.score||i.confidence-o.confidence||o.id.localeCompare(i.id))}function HK(e={}){return Object.freeze({score(t,n=[],r={}){return EC(t,n,{...e,...r})}})}var mE=Object.freeze(["draft","shadow","confirm","armed","autonomous","halted"]),eTe=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}))),tTe=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}))),nTe=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}))),ld=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}))),rTe=[["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"]],ud=Object.freeze(rTe.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),oTe=[["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"]],fh=Object.freeze(oTe.map(([e,t])=>Object.freeze({id:e,description:t,signs:!1,broadcasts:!1}))),iTe=Object.freeze({autonomousOptIn:!1,requiresWalletConfirmation:!0,killSwitchRequired:!0,maxNotionalUsd:100,maxDailyLossUsd:10,chainAllowlist:Object.freeze(["ethereum"]),expiresAt:41024448e5});function jc({id:e,name:t,scannerName:n,scannerTool:r,scannerSkill:o,scannerArtifact:i,chainAllowlist:s}){return Object.freeze({id:e,name:t,mode:"draft",agents:Object.freeze([Object.freeze({id:"scanner",name:n,role:"scanner",runtime:"deterministic",soul:"Collect bounded public evidence with source times.",toolIds:Object.freeze([r]),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({...iTe,chainAllowlist:Object.freeze(s)})})}var jK=Object.freeze([jc({id:"hyperliquid-alpha",name:"Hyperliquid Alpha",scannerName:"Market Scanner",scannerTool:"market.scan",scannerSkill:"hyperliquid-markets",scannerArtifact:"market-evidence",chainAllowlist:["hyperliquid"]}),jc({id:"perp-market-breadth",name:"Perp Market Breadth",scannerName:"Breadth Scanner",scannerTool:"market.breadth",scannerSkill:"crypto-market-breadth",scannerArtifact:"breadth-evidence",chainAllowlist:["hyperliquid"]}),jc({id:"perp-technical-strategy",name:"Perp Technical Strategy",scannerName:"Perp Technical Scanner",scannerTool:"perp.indicators",scannerSkill:"perp-technical-analysis",scannerArtifact:"technical-evidence",chainAllowlist:["hyperliquid"]}),jc({id:"basket-relative-value",name:"Basket Relative Value",scannerName:"Basket Constructor",scannerTool:"basket.construct",scannerSkill:"basket-trading",scannerArtifact:"basket-evidence",chainAllowlist:["hyperliquid"]}),jc({id:"wallet-watch",name:"Wallet Watch",scannerName:"Wallet Monitor",scannerTool:"wallet.watch",scannerSkill:"wallet-monitoring",scannerArtifact:"wallet-flow",chainAllowlist:["ethereum","base"]}),jc({id:"evm-launch-radar",name:"EVM Launch Radar",scannerName:"Launch Scanner",scannerTool:"contract.read",scannerSkill:"contract-research",scannerArtifact:"contract-evidence",chainAllowlist:["ethereum","base","arbitrum"]}),jc({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 STe}from"node:crypto";import{randomBytes as sTe}from"node:crypto";var aTe=/^ses-[0-9a-f]{32}$/,cTe=/^(?:sign|broadcast|execute|transaction\.execute|wallet\.sign)$/i,lTe=/sign|broadcast|execute/i,uTe="team-history-truncated",zK=`
254
254
  [Message content truncated for durable storage.]`,dTe=200,pTe=512*1024,fTe=64*1024,mTe=48*1024;function dt(e){return String(e??"").trim()}function SC(e){return Buffer.byteLength(JSON.stringify(e),"utf8")}function hTe(e,t){let n=String(e??"");if(Buffer.byteLength(n,"utf8")<=t)return n;let r=0,o=n.length;for(;r<o;){let s=Math.ceil((r+o)/2);Buffer.byteLength(n.slice(0,s),"utf8")<=t?r=s:o=s-1}let i=n.slice(0,r);return new RegExp("\\p{Surrogate}$","u").test(i)&&(i=i.slice(0,-1)),i}function yTe(e){let t=dt(e?.text),n=Math.max(0,mTe-Buffer.byteLength(zK,"utf8")),r=Buffer.byteLength(t,"utf8")>n,o=Array.isArray(e?.artifacts)?e.artifacts:[],i=e?.generator&&typeof e.generator=="object"&&!Array.isArray(e.generator)?{kind:dt(e.generator.kind).slice(0,80),provider:dt(e.generator.provider).slice(0,120),model:dt(e.generator.model).slice(0,160)}:void 0;return{id:dt(e?.id).slice(0,200)||"message-compacted",sender:dt(e?.sender).slice(0,200)||"system",name:dt(e?.name).slice(0,200)||"Oracle",text:`${hTe(t,n)}${zK}`,state:dt(e?.state).slice(0,80)||"complete",createdAt:dt(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}:{},...!r&&o.length?{artifactPayloadTruncated:!0}:{}}}function gTe(e){let t=structuredClone(e);return SC(t)<=fTe?t:yTe(t)}function bTe(e){let t=0,n="";for(let r of e){if(r?.historyTruncated!==!0)continue;let o=Number(r.omittedMessages);Number.isSafeInteger(o)&&o>0&&(t+=o),n||(n=dt(r.createdAt))}return{omittedMessages:t,createdAt:n}}function wTe(e,t){return{id:uTe,sender:"system",name:"Oracle",text:`[Earlier team history omitted: ${e} ${e===1?"message":"messages"} pruned for durable storage.]`,state:"complete",createdAt:dt(t),artifacts:[],historyTruncated:!0,omittedMessages:e}}function VK(e,t={}){if(!e||typeof e!="object"||!Array.isArray(e.messages))throw new TypeError("Invalid team thread state");let n=Number.isSafeInteger(t.maxMessages)&&t.maxMessages>0?t.maxMessages:dTe,r=Number.isSafeInteger(t.maxBytes)&&t.maxBytes>0?t.maxBytes:pTe,o=bTe(e.messages),i=o.omittedMessages,s=e.messages.filter(u=>u?.historyTruncated!==!0).map(gTe),a=Number.isSafeInteger(t.dropOldest)&&t.dropOldest>0?Math.min(t.dropOldest,s.length):0;if(a>0&&(s=s.slice(a),i+=a),s.length>n){let u=s.length-n;s=s.slice(u),i+=u}let c=()=>({...e,messages:[...i>0?[wTe(i,o.createdAt||s[0]?.createdAt)]:[],...s]});for(;s.length>0&&SC(c())>r;)s=s.slice(1),i+=1;let l=c();if(SC(l)>r)throw new Error("team thread metadata exceeds durable size budget");return l}function AC(e=sTe(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 hE(e){return aTe.test(String(e??""))}function ETe(e){te(e);let t=dt(e?.type),n=Array.isArray(e?.actions)?e.actions:[];if(cTe.test(t)||n.some(r=>lTe.test(dt(r?.type))))throw new TypeError("Chat cannot sign, broadcast, or execute")}function mh(e,t,n,r="complete"){return{id:dt(e.id)||`message-${Date.now()}`,sender:t,name:n,text:dt(e.text),state:r,createdAt:dt(e.createdAt)||new Date().toISOString(),artifacts:[]}}function vC(e,t){if(ETe(t),!e||!hE(e.sessionId)||!Array.isArray(e.messages))throw new TypeError("Invalid team thread state");let n=[...e.messages];if(t.type==="message.user")n.push(mh(t,"user","You"));else if(t.type==="message.system")n.push(mh(t,"system","Oracle"));else if(t.type==="agent.offline"){let r=mh(t,dt(t.agentId),dt(t.name)||dt(t.agentId),"offline");r.offline=!0;let o=n.findIndex(i=>i.id===t.id&&i.sender===t.agentId);o>=0?n.splice(o,1,r):n.push(r)}else if(t.type==="agent.started")n.push(mh(t,dt(t.agentId),dt(t.name)||dt(t.agentId),"thinking"));else if(t.type==="agent.output"){let r=n.findIndex(i=>i.id===t.id&&i.sender===t.agentId),o=mh(t,dt(t.agentId),dt(t.name)||dt(t.agentId));o.fallback=t.generator?.kind==="rules",o.generator=t.generator?{...t.generator}:void 0,o.artifacts=t.artifact?[{...t.artifact}]:[],r>=0?n.splice(r,1,o):n.push(o)}else if(t.type==="artifact.prepared"){let r=n.findIndex(o=>o.id===t.messageId);if(r<0)throw new TypeError("Artifact target message was not found");n[r]={...n[r],artifacts:[...n[r].artifacts,{...t.artifact}]}}else throw new TypeError(`Unsupported team thread event: ${t.type}`);return VK({...e,messages:n})}var WK=2e3,ATe=/^[a-z0-9][a-z0-9._-]{0,63}$/,vTe=/^#[0-9a-fA-F]{6}$/,ITe=new Set(["deterministic","model","policy","operator"]),xTe=new Set(ud.map(({id:e})=>e)),kTe=new Set(fh.map(({id:e})=>e)),OTe=new Set(ld.map(({id:e})=>e)),_Te=/^p-[a-z0-9][a-z0-9_-]{0,62}$/,NTe=["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,TTe=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"]),CTe=new Set(TTe);function se(e){throw new TypeError(e)}function hh(e,t){(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)&&se(`${t} must be a plain object`)}function RTe(e){return String(e).toLowerCase().replace(/[^a-z0-9]/g,"")}function KK(e){let t=RTe(e);return t==="auth"||NTe.some(n=>t.includes(n))}function IC(e,t="team",n=new Set){if(e&&typeof e=="object"){n.has(e)&&se(`unsafe cyclic field at ${t}`),n.add(e);for(let[r,o]of Object.entries(e))KK(r)&&se(`forbidden secret-like field ${t}.${r}`),IC(o,`${t}.${r}`,n);n.delete(e)}}function ve(e){return e===null||typeof e=="string"||typeof e=="boolean"?e:typeof e=="number"?(Number.isFinite(e)||se("value must be finite"),e):Array.isArray(e)?e.map(ve):(hh(e,"value"),Object.fromEntries(Object.keys(e).sort().map(t=>(KK(t)&&se(`forbidden secret-like field ${t}`),[t,ve(e[t])]))))}function ds(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))ds(t);Object.freeze(e)}return e}function dd(e){return STe("sha256").update(JSON.stringify(ve(e))).digest("hex")}function ka(e,t,n=500){return(typeof e!="string"||!e.trim()||e.length>n)&&se(`${t} is invalid`),e}function $o(e,t){return ka(e,t,64),ATe.test(e)||se(`${t} is invalid`),e}function PTe(e){return(typeof e!="string"||!vTe.test(e))&&se("agent color is invalid"),e}function LTe(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))`,n=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(n)||new RegExp(String.raw`\b${t}\b`,"i").test(n)}function xC(e){return typeof e=="string"&&_Te.test(e)&&!yE.test(e)}function kC(e){return $o(e,"artifact kind"),CTe.has(e)||se(`artifact kind ${e} is not allowed`),e}function gE(e,{nowMs:t=Date.now(),mode:n="shadow"}={}){hh(e,"policy"),IC(e,"policy");let r=["autonomousOptIn","requiresWalletConfirmation","killSwitchRequired"];for(let i of r)typeof e[i]!="boolean"&&se(`policy.${i} must be boolean`);(!e.requiresWalletConfirmation||!e.killSwitchRequired)&&se("unsafe policy: wallet confirmation and kill switch are required");for(let i of["maxNotionalUsd","maxDailyLossUsd"])(!Number.isFinite(e[i])||e[i]<=0)&&se(`policy.${i} must be a positive finite cap`);(!Array.isArray(e.chainAllowlist)||!e.chainAllowlist.length)&&se("policy.chainAllowlist must be bounded");let o=e.chainAllowlist.map(i=>$o(i,"chain id"));return new Set(o).size!==o.length&&se("duplicate chain id"),(!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=t)&&se("policy expiry must be in the future"),n==="autonomous"&&!e.autonomousOptIn&&se("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 yh(e,{nowMs:t=Date.now()}={}){hh(e,"team"),IC(e);let n=e.kind===void 0?"pipeline":e.kind;n!=="pipeline"&&n!=="group"&&se("unsupported team kind");let r=n==="group";$o(e.id,"team id"),ka(e.name,"team name",120),mE.includes(e.mode)||se("unsupported team mode"),(!Array.isArray(e.agents)||!e.agents.length)&&se("agents must be non-empty");let o=new Set,i=e.agents.map((E,b)=>{hh(E,`agent ${b}`);let x=$o(E.id,"agent id");o.has(x)&&se(`duplicate agent id ${x}`),o.add(x),ka(E.name,"agent name",120);let k=r?ka(E.role,"agent role",120):$o(E.role,"agent role"),I=r&&E.color!==void 0?PTe(E.color):void 0;ITe.has(E.runtime)||se("invalid agent runtime");let v=ka(E.soul,"agent Soul",WK);LTe(v)&&se("unsafe Soul authority"),(!Array.isArray(E.toolIds)||!Array.isArray(E.skillIds))&&se("tool and skill IDs must be arrays");let S=E.toolIds.map(C=>($o(C,"tool id"),(!xTe.has(C)||yE.test(C))&&se(`forbidden tool ${C}`),C)),O=E.skillIds.map(C=>($o(C,"skill id"),(!kTe.has(C)&&!xC(C)||yE.test(C))&&se(`forbidden skill ${C}`),C));(new Set(S).size!==S.length||new Set(O).size!==O.length)&&se("duplicate tool or skill ID");let _=E.runtime==="model";return _?(ka(E.provider,"model provider",100),OTe.has(E.provider)||se("unsupported model provider"),ka(E.model,"model",160)):(E.provider!==void 0||E.model!==void 0)&&se("provider/model only allowed for model runtime"),!r&&E.role==="executor"&&E.runtime!=="operator"&&se("executor must use operator runtime"),!r&&E.runtime==="operator"&&E.role!=="executor"&&se("operator runtime is reserved for the executor"),r&&E.runtime==="operator"&&se("group chat agents cannot use operator runtime"),E.role!=="executor"&&S.some(C=>C==="intent.prepare"||C==="operator.handoff")&&se("executor tools require operator authority"),r&&(S.includes("intent.prepare")||S.includes("operator.handoff"))&&se("group chat agents cannot prepare operator actions"),{id:x,name:E.name,role:k,runtime:E.runtime,..._?{provider:E.provider,model:E.model}:{},soul:v,toolIds:S,skillIds:O,...I?{color:I}:{},...r&&E.packId!==void 0?{packId:$o(E.packId,"pack id")}:{},...r?{autoTools:E.autoTools!==!1}:{}}});if(r){(!Array.isArray(e.edges)||e.edges.length!==0)&&se("group chat edges must be empty");let E=ka(e.summary||"A focused agent group.","team summary",500),b=e.sessionId===void 0?AC():e.sessionId;hE(b)||se("group session id must use ses-hex format");let x=e.leadAgentId===void 0?i[0].id:$o(e.leadAgentId,"lead agent id");o.has(x)||se("lead agent is not a group member");let k=gE(e.policy,{nowMs:t,mode:e.mode}),I=ve({kind:"group",id:e.id,sessionId:b,name:e.name,summary:E,mode:e.mode,leadAgentId:x,agents:i,edges:[],policy:k});return ds({team:I,teamHash:dd(I),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}let s=i.filter(E=>E.role==="executor");s.length!==1&&se("exactly one executor operator is required");let a=s[0];(!a.toolIds.includes("intent.prepare")||!a.toolIds.includes("operator.handoff"))&&se("executor requires prepare-only handoff tools"),Array.isArray(e.edges)||se("edges must be an array");let c=new Set,l=new Map([...o].map(E=>[E,[]])),u=e.edges.map(E=>{hh(E,"edge"),$o(E.from,"edge source"),$o(E.to,"edge target");let b=kC(E.artifactKind);(!o.has(E.from)||!o.has(E.to))&&se("broken edge references unknown agent"),E.from===E.to&&se("cycle in team DAG");let x=`${E.from}\0${E.to}\0${b}`;return c.has(x)&&se("duplicate edge"),c.add(x),l.get(E.from).push(E.to),{from:E.from,to:E.to,artifactKind:b}}),d=new Set,p=new Set;function f(E){if(d.has(E)&&se("cycle in team DAG"),!p.has(E)){d.add(E);for(let b of l.get(E))f(b);d.delete(E),p.add(E)}}for(let E of o)f(E);l.get(a.id).length&&se("executor must be the terminal team agent");let m=E=>{let b=[E],x=new Set;for(;b.length;){let k=b.shift();if(k===a.id)return!0;x.has(k)||(x.add(k),b.push(...l.get(k)))}return!1};for(let E of o)m(E)||se(`agent ${E} is disconnected from executor`);let h=i.filter(E=>!u.some(b=>b.to===E.id));h.length!==1&&se("team pipeline requires exactly one root agent");for(let E of i){let b=u.filter(k=>k.to===E.id).length,x=u.filter(k=>k.from===E.id).length;(E.id===h[0].id?b!==0:b!==1)&&se("team pipeline requires exactly one incoming handoff per non-root agent"),(E.id===a.id?x!==0:x!==1)&&se("team pipeline requires exactly one outgoing handoff per non-executor agent")}let y=u.filter(E=>E.to===a.id);(y.length!==1||y[0].artifactKind!=="approved-intent")&&se("executor requires exactly one approved-intent input"),i.find(E=>E.id===y[0].from)?.runtime!=="policy"&&se("executor input must come from a policy agent");let w=gE(e.policy,{nowMs:t,mode:e.mode}),A=ve({id:e.id,name:e.name,mode:e.mode,agents:i,edges:u,policy:w});return ds({team:A,teamHash:dd(A),execution:{executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}})}var Fze=new Set(ud.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/intent\.prepare|operator\.handoff|sign|broadcast|execute/i.test(e))),qze=new Set(fh.filter(e=>!e.signs&&!e.broadcasts).map(e=>e.id).filter(e=>!/armed|execution|sign|broadcast/i.test(e))),Hze=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"]})]),jze=Object.freeze({toolIds:Object.freeze(["market.scan"]),skillIds:Object.freeze(["hyperliquid-markets"])});var Wze=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/}]);var Xze=64*1024;var c9e=new Set(ld.map(({id:e})=>e));var l9e=64*1024;var MTe=/^[a-z0-9][a-z0-9._:-]{0,127}$/i,DTe=/^[0-9a-f]{64}$/,BTe=/^evidence:sha256:[0-9a-f]{64}$/,UTe=new Set(["approved-intent","prepared-intent","prepared-basket"]),FTe=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),qTe=/^[A-Za-z0-9@:_./-]{1,64}$/;function bE(e,t){if(typeof e!="string"||!MTe.test(e))throw new TypeError(`${t} is invalid`);return e}function HTe(e,t){if(typeof e!="string"||!DTe.test(e))throw new TypeError(`${t} is invalid`);return e}function wE(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 GK(e,t,n){for(let r of Object.keys(e))if(!t.has(r))throw new TypeError(`${n}.${r} is not allowed`)}function zc(e,t,{allowZero:n=!1}={}){if(!Number.isFinite(e)||(n?e<0:e<=0))throw new TypeError(`${t} must be ${n?"non-negative":"positive"}`);let r=e*100;if(!Number.isSafeInteger(Math.round(r))||Math.abs(r-Math.round(r))>1e-8)throw new TypeError(`${t} must use exact USD cents`);return Math.round(r)}function jTe(e,t,{nowMs:n,expiresAt:r}){if(wE(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<=n||e.expiresAtMs>r)throw new TypeError("basket leg artifact expiry must fit the handoff TTL");if(wE(e.artifact,"basket leg artifact payload"),!FTe.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(zc(e.artifact.notionalUsd,"basket leg artifact notional")!==zc(t.notionalUsd,"basket leg notional"))throw new TypeError("basket leg artifact notional mismatch")}function zTe(e,t,n){let r=e.executionPlan;if(r===void 0){if(n.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(wE(r,"executionPlan"),GK(r,new Set(["atomic","partialFillRiskAcknowledged","legs"]),"executionPlan"),r.atomic!==!1)throw new TypeError("basket and perp plans must be explicitly non-atomic");if(!Array.isArray(r.legs))throw new TypeError("executionPlan.legs must be an array");let o=e.intentType==="basket"?2:1,i=e.intentType==="basket"?12:1;if(r.legs.length<o||r.legs.length>i)throw new TypeError(`${e.intentType} execution plan requires ${o}-${i} legs`);if(e.intentType==="basket"&&r.partialFillRiskAcknowledged!==!0)throw new TypeError("basket partial-fill risk must be acknowledged");if(e.intentType==="perp"&&typeof r.partialFillRiskAcknowledged!="boolean")throw new TypeError("perp partial-fill risk acknowledgement must be boolean");let s=new Set,a=0,c=0;for(let[l,u]of r.legs.entries()){if(wE(u,`executionPlan.legs[${l}]`),GK(u,new Set(["market","side","notionalUsd","weightBps","artifact"]),`executionPlan.legs[${l}]`),typeof u.market!="string"||!qTe.test(u.market))throw new TypeError("basket leg market is invalid");if(s.has(u.market))throw new TypeError(`duplicate basket market ${u.market}`);if(s.add(u.market),u.side!=="buy"&&u.side!=="sell")throw new TypeError("basket leg side must be buy or sell");if(a+=zc(u.notionalUsd,"basket leg notional"),!Number.isSafeInteger(u.weightBps)||u.weightBps<=0||u.weightBps>1e4)throw new TypeError("basket leg weight must be positive basis points");c+=u.weightBps,jTe(u.artifact,u,n)}if(c!==1e4)throw new TypeError("basket leg weights must sum to 10000 bps");if(a!==zc(e.notionalUsd,"intent notional"))throw new TypeError("basket aggregate notional must equal the exact leg sum");if(a>zc(t.maxNotionalUsd,"policy maxNotionalUsd"))throw new TypeError("basket aggregate notional exceeds policy cap")}function VTe(e,t,n){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");zc(e.notionalUsd,"intent notional"),zc(e.maxLossUsd,"intent max loss",{allowZero:!0}),zTe(e,t,n)}function EE(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 n=e.nowMs??Date.now();if(!Number.isSafeInteger(n))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 r=bE(e.teamId,"teamId"),o=HTe(e.teamHash,"teamHash");if(t.team.id!==r||t.teamHash!==o)throw new TypeError("handoff team snapshot mismatch");let i=bE(e.sourceAgentId,"sourceAgentId"),s=bE(e.targetAgentId,"targetAgentId"),a=kC(e.artifactKind);if(!t.team.edges.some(f=>f.from===i&&f.to===s&&f.artifactKind===a))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 c=e.evidenceRefs.map(f=>{if(typeof f!="string"||!BTe.test(f))throw new TypeError("evidence reference must be a SHA-256 content hash");return f});if(new Set(c).size!==c.length)throw new TypeError("duplicate evidence reference");let l=ve(e.payload),u=gE(t.team.policy,{nowMs:n,mode:t.team.mode}),d=n+e.ttlMs;if(d>u.expiresAt)throw new TypeError("handoff TTL exceeds policy expiry");UTe.has(a)&&VTe(l,u,{mode:t.team.mode,nowMs:n,expiresAt:d});let p={teamId:r,teamHash:o,runId:bE(e.runId,"runId"),sourceAgentId:i,targetAgentId:s,artifactKind:a,payload:l,payloadHash:dd(l),evidenceRefs:c,ttlMs:e.ttlMs,issuedAt:n,expiresAt:d,policy:u,policyHash:dd(u)};return ds(ve({...p,handoffHash:dd(p),executionAllowed:!1,backendSigner:!1,signingReady:!1,broadcastReady:!1,requiresOperatorConfirmation:!0}))}import{createHash as YK,randomUUID as WTe}from"node:crypto";function XK(e,t,n){let r=YK("sha256").update(JSON.stringify(t)).digest("hex");return`sha256:${YK("sha256").update(`${e}\0${r}\0${n}`).digest("hex")}`}function KTe(e){return{...ve({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:!1}),consumedHandoffHashes:[...e.consumedHandoffHashes]}}function GTe(e){return{...ve(e),consumedHandoffHashes:new Set(e?.consumedHandoffHashes||[]),confirmationPending:!1}}function OC(e){return{...ve({compiled:e.compiled,currentAgentId:e.currentAgentId,previousHandoffHash:e.previousHandoffHash,executionConsumed:e.executionConsumed,confirmationPending:e.confirmationPending}),consumedHandoffHashes:new Set(e.consumedHandoffHashes)}}var YTe=new Set(["approved-intent","prepared-intent","prepared-basket"]),XTe=Object.freeze(["executionAllowed","verified","trusted","status","riskChecks","observedAt","liveData","policy","policyHash","evidenceRefs","handoffHash","signed","broadcast","backendSigner","signingReady","broadcastReady","requiresOperatorConfirmation"]);function Oa(e,t,n){if(n>=t.compiled.team.policy.expiresAt)throw e.status="expired",e.updatedAt=n,new Error("team policy expired")}function JK(e,t){if(YTe.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 n of XTe)if(Object.hasOwn(t,n)||n in t)throw new TypeError("intent payload cannot carry authority or provenance claims")}}function QK(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 SE(e,t){e.clear();for(let[n,r]of t)e.set(n,r)}function ZK(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 n=e?.order;if(typeof n?.orderId=="string"&&/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(n.orderId)){if(n.status==="filled")return"confirmed";if(n.status==="rejected")return"failed"}return"unknown"}function eG({now:e=Date.now,storage:t,stateStore:n,tenantId:r="local-owner",executionAdapter:o,reconciliationAdapter:i}={}){let s=String(r||"").trim();if(!s)throw new TypeError("tenantId is required");let a=t??new Map,c=new Map,l=new Map,u=new Map,d=!n,p=null,f=0,m=Promise.resolve(),h=async(S,O)=>a.set(S,ve(O)),y=async S=>a.get(S),g=async()=>a instanceof Map?[...a.values()]:a.list(),w=S=>ds(ve(S));function A(S){let O=m.then(S,S);return m=O.catch(()=>{}),O}function E(){if(!(a instanceof Map)){if(n)throw new Error("durable team state requires map-backed definitions");return{definitions:null,runs:new Map([...c].map(([S,O])=>[S,ve(O)])),contexts:new Map([...l].map(([S,O])=>[S,OC(O)])),threads:new Map([...u].map(([S,O])=>[S,ve(O)]))}}return{definitions:new Map([...a].map(([S,O])=>[S,ve(O)])),runs:new Map([...c].map(([S,O])=>[S,ve(O)])),contexts:new Map([...l].map(([S,O])=>[S,OC(O)])),threads:new Map([...u].map(([S,O])=>[S,ve(O)]))}}function b(S,O){return{version:1,revision:O,tenantId:s,definitions:[...S.definitions.values()].map(ve),runs:[...S.runs.values()].map(ve),contexts:[...S.contexts.entries()].map(([_,C])=>({runId:_,context:KTe(C)})),threads:[...S.threads.values()].map(ve)}}function x(S){S.definitions&&SE(a,S.definitions),SE(c,S.runs),SE(l,S.contexts),SE(u,S.threads)}function k(S,{persist:O=!0}={}){return A(async()=>{let _=E(),C=S(_),T=f;if(O&&n){let N=f,P=await n.save(b(_,N),{expectedRevision:N});T=P.revision,_.threads=new Map((P.threads||[]).map(L=>[L.teamId,ve(L)]))}return x(_),f=T,C})}async function I(){d||(p||(p=(async()=>{let S=await n.load();if(S.tenantId!==s)throw new Error("team state tenant mismatch");if(!Number.isSafeInteger(S.revision)||S.revision<0)throw new Error("team state revision is invalid");if(!(a instanceof Map))throw new Error("durable team state requires map-backed definitions");let O={definitions:new Map,runs:new Map,contexts:new Map,threads:new Map};for(let T of S.definitions)O.definitions.set(T.team.id,ve(T));for(let T of S.runs)O.runs.set(T.id,ve(T));for(let T of S.contexts)O.contexts.set(T.runId,GTe(T.context));for(let T of S.threads||[])O.threads.set(T.teamId,ve(T));let _=!1;for(let T of O.runs.values()){if(!(T.status==="executing"||T.attempts?.some(L=>L.status==="submission-unknown")))continue;T.status="reconciliation-required",T.executionAllowed=!1,T.requiresOperatorConfirmation=!1,T.uncertainExecution=!0,T.updatedAt=e();let P=O.contexts.get(T.id);P&&(P.executionConsumed=!0,P.confirmationPending=!1),_=!0}let C=S.revision;if(_){let T=await n.save(b(O,C),{expectedRevision:C});C=T.revision,O.threads=new Map((T.threads||[]).map(N=>[N.teamId,ve(N)]))}x(O),f=C,d=!0})()),await p)}async function v(){if(typeof o?.status!="function")throw new Error("armed mode requires a local execution adapter");let S=await o.status();if(!S?.configured||!S?.reachable||S?.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 S}return Object.freeze({async save(S){if(await I(),!(a instanceof Map)){let _=await A(async()=>{let C=typeof S?.id=="string"?await y(S.id):null,T=S?.kind==="group"&&S.sessionId===void 0?C:null,N=T?.team?.kind==="group"?{...S,sessionId:T.team.sessionId}:S,P=yh(N,{nowMs:e()});if(C&&C.team?.kind!==P.team.kind)throw new Error("team kind cannot change");return await h(P.team.id,P),P});return w(_)}let O=await k(_=>{let C=typeof S?.id=="string"?_.definitions.get(S.id):null,T=S?.kind==="group"&&S.sessionId===void 0?C:null,N=T?.team?.kind==="group"?{...S,sessionId:T.team.sessionId}:S,P=yh(N,{nowMs:e()}),L=_.definitions.get(P.team.id);if(L&&L.team?.kind!==P.team.kind)throw new Error("team kind cannot change");return _.definitions.set(P.team.id,ve(P)),P.team.kind==="group"&&!_.threads.has(P.team.id)&&_.threads.set(P.team.id,{teamId:P.team.id,sessionId:P.team.sessionId,messages:[]}),_.definitions.get(P.team.id)});return w(O)},async list(){return await I(),w(await g())},async get(S){await I();let O=await y(S);return O===void 0?null:w(O)},async remove(S){await I();let O=String(S||"").trim();if(!(a instanceof Map)){if(typeof a.delete!="function")throw new Error("team storage does not support deletion");return w(await A(async()=>{let C=await y(O);if(!C||C.team?.kind!=="group")throw new Error(`unknown group ${O}`);if(await a.delete(O)===!1||await y(O)!==void 0)throw new Error(`team deletion failed ${O}`);u.delete(O);for(let[N,P]of c)P.teamId===O&&(c.delete(N),l.delete(N));return{deleted:!0,teamId:O}}))}let _=await k(C=>{let T=C.definitions.get(O);if(!T||T.team?.kind!=="group")throw new Error(`unknown group ${O}`);C.definitions.delete(O),C.threads.delete(O);for(let[N,P]of C.runs)P.teamId===O&&(C.runs.delete(N),C.contexts.delete(N));return{deleted:!0,teamId:O}});return w(_)},async listThreads(){return await I(),w([...u.values()])},async getThread(S){await I();let O=u.get(S);return O===void 0?null:w(O)},async appendThreadEvent(S,O){return await I(),await k(_=>{let C=_.definitions?.get(S);if(!C||C.team.kind!=="group")throw new Error(`unknown group ${S}`);let T=_.threads.get(S)||{teamId:S,sessionId:C.team.sessionId,messages:[]},N=vC(T,O);_.threads.set(S,{...N,teamId:S})}),w(u.get(S))},async getRun(S){await I();let O=c.get(S);return O===void 0?null:w(O)},async getTurnState(S,O){return await I(),A(()=>{let _=c.get(S),C=l.get(S);if(!_||!C)throw new Error(`unknown run ${S}`);if(_.teamId!==O)throw new Error("run team mismatch");if(_.status!=="running"&&_.status!=="shadowing")throw new Error(`run is not active: ${_.status}`);let T=e();if(Oa(ve(_),C,T),C.previousHandoffHash!==null){let N=_.steps.at(-1);if(!N||N.handoffHash!==C.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");QK(N,T)}return w({run:_,compiled:C.compiled,currentAgentId:C.currentAgentId,previousHandoffHash:C.previousHandoffHash,inbound:_.steps.at(-1)?.payload??null})})},async start(S){await I();let O=await y(S);if(!O)throw new Error(`unknown team ${S}`);if(O.team.kind==="group")throw new Error("group chats do not start pipeline runs");let _=ds(ve(O));_.team.mode==="armed"&&await v();let C=await k(T=>{let N=T.definitions?T.definitions.get(S):_;if(!N)throw new Error(`unknown team ${S}`);if(N.team.mode==="draft")throw new Error("draft team must be promoted before running");if(N.team.mode==="halted")throw new Error("team kill switch is active");let P=e();if(P>=N.team.policy.expiresAt)throw new Error("team policy expired");let L=N.team.mode==="armed",M=N.team.agents.find(z=>!N.team.edges.some(ee=>ee.to===z.id));if(!M)throw new Error("team pipeline has no root agent");let U={id:WTe(),tenantId:s,teamId:S,teamHash:N.teamHash,status:N.team.mode==="shadow"?"shadowing":"running",mode:N.team.mode,armed:L,startedAt:P,updatedAt:P,expiresAt:N.team.policy.expiresAt,maxSteps:N.team.edges.length,steps:[],receipts:[],attempts:[],executionAllowed:!1,backendSigner:L,signingReady:L,broadcastReady:L,requiresOperatorConfirmation:!0,signed:!1,broadcast:!1};return T.runs.set(U.id,U),T.contexts.set(U.id,{compiled:ds(ve(N)),currentAgentId:M.id,previousHandoffHash:null,consumedHandoffHashes:new Set,executionConsumed:!1,confirmationPending:!1}),U});return w(C)},async step(S,O){await I();let _=await k(C=>{let T=C.runs.get(S),N=C.contexts.get(S);if(!T||!N)throw new Error(`unknown run ${S}`);if(T.status==="halted")throw new Error("run is halted");if(T.status==="paused")throw new Error("run is paused");if(T.status!=="running"&&T.status!=="shadowing")throw new Error("run cannot step from its current state");let P=e();if(Oa(T,N,P),T.steps.length>=T.maxSteps)throw new Error("run step budget exhausted");if(O?.agentId!==N.currentAgentId)throw new TypeError("step agent is out of order");let L=N.compiled.team.edges.find(ee=>ee.from===O.agentId);if(!L||L.to!==O?.targetAgentId||L.artifactKind!==O?.artifactKind)throw new TypeError("artifact does not match the exact next team edge");let M,U=null;if(N.previousHandoffHash===null){if(O.inputHandoffHash!==void 0)throw new TypeError("root step cannot consume a prior handoff");M=O.evidenceRefs}else{if(O.inputHandoffHash!==N.previousHandoffHash)throw new TypeError("step must consume the exact prior handoff");if(N.consumedHandoffHashes.has(O.inputHandoffHash))throw new TypeError("handoff was already consumed");let ee=T.steps.at(-1);if(!ee||ee.handoffHash!==O.inputHandoffHash)throw new TypeError("step must consume the exact prior handoff");QK(ee,P),U=O.inputHandoffHash,M=[`evidence:sha256:${O.inputHandoffHash}`]}if(O.payload?.kind==="risk-decision"&&O.payload.status==="measured")throw new TypeError("measured risk evidence requires trusted runtime provenance");if(O.payload?.kind==="risk-decision"){if(O.payload.status!=="unknown")throw new TypeError("risk evidence status must be unknown");let ee=N.compiled.team.agents.find(G=>G.id===L.from);if(ee?.role!=="risk"||ee.runtime!=="policy")throw new TypeError("only the policy risk agent can block for unknown evidence");if(O.payload.executionAllowed!==!1||O.payload.executionPlan!==void 0||!Array.isArray(O.payload.riskChecks)||O.payload.riskChecks.length!==3)throw new TypeError("unknown risk evidence cannot assert approval or measured amounts");if(O.payload.notionalUsd!==null||O.payload.maxLossUsd!==null||O.payload.chainId!==null||O.payload.observedAt!==null||O.payload.liveData!=="unavailable"||O.payload.riskChecks.some(G=>G.pass!==!1||G.status!=="unknown"))throw new TypeError("unknown risk evidence cannot assert approval or measured amounts");return T.riskEvidence=ve(O.payload),T.status="risk-blocked",T.executionAllowed=!1,T.requiresOperatorConfirmation=!1,T.updatedAt=P,T}JK(L.artifactKind,O.payload);let z=EE({teamId:T.teamId,teamHash:T.teamHash,runId:S,sourceAgentId:L.from,targetAgentId:L.to,artifactKind:L.artifactKind,payload:O.payload,evidenceRefs:M,ttlMs:O.ttlMs,nowMs:P},{compiled:N.compiled});return U!==null&&N.consumedHandoffHashes.add(U),T.steps.push(z),T.updatedAt=P,N.currentAgentId=L.to,N.previousHandoffHash=z.handoffHash,L.to===N.compiled.team.agents.find(ee=>ee.role==="executor").id&&(T.status=T.mode==="armed"?"awaiting-confirmation":"prepared",T.preparedAt=P,T.mode!=="armed"&&(T.completedAt=P)),T});return w(_)},async confirm(S,O){await I();let _=await k(C=>{let T=C.runs.get(S),N=C.contexts.get(S);if(!T||!N)throw new Error(`unknown run ${S}`);if(T.status==="halted")throw new Error("run is halted");if(T.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state or was already executed");let P=e();Oa(T,N,P);let L=T.steps.at(-1);if(!L||L.artifactKind!=="approved-intent")throw new Error("approved intent handoff is required");if(P>=L.expiresAt)throw new Error("approved intent handoff expired");if(JK(L.artifactKind,L.payload),O?.handoffHash!==L.handoffHash)throw new TypeError("confirmation must bind the exact handoff hash");if(O?.operatorConfirmed!==!0||O?.sign!==!0||O?.broadcast!==!0)throw new TypeError("explicit confirm, sign, and broadcast instruction is required");if(N.executionConsumed||N.confirmationPending)throw new Error("approved intent is already executing or was already executed");return N.confirmationPending=!0,ve(L)},{persist:!1});try{await v();let C=_.payload?.executionPlan?.legs;if(!Array.isArray(C)||!C.length)throw new Error("approved intent has no executable legs");await k(N=>{let P=N.runs.get(S),L=N.contexts.get(S);if(!P||!L)throw new Error(`unknown run ${S}`);let M=e();if(Oa(P,L,M),P.status==="halted")throw new Error("run was halted before execution");if(P.status!=="awaiting-confirmation")throw new Error("run cannot confirm from its current state");if(!L.confirmationPending||L.executionConsumed)throw new Error("approved intent is already executing or was already executed");if(M>=_.expiresAt)throw new Error("approved intent handoff expired");L.executionConsumed=!0,P.status="executing",P.updatedAt=M});for(let[N,P]of C.entries()){let L=XK(s,P.artifact,N);await k(ee=>{let G=ee.runs.get(S),le=ee.contexts.get(S);if(!G||!le)throw new Error(`unknown run ${S}`);if(G.status==="halted")throw new Error("run was halted during sequential basket execution");if(G.status!=="executing")throw new Error("run cannot execute from its current state");let ke=e();if(Oa(G,le,ke),ke>=_.expiresAt)throw new Error("approved intent handoff expired during execution");G.attempts[N]={legIndex:N,idempotencyKey:L,status:"submission-unknown",submittedAt:ke},G.updatedAt=ke});let M=await o.executeConfirmedArtifact(ve(P.artifact),{tenantId:s,runId:S,handoffHash:_.handoffHash,idempotencyKey:L,legIndex:N,legCount:C.length});await k(ee=>{let G=ee.runs.get(S);if(!G)throw new Error(`unknown run ${S}`);let le=G.attempts[N];if(!le||le.idempotencyKey!==L)throw new Error("execution attempt state changed before receipt persistence");le.status="receipt-recorded",le.receipt=ve(M),le.receivedAt=e(),G.receipts.push(ve(M)),G.updatedAt=le.receivedAt});let U=c.get(S),z=l.get(S);if(U?.status==="halted")throw new Error("run was halted during sequential basket execution");if(!U||!z)throw new Error(`unknown run ${S}`);if(Oa(ve(U),OC(z),U.updatedAt),U.updatedAt>=_.expiresAt)throw new Error("approved intent handoff expired during execution")}let T=await k(N=>{let P=N.runs.get(S),L=N.contexts.get(S);if(!P||!L)throw new Error(`unknown run ${S}`);if(P.status==="halted")throw new Error("run was halted during sequential basket execution");if(P.status!=="executing")throw new Error("run cannot complete from its current state");if(Oa(P,L,P.updatedAt),P.updatedAt>=_.expiresAt)throw new Error("approved intent handoff expired during execution");return P.status="completed",P.executionAllowed=!1,P.requiresOperatorConfirmation=!1,P.signed=!0,P.broadcast=!0,P.completedAt=e(),P.updatedAt=P.completedAt,P});return w(T)}catch(C){if(l.get(S)?.executionConsumed)try{await k(N=>{let P=N.runs.get(S),L=N.contexts.get(S);if(!P||!L)return;let M=P.attempts.some(U=>U.status==="submission-unknown");P.status!=="halted"&&P.status!=="expired"&&(P.status=M?"reconciliation-required":"failed"),P.executionAllowed=!1,P.uncertainExecution=M,P.partialExecution=P.receipts.length>0,P.error=C instanceof Error?C.message:"local execution failed",P.updatedAt=e()})}catch{}throw C}finally{await k(C=>{let T=C.contexts.get(S);T&&(T.confirmationPending=!1)},{persist:!1})}},async reconcile(S){if(typeof S!="string"||!/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(S))throw new TypeError("runId is invalid");let O=await A(async()=>{if(n){let M=await n.load();if(M.tenantId!==s)throw new Error("team state tenant mismatch");return ve({run:M.runs.find(U=>U.id===S)??null,revision:M.revision})}return ve({run:c.get(S)??null,revision:f})}),_=O.run;if(!_||_.tenantId!==s)throw new Error(`unknown run ${S}`);let C=_.steps.at(-1),T=C?.payload?.executionPlan?.legs??[],N=[];for(let M of _.attempts||[]){let U=T[M.legIndex],z={tenantId:s,runId:S,handoffHash:C?.handoffHash??null,idempotencyKey:M.idempotencyKey,legIndex:M.legIndex,tradeId:U?.artifact?.tradeId??null},ee="unknown",G="unavailable",le=null,ke="lookup-unavailable",kn=U&&Number.isSafeInteger(M.legIndex)&&M.legIndex>=0&&M.idempotencyKey===XK(s,U.artifact,M.legIndex);if(kn&&M.status==="receipt-recorded"&&Number.isSafeInteger(M.receivedAt)&&M.receivedAt>=M.submittedAt&&M.receivedAt<=e()&&(ee=ZK(M.receipt),ee!=="unknown"&&(G="stored-receipt",le=M.receivedAt)),kn&&ee==="unknown"){for(let Ft of["lookupReceipt","lookupOrder"])if(typeof i?.[Ft]=="function")try{let Y=await i[Ft](w(z));if(Y?.available===!1){["disabled","hosted","unconfigured","lookup-unavailable","identity-mismatch","invalid-evidence"].includes(Y.reason)&&(ke=Y.reason);break}if(!Y||Object.keys(z).some(B=>Y[B]!==z[B])||!Number.isSafeInteger(Y.observedAt)||Y.observedAt<M.submittedAt||Y.observedAt>e())continue;if(ee=ZK(Ft==="lookupReceipt"?{receipt:Y.receipt}:{order:Y.order}),ee!=="unknown"){G=Ft,le=Y.observedAt;break}}catch{}}N.push({...z,status:ee,source:G,observedAt:le,reason:ee==="unknown"?ke:null})}let P=Math.max(0,T.length-N.length),L=!N.length||P>0||N.some(M=>M.status==="unknown");return w({runId:S,tenantId:s,runStatus:_.status,revision:O.revision,readOnly:!0,executionAllowed:!1,recoveryRequired:L,status:L?"reconciliation-required":"reconciled",attempts:N,unattemptedLegs:P})},async pause(S){await I();let O=await k(_=>{let C=_.runs.get(S);if(!C)throw new Error(`unknown run ${S}`);if(C.status!=="running"&&C.status!=="shadowing")throw new Error("only an active run can be paused");return C.resumeStatus=C.status,C.status="paused",C.updatedAt=e(),C});return w(O)},async resume(S){await I();let O=await k(_=>{let C=_.runs.get(S),T=_.contexts.get(S);if(!C||!T)throw new Error(`unknown run ${S}`);if(C.status!=="paused")throw new Error("only a paused run can be resumed");let N=e();return Oa(C,T,N),C.status=C.resumeStatus==="shadowing"?"shadowing":"running",delete C.resumeStatus,C.updatedAt=N,C});return w(O)},async halt(S){await I();let O=await k(_=>{let C=_.runs.get(S);if(!C)throw new Error(`unknown run ${S}`);return C.status="halted",delete C.resumeStatus,C.updatedAt=e(),C});return w(O)}})}import{closeSync as v9e,constants as QTe,fchmodSync as I9e,fstatSync as x9e,fsyncSync as k9e,linkSync as O9e,lstatSync as _9e,mkdirSync as N9e,openSync as T9e,readFileSync as C9e,readlinkSync as R9e,realpathSync as P9e,renameSync as L9e,rmSync as $9e,writeFileSync as M9e}from"node:fs";var U9e=QTe.O_NOFOLLOW??0,F9e=16*1024*1024,q9e=15*1024*1024;function ZTe(e){if(Lt(e,{required:["status"],optional:["confirmations","finalizedTag","checkpoint"]},"attempt finality evidence"),!cT.includes(e.status))throw new TypeError("attempt finality evidence.status is unknown");if(["confirmations","finalizedTag","checkpoint"].filter(r=>e[r]!=null).length>1)throw new TypeError("attempt finality evidence has conflicting rule fields");let n={status:e.status};return e.confirmations!=null&&(n.confirmations=Cc(e.confirmations,"attempt finality evidence.confirmations",{positive:!0})),e.finalizedTag!=null&&(n.finalizedTag=ei(e.finalizedTag,"attempt finality evidence.finalizedTag",80)),e.checkpoint!=null&&(n.checkpoint=ei(e.checkpoint,"attempt finality evidence.checkpoint",80)),n}function eCe(e){return Lt(e,{required:["number","hash"]},"attempt block identity"),{number:vn(e.number,"attempt block identity.number"),hash:Yu(e.hash,"attempt block identity.hash")}}function tCe(e){Lt(e,{required:["number","hash"],optional:["parent"]},"attempt slot identity");let t=vn(e.number,"attempt slot identity.number"),n={number:t,hash:tt(e.hash,"attempt slot identity.hash",160)};if(e.parent!=null&&(n.parent=vn(e.parent,"attempt slot identity.parent"),BigInt(n.parent)>=BigInt(t)))throw new TypeError("attempt slot identity.parent must precede the slot");return n}function nCe(e){return Lt(e,{required:["id"]},"attempt checkpoint identity"),{id:tt(e.id,"attempt checkpoint identity.id",200)}}function tG(e){if(Zo(e,"external attempt fact"),Lt(e,{required:["external","attemptId","idempotencyKey","family","chainId","observer","observedAt","finality"],optional:["factVersion","factId","providerId","endpointId","block","slot","checkpoint"]},"external attempt fact"),e.external!==!0)throw new TypeError("external attempt fact requires external:true");if(e.factVersion!=null&&e.factVersion!==1)throw new TypeError("unsupported external attempt fact version");let t=["providerId","endpointId"].filter(s=>e[s]!=null);if(t.length!==1)throw new TypeError("external attempt fact requires exactly one providerId or endpointId");let n=["block","slot","checkpoint"].filter(s=>e[s]!=null);if(n.length!==1)throw new TypeError("external attempt fact requires exactly one block, slot, or checkpoint identity");let r=qm({family:e.family,chainId:e.chainId},"external attempt chain");if(r.family==="evm"&&n[0]!=="block")throw new TypeError("EVM external attempt facts require a block identity");let o={factVersion:1,external:!0,attemptId:tt(e.attemptId,"external attempt fact.attemptId",200),idempotencyKey:tt(e.idempotencyKey,"external attempt fact.idempotencyKey",200),...r,[t[0]]:ei(e[t[0]],`external attempt fact.${t[0]}`,120),observer:tt(e.observer,"external attempt fact.observer",160),observedAt:Cc(e.observedAt,"external attempt fact.observedAt"),[n[0]]:n[0]==="block"?eCe(e.block):n[0]==="slot"?tCe(e.slot):nCe(e.checkpoint),finality:ZTe(e.finality)},i=Rc("external_attempt_v1",o);if(e.factId!=null&&e.factId!==i)throw new TypeError("external attempt fact factId mismatch");return{...o,factId:i}}function _C(e){return yt(tG(e))}function nG(e){let t=tG(e);return t.block?yt({kind:"block",...t.block}):t.slot?yt({kind:"slot",...t.slot}):yt({kind:"checkpoint",...t.checkpoint})}var rCe=Object.freeze(["UNKNOWN","INCLUDED","FINAL","ORPHANED"]);var oCe=Object.freeze(["cancel","revoke","reverse"]);function iCe(e){if(Lt(e,{required:["kind","number","hash"],optional:["parent"]},"approval pinned lineage"),e.kind!=="block"&&e.kind!=="slot")throw new TypeError("approval pinned lineage.kind must be block or slot");let t={kind:e.kind,number:vn(e.number,"approval pinned lineage.number"),hash:e.kind==="block"?Yu(e.hash,"approval pinned lineage.hash"):tt(e.hash,"approval pinned lineage.hash",160)};if(e.parent!=null){if(e.kind!=="slot")throw new TypeError("approval pinned lineage.parent is only valid for a slot");t.parent=vn(e.parent,"approval pinned lineage.parent")}return t}function sCe(e,t=!1){Lt(e,{required:["approvalId","approvalDigest","previewId","pinnedLineage"],optional:["status"]},"run approval");let n=t?"INVALIDATED_REORG":"ACTIVE";if(e.status!=null&&e.status!==n)throw new TypeError("run approval status conflicts with reorg state");return{approvalId:tt(e.approvalId,"run approval.approvalId",200),approvalDigest:tt(e.approvalDigest,"run approval.approvalDigest",200),previewId:tt(e.previewId,"run approval.previewId",200),pinnedLineage:iCe(e.pinnedLineage),status:n}}function aCe(e,t){if(Lt(e,{required:["attemptId","idempotencyKey"],optional:["status","lineage","factIds"]},`run attempt ${t}`),e.status!=null&&!rCe.includes(e.status))throw new TypeError(`run attempt ${t}.status is unknown`);if(e.factIds!=null&&(!Array.isArray(e.factIds)||e.factIds.some(n=>typeof n!="string")))throw new TypeError(`run attempt ${t}.factIds must be an array of identifiers`);return{attemptId:tt(e.attemptId,`run attempt ${t}.attemptId`,200),idempotencyKey:tt(e.idempotencyKey,`run attempt ${t}.idempotencyKey`,200)}}function TC(e,t=!1){Zo(e,"reconciliation run");let n=["runId","intentId","family","chainId","railIdentity","approval","attempts"],r=["reconciliationVersion","evidence","facts","status","terminal","freshApprovalRequired","nextAction","effects","custody","execution"];if(Lt(e,{required:t?[...n,...r]:n,optional:t?[]:r},"reconciliation run"),t){if(e.reconciliationVersion!==1)throw new TypeError("unsupported reconciliation run version");if(e.custody!=="none"||e.execution!=="observe-only")throw new TypeError("reconciliation run crosses the custody or execution boundary");if(!Array.isArray(e.effects)||e.effects.length!==0)throw new TypeError("reconciliation runs cannot carry submission effects");if(typeof e.freshApprovalRequired!="boolean")throw new TypeError("run freshApprovalRequired must be boolean")}let o=qm({family:e.family,chainId:e.chainId},"run chain");if(!Array.isArray(e.attempts)||e.attempts.length===0)throw new TypeError("run attempts must be a non-empty array");let i=e.attempts.map(aCe);if(new Set(i.map(a=>a.attemptId)).size!==i.length)throw new TypeError("run attemptId values must be unique");let s=t?e.freshApprovalRequired:!1;return{runId:tt(e.runId,"reconciliation run.runId",200),intentId:tt(e.intentId,"reconciliation run.intentId",200),...o,railIdentity:tt(e.railIdentity,"reconciliation run.railIdentity",200),approval:sCe(e.approval,s),attempts:i,existingEvidence:t?e.evidence:[],forcedOrphan:s}}function NC(e,t,n={}){let r=t.block?"block":t.slot?"slot":"checkpoint",o={reconciliationFactVersion:1,type:e,external:!0,attemptId:t.attemptId,idempotencyKey:t.idempotencyKey,family:t.family,chainId:t.chainId,...t.providerId?{providerId:t.providerId}:{endpointId:t.endpointId},observer:t.observer,observedAt:t.observedAt,[r]:t[r],finality:t.finality,sourceFactId:t.factId,...n};return{...o,factId:Rc(`reconciliation_${e}_v1`,o)}}function cCe(e,t){return at(e)===at(t)}function lCe(e,t,n,r){let o=[...t].sort((c,l)=>c.observedAt-l.observedAt||c.factId.localeCompare(l.factId)),i=null,s="UNKNOWN",a=[];for(let c of o){let l=jm(n,c.finality);if(l.status==="UNKNOWN")continue;let u=nG(c);if(i&&!cCe(i,u)){s="ORPHANED",a.push(NC("orphaned",c,{reason:"REORG_LINEAGE_CHANGED",reorg:{oldLineage:i,newLineage:u}}));break}i||(i=u,s="INCLUDED",a.push(NC("included",c))),l.status==="FINAL"&&s!=="FINAL"&&(s="FINAL",a.push(NC("final",c)))}return r&&(s="ORPHANED"),{attempt:{...e,status:s,lineage:i,factIds:o.map(c=>c.factId)},facts:a}}function uCe(e){if(!Array.isArray(e))throw new TypeError("reconciliation evidence must be an array");let t=new Map;for(let n of e){let r=_C(n),o=t.get(r.factId);if(o&&at(o)!==at(r))throw new TypeError(`conflicting external attempt fact ${r.factId}`);t.set(r.factId,r)}return[...t.values()].sort((n,r)=>n.factId.localeCompare(r.factId))}function rG(e,t,n){let r=uCe([...e.existingEvidence,...t]),o=new Map(e.attempts.map(d=>[d.attemptId,d]));for(let d of r){let p=o.get(d.attemptId);if(!p)throw new TypeError(`external attempt fact names unknown attempt ${d.attemptId}`);if(d.idempotencyKey!==p.idempotencyKey)throw new TypeError(`external attempt fact idempotencyKey conflicts for ${d.attemptId}`);if(d.family!==e.family||d.chainId!==e.chainId)throw new TypeError(`external attempt fact chain conflicts for ${d.attemptId}`)}let i=Hm(n,{family:e.family,chainId:e.chainId}),s=e.attempts.map(d=>lCe(d,r.filter(p=>p.attemptId===d.attemptId),i,e.forcedOrphan)),a=s.map(d=>d.attempt),c=s.flatMap(d=>d.facts).sort((d,p)=>d.observedAt-p.observedAt||d.factId.localeCompare(p.factId)),l=e.forcedOrphan||a.some(d=>d.status==="ORPHANED"),u="UNKNOWN";return l?u="ORPHANED":a.every(d=>d.status==="FINAL")?u="FINAL":a.some(d=>d.status==="INCLUDED"||d.status==="FINAL")&&(u="INCLUDED"),yt({reconciliationVersion:1,runId:e.runId,intentId:e.intentId,family:e.family,chainId:e.chainId,railIdentity:e.railIdentity,approval:{...e.approval,status:l?"INVALIDATED_REORG":"ACTIVE"},attempts:a,evidence:r,facts:c,status:u,terminal:l,freshApprovalRequired:l,nextAction:l?"PREVIEW_AND_APPROVAL_REQUIRED":"WAIT_FOR_EXTERNAL_EVIDENCE",effects:[],custody:"none",execution:"observe-only"})}function dCe(e){let t=TC(e,!1);return rG(t,[],{policyVersion:1,rules:[]})}function pCe({priorRun:e,evidence:t,finalityPolicy:n}={}){let r=TC(e,!0);return rG(r,t,n)}function fCe(e,t,n){if(Zo(t,"compensation action"),e==="cancel"){if(n.family!=="evm")throw new TypeError("cancel compensation is only defined for EVM runs");Lt(t,{required:["chainId","from","nonce"]},"cancel compensation action");let i=vn(t.chainId,"cancel compensation action.chainId",{positive:!0});if(i!==n.chainId)throw new TypeError("cancel compensation chainId conflicts with the run");let s=ga(t.from,"cancel compensation action.from");return{chainId:i,from:s,to:s,nonce:vn(t.nonce,"cancel compensation action.nonce"),value:"0",data:"0x"}}if(e==="revoke"){if(n.family!=="evm")throw new TypeError("revoke compensation is only defined for EVM runs");Lt(t,{required:["chainId","owner","token","spender"]},"revoke compensation action");let i=vn(t.chainId,"revoke compensation action.chainId",{positive:!0});if(i!==n.chainId)throw new TypeError("revoke compensation chainId conflicts with the run");return{chainId:i,owner:ga(t.owner,"revoke compensation action.owner"),token:ga(t.token,"revoke compensation action.token"),spender:ga(t.spender,"revoke compensation action.spender"),amount:"0"}}Lt(t,{required:["chainId","from","to","asset","amount"]},"reverse compensation action");let r=n.family==="evm"?vn(t.chainId,"reverse compensation action.chainId",{positive:!0}):tt(t.chainId,"reverse compensation action.chainId",80,{lower:!0});if(r!==n.chainId)throw new TypeError("reverse compensation chainId conflicts with the run");let o=(i,s)=>n.family==="evm"?ga(i,s):tt(i,s,200);return{chainId:r,from:o(t.from,"reverse compensation action.from"),to:o(t.to,"reverse compensation action.to"),asset:tt(t.asset,"reverse compensation action.asset",160),amount:vn(t.amount,"reverse compensation action.amount",{positive:!0})}}function mCe({run:e,kind:t,newIntentId:n,reason:r,action:o}={}){let i=TC(e,!0);if(!i.forcedOrphan)throw new TypeError("compensation requires an orphaned run and fresh approval");if(!oCe.includes(t))throw new TypeError("compensation kind must be cancel, revoke, or reverse");let s=tt(n,"compensation newIntentId",200);if(s===i.intentId)throw new TypeError("compensation requires a new intentId");let a=fCe(t,o,i),c={intentVersion:1,intentId:s,kind:"compensation",compensationKind:t,causedByRunId:i.runId,reason:tt(r,"compensation reason",500),action:a};return yt({proposalVersion:1,proposalId:Rc("compensation_proposal_v1",c),intent:c,mode:"prepare-only",previewId:null,approvalId:null,approvalDigest:null,approvalStatus:"REQUIRED",autoApproved:!1,effects:[],custody:"none"})}var bVe=Object.freeze(["evm","erc4337","solver","bridge","schedule","notification"]);function hCe(e,t="chainId"){return vn(e,t,{positive:!0})}function yCe(e,t){let n=Rc(`rail_${e}_v1`,{rail:e,components:t});return yt({identityVersion:1,rail:e,idempotencyKey:n,components:t})}function gCe(e,t,n){for(let r of t)e[r]!=null&&vn(e[r],`${n}.${r}`)}function bCe(e){Zo(e,"EVM identity");let t=["gasPrice","maxFeePerGas","maxPriorityFeePerGas","txHash"];return Lt(e,{required:["chainId","from","nonce"],optional:t},"EVM identity"),gCe(e,t.slice(0,3),"EVM identity"),e.txHash!=null&&Yu(e.txHash,"EVM identity.txHash"),yCe("evm",{chainId:hCe(e.chainId),from:ga(e.from,"EVM identity.from"),nonce:vn(e.nonce,"EVM identity.nonce")})}import{mkdir as wCe,chmod as AE,readFile as ECe,rename as SCe,writeFile as ACe}from"node:fs/promises";import{homedir as vCe}from"node:os";import{dirname as oG,join as CC}from"node:path";import ICe from"sql.js";var xE=Object.freeze(["project","entity","source","thesis","strategy","simulation","prepared_action","receipt","position"]),xCe=new Set(xE),kCe=new Set(xE.slice(0,-1).map((e,t)=>`${e}:${xE[t+1]}`)),sG=CC(process.env.ORACLE_CONFIG_DIR||CC(vCe(),".config","oracle"),"workspace"),aG=CC(sG,"artifacts.sqlite");function kE(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(kE).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${kE(e[t])}`).join(",")}}`}function iG(e){if(!xCe.has(e))throw new TypeError(`unknown artifact type: ${e}`);return e}function vE(e){let t=[];for(;e.step();)t.push(e.getAsObject());return e.free(),t}function IE(e){return e?{id:e.id,type:e.type,createdAt:e.created_at,data:JSON.parse(e.data_json)}:null}async function cG(e={}){let t=e.path||aG,n=e.readOnly===!0;n||(await wCe(oG(t),{recursive:!0,mode:448}),await AE(oG(t),448));let r;try{r=await ECe(t)}catch(u){if(u.code!=="ENOENT")throw u}let o=await ICe(e.sqlJs||{}),i=r?new o.Database(r):new o.Database;i.run(`
255
255
  PRAGMA foreign_keys=ON;
256
256
  CREATE TABLE IF NOT EXISTS artifacts (