@oracle-agent/oracle 0.28.29 → 0.29.0
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 +1 -1
- package/dist/assets/skills/oracle-action-semantics/SKILL.md +1 -1
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +28 -28
- package/dist/bin/oracle-data-mcp.mjs +15 -21
- package/dist/bin/oracle-gateway.mjs +39 -39
- package/dist/bin/oracle-mev-arb-shadow.mjs +5 -5
- package/dist/bin/oracle-mev-shadow.mjs +5 -5
- package/dist/bin/oracle-public-server.mjs +4 -4
- package/dist/bin/oracle-route.mjs +10 -10
- package/dist/bin/oracle-scan.mjs +10 -10
- package/dist/cli/commands/chat.mjs +161 -161
- package/dist/cli/commands/doctor.mjs +3 -3
- package/dist/cli/commands/eval.mjs +138 -139
- package/dist/cli/commands/farm.mjs +22 -22
- package/dist/cli/commands/follow.mjs +14 -14
- package/dist/cli/commands/model.mjs +165 -165
- package/dist/cli/commands/receipt.mjs +3 -3
- package/dist/cli/commands/resolve.mjs +6 -6
- package/dist/cli/commands/sign.mjs +14 -14
- package/dist/cli/commands/signer.mjs +13 -13
- package/dist/cli/commands/snipe.mjs +8 -8
- package/dist/cli/commands/strategy.mjs +3 -3
- package/dist/cli/commands/swap.mjs +17 -17
- package/dist/cli/commands/venues.mjs +3 -3
- package/dist/data/desk-data.mjs +21 -21
- package/dist/data/names.mjs +2 -2
- package/dist/data/providers/farming.mjs +2 -2
- package/dist/index.mjs +32 -32
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +3 -3
- package/dist/local-signer/runtime.mjs +10 -10
- package/dist/nft/universal-mint-router.mjs +3 -3
- package/dist/router/index.mjs +2 -2
- package/dist/router/prepare-bridge.mjs +2 -2
- package/dist/scanner/index.mjs +3 -3
- package/dist/strategy/index.mjs +3 -3
- package/package.json +1 -1
|
@@ -1,50 +1,50 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`,{mode:384}),F.renameSync(n,r),process.platform!=="win32"&&F.chmodSync(r,384),e}var Vr,it=l(()=>{re();rt();Vr=new Set(["auto","standalone","hermes","remote","arch"])});var at=l(()=>{});var K=l(()=>{});var q=l(()=>{});var ge=l(()=>{K();q()});import{isAddress as yi}from"ethers";var ye=l(()=>{ge();K();q()});import{Interface as Xr,isAddress as vi}from"ethers";var Ci,st=l(()=>{ye();K();q();Ci=new Xr(["function approve(address spender,uint256 amount) returns (bool)"])});import{Interface as Qr,isAddress as $i}from"ethers";var Pi,Bi,ct=l(()=>{ye();K();q();Pi=new Qr(["function approve(address spender,uint256 amount) returns (bool)"]),Bi=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"})});var N=l(()=>{});import{Interface as Zr,MaxUint256 as Hi,isAddress as Wi,keccak256 as Ji,toUtf8Bytes as Gi}from"ethers";var Qi,Y=l(()=>{at();st();ct();N();q();Qi=new Zr(["function approve(address spender,uint256 amount) returns (bool)"])});var ea,ta,ut=l(()=>{ea=300*1e3,ta=(()=>{let t=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(t)&&t>0?t:1800*1e3})()});var ie=l(()=>{Y()});import{Address as aa,NETWORK as sa,OutScript as ca,RawTx as ua,SigHash as la,TEST_NETWORK as da,Transaction as fa}from"@scure/btc-signer";var xe=l(()=>{});import{createHash as tn}from"node:crypto";import{base58 as wa}from"@scure/base";import{getCompiledTransactionMessageDecoder as ya}from"@solana/transaction-messages";var lt,ba,Se=l(()=>{lt=t=>tn("sha256").update(`global:${t}`).digest().subarray(0,8).toString("hex"),ba=new Map([[lt("route"),{name:"route",prefixBytes:0}],[lt("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]])});var dt=l(()=>{});var Ta,ft=l(()=>{dt();Ta=64*1024});var pt=l(()=>{ft()});var mt=l(()=>{pt()});var qa,Da,ve=l(()=>{N();mt();qa=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"}),Da=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 Ha,ke=l(()=>{N();Ha="0x"+"00".repeat(32)});var rn,Va,Ie=l(()=>{ke();N();rn=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Va=Object.freeze(rn.map(t=>t[0]))});var ae=l(()=>{N()});import{Interface as bt}from"ethers";var cn,fs,un,ps,ms,hs,ws,ln,gs,se=l(()=>{Y();ge();ut();ie();xe();Se();ve();Ie();ae();cn=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol","hl","poly","lighter"]),fs=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0,delegate:0}),un=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"}}),ps=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),ms=new bt(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),hs=new bt(["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"]),ws=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"}}),ln=Object.freeze([...cn]),gs=Object.freeze({...un})});import{encode as Es}from"@msgpack/msgpack";import{keccak256 as Ss,verifyTypedData as As}from"ethers";var vs,ks,Te=l(()=>{vs=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),ks=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]})});var Ce=l(()=>{ae()});import{ed25519 as _s}from"@noble/curves/ed25519.js";import{base58 as Ps}from"@scure/base";import{RawTx as Fs,SigHash as Ms,Transaction as qs}from"@scure/btc-signer";import{Transaction as Us,keccak256 as js,verifyTypedData as Hs}from"ethers";var Oe=l(()=>{Te();Ce()});import{base58 as Ys}from"@scure/base";var ce=l(()=>{se();ie();Y();Oe()});var xt=l(()=>{ce();se()});var cc,uc,lc,Ne=l(()=>{cc=Object.freeze({N:1<<17,r:8,p:1}),uc=256*1024*1024,lc=16*1024});var fc,St=l(()=>{fc=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 $e}from"node:os";import{join as Le}from"node:path";var At,pn,wc,vt=l(()=>{At=process.env.ORACLE_PUBLIC_DESKTOP==="1",pn=At?process.env.ORACLE_CONFIG_DIR||Le($e(),".config","oracle"):Le($e(),".config","oracle"),wc=At?pn:Le($e(),".config","mad-desk")});var xc,Sc,Ac,kt=l(()=>{vt();xc="0".repeat(64),Sc=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"}),Ac=Promise.resolve()});var It=l(()=>{kt();N();Ne();ce()});var Tt=l(()=>{});import{Wallet as _c}from"ethers";import{base58 as Pc}from"@scure/base";import{ed25519 as Fc}from"@noble/curves/ed25519.js";import{NETWORK as qc,TEST_NETWORK as Dc,WIF as Uc,p2wpkh as jc}from"@scure/btc-signer";import{pubECDSA as Wc}from"@scure/btc-signer/utils.js";var Ct=l(()=>{});import x from"node:path";import wn from"node:os";import{createHash as gn,randomBytes as Su}from"node:crypto";import{Interface as _e,keccak256 as vu}from"ethers";import{Transaction as Iu}from"@scure/btc-signer";import{ed25519 as Cu}from"@noble/curves/ed25519.js";function Ot(t){let e=process.env.ORACLE_SIGNER_STATE_DIR||x.join(process.env.XDG_STATE_HOME||x.join(wn.homedir(),".local","state"),"oracle"),r=gn("sha256").update(x.resolve(t)).digest("hex").slice(0,16);return{vault:x.join(t,"vault.json"),policy:x.join(t,"signer-policy.json"),policyKey:x.join(t,"policy-integrity-key"),policyAnchor:x.join(e,`signer-policy-${r}.high-water`),ledger:x.join(t,"signer-ledger.json"),ledgerAnchor:x.join(e,`signer-ledger-${r}.high-water`),token:x.join(t,"signer-token"),lock:x.join(e,`signer-${r}.lock`)}}var Yu,Xu,Qu,Nt=l(()=>{xt();ce();Ne();St();It();Tt();Y();se();ie();Oe();ve();Ie();ae();Ce();ke();Te();xe();Se();Ct();Yu=new _e(["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"]),Xu=new _e(["function decimals() view returns (uint8)","function allowance(address owner,address spender) view returns (uint256)"]),Qu=new _e(["function ownerOf(uint256 tokenId) view returns (address)","function getApproved(uint256 tokenId) view returns (address)","function isApprovedForAll(address owner,address operator) view returns (bool)"])});function $t(t){return bn.get(Number(t))||null}var yn,bn,Lt=l(()=>{yn={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},bn=new Map(Object.values(yn).map(t=>[t.chainId,t]))});function c(t){return g(t)?String(t).replace(En,e=>`\\${e}`):m}function g(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!=="":!0}function S(t){if(!g(t))return m;let e=String(t).replace(/`/g,"");return e===""?m:`\`${e}\``}function $(t,{decimals:e=2}={}){if(!g(t))return m;let r=Number(t);return Number.isFinite(r)?r.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:e}):m}function y(t,{decimals:e=2}={}){let r=$(t,{decimals:e});return r===m?m:`${r} USD`}function Re(t,{decimals:e=2}={}){let r=$(t,{decimals:e});return r===m?m:`${r}%`}function ue(t){let e=$(t,{decimals:0});return e===m?m:`${e} bps`}function L(t,e){if(!g(t))return m;let r=Number(e);if(!Number.isInteger(r)||r<0||r>77)return m;let n;try{n=BigInt(typeof t=="string"?t.trim():t)}catch{return m}let o=n<0n,i=o?-n:n,s=10n**BigInt(r),a=(i/s).toString(),u=(i%s).toString().padStart(r,"0").replace(/0+$/,"");return`${o?"-":""}${a}${u?`.${u}`:""}`}function xn(t){if(typeof t=="number"&&Number.isFinite(t))return t<0||t>1?m:t>=.75?"HIGH":t>=.4?"MEDIUM":"LOW";if(typeof t=="string"){let e=t.trim().toUpperCase();if(e==="HIGH"||e==="MEDIUM"||e==="LOW")return e}return m}function I(t={}){let e=t.chainId;if(!g(e)||!Number.isFinite(Number(e)))return g(t.chain)?c(t.chain):m;let n=$t(e)?.name||(g(t.chain)?String(t.chain):m);return`${c(n)} (chainId ${Number(e)})`}function _t(t={}){return c(t.venue??t.dex??t.pool?.venue)}function Sn(t){return t==null?"NONE (text card only)":typeof t=="string"?t.trim()?S(t):"NONE (text card only)":t.error||t.ok===!1||t.available===!1?`UNAVAILABLE${g(t.error)?` \u2014 ${c(t.error)}`:""} (text card stands)`:g(t.url)?S(t.url):"NONE (text card only)"}function Pe(t={},{now:e=Date.now()}={}){let r=t.grant??t.session??null;if(!r||typeof r!="object")return{allowed:!1,reason:"no local grant/session",actions:[]};if(r.local===!1)return{allowed:!1,reason:"grant is not local",actions:[]};if(r.revoked===!0)return{allowed:!1,reason:"grant revoked",actions:[]};let n=r.expiresAt??r.expiry;if(g(n)){let i=typeof n=="number"?n:Date.parse(n);if(!Number.isFinite(i))return{allowed:!1,reason:"grant expiry unreadable",actions:[]};if(i<=e)return{allowed:!1,reason:"grant expired",actions:[]}}return{allowed:!0,reason:"valid local grant",actions:Array.isArray(r.actions)&&r.actions.length?r.actions.slice():["BUY","SELL"]}}function An(t){let e=Pe(t);return e.allowed?`${e.actions.map(r=>c(r)).join(" / ")} (${c(e.reason)})`:`prepare-only \u2014 ${c(e.reason)}`}function v(t,e,r={}){let n=[`*${t}*`];for(let[o,i]of e)n.push(`${o}: ${i==null||i===""?m:i}`);return n.push(`Chart: ${Sn(r.chart)}`),n.push(`Actions: ${An(r)}`),Array.isArray(r.warnings)&&r.warnings.length&&n.push(`Warnings: ${r.warnings.map(o=>c(o)).join("; ")}`),(g(r.source)||g(r.fetchedAt))&&n.push(`Source: ${c(r.source)} at ${c(r.fetchedAt)}`),n.join(`
|
|
4
|
-
`)}function
|
|
5
|
-
`),cancelHint:"Cards are not available on this chat. Use /approve or /deny."}:{kind:"text_menu",text:"nothing to approve",cancelHint:""}:String(t)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:[]},cancelHint:"prepare-only \u2014 no local grant/session"}:{kind:"text_menu",text:"prepare-only \u2014 no local grant/session",cancelHint:""}}var m,
|
|
2
|
+
var Gt=Object.defineProperty;var k=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var L=(t,e)=>{for(var r in e)Gt(t,r,{get:e[r],enumerable:!0})};var Ee={};L(Ee,{A2ABus:()=>oe,normalizeName:()=>W});function W(t){return String(t||"").trim().toLowerCase().replace(/^@/,"")}var oe,Re=k(()=>{oe=class{constructor({maxHops:e=4,historyCap:r=200}={}){this.maxHops=e,this.historyCap=r,this.agents=new Map,this.history=[],this.seq=0}register(e,{role:r="",chains:n=[],handler:o}={}){let a=W(e);if(!a)throw new Error("a2a: agent name required");if(this.agents.has(a))throw new Error(`a2a: agent '${a}' already registered`);if(typeof o!="function")throw new Error(`a2a: agent '${a}' needs a handler`);return this.agents.set(a,{name:a,role:String(r),chains:n.map(String),handler:o}),this.agents.get(a)}unregister(e){this.agents.delete(W(e))}roster(){return[...this.agents.values()].map(({name:e,role:r,chains:n})=>({name:e,role:r,chains:n}))}async send({from:e,to:r,text:n,kind:o="consult",hops:a=0}={}){let i=W(e),s=W(r);if(!i||!this.agents.has(i))return{ok:!1,error:`a2a: unknown sender '${e}'`};if(!s||!this.agents.has(s))return{ok:!1,error:`a2a: unknown recipient '${r}' (roster: ${[...this.agents.keys()].join(", ")||"empty"})`};if(s===i)return{ok:!1,error:"a2a: self-send refused"};let u=String(n||"").trim().slice(0,8e3);if(!u)return{ok:!1,error:"a2a: empty message"};let c=Number(a)+1;if(c>this.maxHops)return this.record({from:i,to:s,kind:o,dropped:"hop-limit"}),{ok:!1,error:`a2a: hop limit ${this.maxHops} reached \u2014 dropped`};let d={id:`a2a-${Date.now()}-${++this.seq}`,from:i,to:s,kind:String(o),text:u,hops:c,ts:new Date().toISOString()};this.record(d);try{let p=await this.agents.get(s).handler(d);return p&&this.record({id:`${d.id}-reply`,from:s,to:i,kind:"reply",text:String(p).slice(0,8e3),hops:c,ts:new Date().toISOString()}),{ok:!0,reply:p||null,id:d.id}}catch(p){return{ok:!1,error:`a2a: '${s}' handler failed: ${p.message}`}}}record(e){this.history.push(e),this.history.length>this.historyCap&&this.history.splice(0,this.history.length-this.historyCap)}recent(e=20){return this.history.slice(-e)}}});import z from"node:fs";import qt from"node:os";import N from"node:path";import{fileURLToPath as Wt}from"node:url";function ae(){return process.env.ORACLE_FAKE_HOME||qt.homedir()}function Vt(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function v(){return Vt()?process.env.ORACLE_CONFIG_DIR||N.join(ae(),".config","oracle"):N.join(ae(),".config","oracle")}function Kt(){return N.join(v(),"desk.json")}function Yt(){return N.join(v(),"env")}function I({force:t=!1}={}){if(I._done&&!t)return I._result||null;I._done=!0;let e={},r=(o,a)=>{if(a==null)return;let i=String(a).trim();i&&(process.env[o]!=null&&String(process.env[o]).trim()!==""||(process.env[o]=i,e[o]=i))};try{let o=Yt();if(z.existsSync(o))for(let a of z.readFileSync(o,"utf8").split(/\r?\n/)){let i=a.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!i||i[2].startsWith("#"))continue;let s=i[2];(s.startsWith('"')&&s.endsWith('"')||s.startsWith("'")&&s.endsWith("'"))&&(s=s.slice(1,-1)),r(i[1],s)}}catch{}try{let o=Kt();if(z.existsSync(o)){let a=JSON.parse(z.readFileSync(o,"utf8"));a&&typeof a=="object"&&(r("ORACLE_DESK_URL",a.deskUrl||a.dataUrl||a.url),r("ORACLE_DATA_URL",a.dataUrl||a.deskUrl||a.url),r("ORACLE_API_URL",a.apiUrl||a.dataUrl||a.deskUrl),r("ORACLE_PUBLIC_URL",a.publicUrl||a.deskUrl||a.dataUrl),r("ORACLE_EXEC_URL",a.execUrl),r("MAD_DESK_URL",a.deskUrl||a.dataUrl))}}catch{}let n=process.env.ORACLE_DESK_URL||process.env.ORACLE_DATA_URL||"";return n&&(r("ORACLE_DESK_URL",n),r("ORACLE_DATA_URL",n),r("ORACLE_API_URL",n),r("ORACLE_PUBLIC_URL",n),r("MAD_DESK_URL",n)),I._result=Object.keys(e).length?e:null,I._result}function X(t){return z.mkdirSync(t,{recursive:!0}),t}var zt,Fn,Q=k(()=>{zt=N.dirname(Wt(import.meta.url)),Fn=N.resolve(zt,"../..");try{I()}catch{}});function Z(t){return String(t||"").trim()||void 0}function Xt(t,{required:e=!1}={}){let r=Z(t)?.toLowerCase();if(!r){if(e)throw new Error("model provider is required");return}if(!Jt.has(r))throw new Error(`unsupported provider: ${r}`);return r}function Qt(t,{required:e=!1}={}){let r=Z(t);if(!r){if(e)throw new Error("model is required");return}if(r.includes("..")||r.startsWith("/")||!/^[a-zA-Z0-9._:/-]{1,200}$/.test(r))throw new Error("invalid model id");return r}function Zt(t){let e=Z(t);if(!e||e.length>2048)throw new Error("invalid custom base URL");let r;try{r=new URL(e)}catch{throw new Error("invalid custom base URL")}let n=r.hostname.toLowerCase().replace(/^\[|\]$/g,""),o=n==="localhost"||n==="127.0.0.1"||n==="::1";if(r.protocol!=="https:"&&!(r.protocol==="http:"&&o)||r.username||r.password||r.search||r.hash)throw new Error("custom base URL must use HTTPS or loopback HTTP without credentials, query, or fragment");return r.toString().replace(/\/+$/,"")}function Oe({provider:t,model:e,baseUrl:r}={},{requireModel:n=!1}={}){let o=Xt(t),a=Qt(e,{required:n});if(o==="custom")return{provider:o,...a?{model:a}:{},baseUrl:Zt(r)};if(Z(r))throw new Error("baseUrl is only supported for the custom provider");return{...o?{provider:o}:{},...a?{model:a}:{}}}var Jt,Le=k(()=>{Jt=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","nous","qwen","glm","custom","anthropic-oauth","openai-codex","xai-oauth"])});import T from"node:fs";import ie from"node:path";function Ie(){return ie.join(v(),"model.json")}function P(t){return String(t||"").trim()||void 0}function Ne(t={}){let e=P(t.backend)?.toLowerCase()||"auto",r=Oe({provider:t.provider,model:t.model,baseUrl:t.baseUrl},{requireModel:e==="standalone"}),n=P(t.apiKeyEnv),o=Number.parseInt(String(t.contextLength||""),10),a=P(t.reasoningEffort),i=P(t.computeHost||t.remoteHost),s=P(t.computeUser||t.remoteUser),u=P(t.computePath||t.remotePath);if(!er.has(e))throw new Error(`unsupported backend: ${e}`);if(process.env.ORACLE_PUBLIC_DESKTOP==="1"&&["remote","arch"].includes(e))throw new Error("remote compute backends are disabled in the public desktop");if(n&&!/^[A-Z][A-Z0-9_]*$/.test(n))throw new Error("api key env must be an uppercase environment variable name");if(e==="remote"&&!i)throw new Error("remote backend requires computeHost");return{backend:e,...r,...n?{apiKeyEnv:n}:{},...Number.isFinite(o)&&o>0?{contextLength:o}:{},...a?{reasoningEffort:a}:{},...i?{computeHost:i}:{},...s?{computeUser:s}:{},...u?{computePath:u}:{}}}function U(){let t=Ie();if(!T.existsSync(t))return null;try{return Ne(JSON.parse(T.readFileSync(t,"utf8")))}catch{return null}}function se(t){let e=Ne(t),r=Ie();X(ie.dirname(r)),process.platform!=="win32"&&T.chmodSync(ie.dirname(r),448);let n=`${r}.${process.pid}.tmp`;return T.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
3
|
+
`,{mode:384}),T.renameSync(n,r),process.platform!=="win32"&&T.chmodSync(r,384),e}var er,Pe=k(()=>{Q();Le();er=new Set(["auto","standalone","hermes","remote","arch"])});import{existsSync as tr,readFileSync as rr}from"node:fs";import{request as nr}from"node:http";import or from"node:path";function ir(t=process.env){let e=String(t.ORACLE_SIGNER_URL||ar).replace(/\/$/,""),r;try{r=new URL(e)}catch{return null}return r.hostname!=="127.0.0.1"&&r.hostname!=="localhost"&&r.hostname!=="::1"?null:r.origin}function sr(t=process.env){if(t.ORACLE_SIGNER_TOKEN)return String(t.ORACLE_SIGNER_TOKEN);let e=or.join(v(),"signer","signer-token");return tr(e)?rr(e,"utf8").trim():null}function j(t,{method:e="GET",body:r=null,env:n=process.env,timeoutMs:o=4e3}={}){let a=ir(n),i=sr(n);return!a||!i?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(s=>{let u=new URL(t,a),c=r?Buffer.from(JSON.stringify(r)):null,d=nr({hostname:u.hostname,port:u.port||80,path:u.pathname,method:e,timeout:o,headers:{authorization:`Bearer ${i}`,origin:a,...c?{"content-type":"application/json","content-length":c.length}:{}}},p=>{let f=[];p.on("data",g=>f.push(g)),p.on("end",()=>{let g=Buffer.concat(f).toString("utf8"),y={};try{y=g?JSON.parse(g):{}}catch{y={error:"signer refused"}}s({httpStatus:p.statusCode,...y})})});d.on("timeout",()=>{d.destroy(),s({ok:!1,error:"local signer timed out"})}),d.on("error",()=>s({ok:!1,error:"local signer is not running"})),c&&d.write(c),d.end()})}var ar,ee=k(()=>{Q();ar="http://127.0.0.1:9462"});function Te(t){return lr.get(Number(t))||null}var cr,lr,Ue=k(()=>{cr={robinhood:{chainId:4663,name:"Robinhood Chain",rpcEnv:["RH_CHAIN_RPC"],evm:!0},ethereum:{chainId:1,name:"Ethereum",rpcEnv:["ETH_RPC_URL","ETHEREUM_RPC_URL","MAINNET_RPC_URL"],evm:!0},polygon:{chainId:137,name:"Polygon",rpcEnv:["POLYGON_RPC_URL","POLYGON_RPC"],evm:!0},arbitrum:{chainId:42161,name:"Arbitrum One",rpcEnv:["ARBITRUM_RPC_URL","ARB_RPC_URL"],evm:!0},base:{chainId:8453,name:"Base",rpcEnv:["BASE_RPC_URL"],evm:!0},hyperevm:{chainId:999,name:"HyperEVM",rpcEnv:["HYPEREVM_RPC_URL","HYPER_EVM_RPC"],evm:!0},bsc:{chainId:56,name:"BNB Smart Chain",rpcEnv:["BSC_RPC_URL","BNB_RPC_URL"],evm:!0},avalanche:{chainId:43114,name:"Avalanche C-Chain",rpcEnv:["AVALANCHE_RPC_URL","AVAX_RPC_URL"],evm:!0},optimism:{chainId:10,name:"OP Mainnet",rpcEnv:["OPTIMISM_RPC_URL","OP_RPC_URL"],evm:!0},abstract:{chainId:2741,name:"Abstract",rpcEnv:["ABSTRACT_RPC_URL","ABS_RPC_URL"],evm:!0},stable:{chainId:988,name:"Stable Mainnet",rpcEnv:["STABLE_RPC_URL","STABLE_RPC"],evm:!0}},lr=new Map(Object.values(cr).map(t=>[t.chainId,t]))});function l(t){return w(t)?String(t).replace(ur,e=>`\\${e}`):m}function w(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!=="":!0}function S(t){if(!w(t))return m;let e=String(t).replace(/`/g,"");return e===""?m:`\`${e}\``}function R(t,{decimals:e=2}={}){if(!w(t))return m;let r=Number(t);return Number.isFinite(r)?r.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:e}):m}function b(t,{decimals:e=2}={}){let r=R(t,{decimals:e});return r===m?m:`${r} USD`}function ce(t,{decimals:e=2}={}){let r=R(t,{decimals:e});return r===m?m:`${r}%`}function te(t){let e=R(t,{decimals:0});return e===m?m:`${e} bps`}function O(t,e){if(!w(t))return m;let r=Number(e);if(!Number.isInteger(r)||r<0||r>77)return m;let n;try{n=BigInt(typeof t=="string"?t.trim():t)}catch{return m}let o=n<0n,a=o?-n:n,i=10n**BigInt(r),s=(a/i).toString(),u=(a%i).toString().padStart(r,"0").replace(/0+$/,"");return`${o?"-":""}${s}${u?`.${u}`:""}`}function dr(t){if(typeof t=="number"&&Number.isFinite(t))return t<0||t>1?m:t>=.75?"HIGH":t>=.4?"MEDIUM":"LOW";if(typeof t=="string"){let e=t.trim().toUpperCase();if(e==="HIGH"||e==="MEDIUM"||e==="LOW")return e}return m}function C(t={}){let e=t.chainId;if(!w(e)||!Number.isFinite(Number(e)))return w(t.chain)?l(t.chain):m;let n=Te(e)?.name||(w(t.chain)?String(t.chain):m);return`${l(n)} (chainId ${Number(e)})`}function je(t={}){return l(t.venue??t.dex??t.pool?.venue)}function pr(t){return t==null?"NONE (text card only)":typeof t=="string"?t.trim()?S(t):"NONE (text card only)":t.error||t.ok===!1||t.available===!1?`UNAVAILABLE${w(t.error)?` \u2014 ${l(t.error)}`:""} (text card stands)`:w(t.url)?S(t.url):"NONE (text card only)"}function le(t={},{now:e=Date.now()}={}){let r=t.grant??t.session??null;if(!r||typeof r!="object")return{allowed:!1,reason:"no local grant/session",actions:[]};if(r.local===!1)return{allowed:!1,reason:"grant is not local",actions:[]};if(r.revoked===!0)return{allowed:!1,reason:"grant revoked",actions:[]};let n=r.expiresAt??r.expiry;if(w(n)){let a=typeof n=="number"?n:Date.parse(n);if(!Number.isFinite(a))return{allowed:!1,reason:"grant expiry unreadable",actions:[]};if(a<=e)return{allowed:!1,reason:"grant expired",actions:[]}}return{allowed:!0,reason:"valid local grant",actions:Array.isArray(r.actions)&&r.actions.length?r.actions.slice():["BUY","SELL"]}}function mr(t){let e=le(t);return e.allowed?`${e.actions.map(r=>l(r)).join(" / ")} (${l(e.reason)})`:`prepare-only \u2014 ${l(e.reason)}`}function $(t,e,r={}){let n=[`*${t}*`];for(let[o,a]of e)n.push(`${o}: ${a==null||a===""?m:a}`);return n.push(`Chart: ${pr(r.chart)}`),n.push(`Actions: ${mr(r)}`),Array.isArray(r.warnings)&&r.warnings.length&&n.push(`Warnings: ${r.warnings.map(o=>l(o)).join("; ")}`),(w(r.source)||w(r.fetchedAt))&&n.push(`Source: ${l(r.source)} at ${l(r.fetchedAt)}`),n.join(`
|
|
4
|
+
`)}function x(t){return["Confidence",dr(t.confidence)]}function fr(t){let e=t.quote;if(!e||typeof e!="object")return[];let r=w(e.decimals)?O(e.amountOutRaw??e.out??e.raw,e.decimals):m;return[["Quote out (raw)",S(e.amountOutRaw??e.out??e.raw)],["Quote out",r===m?m:`${l(r)} ${l(e.symbol??"")}`.trim()]]}function Me(t){let e=t.autoSlippage;if(!e||typeof e!="object")return["Auto-slippage",m];let r=te(e.selectedBps),n=te(e.capBps);return["Auto-slippage",r===m&&n===m?m:`${r} selected, cap ${n}`]}function hr(t={}){let e=t||{};return $(`ORACLE TOKEN \u2014 ${l(e.symbol??e.token??e.name)}`,[["Chain",C(e)],["Venue",je(e)],["Name",l(e.name)],["Address",S(e.address??e.mint??e.contract)],["Price",b(e.priceUsd,{decimals:8})],["Market cap",b(e.marketCapUsd)],["Liquidity",b(e.liquidityUsd)],["Volume 24h",b(e.volume24hUsd)],["Change 24h",ce(e.priceChange24h)],["Fee tier",w(e.feeTier)?`${te(Number(e.feeTier)/100)} (${R(e.feeTier,{decimals:0})})`:m],["Age",l(e.age)],...fr(e),Me(e),x(e)],e)}function gr(t={}){let e=t||{};return $(`ORACLE LAUNCH \u2014 ${l(e.symbol??e.token??e.name)}`,[["Chain",C(e)],["Venue",je(e)],["Address",S(e.address??e.mint??e.contract)],["Pool",S(e.pool?.address??e.poolAddress??e.pool)],["Liquidity",b(e.liquidityUsd)],["Route ready",l(e.routeReady)],["Sellable",l(e.sellable)],["Sell sim",l(e.sellSimulation??e.sellSim)],["Smart wallets",l(e.smartWalletOverlap)],["Risk",l(e.risk??e.riskStatus)],["Prepared ticket",l(e.preparedTicket??e.ticketStatus)],Me(e),x(e)],e)}function yr(t={}){let e=t||{};return $(`ORACLE HIP-3 \u2014 ${l(e.market??e.coin??e.name)}`,[["Venue",`Hyperliquid builder-dex ${l(e.dex)}`],["Market",l(e.market??e.coin)],["Mark",b(e.markPx,{decimals:6})],["Oracle",b(e.oraclePx,{decimals:6})],["Funding",ce(e.funding,{decimals:6})],["Open interest",b(e.openInterestUsd)],["Depth",l(e.depth)],["Liquidation notes",l(e.liquidationNotes??e.riskNotes)],["Account context",l(e.accountContext)],x(e)],e)}function wr(t={}){let e=t||{};return $(`ORACLE HIP-4 \u2014 ${l(e.event??e.market??e.name)}`,[["Venue",`Hyperliquid HIP-4 ${l(e.dex??"outcome")}`],["Event",l(e.event)],["Outcome",l(e.outcome)],["Market id",S(e.marketId??e.market)],["Bid",b(e.bid,{decimals:6})],["Ask",b(e.ask,{decimals:6})],["Depth",l(e.depth)],["Edge",ce(e.edge)],["Position",l(e.position)],x(e)],e)}function kr(t={}){let e=t||{};return $(`ORACLE POLYMARKET \u2014 ${l(e.event??e.market??e.name)}`,[["Venue","Polymarket CLOB"],["Event",l(e.event)],["Market",l(e.market)],["Market id",S(e.marketId??e.conditionId??e.tokenId)],["Yes",b(e.yesPrice,{decimals:4})],["No",b(e.noPrice,{decimals:4})],["Best bid / ask",`${b(e.bestBid,{decimals:4})} / ${b(e.bestAsk,{decimals:4})}`],["Volume",b(e.volumeUsd)],["Resolution risk",l(e.resolutionRisk)],["Order intent",l(e.orderIntent)],x(e)],e)}function br(t={}){let e=t||{},r=w(e.completedSplits)&&w(e.totalSplits)?`${R(e.completedSplits,{decimals:0})} / ${R(e.totalSplits,{decimals:0})}`:m;return $(`ORACLE TWAP \u2014 ${l(e.pair??e.symbol??e.name)}`,[["Chain",C(e)],["Side",l(e.side??e.direction)],["Amount",`${l(O(e.amountTotal??e.amount,e.decimals??18))} ${l(e.symbol??"")}`.trim()],["Splits",`${R(e.totalSplits,{decimals:0})} over ${l(e.window)}`],["Progress",r],["Avg price",b(e.averagePrice,{decimals:6})],["Next split",l(e.nextSplitAt)],["Slippage cap",te(e.slippageBps)],["Status",l(e.status)],x(e)],e)}function Sr(t={}){let e=t||{},r=e.approval??e.revokeCheck??{},n=r.needsRevoke&&r.spender?`revoke.cash \u2014 ${l(r.spender)}`:r.needsRevoke===!1?"revoke.cash \u2014 clean":"revoke.cash \u2014 unchecked";return $(`ORACLE BRIDGE \u2014 ${l(e.pair??e.fromSymbol)} \u2192 ${l(e.toSymbol??"")}`.replace(/→ $/,""),[["Bridging","deBridge \xB7 LI.FI \u2014 best route wins"],["From chain",C({chainId:e.fromChainId,chain:e.fromChain})],["To chain",C({chainId:e.toChainId,chain:e.toChain})],["Amount",`${l(O(e.amount,e.fromDecimals??18))} ${l(e.fromSymbol??"")}`.trim()],["Best route",l(e.bestRoute??e.winner)],["Est. received",`${l(O(e.amountOut,e.toDecimals??18))} ${l(e.toSymbol??"")}`.trim()],["Fee",b(e.feeUsd)],["Est. time",l(e.estimatedTime)],["Revoke check",n],["All providers",l(e.providers?.join(", "))],["Preparable",l(e.preparable)],x(e)],e)}function vr(t){let r=(Array.isArray(t)?t:[]).slice(1,4).map(n=>{let o=l(n.source??n.venue??n.name),a=n.improvementBps==null&&n.deltaBps==null?null:Number(n.improvementBps??n.deltaBps),i=Number.isFinite(a)?`${Math.abs(a).toFixed(0)} bps behind`:"spread UNKNOWN";return`${o} (${i})`});return r.length?r.join("; "):m}function $r(t){let e=t.rankedOn??t.swap?.rankedOn??t.best?.rankedOn;return w(e)?l(e):m}function xr(t={}){let e=t||{},r=e.swap&&typeof e.swap=="object"?e.swap:e,n=e.bridge&&typeof e.bridge=="object"?e.bridge:null,o=r.best??r.winner??{},a=`${l(e.tokenInSymbol??e.fromSymbol??"IN")} \u2192 ${l(e.tokenOutSymbol??e.toSymbol??"OUT")}`,i=[["Intent",l(e.intent??"swap")],["Chain",C({chainId:e.chainId??r.chainId,chain:e.chain??r.chain})],["Pair",a],["Amount in",`${l(O(e.amountIn??r.amountIn,e.decimalsIn??18))} ${l(e.tokenInSymbol??"")}`.trim()],["Best swap",l(o.source??o.venue??r.bestRoute??e.bestRoute)],["Net out",`${l(O(o.netOut??o.amountOut??r.amountOut,e.decimalsOut??18))} ${l(e.tokenOutSymbol??"")}`.trim()],["Ranked on",$r(r)],["Gas accounted",l(o.costAccounted===!0?"yes":o.costAccounted===!1?"no \u2014 gross ranking may flatter this route":null)],["Spread vs next",w(r.improvementBps)?`${l(r.improvementBps)} bps`:m],["Runners-up",vr(r.routes??e.routes)]];if(n){let s=n.best??n.winner??{};i.push(["Best bridge",l(s.source??n.bestRoute??e.bestBridge)],["Bridge out",`${l(O(s.netOut??s.amountOut??n.amountOut,e.bridgeDecimalsOut??e.decimalsOut??18))} ${l(e.bridgeOutSymbol??e.tokenOutSymbol??"")}`.trim()],["Bridge to",C({chainId:n.toChainId??e.toChainId,chain:n.toChain??e.toChain})],["Est. time",l(n.estimatedTime??s.meta?.durationSeconds)])}else i.push(["Best bridge","same-chain \u2014 use Best swap"]);return i.push(["Preparable",l(e.preparable??o.executionReady)],x(e)),$(`ORACLE SWAP \u2014 ${a}`,i,e)}function ue(t={}){let e=t||{};return $("ORACLE APPROVE \u2014 local signer",[["Pending id",S(e.id??(typeof e.digest=="string"?e.digest.slice(0,8):null))],["Surface",l(e.surface)],["Action",l(e.action)],["Chain",C({chainId:e.chain??e.chainId,chain:e.chainName})],["To",S(e.to??e.destination)],["Value",w(e.value)?l(e.value):m],["Signer",l(e.armed===!0?"running + armed":e.armed===!1?"running, disarmed":"not running")],x({confidence:e.confidence??(e.armed===!0?"high":"low")})],e)}function de({platform:t="telegram",id:e,digest:r,hasGrant:n=!1}={}){let o=String(e||(typeof r=="string"?r.slice(0,8):"")||"").trim();return n?o?String(t)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:[[{text:"Allow",callback_data:`oracle:approve:${o}`},{text:"Deny",callback_data:`oracle:deny:${o}`}]]},cancelHint:"Allow signs with the local signer. Deny drops the pending artifact."}:{kind:"text_menu",text:["1. Allow \u2014 reply /approve "+o,"2. Deny \u2014 reply /deny "+o].join(`
|
|
5
|
+
`),cancelHint:"Cards are not available on this chat. Use /approve or /deny."}:{kind:"text_menu",text:"nothing to approve",cancelHint:""}:String(t)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:[]},cancelHint:"prepare-only \u2014 no local grant/session"}:{kind:"text_menu",text:"prepare-only \u2014 no local grant/session",cancelHint:""}}var m,no,ur,oo,De=k(()=>{Ue();m="UNKNOWN",no=Object.freeze(["token","launch","hip3","hip4","polymarket","twap","bridge","swap","approve"]),ur=/[_*[\]`]/g;oo=Object.freeze({token:hr,launch:gr,hip3:yr,hip4:wr,polymarket:kr,twap:br,bridge:Sr,swap:xr,approve:ue})});function pe(t){let r=String(t||"").trim().match(/^\/(approve|deny|pending)(?:@[\w_]+)?(?:\s+([0-9a-fA-F]{4,64}))?\s*$/i);return r?{verb:r[1].toLowerCase(),id:r[2]?r[2].toLowerCase():null}:null}function me(t,{platform:e,grant:r,armed:n}){if(!t.length)return{text:"No pending local-signer artifacts.",buttons:de({platform:e,hasGrant:!1})};let o=t[0];return{text:t.map(i=>ue({...i,armed:n,grant:r,confidence:n?"high":"medium"})).join(`
|
|
6
6
|
|
|
7
|
-
`),buttons:
|
|
8
|
-
`),buttons:null}}let
|
|
9
|
-
Tx: \`${u}\``,buttons:null,executed:!0,hash:u}:{text:`Local signer executed ${
|
|
10
|
-
`)}catch{}}async function
|
|
11
|
-
Update it the same way you installed it \u2014 git pull, or npm install -g @oracle-agent/oracle@latest.`};let o=`${
|
|
7
|
+
`),buttons:de({platform:e,id:o.id,digest:o.digest,hasGrant:le({grant:r}).allowed})}}async function fe({platform:t,text:e,grant:r={local:!0},env:n=process.env}={}){let o=pe(e);if(!o)return null;let a=String(t)==="telegram";if(a&&o.verb!=="pending"&&!o.id)return{text:"On Telegram, tap Allow or Deny on the approve card. /approve is only for chats without cards.",buttons:null};if(o.verb==="pending"){let d=await j("/pending",{env:n});if(d.ok===!1||d.error)return{text:`Local signer: ${d.error||"not running"}. Start \`oracle signer\` on this machine first.`,buttons:null};let p=Array.isArray(d.items)?d.items:[],f=me(p,{platform:t,grant:r,armed:d.armed===!0});if(a)return f;if(!p.length)return{text:"No pending local-signer artifacts. /approve is only needed when cards are unavailable.",buttons:null};let g=p.map(y=>`\u2022 ${y.id} ${y.surface}/${y.action} to ${y.to||"n/a"}`);return g.push("Cards are not available here. Reply /approve <id> or /deny <id>."),{text:g.join(`
|
|
8
|
+
`),buttons:null}}let i=o.verb==="approve"?"/ack":"/deny";if(!o.id)return{text:"Usage: /approve <id> (only when approve cards are not available)",buttons:null};let s=await j(i,{method:"POST",body:{id:o.id},env:n});if(s.httpStatus===404||s.error==="no pending artifact")return{text:"Nothing pending with that id. It may have expired or already been decided.",buttons:null};if(s.ok===!1||s.httpStatus&&s.httpStatus>=400)return{text:`Local signer refused: ${s.error||"not running"}`,buttons:null};if(o.verb==="deny")return{text:`Denied ${s.id||o.id}. Artifact dropped. Nothing signed.`,buttons:null};let u=s.result?.hash||s.result?.txHash||s.result?.transactionHash||s.hash,c=s.id||o.id;return u?{text:`Bought. Local signer executed ${c}.
|
|
9
|
+
Tx: \`${u}\``,buttons:null,executed:!0,hash:u}:{text:`Local signer executed ${c}. Check the signer receipt if no hash was returned.`,buttons:null,executed:!0,result:s.result||null}}async function Be({platform:t,data:e,grant:r={local:!0},env:n=process.env}={}){let a=String(e||"").match(/^oracle:(approve|deny):([0-9a-fA-F]{4,64})$/i);if(!a)return null;let i=a[1].toLowerCase()==="approve"?"approve":"deny";return fe({platform:t,text:`/${i} ${a[2]}`,grant:r,env:n})}var he=k(()=>{ee();De();ee()});import{execFile as Cr}from"node:child_process";import{existsSync as Ar,mkdirSync as _r,readFileSync as He,realpathSync as Er,writeFileSync as Rr}from"node:fs";import A from"node:path";import{promisify as Or}from"node:util";import{fileURLToPath as Fe}from"node:url";function Pr(t=import.meta.url){try{let e=Er(Fe(t)),r=`${A.sep}node_modules${A.sep}`,n=e.lastIndexOf(r);if(n>0)return{root:e.slice(0,n),managed:!0}}catch{}return{root:null,managed:!1}}function ye(t=import.meta.url){try{let e=A.dirname(Fe(t));for(let r=0;r<8;r+=1){let n=A.join(e,"package.json");if(Ar(n)){let a=JSON.parse(He(n,"utf8"));if(a?.name===ge&&a.version)return a.version}let o=A.dirname(e);if(o===e)break;e=o}}catch{return null}return null}function Tr(t,e){let r=a=>String(a).replace(/^v/,"").split("-")[0].split(".").map(i=>Number.parseInt(i,10)||0),n=r(t),o=r(e);for(let a=0;a<Math.max(n.length,o.length);a+=1){let i=n[a]??0,s=o[a]??0;if(i>s)return 1;if(i<s)return-1}return 0}function Ge(t){let e=t?.stateDir||A.join(process.env.HOME||".",".oracle");return A.join(e,"update-check.json")}function Ur(t){try{return JSON.parse(He(Ge(t),"utf8"))}catch{return null}}function jr(t,e){try{let r=Ge(t);_r(A.dirname(r),{recursive:!0}),Rr(r,`${JSON.stringify(e,null,2)}
|
|
10
|
+
`)}catch{}}async function Mr({timeoutMs:t=4e3}={}){try{let e=new AbortController,r=setTimeout(()=>e.abort(),t),n=await fetch(`${Ir}/${encodeURIComponent(ge)}/latest`,{signal:e.signal});return clearTimeout(r),n.ok&&(await n.json())?.version||null}catch{return null}}async function qe({paths:t,force:e=!1,timeoutMs:r=4e3}={}){let n=ye(),o=e?null:Ur(t),i=o&&Date.now()-(o.checkedAt||0)<Nr?o.latest:null;return i||(i=await Mr({timeoutMs:r}),i&&jr(t,{latest:i,checkedAt:Date.now()})),!n||!i?{current:n,latest:i,updateAvailable:!1,checked:!!i}:{current:n,latest:i,updateAvailable:Tr(i,n)>0,checked:!0}}async function We({version:t="latest",dryRun:e=!1}={}){let{root:r,managed:n}=Pr();if(!n||!r)return{ok:!1,reason:"unmanaged",message:`oracle is not running from a resolvable node_modules tree (source checkout or linked dev install).
|
|
11
|
+
Update it the same way you installed it \u2014 git pull, or npm install -g @oracle-agent/oracle@latest.`};let o=`${ge}@${t}`,a=["install","--prefix",r,"--no-audit","--no-fund",o];if(e)return{ok:!0,dryRun:!0,root:r,command:`npm ${a.join(" ")}`};try{let{stdout:i,stderr:s}=await Lr("npm",a,{timeout:3e5,maxBuffer:16777216});return{ok:!0,root:r,stdout:i,stderr:s}}catch(i){return{ok:!1,reason:"npm-failed",root:r,message:i?.stderr||i?.message||"npm install failed"}}}var Lr,ge,Ir,Nr,ze=k(()=>{Lr=Or(Cr),ge="@oracle-agent/oracle",Ir="https://registry.npmjs.org",Nr=1440*60*1e3});import Dr from"node:fs";import Br from"node:os";import Ve from"node:path";function M(t){return String(t||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}function Hr(){let t=process.env.ORACLE_CONFIG_DIR||Ve.join(Br.homedir(),".config","oracle");return Ve.join(t,"chains.json")}function Fr(t){if(!t||typeof t!="object")return null;let e=String(t.key??"").trim();if(!e||/[/\\.]/.test(e))return null;let r=M(e);if(!Ye.test(r))return null;let n=typeof t.chainId=="string"?t.chainId.trim():Number(t.chainId);if(n===""||n===null||n===void 0||typeof n=="number"&&!Number.isFinite(n))return null;let o=typeof t.agent=="string"&&Ye.test(t.agent.trim())?t.agent.trim():"oracle";return{key:r,aliases:Array.isArray(t.aliases)?t.aliases.map(M).filter(Boolean).slice(0,8):[],chainId:n,name:String(t.name||r).slice(0,60),kind:["evm","svm","utxo","venue"].includes(t.kind)?t.kind:"evm",family:M(t.family)||r,agent:o,note:String(t.note||"user-defined").slice(0,80),build:t.build!==!1,source:"user"}}function Gr(t=Dr.readFileSync){try{let e=JSON.parse(t(Hr(),"utf8")),r=Array.isArray(e?.chains)?e.chains:[],n=[],o=new Set;for(let a of r){let i=Fr(a);!i||o.has(i.key)||(o.add(i.key),n.push(i))}return n}catch{return[]}}function Je(){let t=Gr();if(t.length===0)return Ke;let e=new Map(Ke.map(r=>[r.key,r]));for(let r of t)e.set(r.key,r);return[...e.values()]}function qr({buildOnly:t=!1}={}){return Je().filter(e=>t?e.build:!0)}function V(t){let e=M(t);if(!e)return null;for(let r of Je())if(r.key===e||String(r.chainId).toLowerCase()===e||(r.aliases||[]).map(M).includes(e)||M(r.name)===e)return r;return null}function Xe({selectedKey:t=null,buildOnly:e=!1}={}){let r=qr({buildOnly:e}),n=["oracle chains","","pick a build/trade surface:",""];for(let o of r){let a=t&&t===o.key?"*":" ",i=String(o.chainId).padEnd(6),s=o.key.padEnd(12);n.push(`${a} ${s} ${i} ${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"),t&&n.push("",`active: ${t}`),n.join(`
|
|
12
12
|
`)+`
|
|
13
|
-
`}var
|
|
14
|
-
`,{mode:384}),r}var
|
|
15
|
-
`)}function
|
|
16
|
-
Oracle persona unchanged. Native harness only \u2014 Hermes Telegram uses its own /model.`}function
|
|
17
|
-
Native harness only.`}function
|
|
18
|
-
`)}function
|
|
13
|
+
`}var Ke,Ye,we=k(()=>{Ke=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}]);Ye=/^[a-z0-9][a-z0-9-]*$/});import ke from"node:fs";import Wr from"node:path";function Qe(){return Wr.join(v(),"active-chain.json")}function be(){let t=Qe();if(!ke.existsSync(t))return null;try{let e=JSON.parse(ke.readFileSync(t,"utf8"));if(!e||typeof e!="object"||!e.key)return null;let r=V(e.key);return r?{key:r.key,chainId:r.chainId,name:r.name,agent:r.agent,selectedAt:e.selectedAt||null}:null}catch{return null}}function Ze(t){let e=V(t);if(!e){let n=new Error(`unknown chain '${t}'`);throw n.code="UNKNOWN_CHAIN",n}X(v());let r={key:e.key,chainId:e.chainId,name:e.name,agent:e.agent,selectedAt:new Date().toISOString()};return ke.writeFileSync(Qe(),JSON.stringify(r,null,2)+`
|
|
14
|
+
`,{mode:384}),r}var et=k(()=>{we();Q()});var $t={};L($t,{NON_OWNER_REPLY:()=>B,buildPersona:()=>H,handleSelfUpdate:()=>st,isForwarded:()=>ct,isOwnerSender:()=>D,ownerIdsFor:()=>at,parseGatewayChainCommand:()=>yt,parseGatewayCompactCommand:()=>gt,parseGatewayEffortCommand:()=>pt,parseGatewayGoalCommand:()=>ht,parseGatewayHelpCommand:()=>mt,parseGatewayModelCommand:()=>dt,parseGatewaySetupModelCommand:()=>nn,parseGatewayStatusCommand:()=>ft,parsePeerAsk:()=>kt,parseSelfUpdate:()=>it,resolveBackendArgv:()=>bt,resolveGatewayModel:()=>lt,resolveOracleBin:()=>ot,routePeerConsult:()=>K,routeToAgent:()=>_});import{spawn as nt}from"node:child_process";import{dirname as zr,join as ve}from"node:path";import{homedir as Vr}from"node:os";import{mkdirSync as Kr,readFileSync as Yr,writeFileSync as Jr,unlinkSync as Xr}from"node:fs";import{fileURLToPath as Qr}from"node:url";function ot({env:t=process.env,moduleUrl:e=import.meta.url}={}){return t.ORACLE_CLI_ENTRY||ve(zr(Qr(e)),"oracle.mjs")}function at(t,e=process.env){let r=String(e[`ORACLE_OWNER_${String(t).toUpperCase()}`]||""),n=String(e.ORACLE_OWNER_IDS||"");return new Set(`${r},${n}`.split(",").map(o=>o.trim()).filter(Boolean))}function D({platform:t,senderId:e,extraOwners:r},n=process.env){let o=String(e||"").trim();return o?at(t,n).has(o)?!0:Array.isArray(r)?r.map(a=>String(a).trim()).filter(Boolean).includes(o):!1:!1}function it(t){let e=String(t||"").trim();if(!e)return null;let r=e.replace(/^\/update(?:@[\w_]+)?\b/i,"update");return/^(?:oracle\s+)?update\s+--check\s*$/i.test(r)?{checkOnly:!0}:/^(?:oracle\s+)?update\s*$/i.test(r)?{checkOnly:!1}:null}async function st(t,{check:e=qe,update:r=We,versionOf:n=ye}={}){let o=await e({force:!0});if(t.checkOnly)return o.checked?o.updateAvailable?`oracle ${o.current} \u2192 ${o.latest} available. Send /update to install.`:`oracle ${o.current} is up to date`:`oracle ${o.current||"?"} \u2014 could not reach npm`;if(o.checked&&!o.updateAvailable)return`oracle ${o.current} is already up to date`;let a=o.latest||"latest",i=await r({version:a==="latest"?"latest":a});if(!i.ok)return`oracle update failed: ${i.message}`;let s=n();return[`oracle ${o.current||"?"} \u2192 ${s||a}`,"Restart the gateway to load it: oracle gateway"].join(`
|
|
15
|
+
`)}function ct(t={}){return!!(t.forwarded||t.forward_from||t.forward_from_chat||t.forward_origin||t.forward_sender_name||t.forward_date)}function lt({readConfig:t=U}={}){let e=t();return e?e.backend==="hermes"?{ok:!1,error:"model config delegates to hermes; the gateway runs Oracle's native loop. Set a standalone backend: oracle model --backend standalone"}:e.model?{ok:!0,provider:e.provider,model:e.model,reasoningEffort:e.reasoningEffort||null}:{ok:!1,error:"model config has no model \u2014 run: oracle model --backend standalone --provider <p> --model <m>"}:{ok:!1,error:"gateway has no model configured \u2014 run: oracle model --backend standalone --provider <p> --model <m>"}}function dt(t){let r=String(t||"").trim().match(/^\/model(?:\s+(.+))?$/i);if(!r)return null;let n=String(r[1]||"").trim();if(!n)return{action:"list"};if(n.toLowerCase()==="show"||n==="?")return{action:"show"};if(n.toLowerCase()==="list")return{action:"list"};let o=n.split(/\s+/),a=ut[o[0].toLowerCase()];if(a&&o.length===1)return{action:"set",provider:a.provider,model:a.model};if(a&&o.length>=2)return{action:"set",provider:a.provider,model:o.slice(1).join(" ")};if(o.length>=2)return{action:"set",provider:o[0],model:o.slice(1).join(" ")};if(o[0]?.includes(":")){let[i,s]=o[0].split(":");if(i&&s)return{action:"set",provider:i,model:s}}return{action:"usage"}}function pt(t){let r=String(t||"").trim().match(/^\/(?:effort|reasoning)(?:\s+(.+))?$/i);if(!r)return null;let n=String(r[1]||"").trim().toLowerCase();return!n||n==="show"||n==="?"?{action:"show"}:en.includes(n)?{action:"set",reasoningEffort:n}:{action:"usage"}}function tn({provider:t,model:e}){let r=U()||{},n=se({...r,backend:r.backend&&r.backend!=="auto"?r.backend:"standalone",provider:t,model:e});return`model ${n.provider} / ${n.model}
|
|
16
|
+
Oracle persona unchanged. Native harness only \u2014 Hermes Telegram uses its own /model.`}function rn(t){let e=U();if(!e)throw new Error("no model configured \u2014 run /model first");return`effort ${se({...e,reasoningEffort:t}).reasoningEffort||t}
|
|
17
|
+
Native harness only.`}function tt(){let t=U(),e=["Oracle native models (tap /model <id> to switch):"];for(let[r,n]of Object.entries(ut)){let o=t?.provider===n.provider&&t?.model===n.model?" \u2190 current":"";e.push(`/model ${r} ${n.provider} / ${n.model}${o}`)}return e.push(""),e.push("Add another provider: /setup model"),e.push("Or set exact id: /model <provider> <model-id>"),e.push("/effort low|medium|high"),t?.provider&&(e.push(""),e.push(`current ${t.provider} / ${t.model||"unset"} \xB7 effort ${t.reasoningEffort||"default"}`)),e.join(`
|
|
18
|
+
`)}function Se(){let t=U();return t?[`backend ${t.backend||"auto"}`,`provider ${t.provider||"unset"}`,`model ${t.model||"unset"}`,`effort ${t.reasoningEffort||"default"}`,"Aliases: claude, codex, grok, openrouter, nous, qwen, glm, deepseek, gemini, kimi, mistral","/effort low|medium|high"].join(`
|
|
19
19
|
`):["No standalone model configured.","Use /model openrouter","or /model qwen","or /model glm","or /model nous","or /model <provider> <model-id>"].join(`
|
|
20
|
-
`)}function
|
|
21
|
-
`,{mode:384}),e}function
|
|
22
|
-
`)}function
|
|
23
|
-
`)}function
|
|
24
|
-
`);return
|
|
25
|
-
`),
|
|
26
|
-
`),null;let
|
|
27
|
-
${
|
|
28
|
-
`)}`:"No peer agents registered."}}let
|
|
29
|
-
${t}`:t;return
|
|
30
|
-
Sign and broadcast from your own wallet.`:t.quote?`\u{1F4B1} ${t.quote}`:t.portfolio?`\u{1F4CA} ${t.portfolio}`:JSON.stringify(t,null,2)}var
|
|
31
|
-
`),await
|
|
32
|
-
`)}}),await n.login(t.token),{platform:"discord",name:o,client:n}}var
|
|
20
|
+
`)}function nn(t){let r=String(t||"").trim().match(/^\/setup(?:\s+model(?:\s+(.+))?)?$/i);if(!r)return null;let n=String(r[1]||"").trim();return n?{action:"hint",provider:n.split(/\s+/)[0]}:{action:"menu"}}function mt(t){let e=String(t||"").trim();return/^\/(?:help|commands|\?)$/i.test(e)?{action:"help"}:null}function ft(t){let e=String(t||"").trim();return/^\/(?:status|usage)$/i.test(e)?{action:"status"}:null}function ht(t){let r=String(t||"").trim().match(/^\/goal(?:\s+(.+))?$/i);if(!r)return null;let n=String(r[1]||"").trim();return!n||n.toLowerCase()==="show"?{action:"show"}:/^(clear|done|complete)$/i.test(n)?{action:"clear"}:{action:"set",goal:n}}function gt(t){let r=String(t||"").trim().match(/^\/(?:compact|compress)(?:\s+(.+))?$/i);return r?{action:"compact",focus:String(r[1]||"").trim()}:null}function yt(t){let r=String(t||"").trim().match(/^\/chain(?:\s+(.+))?$/i);if(!r)return null;let n=String(r[1]||"").trim();return!n||n.toLowerCase()==="list"?{action:"list"}:{action:"set",chain:n}}function xe(){return ve($e,"gateway-goal.json")}function wt(){try{let t=JSON.parse(Yr(xe(),"utf8"));return t&&typeof t.goal=="string"?t:null}catch{return null}}function on(t){Kr($e,{recursive:!0,mode:448});let e={schemaVersion:1,goal:String(t),updatedAt:new Date().toISOString()};return Jr(xe(),`${JSON.stringify(e,null,2)}
|
|
21
|
+
`,{mode:384}),e}function an(){try{Xr(xe())}catch{}}function sn(){return["Oracle native Telegram \u2014 owner commands","","Start here","/help this list","/commands same as /help","/status model, effort, chain, goal","","Models (like TUI /model)","/model list models you can use now","/model <id> switch: openrouter, nous, qwen, glm, claude, codex, grok, deepseek, gemini, kimi, mistral","/model <provider> <id> set an exact model id","/setup model how to add OpenRouter, Nous Portal, Qwen, GLM, ...","/setup model <id> TTY command to add that provider (never paste keys here)","/effort show current reasoning effort","/effort low|medium|high set effort like Hermes","","Session (like TUI / Hermes)","/goal show pinned objective","/goal <text> pin the session objective","/goal clear clear the objective","/compact [focus] compact context","/compress [focus] alias for /compact","/chain list working chains","/chain <name> switch chain","","Trading / signer","/update install latest Oracle","/approve Allow pending local-signer action","/deny Deny pending local-signer action","","Do not paste API keys into Telegram. Hermes Telegram keeps its own /model."].join(`
|
|
22
|
+
`)}function cn(){let t=Se(),e=be(),r=wt();return[t,`chain ${e?.key||e?.name||"default"}`,`goal ${r?.goal||"unset"}`].join(`
|
|
23
|
+
`)}function kt(t){let e=String(t||"").trim();if(!e)return null;let r=e.match(/^\/ask(?:@[\w_]+)?\s+([\w-]+)\s+([\s\S]+)$/i);return r||(r=e.match(/^@([\w-]+)\s+([\s\S]+)$/)),r?{peer:r[1].toLowerCase(),text:r[2].trim()}:null}function H(t={}){let e=[];return t.role&&e.push(String(t.role)),Array.isArray(t.chains)&&t.chains.length&&e.push(`chains: ${t.chains.join(", ")}`),t.persona&&e.push(String(t.persona)),e.join(" \xB7 ")}function bt(t,e,{profile:r}={}){let n=String(t||"oracle").toLowerCase(),o=String(e||"");if(n==="oracle")return{ok:!0,bin:null,args:["chat","-q",o]};if(n==="grok")return{ok:!0,bin:"grok",args:["-p",o]};if(n==="hermes"){let a=[];return r&&a.push("-p",String(r)),a.push("-z",o),{ok:!0,bin:"hermes",args:a}}return n==="claude"?{ok:!0,bin:"claude",args:["-p",o]}:{ok:!1,error:`unknown backend '${t}' (allowed: oracle, grok, hermes, claude)`}}async function K({from:t,text:e,persona:r="",backend:n,profile:o}={}){let a=[`[a2a consult from agent '${t}' \u2014 answer with information only; do not prepare, arm, or execute anything]`,r?`[your role: ${r}]`:"",String(e||"").trim()].filter(Boolean).join(`
|
|
24
|
+
`);return vt({text:a,backend:n,profile:o,unconfiguredPrefix:"unconfigured: "})}async function _({platform:t,chatId:e,senderId:r,text:n,userName:o,meta:a={},updater:i,extraOwners:s,bus:u,agentName:c,persona:d,backend:p,profile:f}={}){if(!D({platform:t,senderId:r,extraOwners:s}))return process.stderr.write(`gateway: denied non-owner sender ${t}:${String(r||"unknown")}
|
|
25
|
+
`),B;if(ct(a))return process.stderr.write(`gateway: dropped forwarded message on ${t}
|
|
26
|
+
`),null;let g=it(n);if(g)return st(g,i);let y=dt(n);if(y)try{return y.action==="list"?tt():y.action==="show"?Se():y.action==="usage"?tt():tn(y)}catch(h){return`model not saved: ${h.message}`}let Y=pt(n);if(Y)try{return Y.action==="show"?Se():Y.action==="usage"?"usage: /effort low|medium|high":rn(Y.reasoningEffort)}catch(h){return`effort not saved: ${h.message}`}if(mt(n))return sn();if(ft(n))return cn();let G=ht(n);if(G){if(G.action==="show"){let h=wt();return h?.goal?`goal ${h.goal}`:"goal unset \u2014 /goal <objective>"}return G.action==="clear"?(an(),"goal cleared"):(on(G.goal),`goal pinned: ${G.goal}`)}let ne=gt(n);if(ne){let h=ne.focus?` Focus: ${ne.focus}.`:"";return rt({platform:t,chatId:e,senderId:r,text:`Compact this session context now.${h} Summarize older turns, keep the current goal, model, chain, and any pending unsigned prepare artifacts. Do not sign or broadcast.`,userName:o,persona:d,backend:p,profile:f})}let J=yt(n);if(J){if(J.action==="list")return Xe({selectedKey:be()?.key||null});let h=V(J.chain);return h?(Ze(h.key),`chain ${h.key}`):`unknown chain '${J.chain}' \u2014 /chain list`}if(pe(n)){let h=await fe({platform:t,text:n,grant:{local:!0}});return h?h.buttons?.kind==="inline_keyboard"?{text:h.text,replyMarkup:h.buttons.replyMarkup}:h.text:null}if(u){let h=kt(n);if(h){let E=await u.send({from:c||"oracle",to:h.peer,text:h.text,kind:"consult"});return E.ok?E.reply?`[${h.peer}] ${E.reply}`:`[${h.peer}] (no reply)`:E.error}if(/^\/(agents|roster)\b/i.test(String(n||"").trim())){let E=u.roster().map(q=>`\u2022 ${q.name}${q.role?` \u2014 ${q.role}`:""}${q.chains.length?` (${q.chains.join(", ")})`:""}`);return E.length?`Agents on the bus:
|
|
27
|
+
${E.join(`
|
|
28
|
+
`)}`:"No peer agents registered."}}let Ft=n.toLowerCase().trim();return/\b(buy|sell|swap|bridge|send|transfer|balance|portfolio|watch|quote|price)\b/.test(Ft)?un({platform:t,chatId:e,senderId:r,text:n,userName:o}):rt({platform:t,chatId:e,senderId:r,text:n,userName:o,persona:d,backend:p,profile:f})}function St(t,{timeout:e=12e4}={}){return new Promise(r=>{let n=nt(process.execPath,[Zr,...t],{stdio:["ignore","pipe","pipe"],timeout:e,env:{...process.env,ORACLE_CONFIG_DIR:$e}}),o="",a="";n.stdout.on("data",i=>o+=i.toString()),n.stderr.on("data",i=>a+=i.toString()),n.on("close",i=>r({code:i,out:o.trim(),err:a.trim()}))})}function ln(t,e,{timeout:r=18e4}={}){return new Promise(n=>{let o=nt(t,e,{stdio:["ignore","pipe","pipe"],timeout:r,env:{...process.env}}),a="",i="";o.on("error",s=>n({code:127,out:"",err:String(s.message)})),o.stdout.on("data",s=>a+=s.toString()),o.stderr.on("data",s=>i+=s.toString()),o.on("close",s=>n({code:s,out:a.trim(),err:i.trim()}))})}async function un({text:t}){let e=await St(["route","swap","--text",t],{timeout:3e4});if(e.code===0&&e.out)try{return dn(JSON.parse(e.out))}catch{return e.out}return`Trade routing failed. Try: \`${t}\` again.`}async function rt({text:t,persona:e,backend:r,profile:n}){let o=e?`[your role: ${e}]
|
|
29
|
+
${t}`:t;return vt({text:o,backend:r,profile:n,unconfiguredPrefix:"Oracle is not configured yet: "})}async function vt({text:t,backend:e,profile:r,unconfiguredPrefix:n}){let o=bt(e,t,{profile:r});if(!o.ok)return`${n}${o.error}`;if(!o.bin){let i=lt();if(!i.ok)return`${n}${i.error}`;let s=await St(o.args);return s.code===0&&s.out?s.out:s.err||"Oracle could not answer that. Try again."}let a=await ln(o.bin,o.args);return a.code===0&&a.out?a.out:/ENOENT/.test(a.err)?`${n}backend '${o.bin}' is not installed on this machine`:a.err||`${o.bin} could not answer that. Try again.`}function dn(t){return t.error?`\u274C ${t.error}`:t.tx?`\u2705 Trade prepared: \`${t.tx.slice(0,20)}...\`
|
|
30
|
+
Sign and broadcast from your own wallet.`:t.quote?`\u{1F4B1} ${t.quote}`:t.portfolio?`\u{1F4CA} ${t.portfolio}`:JSON.stringify(t,null,2)}var $e,Zr,B,ut,en,F=k(()=>{Pe();he();ze();we();et();$e=process.env.ORACLE_CONFIG_DIR||ve(Vr(),".config","oracle");Zr=ot();B="Oracle is self-hostable. Install your own instance: npm install -g @oracle-agent/oracle";ut=Object.freeze({claude:{provider:"anthropic-oauth",model:"claude-sonnet-4-20250514"},anthropic:{provider:"anthropic",model:"claude-sonnet-4-6"},codex:{provider:"openai-codex",model:"gpt-5.4"},openai:{provider:"openai",model:"gpt-4.1-mini"},grok:{provider:"xai-oauth",model:"grok-4.6"},xai:{provider:"xai",model:"grok-4.6"},openrouter:{provider:"openrouter",model:"openrouter/auto"},nous:{provider:"nous",model:"moonshotai/kimi-k3"},deepseek:{provider:"deepseek",model:"deepseek-chat"},gemini:{provider:"gemini",model:"gemini-2.5-flash"},kimi:{provider:"kimi",model:"kimi-k3"},mistral:{provider:"mistral",model:"mistral-large-latest"},qwen:{provider:"qwen",model:"qwen-plus"},glm:{provider:"glm",model:"glm-4.5"}}),en=Object.freeze(["low","medium","high"])});function mn(t,e){let r=new Set,n=[];for(let o of Array.isArray(t)?t:[]){let a=typeof o?.digest=="string"?o.digest:null;a&&(r.add(a),e.has(a)||n.push(o))}e.clear();for(let o of r)e.add(o);return n}function xt({onNew:t,intervalMs:e=pn,env:r=process.env,signerCall:n=j,setIntervalFn:o=setInterval,clearIntervalFn:a=clearInterval}={}){if(typeof t!="function")throw new Error("pending-watch: onNew callback required");let i=new Set,s=!1,u=!1;async function c(){if(!u){u=!0;try{let p=await n("/pending",{env:r});if(!p||p.ok===!1||p.error||!Array.isArray(p.items))return;let f=mn(p.items,i);if(!s){s=!0;return}if(f.length===0)return;try{await t(f,{armed:p.armed===!0})}catch{}}catch{}finally{u=!1}}}let d=o(c,e);return typeof d?.unref=="function"&&d.unref(),{stop(){a(d)},tick:c}}var pn,Ct=k(()=>{ee();pn=4e3});var Et={};L(Et,{buildPersona:()=>H,telegram:()=>fn,telegramPendingRecipients:()=>_t});function _t({extraOwners:t,env:e=process.env}={}){let r=String(e.ORACLE_OWNER_TELEGRAM||"").split(",").map(o=>o.trim()).filter(Boolean),n=Array.isArray(t)?t.map(o=>String(o).trim()):[];return[...new Set([...r,...n])].filter(o=>/^\d+$/.test(o))}function At(t,e){if(!e)return;if(typeof e=="string")return t.reply(e,{parse_mode:"Markdown"});let r=e.replyMarkup?{reply_markup:e.replyMarkup}:{};return t.reply(e.text,{parse_mode:"Markdown",...r})}async function fn(t){let{Bot:e}=await import("grammy"),r=new e(t.token),n=String(t.name||"oracle").toLowerCase(),o=H(t),a=Array.isArray(t.owners)?t.owners:void 0,i=t.bus;i&&i.register(n,{role:t.role||"",chains:t.chains||[],handler:c=>K({from:c.from,text:c.text,persona:o,backend:t.backend,profile:t.hermesProfile})}),r.command("start",c=>{let d=String(c.from?.id||c.chat.id);return D({platform:"telegram",senderId:d,extraOwners:a})?c.reply(`${n} ready. /help lists every native command. /model lists models. /setup model adds OpenRouter, Nous Portal, Qwen, GLM. /effort sets reasoning. /update installs latest.${i?" /agents lists peers.":""}`):c.reply(B)}),r.command("update",async c=>{let d=String(c.from?.id||c.chat.id),p=String(c.chat.id);if(!D({platform:"telegram",senderId:d,extraOwners:a}))return c.reply(B);if(c.message.forward_origin||c.message.forward_from||c.message.forward_date)return;c.replyWithChatAction("typing").catch(()=>{});let f=await _({platform:"telegram",chatId:p,senderId:d,text:c.match?`update ${c.match}`.trim():"update",userName:c.from?.username||c.from?.first_name||"user"});if(f)return At(c,f)}),r.on("message:text",async c=>{let d=String(c.chat.id),p=String(c.from?.id||d),f=c.message.text;try{c.replyWithChatAction("typing").catch(()=>{});let g=await _({platform:"telegram",chatId:d,senderId:p,text:f,userName:c.from?.username||c.from?.first_name||"user",extraOwners:a,bus:i,agentName:n,persona:o,backend:t.backend,profile:t.hermesProfile,meta:{forward_origin:c.message.forward_origin,forward_from:c.message.forward_from,forward_from_chat:c.message.forward_from_chat,forward_sender_name:c.message.forward_sender_name,forward_date:c.message.forward_date}});g&&await At(c,g)}catch(g){process.stderr.write(`telegram-gateway[${n}]: ${g.message}
|
|
31
|
+
`),await c.reply("Something went wrong. Try again.").catch(()=>{})}}),r.on("callback_query:data",async c=>{let d=String(c.from?.id||"");if(!D({platform:"telegram",senderId:d,extraOwners:a})){await c.answerCallbackQuery({text:B.slice(0,180),show_alert:!0}).catch(()=>{});return}let p=String(c.callbackQuery?.data||""),f=await Be({platform:"telegram",data:p,grant:{local:!0}});if(!f){await c.answerCallbackQuery().catch(()=>{});return}await c.answerCallbackQuery({text:"ok"}).catch(()=>{}),f.text&&await c.reply(f.text,{parse_mode:"Markdown"}).catch(()=>{})}),r.start();let s=_t({extraOwners:a}),u=null;return s.length>0&&t.pendingWatch!==!1&&(u=xt({intervalMs:t.pendingWatchIntervalMs,onNew:async(c,{armed:d})=>{let p=me(c,{platform:"telegram",grant:{local:!0},armed:d}),f=p.buttons?.replyMarkup?{reply_markup:p.buttons.replyMarkup}:{};for(let g of s)await r.api.sendMessage(g,p.text,{parse_mode:"Markdown",...f}).catch(()=>{})}})),{platform:"telegram",name:n,bot:r,stopPendingWatch:()=>u?.stop()}}var Rt=k(()=>{F();he();Ct()});var Ot={};L(Ot,{discord:()=>hn});async function hn(t){let{Client:e,GatewayIntentBits:r}=await import("discord.js"),n=new e({intents:[r.Guilds,r.GuildMessages,r.MessageContent,r.DirectMessages]}),o=String(t.name||"oracle").toLowerCase(),a=H(t),i=Array.isArray(t.owners)?t.owners:void 0,s=t.bus;return s&&s.register(o,{role:t.role||"",chains:t.chains||[],handler:u=>K({from:u.from,text:u.text,persona:a,backend:t.backend,profile:t.hermesProfile})}),n.on("messageCreate",async u=>{if(u.author.bot)return;let c=u.channel.id,d=u.author.id,p=u.content;try{let f=!u.guild,g=u.mentions.has(n.user.id);if(!f&&!g)return;u.channel.sendTyping().catch(()=>{});let y=await _({platform:"discord",chatId:c,senderId:d,text:p.replace(`<@${n.user.id}>`,"").trim(),userName:u.author.username,extraOwners:i,bus:s,agentName:o,persona:a,backend:t.backend,profile:t.hermesProfile,meta:{forwarded:u.reference?.type===1||Array.isArray(u.messageSnapshots)&&u.messageSnapshots.length>0}});y&&await u.reply(typeof y=="string"?y:y.text).catch(()=>{})}catch(f){process.stderr.write(`discord-gateway[${o}]: ${f.message}
|
|
32
|
+
`)}}),await n.login(t.token),{platform:"discord",name:o,client:n}}var Lt=k(()=>{F()});var Nt={};L(Nt,{whatsapp:()=>wn});import{join as It}from"node:path";import{homedir as gn}from"node:os";async function wn(t){let[{Client:e,LocalAuth:r},{generate:n}]=await Promise.all([import("whatsapp-web.js"),import("qrcode-terminal")]),o=new e({authStrategy:new r({dataPath:It(yn,".wwebjs_auth")}),puppeteer:{headless:!0,args:["--no-sandbox"]}});return o.on("qr",a=>{process.stderr.write(`
|
|
33
33
|
WhatsApp: scan this QR code in WhatsApp \u2192 Linked Devices:
|
|
34
34
|
|
|
35
|
-
`),n(
|
|
35
|
+
`),n(a,{small:!0}),process.stderr.write(`
|
|
36
36
|
`)}),o.on("ready",()=>{process.stderr.write(`whatsapp-gateway: connected
|
|
37
|
-
`)}),o.on("message",async
|
|
38
|
-
`)}}),await o.initialize(),{platform:"whatsapp",client:o}}var
|
|
37
|
+
`)}),o.on("message",async a=>{if(a.fromMe)return;let i=a.from,s=a.author||a.from,u=a.body;try{let c=await _({platform:"whatsapp",chatId:i,senderId:s,text:u,userName:a._data?.notifyName||"user",meta:{forwarded:a.isForwarded||a._data?.isForwarded,forward_date:a._data?.forwardingScore?!0:void 0}});if(c){let p=(typeof c=="string"?c:c.text).replace(/\*\*/g,"*").replace(/```[\s\S]*?```/g,"[code]").replace(/`/g,"");await a.reply(p)}}catch(c){process.stderr.write(`whatsapp-gateway: ${c.message}
|
|
38
|
+
`)}}),await o.initialize(),{platform:"whatsapp",client:o}}var yn,Pt=k(()=>{F();yn=process.env.ORACLE_CONFIG_DIR||It(gn(),".config","oracle")});var Tt={};L(Tt,{signal_:()=>kn});async function kn(t){return process.stderr.write(`signal-gateway: requires signal-cli binary
|
|
39
39
|
`),process.stderr.write(`signal-gateway: not built yet \u2014 use Telegram or Discord for now
|
|
40
|
-
`),{platform:"signal",status:"stub"}}var
|
|
41
|
-
npm install -g ${
|
|
40
|
+
`),{platform:"signal",status:"stub"}}var Ut=k(()=>{F()});import{createServer as bn}from"node:http";import{env as Dt}from"node:process";import{join as _e}from"node:path";import{homedir as Sn}from"node:os";import{readFileSync as Bt,existsSync as vn,mkdirSync as $n,writeFileSync as xn}from"node:fs";import{randomBytes as Cn}from"node:crypto";var Ht=Dt.ORACLE_CONFIG_DIR||_e(Sn(),".config","oracle"),jt=_e(Ht,"gateway.json");function An(){return vn(jt)?JSON.parse(Bt(jt,"utf8")):{platforms:{}}}function Ce(t){return t?Array.isArray(t)?t.filter(Boolean):[t]:[]}var _n=Object.freeze({telegram:"grammy",discord:"discord.js",whatsapp:"whatsapp-web.js"});async function re(t,e,r,n){try{n.push(await e(r))}catch(o){let a=_n[t];if(a&&/Cannot find (module|package)|ERR_MODULE_NOT_FOUND/.test(String(o.message))){process.stderr.write(`oracle-gateway: ${t} needs an optional dependency. Install it first:
|
|
41
|
+
npm install -g ${a}
|
|
42
42
|
`);return}process.stderr.write(`oracle-gateway: ${t} failed to start: ${o.message}
|
|
43
|
-
`)}}async function
|
|
43
|
+
`)}}async function En(){let t=An(),e=[],r=Ce(t.platforms?.telegram),n=Ce(t.platforms?.discord),o=Ce(t.agents),i=r.length+n.length+o.length>1?new(await Promise.resolve().then(()=>(Re(),Ee))).A2ABus:null;if(i&&o.length){let{routePeerConsult:u,buildPersona:c}=await Promise.resolve().then(()=>(F(),$t));for(let d of o)try{let p=c(d);i.register(d.name,{role:d.role||"",chains:d.chains||[],handler:f=>u({from:f.from,text:f.text,persona:p,backend:d.backend,profile:d.hermesProfile})}),process.stderr.write(`oracle-gateway: headless agent '${d.name}' on bus (backend: ${d.backend||"oracle"})
|
|
44
44
|
`)}catch(p){process.stderr.write(`oracle-gateway: headless agent '${d.name||"?"}' skipped: ${p.message}
|
|
45
|
-
`)}}for(let u of r)await
|
|
45
|
+
`)}}for(let u of r)await re("telegram",async()=>(await Promise.resolve().then(()=>(Rt(),Et))).telegram({...u,bus:i}),t,e);for(let u of n)await re("discord",async()=>(await Promise.resolve().then(()=>(Lt(),Ot))).discord({...u,bus:i}),t,e);t.platforms?.whatsapp&&await re("whatsapp",async u=>(await Promise.resolve().then(()=>(Pt(),Nt))).whatsapp(u.platforms.whatsapp),t,e),t.platforms?.signal&&await re("signal",async u=>(await Promise.resolve().then(()=>(Ut(),Tt))).signal_(u.platforms.signal),t,e),e.length===0&&process.stderr.write(`oracle-gateway: no platforms configured. Run 'oracle setup telegram' first.
|
|
46
46
|
`),process.stderr.write(`oracle-gateway: ${e.length} platform(s) connected
|
|
47
|
-
`);let
|
|
48
|
-
`)}var
|
|
49
|
-
`,{mode:384}),r}var{pathToFileURL:
|
|
50
|
-
`),process.exit(1)});export{
|
|
47
|
+
`);let s=i?In():null;bn((u,c)=>On(u,c,{config:t,bus:i,a2aToken:s})).listen(Dt.ORACLE_GATEWAY_PORT||9270,"127.0.0.1"),i&&process.stderr.write(`oracle-gateway: a2a loopback contract at GET /a2a (token: a2a-token in config dir)
|
|
48
|
+
`)}var Rn=16384;async function On(t,e,{config:r,bus:n,a2aToken:o}){let a=new URL(t.url||"/","http://127.0.0.1"),i=(u,c)=>{e.writeHead(u,{"Content-Type":"application/json"}),e.end(JSON.stringify(c))};if(t.method==="GET"&&(a.pathname==="/"||a.pathname==="/health"))return i(200,{status:"ok",platforms:Object.keys(r.platforms||{}),a2a:!!n});if(!a.pathname.startsWith("/a2a"))return i(404,{error:"not found"});if(!n)return i(404,{error:"a2a bus not running (fewer than 2 agents configured)"});if(t.method==="GET"&&a.pathname==="/a2a")return i(200,{contract:"oracle-a2a/1",auth:"Authorization: Bearer <contents of a2a-token in the oracle config dir>",endpoints:["GET /a2a","GET /a2a/agents","POST /a2a/ask {to,text,from?}"],note:"consult-only; loopback-only; peers answer with information, never actions"});let s=String(t.headers.authorization||"");if(!o||s!==`Bearer ${o}`)return i(401,{error:"bad or missing bearer token (read a2a-token in the oracle config dir)"});if(t.method==="GET"&&a.pathname==="/a2a/agents")return i(200,{agents:n.roster()});if(t.method==="POST"&&a.pathname==="/a2a/ask"){let u="";t.on("data",c=>{u+=c,u.length>Rn&&t.destroy()}),t.on("end",async()=>{try{let c=JSON.parse(u||"{}"),d=Ln(c.from);n.agents.has(d)||n.register(d,{role:"loopback client",handler:async()=>null});let p=await n.send({from:d,to:c.to,text:c.text,kind:"consult"});return i(p.ok?200:400,p)}catch(c){return i(400,{ok:!1,error:`bad request: ${c.message}`})}});return}return i(404,{error:"not found"})}function Ln(t){return String(t||"local").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"").slice(0,32)||"local"}function In(t=Ht){let e=_e(t,"a2a-token");try{let n=Bt(e,"utf8").trim();if(n)return n}catch{}let r=Cn(24).toString("hex");return $n(t,{recursive:!0}),xn(e,`${r}
|
|
49
|
+
`,{mode:384}),r}var{pathToFileURL:Nn}=await import("node:url"),{realpathSync:Pn}=await import("node:fs"),Mt=process.argv[1],Ae=!1;if(Mt)try{Ae=import.meta.url===Nn(Pn(Mt)).href}catch{Ae=!1}Ae&&En().catch(t=>{process.stderr.write(`oracle-gateway: ${t.message}
|
|
50
|
+
`),process.exit(1)});export{In as ensureA2AToken,On as serveHttp,Ce as toEntries};
|