@oracle-agent/oracle 0.29.0 → 0.30.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-desk-product/SKILL.md +1 -1
- package/dist/bin/desk-server.mjs +28 -28
- package/dist/bin/oracle-gateway.mjs +37 -37
- package/dist/cli/commands/chat.mjs +154 -154
- package/dist/cli/commands/doctor.mjs +4 -4
- package/dist/cli/commands/eval.mjs +88 -88
- package/dist/cli/commands/model.mjs +158 -158
- package/dist/cli/commands/receipt.mjs +3 -3
- package/dist/cli/commands/sign.mjs +14 -14
- package/dist/cli/commands/signer.mjs +16 -13
- package/dist/cli/commands/venues.mjs +3 -3
- package/dist/data/desk-data.mjs +26 -26
- package/dist/index.mjs +40 -40
- package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
- package/dist/local-signer/index.mjs +3 -3
- package/dist/local-signer/runtime.mjs +13 -10
- package/package.json +1 -1
|
@@ -1,50 +1,50 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`,{mode:384}),
|
|
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
|
|
2
|
+
var Zt=Object.defineProperty;var w=(t,e,r)=>()=>{if(r)throw r[0];try{return t&&(e=t(t=0)),e}catch(n){throw r=[n],n}};var T=(t,e)=>{for(var r in e)Zt(t,r,{get:e[r],enumerable:!0})};var Re={};T(Re,{A2ABus:()=>ie,normalizeName:()=>Y});function Y(t){return String(t||"").trim().toLowerCase().replace(/^@/,"")}var ie,Le=w(()=>{ie=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=Y(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(Y(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=Y(e),c=Y(r);if(!i||!this.agents.has(i))return{ok:!1,error:`a2a: unknown sender '${e}'`};if(!c||!this.agents.has(c))return{ok:!1,error:`a2a: unknown recipient '${r}' (roster: ${[...this.agents.keys()].join(", ")||"empty"})`};if(c===i)return{ok:!1,error:"a2a: self-send refused"};let l=String(n||"").trim().slice(0,8e3);if(!l)return{ok:!1,error:"a2a: empty message"};let s=Number(a)+1;if(s>this.maxHops)return this.record({from:i,to:c,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:c,kind:String(o),text:l,hops:s,ts:new Date().toISOString()};this.record(d);try{let p=await this.agents.get(c).handler(d);return p&&this.record({id:`${d.id}-reply`,from:c,to:i,kind:"reply",text:String(p).slice(0,8e3),hops:s,ts:new Date().toISOString()}),{ok:!0,reply:p||null,id:d.id}}catch(p){return{ok:!1,error:`a2a: '${c}' 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 J from"node:fs";import er from"node:os";import U from"node:path";import{fileURLToPath as tr}from"node:url";function se(){return process.env.ORACLE_FAKE_HOME||er.homedir()}function nr(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function A(){return nr()?process.env.ORACLE_CONFIG_DIR||U.join(se(),".config","oracle"):U.join(se(),".config","oracle")}function or(){return U.join(A(),"desk.json")}function ar(){return U.join(A(),"env")}function j({force:t=!1}={}){if(j._done&&!t)return j._result||null;j._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=ar();if(J.existsSync(o))for(let a of J.readFileSync(o,"utf8").split(/\r?\n/)){let i=a.match(/^\s*([A-Z0-9_]+)\s*=\s*(.*?)\s*$/);if(!i||i[2].startsWith("#"))continue;let c=i[2];(c.startsWith('"')&&c.endsWith('"')||c.startsWith("'")&&c.endsWith("'"))&&(c=c.slice(1,-1)),r(i[1],c)}}catch{}try{let o=or();if(J.existsSync(o)){let a=JSON.parse(J.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)),j._result=Object.keys(e).length?e:null,j._result}function ee(t){return J.mkdirSync(t,{recursive:!0}),t}var rr,oo,te=w(()=>{rr=U.dirname(tr(import.meta.url)),oo=U.resolve(rr,"../..");try{j()}catch{}});function re(t){return String(t||"").trim()||void 0}function sr(t,{required:e=!1}={}){let r=re(t)?.toLowerCase();if(!r){if(e)throw new Error("model provider is required");return}if(!ir.has(r))throw new Error(`unsupported provider: ${r}`);return r}function cr(t,{required:e=!1}={}){let r=re(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 lr(t){let e=re(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 Ne({provider:t,model:e,baseUrl:r}={},{requireModel:n=!1}={}){let o=sr(t),a=cr(e,{required:n});if(o==="custom")return{provider:o,...a?{model:a}:{},baseUrl:lr(r)};if(re(r))throw new Error("baseUrl is only supported for the custom provider");return{...o?{provider:o}:{},...a?{model:a}:{}}}var ir,Ie=w(()=>{ir=new Set(["openrouter","openai","anthropic","xai","deepseek","gemini","kimi","mistral","nous","qwen","glm","custom","anthropic-oauth","openai-codex","xai-oauth"])});import D from"node:fs";import ce from"node:path";function Pe(){return ce.join(A(),"model.json")}function M(t){return String(t||"").trim()||void 0}function Te(t={}){let e=M(t.backend)?.toLowerCase()||"auto",r=Ne({provider:t.provider,model:t.model,baseUrl:t.baseUrl},{requireModel:e==="standalone"}),n=M(t.apiKeyEnv),o=Number.parseInt(String(t.contextLength||""),10),a=M(t.reasoningEffort),i=M(t.computeHost||t.remoteHost),c=M(t.computeUser||t.remoteUser),l=M(t.computePath||t.remotePath);if(!ur.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}:{},...c?{computeUser:c}:{},...l?{computePath:l}:{}}}function B(){let t=Pe();if(!D.existsSync(t))return null;try{return Te(JSON.parse(D.readFileSync(t,"utf8")))}catch{return null}}function le(t){let e=Te(t),r=Pe();ee(ce.dirname(r)),process.platform!=="win32"&&D.chmodSync(ce.dirname(r),448);let n=`${r}.${process.pid}.tmp`;return D.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
3
|
+
`,{mode:384}),D.renameSync(n,r),process.platform!=="win32"&&D.chmodSync(r,384),e}var ur,je=w(()=>{te();Ie();ur=new Set(["auto","standalone","hermes","remote","arch"])});import{existsSync as dr,readFileSync as pr}from"node:fs";import{request as mr}from"node:http";import fr from"node:path";function gr(t=process.env){let e=String(t.ORACLE_SIGNER_URL||hr).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 yr(t=process.env){if(t.ORACLE_SIGNER_TOKEN)return String(t.ORACLE_SIGNER_TOKEN);let e=fr.join(A(),"signer","signer-token");return dr(e)?pr(e,"utf8").trim():null}function L(t,{method:e="GET",body:r=null,env:n=process.env,timeoutMs:o=4e3}={}){let a=gr(n),i=yr(n);return!a||!i?Promise.resolve({ok:!1,error:"local signer is not running"}):new Promise(c=>{let l=new URL(t,a),s=r?Buffer.from(JSON.stringify(r)):null,d=mr({hostname:l.hostname,port:l.port||80,path:l.pathname,method:e,timeout:o,headers:{authorization:`Bearer ${i}`,origin:a,...s?{"content-type":"application/json","content-length":s.length}:{}}},p=>{let m=[];p.on("data",h=>m.push(h)),p.on("end",()=>{let h=Buffer.concat(m).toString("utf8"),y={};try{y=h?JSON.parse(h):{}}catch{y={error:"signer refused"}}c({httpStatus:p.statusCode,...y})})});d.on("timeout",()=>{d.destroy(),c({ok:!1,error:"local signer timed out"})}),d.on("error",()=>c({ok:!1,error:"local signer is not running"})),s&&d.write(s),d.end()})}var hr,ne=w(()=>{te();hr="http://127.0.0.1:9462"});function Ue(t){return kr.get(Number(t))||null}var wr,kr,Me=w(()=>{wr={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}},kr=new Map(Object.values(wr).map(t=>[t.chainId,t]))});function u(t){return k(t)?String(t).replace(br,e=>`\\${e}`):f}function k(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!=="":!0}function v(t){if(!k(t))return f;let e=String(t).replace(/`/g,"");return e===""?f:`\`${e}\``}function N(t,{decimals:e=2}={}){if(!k(t))return f;let r=Number(t);return Number.isFinite(r)?r.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:e}):f}function b(t,{decimals:e=2}={}){let r=N(t,{decimals:e});return r===f?f:`${r} USD`}function ue(t,{decimals:e=2}={}){let r=N(t,{decimals:e});return r===f?f:`${r}%`}function oe(t){let e=N(t,{decimals:0});return e===f?f:`${e} bps`}function I(t,e){if(!k(t))return f;let r=Number(e);if(!Number.isInteger(r)||r<0||r>77)return f;let n;try{n=BigInt(typeof t=="string"?t.trim():t)}catch{return f}let o=n<0n,a=o?-n:n,i=10n**BigInt(r),c=(a/i).toString(),l=(a%i).toString().padStart(r,"0").replace(/0+$/,"");return`${o?"-":""}${c}${l?`.${l}`:""}`}function Sr(t){if(typeof t=="number"&&Number.isFinite(t))return t<0||t>1?f: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 f}function E(t={}){let e=t.chainId;if(!k(e)||!Number.isFinite(Number(e)))return k(t.chain)?u(t.chain):f;let n=Ue(e)?.name||(k(t.chain)?String(t.chain):f);return`${u(n)} (chainId ${Number(e)})`}function De(t={}){return u(t.venue??t.dex??t.pool?.venue)}function vr(t){return t==null?"NONE (text card only)":typeof t=="string"?t.trim()?v(t):"NONE (text card only)":t.error||t.ok===!1||t.available===!1?`UNAVAILABLE${k(t.error)?` \u2014 ${u(t.error)}`:""} (text card stands)`:k(t.url)?v(t.url):"NONE (text card only)"}function de(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(k(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 xr(t){let e=de(t);return e.allowed?`${e.actions.map(r=>u(r)).join(" / ")} (${u(e.reason)})`:`prepare-only \u2014 ${u(e.reason)}`}function $(t,e,r={}){let n=[`*${t}*`];for(let[o,a]of e)n.push(`${o}: ${a==null||a===""?f:a}`);return n.push(`Chart: ${vr(r.chart)}`),n.push(`Actions: ${xr(r)}`),Array.isArray(r.warnings)&&r.warnings.length&&n.push(`Warnings: ${r.warnings.map(o=>u(o)).join("; ")}`),(k(r.source)||k(r.fetchedAt))&&n.push(`Source: ${u(r.source)} at ${u(r.fetchedAt)}`),n.join(`
|
|
4
|
+
`)}function C(t){return["Confidence",Sr(t.confidence)]}function Ar(t){let e=t.quote;if(!e||typeof e!="object")return[];let r=k(e.decimals)?I(e.amountOutRaw??e.out??e.raw,e.decimals):f;return[["Quote out (raw)",v(e.amountOutRaw??e.out??e.raw)],["Quote out",r===f?f:`${u(r)} ${u(e.symbol??"")}`.trim()]]}function Be(t){let e=t.autoSlippage;if(!e||typeof e!="object")return["Auto-slippage",f];let r=oe(e.selectedBps),n=oe(e.capBps);return["Auto-slippage",r===f&&n===f?f:`${r} selected, cap ${n}`]}function $r(t={}){let e=t||{};return $(`ORACLE TOKEN \u2014 ${u(e.symbol??e.token??e.name)}`,[["Chain",E(e)],["Venue",De(e)],["Name",u(e.name)],["Address",v(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",ue(e.priceChange24h)],["Fee tier",k(e.feeTier)?`${oe(Number(e.feeTier)/100)} (${N(e.feeTier,{decimals:0})})`:f],["Age",u(e.age)],...Ar(e),Be(e),C(e)],e)}function Cr(t={}){let e=t||{};return $(`ORACLE LAUNCH \u2014 ${u(e.symbol??e.token??e.name)}`,[["Chain",E(e)],["Venue",De(e)],["Address",v(e.address??e.mint??e.contract)],["Pool",v(e.pool?.address??e.poolAddress??e.pool)],["Liquidity",b(e.liquidityUsd)],["Route ready",u(e.routeReady)],["Sellable",u(e.sellable)],["Sell sim",u(e.sellSimulation??e.sellSim)],["Smart wallets",u(e.smartWalletOverlap)],["Risk",u(e.risk??e.riskStatus)],["Prepared ticket",u(e.preparedTicket??e.ticketStatus)],Be(e),C(e)],e)}function Er(t={}){let e=t||{};return $(`ORACLE HIP-3 \u2014 ${u(e.market??e.coin??e.name)}`,[["Venue",`Hyperliquid builder-dex ${u(e.dex)}`],["Market",u(e.market??e.coin)],["Mark",b(e.markPx,{decimals:6})],["Oracle",b(e.oraclePx,{decimals:6})],["Funding",ue(e.funding,{decimals:6})],["Open interest",b(e.openInterestUsd)],["Depth",u(e.depth)],["Liquidation notes",u(e.liquidationNotes??e.riskNotes)],["Account context",u(e.accountContext)],C(e)],e)}function _r(t={}){let e=t||{};return $(`ORACLE HIP-4 \u2014 ${u(e.event??e.market??e.name)}`,[["Venue",`Hyperliquid HIP-4 ${u(e.dex??"outcome")}`],["Event",u(e.event)],["Outcome",u(e.outcome)],["Market id",v(e.marketId??e.market)],["Bid",b(e.bid,{decimals:6})],["Ask",b(e.ask,{decimals:6})],["Depth",u(e.depth)],["Edge",ue(e.edge)],["Position",u(e.position)],C(e)],e)}function Or(t={}){let e=t||{};return $(`ORACLE POLYMARKET \u2014 ${u(e.event??e.market??e.name)}`,[["Venue","Polymarket CLOB"],["Event",u(e.event)],["Market",u(e.market)],["Market id",v(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",u(e.resolutionRisk)],["Order intent",u(e.orderIntent)],C(e)],e)}function Rr(t={}){let e=t||{},r=k(e.completedSplits)&&k(e.totalSplits)?`${N(e.completedSplits,{decimals:0})} / ${N(e.totalSplits,{decimals:0})}`:f;return $(`ORACLE TWAP \u2014 ${u(e.pair??e.symbol??e.name)}`,[["Chain",E(e)],["Side",u(e.side??e.direction)],["Amount",`${u(I(e.amountTotal??e.amount,e.decimals??18))} ${u(e.symbol??"")}`.trim()],["Splits",`${N(e.totalSplits,{decimals:0})} over ${u(e.window)}`],["Progress",r],["Avg price",b(e.averagePrice,{decimals:6})],["Next split",u(e.nextSplitAt)],["Slippage cap",oe(e.slippageBps)],["Status",u(e.status)],C(e)],e)}function Lr(t={}){let e=t||{},r=e.approval??e.revokeCheck??{},n=r.needsRevoke&&r.spender?`revoke.cash \u2014 ${u(r.spender)}`:r.needsRevoke===!1?"revoke.cash \u2014 clean":"revoke.cash \u2014 unchecked";return $(`ORACLE BRIDGE \u2014 ${u(e.pair??e.fromSymbol)} \u2192 ${u(e.toSymbol??"")}`.replace(/→ $/,""),[["Bridging","deBridge \xB7 LI.FI \u2014 best route wins"],["From chain",E({chainId:e.fromChainId,chain:e.fromChain})],["To chain",E({chainId:e.toChainId,chain:e.toChain})],["Amount",`${u(I(e.amount,e.fromDecimals??18))} ${u(e.fromSymbol??"")}`.trim()],["Best route",u(e.bestRoute??e.winner)],["Est. received",`${u(I(e.amountOut,e.toDecimals??18))} ${u(e.toSymbol??"")}`.trim()],["Fee",b(e.feeUsd)],["Est. time",u(e.estimatedTime)],["Revoke check",n],["All providers",u(e.providers?.join(", "))],["Preparable",u(e.preparable)],C(e)],e)}function Nr(t){let r=(Array.isArray(t)?t:[]).slice(1,4).map(n=>{let o=u(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("; "):f}function Ir(t){let e=t.rankedOn??t.swap?.rankedOn??t.best?.rankedOn;return k(e)?u(e):f}function Pr(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=`${u(e.tokenInSymbol??e.fromSymbol??"IN")} \u2192 ${u(e.tokenOutSymbol??e.toSymbol??"OUT")}`,i=[["Intent",u(e.intent??"swap")],["Chain",E({chainId:e.chainId??r.chainId,chain:e.chain??r.chain})],["Pair",a],["Amount in",`${u(I(e.amountIn??r.amountIn,e.decimalsIn??18))} ${u(e.tokenInSymbol??"")}`.trim()],["Best swap",u(o.source??o.venue??r.bestRoute??e.bestRoute)],["Net out",`${u(I(o.netOut??o.amountOut??r.amountOut,e.decimalsOut??18))} ${u(e.tokenOutSymbol??"")}`.trim()],["Ranked on",Ir(r)],["Gas accounted",u(o.costAccounted===!0?"yes":o.costAccounted===!1?"no \u2014 gross ranking may flatter this route":null)],["Spread vs next",k(r.improvementBps)?`${u(r.improvementBps)} bps`:f],["Runners-up",Nr(r.routes??e.routes)]];if(n){let c=n.best??n.winner??{};i.push(["Best bridge",u(c.source??n.bestRoute??e.bestBridge)],["Bridge out",`${u(I(c.netOut??c.amountOut??n.amountOut,e.bridgeDecimalsOut??e.decimalsOut??18))} ${u(e.bridgeOutSymbol??e.tokenOutSymbol??"")}`.trim()],["Bridge to",E({chainId:n.toChainId??e.toChainId,chain:n.toChain??e.toChain})],["Est. time",u(n.estimatedTime??c.meta?.durationSeconds)])}else i.push(["Best bridge","same-chain \u2014 use Best swap"]);return i.push(["Preparable",u(e.preparable??o.executionReady)],C(e)),$(`ORACLE SWAP \u2014 ${a}`,i,e)}function pe(t={}){let e=t||{};return $("ORACLE APPROVE \u2014 local signer",[["Pending id",v(e.id??(typeof e.digest=="string"?e.digest.slice(0,8):null))],["Surface",u(e.surface)],["Action",u(e.action)],["Chain",E({chainId:e.chain??e.chainId,chain:e.chainName})],["To",v(e.to??e.destination)],["Value",k(e.value)?u(e.value):f],["Signer",u(e.armed===!0?"running + armed":e.armed===!1?"running, disarmed":"not running")],C({confidence:e.confidence??(e.armed===!0?"high":"low")})],e)}function me({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 f,bo,br,So,Fe=w(()=>{Me();f="UNKNOWN",bo=Object.freeze(["token","launch","hip3","hip4","polymarket","twap","bridge","swap","approve"]),br=/[_*[\]`]/g;So=Object.freeze({token:$r,launch:Cr,hip3:Er,hip4:_r,polymarket:Or,twap:Rr,bridge:Lr,swap:Pr,approve:pe})});function fe(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 he(t,{platform:e,grant:r,armed:n}){if(!t.length)return{text:"No pending local-signer artifacts.",buttons:me({platform:e,hasGrant:!1})};let o=t[0];return{text:t.map(i=>pe({...i,armed:n,grant:r,confidence:n?"high":"medium"})).join(`
|
|
6
6
|
|
|
7
|
-
`),buttons:
|
|
8
|
-
`),buttons:null}}let
|
|
9
|
-
Tx: \`${
|
|
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:me({platform:e,id:o.id,digest:o.digest,hasGrant:de({grant:r}).allowed})}}async function ge({platform:t,text:e,grant:r={local:!0},env:n=process.env,ownerProof:o}={}){let a=fe(e);if(!a)return null;let i=String(t)==="telegram";if(i&&a.verb!=="pending"&&!a.id)return{text:"On Telegram, tap Allow or Deny on the approve card. /approve is only for chats without cards.",buttons:null};if(a.verb==="pending"){let p=await L("/pending",{env:n});if(p.ok===!1||p.error)return{text:`Local signer: ${p.error||"not running"}. Start \`oracle signer\` on this machine first.`,buttons:null};let m=Array.isArray(p.items)?p.items:[],h=he(m,{platform:t,grant:r,armed:p.armed===!0});if(i)return h;if(!m.length)return{text:"No pending local-signer artifacts. /approve is only needed when cards are unavailable.",buttons:null};let y=m.map(S=>`\u2022 ${S.id} ${S.surface}/${S.action} to ${S.to||"n/a"}`);return y.push("Cards are not available here. Reply /approve <id> or /deny <id>."),{text:y.join(`
|
|
8
|
+
`),buttons:null}}let c=a.verb==="approve"?"/ack":"/deny";if(!a.id)return{text:"Usage: /approve <id> (only when approve cards are not available)",buttons:null};let l=await L(c,{method:"POST",body:{id:a.id,...o?{ownerProof:o}:{}},env:n});if(l.httpStatus===404||l.error==="no pending artifact")return{text:"Nothing pending with that id. It may have expired or already been decided.",buttons:null};if(l.ok===!1||l.httpStatus&&l.httpStatus>=400)return{text:`Local signer refused: ${l.error||"not running"}`,buttons:null};if(a.verb==="deny")return{text:`Denied ${l.id||a.id}. Artifact dropped. Nothing signed.`,buttons:null};let s=l.result?.hash||l.result?.txHash||l.result?.transactionHash||l.hash,d=l.id||a.id;return s?{text:`Bought. Local signer executed ${d}.
|
|
9
|
+
Tx: \`${s}\``,buttons:null,executed:!0,hash:s}:{text:`Local signer executed ${d}. Check the signer receipt if no hash was returned.`,buttons:null,executed:!0,result:l.result||null}}async function He({platform:t,data:e,senderId:r,chatId:n,ownerProofAuthority:o,grant:a={local:!0},env:i=process.env}={}){let l=String(e||"").match(/^oracle:(approve|deny):([0-9a-fA-F]{4,64})$/i);if(!l)return null;let s=l[1].toLowerCase()==="approve"?"approve":"deny",d;if(s==="approve"&&o){let m=(await L("/pending",{env:i})).items?.find(h=>h.id===l[2].toLowerCase()||h.digest===l[2].toLowerCase());if(!m)return{text:"Nothing pending with that id. It may have expired or already been decided.",buttons:null};d=o.mint({digest:m.digest,senderId:r,chatId:n,platform:t})}return ge({platform:t,text:`/${s} ${l[2]}`,grant:a,env:i,ownerProof:d})}var ye=w(()=>{ne();Fe();ne()});import{execFile as Tr}from"node:child_process";import{existsSync as jr,mkdirSync as Ur,readFileSync as Ge,realpathSync as Mr,writeFileSync as Dr}from"node:fs";import _ from"node:path";import{promisify as Br}from"node:util";import{fileURLToPath as We}from"node:url";function Wr(t=import.meta.url){try{let e=Mr(We(t)),r=`${_.sep}node_modules${_.sep}`,n=e.lastIndexOf(r);if(n>0)return{root:e.slice(0,n),managed:!0}}catch{}return{root:null,managed:!1}}function ke(t=import.meta.url){try{let e=_.dirname(We(t));for(let r=0;r<8;r+=1){let n=_.join(e,"package.json");if(jr(n)){let a=JSON.parse(Ge(n,"utf8"));if(a?.name===we&&a.version)return a.version}let o=_.dirname(e);if(o===e)break;e=o}}catch{return null}return null}function qr(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,c=o[a]??0;if(i>c)return 1;if(i<c)return-1}return 0}function qe(t){let e=t?.stateDir||_.join(process.env.HOME||".",".oracle");return _.join(e,"update-check.json")}function zr(t){try{return JSON.parse(Ge(qe(t),"utf8"))}catch{return null}}function Vr(t,e){try{let r=qe(t);Ur(_.dirname(r),{recursive:!0}),Dr(r,`${JSON.stringify(e,null,2)}
|
|
10
|
+
`)}catch{}}async function Kr({timeoutMs:t=4e3}={}){try{let e=new AbortController,r=setTimeout(()=>e.abort(),t),n=await fetch(`${Hr}/${encodeURIComponent(we)}/latest`,{signal:e.signal});return clearTimeout(r),n.ok&&(await n.json())?.version||null}catch{return null}}async function ze({paths:t,force:e=!1,timeoutMs:r=4e3}={}){let n=ke(),o=e?null:zr(t),i=o&&Date.now()-(o.checkedAt||0)<Gr?o.latest:null;return i||(i=await Kr({timeoutMs:r}),i&&Vr(t,{latest:i,checkedAt:Date.now()})),!n||!i?{current:n,latest:i,updateAvailable:!1,checked:!!i}:{current:n,latest:i,updateAvailable:qr(i,n)>0,checked:!0}}async function Ve({version:t="latest",dryRun:e=!1}={}){let{root:r,managed:n}=Wr();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=`${we}@${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:c}=await Fr("npm",a,{timeout:3e5,maxBuffer:16777216});return{ok:!0,root:r,stdout:i,stderr:c}}catch(i){return{ok:!1,reason:"npm-failed",root:r,message:i?.stderr||i?.message||"npm install failed"}}}var Fr,we,Hr,Gr,Ke=w(()=>{Fr=Br(Tr),we="@oracle-agent/oracle",Hr="https://registry.npmjs.org",Gr=1440*60*1e3});import Yr from"node:fs";import Jr from"node:os";import Ye from"node:path";function F(t){return String(t||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}function Xr(){let t=process.env.ORACLE_CONFIG_DIR||Ye.join(Jr.homedir(),".config","oracle");return Ye.join(t,"chains.json")}function Qr(t){if(!t||typeof t!="object")return null;let e=String(t.key??"").trim();if(!e||/[/\\.]/.test(e))return null;let r=F(e);if(!Xe.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"&&Xe.test(t.agent.trim())?t.agent.trim():"oracle";return{key:r,aliases:Array.isArray(t.aliases)?t.aliases.map(F).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:F(t.family)||r,agent:o,note:String(t.note||"user-defined").slice(0,80),build:t.build!==!1,source:"user"}}function Zr(t=Yr.readFileSync){try{let e=JSON.parse(t(Xr(),"utf8")),r=Array.isArray(e?.chains)?e.chains:[],n=[],o=new Set;for(let a of r){let i=Qr(a);!i||o.has(i.key)||(o.add(i.key),n.push(i))}return n}catch{return[]}}function Qe(){let t=Zr();if(t.length===0)return Je;let e=new Map(Je.map(r=>[r.key,r]));for(let r of t)e.set(r.key,r);return[...e.values()]}function en({buildOnly:t=!1}={}){return Qe().filter(e=>t?e.build:!0)}function X(t){let e=F(t);if(!e)return null;for(let r of Qe())if(r.key===e||String(r.chainId).toLowerCase()===e||(r.aliases||[]).map(F).includes(e)||F(r.name)===e)return r;return null}function Ze({selectedKey:t=null,buildOnly:e=!1}={}){let r=en({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),c=o.key.padEnd(12);n.push(`${a} ${c} ${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 Je,Xe,be=w(()=>{Je=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}]);Xe=/^[a-z0-9][a-z0-9-]*$/});import Se from"node:fs";import tn from"node:path";function et(){return tn.join(A(),"active-chain.json")}function ve(){let t=et();if(!Se.existsSync(t))return null;try{let e=JSON.parse(Se.readFileSync(t,"utf8"));if(!e||typeof e!="object"||!e.key)return null;let r=X(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 tt(t){let e=X(t);if(!e){let n=new Error(`unknown chain '${t}'`);throw n.code="UNKNOWN_CHAIN",n}ee(A());let r={key:e.key,chainId:e.chainId,name:e.name,agent:e.agent,selectedAt:new Date().toISOString()};return Se.writeFileSync(et(),JSON.stringify(r,null,2)+`
|
|
14
|
+
`,{mode:384}),r}var rt=w(()=>{be();te()});var $t={};T($t,{NON_OWNER_REPLY:()=>G,buildPersona:()=>W,handleSelfUpdate:()=>lt,isForwarded:()=>ut,isOwnerSender:()=>H,ownerIdsFor:()=>st,parseGatewayChainCommand:()=>kt,parseGatewayCompactCommand:()=>wt,parseGatewayEffortCommand:()=>ft,parseGatewayGoalCommand:()=>yt,parseGatewayHelpCommand:()=>ht,parseGatewayModelCommand:()=>mt,parseGatewaySetupModelCommand:()=>fn,parseGatewayStatusCommand:()=>gt,parsePeerAsk:()=>St,parseSelfUpdate:()=>ct,resolveBackendArgv:()=>vt,resolveGatewayModel:()=>dt,resolveOracleBin:()=>it,routePeerConsult:()=>Q,routeToAgent:()=>O});import{spawn as at}from"node:child_process";import{dirname as rn,join as Ae}from"node:path";import{homedir as nn}from"node:os";import{mkdirSync as on,readFileSync as an,writeFileSync as sn,unlinkSync as cn}from"node:fs";import{fileURLToPath as ln}from"node:url";function it({env:t=process.env,moduleUrl:e=import.meta.url}={}){return t.ORACLE_CLI_ENTRY||Ae(rn(ln(e)),"oracle.mjs")}function st(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 H({platform:t,senderId:e,extraOwners:r},n=process.env){let o=String(e||"").trim();return o?st(t,n).has(o)?!0:Array.isArray(r)?r.map(a=>String(a).trim()).filter(Boolean).includes(o):!1:!1}function ct(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 lt(t,{check:e=ze,update:r=Ve,versionOf:n=ke}={}){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 c=n();return[`oracle ${o.current||"?"} \u2192 ${c||a}`,"Restart the gateway to load it: oracle gateway"].join(`
|
|
15
|
+
`)}function ut(t={}){return!!(t.forwarded||t.forward_from||t.forward_from_chat||t.forward_origin||t.forward_sender_name||t.forward_date)}function dt({readConfig:t=B}={}){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 mt(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=pt[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,c]=o[0].split(":");if(i&&c)return{action:"set",provider:i,model:c}}return{action:"usage"}}function ft(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"}:dn.includes(n)?{action:"set",reasoningEffort:n}:{action:"usage"}}function pn({provider:t,model:e}){let r=B()||{},n=le({...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 mn(t){let e=B();if(!e)throw new Error("no model configured \u2014 run /model first");return`effort ${le({...e,reasoningEffort:t}).reasoningEffort||t}
|
|
17
|
+
Native harness only.`}function nt(){let t=B(),e=["Oracle native models (tap /model <id> to switch):"];for(let[r,n]of Object.entries(pt)){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 xe(){let t=B();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 $e,
|
|
31
|
-
`),await
|
|
32
|
-
`)}}),await n.login(t.token),{platform:"discord",name:o,client:n}}var
|
|
20
|
+
`)}function fn(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 ht(t){let e=String(t||"").trim();return/^\/(?:help|commands|\?)$/i.test(e)?{action:"help"}:null}function gt(t){let e=String(t||"").trim();return/^\/(?:status|usage)$/i.test(e)?{action:"status"}:null}function yt(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 wt(t){let r=String(t||"").trim().match(/^\/(?:compact|compress)(?:\s+(.+))?$/i);return r?{action:"compact",focus:String(r[1]||"").trim()}:null}function kt(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 Ce(){return Ae($e,"gateway-goal.json")}function bt(){try{let t=JSON.parse(an(Ce(),"utf8"));return t&&typeof t.goal=="string"?t:null}catch{return null}}function hn(t){on($e,{recursive:!0,mode:448});let e={schemaVersion:1,goal:String(t),updatedAt:new Date().toISOString()};return sn(Ce(),`${JSON.stringify(e,null,2)}
|
|
21
|
+
`,{mode:384}),e}function gn(){try{cn(Ce())}catch{}}function yn(){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 wn(){let t=xe(),e=ve(),r=bt();return[t,`chain ${e?.key||e?.name||"default"}`,`goal ${r?.goal||"unset"}`].join(`
|
|
23
|
+
`)}function St(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 W(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 vt(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 Q({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 At({text:a,backend:n,profile:o,unconfiguredPrefix:"unconfigured: "})}async function O({platform:t,chatId:e,senderId:r,text:n,userName:o,meta:a={},updater:i,extraOwners:c,bus:l,agentName:s,persona:d,backend:p,profile:m}={}){if(!H({platform:t,senderId:r,extraOwners:c}))return process.stderr.write(`gateway: denied non-owner sender ${t}:${String(r||"unknown")}
|
|
25
|
+
`),G;if(ut(a))return process.stderr.write(`gateway: dropped forwarded message on ${t}
|
|
26
|
+
`),null;let h=ct(n);if(h)return lt(h,i);let y=mt(n);if(y)try{return y.action==="list"?nt():y.action==="show"?xe():y.action==="usage"?nt():pn(y)}catch(g){return`model not saved: ${g.message}`}let S=ft(n);if(S)try{return S.action==="show"?xe():S.action==="usage"?"usage: /effort low|medium|high":mn(S.reasoningEffort)}catch(g){return`effort not saved: ${g.message}`}if(ht(n))return yn();if(gt(n))return wn();let x=yt(n);if(x){if(x.action==="show"){let g=bt();return g?.goal?`goal ${g.goal}`:"goal unset \u2014 /goal <objective>"}return x.action==="clear"?(gn(),"goal cleared"):(hn(x.goal),`goal pinned: ${x.goal}`)}let V=wt(n);if(V){let g=V.focus?` Focus: ${V.focus}.`:"";return ot({platform:t,chatId:e,senderId:r,text:`Compact this session context now.${g} 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:m})}let Z=kt(n);if(Z){if(Z.action==="list")return Ze({selectedKey:ve()?.key||null});let g=X(Z.chain);return g?(tt(g.key),`chain ${g.key}`):`unknown chain '${Z.chain}' \u2014 /chain list`}if(fe(n)){let g=await ge({platform:t,text:n,grant:{local:!0}});return g?g.buttons?.kind==="inline_keyboard"?{text:g.text,replyMarkup:g.buttons.replyMarkup}:g.text:null}if(l){let g=St(n);if(g){let R=await l.send({from:s||"oracle",to:g.peer,text:g.text,kind:"consult"});return R.ok?R.reply?`[${g.peer}] ${R.reply}`:`[${g.peer}] (no reply)`:R.error}if(/^\/(agents|roster)\b/i.test(String(n||"").trim())){let R=l.roster().map(K=>`\u2022 ${K.name}${K.role?` \u2014 ${K.role}`:""}${K.chains.length?` (${K.chains.join(", ")})`:""}`);return R.length?`Agents on the bus:
|
|
27
|
+
${R.join(`
|
|
28
|
+
`)}`:"No peer agents registered."}}let Qt=n.toLowerCase().trim();return/\b(buy|sell|swap|bridge|send|transfer|balance|portfolio|watch|quote|price)\b/.test(Qt)?bn({platform:t,chatId:e,senderId:r,text:n,userName:o}):ot({platform:t,chatId:e,senderId:r,text:n,userName:o,persona:d,backend:p,profile:m})}function xt(t,{timeout:e=12e4}={}){return new Promise(r=>{let n=at(process.execPath,[un,...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 kn(t,e,{timeout:r=18e4}={}){return new Promise(n=>{let o=at(t,e,{stdio:["ignore","pipe","pipe"],timeout:r,env:{...process.env}}),a="",i="";o.on("error",c=>n({code:127,out:"",err:String(c.message)})),o.stdout.on("data",c=>a+=c.toString()),o.stderr.on("data",c=>i+=c.toString()),o.on("close",c=>n({code:c,out:a.trim(),err:i.trim()}))})}async function bn({text:t}){let e=await xt(["route","swap","--text",t],{timeout:3e4});if(e.code===0&&e.out)try{return Sn(JSON.parse(e.out))}catch{return e.out}return`Trade routing failed. Try: \`${t}\` again.`}async function ot({text:t,persona:e,backend:r,profile:n}){let o=e?`[your role: ${e}]
|
|
29
|
+
${t}`:t;return At({text:o,backend:r,profile:n,unconfiguredPrefix:"Oracle is not configured yet: "})}async function At({text:t,backend:e,profile:r,unconfiguredPrefix:n}){let o=vt(e,t,{profile:r});if(!o.ok)return`${n}${o.error}`;if(!o.bin){let i=dt();if(!i.ok)return`${n}${i.error}`;let c=await xt(o.args);return c.code===0&&c.out?c.out:c.err||"Oracle could not answer that. Try again."}let a=await kn(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 Sn(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,un,G,pt,dn,q=w(()=>{je();ye();Ke();be();rt();$e=process.env.ORACLE_CONFIG_DIR||Ae(nn(),".config","oracle");un=it();G="Oracle is self-hostable. Install your own instance: npm install -g @oracle-agent/oracle";pt=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"}}),dn=Object.freeze(["low","medium","high"])});function xn(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 Ct({onNew:t,intervalMs:e=vn,env:r=process.env,signerCall:n=L,setIntervalFn:o=setInterval,clearIntervalFn:a=clearInterval}={}){if(typeof t!="function")throw new Error("pending-watch: onNew callback required");let i=new Set,c=!1,l=!1;async function s(){if(!l){l=!0;try{let p=await n("/pending",{env:r});if(!p||p.ok===!1||p.error||!Array.isArray(p.items))return;let m=xn(p.items,i);if(!c){c=!0;return}if(m.length===0)return;try{await t(m,{armed:p.armed===!0})}catch{}}catch{}finally{l=!1}}}let d=o(s,e);return typeof d?.unref=="function"&&d.unref(),{stop(){a(d)},tick:s}}var vn,Et=w(()=>{ne();vn=4e3});import P from"node:fs";function An(t){if(!t.isFile())throw new Error("local-vault: secret source must be a regular file");if(t.uid!==process.getuid?.())throw new Error("local-vault: secret source must be owned by this user");if(t.nlink!==1)throw new Error("local-vault: refusing hard-linked secret source");if((t.mode&63)!==0)throw new Error("local-vault: secret source must be owner-only (0600)")}function _t(t){let e;try{e=P.openSync(t,P.constants.O_RDONLY|P.constants.O_NOFOLLOW)}catch(r){throw r.code==="ELOOP"?new Error("local-vault: refusing symlink"):r}try{let r=P.fstatSync(e);if(An(r),r.size>1024*1024)throw new Error("local-vault: secret source changed or is too large");let n=P.lstatSync(t);if(n.isSymbolicLink()||n.dev!==r.dev||n.ino!==r.ino)throw new Error("local-vault: secret source changed or is too large");return P.readFileSync(e,"utf8").replace(/[\r\n]+$/,"")}finally{P.closeSync(e)}}var oa,aa,ia,Ot=w(()=>{oa=Object.freeze({N:1<<17,r:8,p:1}),aa=256*1024*1024,ia=16*1024});import{createHash as $n,createHmac as Rt,randomBytes as Cn,timingSafeEqual as En}from"node:crypto";function It({keyFile:t,approvedTelegramOwners:e,nowMs:r=Date.now}={}){if(!t)throw new Error("cex owner proof: signer policy key required");let n=new Set((e||[]).map(z).filter(Boolean));if(!n.size)throw new Error("cex owner proof: approved owner context required");let o=new Set,a=c=>{let l=Buffer.from(_t(t));try{return c(l)}finally{l.fill(0)}},i=a(c=>$n("sha256").update("cex-owner-instance\0").update(c).digest("hex"));return Object.freeze({mint({digest:c,senderId:l,chatId:s,platform:d,ttlMs:p=15e3}={}){let m=z(l),h=z(s),y=r();if(d!=="telegram"||!m||h!==m||!n.has(m))throw new Error("cex owner proof: exact Telegram owner DM required");if(!/^[0-9a-f]{64}$/.test(String(c||""))||!Number.isSafeInteger(p)||p<1||p>3e4)throw new Error("cex owner proof: binding refused");let S={version:1,decision:"Allow",digest:c,ownerSenderId:m,telegramChatId:h,audience:Lt,instance:i,nonce:Cn(16).toString("hex"),issuedAtMs:y,expiresAtMs:y+p},x=a(V=>Rt("sha256",V).update(Nt(S)).digest("hex"));return{claims:S,mac:x}},verify(c,{digest:l}={}){let s=c?.claims,d=r();if(!s||s.version!==1||s.decision!=="Allow"||s.digest!==l||s.audience!==Lt||s.instance!==i||!/^[0-9a-f]{32}$/.test(s.nonce||"")||z(s.ownerSenderId)!==z(s.telegramChatId)||!n.has(z(s.ownerSenderId))||!Number.isSafeInteger(s.issuedAtMs)||!Number.isSafeInteger(s.expiresAtMs)||s.expiresAtMs<=d||s.issuedAtMs>d||s.expiresAtMs-s.issuedAtMs>3e4||o.has(s.nonce))return!1;let p=a(m=>Rt("sha256",m).update(Nt(s)).digest("hex"));return _n(c.mac,p)?(o.add(s.nonce),!0):!1}})}var Lt,z,Nt,_n,Pt=w(()=>{Ot();Lt="oracle-local-signer-cex-owner-allow-v1",z=t=>/^(?:0|[1-9]\d{0,19})$/.test(String(t||""))?String(t):null,Nt=t=>JSON.stringify(t),_n=(t,e)=>{let r=Buffer.from(String(t)),n=Buffer.from(String(e));return r.length===n.length&&En(r,n)}});var Mt={};T(Mt,{buildPersona:()=>W,telegram:()=>Rn,telegramPendingRecipients:()=>Ut});import{join as Tt}from"node:path";import{homedir as On}from"node:os";function Ut({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 jt(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 Rn(t){let{Bot:e}=await import("grammy"),r=new e(t.token),n=String(t.name||"oracle").toLowerCase(),o=W(t),a=Array.isArray(t.owners)?t.owners:void 0,i=t.bus;i&&i.register(n,{role:t.role||"",chains:t.chains||[],handler:s=>Q({from:s.from,text:s.text,persona:o,backend:t.backend,profile:t.hermesProfile})}),r.command("start",s=>{let d=String(s.from?.id||s.chat.id);return H({platform:"telegram",senderId:d,extraOwners:a})?s.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.":""}`):s.reply(G)}),r.command("update",async s=>{let d=String(s.from?.id||s.chat.id),p=String(s.chat.id);if(!H({platform:"telegram",senderId:d,extraOwners:a}))return s.reply(G);if(s.message.forward_origin||s.message.forward_from||s.message.forward_date)return;s.replyWithChatAction("typing").catch(()=>{});let m=await O({platform:"telegram",chatId:p,senderId:d,text:s.match?`update ${s.match}`.trim():"update",userName:s.from?.username||s.from?.first_name||"user"});if(m)return jt(s,m)}),r.on("message:text",async s=>{let d=String(s.chat.id),p=String(s.from?.id||d),m=s.message.text;try{s.replyWithChatAction("typing").catch(()=>{});let h=await O({platform:"telegram",chatId:d,senderId:p,text:m,userName:s.from?.username||s.from?.first_name||"user",extraOwners:a,bus:i,agentName:n,persona:o,backend:t.backend,profile:t.hermesProfile,meta:{forward_origin:s.message.forward_origin,forward_from:s.message.forward_from,forward_from_chat:s.message.forward_from_chat,forward_sender_name:s.message.forward_sender_name,forward_date:s.message.forward_date}});h&&await jt(s,h)}catch(h){process.stderr.write(`telegram-gateway[${n}]: ${h.message}
|
|
31
|
+
`),await s.reply("Something went wrong. Try again.").catch(()=>{})}}),r.on("callback_query:data",async s=>{let d=String(s.from?.id||"");if(!H({platform:"telegram",senderId:d,extraOwners:a})){await s.answerCallbackQuery({text:G.slice(0,180),show_alert:!0}).catch(()=>{});return}let p=String(s.callbackQuery?.data||""),m=String(process.env.ORACLE_OWNER_TELEGRAM||"").split(",").map(x=>x.trim()).filter(Boolean),h=process.env.ORACLE_CONFIG_DIR||Tt(On(),".config","oracle"),y;try{y=It({keyFile:Tt(h,"signer","policy-integrity-key"),approvedTelegramOwners:m})}catch{}let S=await He({platform:"telegram",data:p,senderId:d,chatId:String(s.chat?.id||""),ownerProofAuthority:y,grant:{local:!0}});if(!S){await s.answerCallbackQuery().catch(()=>{});return}await s.answerCallbackQuery({text:"ok"}).catch(()=>{}),S.text&&await s.reply(S.text,{parse_mode:"Markdown"}).catch(()=>{})}),r.start();let c=Ut({extraOwners:a}),l=null;return c.length>0&&t.pendingWatch!==!1&&(l=Ct({intervalMs:t.pendingWatchIntervalMs,onNew:async(s,{armed:d})=>{let p=he(s,{platform:"telegram",grant:{local:!0},armed:d}),m=p.buttons?.replyMarkup?{reply_markup:p.buttons.replyMarkup}:{};for(let h of c)await r.api.sendMessage(h,p.text,{parse_mode:"Markdown",...m}).catch(()=>{})}})),{platform:"telegram",name:n,bot:r,stopPendingWatch:()=>l?.stop()}}var Dt=w(()=>{q();ye();Et();Pt()});var Bt={};T(Bt,{discord:()=>Ln});async function Ln(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=W(t),i=Array.isArray(t.owners)?t.owners:void 0,c=t.bus;return c&&c.register(o,{role:t.role||"",chains:t.chains||[],handler:l=>Q({from:l.from,text:l.text,persona:a,backend:t.backend,profile:t.hermesProfile})}),n.on("messageCreate",async l=>{if(l.author.bot)return;let s=l.channel.id,d=l.author.id,p=l.content;try{let m=!l.guild,h=l.mentions.has(n.user.id);if(!m&&!h)return;l.channel.sendTyping().catch(()=>{});let y=await O({platform:"discord",chatId:s,senderId:d,text:p.replace(`<@${n.user.id}>`,"").trim(),userName:l.author.username,extraOwners:i,bus:c,agentName:o,persona:a,backend:t.backend,profile:t.hermesProfile,meta:{forwarded:l.reference?.type===1||Array.isArray(l.messageSnapshots)&&l.messageSnapshots.length>0}});y&&await l.reply(typeof y=="string"?y:y.text).catch(()=>{})}catch(m){process.stderr.write(`discord-gateway[${o}]: ${m.message}
|
|
32
|
+
`)}}),await n.login(t.token),{platform:"discord",name:o,client:n}}var Ft=w(()=>{q()});var Gt={};T(Gt,{whatsapp:()=>Pn});import{join as Ht}from"node:path";import{homedir as Nn}from"node:os";async function Pn(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:Ht(In,".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
35
|
`),n(a,{small:!0}),process.stderr.write(`
|
|
36
36
|
`)}),o.on("ready",()=>{process.stderr.write(`whatsapp-gateway: connected
|
|
37
|
-
`)}),o.on("message",async a=>{if(a.fromMe)return;let i=a.from,
|
|
38
|
-
`)}}),await o.initialize(),{platform:"whatsapp",client:o}}var
|
|
37
|
+
`)}),o.on("message",async a=>{if(a.fromMe)return;let i=a.from,c=a.author||a.from,l=a.body;try{let s=await O({platform:"whatsapp",chatId:i,senderId:c,text:l,userName:a._data?.notifyName||"user",meta:{forwarded:a.isForwarded||a._data?.isForwarded,forward_date:a._data?.forwardingScore?!0:void 0}});if(s){let p=(typeof s=="string"?s:s.text).replace(/\*\*/g,"*").replace(/```[\s\S]*?```/g,"[code]").replace(/`/g,"");await a.reply(p)}}catch(s){process.stderr.write(`whatsapp-gateway: ${s.message}
|
|
38
|
+
`)}}),await o.initialize(),{platform:"whatsapp",client:o}}var In,Wt=w(()=>{q();In=process.env.ORACLE_CONFIG_DIR||Ht(Nn(),".config","oracle")});var qt={};T(qt,{signal_:()=>Tn});async function Tn(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
|
|
40
|
+
`),{platform:"signal",status:"stub"}}var zt=w(()=>{q()});import{createServer as jn}from"node:http";import{env as Yt}from"node:process";import{join as Oe}from"node:path";import{homedir as Un}from"node:os";import{readFileSync as Jt,existsSync as Mn,mkdirSync as Dn,writeFileSync as Bn}from"node:fs";import{randomBytes as Fn}from"node:crypto";var Xt=Yt.ORACLE_CONFIG_DIR||Oe(Un(),".config","oracle"),Vt=Oe(Xt,"gateway.json");function Hn(){return Mn(Vt)?JSON.parse(Jt(Vt,"utf8")):{platforms:{}}}function Ee(t){return t?Array.isArray(t)?t.filter(Boolean):[t]:[]}var Gn=Object.freeze({telegram:"grammy",discord:"discord.js",whatsapp:"whatsapp-web.js"});async function ae(t,e,r,n){try{n.push(await e(r))}catch(o){let a=Gn[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
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 Wn(){let t=Hn(),e=[],r=Ee(t.platforms?.telegram),n=Ee(t.platforms?.discord),o=Ee(t.agents),i=r.length+n.length+o.length>1?new(await Promise.resolve().then(()=>(Le(),Re))).A2ABus:null;if(i&&o.length){let{routePeerConsult:l,buildPersona:s}=await Promise.resolve().then(()=>(q(),$t));for(let d of o)try{let p=s(d);i.register(d.name,{role:d.role||"",chains:d.chains||[],handler:m=>l({from:m.from,text:m.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
|
|
45
|
+
`)}}for(let l of r)await ae("telegram",async()=>(await Promise.resolve().then(()=>(Dt(),Mt))).telegram({...l,bus:i}),t,e);for(let l of n)await ae("discord",async()=>(await Promise.resolve().then(()=>(Ft(),Bt))).discord({...l,bus:i}),t,e);t.platforms?.whatsapp&&await ae("whatsapp",async l=>(await Promise.resolve().then(()=>(Wt(),Gt))).whatsapp(l.platforms.whatsapp),t,e),t.platforms?.signal&&await ae("signal",async l=>(await Promise.resolve().then(()=>(zt(),qt))).signal_(l.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 c=i?Kn():null;jn((l,s)=>zn(l,s,{config:t,bus:i,a2aToken:c})).listen(Yt.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 qn=16384;async function zn(t,e,{config:r,bus:n,a2aToken:o}){let a=new URL(t.url||"/","http://127.0.0.1"),i=(l,s)=>{e.writeHead(l,{"Content-Type":"application/json"}),e.end(JSON.stringify(s))};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 c=String(t.headers.authorization||"");if(!o||c!==`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 l="";t.on("data",s=>{l+=s,l.length>qn&&t.destroy()}),t.on("end",async()=>{try{let s=JSON.parse(l||"{}"),d=Vn(s.from);n.agents.has(d)||n.register(d,{role:"loopback client",handler:async()=>null});let p=await n.send({from:d,to:s.to,text:s.text,kind:"consult"});return i(p.ok?200:400,p)}catch(s){return i(400,{ok:!1,error:`bad request: ${s.message}`})}});return}return i(404,{error:"not found"})}function Vn(t){return String(t||"local").trim().toLowerCase().replace(/[^a-z0-9_-]/g,"").slice(0,32)||"local"}function Kn(t=Xt){let e=Oe(t,"a2a-token");try{let n=Jt(e,"utf8").trim();if(n)return n}catch{}let r=Fn(24).toString("hex");return Dn(t,{recursive:!0}),Bn(e,`${r}
|
|
49
|
+
`,{mode:384}),r}var{pathToFileURL:Yn}=await import("node:url"),{realpathSync:Jn}=await import("node:fs"),Kt=process.argv[1],_e=!1;if(Kt)try{_e=import.meta.url===Yn(Jn(Kt)).href}catch{_e=!1}_e&&Wn().catch(t=>{process.stderr.write(`oracle-gateway: ${t.message}
|
|
50
|
+
`),process.exit(1)});export{Kn as ensureA2AToken,zn as serveHttp,Ee as toEntries};
|