@oracle-agent/oracle 0.35.19 → 0.35.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
- package/dist/bin/oracle-gateway.mjs +3 -3
- package/dist/bin/oracle-telegram-mcp.mjs +5 -5
- package/dist/cli/commands/chat.mjs +6 -6
- package/dist/cli/commands/model.mjs +6 -6
- package/dist/cli/commands/swap.mjs +10 -10
- package/dist/cli/commands/telegram.mjs +6 -6
- package/package.json +1 -1
- package/public/eval-report.json +23 -9
- package/public/oracle-splash/index.html +43 -22
- package/server.json +2 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{createHash as
|
|
2
|
-
`)}function g(t){return["Confidence",
|
|
3
|
-
`)}function Ee(t,e={},{now:r=Date.now()}={}){let o=t||S(),s=String(e.id||"").trim().toLowerCase();if(!v.test(s))throw new TypeError("artifact id required");let a={id:s,kind:String(e.kind||"thesis"),title:String(e.title||"Oracle artifact"),summary:String(e.summary||""),openUrl:y(e.openUrl)?String(e.openUrl):null,confidence:e.confidence,source:e.source||"oracle",fetchedAt:e.fetchedAt||new Date(r).toISOString(),warnings:Array.isArray(e.warnings)?e.warnings.map(String):[],payload:L(e.payload||{}),createdAt:new Date(r).toISOString()};return o.artifacts[s]=a,a}function B(t,{chatId:e,artifactId:r,now:o=Date.now()}={}){let s=t||S(),a=String(e||"").trim(),
|
|
1
|
+
import{createHash as xe,randomBytes as $e}from"node:crypto";import{mkdirSync as Se,readFileSync as Ce,writeFileSync as Re}from"node:fs";import{homedir as Ae}from"node:os";import{dirname as Ne,join as j}from"node:path";var re=/^[A-Z0-9][A-Z0-9._-]{0,11}$/;function ne(t){let e=String(t||"").trim();if(!e||e.includes("ts.net")||!/^https:\/\//i.test(e))return null;try{return new URL(e)}catch{return null}}function U(t,{coin:e,side:r,sizeUsd:o,leverage:s,venue:a,confirm:n,user:u}={}){let l=ne(t);if(!l)return null;if(e&&re.test(String(e).toUpperCase())&&l.searchParams.set("coin",String(e).toUpperCase()),(r==="long"||r==="short")&&l.searchParams.set("side",r),Number.isFinite(Number(o))&&Number(o)>=1&&l.searchParams.set("size",String(Math.min(1e5,Math.round(Number(o))))),Number.isInteger(Number(s))&&Number(s)>=1&&l.searchParams.set("lev",String(Math.min(50,Number(s)))),a){let b=String(a).toLowerCase()==="hl"?"hyperliquid":String(a).toLowerCase();l.searchParams.set("venue",b)}else l.searchParams.get("venue")||l.searchParams.set("venue","hyperliquid");return l.searchParams.set("view","perps"),l.searchParams.set("build","1"),n&&/^[0-9a-f]{32}$/i.test(String(n))&&l.searchParams.set("confirm",String(n).toLowerCase()),u&&/^0x[0-9a-fA-F]{40}$/.test(String(u))&&l.searchParams.set("user",String(u).toLowerCase()),l.toString()}var ie={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}},oe=new Map(Object.values(ie).map(t=>[t.chainId,t]));function H(t){return oe.get(Number(t))||null}var Ue=Object.freeze([100,50,25]),He=Object.freeze([100,50,25,10]);var c="UNKNOWN",ze=Object.freeze(["token","launch","hip3","hip4","polymarket","twap","bridge","swap","approve"]),ae=/[_*[\]`]/g;function i(t){return d(t)?String(t).replace(ae,e=>`\\${e}`):c}function d(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!=="":!0}function f(t){if(!d(t))return c;let e=String(t).replace(/`/g,"");return e===""?c:`\`${e}\``}function x(t,{decimals:e=2}={}){if(!d(t))return c;let r=Number(t);return Number.isFinite(r)?r.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:e}):c}function p(t,{decimals:e=2}={}){let r=x(t,{decimals:e});return r===c?c:`${r} USD`}function I(t,{decimals:e=2}={}){let r=x(t,{decimals:e});return r===c?c:`${r}%`}function N(t){let e=x(t,{decimals:0});return e===c?c:`${e} bps`}function $(t,e){if(!d(t))return c;let r=Number(e);if(!Number.isInteger(r)||r<0||r>77)return c;let o;try{o=BigInt(typeof t=="string"?t.trim():t)}catch{return c}let s=o<0n,a=s?-o:o,n=10n**BigInt(r),u=(a/n).toString(),l=(a%n).toString().padStart(r,"0").replace(/0+$/,"");return`${s?"-":""}${u}${l?`.${l}`:""}`}function E(t){if(typeof t=="number"&&Number.isFinite(t))return t<0||t>1?c: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 c}function k(t={}){let e=t.chainId;if(!d(e)||!Number.isFinite(Number(e)))return d(t.chain)?i(t.chain):c;let o=H(e)?.name||(d(t.chain)?String(t.chain):c);return`${i(o)} (chainId ${Number(e)})`}function D(t={}){return i(t.venue??t.dex??t.pool?.venue)}function se(t){return t==null?"NONE (text card only)":typeof t=="string"?t.trim()?f(t):"NONE (text card only)":t.error||t.ok===!1||t.available===!1?`UNAVAILABLE${d(t.error)?` \u2014 ${i(t.error)}`:""} (text card stands)`:d(t.url)?f(t.url):"NONE (text card only)"}function R(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 o=r.expiresAt??r.expiry;if(d(o)){let a=typeof o=="number"?o:Date.parse(o);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 ce(t){let e=R(t);return e.allowed?`${e.actions.map(r=>i(r)).join(" / ")} (${i(e.reason)})`:`prepare-only \u2014 ${i(e.reason)}`}function h(t,e,r={}){let o=[`*${t}*`];for(let s of e){if(!s)continue;let[a,n]=s;o.push(`${a}: ${n==null||n===""?c:n}`)}return o.push(`Chart: ${se(r.chart)}`),o.push(`Actions: ${ce(r)}`),Array.isArray(r.warnings)&&r.warnings.length&&o.push(`Warnings: ${r.warnings.map(s=>i(s)).join("; ")}`),(d(r.source)||d(r.fetchedAt))&&o.push(`Source: ${i(r.source)} at ${i(r.fetchedAt)}`),o.join(`
|
|
2
|
+
`)}function g(t){let e=E(t.confidence);return e===c?null:["Confidence",e]}function le(t){let e=t.quote;if(!e||typeof e!="object")return[];let r=d(e.decimals)?$(e.amountOutRaw??e.out??e.raw,e.decimals):c;return[["Quote out (raw)",f(e.amountOutRaw??e.out??e.raw)],["Quote out",r===c?c:`${i(r)} ${i(e.symbol??"")}`.trim()]]}function F(t){let e=t.autoSlippage;if(!e||typeof e!="object")return["Auto-slippage",c];let r=N(e.selectedBps),o=N(e.capBps);return["Auto-slippage",r===c&&o===c?c:`${r} selected, cap ${o}`]}function ue(t={}){let e=t||{};return h(`ORACLE TOKEN \u2014 ${i(e.symbol??e.token??e.name)}`,[["Chain",k(e)],["Venue",D(e)],["Name",i(e.name)],["Address",f(e.address??e.mint??e.contract)],["Price",p(e.priceUsd,{decimals:8})],["Market cap",p(e.marketCapUsd)],["Liquidity",p(e.liquidityUsd)],["Volume 24h",p(e.volume24hUsd)],["Change 24h",I(e.priceChange24h)],["Fee tier",d(e.feeTier)?`${N(Number(e.feeTier)/100)} (${x(e.feeTier,{decimals:0})})`:c],["Age",i(e.age)],...le(e),F(e),g(e)],e)}function de(t={}){let e=t||{};return h(`ORACLE LAUNCH \u2014 ${i(e.symbol??e.token??e.name)}`,[["Chain",k(e)],["Venue",D(e)],["Address",f(e.address??e.mint??e.contract)],["Pool",f(e.pool?.address??e.poolAddress??e.pool)],["Liquidity",p(e.liquidityUsd)],["Route ready",i(e.routeReady)],["Sellable",i(e.sellable)],["Sell sim",i(e.sellSimulation??e.sellSim)],["Smart wallets",i(e.smartWalletOverlap)],["Risk",i(e.risk??e.riskStatus)],["Prepared ticket",i(e.preparedTicket??e.ticketStatus)],F(e),g(e)],e)}function pe(t={}){let e=t||{};return h(`ORACLE HIP-3 \u2014 ${i(e.market??e.coin??e.name)}`,[["Venue",`Hyperliquid builder-dex ${i(e.dex)}`],["Market",i(e.market??e.coin)],["Mark",p(e.markPx,{decimals:6})],["Oracle",p(e.oraclePx,{decimals:6})],["Funding",I(e.funding,{decimals:6})],["Open interest",p(e.openInterestUsd)],["Depth",i(e.depth)],["Liquidation notes",i(e.liquidationNotes??e.riskNotes)],["Account context",i(e.accountContext)],g(e)],e)}function me(t={}){let e=t||{};return h(`ORACLE HIP-4 \u2014 ${i(e.event??e.market??e.name)}`,[["Venue",`Hyperliquid HIP-4 ${i(e.dex??"outcome")}`],["Event",i(e.event)],["Outcome",i(e.outcome)],["Market id",f(e.marketId??e.market)],["Bid",p(e.bid,{decimals:6})],["Ask",p(e.ask,{decimals:6})],["Depth",i(e.depth)],["Edge",I(e.edge)],["Position",i(e.position)],g(e)],e)}function fe(t={}){let e=t||{};return h(`ORACLE POLYMARKET \u2014 ${i(e.event??e.market??e.name)}`,[["Venue","Polymarket CLOB"],["Event",i(e.event)],["Market",i(e.market)],["Market id",f(e.marketId??e.conditionId??e.tokenId)],["Yes",p(e.yesPrice,{decimals:4})],["No",p(e.noPrice,{decimals:4})],["Best bid / ask",`${p(e.bestBid,{decimals:4})} / ${p(e.bestAsk,{decimals:4})}`],["Volume",p(e.volumeUsd)],["Resolution risk",i(e.resolutionRisk)],["Order intent",i(e.orderIntent)],g(e)],e)}function he(t={}){let e=t||{},r=d(e.completedSplits)&&d(e.totalSplits)?`${x(e.completedSplits,{decimals:0})} / ${x(e.totalSplits,{decimals:0})}`:c;return h(`ORACLE TWAP \u2014 ${i(e.pair??e.symbol??e.name)}`,[["Chain",k(e)],["Side",i(e.side??e.direction)],["Amount",`${i($(e.amountTotal??e.amount,e.decimals??18))} ${i(e.symbol??"")}`.trim()],["Splits",`${x(e.totalSplits,{decimals:0})} over ${i(e.window)}`],["Progress",r],["Avg price",p(e.averagePrice,{decimals:6})],["Next split",i(e.nextSplitAt)],["Slippage cap",N(e.slippageBps)],["Status",i(e.status)],g(e)],e)}function ge(t={}){let e=t||{},r=e.approval??e.revokeCheck??{},o=r.needsRevoke&&r.spender?`revoke.cash \u2014 ${i(r.spender)}`:r.needsRevoke===!1?"revoke.cash \u2014 clean":"revoke.cash \u2014 unchecked";return h(`ORACLE BRIDGE \u2014 ${i(e.pair??e.fromSymbol)} \u2192 ${i(e.toSymbol??"")}`.replace(/→ $/,""),[["Bridging","deBridge \xB7 LI.FI \u2014 best route wins"],["From chain",k({chainId:e.fromChainId,chain:e.fromChain})],["To chain",k({chainId:e.toChainId,chain:e.toChain})],["Amount",`${i($(e.amount,e.fromDecimals??18))} ${i(e.fromSymbol??"")}`.trim()],["Best route",i(e.bestRoute??e.winner)],["Est. received",`${i($(e.amountOut,e.toDecimals??18))} ${i(e.toSymbol??"")}`.trim()],["Fee",p(e.feeUsd)],["Est. time",i(e.estimatedTime)],["Revoke check",o],["All providers",i(e.providers?.join(", "))],["Preparable",i(e.preparable)],g(e)],e)}function be(t){let r=(Array.isArray(t)?t:[]).slice(1,4).map(o=>{let s=i(o.source??o.venue??o.name),a=o.improvementBps==null&&o.deltaBps==null?null:Number(o.improvementBps??o.deltaBps),n=Number.isFinite(a)?`${Math.abs(a).toFixed(0)} bps behind`:"spread UNKNOWN";return`${s} (${n})`});return r.length?r.join("; "):c}function ke(t){let e=t.rankedOn??t.swap?.rankedOn??t.best?.rankedOn;return d(e)?i(e):c}function ye(t={}){let e=t||{},r=e.swap&&typeof e.swap=="object"?e.swap:e,o=e.bridge&&typeof e.bridge=="object"?e.bridge:null,s=r.best??r.winner??{},a=`${i(e.tokenInSymbol??e.fromSymbol??"IN")} \u2192 ${i(e.tokenOutSymbol??e.toSymbol??"OUT")}`,n=[["Intent",i(e.intent??"swap")],["Chain",k({chainId:e.chainId??r.chainId,chain:e.chain??r.chain})],["Pair",a],["Amount in",`${i($(e.amountIn??r.amountIn,e.decimalsIn??18))} ${i(e.tokenInSymbol??"")}`.trim()],["Best swap",i(s.source??s.venue??r.bestRoute??e.bestRoute)],["Net out",`${i($(s.netOut??s.amountOut??r.amountOut,e.decimalsOut??18))} ${i(e.tokenOutSymbol??"")}`.trim()],["Ranked on",ke(r)],["Gas accounted",i(s.costAccounted===!0?"yes":s.costAccounted===!1?"no \u2014 gross ranking may flatter this route":null)],["Spread vs next",d(r.improvementBps)?`${i(r.improvementBps)} bps`:c],["Runners-up",be(r.routes??e.routes)]];if(o){let u=o.best??o.winner??{};n.push(["Best bridge",i(u.source??o.bestRoute??e.bestBridge)],["Bridge out",`${i($(u.netOut??u.amountOut??o.amountOut,e.bridgeDecimalsOut??e.decimalsOut??18))} ${i(e.bridgeOutSymbol??e.tokenOutSymbol??"")}`.trim()],["Bridge to",k({chainId:o.toChainId??e.toChainId,chain:o.toChain??e.toChain})],["Est. time",i(o.estimatedTime??u.meta?.durationSeconds)])}else n.push(["Best bridge","same-chain \u2014 use Best swap"]);return n.push(["Preparable",i(e.preparable??s.executionReady)],g(e)),h(`ORACLE SWAP \u2014 ${a}`,n,e)}function we(t={}){let e=t||{};return h("ORACLE APPROVE \u2014 local signer",[["Pending id",f(e.id??(typeof e.digest=="string"?e.digest.slice(0,8):null))],["Surface",i(e.surface)],["Action",i(e.action)],["Chain",k({chainId:e.chain??e.chainId,chain:e.chainName})],["To",f(e.to??e.destination)],["Value",d(e.value)?i(e.value):c],["Signer",i(e.armed===!0?"running + armed":e.armed===!1?"running, disarmed":"not running")],g({confidence:e.confidence??(e.armed===!0?"high":"low")})],e)}var We=Object.freeze({token:ue,launch:de,hip3:pe,hip4:me,polymarket:fe,twap:he,bridge:ge,swap:ye,approve:we});var _e=Object.freeze(["deepen","refresh","prepare","ta","fa","long","short","allow","deny"]),Oe=new Set(_e),v=/^[a-z0-9-]{4,40}$/i,q=/^[0-9a-f]{32}$/,z=/^\d+$/;function P(t=process.env){return j(t.ORACLE_CONFIG_DIR||j(Ae(),".config","oracle"),"telegram-cards.json")}function S(){return{links:{},artifacts:{},threads:{}}}var A=S();function T(){return A}function W(t,{readFile:e=Ce}={}){try{let r=JSON.parse(String(e(t)));A={links:r.links&&typeof r.links=="object"?r.links:{},artifacts:r.artifacts&&typeof r.artifacts=="object"?r.artifacts:{},threads:r.threads&&typeof r.threads=="object"?r.threads:{}}}catch{A=S()}return A}function V(t,e=A,{writeFile:r=Re,mkdir:o=Se}={}){o(Ne(t),{recursive:!0,mode:448}),r(t,JSON.stringify(e),{mode:384})}function y(t){return t==null?!1:typeof t=="string"?t.trim()!=="":!0}function K(t){return xe("sha256").update(String(t)).digest("hex")}function L(t){if(Array.isArray(t))return t.map(L);if(!t||typeof t!="object")return t;let e={};for(let[r,o]of Object.entries(t))/(secret|token|key|seed|private|password|mnemonic|auth)/i.test(r)||(e[r]=L(o));return e}function Ie(t){let r=String(t||"").trim().match(/^oracle:card:(deepen|refresh|prepare|ta|fa|long|short|allow|deny):([a-z0-9-]{4,40})$/i);return r?{action:r[1].toLowerCase(),artifactId:r[2].toLowerCase()}:null}function Y({platform:t="telegram",artifactId:e,openUrl:r,hasGrant:o=!1}={}){let s=String(e||"").trim().toLowerCase();if(!v.test(s))return{kind:"text_menu",text:"no artifact to continue",cancelHint:""};let a=[],n=[{text:"TA",callback_data:`oracle:card:ta:${s}`},{text:"FA",callback_data:`oracle:card:fa:${s}`}],u=O=>U(r,{side:O}),l=u("long"),b=u("short"),w=l&&b?[{text:"LONG",url:l},{text:"SHORT",url:b}]:[{text:"LONG",callback_data:`oracle:card:long:${s}`},{text:"SHORT",callback_data:`oracle:card:short:${s}`}];return y(r)?(a.push([{text:"Open",url:String(r)},n[0]]),a.push(w),a.push(o?[n[1],{text:"Prep",callback_data:`oracle:card:prepare:${s}`}]:[n[1]])):(a.push(n),a.push(w),o&&a.push([{text:"Prep",callback_data:`oracle:card:prepare:${s}`}])),String(t)==="telegram"?{kind:"inline_keyboard",replyMarkup:{inline_keyboard:a.filter(O=>O.length>0)},cancelHint:"LONG/SHORT open the graph. CONFIRM there. Telegram never sends."}:{kind:"text_menu",text:"TA / FA / LONG / SHORT",cancelHint:""}}function G(t={}){let r=[`*${y(t.title)?i(t.title):"Oracle artifact"}*`,`Kind: ${y(t.kind)?i(t.kind):c}`,`Id: ${y(t.id)?`\`${String(t.id).replace(/`/g,"")}\``:c}`,`Summary: ${y(t.summary)?i(t.summary):c}`],o=E(t.confidence);o!==c&&r.push(`Confidence: ${o}`),(y(t.source)||y(t.fetchedAt))&&r.push(`Source: ${i(t.source)} at ${i(t.fetchedAt)}`),Array.isArray(t.warnings)&&t.warnings.length&&r.push(`Warnings: ${t.warnings.map(a=>i(a)).join("; ")}`);let s=R(t);return r.push(s.allowed?"Actions: TA / FA / LONG / SHORT open the graph. Execute on CONFIRM there.":`Actions: TA / FA / LONG / SHORT \u2014 ${i(s.reason)}`),r.join(`
|
|
3
|
+
`)}function Ee(t,e={},{now:r=Date.now()}={}){let o=t||S(),s=String(e.id||"").trim().toLowerCase();if(!v.test(s))throw new TypeError("artifact id required");let a={id:s,kind:String(e.kind||"thesis"),title:String(e.title||"Oracle artifact"),summary:String(e.summary||""),openUrl:y(e.openUrl)?String(e.openUrl):null,confidence:e.confidence,source:e.source||"oracle",fetchedAt:e.fetchedAt||new Date(r).toISOString(),warnings:Array.isArray(e.warnings)?e.warnings.map(String):[],payload:L(e.payload||{}),createdAt:new Date(r).toISOString()};return o.artifacts[s]=a,a}function B(t,{chatId:e,artifactId:r,now:o=Date.now()}={}){let s=t||S(),a=String(e||"").trim(),n=String(r||"").trim().toLowerCase();if(!a)throw new TypeError("chat id required");if(!v.test(n))throw new TypeError("artifact id required");return s.threads[a]={artifactId:n,updatedAt:o},s.threads[a]}function J(t,{chatId:e,text:r}={}){let o=String(e||"").trim(),s=String(r||"").trim();if(!o||!s||/^\//.test(s))return null;let a=t?.threads?.[o];if(!a?.artifactId)return null;let n=t.artifacts?.[a.artifactId];return n?`Continue artifact ${n.id} (${n.kind}). Prior: ${n.summary||n.title}. User: ${s}`:null}function Q(t,{ownerId:e,botUsername:r,now:o=Date.now(),ttlMs:s=600*1e3,token:a,randomBytes:n=$e}={}){let u=t||S(),l=String(e||"").trim(),b=String(r||"").replace(/^@/,"").trim();if(!z.test(l))throw new TypeError("owner Telegram id required");if(!/^[A-Za-z0-9_]{5,32}$/.test(b))throw new TypeError("bot username required");let w=a||n(16).toString("hex");if(!q.test(w))throw new TypeError("link token must be 32 hex chars");return u.links[K(w)]={ownerId:l,expiresAt:o+Number(s)},{token:w,url:`https://t.me/${b}?start=${w}`,expiresAt:o+Number(s)}}function Z(t,{token:e,telegramUserId:r,now:o=Date.now()}={}){let s=t||S(),a=String(e||"").trim(),n=String(r||"").trim();if(!q.test(a))return{ok:!1,error:"invalid start token"};if(!z.test(n))return{ok:!1,error:"invalid telegram user"};let u=K(a),l=s.links[u];return l?(delete s.links[u],Number(l.expiresAt)<=o?{ok:!1,error:"start token expired"}:String(l.ownerId)!==n?{ok:!1,error:"start token is bound to a different owner"}:{ok:!0,ownerId:n}):{ok:!1,error:"unknown or already used start token"}}function X(t,{data:e,chatId:r,grant:o=null,now:s=Date.now()}={}){let a=Ie(e);if(!a)return null;if(!Oe.has(a.action))return{text:"That card action is not available.",buttons:null};let n=t?.artifacts?.[a.artifactId];if(!n)return{text:"That artifact is gone. Ask again and I will issue a new card.",buttons:null};r&&B(t,{chatId:r,artifactId:n.id,now:s});let u=R({grant:o},{now:s}),l=Y({artifactId:n.id,openUrl:n.openUrl,hasGrant:u.allowed});return a.action==="refresh"?{text:G(n),buttons:l,prompt:null}:a.action==="deepen"?{text:null,buttons:null,prompt:`Deepen artifact ${n.id} (${n.kind}). Prior: ${n.summary||n.title}. Be terse. Do not sign or broadcast.`}:a.action==="ta"?{text:null,buttons:null,prompt:`TA artifact ${n.id}. Prior: ${n.summary||n.title}. Run deterministic TA on the coin/venue in the artifact (RSI divergence, S/R, candle patterns). Reply in this Telegram chat with the verdict rows and say what was drawn. Do not sign or broadcast.`}:a.action==="fa"?{text:null,buttons:null,prompt:`FA artifact ${n.id}. Prior: ${n.summary||n.title}. Run per-coin FA (funding, OI, book, premium) plus the separate MACRO thesis (M1/M2/Fed BS/net liquidity) if relevant. Cite receipts. Stay in this Telegram chat. Do not sign or broadcast.`}:a.action==="allow"?{text:"Allow is the graph. Open the ticket there and CONFIRM. Telegram did not send.",buttons:null,prompt:null}:a.action==="deny"?{text:`Denied ${n.id}. Ticket cancelled. Nothing signed.`,buttons:null,prompt:null}:a.action==="long"||a.action==="short"?{text:null,buttons:null,prompt:`Open the live graph ticket for a ${a.action} on artifact ${n.id}. Prior: ${n.summary||n.title}. Size from the connected HL account. Execute only on CONFIRM on the graph. Never sign from Telegram.`}:u.allowed?{text:`Queued unsigned prepare for ${n.id}. Nothing signed. Allow/Deny still required.`,buttons:l,prompt:null,prepare:{artifactId:n.id,unsigned:!0,broadcast:!1}}:{text:`Prepare blocked \u2014 ${u.reason}. Deepen and Refresh still work.`,buttons:l,prompt:null}}function ee(t={},{grant:e=null,now:r=Date.now(),state:o}={}){let s=o||T(),a=String(t.id||`art-${Math.abs(Number(r)).toString(36)}`).toLowerCase().slice(0,40),n=Ee(s,{...t,id:a},{now:r}),u=R({grant:e},{now:r});return{text:G({...n,grant:e}),replyMarkup:Y({artifactId:n.id,openUrl:n.openUrl,hasGrant:u.allowed}).replyMarkup,artifact:n,state:s}}var M=`oracle telegram \u2014 TrueNorth-style interactive cards (native, no Hermes)
|
|
4
4
|
|
|
5
5
|
oracle telegram link --owner <tg-id> --bot <username>
|
|
6
6
|
oracle telegram redeem --token <32hex> --user <tg-id>
|
|
@@ -12,8 +12,8 @@ Native oracle-gateway uses the same module. Hermes is an optional adapter that
|
|
|
12
12
|
must call this CLI instead of owning card state. Prepare is unsigned. Execute
|
|
13
13
|
stays on Allow/Deny.`;function m(t,e){let r=t.indexOf(e);return r<0||r+1>=t.length?null:t[r+1]}function te(t,e){return t.includes(e)}function Le(){return W(P()),T()}function _(t){V(P(),t)}function C(t,e){t.write(JSON.stringify(e)+`
|
|
14
14
|
`)}async function ve(t=[],e={}){let r=e.out??process.stdout,o=e.err??process.stderr,s=t[0];if(!s||s==="--help"||s==="-h"||s==="help")return r.write(M+`
|
|
15
|
-
`),0;let a=Le();if(s==="link")try{let
|
|
16
|
-
`),1}if(s==="redeem"){let
|
|
17
|
-
`),1}if(s==="callback"){let
|
|
15
|
+
`),0;let a=Le();if(s==="link")try{let n=Q(a,{ownerId:m(t,"--owner"),botUsername:m(t,"--bot")});return _(a),C(r,{ok:!0,...n}),0}catch(n){return o.write(String(n.message||n)+`
|
|
16
|
+
`),1}if(s==="redeem"){let n=Z(a,{token:m(t,"--token"),telegramUserId:m(t,"--user")});return _(a),C(r,n),n.ok?0:1}if(s==="wrap")try{let n=ee({id:m(t,"--id"),kind:m(t,"--kind")||"thesis",title:m(t,"--title")||"Oracle artifact",summary:m(t,"--summary")||"",openUrl:m(t,"--url"),source:"oracle-telegram"},{grant:te(t,"--grant")?{local:!0}:null,state:a}),u=m(t,"--chat");return u&&B(a,{chatId:u,artifactId:n.artifact.id}),_(a),C(r,{ok:!0,text:n.text,replyMarkup:n.replyMarkup||null,artifactId:n.artifact.id,fallback:`Reply: deepen ${n.artifact.id} | refresh ${n.artifact.id}`}),0}catch(n){return o.write(String(n.message||n)+`
|
|
17
|
+
`),1}if(s==="callback"){let n=X(a,{data:m(t,"--data"),chatId:m(t,"--chat"),grant:te(t,"--grant")?{local:!0}:null});return _(a),n?(C(r,{ok:!0,...n}),0):(C(r,{ok:!1,error:"not an interactive card callback"}),1)}if(s==="continue"){let n=J(a,{chatId:m(t,"--chat"),text:m(t,"--text")});return C(r,{ok:!0,prompt:n}),0}return o.write(`unknown telegram verb '${s}'
|
|
18
18
|
${M}
|
|
19
19
|
`),1}var tt={name:"telegram",summary:"native interactive Telegram cards (TrueNorth-style, no Hermes)",group:"system",usage:M,run:t=>ve(t.argv||[])};export{tt as default,ve as run};
|
package/package.json
CHANGED
package/public/eval-report.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"surface": "oracle-public-eval",
|
|
3
3
|
"version": 1,
|
|
4
|
-
"generatedAt": "2026-08-
|
|
4
|
+
"generatedAt": "2026-08-26T03:16:16.859799+00:00",
|
|
5
5
|
"source": {
|
|
6
|
-
"commit": "
|
|
7
|
-
"dirty":
|
|
6
|
+
"commit": "96d67d6a7d652950f3ecdc7b845376820922a580",
|
|
7
|
+
"dirty": true,
|
|
8
8
|
"node": "v26.7.0"
|
|
9
9
|
},
|
|
10
10
|
"package": "@oracle-agent/oracle",
|
|
11
|
-
"packageVersion": "0.35.
|
|
11
|
+
"packageVersion": "0.35.20",
|
|
12
12
|
"methodology": "Reproduce locally: npx @oracle-agent/oracle eval guards|adversarial|fidelity --json. Dated, commit-stamped output; no chain state or live keys involved. A report is evidence of the pinned commit only.",
|
|
13
13
|
"suites": {
|
|
14
14
|
"guards": {
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
{
|
|
21
21
|
"name": "version",
|
|
22
22
|
"ok": true,
|
|
23
|
-
"detail": "oracle 0.35.
|
|
23
|
+
"detail": "oracle 0.35.20"
|
|
24
24
|
},
|
|
25
25
|
{
|
|
26
26
|
"name": "help-loads",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"adversarial": {
|
|
48
48
|
"ok": true,
|
|
49
49
|
"status": "passed",
|
|
50
|
+
"blocked": false,
|
|
50
51
|
"packageTests": {
|
|
51
52
|
"total": 159,
|
|
52
53
|
"pass": 159,
|
|
@@ -70,11 +71,24 @@
|
|
|
70
71
|
"expectedFiles": 9,
|
|
71
72
|
"failures": []
|
|
72
73
|
},
|
|
73
|
-
"
|
|
74
|
-
|
|
74
|
+
"coverage": [
|
|
75
|
+
"exact-confirmation",
|
|
76
|
+
"artifact-mutation",
|
|
77
|
+
"replay-idempotency",
|
|
78
|
+
"receipt-finality",
|
|
79
|
+
"autonomous-mint-gates",
|
|
80
|
+
"exact-nft-contract",
|
|
81
|
+
"hyperliquid-position-drift"
|
|
82
|
+
]
|
|
75
83
|
},
|
|
76
84
|
"fidelity": {
|
|
77
|
-
"ok": true
|
|
85
|
+
"ok": true,
|
|
86
|
+
"status": "passed",
|
|
87
|
+
"blocked": false,
|
|
88
|
+
"code": 0,
|
|
89
|
+
"signal": null,
|
|
90
|
+
"summary": "summary: 3/3 ok, 0 prepare-fail, 0 structural-fail, 0 sim-fail, 3 simulated",
|
|
91
|
+
"tail": "prepare-fidelity eval taker=0x70997970... generated=2026-08-26T03:15:52.383Z\nid status artifact sim liq% notes\nethereum-weth-usdc ok unsigned-transactionnofund 100% execution reverted: STF\nbase-weth-usdc ok unsigned-transactionnofund 100% execution reverted: STF\narbitrum-weth-usdc ok unsigned-transactionnofund 100% execution reverted: STF\nsummary: 3/3 ok, 0 prepare-fail, 0 structural-fail, 0 sim-fail, 3 simulated\n\n"
|
|
78
92
|
}
|
|
79
93
|
},
|
|
80
94
|
"adversarialClassesCovered": [
|
|
@@ -84,4 +98,4 @@
|
|
|
84
98
|
"exact-confirm",
|
|
85
99
|
"receipt"
|
|
86
100
|
]
|
|
87
|
-
}
|
|
101
|
+
}
|
|
@@ -110,11 +110,7 @@ img{display:inline-block}
|
|
|
110
110
|
.scene-rail{position:fixed;right:18px;top:50%;z-index:29;transform:translateY(-50%);display:grid;gap:11px;font-family:var(--mono);font-size:9px;letter-spacing:.16em;text-transform:uppercase;color:rgba(201,218,236,.44)}
|
|
111
111
|
.scene-rail span{position:relative;display:grid;place-items:center;width:30px;height:22px;border:1px solid rgba(124,196,255,.12);border-radius:999px;background:rgba(11,16,24,.40);transition:color .35s var(--ease),border-color .35s var(--ease),background .35s var(--ease),transform .35s var(--ease)}
|
|
112
112
|
body[data-scene="home"] .scene-rail span[data-scene-dot="home"],body[data-scene="orchestration"] .scene-rail span[data-scene-dot="orchestration"],body[data-scene="chains"] .scene-rail span[data-scene-dot="chains"],body[data-scene="cli"] .scene-rail span[data-scene-dot="cli"],body[data-scene="fees"] .scene-rail span[data-scene-dot="fees"]{color:#071018;border-color:rgba(184,240,255,.82);background:linear-gradient(180deg,var(--scene-a),var(--scene-b));transform:translateX(-4px)}
|
|
113
|
-
body[data-scene="home"]{--scene-a:#7CC4FF;--scene-b:#50D2C1;--scene-soft:rgba(124,196,255,.16)}
|
|
114
|
-
body[data-scene="orchestration"]{--scene-a:#A7D8FF;--scene-b:#9945FF;--scene-soft:rgba(153,69,255,.12)}
|
|
115
|
-
body[data-scene="chains"]{--scene-a:#50D2C1;--scene-b:#D7FF4D;--scene-soft:rgba(80,210,193,.13)}
|
|
116
|
-
body[data-scene="cli"]{--scene-a:#F4F9FE;--scene-b:#7CC4FF;--scene-soft:rgba(244,249,254,.12)}
|
|
117
|
-
body[data-scene="fees"]{--scene-a:#D7FF4D;--scene-b:#F0B90B;--scene-soft:rgba(240,185,11,.12)}
|
|
113
|
+
body[data-scene="home"],body[data-scene="orchestration"],body[data-scene="chains"],body[data-scene="cli"],body[data-scene="fees"]{--scene-a:#7CC4FF;--scene-b:#50D2C1;--scene-soft:rgba(124,196,255,.16)}
|
|
118
114
|
|
|
119
115
|
/* ── orbital oracle mark ───────────────────────────── */
|
|
120
116
|
.orbital{position:relative;display:inline-block}
|
|
@@ -1117,6 +1113,10 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
|
|
|
1117
1113
|
.js .rv{opacity:0;transform:translate3d(0,22px,0);will-change:opacity,transform}
|
|
1118
1114
|
.js .rv.in{opacity:1;transform:translate3d(0,0,0);transition:opacity 1.05s var(--ease),transform 1.05s var(--ease)}
|
|
1119
1115
|
.js .rv.done{transform:none;will-change:auto}
|
|
1116
|
+
.js .home-kicker.rv.in{transition-delay:.04s}
|
|
1117
|
+
.js .home-title.rv.in{transition-delay:.14s}
|
|
1118
|
+
.js .hero-sub.rv.in{transition-delay:.26s}
|
|
1119
|
+
.js .home-stats.rv.in{transition-delay:.34s}
|
|
1120
1120
|
|
|
1121
1121
|
|
|
1122
1122
|
.section{position:relative}
|
|
@@ -1272,7 +1272,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
|
|
|
1272
1272
|
<div class="hero-split">
|
|
1273
1273
|
<div class="hero-lede">
|
|
1274
1274
|
<p class="home-kicker rv">self-custody agent control</p>
|
|
1275
|
-
<h1 class="home-title rv">Trade every chain<br>from <em>one</em> agent</h1>
|
|
1275
|
+
<h1 class="home-title rv" data-split>Trade every chain<br>from <em>one</em> agent</h1>
|
|
1276
1276
|
<p class="hero-sub rv">Hyperliquid, EVM, Bitcoin, Solana, Stable and Robinhood Chain in a single control plane. Oracle reads state, prices routes and prepares the transaction. Your wallet signs it.</p>
|
|
1277
1277
|
<div class="home-actions">
|
|
1278
1278
|
<a class="enter-cta primary" href="#cli">Download</a>
|
|
@@ -1333,7 +1333,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
|
|
|
1333
1333
|
</section>
|
|
1334
1334
|
<section class="section" id="orchestration">
|
|
1335
1335
|
<p class="section-label rv">Profiles</p>
|
|
1336
|
-
<h2 class="section-title rv">Multi-profile. <em>Customizable.</em></h2>
|
|
1336
|
+
<h2 class="section-title rv" data-split>Multi-profile. <em>Customizable.</em></h2>
|
|
1337
1337
|
<p class="section-lede rv">Input hits the Oracle control plane and routes across venue profiles, multi-chain EVM, Bitcoin, Solana, and the protocol builder. Any MCP harness drives a single agent.</p>
|
|
1338
1338
|
|
|
1339
1339
|
<div class="graph-shell rv">
|
|
@@ -1670,7 +1670,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
|
|
|
1670
1670
|
</div>
|
|
1671
1671
|
|
|
1672
1672
|
<p class="section-label rv">Self-custodial agents</p>
|
|
1673
|
-
<h2 class="section-title rv">No third party holds your keys. Not even Oracle.</h2>
|
|
1673
|
+
<h2 class="section-title rv" data-split>No third party holds your keys. Not even Oracle.</h2>
|
|
1674
1674
|
<div class="selfcustody-grid">
|
|
1675
1675
|
<div>
|
|
1676
1676
|
<h4>Everything runs on your machine</h4>
|
|
@@ -1885,7 +1885,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
|
|
|
1885
1885
|
|
|
1886
1886
|
<section class="section" id="chains">
|
|
1887
1887
|
<p class="section-label rv">Chains</p>
|
|
1888
|
-
<h2 class="section-title rv">Where you can <em>operate.</em></h2>
|
|
1888
|
+
<h2 class="section-title rv" data-split>Where you can <em>operate.</em></h2>
|
|
1889
1889
|
<p class="section-lede rv">Every built-in EVM chain exposes the full scanner set. <b>Route</b> means Oracle can price and prepare a swap there. Register any extra EVM chain with a chain id and an RPC; unsupported paths fail closed.</p>
|
|
1890
1890
|
<div class="chain-grid" id="chain-grid"></div>
|
|
1891
1891
|
<div class="hl-surface rv">
|
|
@@ -1902,7 +1902,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
|
|
|
1902
1902
|
</section>
|
|
1903
1903
|
<section class="section cli-section" id="cli">
|
|
1904
1904
|
<p class="section-label rv">Oracle CLI</p>
|
|
1905
|
-
<h2 class="section-title rv">One surface. <em>Every chain.</em></h2>
|
|
1905
|
+
<h2 class="section-title rv" data-split>One surface. <em>Every chain.</em></h2>
|
|
1906
1906
|
<div class="cli-install rv">
|
|
1907
1907
|
<div class="cli-install-cmd"><code>curl -fsSL https://oracle.demi.la/install.sh | bash</code> <span class="cli-install-hint">then oracle setup model && oracle chat</span></div>
|
|
1908
1908
|
</div>
|
|
@@ -1940,7 +1940,7 @@ footer{margin-top:clamp(72px,12vh,120px);border-top:1px solid var(--line);paddin
|
|
|
1940
1940
|
|
|
1941
1941
|
<section class="section" id="fees">
|
|
1942
1942
|
<p class="section-label rv">Fees</p>
|
|
1943
|
-
<h2 class="section-title rv">5 bps. <em>Holders zero.</em></h2>
|
|
1943
|
+
<h2 class="section-title rv" data-split>5 bps. <em>Holders zero.</em></h2>
|
|
1944
1944
|
<p class="section-lede rv">5 basis points (0.05%) on swaps Oracle routes. Eligible Hyperliquid orders can add a 1–2 bps builder fee after wallet approval. Both show before you sign.</p>
|
|
1945
1945
|
<div class="moat-grid rv" style="margin-top:28px">
|
|
1946
1946
|
<article class="moat-card">
|
|
@@ -2480,10 +2480,28 @@ var activeLenis = null;
|
|
|
2480
2480
|
root.querySelectorAll("[data-split]").forEach(function (el) {
|
|
2481
2481
|
if (el.dataset.splitDone) return;
|
|
2482
2482
|
el.dataset.splitDone = "1";
|
|
2483
|
-
|
|
2484
|
-
|
|
2485
|
-
|
|
2486
|
-
|
|
2483
|
+
function wrap(node) {
|
|
2484
|
+
var frag = document.createDocumentFragment();
|
|
2485
|
+
Array.prototype.slice.call(node.childNodes).forEach(function (child) {
|
|
2486
|
+
if (child.nodeType === 3) {
|
|
2487
|
+
child.textContent.split(/(\s+)/).forEach(function (w) {
|
|
2488
|
+
if (!w) return;
|
|
2489
|
+
if (/^\s+$/.test(w)) { frag.appendChild(document.createTextNode(w)); return; }
|
|
2490
|
+
var m = document.createElement("span"); m.className = "word-mask";
|
|
2491
|
+
var s = document.createElement("span"); s.textContent = w;
|
|
2492
|
+
m.appendChild(s); frag.appendChild(m);
|
|
2493
|
+
});
|
|
2494
|
+
} else if (child.nodeType === 1) {
|
|
2495
|
+
var clone = child.cloneNode(false);
|
|
2496
|
+
clone.appendChild(wrap(child));
|
|
2497
|
+
frag.appendChild(clone);
|
|
2498
|
+
}
|
|
2499
|
+
});
|
|
2500
|
+
return frag;
|
|
2501
|
+
}
|
|
2502
|
+
var out = wrap(el);
|
|
2503
|
+
el.innerHTML = "";
|
|
2504
|
+
el.appendChild(out);
|
|
2487
2505
|
});
|
|
2488
2506
|
}
|
|
2489
2507
|
function initPremiumMotion() {
|
|
@@ -2499,14 +2517,17 @@ var activeLenis = null;
|
|
|
2499
2517
|
}
|
|
2500
2518
|
splitWords(document);
|
|
2501
2519
|
if (window.ScrollTrigger) {
|
|
2502
|
-
|
|
2520
|
+
document.querySelectorAll("[data-split]").forEach(function (el) {
|
|
2521
|
+
el.classList.add("in", "done");
|
|
2522
|
+
gsap.fromTo(el.querySelectorAll(".word-mask > span"), { yPercent:112 }, { yPercent:0, duration:1.05, ease:"power4.out", stagger:.04, scrollTrigger:{ trigger:el, start:"top 82%" }, clearProps:"transform" });
|
|
2523
|
+
});
|
|
2503
2524
|
gsap.to(".hero-art", { yPercent:18, scale:.9, ease:"none", scrollTrigger:{ trigger:".home", start:"top top", end:"bottom top", scrub:true } });
|
|
2504
|
-
gsap.fromTo(".hero-installer", { y:
|
|
2505
|
-
gsap.fromTo(".motion-card", { y:
|
|
2506
|
-
gsap.to(".motion-command", { y:-54,
|
|
2507
|
-
gsap.fromTo(".chain", { y:
|
|
2508
|
-
gsap.fromTo(".strategy-card", { y:
|
|
2509
|
-
gsap.fromTo(".cli-proof", { scale:.
|
|
2525
|
+
gsap.fromTo(".hero-installer", { y:26, filter:"brightness(.92)" }, { y:0, filter:"brightness(1)", duration:1.1, ease:"power4.out", scrollTrigger:{ trigger:".hero-installer", start:"top 88%" }, clearProps:"transform,filter" });
|
|
2526
|
+
gsap.fromTo(".motion-card", { y:44, scale:.97 }, { y:0, scale:1, duration:1.15, ease:"power4.out", stagger:.07, scrollTrigger:{ trigger:".operator-grid", start:"top 82%" }, clearProps:"transform" });
|
|
2527
|
+
gsap.to(".motion-command", { y:-54, ease:"none", scrollTrigger:{ trigger:".motion-lab", start:"top 76%", end:"bottom top", scrub:true } });
|
|
2528
|
+
gsap.fromTo(".chain", { y:28, opacity:.55 }, { y:0, opacity:1, duration:.85, ease:"power3.out", stagger:.03, scrollTrigger:{ trigger:"#chains", start:"top 76%" }, clearProps:"transform,opacity" });
|
|
2529
|
+
gsap.fromTo(".strategy-card", { y:30, opacity:.58 }, { y:0, opacity:1, duration:.95, ease:"power3.out", stagger:.025, scrollTrigger:{ trigger:".strategy-grid", start:"top 78%" }, clearProps:"transform,opacity" });
|
|
2530
|
+
gsap.fromTo(".cli-proof", { scale:.96, y:30 }, { scale:1, y:0, ease:"none", scrollTrigger:{ trigger:".cli-proof", start:"top 86%", end:"bottom 38%", scrub:1 }, clearProps:"transform" });
|
|
2510
2531
|
gsap.to(".route-tree", { scale:1.018, ease:"none", transformOrigin:"50% 50%", scrollTrigger:{ trigger:".route-tree", start:"top 82%", end:"bottom 40%", scrub:1 } });
|
|
2511
2532
|
gsap.to(".mega-oracle", { xPercent:-14, letterSpacing:".02em", ease:"none", scrollTrigger:{ trigger:".mega-oracle", start:"top bottom", end:"bottom top", scrub:true } });
|
|
2512
2533
|
}
|
package/server.json
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
"name": "io.github.demi-hl/oracle",
|
|
4
4
|
"description": "Keyless multichain crypto desk: chain reads + prepare-only unsigned txs. Your wallet signs.",
|
|
5
5
|
"websiteUrl": "https://oracle.demi.la",
|
|
6
|
-
"version": "0.35.
|
|
6
|
+
"version": "0.35.20",
|
|
7
7
|
"packages": [
|
|
8
8
|
{
|
|
9
9
|
"registryType": "npm",
|
|
10
10
|
"identifier": "@oracle-agent/oracle",
|
|
11
|
-
"version": "0.35.
|
|
11
|
+
"version": "0.35.20",
|
|
12
12
|
"transport": {
|
|
13
13
|
"type": "stdio"
|
|
14
14
|
},
|