@oracle-agent/oracle 0.35.21 → 0.35.22
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/README.md +24 -1
- package/dist/agent-lifecycle.mjs +3 -0
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +36 -36
- package/dist/bin/oracle-mev-arb-shadow.mjs +4 -4
- package/dist/bin/oracle-mev-shadow.mjs +6 -6
- package/dist/bin/oracle-route.mjs +11 -11
- package/dist/bin/oracle-scan.mjs +15 -15
- package/dist/bin/oracle.mjs +19 -10
- package/dist/cli/commands/chat.mjs +1 -1
- package/dist/cli/commands/context.mjs +16 -0
- package/dist/cli/commands/doctor.mjs +5 -5
- package/dist/cli/commands/eval.mjs +89 -89
- package/dist/cli/commands/lifecycle.mjs +17 -0
- package/dist/cli/commands/model.mjs +1 -1
- package/dist/cli/commands/quickstart.mjs +5 -5
- package/dist/cli/commands/sign.mjs +1 -1
- package/dist/cli/commands/signer.mjs +22 -22
- package/dist/cli/commands/snipe.mjs +4 -4
- package/dist/cli/commands/swap.mjs +4 -4
- package/dist/cli/commands/venues.mjs +2 -2
- package/dist/context-graph.mjs +3 -0
- package/dist/data/desk-data.mjs +34 -34
- package/dist/data/providers/lp-destination-discovery.mjs +6 -0
- package/dist/data/providers/lp-liquidity-ranker.mjs +1 -0
- package/dist/index.mjs +50 -48
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/runtime.mjs +1 -1
- package/dist/router/index.mjs +3 -3
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/scanner/index.mjs +4 -4
- package/dist/tenant-rbac.mjs +1 -1
- package/dist/workflow-telemetry.mjs +1 -1
- package/package.json +5 -1
- package/public/eval-report.json +1 -1
- package/public/oracle-splash/brand/liquidlaunch.webp +0 -0
- package/public/oracle-splash/brand/markets.webp +0 -0
- package/public/oracle-splash/brand/motion.webp +0 -0
- package/public/oracle-splash/brand/nest.webp +0 -0
- package/public/oracle-splash/brand/outcome.webp +0 -0
- package/public/oracle-splash/brand/silhouette.webp +0 -0
- package/public/oracle-splash/brand/tradexyz.webp +0 -0
- package/public/oracle-splash/index.html +9 -9
- package/server.json +2 -2
|
@@ -8,7 +8,7 @@ ${JSON.stringify(r??[])}`}async function Kv(e,t,r){return Fe(e,{method:"POST",bo
|
|
|
8
8
|
`)){let r=t.match(/^\s*OPENSEA_API_KEY\s*=\s*(.+)\s*$/);if(r)return r[1].replace(/^["']|["']$/g,"").trim()}}catch{}return""}function hl(e={}){return e.apiKey?e.apiKey:e.allowAmbientCredentials===!1||e.allowDiskCredentials===!1?e.env?.OPENSEA_API_KEY||e.env?.OPEN_SEA_API_KEY||"":e.env?.OPENSEA_API_KEY||process.env.OPENSEA_API_KEY||process.env.OPEN_SEA_API_KEY||Ok()}function Xm(e={}){return eo({provider:"opensea",defaultUrl:vk,hosts:["api.opensea.io","testnets-api.opensea.io"],url:e.baseUrl||process.env.OPENSEA_API_URL})}function Qm(e={}){return Xm(e).baseUrl}function Zm(e={}){return un({accept:"application/json"},{"x-api-key":hl(e)},Xm(e).trusted)}function Tk(e){let t=String(e||"ethereum").trim().toLowerCase();if(!_k.has(t))throw new Error(`opensea: unsupported account chain ${t}`);return t}function Ym(e,t="address"){try{return Ek(String(e||"").trim().toLowerCase())}catch{throw new Error(`opensea: invalid ${t}`)}}function eh(e,t=null){let r=String(e||"").trim();if(!r)throw new Error("opensea: account address required");if(t&&!Ik.has(t)||!t&&/^0x[0-9a-fA-F]{40}$/.test(r))return Ym(r,"account address");if(!/^[1-9A-HJ-NP-Za-km-z]{32,64}$/.test(r))throw new Error("opensea: invalid account address");return r}function Ck(e={},t,r){return{chain:t,owner:r,contract:e.contract||null,tokenId:e.identifier==null?null:String(e.identifier),tokenStandard:e.token_standard||null,collection:e.collection||null,name:e.name||null,description:e.description||null,imageUrl:e.display_image_url||e.image_url||e.original_image_url||null,originalImageUrl:e.original_image_url||e.image_url||null,animationUrl:e.display_animation_url||e.original_animation_url||null,metadataUrl:e.metadata_url||null,marketplaceUrl:e.opensea_url||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,spam:e.is_disabled===!0,disabled:e.is_disabled===!0,nsfw:e.is_nsfw===!0,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"OpenSea account inventory does not expose trustworthy per-item acquisition cost"}}}async function gl(e={},t={}){if(!hl(t))throw new Error("OPENSEA_API_KEY required");let r=Tk(e.chain),n=eh(e.address||e.owner,r),o=Math.min(Math.max(Number(e.pageSize??e.limit??200)||200,1),200),i=Math.min(Math.max(Number(e.maxPages??5)||5,1),25),s=[],a=e.next?String(e.next):null,c=0;do{let u=new URL(`${Qm(t)}/chain/${encodeURIComponent(r)}/account/${encodeURIComponent(n)}/nfts`);u.searchParams.set("limit",String(o)),e.collection&&u.searchParams.set("collection",String(e.collection)),a&&u.searchParams.set("next",a);let d=await Fe(u.toString(),{headers:Zm(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});for(let f of Array.isArray(d?.nfts)?d.nfts:[])s.push(Ck(f,r,n));a=d?.next?String(d.next):null,c+=1}while(a&&c<i);return{provider:"opensea-nft",source:"opensea-account-inventory",chain:r,owner:n,count:s.length,pages:c,complete:!a,next:a,nfts:s,exec:!1,readOnly:!0}}async function th(e={},t={}){if(!hl(t))throw new Error("OPENSEA_API_KEY required");let r=eh(e.address||e.owner),n=await Fe(`${Qm(t)}/account/${encodeURIComponent(r)}/pnl`,{headers:Zm(t),fetchImpl:t.fetchImpl,timeoutMs:t.timeoutMs??2e4});return{provider:"opensea-nft",source:"opensea-indexed-account-pnl",address:r,scope:"OpenSea-indexed account trading PnL across supported currencies, not per-item NFT cost basis",methodology:"provider-indexed",realizedPnlUsd:n?.realized_pnl_usd??null,unrealizedPnlUsd:n?.unrealized_pnl_usd??null,totalPnlUsd:n?.total_pnl_usd??null,netInvestedUsd:n?.net_invested_usd??null,currentValueUsd:n?.current_value_usd??null,returnPercentage:n?.return_percentage??null,itemLevelPnlAvailable:!1,raw:n,exec:!1,readOnly:!0}}var vk,kk,FB,qB,Ak,_k,Ik,UB,jB,HB,zB,rh=L(()=>{Ge();Zo();Tr();Jm();vk="https://api.opensea.io/api/v2",kk="fulfillAdvancedOrder(((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 totalOriginalConsiderationItems) parameters,uint120 numerator,uint120 denominator,bytes signature,bytes extraData) advancedOrder,(uint256 orderIndex,uint8 side,uint256 index,uint256 identifier,bytes32[] criteriaProof)[] criteriaResolvers,bytes32 fulfillerConduitKey,address recipient)",FB=new $s([`function ${kk}`]),qB=new $s(["function mintPublic(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity) payable","function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),Ak=Object.freeze(["blast","base","ethereum","zora","arbitrum","sei","avalanche","polygon","optimism","ape_chain","flow","b3","soneium","ronin","bera_chain","solana","shape","unichain","gunzilla","abstract","animechain","hyperevm","somnia","monad","hyperliquid","megaeth","ink","robinhood","stablechain"]),_k=new Set(Ak),Ik=new Set(["solana","flow"]);UB=Object.freeze({robinhood:4663,ethereum:1,base:8453,arbitrum:42161,optimism:10,polygon:137,avalanche:43114,zora:7777777,blast:81457,sei:1329,ape_chain:33139,b3:8333,soneium:1868,ronin:2020,bera_chain:80094,shape:360,unichain:130,gunzilla:43419,abstract:2741,animechain:69e3,hyperevm:999,somnia:5031,monad:143,megaeth:4326,ink:57073,stablechain:988}),jB=Object.freeze({OrderComponents:[{name:"offerer",type:"address"},{name:"zone",type:"address"},{name:"offer",type:"OfferItem[]"},{name:"consideration",type:"ConsiderationItem[]"},{name:"orderType",type:"uint8"},{name:"startTime",type:"uint256"},{name:"endTime",type:"uint256"},{name:"zoneHash",type:"bytes32"},{name:"salt",type:"uint256"},{name:"conduitKey",type:"bytes32"},{name:"counter",type:"uint256"}],OfferItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"}],ConsiderationItem:[{name:"itemType",type:"uint8"},{name:"token",type:"address"},{name:"identifierOrCriteria",type:"uint256"},{name:"startAmount",type:"uint256"},{name:"endAmount",type:"uint256"},{name:"recipient",type:"address"}]}),HB=new $s(["function setApprovalForAll(address operator,bool approved)"]),zB=new $s(["function cancel((address offerer,address zone,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount)[] offer,(uint8 itemType,address token,uint256 identifierOrCriteria,uint256 startAmount,uint256 endAmount,address recipient)[] consideration,uint8 orderType,uint256 startTime,uint256 endTime,bytes32 zoneHash,uint256 salt,bytes32 conduitKey,uint256 counter)[] orders) returns (bool cancelled)"])});var wl=L(()=>{});function nh(e={}){return eo({provider:"satflow",defaultUrl:$k,hosts:["api.satflow.com"],url:e.baseUrl||process.env.SATFLOW_API_URL})}function Rk(e={}){return nh(e).baseUrl}function oh(e={}){return String(e.apiKey||process.env.SATFLOW_API_KEY||process.env.BTC_SATFLOW_API_KEY||"").trim()}function Lk(e={}){return un({accept:"application/json","content-type":"application/json","user-agent":"oracle-btc-satflow/0.1"},{"x-api-key":oh(e)},nh(e).trusted)}async function Pk(e,{method:t="GET",body:r,opts:n={}}={}){if(!oh(n))throw new Error("satflow: SATFLOW_API_KEY not set (request key via Satflow docs form)");let i=`${Rk(n)}${e.startsWith("/")?e:`/${e}`}`,a=await(n.fetchImpl||fetch)(i,{method:t,headers:Lk(n),body:r!=null?JSON.stringify(r):void 0,signal:AbortSignal.timeout(n.timeoutMs??2e4)}),c=await a.text(),u;try{u=JSON.parse(c)}catch{u=c}if(!a.ok)throw new Error(`satflow ${t} ${e}: HTTP ${a.status} ${String(c).slice(0,200)}`);return u}async function ih(e={},t={}){let r=_r(e.address||e.addr,"address"),n=new URLSearchParams({address:r});e.type&&n.set("type",e.type),e.limit!=null&&n.set("limit",String(e.limit)),e.offset!=null&&n.set("offset",String(e.offset));let o=await Pk(`/address/wallet-contents?${n}`,{opts:t});return{provider:"satflow",address:r,contents:o}}var $k,sh=L(()=>{Is();Zo();Tr();wl();$k="https://api.satflow.com/v1"});var ah=L(()=>{Ge();il();Zo();Tr();wl()});var iD,ch=L(()=>{Ge();iD=Object.freeze(["i.seadn.io","openseauserdata.com","arweave.net","ipfs.io","nftstorage.link","dweb.link","cloudflare-ipfs.com","ordinals.com","ordinals.g.com","cdn.helius-rpc.com","shdw-drive.genesysgo.net"])});function Fk(e={}){let t=[],r=String(e.name||""),n=String(e.description||""),o=`${r} ${n}`;Bk.test(r)&&t.push("url-in-name");let i=Mk.filter(u=>u.test(o)).length;i>0&&t.push(`lure-language:${i}`),Dk.test(r)&&t.push("value-claim-in-name"),/[\u200B-\u200F\u202A-\u202E\uFEFF]/.test(r)&&t.push("invisible-characters"),e.disabled===!0&&t.push("marketplace-disabled");let s=e.estimatedValueUsd==null&&e.estimatedValueSats==null,a=!Array.isArray(e.traits)||e.traits.length===0;s&&a&&i>0&&t.push("valueless-airdrop-with-lure");let c=t.includes("url-in-name")||t.includes("invisible-characters")||t.includes("valueless-airdrop-with-lure")||t.length>=2;return{spam:c,risk:c?"high":t.length>0?"low":"none",reasons:t}}function lh(e={}){let t=Fk(e);return{...e,spam:e.spam===!0||t.spam,riskLevel:t.risk,riskReasons:t.reasons.length?t.reasons:void 0}}var Mk,Bk,Dk,uh=L(()=>{Mk=[/\bclaim\b/i,/\breward\b/i,/\bairdrop\b/i,/\bvoucher\b/i,/\bwinner\b/i,/\bfree\s*mint\b/i,/\bactivate\b/i,/\bunlock\b/i,/\bverify\b/i,/\bconnect\s+wallet\b/i],Bk=/(https?:\/\/|www\.|[a-z0-9-]+\.(?:com|net|io|xyz|org|app|finance|gift|claims?|site|link|live|vip|top|cc))/i,Dk=/(\$\s?\d|\d[\d,.]*\s*(?:usd|usdc|usdt|eth|weth|btc|sol)\b)/i});function yl(e={},t){return{fetchImpl:e.fetchImpl,timeoutMs:e.timeoutMs,env:e.env,allowDiskCredentials:e.allowDiskCredentials,allowAmbientCredentials:e.allowAmbientCredentials,...e[t]||{}}}async function ri(e,t){let r=await qe(t);return r.ok?{ok:!0,data:r.data}:{ok:!1,error:`${e}: ${r.error}`.slice(0,300)}}function jk(e){if(Array.isArray(e))return e;for(let t of["items","results","ordinals","inscriptions","data"])if(Array.isArray(e?.[t]))return e[t];return[]}function Hk(e={},t){let r=e.inscription_id||e.inscriptionId||e.id||e.inscription||null;return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:r==null?null:String(r),tokenStandard:"ordinal",collection:e.collection_slug||e.collectionSlug||e.collection?.slug||e.collection||null,name:e.name||e.meta?.name||(r?`Inscription ${r}`:"Bitcoin inscription"),description:e.description||e.meta?.description||null,imageUrl:e.image_url||e.imageUrl||e.content_url||e.contentUrl||e.thumbnail||null,originalImageUrl:e.content_url||e.contentUrl||e.image_url||e.imageUrl||null,animationUrl:null,metadataUrl:e.metadata_url||e.metadataUrl||null,marketplaceUrl:e.marketplace_url||e.marketplaceUrl||null,estimatedValueUsd:e.estimated_value_usd!=null&&Number.isFinite(Number(e.estimated_value_usd))?Number(e.estimated_value_usd):null,estimatedValueSats:(e.floor_price_sats??e.price_sats)!=null&&Number.isFinite(Number(e.floor_price_sats??e.price_sats))?Number(e.floor_price_sats??e.price_sats):null,spam:!1,disabled:!1,nsfw:!1,listed:e.listed===!0||e.is_listed===!0,listingId:e.listing_id||e.listingId||null,traits:Array.isArray(e.traits)?e.traits:[],updatedAt:e.updated_at||e.updatedAt||null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"Satflow wallet inventory does not expose trustworthy acquisition cost"},listingAdapter:"satflow",source:"satflow-wallet-contents"}}function zk(e,t){return{chain:"bitcoin",family:"bitcoin",owner:t,contract:null,tokenId:String(e),tokenStandard:"ordinal",collection:null,name:`Inscription ${e}`,description:null,imageUrl:null,originalImageUrl:null,animationUrl:null,metadataUrl:null,marketplaceUrl:null,estimatedValueUsd:null,spam:!1,disabled:!1,nsfw:!1,traits:[],updatedAt:null,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"address indexer returned no acquisition or valuation data"},listingAdapter:"satflow",source:"bitcoin-meta-address-indexer"}}function dh(e={}){return[e.chain||"unknown",e.contract||"native",e.tokenId||"unknown"].join(":").toLowerCase()}function Wk(e){let t=new Map;if(Array.isArray(e)){for(let r of e)r?.assetKey&&t.set(String(r.assetKey).toLowerCase(),r);return t}if(e&&typeof e=="object")for(let[r,n]of Object.entries(e))t.set(r.toLowerCase(),n);return t}function Kk(e,t){let r=dh(e),n=t.get(r),o=e.estimatedValueUsd==null?null:Number(e.estimatedValueUsd);if(!n)return{...e,assetKey:r};let i=Number(n.costUsd),s=Number(n.feesUsd??0);if(!Number.isFinite(i)||i<0||!Number.isFinite(s)||s<0)return{...e,assetKey:r,acquisitionCost:null,itemPnl:{status:"unavailable",reason:"invalid user-supplied cost basis"}};let a=Math.round((i+s)*100)/100;return Number.isFinite(o)?{...e,assetKey:r,acquisitionCost:{costUsd:i,feesUsd:s,totalCostUsd:a,acquiredAt:n.acquiredAt||null,source:n.source||"user-supplied"},itemPnl:{status:"estimated",methodology:"provider estimated current value minus supplied USD acquisition cost and fees",unrealizedUsd:Math.round((o-a)*100)/100,currentValueUsd:o,totalCostUsd:a,realizedUsd:null}}:{...e,assetKey:r,acquisitionCost:{costUsd:i,feesUsd:s,totalCostUsd:a,acquiredAt:n.acquiredAt||null,source:n.source||"user-supplied"},itemPnl:{status:"unavailable",reason:"current NFT valuation is unavailable"}}}function Vk(e){let t=new Map;for(let r of e){let n=dh(r);t.has(n)||t.set(n,r)}return[...t.values()]}function Gk(e,t){let r=e.filter(i=>i.itemPnl?.status==="estimated"),n=e.length-r.length,o=Math.round(r.reduce((i,s)=>i+Number(s.itemPnl.unrealizedUsd||0),0)*100)/100;return{nftItemPnl:{status:n===0&&e.length?"estimated-complete-for-held-items":r.length?"partial":"unavailable",methodology:"Only items with explicit acquisition cost and provider estimated current value are included",knownUnrealizedUsd:o,knownItems:r.length,unknownItems:n,realizedUsd:null,warning:"Transfers, gifts, airdrops, mints, bridges, gas, royalties, and off-market sales can make cost basis unavailable or incomplete."},providerAccountPnl:t}}async function fh(e={},t={}){let r=new Date().toISOString(),n=ro(e,t.env||process.env),o=Array.isArray(e.chains)&&e.chains.length?new Set(e.chains.map(w=>String(w).toLowerCase())):null,i=qk.filter(w=>!o||o.has(w.chain)),s=[],a=[],c=yl(t,"opensea"),u=n.evm?i.filter(w=>w.family!=="solana"):[],d=await Qn(u,4,async w=>({row:w,result:await ri(`opensea-${w.chain}`,()=>gl({chain:w.chain,address:n.evm,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3)}));for(let{row:w,result:v}of d)if(v.ok){let _=v.data.nfts.map(T=>({...T,family:w.family,chainId:w.chainId,listingAdapter:"opensea",source:"opensea-account-inventory"}));a.push(..._),s.push({family:w.family,chain:w.chain,chainId:w.chainId,status:v.data.complete?"ok":"partial",count:_.length,complete:v.data.complete,next:v.data.next,source:"opensea"})}else s.push({family:w.family,chain:w.chain,chainId:w.chainId,status:"unavailable",error:v.error,source:"opensea"});if(!n.evm)for(let w of i.filter(v=>v.family!=="solana"))s.push({family:w.family,chain:w.chain,chainId:w.chainId,status:"not-configured",reason:"EVM address missing"});if(n.solana&&(!o||o.has("solana"))){let w=await ri("opensea-solana",()=>gl({chain:"solana",address:n.solana,pageSize:e.pageSize,maxPages:e.maxPages},c),t.timeoutMs??35e3);if(w.ok){let v=w.data.nfts.map(_=>({..._,family:"solana",chainId:null,listingAdapter:null,source:"opensea-account-inventory"}));a.push(...v),s.push({family:"solana",chain:"solana",status:w.data.complete?"ok":"partial",count:v.length,complete:w.data.complete,next:w.data.next,source:"opensea"})}else s.push({family:"solana",chain:"solana",status:"unavailable",error:w.error,source:"opensea"})}else(!o||o.has("solana"))&&s.push({family:"solana",chain:"solana",status:"not-configured",reason:"Solana address missing"});if(n.bitcoin&&(!o||o.has("bitcoin"))){let w=await ri("satflow-wallet-contents",()=>ih({address:n.bitcoin,type:"ordinals",limit:e.bitcoinLimit??100,offset:0},yl(t,"satflow")),t.timeoutMs??35e3);if(w.ok){let v=jk(w.data.contents).map(T=>Hk(T,n.bitcoin));a.push(...v);let _=v.length<Number(e.bitcoinLimit??100);s.push({family:"bitcoin",chain:"bitcoin",status:_?"ok":"partial",count:v.length,complete:_,source:"satflow"})}else{let v=await ri("bitcoin-meta-inscriptions",()=>Os({address:n.bitcoin},yl(t,"bitcoinMeta")),t.timeoutMs??35e3),_=v.ok&&v.data?.ok&&Array.isArray(v.data.inscriptions)?v.data.inscriptions:[];a.push(..._.map(T=>zk(T,n.bitcoin))),s.push({family:"bitcoin",chain:"bitcoin",status:_.length?"partial":"unavailable",count:_.length,complete:!1,source:_.length?"bitcoin-meta":"satflow",error:_.length?"Satflow unavailable; fallback has IDs only":w.error})}}else(!o||o.has("bitcoin"))&&s.push({family:"bitcoin",chain:"bitcoin",status:"not-configured",reason:"Bitcoin address missing"});let f=[];if(e.includePnl!==!1)for(let w of[...new Set([n.evm,n.solana].filter(Boolean))]){let v=await ri(`opensea-pnl-${w}`,()=>th({address:w},c),t.timeoutMs??35e3);f.push(v.ok?{status:"ok",...v.data}:{status:"unavailable",address:w,source:"opensea-indexed-account-pnl",error:v.error})}let l=Wk(e.costBasis),p=Vk(a).map(w=>Kk(w,l)).map(w=>lh(w)),m=p.filter(w=>!w.spam),g=p.filter(w=>w.spam),y=m.filter(w=>w.estimatedValueUsd!=null&&Number.isFinite(Number(w.estimatedValueUsd))),b=Math.round(y.reduce((w,v)=>w+Number(v.estimatedValueUsd),0)*100)/100,A=m.length-y.length,S=s.filter(w=>w.status!=="ok"||w.complete===!1);return{provider:"nft-portfolio",operation:"inventory",readOnly:!0,generatedAt:r,addresses:n,coverage:s,unsupported:Uk,inventory:{count:p.length,visibleCount:m.length,flaggedCount:g.length,items:p,visibleItems:m,flaggedItems:g},valuation:{estimatedCurrentValueUsd:b,valuedItems:y.length,unvaluedItems:A,complete:A===0&&S.length===0,methodology:"Sum of provider estimated_value_usd for non-flagged items. It is not an executable bid."},pnl:Gk(m,f),listingCoverage:{opensea:"EVM listing actions available with OPENSEA_API_KEY, explicit price/currency/expiry, and user confirmation",satflow:"Bitcoin unsigned listing PSBT available with SATFLOW_API_KEY, explicit price/expiry, and user confirmation",solana:"Magic Eden unsigned list transaction available with MAGICEDEN_API_KEY, explicit SOL price/expiry, and user confirmation",unsupported:"Sui, Aptos, Cosmos, BSC, and unknown marketplaces fail closed"},traitSniperCoverage:{opensea:"Evaluates reveal/trait-floor mispricing only with recent trait sales and volume evidence. Buy intents require local vault signing.",execution:"prepare-only on hosted surfaces; local vault required for purchase"},metadataSafety:{imagesAreUntrusted:!0,animationAndHtmlNotRendered:!0,galleryRasterOnly:!0,missingImagesUsePlaceholders:!0}}}var qk,Uk,ph=L(()=>{Ge();ml();rh();sh();al();ah();ch();uh();Tr();qk=Object.freeze([{chain:"ethereum",chainId:1,family:"evm"},{chain:"optimism",chainId:10,family:"evm"},{chain:"polygon",chainId:137,family:"evm"},{chain:"stablechain",chainId:988,family:"evm"},{chain:"hyperevm",chainId:999,family:"evm"},{chain:"abstract",chainId:2741,family:"evm"},{chain:"robinhood",chainId:4663,family:"evm"},{chain:"base",chainId:8453,family:"evm"},{chain:"arbitrum",chainId:42161,family:"evm"},{chain:"avalanche",chainId:43114,family:"evm"},{chain:"hyperliquid",chainId:null,family:"hyperliquid"}]),Uk=Object.freeze([{family:"evm",chain:"bsc",chainId:56,reason:"OpenSea account inventory does not support BSC"},{family:"cosmos",reason:"requires a chain-specific bech32 address and NFT indexer"},{family:"sui",reason:"owner inventory adapter not installed"},{family:"aptos",reason:"owner inventory adapter not installed"}])});var xh={};Ur(xh,{portfolioHistory:()=>bh,portfolioIdForAddresses:()=>bl,portfolioSnapshot:()=>cA,portfolioValueGraph:()=>pA,resolvePortfolioHistoryFile:()=>xl});import{constants as Rs}from"node:fs";import{chmod as Jk,mkdir as Yk,open as Xk,readFile as Qk}from"node:fs/promises";import{createHash as Zk,randomUUID as eA}from"node:crypto";import tA from"node:os";import no from"node:path";function Cr(e){if(e==null||e==="")return null;let t=Number(e);return Number.isFinite(t)?t:null}function oo(e){return Number.isFinite(e)?Number(e.toFixed(2)):null}function hh(e,t){if(e==null||e==="")return null;let r=Date.parse(String(e));if(!Number.isFinite(r))throw new Error(`${t} must be an ISO 8601 timestamp`);return new Date(r).toISOString()}function yh(e,t,r,n,o){if(e==null||e==="")return t;let i=Number(e);if(!Number.isInteger(i)||i<r||i>n)throw new Error(`${o} must be an integer from ${r} to ${n}`);return i}function rA(e={}){return["evm","solana","bitcoin","hyperliquid"].map(t=>`${t}:${String(e[t]||"").trim().toLowerCase()}`).join("|")}function bl(e={}){return`portfolio_${Zk("sha256").update(rA(e)).digest("hex").slice(0,20)}`}function xl(e={}){if(e.historyFile)return no.resolve(String(e.historyFile));let t=e.env||process.env;if(t.ORACLE_PORTFOLIO_HISTORY_FILE)return no.resolve(String(t.ORACLE_PORTFOLIO_HISTORY_FILE));let r=String(t.HERMES_HOME||"").trim()||no.join(tA.homedir(),".hermes");return no.join(no.resolve(r),"state","oracle","portfolio-history.jsonl")}function nA(e){let t=Cr(e?.valuation?.knownUsd);return t==null?null:Number(e?.valuation?.pricedItems||0)>0||e?.valuation?.complete===!0?oo(t):null}function oA(e){if(!e||e.status==="unavailable"||e.status==="not-requested")return null;let t=Cr(e?.valuation?.estimatedCurrentValueUsd);return t==null?null:Number(e?.valuation?.valuedItems||0)>0||e?.valuation?.complete===!0?oo(t):null}function iA(e){let t=[];for(let r of e?.chains||[]){if(r.family==="hyperliquid"){let o=(r.spot?.balances||[]).reduce((a,c)=>{let u=Cr(c.usdValue);return u==null?a:a+u},0),i=Cr(r.perps?.accountValueUsd),s=oo(o+(i??0));(s!==0||i!=null||(r.spot?.balances||[]).some(a=>Cr(a.usdValue)!=null))&&t.push({family:"hyperliquid",chainId:null,name:r.name||"Hyperliquid",knownUsd:s});continue}let n=Cr(r.native?.usdValue);n!=null&&t.push({family:r.family||"evm",chainId:r.chainId??null,name:r.name||r.native?.symbol||"Unknown",knownUsd:oo(n)})}return t}function sA(e,t,r){let n=Array.isArray(t?.coverage)?t.coverage:[];return{balances:e?.coverage||null,nfts:{requested:r,ok:n.filter(o=>o.status==="ok").length,partial:n.filter(o=>o.status==="partial").length,unavailable:n.filter(o=>o.status==="unavailable").length,notConfigured:n.filter(o=>o.status==="not-configured").length,status:r?t?.status==="unavailable"?"unavailable":t?.valuation?.complete?"ok":"partial":"not-requested"}}}async function aA(e,t){let r=xl(t),n=`${JSON.stringify(e)}
|
|
9
9
|
`;if(Buffer.byteLength(n)>32*1024)throw new Error("portfolio history snapshot exceeds 32 KiB");await Yk(no.dirname(r),{recursive:!0,mode:448});let o=Rs.O_APPEND|Rs.O_CREAT|Rs.O_WRONLY|(Rs.O_NOFOLLOW||0),i=await Xk(r,o,384);try{await i.writeFile(n,"utf8")}finally{await i.close()}return await Jk(r,384),r}async function cA(e={},t={}){let r=e.includeNfts!==!1,n=t.portfolioBalanceImpl||Gm,o=t.nftInventoryImpl||fh,i=n(e,t),s=r?o({...e,includePnl:!1},t).catch(v=>({status:"unavailable",error:String(v?.message||v).slice(0,300)})):Promise.resolve({status:"not-requested"}),[a,c]=await Promise.all([i,s]),u=nA(a),d=oA(c),f=[u,d].filter(v=>v!=null),l=f.length?oo(f.reduce((v,_)=>v+_,0)):null,p=!!(a?.valuation?.complete&&(!r||c?.valuation?.complete===!0)),m=typeof t.now=="function"?t.now():new Date,g=new Date(m).toISOString(),y=a?.addresses||ro(e,t.env||process.env),b=bl(y),A=[...a?.warnings||[]];r&&c?.status==="unavailable"&&A.push(`NFT inventory unavailable: ${c.error}`),r&&c?.valuation&&c.valuation.complete!==!0&&A.push("NFT estimated value is incomplete and is not an executable bid.");let S={schemaVersion:1,id:`snapshot_${eA()}`,portfolioId:b,recordedAt:g,sourceQueriedAt:{balances:a?.queriedAt||null,nfts:c?.generatedAt||null},configuredFamilies:Object.fromEntries(["evm","solana","bitcoin","hyperliquid"].map(v=>[v,!!y?.[v]])),valuation:{knownUsd:l,liquidKnownUsd:u,nftEstimatedValueUsd:d,complete:p,label:p?"complete known portfolio value":"known priced value, including provider-estimated NFTs when available, not a complete portfolio total",liquidPricedItems:Number(a?.valuation?.pricedItems||0),liquidUnpricedNonzeroItems:Number(a?.valuation?.unpricedNonzeroItems||0),nftValuedItems:Number(c?.valuation?.valuedItems||0),nftUnvaluedItems:Number(c?.valuation?.unvaluedItems||0)},breakdown:{liquid:iA(a),nfts:{knownUsd:d,visibleItems:Number(c?.inventory?.visibleCount||0),flaggedItems:Number(c?.inventory?.flaggedCount||0)}},coverage:sA(a,c,r),warnings:[...new Set(A)].slice(0,50)};return{provider:"portfolio",operation:"snapshot",readOnly:!0,localObservationRecorded:!0,historyFile:await aA(S,t),snapshot:S,balance:a,nfts:c}}async function lA(e){let t=xl(e);try{let r=await Qk(t);if(r.byteLength>mh)throw new Error(`portfolio history exceeds ${mh} bytes`);let n=[],o=0;for(let i of r.toString("utf8").split(`
|
|
10
10
|
`))if(i.trim())try{let s=JSON.parse(i);s?.schemaVersion===1&&s?.portfolioId&&s?.recordedAt?n.push(s):o+=1}catch{o+=1}return{file:t,snapshots:n,corruptLines:o}}catch(r){if(r?.code==="ENOENT")return{file:t,snapshots:[],corruptLines:0};throw r}}function uA(e,t){if(e.allPortfolios===!0)return null;if(e.portfolioId)return String(e.portfolioId);let r=ro(e,t.env||process.env);return Object.values(r).some(Boolean)?bl(r):null}async function bh(e={},t={}){let r=yh(e.limit,100,1,wh,"portfolio history limit"),n=String(e.order||"desc").toLowerCase();if(!new Set(["asc","desc"]).has(n))throw new Error("portfolio history order must be asc or desc");let o=hh(e.since,"portfolio history since"),i=hh(e.until,"portfolio history until"),s=uA(e,t),a=await lA(t),c=a.snapshots.filter(f=>!(s&&f.portfolioId!==s||o&&f.recordedAt<o||i&&f.recordedAt>i));c.sort((f,l)=>String(f.recordedAt).localeCompare(String(l.recordedAt)));let u=c.length;c=c.slice(-r),n==="desc"&&c.reverse();let d=c.filter(f=>Cr(f?.valuation?.knownUsd)!=null);return{provider:"portfolio",operation:"history",readOnly:!0,historyFile:a.file,portfolioId:s,order:n,totalStored:a.snapshots.length,totalMatching:u,corruptLines:a.corruptLines,snapshots:c,stats:{returned:c.length,valuedSnapshots:d.length,unpricedSnapshots:c.length-d.length,firstRecordedAt:c.length?[...c].sort((f,l)=>String(f.recordedAt).localeCompare(String(l.recordedAt)))[0].recordedAt:null,lastRecordedAt:c.length?[...c].sort((f,l)=>String(f.recordedAt).localeCompare(String(l.recordedAt))).at(-1).recordedAt:null}}}function gh(e){return`$${Number(e).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}`}function Ls(e){return String(e).replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function dA(e,t){if(e.length<=t)return e;let r=[];for(let n=0;n<t;n+=1)r.push(e[Math.round(n*(e.length-1)/(t-1))]);return r}function fA(e,t){let c=e.map(S=>S.value),u=Math.min(...c),d=Math.max(...c);if(u===d){let S=Math.max(1,Math.abs(u)*.05);u-=S,d+=S}else{let S=(d-u)*.1;u=Math.max(0,u-S),d+=S}let f=S=>e.length===1?1240/2:100+1040*S/(e.length-1),l=S=>570-(S-u)/(d-u)*470,p=e.map((S,w)=>`${w?"L":"M"}${f(w).toFixed(2)},${l(S.value).toFixed(2)}`).join(" "),m=Array.from({length:5},(S,w)=>{let v=w/4,_=100+v*470,T=d-v*(d-u);return`<line x1="100" y1="${_}" x2="1140" y2="${_}" stroke="#26313c" stroke-width="1"/><text x="86" y="${_+5}" text-anchor="end" fill="#8795a5" font-size="15">${gh(T)}</text>`}).join(""),g=e.map((S,w)=>`<circle cx="${f(w)}" cy="${l(S.value)}" r="5" fill="#b8f0ff"><title>${Ls(S.recordedAt)}: ${gh(S.value)}</title></circle>`).join(""),y=Ls(e[0].recordedAt.slice(0,10)),b=Ls(e.at(-1).recordedAt.slice(0,10));return`<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="675" viewBox="0 0 1200 675"><rect width="1200" height="675" fill="#0b1016"/><text x="60" y="50" fill="#f4f7fa" font-size="28" font-family="Inter,Arial,sans-serif" font-weight="700">Oracle Portfolio Value</text><text x="60" y="78" fill="#8795a5" font-size="15" font-family="Inter,Arial,sans-serif">Known priced value, not a complete total unless every snapshot says complete \xB7 ${Ls(t||"configured portfolio")}</text>${m}<line x1="100" y1="570" x2="1140" y2="570" stroke="#526171" stroke-width="1"/><path d="${p}" fill="none" stroke="#b8f0ff" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>${g}<text x="100" y="610" fill="#8795a5" font-size="15">${y}</text><text x="1140" y="610" text-anchor="end" fill="#8795a5" font-size="15">${b}</text><text x="60" y="650" fill="#526171" font-size="13">NFT values are provider estimates, not executable bids. Unavailable values are omitted, never plotted as zero.</text></svg>`}async function pA(e={},t={}){if(e.allPortfolios===!0)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let r=yh(e.maxPoints,200,2,500,"portfolio graph maxPoints"),n=await bh({...e,order:"asc",limit:e.limit??wh},t);if(!n.portfolioId)throw new Error("portfolio value graph requires one portfolioId or configured public-address portfolio");let o=n.snapshots.map(f=>({recordedAt:f.recordedAt,value:Cr(f?.valuation?.knownUsd),complete:f?.valuation?.complete===!0})).filter(f=>f.value!=null);if(!o.length)throw new Error("portfolio value graph requires at least one snapshot with known priced value");let i=dA(o,r),s=i[0].value,a=i.at(-1).value,c=oo(a-s),u=s===0?null:Number(((a-s)/s*100).toFixed(2)),d=fA(i,n.portfolioId);return{provider:"portfolio",operation:"valueGraph",readOnly:!0,portfolioId:n.portfolioId,mimeType:"image/svg+xml",dataBase64:Buffer.from(d).toString("base64"),byteLength:Buffer.byteLength(d),summary:{points:i.length,omittedUnavailablePoints:n.snapshots.length-o.length,startRecordedAt:i[0].recordedAt,endRecordedAt:i.at(-1).recordedAt,startKnownUsd:s,endKnownUsd:a,changeUsd:c,changePct:u,completeSnapshots:i.filter(f=>f.complete).length,label:"known priced value history; incomplete snapshots are not complete portfolio totals"}}}var mh,wh,Sh=L(()=>{ml();ph();mh=10*1024*1024,wh=1e3});function Ps(e){let t=e?.transactionHash||e?.hash||e?.txid||null;return t?{happened:!0,hash:String(t),note:null}:{happened:!1,hash:null,note:"no transaction hash \u2014 the action did not succeed"}}var Sl=L(()=>{});var kh={};Ur(kh,{createWatch:()=>Al,listWatches:()=>kl,removeWatch:()=>wA});import ni from"node:fs";import El from"node:path";import{randomUUID as mA}from"node:crypto";import{homedir as hA}from"node:os";function gA(e=process.env){return e.ORACLE_CONFIG_DIR||El.join(hA(),".config","oracle")}function Eh(e=process.env){return El.join(gA(e),"watches.json")}function vl(e=process.env){let t=Eh(e);if(!ni.existsSync(t))return{watches:[]};try{let r=JSON.parse(ni.readFileSync(t,"utf8"));return{watches:Array.isArray(r.watches)?r.watches:[]}}catch{return{watches:[]}}}function vh(e,t=process.env){let r=Eh(t);ni.mkdirSync(El.dirname(r),{recursive:!0,mode:448});let n=`${r}.${process.pid}.tmp`;ni.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
11
|
-
`,{mode:384}),ni.renameSync(n,r)}function kl(e=process.env){return vl(e).watches}function Al({chain:e,token:t,condition:r,note:n}={},o=process.env){if(!e||!t||!r)throw new Error("watch requires chain, token, condition");let i={id:mA(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=vl(o);return s.watches.push(i),vh(s,o),i}function wA(e,t=process.env){let r=vl(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(vh({watches:n},t),!0)}var _l=L(()=>{});function Il(e){let t=bA[Number(e)]||[];return new Set([...t,...yA].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var yA,bA,Ol=L(()=>{yA=["0x000000000022d473030f116ddee9f6b43ac78ba3"],bA={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]}});var oi=L(()=>{});var io=L(()=>{});var ii,si=L(()=>{oi();io();ii=100});import{isAddress as UD}from"ethers";var Cl=L(()=>{si();oi();io()});import{Interface as EA,isAddress as VD}from"ethers";var XD,Ah=L(()=>{Cl();oi();io();XD=new EA(["function approve(address spender,uint256 amount) returns (bool)"])});import{Interface as vA,isAddress as eF}from"ethers";var oF,iF,_h=L(()=>{Cl();oi();io();oF=new vA(["function approve(address spender,uint256 amount) returns (bool)"]),iF=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"})});var dn=L(()=>{});import{Interface as kA,MaxUint256 as dF,isAddress as fF,keccak256 as pF,toUtf8Bytes as mF}from"ethers";var xF,fn=L(()=>{Ol();Ah();_h();dn();io();xF=new kA(["function approve(address spender,uint256 amount) returns (bool)"])});var Bs=L(()=>{fn()});import{Address as AF,NETWORK as _F,OutScript as IF,RawTx as OF,SigHash as TF,TEST_NETWORK as CF,Transaction as NF}from"@scure/btc-signer";var Rl=L(()=>{});import{createHash as AA}from"node:crypto";import{base58 as PF}from"@scure/base";import{getCompiledTransactionMessageDecoder as BF}from"@solana/transaction-messages";var Ih,DF,Ll=L(()=>{Ih=e=>AA("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),DF=new Map([[Ih("route"),{name:"route",prefixBytes:0}],[Ih("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]])});var Oh=L(()=>{cl()});var KF,VF,Ml=L(()=>{dn();Oh();KF=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),VF=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"})});var YF,Bl=L(()=>{dn();YF="0x"+"00".repeat(32)});var _A,tq,Dl=L(()=>{Bl();dn();_A=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),tq=Object.freeze(_A.map(e=>e[0]))});var Ds=L(()=>{dn()});import{TypedDataEncoder as sq,getAddress as aq,isAddress as cq}from"ethers";var IA,OA,$h=L(()=>{Tr();IA=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),OA=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]})});var dq,Rh=L(()=>{dq=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var Lh=L(()=>{});import{TypedDataEncoder as bq,getAddress as xq,isAddress as Sq}from"ethers";var TA,Oq,CA,Tq,Ph=L(()=>{Ge();si();Rh();Lh();Tr();TA=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Oq=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),CA=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),Tq=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});import{TypedDataEncoder as $q,getAddress as Rq}from"ethers";var Mq,Fl=L(()=>{$h();Ph();Mq=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"])});import{Interface as Bh}from"ethers";var MA,Zq,BA,eU,tU,rU,nU,DA,oU,Fs=L(()=>{fn();si();Tr();Bs();Rl();Ll();Ml();Dl();Ds();Fl();MA=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]),Zq=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,delegate:0,identity:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0}),BA=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),eU=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),tU=new Bh(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),rU=new Bh(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),nU=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}}),DA=Object.freeze([...MA]),oU=Object.freeze({...BA})});import{encode as aU}from"@msgpack/msgpack";import{keccak256 as lU,verifyTypedData as uU}from"ethers";var dU,fU,ql=L(()=>{dU=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),fU=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]})});var Ul=L(()=>{Ds()});import{ed25519 as xU}from"@noble/curves/ed25519.js";import{base58 as EU}from"@scure/base";import{RawTx as kU,SigHash as AU,Transaction as _U}from"@scure/btc-signer";import{Transaction as OU,keccak256 as TU,verifyTypedData as CU}from"ethers";var jl=L(()=>{ql();Ul()});import{base58 as BU}from"@scure/base";var qs=L(()=>{Fs();Bs();fn();jl()});var Fh=L(()=>{qs();Fs()});import{wordlists as UA}from"ethers";function WA(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return zA.has(t.length)&&t.every(r=>UA.en.getWordIndex(r)>=0)}function JA(e){let t=qh(e);return GA.has(t)||VA.test(t)}function qh(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function YA(e){let t=qh(e);return[...jA].some(r=>t.includes(r))}function XA(e,t,r){if(typeof t=="string"){if(HA.some(n=>n.test(t))||WA(t))throw new ci(r);if(KA.test(t)&&!JA(e))throw new ci(r)}}function Us(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return XA(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>Us(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(YA(o))throw new ci(i);e[o]!==void 0&&(n[o]=Us(e[o],i,o))}return n}function re(e){return Us(e)}function Hl(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Hl).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${Hl(e[t])}`).join(",")}}`}function so(e){return Hl(Us(e))}var jA,HA,zA,KA,VA,GA,ci,tr=L(()=>{jA=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),HA=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],zA=new Set([12,15,18,21,24]);KA=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,VA=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,GA=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);ci=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import{wordlists as QU}from"ethers";var Uh,ej,ao=L(()=>{tr();Uh=64*1024,ej=32*1024});var e_,nj,oj,Hs=L(()=>{ao();e_=["schemaVersion","buildVersion","recordType","execution","custody"],nj=[...e_,"recordHash"],oj=Object.freeze({signed:new Set(["workflow.signed","legacy.signed"]),submitted:new Set(["workflow.submitted","legacy.broadcast"]),finalized:new Set(["workflow.finalized"]),reorged:new Set(["workflow.reorged"]),orphaned:new Set(["workflow.orphaned"]),compensating:new Set(["workflow.compensating"]),compensated:new Set(["workflow.compensated"])})});var t_,Yh,lj,Gl=L(()=>{ao();Hs();t_=Object.freeze(["draft","checked","approval","signed","submitted","finalized","reorged","orphaned","compensating","compensated","failed","cancelled"]),Yh=Object.freeze(["workflow.drafted","workflow.checked","workflow.approval_requested","workflow.approval_granted","workflow.signed","workflow.submitted","workflow.finalized","workflow.reorged","workflow.orphaned","workflow.compensating","workflow.compensated","workflow.failed","workflow.cancelled","workflow.annotated"]),lj=new Set(Yh)});var a_,Xh=L(()=>{ao();Gl();a_=64*1024*1024});var gj,wj,yj,Qh=L(()=>{gj=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),wj=Object.freeze(["read","simulate"]),yj=1440*60});function Jl(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return c_.test(t)||l_.includes(r)}function u_(e){return e.replace(/"([A-Za-z0-9_-]+)"\s*:\s*"(?:0x)?([0-9a-fA-F]{64})"/g,(t,r)=>eg.includes(String(r).toLowerCase().replace(/[_-]/g,""))?`"${r}":"<hex64>"`:t)}function tg(e){let t;try{t=JSON.stringify(e)}catch(o){throw new nr("$",`unserializable-payload: ${String(o?.message||o)}`)}if(t===void 0)return"null";let r=u_(t);for(let{rule:o,re:i}of Zh)if(i.test(r))throw new nr("$<serialized>",o);if(/(?:^|[^0-9a-fA-Fx])0x[0-9a-fA-F]{64}(?![0-9a-fA-F])/.test(r))throw new nr("$<serialized>","raw-32-byte-hex-embedded");return JSON.parse(t,(o,i)=>{if(o&&Jl(o))throw new nr(`$<serialized>.${o}`,"forbidden-key-name");return i}),t}function rr(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=eg.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of Zh)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new nr(t,i);return e}if(typeof e!="object"||r.has(e)||(r.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&Jl(o))throw new nr(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");rr(o,`${t}[key]`,r),rr(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())rr(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>rr(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(Jl(o))throw new nr(`${t}.${o}`,"forbidden-key-name");rr(i,`${t}.${o}`,r,o)}return e}var nr,c_,l_,Zh,eg,Yl=L(()=>{Qh();nr=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},c_=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,l_=Object.freeze(["privkey","wif","xprv","seed"]);Zh=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),eg=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as d_}from"node:crypto";function Ql(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ql).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ql(e[t])}`).join(",")}}`}function f_(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function zs(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))zs(t)}return e}function Zl(e,t="fact"){try{rr(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function og(e){return d_("sha256").update(Ql(e)).digest("hex")}function ig({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:i===!0,fact:f_(r)};return zs({...s,hash:og(s)})}function Ws({tradeId:e,intent:t,asOf:r=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");Zl(t,"intent");let n=ig({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return zs({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function sg(e,t,r,n={}){if(Ks(e),!(rg[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);Zl(r,t);let i=n.external===!0||n.externallySupplied===!0;if(ng.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=n.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=ig({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return zs({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Ks(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...i}=n;if(og(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(Zl(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!rg[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(ng.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var Xl,rg,ng,Vs=L(()=>{Yl();Xl=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),rg=Object.freeze(Object.fromEntries(Xl.map((e,t)=>[e,Object.freeze(t+1<Xl.length?[Xl[t+1]]:[])]))),ng=new Set(["signed","broadcast"])});var p_,ag=L(()=>{Vs();ao();Hs();p_=Object.freeze({intent:"draft",quote_comparison:"draft",simulation:"draft",prepared:"checked",approval:"approval",signed:"signed",broadcast:"submitted",settlement:"finalized",balance_delta:"compensated",position:"compensated"})});var cg=L(()=>{ao();Hs();Gl();Xh();ag()});var h_,g_,w_,f6,p6,m6,h6,g6,y_,w6,lg=L(()=>{h_=Object.freeze(["owner","operator","agent","viewer"]),g_=Object.freeze(["tenant","config","policy","grant","workflow","trade","receipt","audit","telemetry"]),w_=Object.freeze({read:"read",create:"create",update:"update",delete:"delete",manage:"manage",prepare:"prepare",cancel:"cancel",export:"export",approve:"approve"}),f6=Object.freeze(["owner"]),p6=Object.freeze({ALLOW_ROLE_PERMISSION:"allow.role_permission",DENY_MISSING_CONTEXT:"deny.missing_context",DENY_INVALID_CONTEXT:"deny.invalid_context",DENY_INVALID_REQUEST:"deny.invalid_request",DENY_UNKNOWN_RESOURCE:"deny.unknown_resource",DENY_UNKNOWN_ACTION:"deny.unknown_action",DENY_UNBOUND_OBJECT:"deny.unbound_object",DENY_TENANT_MISMATCH:"deny.tenant_mismatch",DENY_RESOURCE_MISMATCH:"deny.resource_mismatch",DENY_ROLE_PERMISSION:"deny.role_permission",DENY_POLICY_NOT_APPROVER:"deny.policy_not_approver"}),m6=new Set(h_),h6=new Set(g_),g6=new Set(Object.values(w_)),y_=Object.freeze({owner:Object.freeze(["tenant:read","tenant:manage","config:read","config:manage","policy:read","policy:manage","grant:read","grant:create","grant:update","grant:delete","grant:manage","workflow:read","workflow:create","workflow:update","workflow:delete","workflow:cancel","workflow:approve","trade:read","trade:prepare","receipt:read","receipt:export","audit:read","audit:export","telemetry:read","telemetry:create","telemetry:export"]),operator:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","workflow:cancel","trade:read","trade:prepare","receipt:read","audit:read","telemetry:read","telemetry:create"]),agent:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","trade:read","trade:prepare","receipt:read","telemetry:create"]),viewer:Object.freeze(["tenant:read","config:read","grant:read","workflow:read","trade:read","receipt:read","audit:read","telemetry:read"])}),w6=Object.freeze(Object.fromEntries(Object.entries(y_).map(([e,t])=>[e,Object.freeze([...t])])))});var b_,x_,S_,S6,E6,v6,k6,A6,_6,eu=L(()=>{lg();b_=Object.freeze(["succeeded","denied","invalid","failed","cancelled","timed_out","unavailable","skipped"]),x_=Object.freeze(["workflow","task","intent","plan","run","event","eval"]),S_=Object.freeze(["taskId","intentId","planId","runId","eventId"]),S6=Object.freeze({maxAttributes:24,maxKeyLength:48,maxStringLength:256,maxArrayLength:8}),E6=new Set(b_),v6=new Set(x_),k6=new Set(S_),A6=Object.freeze(["authorization","bearer","cookie","credential","password","passphrase","secret","token","privatekey","privkey","seed","mnemonic","keystore","signature","prompt","systemmessage","usermessage","assistantmessage","rawtransaction","signedtransaction","serializedtransaction","transactionbytes","calldata","callbytes","inputdata"]),_6=Object.freeze({taskId:"x-oracle-task-id",intentId:"x-oracle-intent-id",planId:"x-oracle-plan-id",runId:"x-oracle-run-id",eventId:"x-oracle-event-id"})});var $6,ug=L(()=>{cg();eu();$6=Object.freeze({"workflow.cancelled":"cancelled","workflow.failed":"failed"})});var D6,dg=L(()=>{eu();D6=32*1024*1024});import pn from"node:fs";function E_(e){if(!e.isFile())throw new Error("local-vault: secret source must be a regular file");if(e.uid!==process.getuid?.())throw new Error("local-vault: secret source must be owned by this user");if(e.nlink!==1)throw new Error("local-vault: refusing hard-linked secret source");if((e.mode&63)!==0)throw new Error("local-vault: secret source must be owner-only (0600)")}function co(e){let t;try{t=pn.openSync(e,pn.constants.O_RDONLY|pn.constants.O_NOFOLLOW)}catch(r){throw r.code==="ELOOP"?new Error("local-vault: refusing symlink"):r}try{let r=pn.fstatSync(t);if(E_(r),r.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");let n=pn.lstatSync(e);if(n.isSymbolicLink()||n.dev!==r.dev||n.ino!==r.ino)throw new Error("local-vault: secret source changed or is too large");return pn.readFileSync(t,"utf8").replace(/[\r\n]+$/,"")}finally{pn.closeSync(t)}}var U6,j6,H6,lo=L(()=>{U6=Object.freeze({N:1<<17,r:8,p:1}),j6=256*1024*1024,H6=16*1024});var W6,fg=L(()=>{W6=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}})});import{homedir as tu}from"node:os";import{join as ru}from"node:path";function mg(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}function hg(e,t,r=!0){let n=String(mg(e,t,"")).trim().toLowerCase();return n===""?r:!k_.includes(n)}var pg,v_,J6,k_,nu=L(()=>{pg=process.env.ORACLE_PUBLIC_DESKTOP==="1",v_=pg?process.env.ORACLE_CONFIG_DIR||ru(tu(),".config","oracle"):ru(tu(),".config","oracle"),J6=pg?v_:ru(tu(),".config","mad-desk");k_=["0","false","off","no"]});var Z6,e5,t5,gg=L(()=>{nu();Z6="0".repeat(64),e5=Object.freeze({PREPARE:"exec.prepare",SIGN:"exec.sign",BROADCAST:"exec.broadcast",POLICY_REJECT:"policy.reject",AUTH_GRANT:"auth.grant",AUTH_OK:"auth.verify.ok",AUTH_FAIL:"auth.verify.fail"}),t5=Promise.resolve()});var ou=L(()=>{gg();dn();lo();qs()});var yg=L(()=>{});var Sg={};Ur(Sg,{SIGN_TIME_REVIEW_VERSION:()=>A_,SignTimeReviewSecretError:()=>li,createSignTimeReview:()=>xg});function iu(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string"){let o=e.trim().split(/\s+/);if(C_.test(e)||N_.has(o.length)&&o.every(i=>/^[a-z]+$/i.test(i)))throw new li(t);return e}if(typeof e=="bigint")return e.toString();if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new TypeError(`sign-time review: safe integer required at ${t}`);return e}if(Array.isArray(e))return e.map((o,i)=>iu(o,`${t}[${i}]`,r));mn(e,t);let n={};for(let o of Object.keys(e).sort()){let i=o.replace(/[^a-z0-9]/gi,"");if(T_.test(i))throw new li(`${t}.${o}`);e[o]!==void 0&&(n[o]=iu(e[o],`${t}.${o}`,o))}return n}function mn(e,t){if(e==null||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`sign-time review: ${t} must be a plain object`);return e}function ui(e,t){if(e==null||e==="")throw new TypeError(`sign-time review: ${t} required`);return e}function uo(e,t){let r=String(ui(e,t)).toLowerCase();if(!__.test(r))throw new TypeError(`sign-time review: ${t} must be an EVM address`);return r}function or(e,t,{positive:r=!1}={}){try{let n=BigInt(ui(e,t));if(n<0n||r&&n===0n)throw new Error;return n.toString()}catch{throw new TypeError(`sign-time review: ${t} must be an unsigned integer`)}}function su(e,t){if(typeof e!="string"||e.length===0||e.length>500||e!==e.trim())throw new TypeError(`sign-time review: ${t} must be non-empty text`);return e}function bg(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))bg(t);Object.freeze(e)}return e}function $_(e,t){if(typeof e=="boolean")return{passed:e,reason:e?"passed":"failed"};mn(e,t);let r=e.passed??e.ok??e.allowed;if(typeof r!="boolean")throw new TypeError(`sign-time review: ${t} needs a boolean result`);let n=e.reason??e.message??e.name??(r?"passed":"failed");return{...e,passed:r,reason:su(String(n),`${t}.reason`)}}function R_(e){if(!Array.isArray(e))throw new TypeError("sign-time review: policyChecks must be an array");let t=e.map((n,o)=>$_(n,`policyChecks[${o}]`)),r=t.filter(n=>!n.passed);return{checks:t,passed:t.length-r.length,failed:r.length,reasons:r.map(n=>n.reason)}}function L_(e){if(e==null)return null;if(mn(e,"simulation"),typeof e.status!="string"||!["ok","success","failed","error","unavailable","unknown"].includes(e.status))throw new TypeError("sign-time review: simulation.status is invalid");if(e.willRevert!==!0&&e.willRevert!==!1&&e.willRevert!==null)throw new TypeError("sign-time review: simulation.willRevert must be boolean or null");let t={status:e.status,willRevert:e.willRevert??null,summary:su(String(e.summary??"simulation result recorded"),"simulation.summary")};return e.gasEstimate!=null&&(t.gasEstimate=or(e.gasEstimate,"simulation.gasEstimate")),e.gasLimit!=null&&(t.gasLimit=or(e.gasLimit,"simulation.gasLimit")),t}function P_(e){if(e==null)return null;if(!Array.isArray(e)||e.length===0)throw new TypeError("sign-time review: assetDeltas must be a non-empty array");return e.map((t,r)=>{mn(t,`assetDeltas[${r}]`);let n=or(t.before,`assetDeltas[${r}].before`),o=or(t.after,`assetDeltas[${r}].after`),i=(BigInt(o)-BigInt(n)).toString(),s;try{s=t.delta==null?i:BigInt(t.delta).toString()}catch{throw new TypeError(`sign-time review: assetDeltas[${r}].delta must be an integer`)}if(s!==i)throw new TypeError(`sign-time review: assetDeltas[${r}].delta does not match before/after`);return{...t,asset:su(String(ui(t.asset??t.token,`assetDeltas[${r}].asset`)),`assetDeltas[${r}].asset`),before:n,after:o,delta:s}})}function M_(e){if(e==null)return[];if(!Array.isArray(e))throw new TypeError("sign-time review: approvalDeltas must be an array");return e.map((t,r)=>{mn(t,`approvalDeltas[${r}]`);let n=or(t.amount??t.after,`approvalDeltas[${r}].amount`);if(t.revokeLike!=null&&typeof t.revokeLike!="boolean")throw new TypeError(`sign-time review: approvalDeltas[${r}].revokeLike must be boolean`);return{token:uo(t.token,`approvalDeltas[${r}].token`),spender:uo(t.spender,`approvalDeltas[${r}].spender`),owner:uo(t.owner,`approvalDeltas[${r}].owner`),amount:n,revokeLike:t.revokeLike??BigInt(n)===0n}})}function xg(e={}){mn(e,"input");let t=iu(e),r=t.tx==null?t:mn(t.tx,"tx"),n=or(t.chainId??r.chainId,"chainId",{positive:!0}),o=uo(t.account??t.from??r.from,"account/from"),i=uo(t.destination??t.to??r.to,"destination/to"),s=String(ui(t.prepareHash,"prepareHash")).toLowerCase();if(!O_.test(s))throw new TypeError("sign-time review: prepareHash must be a 32-byte hash");let a=t.route??t.venue;if(a==null)throw new TypeError("sign-time review: route/venue required");let c=t.decodedCalldata??t.decodedAction;if(c==null)throw new TypeError("sign-time review: decodedCalldata or decodedAction required");let u=String(ui(t.calldata??t.data??r.data,"calldata/data")).toLowerCase();if(!I_.test(u))throw new TypeError("sign-time review: calldata/data must be even-length hex");let d=t.policyChecks!==void 0&&t.policyChecks!==null,f=R_(d?t.policyChecks:[]),l=L_(t.simulation),p=P_(t.assetDeltas),m=M_(t.approvalDeltas),g=t.allowlistHits??[];if(!Array.isArray(g))throw new TypeError("sign-time review: allowlistHits must be an array");let y=l?.willRevert===!0||["failed","error"].includes(l?.status),b=l!=null&&l.willRevert===!1&&["ok","success"].includes(l.status),A=y||f.failed>0?"BLOCKED":b&&d&&f.checks.length>0&&p!=null?"READY":"UNKNOWN",S=typeof c=="string"?c:c.method??c.action??c.type??"transaction",w=`${A}: review ${S} on chain ${n}; policy ${f.passed} passed, ${f.failed} failed; ${p?.length??0} asset delta${p?.length===1?"":"s"}; local signature required`,v={reviewVersion:1,status:A,requiresLocalSignature:!0,signingLocal:!0,custody:"none",execution:"review-only",chainId:n,account:o,from:o,route:a,venue:t.venue??(typeof a=="string"?a:a.venue??a.provider??null),destination:i,to:i,...t.spender==null?{}:{spender:uo(t.spender,"spender")},prepareHash:s,...t.decodedCalldata!==void 0?{decodedCalldata:t.decodedCalldata}:{decodedAction:t.decodedAction},calldata:u,data:u,selector:u.length>=10?u.slice(0,10):null,value:or(t.value??r.value??0,"value"),...(t.gasEstimate??r.gasEstimate)==null?{}:{gasEstimate:or(t.gasEstimate??r.gasEstimate,"gasEstimate")},...(t.gasLimit??r.gasLimit)==null?{}:{gasLimit:or(t.gasLimit??r.gasLimit,"gasLimit")},simulation:l,policyChecks:f,allowlistHits:g,assetDeltas:p,approvalDeltas:m,summary:w};return bg(v)}var A_,__,I_,O_,T_,C_,N_,li,au=L(()=>{A_=1,__=/^0x[0-9a-f]{40}$/,I_=/^0x(?:[0-9a-f]{2})*$/,O_=/^(?:0x)?[0-9a-f]{64}$/,T_=/(privatekey|privkey|secretkey|seedphrase|mnemonic|passphrase|password|keystore|keymaterial|wif|xprv|xpriv|bearer|authorization|signature|apikey|credential)/i,C_=/\b(?:[5KL][1-9A-HJ-NP-Za-km-z]{50,51}|xprv[0-9A-Za-z]{50,})\b/,N_=new Set([12,15,18,21,24]),li=class extends Error{constructor(t){super(`sign-time review refused: secret-bearing field at ${t}`),this.name="SignTimeReviewSecretError",this.code="SIGN_TIME_REVIEW_SECRET"}}});import{readFileSync as d5,readdirSync as f5,existsSync as B_}from"node:fs";import{dirname as D_,join as di}from"node:path";import{fileURLToPath as F_}from"node:url";function q_(){let e=[di(fi,"descriptors"),di(fi,"clear-sign","descriptors"),di(fi,"..","clear-sign","descriptors"),di(fi,"..","..","clear-sign","descriptors"),di(fi,"..","..","..","clear-sign","descriptors")];for(let t of e)if(B_(t))return t;return e[0]}var fi,g5,w5,Eg=L(()=>{fn();fi=D_(F_(import.meta.url));g5=q_(),w5=(1n<<256n)-1n});var vg=L(()=>{au();fn();Eg()});import{Wallet as A5}from"ethers";import{base58 as I5}from"@scure/base";import{ed25519 as T5}from"@noble/curves/ed25519.js";import{NETWORK as N5,TEST_NETWORK as $5,WIF as R5,p2wpkh as L5}from"@scure/btc-signer";import{pubECDSA as M5}from"@scure/btc-signer/utils.js";var kg=L(()=>{});var F5,q5,U5,j5,H5,z5,W5,K5,V5,G5,J5,Ag=L(()=>{ou();F5=Object.freeze(["spot-limit-create","spot-limit-cancel","spot-order-status"]),q5=Object.freeze(["binance","bybit","okx","coinbase"]),U5=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"}),j5=Object.freeze({binance:"/api/v3",bybit:"/v5/order",okx:"/api/v5/trade",coinbase:"/orders"}),H5=Object.freeze(["version","surface","kind","venue","credentialRef","symbol","base","quote","side","baseSize","limitPrice","maxQuoteNotional","timeInForce","clientOrderId","expiresAtMs","venueOrderId","nonce","grantId","artifactHash"]),z5=Object.freeze(["market-create","withdraw","transfer","subaccount","leverage","futures","margin","convert","api-key"]),W5=Object.freeze(["url","host","path","method","headers","signature","apiKey","apiSecret","passphrase","privateKey","redirect","proxy"]),K5=Object.freeze(["ccxt","binance-api-node","node-binance-api","coinbase-advanced-node","@okx-dex/okx-dex-sdk","bybit-api"]),V5=Object.freeze({perOrderQuote:"sealed-owner-policy",dailyGrossQuote:"sealed-owner-policy",scope:Object.freeze(["per-order","UTC-day","account","venue","quote"]),envelopeFieldIsNotCeiling:!0}),G5=Object.freeze({binanceRecvWindowMs:5e3,bybitWindowMs:5e3,maxLocalSkewMs:2e3}),J5=Object.freeze({perSecond:1,perMinute:30,bind:"tighter"})});var _g=L(()=>{lo()});var H_,Ig,Gs=L(()=>{H_=Object.freeze({binance:Object.freeze({create:["POST","/api/v3/order"],cancel:["DELETE","/api/v3/order"],status:["GET","/api/v3/order"]}),bybit:Object.freeze({create:["POST","/v5/order/create"],cancel:["POST","/v5/order/cancel"],status:["GET","/v5/order/realtime"]}),okx:Object.freeze({create:["POST","/api/v5/trade/order"],cancel:["POST","/api/v5/trade/cancel-order"],status:["GET","/api/v5/trade/order"]}),coinbase:Object.freeze({create:["POST","/orders"],cancel:["DELETE","/orders/{order_id}"],status:["GET","/orders/{order_id}"]})}),Ig=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"})});var Og=L(()=>{Gs()});var i4,Tg=L(()=>{Gs();Og();i4=256*1024});var Cg=L(()=>{Gs();Tg()});var Ng=L(()=>{lo()});import it from"node:path";import z_ from"node:os";import{createHash as W_,randomBytes as Q4}from"node:crypto";import{Interface as cu,keccak256 as e3}from"ethers";import{Transaction as r3}from"@scure/btc-signer";import{ed25519 as o3}from"@noble/curves/ed25519.js";function lu(e){let t=process.env.ORACLE_SIGNER_STATE_DIR||it.join(process.env.XDG_STATE_HOME||it.join(z_.homedir(),".local","state"),"oracle"),r=W_("sha256").update(it.resolve(e)).digest("hex").slice(0,16);return{vault:it.join(e,"vault.json"),policy:it.join(e,"signer-policy.json"),policyKey:it.join(e,"policy-integrity-key"),policyAnchor:it.join(t,`signer-policy-${r}.high-water`),ledger:it.join(e,"signer-ledger.json"),ledgerAnchor:it.join(t,`signer-ledger-${r}.high-water`),cexOrders:it.join(e,"cex-orders.json"),cexOrdersAnchor:it.join(t,`cex-orders-${r}.high-water`),token:it.join(e,"signer-token"),lock:it.join(t,`signer-${r}.lock`),workflowLedger:it.join(e,"workflow-events.jsonl")}}var L3,P3,M3,$g=L(()=>{Fh();ug();dg();qs();lo();fg();ou();yg();fn();vg();Fs();Bs();jl();Ml();Dl();Ds();Ul();Bl();ql();Rl();Ll();Fl();kg();Ag();_g();Cg();Ng();L3=new cu(["function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),P3=new cu(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),M3=new cu(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"])});var mu={};Ur(mu,{CRYPTO_DESK_TOOLS:()=>pu,runCryptoDeskTool:()=>fu,signerAck:()=>Mg,signerDeny:()=>Bg,signerPending:()=>Lg,signerQueue:()=>Pg,signerStatus:()=>Rg,vaultStatus:()=>pi});import Js from"node:fs";import Ys from"node:path";import{homedir as K_}from"node:os";function uu(){return process.env.ORACLE_CONFIG_DIR||Ys.join(K_(),".config","oracle")}function pi(){let e=lu(Ys.join(uu(),"signer")),t=Js.existsSync(e.vault),r=Js.existsSync(e.lock),n=t?r?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:t,policyConfigured:Js.existsSync(e.policy),armed:t&&!r,disarmed:r,capabilities:{swap:n,bridge:n},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}function G_(){let e=Ys.join(uu(),"signer.env");try{for(let t of Js.readFileSync(e,"utf8").split(`
|
|
11
|
+
`,{mode:384}),ni.renameSync(n,r)}function kl(e=process.env){return vl(e).watches}function Al({chain:e,token:t,condition:r,note:n}={},o=process.env){if(!e||!t||!r)throw new Error("watch requires chain, token, condition");let i={id:mA(),chain:String(e),token:String(t),condition:String(r),note:n?String(n):null,actionMode:"alert_only",createdAt:new Date().toISOString()},s=vl(o);return s.watches.push(i),vh(s,o),i}function wA(e,t=process.env){let r=vl(t),n=r.watches.filter(o=>o.id!==e);return n.length===r.watches.length?!1:(vh({watches:n},t),!0)}var _l=L(()=>{});function Il(e){let t=bA[Number(e)]||[];return new Set([...t,...yA].map(r=>String(r).trim().toLowerCase()).filter(Boolean))}var yA,bA,Ol=L(()=>{yA=["0x000000000022d473030f116ddee9f6b43ac78ba3"],bA={4663:["0xcaf681a66d020601342297493863e78c959e5cb2","0x33e885ed0ec9bf04ecfb19341582aadcb4c8a9e7","0x1f7d7550b1b028f7571e69a784071f0205fd2efa","0x0bd7d308f8e1639fab988df18a8011f41eacad73","0x5fc5360d0400a0fd4f2af552add042d716f1d168","0xb477751b76cf82d00a686a1232f5fcd772414af3","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1"],8453:["0x2626664c2603336e57b271c5c0b26f421741e481","0x6ff5693b99212da76ad316178a184ab56d299b43","0x3d4e44eb1374240ce5f1b871ab261cd16335b76a","0x33128a8fc17869897dce68ed026d694621f6fdfd","0x4200000000000000000000000000000000000006","0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","0xbe6d8f0d05cc4be24d5167a3ef062215be6d18a5","0x254cf9e1e6e233aa1ac962cb9b05b2cfeaae15b0","0x5e7bb104d84c7cb9b682aac2f3d509f5f406809a","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x888888888889758f76e7103c6cbf23abbf58f946","0x3f170631ed9821ca51a59d996ab095162438dc10","0x4f37a9d177470499a2dd084621020b023fcffc1f","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],42161:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x61ffe014ba17989e743c5f6cb21bf9697530b21e","0x82af49447d8a07e3bd95bd0d56f35241523fbab1","0xaf88d065e77c8cc2239327c5edb3a432268e5831","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9","0x888888888889758f76e7103c6cbf23abbf58f946","0xeaedc32a51c510d35ebc11088fd5ff2b47aacf2e","0x2191718cd32d02b8e60badffea33e4b5dd9a0a0d","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110","0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41","0x7452c558d45f8afc8c83dae62c3f8a5be19c71f6"],1:["0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45","0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x4cd00e387622c35bddb9b4c962c136462338bc31","0x6a000f20005980200259b80c5102003040001068","0xae563e3f8219521950555f5962419c8919758ea2","0x45312ea0eff7e09c83cbe249fa1d7598c4c8cd4e","0xc92e8bdf79f0507f65a392b0ab4667716bfe0110"],137:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0x0dcded3545d565ba3b19e683431381007245d983"],10:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xe2fa4e1d17725e72dcdafe943ecf45df4b9e285b","0x0dcded3545d565ba3b19e683431381007245d983"],56:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xa72c85c258a81761433b4e8da60505fe3dd551cc"],43114:["0x1231deb6f5749ef6ce6943a275a1d3e7486f4eae","0xf39ca6ede9bf7820a952b52f3c94af526bab9015","0x0dcded3545d565ba3b19e683431381007245d983","0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2","0x820f5ffc5b525cd4d88cd91acf2c28f16530cc68"],999:["0x0a0758d937d1059c356d4714e57f5df0239bce1a","0xd2002373543ce3527023c75e7518c274a51ce712"],2741:["0x4f8c9056bb8a3616693a76922fa35d53c056e5b3"],988:["0x026f252016a7c47cdef1f05a3fc9e20c92a49c37","0xff5cb29241f002ffed2eaa224e3e996d24a6e8d1","0x817997ca8394e26cce3de3a076a4889b27dbf9de","0x3dea4be5615974f31624404ef288ba3b36dfeb83","0xeaf7ac0fdf150cdd89340fb762d83848de6a7b83","0x779ded0c9e1022225f8e0630b35a9b54be713736","0xbc6f7725f08232c151b528bdfcaaf89993ca86ee"]}});var oi=L(()=>{});var io=L(()=>{});var ii,si=L(()=>{oi();io();ii=100});import{isAddress as UD}from"ethers";var Cl=L(()=>{si();oi();io()});import{Interface as EA,isAddress as VD}from"ethers";var XD,Ah=L(()=>{Cl();oi();io();XD=new EA(["function approve(address spender,uint256 amount) returns (bool)"])});import{Interface as vA,isAddress as eF}from"ethers";var oF,iF,_h=L(()=>{Cl();oi();io();oF=new vA(["function approve(address spender,uint256 amount) returns (bool)"]),iF=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"})});var dn=L(()=>{});import{Interface as kA,MaxUint256 as dF,isAddress as fF,keccak256 as pF,toUtf8Bytes as mF}from"ethers";var xF,fn=L(()=>{Ol();Ah();_h();dn();io();xF=new kA(["function approve(address spender,uint256 amount) returns (bool)"])});var Bs=L(()=>{fn()});import{Address as AF,NETWORK as _F,OutScript as IF,RawTx as OF,SigHash as TF,TEST_NETWORK as CF,Transaction as NF}from"@scure/btc-signer";var Rl=L(()=>{});import{createHash as AA}from"node:crypto";import{base58 as PF}from"@scure/base";import{getCompiledTransactionMessageDecoder as BF}from"@solana/transaction-messages";var Ih,DF,Ll=L(()=>{Ih=e=>AA("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),DF=new Map([[Ih("route"),{name:"route",prefixBytes:0}],[Ih("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]])});var Oh=L(()=>{cl()});var KF,VF,Ml=L(()=>{dn();Oh();KF=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),VF=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"})});var YF,Bl=L(()=>{dn();YF="0x"+"00".repeat(32)});var _A,tq,Dl=L(()=>{Bl();dn();_A=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),tq=Object.freeze(_A.map(e=>e[0]))});var Ds=L(()=>{dn()});import{TypedDataEncoder as sq,getAddress as aq,isAddress as cq}from"ethers";var IA,OA,$h=L(()=>{Tr();IA=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),OA=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]})});var dq,Rh=L(()=>{dq=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"})});var Lh=L(()=>{});import{TypedDataEncoder as bq,getAddress as xq,isAddress as Sq}from"ethers";var TA,Oq,CA,Tq,Ph=L(()=>{Ge();si();Rh();Lh();Tr();TA=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Oq=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"}),CA=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),Tq=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]})});import{TypedDataEncoder as $q,getAddress as Rq}from"ethers";var Mq,Fl=L(()=>{$h();Ph();Mq=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"])});import{Interface as Bh}from"ethers";var MA,Zq,BA,eU,tU,rU,nU,DA,oU,Fs=L(()=>{fn();si();Tr();Bs();Rl();Ll();Ml();Dl();Ds();Fl();MA=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]),Zq=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,delegate:0,identity:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0}),BA=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),eU=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),tU=new Bh(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),rU=new Bh(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),nU=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}}),DA=Object.freeze([...MA]),oU=Object.freeze({...BA})});import{encode as aU}from"@msgpack/msgpack";import{keccak256 as lU,verifyTypedData as uU}from"ethers";var dU,fU,ql=L(()=>{dU=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),fU=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]})});var Ul=L(()=>{Ds()});import{ed25519 as xU}from"@noble/curves/ed25519.js";import{base58 as EU}from"@scure/base";import{RawTx as kU,SigHash as AU,Transaction as _U}from"@scure/btc-signer";import{Transaction as OU,keccak256 as TU,verifyTypedData as CU}from"ethers";var jl=L(()=>{ql();Ul()});import{base58 as BU}from"@scure/base";var qs=L(()=>{Fs();Bs();fn();jl()});var Fh=L(()=>{qs();Fs()});import{wordlists as UA}from"ethers";function WA(e){let t=String(e).trim().toLowerCase().split(/\s+/).filter(Boolean);return zA.has(t.length)&&t.every(r=>UA.en.getWordIndex(r)>=0)}function JA(e){let t=qh(e);return GA.has(t)||VA.test(t)}function qh(e){return String(e).replace(/[^a-z0-9]/gi,"").toLowerCase()}function YA(e){let t=qh(e);return[...jA].some(r=>t.includes(r))}function XA(e,t,r){if(typeof t=="string"){if(HA.some(n=>n.test(t))||WA(t))throw new ci(r);if(KA.test(t)&&!JA(e))throw new ci(r)}}function Us(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string")return XA(r,e,t),e;if(typeof e=="number"){if(!Number.isFinite(e))throw new TypeError(`action receipt: non-finite number at ${t}`);return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map((o,i)=>Us(o,`${t}[${i}]`,r));if(typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`action receipt: JSON-like value required at ${t}`);let n={};for(let o of Object.keys(e).sort()){let i=`${t}.${o}`;if(YA(o))throw new ci(i);e[o]!==void 0&&(n[o]=Us(e[o],i,o))}return n}function re(e){return Us(e)}function Hl(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Hl).join(",")}]`:`{${Object.keys(e).map(t=>`${JSON.stringify(t)}:${Hl(e[t])}`).join(",")}}`}function so(e){return Hl(Us(e))}var jA,HA,zA,KA,VA,GA,ci,tr=L(()=>{jA=new Set(["privatekey","privkey","secretkey","seedphrase","seed","mnemonic","passphrase","password","keystore","keymaterial","wif","xprv","xpriv","bearer","authorization","signature","apikey","credential"]),HA=[/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/,/\bxprv[0-9A-Za-z]{50,}\b/],zA=new Set([12,15,18,21,24]);KA=/^\s*(?:0x)?[0-9a-fA-F]{64}\s*$/,VA=/(hash|digest|root|salt|nonce|proof|commitment|sig|id)(?:e?s)?$/i,GA=new Set(["calldata","data","publickey","pubkey","message","payload","input","extradata"]);ci=class extends Error{constructor(t){super(`action receipt refused: secret-bearing field at ${t}`),this.name="ActionReceiptSecretError",this.code="ACTION_RECEIPT_SECRET"}}});import{wordlists as QU}from"ethers";var Uh,ej,ao=L(()=>{tr();Uh=64*1024,ej=32*1024});var e_,nj,oj,Hs=L(()=>{ao();e_=["schemaVersion","buildVersion","recordType","execution","custody"],nj=[...e_,"recordHash"],oj=Object.freeze({signed:new Set(["workflow.signed","legacy.signed"]),submitted:new Set(["workflow.submitted","legacy.broadcast"]),finalized:new Set(["workflow.finalized"]),reorged:new Set(["workflow.reorged"]),orphaned:new Set(["workflow.orphaned"]),compensating:new Set(["workflow.compensating"]),compensated:new Set(["workflow.compensated"])})});var t_,Yh,lj,Gl=L(()=>{ao();Hs();t_=Object.freeze(["draft","checked","approval","signed","submitted","finalized","reorged","orphaned","compensating","compensated","failed","cancelled"]),Yh=Object.freeze(["workflow.drafted","workflow.checked","workflow.approval_requested","workflow.approval_granted","workflow.signed","workflow.submitted","workflow.finalized","workflow.reorged","workflow.orphaned","workflow.compensating","workflow.compensated","workflow.failed","workflow.cancelled","workflow.annotated"]),lj=new Set(Yh)});var a_,Xh=L(()=>{ao();Gl();a_=64*1024*1024});var gj,wj,yj,Qh=L(()=>{gj=Object.freeze(["chainId","agentAddress","accountAddress","actions","targets","maxValueWei","maxGasWei","maxSlippageBps","expiresAt","nonce","revocationKey"]),wj=Object.freeze(["read","simulate"]),yj=1440*60});function Jl(e){let t=String(e),r=t.toLowerCase().replace(/[\s._-]+/g,"");return c_.test(t)||l_.includes(r)}function u_(e){return e.replace(/"([A-Za-z0-9_-]+)"\s*:\s*"(?:0x)?([0-9a-fA-F]{64})"/g,(t,r)=>eg.includes(String(r).toLowerCase().replace(/[_-]/g,""))?`"${r}":"<hex64>"`:t)}function tg(e){let t;try{t=JSON.stringify(e)}catch(o){throw new nr("$",`unserializable-payload: ${String(o?.message||o)}`)}if(t===void 0)return"null";let r=u_(t);for(let{rule:o,re:i}of Zh)if(i.test(r))throw new nr("$<serialized>",o);if(/(?:^|[^0-9a-fA-Fx])0x[0-9a-fA-F]{64}(?![0-9a-fA-F])/.test(r))throw new nr("$<serialized>","raw-32-byte-hex-embedded");return JSON.parse(t,(o,i)=>{if(o&&Jl(o))throw new nr(`$<serialized>.${o}`,"forbidden-key-name");return i}),t}function rr(e,t="$",r=new Set,n=""){if(e==null)return e;if(typeof e=="string"){let o=eg.includes(String(n).toLowerCase().replace(/[_-]/g,""));for(let{rule:i,re:s}of Zh)if(!(o&&i.startsWith("raw-32-byte-hex"))&&s.test(e))throw new nr(t,i);return e}if(typeof e!="object"||r.has(e)||(r.add(e),ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e;if(e instanceof Map){for(let[o,i]of e.entries()){if(typeof o=="string"&&Jl(o))throw new nr(`${t}[${JSON.stringify(o)}]`,"forbidden-key-name");rr(o,`${t}[key]`,r),rr(i,`${t}[${String(o)}]`,r)}return e}if(e instanceof Set){let o=0;for(let i of e.values())rr(i,`${t}[${o++}]`,r);return e}if(Array.isArray(e))return e.forEach((o,i)=>rr(o,`${t}[${i}]`,r)),e;for(let[o,i]of Object.entries(e)){if(Jl(o))throw new nr(`${t}.${o}`,"forbidden-key-name");rr(i,`${t}.${o}`,r,o)}return e}var nr,c_,l_,Zh,eg,Yl=L(()=>{Qh();nr=class extends Error{constructor(t,r){super(`secret material must never appear in a public API object (at ${t}, rule: ${r})`),this.name="SecretLeakError",this.path=t,this.rule=r}},c_=/(private[_-]?key|secret|bearer|keystore|mnemonic|seed[_-]?phrase|passphrase|password|api[_-]?key|access[_-]?token|auth[_-]?token|session[_-]?token|signer[_-]?url|signature)/i,l_=Object.freeze(["privkey","wif","xprv","seed"]);Zh=Object.freeze([{rule:"raw-32-byte-hex-key",re:/^0x[0-9a-fA-F]{64}$/},{rule:"raw-32-byte-hex-bare",re:/^[0-9a-fA-F]{64}$/},{rule:"extended-private-key",re:/\b(?:xprv|tprv|yprv|zprv)[1-9A-HJ-NP-Za-km-z]{107}\b/},{rule:"bitcoin-wif",re:/\b[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}\b/},{rule:"bip39-mnemonic",re:/\b(?:[a-z]{3,8}\s+){11,23}[a-z]{3,8}\b/},{rule:"bearer-token",re:/bearer\s+[A-Za-z0-9._~+/=-]+/i},{rule:"pem-private-key",re:/-----BEGIN[A-Z ]*PRIVATE KEY-----/},{rule:"keystore-path",re:/keystore/i},{rule:"signer-url",re:/https?:\/\/\S*sign/i},{rule:"authorization-header",re:/authorization\s*:/i}]),eg=Object.freeze(["grantid","id","hash","sha256","sha256hex","checksum","txhash","transactionhash","blockhash","digest","userophash","commithash","prevhash","intenthash","canonicalhash","payloadhash","requestid"])});import{createHash as d_}from"node:crypto";function Ql(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ql).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ql(e[t])}`).join(",")}}`}function f_(e){return e===void 0?null:JSON.parse(JSON.stringify(e))}function zs(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))zs(t)}return e}function Zl(e,t="fact"){try{rr(e,t)}catch{throw new Error(`${t} contains custody material and is forbidden`)}}function og(e){return d_("sha256").update(Ql(e)).digest("hex")}function ig({tradeId:e,state:t,fact:r,asOf:n,previousHash:o,external:i}){let s={tradeId:e,state:t,asOf:n,previousHash:o??null,external:i===!0,fact:f_(r)};return zs({...s,hash:og(s)})}function Ws({tradeId:e,intent:t,asOf:r=0}={}){if(!e||typeof e!="string")throw new Error("tradeId is required");if(!t||typeof t!="object"||Array.isArray(t))throw new Error("intent fact is required");Zl(t,"intent");let n=ig({tradeId:e,state:"intent",fact:t,asOf:r,previousHash:null,external:!1});return zs({tradeId:e,state:"intent",events:[n],headHash:n.hash,custody:"none",execution:"prepare-only"})}function sg(e,t,r,n={}){if(Ks(e),!(rg[e.state]||[]).includes(t))throw new Error(`invalid trade transition ${e.state} -> ${t}`);if(!r||typeof r!="object"||Array.isArray(r))throw new Error(`${t} fact is required`);Zl(r,t);let i=n.external===!0||n.externallySupplied===!0;if(ng.has(t)&&!i)throw new Error(`${t} must be an externally supplied fact; this module never signs or broadcasts`);let s=e.events.at(-1),a=n.asOf??s.asOf;if(!Number.isFinite(Number(a))||Number(a)<Number(s.asOf))throw new Error("asOf must be finite and monotonic");let c=ig({tradeId:e.tradeId,state:t,fact:r,asOf:a,previousHash:s.hash,external:i});return zs({...e,state:t,events:[...e.events,c],headHash:c.hash})}function Ks(e){if(!e||!Array.isArray(e.events)||e.events.length===0)throw new Error("invalid trade lifecycle");if(e.custody!=="none")throw new Error("trade lifecycle custody must be none");if(e.execution!=="prepare-only")throw new Error("trade lifecycle execution must be prepare-only");let t=null;for(let r=0;r<e.events.length;r+=1){let n=e.events[r],{hash:o,...i}=n;if(og(i)!==o)throw new Error(`trade event ${r} hash mismatch`);if(Zl(n.fact,`trade event ${r} fact`),!Number.isFinite(Number(n.asOf))||t&&Number(n.asOf)<Number(t.asOf))throw new Error(`trade event ${r} asOf must be finite and monotonic`);if(n.tradeId!==e.tradeId||n.previousHash!==t?.hash&&r>0)throw new Error(`trade event ${r} chain mismatch`);if(r===0&&(n.state!=="intent"||n.previousHash!==null))throw new Error("trade lifecycle must start with intent");if(t&&!rg[t.state]?.includes(n.state))throw new Error(`invalid recorded transition ${t.state} -> ${n.state}`);if(ng.has(n.state)&&n.external!==!0)throw new Error(`${n.state} is not externally supplied`);t=n}if(e.state!==t.state||e.headHash!==t.hash)throw new Error("trade lifecycle head mismatch");return!0}var Xl,rg,ng,Vs=L(()=>{Yl();Xl=Object.freeze(["intent","quote_comparison","simulation","prepared","approval","signed","broadcast","settlement","balance_delta","position"]),rg=Object.freeze(Object.fromEntries(Xl.map((e,t)=>[e,Object.freeze(t+1<Xl.length?[Xl[t+1]]:[])]))),ng=new Set(["signed","broadcast"])});var p_,ag=L(()=>{Vs();ao();Hs();p_=Object.freeze({intent:"draft",quote_comparison:"draft",simulation:"draft",prepared:"checked",approval:"approval",signed:"signed",broadcast:"submitted",settlement:"finalized",balance_delta:"compensated",position:"compensated"})});var cg=L(()=>{ao();Hs();Gl();Xh();ag()});var h_,g_,w_,f6,p6,m6,h6,g6,y_,w6,lg=L(()=>{h_=Object.freeze(["owner","operator","agent","viewer"]),g_=Object.freeze(["tenant","config","policy","grant","workflow","trade","receipt","audit","telemetry","context","lifecycle"]),w_=Object.freeze({read:"read",create:"create",update:"update",delete:"delete",manage:"manage",prepare:"prepare",cancel:"cancel",export:"export",approve:"approve"}),f6=Object.freeze(["owner"]),p6=Object.freeze({ALLOW_ROLE_PERMISSION:"allow.role_permission",DENY_MISSING_CONTEXT:"deny.missing_context",DENY_INVALID_CONTEXT:"deny.invalid_context",DENY_INVALID_REQUEST:"deny.invalid_request",DENY_UNKNOWN_RESOURCE:"deny.unknown_resource",DENY_UNKNOWN_ACTION:"deny.unknown_action",DENY_UNBOUND_OBJECT:"deny.unbound_object",DENY_TENANT_MISMATCH:"deny.tenant_mismatch",DENY_RESOURCE_MISMATCH:"deny.resource_mismatch",DENY_ROLE_PERMISSION:"deny.role_permission",DENY_POLICY_NOT_APPROVER:"deny.policy_not_approver"}),m6=new Set(h_),h6=new Set(g_),g6=new Set(Object.values(w_)),y_=Object.freeze({owner:Object.freeze(["tenant:read","tenant:manage","config:read","config:manage","policy:read","policy:manage","grant:read","grant:create","grant:update","grant:delete","grant:manage","workflow:read","workflow:create","workflow:update","workflow:delete","workflow:cancel","workflow:approve","trade:read","trade:prepare","receipt:read","receipt:export","audit:read","audit:export","telemetry:read","telemetry:create","telemetry:export","context:read","context:create","context:update","context:delete","context:manage","context:export","lifecycle:read","lifecycle:create","lifecycle:update","lifecycle:delete","lifecycle:manage","lifecycle:approve","lifecycle:export"]),operator:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","workflow:cancel","trade:read","trade:prepare","receipt:read","audit:read","telemetry:read","telemetry:create","context:read","context:create","context:update","context:delete","lifecycle:read","lifecycle:create","lifecycle:update","lifecycle:manage"]),agent:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","trade:read","trade:prepare","receipt:read","telemetry:create","context:read","context:create","context:update","lifecycle:read"]),viewer:Object.freeze(["tenant:read","config:read","grant:read","workflow:read","trade:read","receipt:read","audit:read","telemetry:read","context:read","lifecycle:read"])}),w6=Object.freeze(Object.fromEntries(Object.entries(y_).map(([e,t])=>[e,Object.freeze([...t])])))});var b_,x_,S_,S6,E6,v6,k6,A6,_6,eu=L(()=>{lg();b_=Object.freeze(["succeeded","denied","invalid","failed","cancelled","timed_out","unavailable","skipped"]),x_=Object.freeze(["workflow","task","intent","plan","run","event","eval"]),S_=Object.freeze(["taskId","intentId","planId","runId","eventId"]),S6=Object.freeze({maxAttributes:24,maxKeyLength:48,maxStringLength:256,maxArrayLength:8}),E6=new Set(b_),v6=new Set(x_),k6=new Set(S_),A6=Object.freeze(["authorization","bearer","cookie","credential","password","passphrase","secret","token","privatekey","privkey","seed","mnemonic","keystore","signature","prompt","systemmessage","usermessage","assistantmessage","rawtransaction","signedtransaction","serializedtransaction","transactionbytes","calldata","callbytes","inputdata"]),_6=Object.freeze({taskId:"x-oracle-task-id",intentId:"x-oracle-intent-id",planId:"x-oracle-plan-id",runId:"x-oracle-run-id",eventId:"x-oracle-event-id"})});var $6,ug=L(()=>{cg();eu();$6=Object.freeze({"workflow.cancelled":"cancelled","workflow.failed":"failed"})});var D6,dg=L(()=>{eu();D6=32*1024*1024});import pn from"node:fs";function E_(e){if(!e.isFile())throw new Error("local-vault: secret source must be a regular file");if(e.uid!==process.getuid?.())throw new Error("local-vault: secret source must be owned by this user");if(e.nlink!==1)throw new Error("local-vault: refusing hard-linked secret source");if((e.mode&63)!==0)throw new Error("local-vault: secret source must be owner-only (0600)")}function co(e){let t;try{t=pn.openSync(e,pn.constants.O_RDONLY|pn.constants.O_NOFOLLOW)}catch(r){throw r.code==="ELOOP"?new Error("local-vault: refusing symlink"):r}try{let r=pn.fstatSync(t);if(E_(r),r.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");let n=pn.lstatSync(e);if(n.isSymbolicLink()||n.dev!==r.dev||n.ino!==r.ino)throw new Error("local-vault: secret source changed or is too large");return pn.readFileSync(t,"utf8").replace(/[\r\n]+$/,"")}finally{pn.closeSync(t)}}var U6,j6,H6,lo=L(()=>{U6=Object.freeze({N:1<<17,r:8,p:1}),j6=256*1024*1024,H6=16*1024});var W6,fg=L(()=>{W6=Object.freeze({1:{name:"ethereum",mode:"mempool-private",endpoints:["https://rpc.flashbots.net/fast","https://rpc.mevblocker.io"]},8453:{name:"base",mode:"sequencer",endpoints:["https://mainnet-sequencer.base.org"]},10:{name:"optimism",mode:"sequencer",endpoints:["https://mainnet-sequencer.optimism.io"]},42161:{name:"arbitrum",mode:"sequencer",endpoints:["https://arb1-sequencer.arbitrum.io/rpc"]},56:{name:"bsc",mode:"mempool-private",endpoints:["https://rpc.48.club","https://bsc.rpc.blxrbdn.com"]},137:{name:"polygon",mode:"mempool-private",endpoints:["https://polygon-bor-rpc.publicnode.com"]},43114:{name:"avalanche",mode:"public-only",endpoints:[]},999:{name:"hyperevm",mode:"public-only",endpoints:[]}})});import{homedir as tu}from"node:os";import{join as ru}from"node:path";function mg(e,t,r=""){let n=process.env[e];if(n!=null&&String(n).trim()!=="")return n;let o=t?process.env[t]:void 0;return o!=null&&String(o).trim()!==""?o:r}function hg(e,t,r=!0){let n=String(mg(e,t,"")).trim().toLowerCase();return n===""?r:!k_.includes(n)}var pg,v_,J6,k_,nu=L(()=>{pg=process.env.ORACLE_PUBLIC_DESKTOP==="1",v_=pg?process.env.ORACLE_CONFIG_DIR||ru(tu(),".config","oracle"):ru(tu(),".config","oracle"),J6=pg?v_:ru(tu(),".config","mad-desk");k_=["0","false","off","no"]});var Z6,e5,t5,gg=L(()=>{nu();Z6="0".repeat(64),e5=Object.freeze({PREPARE:"exec.prepare",SIGN:"exec.sign",BROADCAST:"exec.broadcast",POLICY_REJECT:"policy.reject",AUTH_GRANT:"auth.grant",AUTH_OK:"auth.verify.ok",AUTH_FAIL:"auth.verify.fail"}),t5=Promise.resolve()});var ou=L(()=>{gg();dn();lo();qs()});var yg=L(()=>{});var Sg={};Ur(Sg,{SIGN_TIME_REVIEW_VERSION:()=>A_,SignTimeReviewSecretError:()=>li,createSignTimeReview:()=>xg});function iu(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string"){let o=e.trim().split(/\s+/);if(C_.test(e)||N_.has(o.length)&&o.every(i=>/^[a-z]+$/i.test(i)))throw new li(t);return e}if(typeof e=="bigint")return e.toString();if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new TypeError(`sign-time review: safe integer required at ${t}`);return e}if(Array.isArray(e))return e.map((o,i)=>iu(o,`${t}[${i}]`,r));mn(e,t);let n={};for(let o of Object.keys(e).sort()){let i=o.replace(/[^a-z0-9]/gi,"");if(T_.test(i))throw new li(`${t}.${o}`);e[o]!==void 0&&(n[o]=iu(e[o],`${t}.${o}`,o))}return n}function mn(e,t){if(e==null||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`sign-time review: ${t} must be a plain object`);return e}function ui(e,t){if(e==null||e==="")throw new TypeError(`sign-time review: ${t} required`);return e}function uo(e,t){let r=String(ui(e,t)).toLowerCase();if(!__.test(r))throw new TypeError(`sign-time review: ${t} must be an EVM address`);return r}function or(e,t,{positive:r=!1}={}){try{let n=BigInt(ui(e,t));if(n<0n||r&&n===0n)throw new Error;return n.toString()}catch{throw new TypeError(`sign-time review: ${t} must be an unsigned integer`)}}function su(e,t){if(typeof e!="string"||e.length===0||e.length>500||e!==e.trim())throw new TypeError(`sign-time review: ${t} must be non-empty text`);return e}function bg(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))bg(t);Object.freeze(e)}return e}function $_(e,t){if(typeof e=="boolean")return{passed:e,reason:e?"passed":"failed"};mn(e,t);let r=e.passed??e.ok??e.allowed;if(typeof r!="boolean")throw new TypeError(`sign-time review: ${t} needs a boolean result`);let n=e.reason??e.message??e.name??(r?"passed":"failed");return{...e,passed:r,reason:su(String(n),`${t}.reason`)}}function R_(e){if(!Array.isArray(e))throw new TypeError("sign-time review: policyChecks must be an array");let t=e.map((n,o)=>$_(n,`policyChecks[${o}]`)),r=t.filter(n=>!n.passed);return{checks:t,passed:t.length-r.length,failed:r.length,reasons:r.map(n=>n.reason)}}function L_(e){if(e==null)return null;if(mn(e,"simulation"),typeof e.status!="string"||!["ok","success","failed","error","unavailable","unknown"].includes(e.status))throw new TypeError("sign-time review: simulation.status is invalid");if(e.willRevert!==!0&&e.willRevert!==!1&&e.willRevert!==null)throw new TypeError("sign-time review: simulation.willRevert must be boolean or null");let t={status:e.status,willRevert:e.willRevert??null,summary:su(String(e.summary??"simulation result recorded"),"simulation.summary")};return e.gasEstimate!=null&&(t.gasEstimate=or(e.gasEstimate,"simulation.gasEstimate")),e.gasLimit!=null&&(t.gasLimit=or(e.gasLimit,"simulation.gasLimit")),t}function P_(e){if(e==null)return null;if(!Array.isArray(e)||e.length===0)throw new TypeError("sign-time review: assetDeltas must be a non-empty array");return e.map((t,r)=>{mn(t,`assetDeltas[${r}]`);let n=or(t.before,`assetDeltas[${r}].before`),o=or(t.after,`assetDeltas[${r}].after`),i=(BigInt(o)-BigInt(n)).toString(),s;try{s=t.delta==null?i:BigInt(t.delta).toString()}catch{throw new TypeError(`sign-time review: assetDeltas[${r}].delta must be an integer`)}if(s!==i)throw new TypeError(`sign-time review: assetDeltas[${r}].delta does not match before/after`);return{...t,asset:su(String(ui(t.asset??t.token,`assetDeltas[${r}].asset`)),`assetDeltas[${r}].asset`),before:n,after:o,delta:s}})}function M_(e){if(e==null)return[];if(!Array.isArray(e))throw new TypeError("sign-time review: approvalDeltas must be an array");return e.map((t,r)=>{mn(t,`approvalDeltas[${r}]`);let n=or(t.amount??t.after,`approvalDeltas[${r}].amount`);if(t.revokeLike!=null&&typeof t.revokeLike!="boolean")throw new TypeError(`sign-time review: approvalDeltas[${r}].revokeLike must be boolean`);return{token:uo(t.token,`approvalDeltas[${r}].token`),spender:uo(t.spender,`approvalDeltas[${r}].spender`),owner:uo(t.owner,`approvalDeltas[${r}].owner`),amount:n,revokeLike:t.revokeLike??BigInt(n)===0n}})}function xg(e={}){mn(e,"input");let t=iu(e),r=t.tx==null?t:mn(t.tx,"tx"),n=or(t.chainId??r.chainId,"chainId",{positive:!0}),o=uo(t.account??t.from??r.from,"account/from"),i=uo(t.destination??t.to??r.to,"destination/to"),s=String(ui(t.prepareHash,"prepareHash")).toLowerCase();if(!O_.test(s))throw new TypeError("sign-time review: prepareHash must be a 32-byte hash");let a=t.route??t.venue;if(a==null)throw new TypeError("sign-time review: route/venue required");let c=t.decodedCalldata??t.decodedAction;if(c==null)throw new TypeError("sign-time review: decodedCalldata or decodedAction required");let u=String(ui(t.calldata??t.data??r.data,"calldata/data")).toLowerCase();if(!I_.test(u))throw new TypeError("sign-time review: calldata/data must be even-length hex");let d=t.policyChecks!==void 0&&t.policyChecks!==null,f=R_(d?t.policyChecks:[]),l=L_(t.simulation),p=P_(t.assetDeltas),m=M_(t.approvalDeltas),g=t.allowlistHits??[];if(!Array.isArray(g))throw new TypeError("sign-time review: allowlistHits must be an array");let y=l?.willRevert===!0||["failed","error"].includes(l?.status),b=l!=null&&l.willRevert===!1&&["ok","success"].includes(l.status),A=y||f.failed>0?"BLOCKED":b&&d&&f.checks.length>0&&p!=null?"READY":"UNKNOWN",S=typeof c=="string"?c:c.method??c.action??c.type??"transaction",w=`${A}: review ${S} on chain ${n}; policy ${f.passed} passed, ${f.failed} failed; ${p?.length??0} asset delta${p?.length===1?"":"s"}; local signature required`,v={reviewVersion:1,status:A,requiresLocalSignature:!0,signingLocal:!0,custody:"none",execution:"review-only",chainId:n,account:o,from:o,route:a,venue:t.venue??(typeof a=="string"?a:a.venue??a.provider??null),destination:i,to:i,...t.spender==null?{}:{spender:uo(t.spender,"spender")},prepareHash:s,...t.decodedCalldata!==void 0?{decodedCalldata:t.decodedCalldata}:{decodedAction:t.decodedAction},calldata:u,data:u,selector:u.length>=10?u.slice(0,10):null,value:or(t.value??r.value??0,"value"),...(t.gasEstimate??r.gasEstimate)==null?{}:{gasEstimate:or(t.gasEstimate??r.gasEstimate,"gasEstimate")},...(t.gasLimit??r.gasLimit)==null?{}:{gasLimit:or(t.gasLimit??r.gasLimit,"gasLimit")},simulation:l,policyChecks:f,allowlistHits:g,assetDeltas:p,approvalDeltas:m,summary:w};return bg(v)}var A_,__,I_,O_,T_,C_,N_,li,au=L(()=>{A_=1,__=/^0x[0-9a-f]{40}$/,I_=/^0x(?:[0-9a-f]{2})*$/,O_=/^(?:0x)?[0-9a-f]{64}$/,T_=/(privatekey|privkey|secretkey|seedphrase|mnemonic|passphrase|password|keystore|keymaterial|wif|xprv|xpriv|bearer|authorization|signature|apikey|credential)/i,C_=/\b(?:[5KL][1-9A-HJ-NP-Za-km-z]{50,51}|xprv[0-9A-Za-z]{50,})\b/,N_=new Set([12,15,18,21,24]),li=class extends Error{constructor(t){super(`sign-time review refused: secret-bearing field at ${t}`),this.name="SignTimeReviewSecretError",this.code="SIGN_TIME_REVIEW_SECRET"}}});import{readFileSync as d5,readdirSync as f5,existsSync as B_}from"node:fs";import{dirname as D_,join as di}from"node:path";import{fileURLToPath as F_}from"node:url";function q_(){let e=[di(fi,"descriptors"),di(fi,"clear-sign","descriptors"),di(fi,"..","clear-sign","descriptors"),di(fi,"..","..","clear-sign","descriptors"),di(fi,"..","..","..","clear-sign","descriptors")];for(let t of e)if(B_(t))return t;return e[0]}var fi,g5,w5,Eg=L(()=>{fn();fi=D_(F_(import.meta.url));g5=q_(),w5=(1n<<256n)-1n});var vg=L(()=>{au();fn();Eg()});import{Wallet as A5}from"ethers";import{base58 as I5}from"@scure/base";import{ed25519 as T5}from"@noble/curves/ed25519.js";import{NETWORK as N5,TEST_NETWORK as $5,WIF as R5,p2wpkh as L5}from"@scure/btc-signer";import{pubECDSA as M5}from"@scure/btc-signer/utils.js";var kg=L(()=>{});var F5,q5,U5,j5,H5,z5,W5,K5,V5,G5,J5,Ag=L(()=>{ou();F5=Object.freeze(["spot-limit-create","spot-limit-cancel","spot-order-status"]),q5=Object.freeze(["binance","bybit","okx","coinbase"]),U5=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"}),j5=Object.freeze({binance:"/api/v3",bybit:"/v5/order",okx:"/api/v5/trade",coinbase:"/orders"}),H5=Object.freeze(["version","surface","kind","venue","credentialRef","symbol","base","quote","side","baseSize","limitPrice","maxQuoteNotional","timeInForce","clientOrderId","expiresAtMs","venueOrderId","nonce","grantId","artifactHash"]),z5=Object.freeze(["market-create","withdraw","transfer","subaccount","leverage","futures","margin","convert","api-key"]),W5=Object.freeze(["url","host","path","method","headers","signature","apiKey","apiSecret","passphrase","privateKey","redirect","proxy"]),K5=Object.freeze(["ccxt","binance-api-node","node-binance-api","coinbase-advanced-node","@okx-dex/okx-dex-sdk","bybit-api"]),V5=Object.freeze({perOrderQuote:"sealed-owner-policy",dailyGrossQuote:"sealed-owner-policy",scope:Object.freeze(["per-order","UTC-day","account","venue","quote"]),envelopeFieldIsNotCeiling:!0}),G5=Object.freeze({binanceRecvWindowMs:5e3,bybitWindowMs:5e3,maxLocalSkewMs:2e3}),J5=Object.freeze({perSecond:1,perMinute:30,bind:"tighter"})});var _g=L(()=>{lo()});var H_,Ig,Gs=L(()=>{H_=Object.freeze({binance:Object.freeze({create:["POST","/api/v3/order"],cancel:["DELETE","/api/v3/order"],status:["GET","/api/v3/order"]}),bybit:Object.freeze({create:["POST","/v5/order/create"],cancel:["POST","/v5/order/cancel"],status:["GET","/v5/order/realtime"]}),okx:Object.freeze({create:["POST","/api/v5/trade/order"],cancel:["POST","/api/v5/trade/cancel-order"],status:["GET","/api/v5/trade/order"]}),coinbase:Object.freeze({create:["POST","/orders"],cancel:["DELETE","/orders/{order_id}"],status:["GET","/orders/{order_id}"]})}),Ig=Object.freeze({binance:"https://api.binance.com",bybit:"https://api.bybit.com",okx:"https://openapi.okx.com",coinbase:"https://api.exchange.coinbase.com"})});var Og=L(()=>{Gs()});var i4,Tg=L(()=>{Gs();Og();i4=256*1024});var Cg=L(()=>{Gs();Tg()});var Ng=L(()=>{lo()});import it from"node:path";import z_ from"node:os";import{createHash as W_,randomBytes as Q4}from"node:crypto";import{Interface as cu,keccak256 as e3}from"ethers";import{Transaction as r3}from"@scure/btc-signer";import{ed25519 as o3}from"@noble/curves/ed25519.js";function lu(e){let t=process.env.ORACLE_SIGNER_STATE_DIR||it.join(process.env.XDG_STATE_HOME||it.join(z_.homedir(),".local","state"),"oracle"),r=W_("sha256").update(it.resolve(e)).digest("hex").slice(0,16);return{vault:it.join(e,"vault.json"),policy:it.join(e,"signer-policy.json"),policyKey:it.join(e,"policy-integrity-key"),policyAnchor:it.join(t,`signer-policy-${r}.high-water`),ledger:it.join(e,"signer-ledger.json"),ledgerAnchor:it.join(t,`signer-ledger-${r}.high-water`),cexOrders:it.join(e,"cex-orders.json"),cexOrdersAnchor:it.join(t,`cex-orders-${r}.high-water`),token:it.join(e,"signer-token"),lock:it.join(t,`signer-${r}.lock`),workflowLedger:it.join(e,"workflow-events.jsonl")}}var L3,P3,M3,$g=L(()=>{Fh();ug();dg();qs();lo();fg();ou();yg();fn();vg();Fs();Bs();jl();Ml();Dl();Ds();Ul();Bl();ql();Rl();Ll();Fl();kg();Ag();_g();Cg();Ng();L3=new cu(["function collection() view returns (address)","function token() view returns (address)","function robinhoodSwapFeeWei() view returns (uint256)","function quoteSpecificBuy(uint256 tokenId) view returns (uint256 totalCost,uint256 baseCost,uint256 fee,uint256 protocolFee,bool available)","function quoteSellNFT() view returns (uint256 netPayout,uint256 grossPayout,uint256 fee,uint256 protocolFee)","function inventory(uint256 tokenId) view returns (bool)","function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),P3=new cu(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),M3=new cu(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"])});var mu={};Ur(mu,{CRYPTO_DESK_TOOLS:()=>pu,runCryptoDeskTool:()=>fu,signerAck:()=>Mg,signerDeny:()=>Bg,signerPending:()=>Lg,signerQueue:()=>Pg,signerStatus:()=>Rg,vaultStatus:()=>pi});import Js from"node:fs";import Ys from"node:path";import{homedir as K_}from"node:os";function uu(){return process.env.ORACLE_CONFIG_DIR||Ys.join(K_(),".config","oracle")}function pi(){let e=lu(Ys.join(uu(),"signer")),t=Js.existsSync(e.vault),r=Js.existsSync(e.lock),n=t?r?"disarmed":"armed-owner-confirmed":"inert-no-key";return{vaultExists:t,policyConfigured:Js.existsSync(e.policy),armed:t&&!r,disarmed:r,capabilities:{swap:n,bridge:n},autonomous:!1,note:"Keys stay on this machine. Exact confirmation is required before any broadcast."}}function G_(){let e=Ys.join(uu(),"signer.env");try{for(let t of Js.readFileSync(e,"utf8").split(`
|
|
12
12
|
`)){let r=t.trim();if(!r||r.startsWith("#"))continue;let n=r.indexOf("=");if(n<1)continue;let o=r.slice(0,n).trim();o!=="ORACLE_SIGNER_HOST"&&o!=="ORACLE_SIGNER_PORT"||process.env[o]||(process.env[o]=r.slice(n+1).trim().replace(/^['\"]|['\"]$/g,""))}}catch{}}function J_(){G_();let e=process.env.ORACLE_SIGNER_HOST||"127.0.0.1";if(!V_.has(e))throw new Error("signer: loopback host required");let t=Number(process.env.ORACLE_SIGNER_PORT||7432);if(!Number.isInteger(t)||t<1||t>65535)throw new Error("signer: invalid port");return{host:e,port:t,origin:`http://${e}`}}function Y_(){let e=lu(Ys.join(uu(),"signer"));return co(e.token)}async function Nr(e,t,r){let{host:n,port:o,origin:i}=J_(),s;try{s=Y_()}catch{throw new Error("local signer is not running")}if(!s)throw new Error("local signer is not running");let a;try{a=await fetch(`http://${n}:${o}${t}`,{method:e,headers:{authorization:`Bearer ${s}`,origin:i,host:`${n}:${o}`,...r?{"content-type":"application/json"}:{}},body:r?JSON.stringify(r):void 0})}catch{throw new Error("local signer is not running")}let c=await a.json().catch(()=>({}));if(!a.ok)throw new Error(c?.error||`signer ${a.status}`);return c}async function Rg(){let[e,t]=await Promise.allSettled([Nr("GET","/status"),Nr("GET","/health")]);return e.status==="fulfilled"?{ok:!0,running:!0,...e.value}:t.status==="fulfilled"?{ok:!0,running:!0,...t.value}:{ok:!1,running:!1,error:"local signer is not running"}}function du(e={}){let{confirmationNonce:t,token:r,authorization:n,...o}=e&&typeof e=="object"?e:{};return o}async function Lg(){try{let e=await Nr("GET","/pending");return{ok:!0,running:!0,items:Array.isArray(e.items)?e.items:[],armed:e.armed===!0,execution:!1,note:"Queue with signer_queue, fill with signer_ack when the loopback signer is armed."}}catch{return{ok:!1,running:!1,items:[],error:"local signer is not running"}}}async function Pg(e){if(!e||typeof e!="object")return{ok:!1,error:"artifact required"};try{let t=await Nr("POST","/pending",{artifact:e});return{ok:!0,queued:!0,execution:!1,...du(t)}}catch(t){return{ok:!1,queued:!1,error:String(t?.message||t)}}}async function Mg(e){let t=String(e||"").trim();if(!t)return{ok:!1,executed:!1,error:"id required"};try{let r=await Nr("POST","/ack",{id:t});return{ok:!0,executed:r.executed===!0,...du(r)}}catch(r){return{ok:!1,executed:!1,error:String(r?.message||r)}}}async function Bg(e){let t=String(e||"").trim();if(!t)return{ok:!1,denied:!1,error:"id required"};try{let r=await Nr("POST","/deny",{id:t});return{ok:!0,denied:r.denied===!0,...du(r)}}catch(r){return{ok:!1,denied:!1,error:String(r?.message||r)}}}async function fu(e,t={}){if(e==="vault_status")return{ok:!0,...pi()};if(e==="signer_status")return Rg();if(e==="signer_pending")return Lg();if(e==="signer_queue")return Pg(t?.artifact);if(e==="signer_ack")return Mg(t?.id||t?.digest);if(e==="signer_deny")return Bg(t?.id||t?.digest);if(e==="signer_execute"){if(!t?.artifact||!t?.confirmationNonce)throw new Error("signer_execute requires artifact and confirmationNonce from a local human confirm");return{ok:!0,...await Nr("POST","/execute",{artifact:t.artifact,confirmationNonce:t.confirmationNonce})}}if(e==="signer_disarm")return{ok:!0,...await Nr("POST","/disarm")};if(e==="receipt_report")return{ok:!0,...Ps(t?.receipt||t)};if(e==="watch_create")return{ok:!0,watch:Al(t)};if(e==="watch_list")return{ok:!0,watches:kl()};if(e==="portfolio_snapshot")return{ok:!0,note:"use oracle_cli data call portfolio snapshot \u2014 knownUsd is incomplete if a provider is missing",hint:["data","call","portfolio","snapshot"]};throw new Error(`unknown crypto desk tool: ${e}`)}var V_,pu,mi=L(()=>{Sl();_l();$g();lo();V_=new Set(["127.0.0.1","::1","localhost"]);pu=Object.freeze([{type:"function",function:{name:"vault_status",description:"Read local Oracle vault/signer readiness. Never returns key material.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_status",description:"Ping the loopback signer. Fails closed if it is not running.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_pending",description:"List pending local-signer artifacts. Read-only. Does not approve, sign, or broadcast.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"signer_queue",description:"Queue a prepared unsigned artifact on the loopback signer. Does not broadcast.",parameters:{type:"object",properties:{artifact:{type:"object"}},required:["artifact"],additionalProperties:!1}}},{type:"function",function:{name:"signer_ack",description:"Execute one pending artifact through the armed local signer (same path as Telegram Allow). Fails if the signer is not running or disarmed. Never holds keys.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_deny",description:"Drop one pending local-signer artifact. Nothing signed.",parameters:{type:"object",properties:{id:{type:"string"},digest:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"signer_execute",description:"Broadcast one already-confirmed local artifact. Requires a one-use confirmationNonce from the local signer TTY confirm. Cannot mint confirmation itself.",parameters:{type:"object",properties:{artifact:{type:"object"},confirmationNonce:{type:"string",minLength:32,maxLength:128}},required:["artifact","confirmationNonce"],additionalProperties:!1}}},{type:"function",function:{name:"signer_disarm",description:"Global kill switch. Stops the local signer from broadcasting.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"receipt_report",description:"Receipt or it did not happen. Requires transactionHash/hash/txid.",parameters:{type:"object",properties:{receipt:{type:"object"},transactionHash:{type:"string"},hash:{type:"string"},txid:{type:"string"}},additionalProperties:!1}}},{type:"function",function:{name:"watch_create",description:"Create an alert-only watch. Never execute.",parameters:{type:"object",properties:{chain:{type:"string"},token:{type:"string"},condition:{type:"string"},note:{type:"string"}},required:["chain","token","condition"],additionalProperties:!1}}},{type:"function",function:{name:"watch_list",description:"List local alert-only watches.",parameters:{type:"object",properties:{},additionalProperties:!1}}},{type:"function",function:{name:"portfolio_snapshot",description:"How to read the one portfolio snapshot. knownUsd is incomplete if a provider is missing.",parameters:{type:"object",properties:{},additionalProperties:!1}}}])});function hu(e,t){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`${t} must be a plain object`);return e}function gu(e,t="control input"){try{rr(e,t),tg(e)}catch(r){throw new TypeError(`${t} contains secret or custody material: ${r.message}`)}return e}function hi(e,{required:t=[],optional:r=[]}={},n="object"){hu(e,n);let o=new Set([...t,...r]),i=Object.keys(e).filter(s=>!o.has(s));if(i.length)throw new TypeError(`${n} has unknown field ${i[0]}`);for(let s of t)if(!Object.hasOwn(e,s))throw new TypeError(`${n}.${s} is required`);return e}function wu(e,t,r=200,{lower:n=!1}={}){if(typeof e!="string"||!e.trim()||e.length>r||X_.test(e))throw new TypeError(`${t} must be non-empty control-free text up to ${r} characters`);let o=e.trim();return n?o.toLowerCase():o}function gi(e,t,r=80){let n=wu(e,t,r,{lower:!0});if(!/^[a-z0-9][a-z0-9._:-]*$/.test(n))throw new TypeError(`${t} must be a lowercase identifier`);return n}function Xs(e,t,{positive:r=!1}={}){if(!Number.isSafeInteger(e)||e<0||r&&e===0)throw new TypeError(`${t} must be a ${r?"positive":"non-negative"} safe integer`);return e}function Et(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))Et(t);Object.freeze(e)}return e}var X_,yu=L(()=>{tr();Yl();X_=/[\u0000-\u001f\u007f]/});function Dg({family:e,chainId:t},r="chain"){let n=gi(e,`${r}.family`,40),o;if(n==="evm"){if(typeof t=="number")o=String(Xs(t,`${r}.chainId`,{positive:!0}));else if(o=wu(t,`${r}.chainId`,40),!/^[1-9][0-9]*$/.test(o))throw new TypeError(`${r}.chainId must be a positive decimal EVM chain id`)}else o=gi(t,`${r}.chainId`,80);return{family:n,chainId:o}}function eI(e,t="chain"){return hi(e,{required:["family","chainId"]},t),Et(Dg(e,t))}function Fg(e,t="finality rule"){gu(e,t),hu(e,t);let r=e.rule;if(!Q_.includes(r))throw new TypeError(`${t}.rule must be confirmations, finalizedTag, or checkpoint`);let n=r==="confirmations"?"confirmations":r;hi(e,{required:["family","chainId","rule",n]},t);let o=Dg(e,t);return r==="confirmations"?{...o,rule:r,confirmations:Xs(e.confirmations,`${t}.confirmations`,{positive:!0})}:{...o,rule:r,[n]:gi(e[n],`${t}.${n}`,80)}}function bu(e){if(!Array.isArray(e))throw new TypeError("finality policy rules must be an array");let t=e.map((n,o)=>Fg(n,`finality policy rule ${o}`)),r=new Set;for(let n of t){let o=`${n.family}\0${n.chainId}`;if(r.has(o))throw new TypeError(`duplicate finality rule for ${n.family}:${n.chainId}`);r.add(o)}return Et({policyVersion:1,rules:t})}function tI(e){if(hi(e,{required:["policyVersion","rules"]},"finality policy"),e.policyVersion!==1||!Array.isArray(e.rules))throw new TypeError("unsupported finality policy");return bu(e.rules)}function qg(e,t){let r=eI(t,"finality query"),o=tI(e).rules.find(i=>i.family===r.family&&i.chainId===r.chainId);return o?Et({status:"KNOWN",...r,rule:o}):Et({status:hn.UNKNOWN,reason:"MISSING_FINALITY_RULE",...r,rule:null})}function rI(e,t){if(e==null)return null;gu(e,"finality evidence");let r=t.rule==="confirmations"?"confirmations":t.rule;if(hi(e,{required:["status"],optional:[r]},"finality evidence"),!Z_.includes(e.status))throw new TypeError("finality evidence.status is unknown");let n={status:e.status};return e[r]!=null&&(n[r]=t.rule==="confirmations"?Xs(e.confirmations,"finality evidence.confirmations",{positive:!0}):gi(e[r],`finality evidence.${r}`,80)),n}function Ug(e,t){if(!e||e.status===hn.UNKNOWN||e.rule==null)return Et({status:hn.UNKNOWN,final:!1,reason:"MISSING_FINALITY_RULE"});let r=Fg(e.rule??e,"resolved finality rule"),n=rI(t,r);if(n==null)return Et({status:hn.UNKNOWN,final:!1,reason:"MISSING_FINALITY_EVIDENCE"});if(n.status!=="LIVE")return Et({status:hn.UNKNOWN,final:!1,reason:`${n.status}_EVIDENCE`});let o=!1;return r.rule==="confirmations"?o=n.confirmations!=null&&n.confirmations>=r.confirmations:r.rule==="finalizedTag"?o=n.finalizedTag===r.finalizedTag:o=n.checkpoint===r.checkpoint,Et({status:o?hn.FINAL:hn.INCLUDED,final:o,reason:o?"PINNED_RULE_SATISFIED":"PINNED_RULE_NOT_SATISFIED",rule:r})}var Q_,hn,Z_,jg=L(()=>{yu();Q_=Object.freeze(["confirmations","finalizedTag","checkpoint"]),hn=Object.freeze({UNKNOWN:"UNKNOWN",INCLUDED:"INCLUDED",FINAL:"FINAL"}),Z_=Object.freeze(["LIVE","STALE","UNKNOWN","UNAVAILABLE"])});function oI(e){if(e===!0||e===1||e==="1")return"SUCCESS";if(e===!1||e===0||e==="0")return"FAIL";if(typeof e!="string")return"UNKNOWN";let t=e.trim().toUpperCase();return["SUCCESS","SUCCEEDED","OK","EXECUTED"].includes(t)?"SUCCESS":["FAIL","FAILED","FAILURE","REVERTED","REJECTED"].includes(t)?"FAIL":"UNKNOWN"}function Hg(e){return typeof e=="string"&&["FAIL","FAILED","FAILURE","ORPHAN","ORPHANED","REVERTED"].includes(e.trim().toUpperCase())}function Su(e){return e==null?e:Array.isArray(e)?e.map(Su):wi(e)?Object.fromEntries(Object.keys(e).sort().map(t=>[t,Su(e[t])])):String(e)}function iI(e,t,r,n){let o=be(e.finalityEvidence,n?.finality,e.evidence),i=be(e.finalityPolicy,e.policy);try{return i==null&&wi(e.finalityRule)&&(i=bu([{family:t,chainId:r,...e.finalityRule}])),i==null||t==null||r==null?{status:"UNKNOWN",final:!1,reason:"MISSING_FINALITY_RULE"}:Ug(qg(i,{family:t,chainId:r}),o)}catch{return{status:"UNKNOWN",final:!1,reason:"MALFORMED_FINALITY_EVIDENCE"}}}function Je(e,t,r){r!=null&&(e[t]=r)}function sI(e){return e==null?null:String(e).trim().toLowerCase()}function xu(...e){let t=e.map(sI).filter(Boolean);return t.length<=1||t.every(r=>r===t[0])}function zg(e={}){if(!wi(e))throw new TypeError("verified receipt: input object required");let t=re(e),r=be(t.actionReceipt,t.receipt),n=wi(r)?r:t,o=be(t.observation,t.chainObservation,t.observedReceipt),i=wi(o),s=be(t.txHash,n.txHash,n.transactionHash,o?.txHash,o?.transactionHash),a=be(t.family,n.family,n.chain?.family,o?.family,o?.chain?.family),c=be(t.chainId,n.chainId,n.chain?.chainId,o?.chainId,o?.chain?.chainId),u=!xu(t.txHash,n.txHash,n.transactionHash,o?.txHash,o?.transactionHash)||!xu(t.family,n.family,n.chain?.family,o?.family,o?.chain?.family)||!xu(t.chainId,n.chainId,n.chain?.chainId,o?.chainId,o?.chain?.chainId),d=iI(t,a,c,i&&!u?o:null),f=oI(be(o?.receiptStatus,o?.executionStatus,o?.status)),l=be(t.reconciliationStatus,t.reconciliation?.status,o?.reconciliationStatus),p=be(t.finalityState,t.finalityEvidence?.status,t.evidence?.status,o?.finalityState),m="UNKNOWN";Hg(l)||!u&&(i&&f==="FAIL"||Hg(p))?m="FAIL":!u&&s&&i&&f==="SUCCESS"&&["INCLUDED","FINAL"].includes(d.status)&&(m="SUCCESS");let g={verifiedReceiptVersion:nI,status:m};u&&(g.reason="REFERENCE_MISMATCH"),Je(g,"txHash",s),Je(g,"chain",be(t.chain,n.chain,o?.chain)),Je(g,"family",a),Je(g,"chainId",c),Je(g,"block",be(o?.block,t.block)),Je(g,"blockState",be(o?.blockState,o?.inclusionState)),g.finalityState=d.status,Je(g,"confirmations",be(o?.confirmations,o?.finality?.confirmations,t.finalityEvidence?.confirmations,t.evidence?.confirmations)),Je(g,"observedAt",be(o?.observedAt,t.observedAt)),Je(g,"route",be(t.route,n.route)),Je(g,"prepareHash",be(t.prepareHash,n.prepareHash)),Je(g,"policyOutcome",be(t.policyOutcome,n.policyOutcome,n.policyChecks));let y=be(t.balanceChanges,o?.balanceChanges,o?.balances,n.balanceChanges,n.balances);return y!=null&&(g.balanceChanges=Su(y)),Je(g,"createdAt",be(t.createdAt,n.createdAt)),Je(g,"submittedAt",be(t.submittedAt,n.submittedAt)),Je(g,"finalizedAt",be(t.finalizedAt,o?.finalizedAt)),Je(g,"timestamps",be(t.timestamps,n.timestamps,o?.timestamps)),Et(g)}var nI,Z3,be,wi,Wg=L(()=>{tr();jg();yu();nI=1,Z3=Object.freeze(["SUCCESS","FAIL","UNKNOWN"]),be=(...e)=>e.find(t=>t!=null),wi=e=>!!e&&typeof e=="object"&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype});var Vg={};Ur(Vg,{observeEvmReceipt:()=>Kg,verifyEvmReceipt:()=>lI});function cI(e){if(e==null)return null;let t=typeof e=="number"?e:Number.parseInt(String(e),16);return Number.isSafeInteger(t)?t:null}async function Kg({txHash:e,chainId:t,rpcUrl:r},n={}){let o=String(e||"").trim().toLowerCase();if(!aI.test(o))throw new TypeError("observe receipt: txHash must be a 32-byte hash");let i=Number(t);if(!Number.isSafeInteger(i)||i<=0)throw new TypeError("observe receipt: chainId required");let s=n.transactionReceipt||ym,a=n.rpcCall||cn,c={...n.rpcOptions||{},...r?{rpcUrl:r}:{}},u;try{u=await s({txHash:o,chainId:i},c)}catch(p){return{observation:null,reason:`RPC_UNAVAILABLE: ${p.message}`}}if(!u||u.receipt==null)return{observation:null,reason:u?.reason||"receipt pending"};let d=null,f=u.blockNumber;if(Number.isSafeInteger(f))try{let p=cI(await a(i,"eth_blockNumber",[],c));p!=null&&p>=f&&(d=p-f+1)}catch{}let l={txHash:o,family:"evm",chainId:String(i),receiptStatus:u.status==="success"?"SUCCESS":u.status==="reverted"?"FAIL":"UNKNOWN",block:f==null?void 0:String(f),observedAt:new Date().toISOString(),finality:{status:"LIVE",...d==null?{}:{confirmations:d}}};return d!=null&&(l.confirmations=d),{observation:l,reason:null}}async function lI({txHash:e,chainId:t,confirmations:r=1,rpcUrl:n},o={}){let{observation:i,reason:s}=await Kg({txHash:e,chainId:t,rpcUrl:n},o),a=zg({txHash:String(e).trim().toLowerCase(),family:"evm",chainId:String(Number(t)),finalityRule:{rule:"confirmations",confirmations:r},...i?{observation:i}:{}});return{receipt:a,observed:!!i,final:a.finalityState==="FINAL",requiredConfirmations:r,reason:s}}var aI,Gg=L(()=>{Zn();Wg();aI=/^0x[0-9a-f]{64}$/});var Yg={};Ur(Yg,{classifyReceipt:()=>Ps,configDir:()=>pI,firstHourReport:()=>mI,probeReceiptModule:()=>gI,probeReviewModule:()=>hI,venueMap:()=>Jg});import uI from"node:path";import{homedir as dI}from"node:os";function pI(e=process.env){return e.ORACLE_CONFIG_DIR||uI.join(dI(),".config","oracle")}function Jg({env:e=process.env,vault:t=null}={}){let r=t||pi(),n=[];for(let[o,i]of Object.entries(bs)){let s=(i.rpcEnv||[]).some(c=>String(e[c]||"").trim()),a="prepare";i.evm?s&&(a="live"):a="unavailable",n.push({key:o,chainId:i.chainId,name:i.name,family:"evm",status:a,execute:!!(r.vaultExists&&r.armed&&!r.disarmed),note:s?"rpc configured":"public read/prepare; set RPC for live reads"})}return n.push({key:"solana",chainId:null,name:"Solana",family:"sol",status:"prepare",execute:!1,note:"Jupiter quote/prepare; local sol signer"},{key:"bitcoin",chainId:null,name:"Bitcoin",family:"btc",status:"prepare",execute:!1,note:"Esplora read; local btc signer"},{key:"hyperliquid-l1",chainId:null,name:"Hyperliquid L1",family:"data",status:"live",execute:!1,note:"data/prepare only \u2014 not an EVM signer family"},{key:"polymarket",chainId:null,name:"Polymarket",family:"data",status:"live",execute:!1,note:"data/prepare only \u2014 not a signer family"}),n}function mI({env:e=process.env,model:t=At(),vault:r=pi(),signerReachable:n=!1,quote:o=null,reviewAvailable:i=!1,receiptAvailable:s=!1}={}){let a=[],c=(p,m,g,y=null)=>a.push({id:p,status:m,detail:g,fix:y}),u=(()=>{let[p,m]=process.versions.node.split(".").map(Number);return p>20||p===20&&m>=19})();c("node",u?"ok":"fail",`node ${process.versions.node}`,u?null:"install node >= 20.19"),t?t.backend==="hermes"?c("model","warn","backend=hermes (opt-in attach)","oracle model --backend standalone"):c("model","ok",`${t.backend||"auto"} ${t.provider||""} ${t.model||""}`.trim()):c("model","fail","no model.json","oracle setup model"),r.vaultExists?r.disarmed?c("vault","warn","vault present, DISARMED","oracle signer (re-arm after confirm)"):c("vault",r.armed?"ok":"warn",r.armed?"present, armed":"present, not armed"):c("vault","fail","no local vault","oracle sign init");let d=e.ORACLE_SIGNER_HOST||"127.0.0.1";if(fI.has(d)?c("signer",n?"ok":"warn",n?`loopback ${d}:${e.ORACLE_SIGNER_PORT||9462}`:"loopback signer not reachable",n?null:"oracle signer"):c("signer","fail",`signer host ${d} is not loopback`,"unset ORACLE_SIGNER_HOST"),!o)c("quote","warn","quote not probed",null);else if(o.ok){let p=String(o.detail||"net quote returned");c("quote","ok",p.length>140?`${p.slice(0,140)}\u2026`:p)}else c("quote","warn",o.detail||"quote unavailable","check network / oracle data serve");c("review",i?"ok":"fail",i?"sign-time review renders decoded action, policy hits, approval deltas":"sign-time review module missing from this build",i?null:"reinstall @oracle-agent/oracle (src/control/sign-time-review.mjs)"),c("receipt",s?"ok":"fail",s?"oracle receipt verifies on-chain state (SUCCESS/FAIL/UNKNOWN, finality-pinned)":"verified-receipt observer missing from this build",s?null:"reinstall @oracle-agent/oracle (src/desk/observe-receipt.mjs)");let f=a.some(p=>p.status==="fail"),l=a.filter(p=>p.status==="ok").length;return{ok:!f,checks:a,firstRunScore:{ok:l,total:a.length,label:`${l}/${a.length} first-run hops green`},venues:Jg({env:e,vault:r})}}async function hI(){try{return typeof(await Promise.resolve().then(()=>(au(),Sg))).createSignTimeReview=="function"}catch{return!1}}async function gI(){try{let e=await Promise.resolve().then(()=>(Gg(),Vg));return typeof e.observeReceipt=="function"||typeof e.default=="function"||Object.values(e).some(t=>typeof t=="function")}catch{return!1}}var fI,Xg=L(()=>{Ss();mi();Fn();Sl();fI=new Set(["127.0.0.1","::1","localhost"])});Kt();import ge from"node:fs";import ce from"node:path";import bL from"node:readline/promises";import{spawnSync as xL}from"node:child_process";import $o from"node:fs";import vx from"node:path";import yx from"node:fs";import bx from"node:os";import mf from"node:path";var hf=Object.freeze([{key:"hyperliquid",aliases:["hl","hyperevm","hype","999"],chainId:999,name:"hyperliquid",kind:"evm",family:"hyperliquid",agent:"hyperliquid-agent",note:"perps \xB7 hip-3/4 \xB7 hyperevm 999",build:!0},{key:"ethereum",aliases:["eth","mainnet","1"],chainId:1,name:"ethereum",kind:"evm",family:"evm",agent:"oracle",note:"l1 \xB7 bridge hub",build:!0},{key:"base",aliases:["8453"],chainId:8453,name:"base",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"arbitrum",aliases:["arb","42161"],chainId:42161,name:"arbitrum",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"optimism",aliases:["op","10"],chainId:10,name:"optimism",kind:"evm",family:"evm",agent:"oracle",note:"op mainnet",build:!0},{key:"polygon",aliases:["matic","137"],chainId:137,name:"polygon",kind:"evm",family:"evm",agent:"oracle",note:"evm l2",build:!0},{key:"bsc",aliases:["bnb","56"],chainId:56,name:"bnb chain",kind:"evm",family:"evm",agent:"oracle",note:"bsc",build:!0},{key:"avalanche",aliases:["avax","43114"],chainId:43114,name:"avalanche",kind:"evm",family:"evm",agent:"oracle",note:"c-chain",build:!0},{key:"abstract",aliases:["abs","2741"],chainId:2741,name:"abstract",kind:"evm",family:"evm",agent:"oracle",note:"open / add agent",build:!0},{key:"stable",aliases:["988"],chainId:988,name:"stable",kind:"evm",family:"stable",agent:"stable-agent",note:"usdt0 gas \xB7 stable agent",build:!0},{key:"robinhood",aliases:["rh","4663"],chainId:4663,name:"robinhood",kind:"evm",family:"robinhood",agent:"robinhood-agent",note:"rh chain 4663",build:!0},{key:"solana",aliases:["sol"],chainId:"SOL",name:"solana",kind:"svm",family:"solana",agent:"solana-agent",note:"jup \xB7 nfts \xB7 dexs",build:!0},{key:"bitcoin",aliases:["btc"],chainId:"BTC",name:"bitcoin",kind:"utxo",family:"bitcoin",agent:"bitcoin-agent",note:"ord \xB7 runes \xB7 l1",build:!0},{key:"polymarket",aliases:["poly","polygon-poly"],chainId:137,name:"polymarket",kind:"venue",family:"polymarket",agent:"polymarket-agent",note:"prediction markets (polygon venue)",build:!1}]);function $n(e){return String(e||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}var gf=/^[a-z0-9][a-z0-9-]*$/;function xx(){let e=process.env.ORACLE_CONFIG_DIR||mf.join(bx.homedir(),".config","oracle");return mf.join(e,"chains.json")}function Sx(e){if(!e||typeof e!="object")return null;let t=String(e.key??"").trim();if(!t||/[/\\.]/.test(t))return null;let r=$n(t);if(!gf.test(r))return null;let n=typeof e.chainId=="string"?e.chainId.trim():Number(e.chainId);if(n===""||n===null||n===void 0||typeof n=="number"&&!Number.isFinite(n))return null;let o=typeof e.agent=="string"&&gf.test(e.agent.trim())?e.agent.trim():"oracle";return{key:r,aliases:Array.isArray(e.aliases)?e.aliases.map($n).filter(Boolean).slice(0,8):[],chainId:n,name:String(e.name||r).slice(0,60),kind:["evm","svm","utxo","venue"].includes(e.kind)?e.kind:"evm",family:$n(e.family)||r,agent:o,note:String(e.note||"user-defined").slice(0,80),build:e.build!==!1,source:"user"}}function Ex(e=yx.readFileSync){try{let t=JSON.parse(e(xx(),"utf8")),r=Array.isArray(t?.chains)?t.chains:[],n=[],o=new Set;for(let i of r){let s=Sx(i);!s||o.has(s.key)||(o.add(s.key),n.push(s))}return n}catch{return[]}}function wf(){let e=Ex();if(e.length===0)return hf;let t=new Map(hf.map(r=>[r.key,r]));for(let r of e)t.set(r.key,r);return[...t.values()]}function Za({buildOnly:e=!1}={}){return wf().filter(t=>e?t.build:!0)}function Rn(e){let t=$n(e);if(!t)return null;for(let r of wf())if(r.key===t||String(r.chainId).toLowerCase()===t||(r.aliases||[]).map($n).includes(t)||$n(r.name)===t)return r;return null}function yf({selectedKey:e=null,buildOnly:t=!1}={}){let r=Za({buildOnly:t}),n=["oracle chains","","pick a build/trade surface:",""];for(let o of r){let i=e&&e===o.key?"*":" ",s=String(o.chainId).padEnd(6),a=o.key.padEnd(12);n.push(`${i} ${a} ${s} ${o.note}`)}return n.push(""),n.push("usage:"),n.push(" /chain list"),n.push(" /chain hyperliquid select"),n.push(" /chain show current"),n.push(" /chain clear unset"),n.push(" oracle chain use base same from shell"),e&&n.push("",`active: ${e}`),n.join(`
|
|
13
13
|
`)+`
|
|
14
14
|
`}Kt();function ec(){return vx.join(rt(),"active-chain.json")}function Ln(){let e=ec();if(!$o.existsSync(e))return null;try{let t=JSON.parse($o.readFileSync(e,"utf8"));if(!t||typeof t!="object"||!t.key)return null;let r=Rn(t.key);return r?{key:r.key,chainId:r.chainId,name:r.name,agent:r.agent,selectedAt:t.selectedAt||null}:null}catch{return null}}function zi(e){let t=Rn(e);if(!t){let n=new Error(`unknown chain '${e}'`);throw n.code="UNKNOWN_CHAIN",n}Ie(rt());let r={key:t.key,chainId:t.chainId,name:t.name,agent:t.agent,selectedAt:new Date().toISOString()};return $o.writeFileSync(ec(),JSON.stringify(r,null,2)+`
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import{readFileSync as Je}from"node:fs";import{homedir as Ct}from"node:os";import{join as jt}from"node:path";import{createHash as Ge}from"node:crypto";var U=1,V=1,Ze=1,le="local-owner",ue="local-owner",Xe=Object.freeze(["owner","operator","agent","viewer"]),Be=Object.freeze(["tenant","config","policy","grant","workflow","trade","receipt","audit","telemetry","context","lifecycle"]),ye=Object.freeze({read:"read",create:"create",update:"update",delete:"delete",manage:"manage",prepare:"prepare",cancel:"cancel",export:"export",approve:"approve"}),We=Object.freeze(["owner"]),N=Object.freeze({ALLOW_ROLE_PERMISSION:"allow.role_permission",DENY_MISSING_CONTEXT:"deny.missing_context",DENY_INVALID_CONTEXT:"deny.invalid_context",DENY_INVALID_REQUEST:"deny.invalid_request",DENY_UNKNOWN_RESOURCE:"deny.unknown_resource",DENY_UNKNOWN_ACTION:"deny.unknown_action",DENY_UNBOUND_OBJECT:"deny.unbound_object",DENY_TENANT_MISMATCH:"deny.tenant_mismatch",DENY_RESOURCE_MISMATCH:"deny.resource_mismatch",DENY_ROLE_PERMISSION:"deny.role_permission",DENY_POLICY_NOT_APPROVER:"deny.policy_not_approver"}),ge=new Set(Xe),Q=new Set(Be),Ke=new Set(Object.values(ye)),we=new Set(["user","service","local-owner"]),Se=new Set(["verified-session","service-credential","desktop-session","owner-arm-token","local-owner"]),q=/^[A-Za-z0-9][A-Za-z0-9._:@-]{0,127}$/,Ie="tob1",be=new WeakSet,Ae=new WeakMap,Ne=Object.freeze({owner:Object.freeze(["tenant:read","tenant:manage","config:read","config:manage","policy:read","policy:manage","grant:read","grant:create","grant:update","grant:delete","grant:manage","workflow:read","workflow:create","workflow:update","workflow:delete","workflow:cancel","workflow:approve","trade:read","trade:prepare","receipt:read","receipt:export","audit:read","audit:export","telemetry:read","telemetry:create","telemetry:export","context:read","context:create","context:update","context:delete","context:manage","context:export","lifecycle:read","lifecycle:create","lifecycle:update","lifecycle:delete","lifecycle:manage","lifecycle:approve","lifecycle:export"]),operator:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","workflow:cancel","trade:read","trade:prepare","receipt:read","audit:read","telemetry:read","telemetry:create","context:read","context:create","context:update","context:delete","lifecycle:read","lifecycle:create","lifecycle:update","lifecycle:manage"]),agent:Object.freeze(["tenant:read","config:read","policy:read","grant:read","workflow:read","workflow:create","workflow:update","trade:read","trade:prepare","receipt:read","telemetry:create","context:read","context:create","context:update","lifecycle:read"]),viewer:Object.freeze(["tenant:read","config:read","grant:read","workflow:read","trade:read","receipt:read","audit:read","telemetry:read","context:read","lifecycle:read"])}),Ht=Object.freeze(Object.fromEntries(Object.entries(Ne).map(([e,t])=>[e,Object.freeze([...t])]))),g=class extends Error{constructor(t,n="invalid-context"){super(t),this.name="TenantContextError",this.code=n}};function W(e){return!!e&&typeof e=="object"&&!Array.isArray(e)&&Object.getPrototypeOf(e)===Object.prototype}function J(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))J(t)}return e}function K(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(K).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${K(e[t])}`).join(",")}}`}function Ee(e){return Ge("sha256").update(K(e)).digest("hex")}function fe(e,t,n){if(!W(e))throw new g(`${n} must be a plain object`);let r=Object.keys(e).filter(o=>!t.has(o));if(r.length)throw new g(`${n} has unknown fields: ${r.sort().join(", ")}`)}function pe(e,t){let n=String(e??"").trim();if(!q.test(n))throw new g(`${t} is invalid`);return n}function me(e,t="assignedRoles"){if(!Array.isArray(e)||e.length===0)throw new g(`${t} must contain at least one trusted role`,"missing-role-assignment");let n=[...new Set(e.map(o=>String(o??"").trim()))].sort(),r=n.filter(o=>!ge.has(o));if(r.length)throw new g(`${t} contains unknown roles: ${r.join(", ")}`,"unknown-role");return n}function Oe(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}function Qe(e){if(!W(e)||e.schemaVersion!==U||!q.test(e.tenantId||"")||typeof e.localCompatibility!="boolean")return!1;let t=e.actor;if(!W(t)||t.schemaVersion!==V||!q.test(t.actorId||"")||!we.has(t.actorType)||!Se.has(t.authSource)||!Array.isArray(t.roles)||t.roles.length===0)return!1;let n=[...new Set(t.roles)].sort();return n.every(r=>ge.has(r))&&Oe(n,t.roles)}function et(e,{assignedTenantId:t,assignedActorId:n,assignedActorType:r,assignedAuthSource:o,assignedRoles:s,assignedContextDomains:c=null,localCompatibility:p=!1}={}){let I=e;if(fe(I,new Set(["schemaVersion","tenantId","actor","localCompatibility"]),"tenant claims"),I.schemaVersion!=null&&I.schemaVersion!==U)throw new g("unsupported tenant context schema version","unsupported-version");if(![t,n,r,o].every(f=>f!=null))throw new g("trusted tenant and actor identity assignments are required","missing-trusted-identity");let b=I.actor??{};if(fe(b,new Set(["schemaVersion","actorId","actorType","authSource","roles"]),"actor claims"),b.schemaVersion!=null&&b.schemaVersion!==V)throw new g("unsupported actor identity schema version","unsupported-version");let _=pe(t,"tenantId"),C=pe(n,"actorId"),j=String(r).trim(),i=String(o).trim();if(!we.has(j))throw new g("actorType is invalid");if(!Se.has(i))throw new g("authSource is invalid");let u=me(s);if(!Array.isArray(c)&&c!=null)throw new g("assignedContextDomains must be an array","invalid-domain-assignment");let d=c==null?u.includes("owner")?["*"]:[]:[...new Set(c.map(f=>String(f??"").trim()))].sort();if(d.some(f=>f!=="*"&&!/^[a-z0-9][a-z0-9._-]{0,95}$/.test(f)))throw new g("assignedContextDomains contains an invalid domain","invalid-domain-assignment");if(b.roles!==void 0){let f;try{f=me(b.roles,"claimed roles")}catch{throw new g("claimed roles do not match the trusted assignment","forged-role")}if(!Oe(f,u))throw new g("claimed roles do not match the trusted assignment","forged-role")}if(I.localCompatibility!==void 0&&I.localCompatibility!==p)throw new g("local compatibility may only be set by the trusted boundary","forged-local-compatibility");if([[I.tenantId,_],[b.actorId,C],[b.actorType,j],[b.authSource,i]].some(([f,y])=>f!==void 0&&String(f).trim()!==y))throw new g("claimed identity does not match the trusted assignment","forged-identity");let l=J({schemaVersion:U,tenantId:_,actor:{schemaVersion:V,actorId:C,actorType:j,authSource:i,roles:u},localCompatibility:p===!0});return be.add(l),Ae.set(l,Object.freeze(d)),l}function ee(e,t){H(e);let n=String(t??"").trim();if(!/^[a-z0-9][a-z0-9._-]{0,95}$/.test(n))return!1;let r=Ae.get(e)||[];return r.includes("*")||r.includes(n)}function F(e,t){if(!ee(e,t))throw new g("context domain access denied","domain-access-denied");return t}function _e({authSource:e="local-owner"}={}){if(!new Set(["local-owner","desktop-session","owner-arm-token"]).has(e))throw new g("local owner authSource is invalid");return et({schemaVersion:U,tenantId:le,actor:{schemaVersion:V,actorId:ue,actorType:"local-owner",authSource:e}},{assignedTenantId:le,assignedActorId:ue,assignedActorType:"local-owner",assignedAuthSource:e,assignedRoles:["owner"],localCompatibility:!0})}function M(e){return be.has(e)&&Qe(e)}function H(e){if(!M(e))throw new g("a resolved tenant context is required","unresolved-context");return e}function Y(e){return Buffer.from(e,"utf8").toString("base64url")}function B(e,t){if(!e||!/^[A-Za-z0-9_-]+$/.test(e))throw new g(`${t} binding is invalid`,"invalid-object-binding");let n=Buffer.from(e,"base64url").toString("utf8");if(!n||Y(n)!==e)throw new g(`${t} binding is non-canonical`,"invalid-object-binding");return n}function Te(e){let t=String(e??"").trim();if(!t||t.length>256||/[\u0000-\u001f\u007f]/.test(t))throw new g("objectId is invalid","invalid-object-id");return t}function te(e,t,n){H(e);let r=String(t??"").trim();if(!Q.has(r))throw new g("resource is unknown","unknown-resource");let o=Te(n);return`${Ie}.${Y(e.tenantId)}.${Y(r)}.${Y(o)}`}function tt(e){let t=String(e??""),n=t.split(".");if(n.length!==4||n[0]!==Ie)throw new g("tenant-bound object id required","unbound-object");let r=B(n[1],"tenant"),o=B(n[2],"resource"),s=B(n[3],"object");if(!q.test(r)||!Q.has(o))throw new g("tenant-bound object id is invalid","invalid-object-binding");return Te(s),J({schemaVersion:1,tenantId:r,resource:o,objectId:s,boundId:t})}function nt(e){if(typeof e!="string"||!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(e))return null;let t=Date.parse(e);return Number.isFinite(t)&&new Date(t).toISOString()===e?e:null}function he(e){let t={...e,decisionId:Ee(e)};return J(t)}function rt({context:e,resource:t,action:n,objectId:r=null,decidedAt:o}={}){let s=nt(o),c={schemaVersion:Ze,recordType:"tenant.access-decision",decidedAt:s,tenantId:M(e)?e.tenantId:null,actor:M(e)?{actorId:e.actor.actorId,actorType:e.actor.actorType,authSource:e.actor.authSource,roles:[...e.actor.roles]}:null,request:{resource:typeof t=="string"?t:null,action:typeof n=="string"?n:null,objectRefHash:r==null?null:Ee(String(r))}},p=A=>he({...c,allowed:!1,outcome:"deny",reason:A});if(e==null)return p(N.DENY_MISSING_CONTEXT);if(!M(e))return p(N.DENY_INVALID_CONTEXT);if(!s)return p(N.DENY_INVALID_REQUEST);if(!Q.has(t))return p(N.DENY_UNKNOWN_RESOURCE);if(!Ke.has(n))return p(N.DENY_UNKNOWN_ACTION);if(r!=null){let A;try{A=tt(r)}catch{return p(N.DENY_UNBOUND_OBJECT)}if(A.tenantId!==e.tenantId)return p(N.DENY_TENANT_MISMATCH);if(A.resource!==t)return p(N.DENY_RESOURCE_MISMATCH)}if(n===ye.approve&&!e.actor.roles.some(b=>We.includes(b)))return p(N.DENY_ROLE_PERMISSION);let I=`${t}:${n}`,O=e.actor.roles.some(A=>Ne[A]?.includes(I));return he({...c,allowed:O,outcome:O?"allow":"deny",reason:O?N.ALLOW_ROLE_PERMISSION:N.DENY_ROLE_PERMISSION})}function ve(e){let t=rt(e);if(!t.allowed){let n=new g(`tenant access denied: ${t.reason}`,"access-denied");throw n.decision=t,n}return t}import{createHash as ot,randomUUID as st}from"node:crypto";import{chmodSync as it,closeSync as Z,constants as L,existsSync as ne,fsyncSync as re,lstatSync as ke,mkdirSync as Re,openSync as oe,readFileSync as at,renameSync as ct,unlinkSync as se,writeFileSync as xe}from"node:fs";import{dirname as De,resolve as Ce}from"node:path";function ie(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(ie).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ie(e[t])}`).join(",")}}`}function T(e){return ot("sha256").update(ie(e)).digest("hex")}function k(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){Object.freeze(e);for(let t of Object.values(e))k(t)}return e}function dt(e,t,n){let r=Ce(e),o=De(r);if(Re(o,{recursive:!0,mode:448}),ne(r)){let c=ke(r);if(!c.isFile()||c.isSymbolicLink())throw n("state path must be a regular non-symlink file","unsafe-file")}let s=`${r}.${st()}.tmp`;try{xe(s,`${JSON.stringify(t)}
|
|
2
|
+
`,{encoding:"utf8",mode:384,flag:"wx"});let c=oe(s,L.O_RDONLY);try{re(c)}finally{Z(c)}ct(s,r),it(r,384);let p;try{p=oe(o,L.O_RDONLY),re(p)}finally{p!==void 0&&Z(p)}}catch(c){try{ne(s)&&se(s)}catch{}throw c}}function lt(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw n("state must be an object","integrity-failed");if(e.schemaVersion!==t||!Array.isArray(e.events))throw n("state schema is invalid","integrity-failed");let r=null;for(let c=0;c<e.events.length;c+=1){let p=e.events[c];if(!p||typeof p!="object"||Array.isArray(p))throw n("event is invalid","integrity-failed");if(p.record&&typeof p.record.recordHash=="string"){let{recordHash:A,...b}=p.record;if(T(b)!==A)throw n("record hash integrity failed; state may be tampered","integrity-failed")}let{eventHash:I,...O}=p;if(p.sequence!==c+1||p.previousEventHash!==r||T(O)!==I)throw n("event hash chain integrity failed; state may be tampered","integrity-failed");r=I}let{stateHash:o,...s}=e;if(T(s)!==o)throw n("state hash integrity failed; state may be tampered","integrity-failed");return e}function G(e,t,n){if(!ne(e)){let s={schemaVersion:t,events:[]};return{...s,stateHash:T(s)}}let r=ke(e);if(!r.isFile()||r.isSymbolicLink())throw n("state path must be a regular non-symlink file","unsafe-file");if((r.mode&511)!==384)throw n("state file permissions must be 0600","unsafe-permissions");let o;try{o=JSON.parse(at(e,"utf8"))}catch{throw n("state JSON is malformed","integrity-failed")}return lt(o,t,n)}function ut(e,t,n){let r=`${e}.lock`,o;try{o=oe(r,L.O_CREAT|L.O_EXCL|L.O_WRONLY,384),xe(o,`${JSON.stringify({pid:process.pid,createdAt:new Date().toISOString()})}
|
|
3
|
+
`,"utf8"),re(o)}catch(s){if(o!==void 0){Z(o);try{se(r)}catch{}}throw s?.code==="EEXIST"?t("state is locked by another writer","state-locked"):s}try{return n()}finally{try{Z(o)}finally{se(r)}}}function je({path:e,schemaVersion:t,fail:n}){if(typeof e!="string"||e.length<1||e.length>4096)throw n("bounded state path required","invalid-path");if(typeof n!="function")throw new TypeError("fail factory required");let r=Ce(e);Re(De(r),{recursive:!0,mode:448});let o=G(r,t,n);function s(){let p={schemaVersion:t,events:o.events};o={...p,stateHash:T(p)},dt(r,o,n)}function c({tenantId:p,recordType:I,recordId:O,operation:A,occurredAt:b,record:_,expectedRecordHash:C=null}){return ut(r,n,()=>{if(o=G(r,t,n),(([...o.events].reverse().find(m=>m.record?.boundId===_?.boundId)??null)?.record?.recordHash??null)!==C)throw n("record changed concurrently; retry from current state","state-conflict");if(_&&typeof _.recordHash=="string"){let{recordHash:m,...l}=_;if(T(l)!==m)throw n("record hash is inconsistent","integrity-failed")}let u={sequence:o.events.length+1,previousEventHash:o.events.at(-1)?.eventHash??null,tenantId:p,recordType:I,recordId:O,operation:A,occurredAt:b,record:_},d=k({...u,eventHash:T(u)});return o={...o,events:[...o.events,d]},s(),d})}return Object.freeze({append:c,events:()=>(o=G(r,t,n),o.events.map(p=>structuredClone(p))),verify:()=>{try{return o=G(r,t,n),{ok:!0,count:o.events.length,stateHash:o.stateHash}}catch(p){return{ok:!1,reason:p?.code||"integrity-failed"}}},path:r})}var ft=Object.freeze([/(?:^|\s)Bearer\s+\S+/i,/-----BEGIN [A-Z ]*PRIVATE KEY-----/i,/\b(?:sk-|xprv|gh[pousr]_|github_pat_|AKIA|ASIA)[A-Za-z0-9_/-]{12,}\b/i,/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/,/\b(?:0x)?[0-9a-f]{64}\b/i,/(?<![1-9A-HJ-NP-Za-km-z])[59KLc][1-9A-HJ-NP-Za-km-z]{50,51}(?![1-9A-HJ-NP-Za-km-z])/,/(?<![1-9A-HJ-NP-Za-km-z])[1-9A-HJ-NP-Za-km-z]{64,88}(?![1-9A-HJ-NP-Za-km-z])/]),pt=new Set(["apikey","key","token","accesstoken","secret","password","passwd","auth","authorization","bearer","signertoken","credential","credentials","clientsecret","privatekey","xapikey","accesskey","refreshtoken"]),mt=Object.freeze(["apikey","accesskey","privatekey","clientsecret","accesstoken","refreshtoken","signertoken","credential","password","passwd","authorization","bearer","secret","token"]);function ht(e){return String(e??"").replace(/[^a-z0-9]/gi,"").toLowerCase()}function yt(e){let t;try{t=new URL(e)}catch{return!1}if(t.username||t.password)return!0;for(let n of t.searchParams.keys()){let r=ht(n);if(pt.has(r)||mt.some(o=>r.includes(o)))return!0}return!1}function $e(e){try{let t=decodeURIComponent(e);return t===e?null:t}catch{return null}}var gt=/[a-z][a-z0-9+.-]{1,15}(?::\/\/|%3a%2f%2f)\S+/gi;function wt(e){return e.replace(/[),.;:!?'"\]}]+$/,"")}function St(e){let t=e.match(gt)||[];for(let n of t){let r=wt(n),o=$e(r),s=o?$e(o):null;for(let c of[r,o,s])if(c&&yt(c))return!0}return!1}function $(e){return typeof e!="string"||e.length===0?!1:ft.some(t=>t.test(e))?!0:St(e)}var ze="oracle.context-graph/1",It="oracle.context-graph-state/1",bt=Object.freeze(["onchain","api","document","user","system","derived"]),At=/^[A-Za-z0-9][A-Za-z0-9._:@/-]{0,127}$/,Nt=/^[a-z0-9][a-z0-9._-]{0,95}$/,Et=/^[a-z][a-z0-9._-]{0,63}$/,Ot=/^[0-9a-f]{64}$/,_t=new Set(bt),Tt=32,vt=16,kt=512,Rt=366*24*60*60*1e3,xt=300*1e3,Dt=["authorization","apikey","accesskey","cookie","credential","password","passphrase","secret","token","privatekey","seed","mnemonic","keystore","signature"],ae=class extends Error{constructor(t,n="invalid-context-graph"){super(`context-graph: ${t}`),this.name="ContextGraphError",this.code=n}};function h(e,t){return new ae(e,t)}function Ve(e,t){if(typeof e!="string")throw h(`${t} must be an ISO timestamp`,"invalid-time");let n=Date.parse(e);if(!Number.isFinite(n)||new Date(n).toISOString()!==e)throw h(`${t} must be an ISO timestamp`,"invalid-time");return e}function E(e,t){let n=String(e??"").trim();if($(n))throw h(`${t} contains secret-shaped material`,"secret-material");if(!At.test(n))throw h(`${t} is invalid`,"invalid-id");return n}function R(e){let t=String(e??"").trim();if($(t))throw h("domain contains secret-shaped material","secret-material");if(!Nt.test(t))throw h("domain is invalid","invalid-domain");return t}function He(e){let t=String(e??"").trim();if($(t))throw h("relation contains secret-shaped material","secret-material");if(!Et.test(t))throw h("relation is invalid","invalid-relation");return t}function Le(e,t){if(typeof e=="string"){if(e.length>kt)throw h(`${t} string is too long`,"attribute-too-large");if($(e))throw h(`${t} contains secret-shaped material`,"secret-material");return e}if(typeof e=="boolean"||e===null||typeof e=="number"&&Number.isFinite(e))return e;throw h(`${t} must be a scalar or scalar array`,"invalid-attribute")}function Pe(e={}){if(!e||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw h("attributes must be a plain object","invalid-attributes");let t=Object.keys(e).sort();if(t.length>Tt)throw h("attributes exceed the field limit","attribute-limit");let n={};for(let r of t){if(!/^[A-Za-z][A-Za-z0-9_.-]{0,47}$/.test(r))throw h(`attribute key ${r} is invalid`,"invalid-attribute-key");let o=r.replace(/[^a-z0-9]/gi,"").toLowerCase();if(Dt.some(s=>o.includes(s)))throw h(`attribute key ${r} is forbidden because it may contain a secret`,"secret-material");if(Array.isArray(e[r])){if(e[r].length>vt)throw h(`${r} array is too long`,"attribute-limit");n[r]=e[r].map((s,c)=>Le(s,`${r}[${c}]`))}else n[r]=Le(e[r],r)}return n}function Me(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw h("provenance is required","missing-provenance");let r=String(e.sourceType??"").trim();if(!_t.has(r))throw h("provenance sourceType is invalid","invalid-provenance");let o=String(e.source??"").trim();if(!o||o.length>512||/[\u0000-\u001f\u007f]/.test(o)||$(o))throw h("provenance source is invalid","invalid-provenance");let s=String(e.evidenceHash??"").trim().toLowerCase();if(!Ot.test(s))throw h("provenance evidenceHash must be sha256","invalid-provenance");let c=Ve(e.observedAt,"provenance.observedAt");if(Date.parse(c)>Date.parse(t)+xt)throw h("provenance observedAt is too far in the future","future-observation");return{sourceType:r,source:o,observedAt:c,evidenceHash:s,verification:"unverified",assertedBy:E(n.actor.actorId,"assertedBy")}}function Ye(e,t){if(e&&Date.parse(t.observedAt)<Date.parse(e.provenance.observedAt))throw h("provenance observedAt is out of order relative to the existing record","out-of-order-provenance")}function Ue(e,t,n){if(!e||typeof e!="object"||Array.isArray(e))throw h("freshness policy is required","missing-freshness");let r=Number(e.maxAgeMs);if(!Number.isSafeInteger(r)||r<1||r>Rt)throw h("freshness.maxAgeMs is invalid","invalid-freshness");let o=Date.parse(t)+r;if(!Number.isSafeInteger(o))throw h("freshness expiry is invalid","invalid-freshness");let s=new Date(o).toISOString();return{maxAgeMs:r,expiresAt:s,status:Date.parse(n)<o?"fresh":"stale"}}function z(e){return{...e,freshness:{maxAgeMs:e.freshness.maxAgeMs,expiresAt:e.freshness.expiresAt}}}function x(e,t){if(!e)return null;let n=Date.parse(t)<Date.parse(e.freshness.expiresAt)?"fresh":"stale";return k(structuredClone({...e,freshness:{...e.freshness,status:n}}))}function P(e){let t=new Map;for(let n of e)t.set(`${n.tenantId}\0${n.recordType}\0${n.record.domain}\0${n.recordId}`,n.record);return t}function qe({path:e,now:t=()=>new Date().toISOString()}={}){let n=je({path:e,schemaVersion:It,fail:h});function r(){return Ve(t(),"now")}function o(i,u,d=null,m=r()){return d!=null&&F(i,d),ve({context:i,resource:"context",action:u,decidedAt:m})}function s(i,u,d,m){return P(n.events()).get(`${i.tenantId}\0${u}\0${d}\0${m}`)??null}function c({context:i,input:u}={}){H(i);let d=r(),m=R(u?.domain);F(i,m);let l=E(u?.nodeId,"nodeId"),f=s(i,"node",m,l);o(i,f?"update":"create",m,d);let y=Me(u?.provenance,d,i);Ye(f,y);let S=Ue(u?.freshness,y.observedAt,d),w={schemaVersion:ze,recordType:"node",tenantId:i.tenantId,boundId:te(i,"context",`node:${m}:${l}`),domain:m,nodeId:l,kind:E(u?.kind,"kind"),attributes:Pe(u?.attributes),provenance:y,freshness:S,recordedAt:d,revision:f?f.revision+1:1},a={...w,recordHash:T(z(w))};return n.append({tenantId:i.tenantId,recordType:"node",recordId:l,operation:f?"update":"create",occurredAt:d,record:z(a),expectedRecordHash:f?.recordHash??null}),x(z(a),d)}function p({context:i,input:u}={}){H(i);let d=r(),m=R(u?.domain);F(i,m);let l=E(u?.edgeId,"edgeId"),f=E(u?.fromNodeId,"fromNodeId"),y=E(u?.toNodeId,"toNodeId");if(!s(i,"node",m,f)||!s(i,"node",m,y))throw h("edge references a missing node in its domain","missing-node");let S=s(i,"edge",m,l);o(i,S?"update":"create",m,d);let w=He(u?.relation),a=Me(u?.provenance,d,i);Ye(S,a);let D=Ue(u?.freshness,a.observedAt,d),ce={schemaVersion:ze,recordType:"edge",tenantId:i.tenantId,boundId:te(i,"context",`edge:${m}:${l}`),domain:m,edgeId:l,fromNodeId:f,toNodeId:y,relation:w,attributes:Pe(u?.attributes),provenance:a,freshness:D,recordedAt:d,revision:S?S.revision+1:1},de={...ce,recordHash:T(z(ce))};return n.append({tenantId:i.tenantId,recordType:"edge",recordId:l,operation:S?"update":"create",occurredAt:d,record:z(de),expectedRecordHash:S?.recordHash??null}),x(z(de),d)}function I({context:i,domain:u,nodeId:d,includeStale:m=!1}={}){let l=r(),f=R(u);o(i,"read",f,l);let y=x(s(i,"node",f,E(d,"nodeId")),l);return y&&(m||y.freshness.status==="fresh")?y:null}function O({context:i,domain:u,edgeId:d,includeStale:m=!1}={}){let l=r(),f=R(u);o(i,"read",f,l);let y=x(s(i,"edge",f,E(d,"edgeId")),l);return y&&(m||y.freshness.status==="fresh")?y:null}function A({context:i,domain:u,kinds:d=null,includeStale:m=!1,limit:l=100}={}){let f=r(),y=R(u);if(o(i,"read",y,f),!Number.isSafeInteger(l)||l<1||l>500)throw h("query limit is invalid","invalid-limit");let S=d==null?null:new Set(d.map(a=>E(a,"kind"))),w=[...P(n.events()).values()].filter(a=>a.tenantId===i.tenantId&&a.recordType==="node"&&a.domain===y).filter(a=>!S||S.has(a.kind)).map(a=>x(a,f)).filter(a=>m||a.freshness.status==="fresh").sort((a,D)=>a.nodeId.localeCompare(D.nodeId)).slice(0,l);return k({domain:y,count:w.length,records:w})}function b({context:i,domain:u,relations:d=null,includeStale:m=!1,limit:l=100}={}){let f=r(),y=R(u);if(o(i,"read",y,f),!Number.isSafeInteger(l)||l<1||l>500)throw h("query limit is invalid","invalid-limit");let S=d==null?null:new Set(d.map(a=>He(a))),w=[...P(n.events()).values()].filter(a=>a.tenantId===i.tenantId&&a.recordType==="edge"&&a.domain===y).filter(a=>!S||S.has(a.relation)).map(a=>x(a,f)).filter(a=>m||a.freshness.status==="fresh").sort((a,D)=>a.edgeId.localeCompare(D.edgeId)).slice(0,l);return k({domain:y,count:w.length,records:w})}function _({context:i,domain:u,nodeId:d,includeStale:m=!1,limit:l=100}={}){let f=r(),y=R(u);o(i,"read",y,f);let S=E(d,"nodeId");if(!Number.isSafeInteger(l)||l<1||l>500)throw h("query limit is invalid","invalid-limit");let w=[...P(n.events()).values()].filter(a=>a.tenantId===i.tenantId&&a.recordType==="edge"&&a.domain===y).filter(a=>a.fromNodeId===S||a.toNodeId===S).map(a=>x(a,f)).filter(a=>m||a.freshness.status==="fresh").sort((a,D)=>a.edgeId.localeCompare(D.edgeId)).slice(0,l);return k({domain:y,nodeId:S,count:w.length,records:w})}function C({context:i}={}){let u=r();return o(i,"read",null,u),[...new Set([...P(n.events()).values()].filter(d=>d.tenantId===i.tenantId&&ee(i,d.domain)).map(d=>d.domain))].sort()}function j({context:i,domain:u,recordId:d,recordType:m="node",limit:l=100}={}){let f=r(),y=R(u);o(i,"read",y,f);let S=E(d,"recordId");if(!["node","edge"].includes(m))throw h("recordType must be node or edge","invalid-record-type");if(!Number.isSafeInteger(l)||l<1||l>500)throw h("history limit is invalid","invalid-limit");return n.events().filter(w=>w.tenantId===i.tenantId&&w.recordType===m&&w.record.domain===y&&w.recordId===S).slice(-l).map(w=>k({operation:w.operation,occurredAt:w.occurredAt,eventHash:w.eventHash,record:x(w.record,f)}))}return Object.freeze({putNode:c,putEdge:p,getNode:I,getEdge:O,query:A,queryEdges:b,neighbors:_,listDomains:C,history:j,verify:n.verify})}var X=`oracle context <command> [options]
|
|
4
|
+
put-node <input.json|-> create or version a node
|
|
5
|
+
put-edge <input.json|-> create or version an edge
|
|
6
|
+
get --domain D --id ID read one fresh node
|
|
7
|
+
query --domain D query fresh nodes in a domain
|
|
8
|
+
get-edge --domain D --id ID read one fresh edge
|
|
9
|
+
query-edges --domain D query fresh edges in a domain
|
|
10
|
+
neighbors --domain D --id ID
|
|
11
|
+
domains list tenant domains
|
|
12
|
+
history --domain D --id ID [--type node|edge] [--limit N] read bounded immutable record history
|
|
13
|
+
verify verify the durable hash chain
|
|
14
|
+
Options: --store PATH --include-stale`;function $t(e){let t=[],n={},r=new Set(["store","domain","id","kind","relation","limit","type"]);for(let o=0;o<e.length;o+=1){let s=e[o];if(!s.startsWith("--")){t.push(s);continue}let c=s.slice(2);if(c==="include-stale"){n[c]=!0;continue}if(!r.has(c)||e[o+1]==null)throw new TypeError(X);n[c]=e[++o]}return{positionals:t,options:n}}function Fe(e){let t=e==="-"?Je(0,"utf8"):Je(e,"utf8");return JSON.parse(t)}function v(e){process.stdout.write(`${JSON.stringify(e,null,2)}
|
|
15
|
+
`)}var Qt={name:"context",summary:"manage the tenant-scoped provenance and freshness context graph",group:"system",usage:X,async run(e){let{positionals:t,options:n}=$t(e.argv??[]),r=t[0];if(!r||["help","--help","-h"].includes(r))return process.stdout.write(`${X}
|
|
16
|
+
`),0;let o=qe({path:n.store||jt(Ct(),".config","oracle","context-graph.json")}),s=_e(),c=n["include-stale"]===!0;if(r==="put-node")v(o.putNode({context:s,input:Fe(t[1])}));else if(r==="put-edge")v(o.putEdge({context:s,input:Fe(t[1])}));else if(r==="get")v(o.getNode({context:s,domain:n.domain,nodeId:n.id,includeStale:c}));else if(r==="query")v(o.query({context:s,domain:n.domain,kinds:n.kind?[n.kind]:null,includeStale:c,limit:n.limit?Number(n.limit):100}));else if(r==="get-edge")v(o.getEdge({context:s,domain:n.domain,edgeId:n.id,includeStale:c}));else if(r==="query-edges")v(o.queryEdges({context:s,domain:n.domain,relations:n.relation?[n.relation]:null,includeStale:c,limit:n.limit?Number(n.limit):100}));else if(r==="neighbors")v(o.neighbors({context:s,domain:n.domain,nodeId:n.id,includeStale:c,limit:n.limit?Number(n.limit):100}));else if(r==="domains")v(o.listDomains({context:s}));else if(r==="history")v(o.history({context:s,domain:n.domain,recordId:n.id,recordType:n.type||"node",limit:n.limit?Number(n.limit):100}));else if(r==="verify")v(o.verify());else throw new TypeError(X);return 0}};export{Qt as default};
|