@oracle-agent/oracle 0.35.0 → 0.35.2

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.
@@ -1,7 +1,6 @@
1
- import{createHash as be,randomBytes as ke}from"node:crypto";import{mkdirSync as ye,readFileSync as $e,writeFileSync as xe}from"node:fs";import{homedir as we}from"node:os";import{dirname as Se,join as H}from"node:path";var ee={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}},te=new Map(Object.values(ee).map(t=>[t.chainId,t]));function U(t){return te.get(Number(t))||null}var c="UNKNOWN",ve=Object.freeze(["token","launch","hip3","hip4","polymarket","twap","bridge","swap","approve"]),re=/[_*[\]`]/g;function n(t){return u(t)?String(t).replace(re,e=>`\\${e}`):c}function u(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!=="":!0}function m(t){if(!u(t))return c;let e=String(t).replace(/`/g,"");return e===""?c:`\`${e}\``}function $(t,{decimals:e=2}={}){if(!u(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=$(t,{decimals:e});return r===c?c:`${r} USD`}function E(t,{decimals:e=2}={}){let r=$(t,{decimals:e});return r===c?c:`${r}%`}function _(t){let e=$(t,{decimals:0});return e===c?c:`${e} bps`}function x(t,e){if(!u(t))return c;let r=Number(e);if(!Number.isInteger(r)||r<0||r>77)return c;let i;try{i=BigInt(typeof t=="string"?t.trim():t)}catch{return c}let a=i<0n,s=a?-i:i,o=10n**BigInt(r),l=(s/o).toString(),d=(s%o).toString().padStart(r,"0").replace(/0+$/,"");return`${a?"-":""}${l}${d?`.${d}`:""}`}function N(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(!u(e)||!Number.isFinite(Number(e)))return u(t.chain)?n(t.chain):c;let i=U(e)?.name||(u(t.chain)?String(t.chain):c);return`${n(i)} (chainId ${Number(e)})`}function D(t={}){return n(t.venue??t.dex??t.pool?.venue)}function ne(t){return t==null?"NONE (text card only)":typeof t=="string"?t.trim()?m(t):"NONE (text card only)":t.error||t.ok===!1||t.available===!1?`UNAVAILABLE${u(t.error)?` \u2014 ${n(t.error)}`:""} (text card stands)`:u(t.url)?m(t.url):"NONE (text card only)"}function C(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 i=r.expiresAt??r.expiry;if(u(i)){let s=typeof i=="number"?i:Date.parse(i);if(!Number.isFinite(s))return{allowed:!1,reason:"grant expiry unreadable",actions:[]};if(s<=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 ie(t){let e=C(t);return e.allowed?`${e.actions.map(r=>n(r)).join(" / ")} (${n(e.reason)})`:`prepare-only \u2014 ${n(e.reason)}`}function g(t,e,r={}){let i=[`*${t}*`];for(let[a,s]of e)i.push(`${a}: ${s==null||s===""?c:s}`);return i.push(`Chart: ${ne(r.chart)}`),i.push(`Actions: ${ie(r)}`),Array.isArray(r.warnings)&&r.warnings.length&&i.push(`Warnings: ${r.warnings.map(a=>n(a)).join("; ")}`),(u(r.source)||u(r.fetchedAt))&&i.push(`Source: ${n(r.source)} at ${n(r.fetchedAt)}`),i.join(`
2
- `)}function b(t){return["Confidence",N(t.confidence)]}function oe(t){let e=t.quote;if(!e||typeof e!="object")return[];let r=u(e.decimals)?x(e.amountOutRaw??e.out??e.raw,e.decimals):c;return[["Quote out (raw)",m(e.amountOutRaw??e.out??e.raw)],["Quote out",r===c?c:`${n(r)} ${n(e.symbol??"")}`.trim()]]}function M(t){let e=t.autoSlippage;if(!e||typeof e!="object")return["Auto-slippage",c];let r=_(e.selectedBps),i=_(e.capBps);return["Auto-slippage",r===c&&i===c?c:`${r} selected, cap ${i}`]}function ae(t={}){let e=t||{};return g(`ORACLE TOKEN \u2014 ${n(e.symbol??e.token??e.name)}`,[["Chain",k(e)],["Venue",D(e)],["Name",n(e.name)],["Address",m(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",E(e.priceChange24h)],["Fee tier",u(e.feeTier)?`${_(Number(e.feeTier)/100)} (${$(e.feeTier,{decimals:0})})`:c],["Age",n(e.age)],...oe(e),M(e),b(e)],e)}function se(t={}){let e=t||{};return g(`ORACLE LAUNCH \u2014 ${n(e.symbol??e.token??e.name)}`,[["Chain",k(e)],["Venue",D(e)],["Address",m(e.address??e.mint??e.contract)],["Pool",m(e.pool?.address??e.poolAddress??e.pool)],["Liquidity",p(e.liquidityUsd)],["Route ready",n(e.routeReady)],["Sellable",n(e.sellable)],["Sell sim",n(e.sellSimulation??e.sellSim)],["Smart wallets",n(e.smartWalletOverlap)],["Risk",n(e.risk??e.riskStatus)],["Prepared ticket",n(e.preparedTicket??e.ticketStatus)],M(e),b(e)],e)}function ce(t={}){let e=t||{};return g(`ORACLE HIP-3 \u2014 ${n(e.market??e.coin??e.name)}`,[["Venue",`Hyperliquid builder-dex ${n(e.dex)}`],["Market",n(e.market??e.coin)],["Mark",p(e.markPx,{decimals:6})],["Oracle",p(e.oraclePx,{decimals:6})],["Funding",E(e.funding,{decimals:6})],["Open interest",p(e.openInterestUsd)],["Depth",n(e.depth)],["Liquidation notes",n(e.liquidationNotes??e.riskNotes)],["Account context",n(e.accountContext)],b(e)],e)}function le(t={}){let e=t||{};return g(`ORACLE HIP-4 \u2014 ${n(e.event??e.market??e.name)}`,[["Venue",`Hyperliquid HIP-4 ${n(e.dex??"outcome")}`],["Event",n(e.event)],["Outcome",n(e.outcome)],["Market id",m(e.marketId??e.market)],["Bid",p(e.bid,{decimals:6})],["Ask",p(e.ask,{decimals:6})],["Depth",n(e.depth)],["Edge",E(e.edge)],["Position",n(e.position)],b(e)],e)}function ue(t={}){let e=t||{};return g(`ORACLE POLYMARKET \u2014 ${n(e.event??e.market??e.name)}`,[["Venue","Polymarket CLOB"],["Event",n(e.event)],["Market",n(e.market)],["Market id",m(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",n(e.resolutionRisk)],["Order intent",n(e.orderIntent)],b(e)],e)}function de(t={}){let e=t||{},r=u(e.completedSplits)&&u(e.totalSplits)?`${$(e.completedSplits,{decimals:0})} / ${$(e.totalSplits,{decimals:0})}`:c;return g(`ORACLE TWAP \u2014 ${n(e.pair??e.symbol??e.name)}`,[["Chain",k(e)],["Side",n(e.side??e.direction)],["Amount",`${n(x(e.amountTotal??e.amount,e.decimals??18))} ${n(e.symbol??"")}`.trim()],["Splits",`${$(e.totalSplits,{decimals:0})} over ${n(e.window)}`],["Progress",r],["Avg price",p(e.averagePrice,{decimals:6})],["Next split",n(e.nextSplitAt)],["Slippage cap",_(e.slippageBps)],["Status",n(e.status)],b(e)],e)}function pe(t={}){let e=t||{},r=e.approval??e.revokeCheck??{},i=r.needsRevoke&&r.spender?`revoke.cash \u2014 ${n(r.spender)}`:r.needsRevoke===!1?"revoke.cash \u2014 clean":"revoke.cash \u2014 unchecked";return g(`ORACLE BRIDGE \u2014 ${n(e.pair??e.fromSymbol)} \u2192 ${n(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",`${n(x(e.amount,e.fromDecimals??18))} ${n(e.fromSymbol??"")}`.trim()],["Best route",n(e.bestRoute??e.winner)],["Est. received",`${n(x(e.amountOut,e.toDecimals??18))} ${n(e.toSymbol??"")}`.trim()],["Fee",p(e.feeUsd)],["Est. time",n(e.estimatedTime)],["Revoke check",i],["All providers",n(e.providers?.join(", "))],["Preparable",n(e.preparable)],b(e)],e)}function fe(t){let r=(Array.isArray(t)?t:[]).slice(1,4).map(i=>{let a=n(i.source??i.venue??i.name),s=i.improvementBps==null&&i.deltaBps==null?null:Number(i.improvementBps??i.deltaBps),o=Number.isFinite(s)?`${Math.abs(s).toFixed(0)} bps behind`:"spread UNKNOWN";return`${a} (${o})`});return r.length?r.join("; "):c}function me(t){let e=t.rankedOn??t.swap?.rankedOn??t.best?.rankedOn;return u(e)?n(e):c}function he(t={}){let e=t||{},r=e.swap&&typeof e.swap=="object"?e.swap:e,i=e.bridge&&typeof e.bridge=="object"?e.bridge:null,a=r.best??r.winner??{},s=`${n(e.tokenInSymbol??e.fromSymbol??"IN")} \u2192 ${n(e.tokenOutSymbol??e.toSymbol??"OUT")}`,o=[["Intent",n(e.intent??"swap")],["Chain",k({chainId:e.chainId??r.chainId,chain:e.chain??r.chain})],["Pair",s],["Amount in",`${n(x(e.amountIn??r.amountIn,e.decimalsIn??18))} ${n(e.tokenInSymbol??"")}`.trim()],["Best swap",n(a.source??a.venue??r.bestRoute??e.bestRoute)],["Net out",`${n(x(a.netOut??a.amountOut??r.amountOut,e.decimalsOut??18))} ${n(e.tokenOutSymbol??"")}`.trim()],["Ranked on",me(r)],["Gas accounted",n(a.costAccounted===!0?"yes":a.costAccounted===!1?"no \u2014 gross ranking may flatter this route":null)],["Spread vs next",u(r.improvementBps)?`${n(r.improvementBps)} bps`:c],["Runners-up",fe(r.routes??e.routes)]];if(i){let l=i.best??i.winner??{};o.push(["Best bridge",n(l.source??i.bestRoute??e.bestBridge)],["Bridge out",`${n(x(l.netOut??l.amountOut??i.amountOut,e.bridgeDecimalsOut??e.decimalsOut??18))} ${n(e.bridgeOutSymbol??e.tokenOutSymbol??"")}`.trim()],["Bridge to",k({chainId:i.toChainId??e.toChainId,chain:i.toChain??e.toChain})],["Est. time",n(i.estimatedTime??l.meta?.durationSeconds)])}else o.push(["Best bridge","same-chain \u2014 use Best swap"]);return o.push(["Preparable",n(e.preparable??a.executionReady)],b(e)),g(`ORACLE SWAP \u2014 ${s}`,o,e)}function ge(t={}){let e=t||{};return g("ORACLE APPROVE \u2014 local signer",[["Pending id",m(e.id??(typeof e.digest=="string"?e.digest.slice(0,8):null))],["Surface",n(e.surface)],["Action",n(e.action)],["Chain",k({chainId:e.chain??e.chainId,chain:e.chainName})],["To",m(e.to??e.destination)],["Value",u(e.value)?n(e.value):c],["Signer",n(e.armed===!0?"running + armed":e.armed===!1?"running, disarmed":"not running")],b({confidence:e.confidence??(e.armed===!0?"high":"low")})],e)}var Le=Object.freeze({token:ae,launch:se,hip3:ce,hip4:le,polymarket:ue,twap:de,bridge:pe,swap:he,approve:ge});var Ce=Object.freeze(["deepen","refresh","prepare"]),Ae=new Set(Ce),v=/^[a-z0-9-]{4,40}$/i,j=/^[0-9a-f]{32}$/,F=/^\d+$/;function L(t=process.env){return H(t.ORACLE_CONFIG_DIR||H(we(),".config","oracle"),"telegram-cards.json")}function w(){return{links:{},artifacts:{},threads:{}}}var A=w();function P(){return A}function q(t,{readFile:e=$e}={}){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=w()}return A}function V(t,e=A,{writeFile:r=xe,mkdir:i=ye}={}){i(Se(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 W(t){return be("sha256").update(String(t)).digest("hex")}function O(t){if(Array.isArray(t))return t.map(O);if(!t||typeof t!="object")return t;let e={};for(let[r,i]of Object.entries(t))/(secret|token|key|seed|private|password|mnemonic|auth)/i.test(r)||(e[r]=O(i));return e}function Re(t){let r=String(t||"").trim().match(/^oracle:card:(deepen|refresh|prepare):([a-z0-9-]{4,40})$/i);return r?{action:r[1].toLowerCase(),artifactId:r[2].toLowerCase()}:null}function K({platform:t="telegram",artifactId:e,openUrl:r,hasGrant:i=!1}={}){let a=String(e||"").trim().toLowerCase();if(!v.test(a))return{kind:"text_menu",text:"no artifact to continue",cancelHint:""};let s=[];y(r)&&s.push({text:"Open",url:String(r)});let o=[{text:"Deepen",callback_data:`oracle:card:deepen:${a}`},{text:"Refresh",callback_data:`oracle:card:refresh:${a}`}];if(i&&o.push({text:"Prepare",callback_data:`oracle:card:prepare:${a}`}),String(t)==="telegram")return{kind:"inline_keyboard",replyMarkup:{inline_keyboard:[s,o].filter(h=>h.length>0)},cancelHint:i?"Prepare queues an unsigned artifact. Allow/Deny still required to sign.":"prepare-only \u2014 Deepen and Refresh stay read-only."};let l=[],d=0;for(let h of[...s,...o])d+=1,l.push(h.url?`${d}. ${h.text}: ${h.url}`:`${d}. ${h.text} (reply ${d})`);return{kind:"text_menu",text:l.join(`
3
- `),cancelHint:""}}function Y(t={}){let r=[`*${y(t.title)?n(t.title):"Oracle artifact"}*`,`Kind: ${y(t.kind)?n(t.kind):c}`,`Id: ${y(t.id)?`\`${String(t.id).replace(/`/g,"")}\``:c}`,`Summary: ${y(t.summary)?n(t.summary):c}`,`Confidence: ${N(t.confidence)}`];(y(t.source)||y(t.fetchedAt))&&r.push(`Source: ${n(t.source)} at ${n(t.fetchedAt)}`),Array.isArray(t.warnings)&&t.warnings.length&&r.push(`Warnings: ${t.warnings.map(a=>n(a)).join("; ")}`);let i=C(t);return r.push(i.allowed?"Actions: Deepen / Refresh / Prepare (unsigned)":`Actions: Deepen / Refresh \u2014 ${n(i.reason)}`),r.join(`
4
- `)}function _e(t,e={},{now:r=Date.now()}={}){let i=t||w(),a=String(e.id||"").trim().toLowerCase();if(!v.test(a))throw new TypeError("artifact id required");let s={id:a,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:O(e.payload||{}),createdAt:new Date(r).toISOString()};return i.artifacts[a]=s,s}function B(t,{chatId:e,artifactId:r,now:i=Date.now()}={}){let a=t||w(),s=String(e||"").trim(),o=String(r||"").trim().toLowerCase();if(!s)throw new TypeError("chat id required");if(!v.test(o))throw new TypeError("artifact id required");return a.threads[s]={artifactId:o,updatedAt:i},a.threads[s]}function z(t,{chatId:e,text:r}={}){let i=String(e||"").trim(),a=String(r||"").trim();if(!i||!a||/^\//.test(a))return null;let s=t?.threads?.[i];if(!s?.artifactId)return null;let o=t.artifacts?.[s.artifactId];return o?`Continue artifact ${o.id} (${o.kind}). Prior: ${o.summary||o.title}. User: ${a}`:null}function J(t,{ownerId:e,botUsername:r,now:i=Date.now(),ttlMs:a=600*1e3,token:s,randomBytes:o=ke}={}){let l=t||w(),d=String(e||"").trim(),h=String(r||"").replace(/^@/,"").trim();if(!F.test(d))throw new TypeError("owner Telegram id required");if(!/^[A-Za-z0-9_]{5,32}$/.test(h))throw new TypeError("bot username required");let R=s||o(16).toString("hex");if(!j.test(R))throw new TypeError("link token must be 32 hex chars");return l.links[W(R)]={ownerId:d,expiresAt:i+Number(a)},{token:R,url:`https://t.me/${h}?start=${R}`,expiresAt:i+Number(a)}}function Q(t,{token:e,telegramUserId:r,now:i=Date.now()}={}){let a=t||w(),s=String(e||"").trim(),o=String(r||"").trim();if(!j.test(s))return{ok:!1,error:"invalid start token"};if(!F.test(o))return{ok:!1,error:"invalid telegram user"};let l=W(s),d=a.links[l];return d?(delete a.links[l],Number(d.expiresAt)<=i?{ok:!1,error:"start token expired"}:String(d.ownerId)!==o?{ok:!1,error:"start token is bound to a different owner"}:{ok:!0,ownerId:o}):{ok:!1,error:"unknown or already used start token"}}function G(t,{data:e,chatId:r,grant:i=null,now:a=Date.now()}={}){let s=Re(e);if(!s)return null;if(!Ae.has(s.action))return{text:"That card action is not available.",buttons:null};let o=t?.artifacts?.[s.artifactId];if(!o)return{text:"That artifact is gone. Ask again and I will issue a new card.",buttons:null};r&&B(t,{chatId:r,artifactId:o.id,now:a});let l=C({grant:i},{now:a}),d=K({artifactId:o.id,openUrl:o.openUrl,hasGrant:l.allowed});return s.action==="refresh"?{text:Y(o),buttons:d,prompt:null}:s.action==="deepen"?{text:null,buttons:null,prompt:`Deepen artifact ${o.id} (${o.kind}). Prior: ${o.summary||o.title}. Be terse. Do not sign or broadcast.`}:l.allowed?{text:`Queued unsigned prepare for ${o.id}. Nothing signed. Allow/Deny still required.`,buttons:d,prompt:null,prepare:{artifactId:o.id,unsigned:!0,broadcast:!1}}:{text:`Prepare blocked \u2014 ${l.reason}. Deepen and Refresh still work.`,buttons:d,prompt:null}}function X(t={},{grant:e=null,now:r=Date.now(),state:i}={}){let a=i||P(),s=String(t.id||`art-${Math.abs(Number(r)).toString(36)}`).toLowerCase().slice(0,40),o=_e(a,{...t,id:s},{now:r}),l=C({grant:e},{now:r});return{text:Y({...o,grant:e}),replyMarkup:K({artifactId:o.id,openUrl:o.openUrl,hasGrant:l.allowed}).replyMarkup,artifact:o,state:a}}var T=`oracle telegram \u2014 TrueNorth-style interactive cards (native, no Hermes)
1
+ import{createHash as we,randomBytes as $e}from"node:crypto";import{mkdirSync as xe,readFileSync as Se,writeFileSync as Ce}from"node:fs";import{homedir as Ae}from"node:os";import{dirname as Re,join as j}from"node:path";var re=/^[A-Z0-9][A-Z0-9._-]{0,11}$/;function M(t,{coin:e,side:r,sizeUsd:o,leverage:s,venue:a,confirm:i,user:l}={}){let u=String(t||"").trim();if(!u||u.includes("ts.net")||!/^https:\/\//i.test(u))return null;let d=new URL(u);if(e&&re.test(String(e).toUpperCase())&&d.searchParams.set("coin",String(e).toUpperCase()),(r==="long"||r==="short")&&d.searchParams.set("side",r),Number.isFinite(Number(o))&&Number(o)>=1&&d.searchParams.set("size",String(Math.min(1e5,Math.round(Number(o))))),Number.isInteger(Number(s))&&Number(s)>=1&&d.searchParams.set("lev",String(Math.min(50,Number(s)))),a){let g=String(a).toLowerCase()==="hl"?"hyperliquid":String(a).toLowerCase();d.searchParams.set("venue",g)}else d.searchParams.get("venue")||d.searchParams.set("venue","hyperliquid");return d.searchParams.set("view","perps"),d.searchParams.set("build","1"),i&&/^[0-9a-f]{32}$/i.test(String(i))&&d.searchParams.set("confirm",String(i).toLowerCase()),l&&/^0x[0-9a-fA-F]{40}$/.test(String(l))&&d.searchParams.set("user",String(l).toLowerCase()),d.toString()}var ne={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}},ie=new Map(Object.values(ne).map(t=>[t.chainId,t]));function H(t){return ie.get(Number(t))||null}var c="UNKNOWN",Be=Object.freeze(["token","launch","hip3","hip4","polymarket","twap","bridge","swap","approve"]),oe=/[_*[\]`]/g;function n(t){return p(t)?String(t).replace(oe,e=>`\\${e}`):c}function p(t){return t==null?!1:typeof t=="number"?Number.isFinite(t):typeof t=="string"?t.trim()!=="":!0}function h(t){if(!p(t))return c;let e=String(t).replace(/`/g,"");return e===""?c:`\`${e}\``}function $(t,{decimals:e=2}={}){if(!p(t))return c;let r=Number(t);return Number.isFinite(r)?r.toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:e}):c}function m(t,{decimals:e=2}={}){let r=$(t,{decimals:e});return r===c?c:`${r} USD`}function I(t,{decimals:e=2}={}){let r=$(t,{decimals:e});return r===c?c:`${r}%`}function N(t){let e=$(t,{decimals:0});return e===c?c:`${e} bps`}function x(t,e){if(!p(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,i=10n**BigInt(r),l=(a/i).toString(),u=(a%i).toString().padStart(r,"0").replace(/0+$/,"");return`${s?"-":""}${l}${u?`.${u}`:""}`}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 y(t={}){let e=t.chainId;if(!p(e)||!Number.isFinite(Number(e)))return p(t.chain)?n(t.chain):c;let o=H(e)?.name||(p(t.chain)?String(t.chain):c);return`${n(o)} (chainId ${Number(e)})`}function D(t={}){return n(t.venue??t.dex??t.pool?.venue)}function ae(t){return t==null?"NONE (text card only)":typeof t=="string"?t.trim()?h(t):"NONE (text card only)":t.error||t.ok===!1||t.available===!1?`UNAVAILABLE${p(t.error)?` \u2014 ${n(t.error)}`:""} (text card stands)`:p(t.url)?h(t.url):"NONE (text card only)"}function A(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(p(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 se(t){let e=A(t);return e.allowed?`${e.actions.map(r=>n(r)).join(" / ")} (${n(e.reason)})`:`prepare-only \u2014 ${n(e.reason)}`}function b(t,e,r={}){let o=[`*${t}*`];for(let[s,a]of e)o.push(`${s}: ${a==null||a===""?c:a}`);return o.push(`Chart: ${ae(r.chart)}`),o.push(`Actions: ${se(r)}`),Array.isArray(r.warnings)&&r.warnings.length&&o.push(`Warnings: ${r.warnings.map(s=>n(s)).join("; ")}`),(p(r.source)||p(r.fetchedAt))&&o.push(`Source: ${n(r.source)} at ${n(r.fetchedAt)}`),o.join(`
2
+ `)}function k(t){return["Confidence",E(t.confidence)]}function ce(t){let e=t.quote;if(!e||typeof e!="object")return[];let r=p(e.decimals)?x(e.amountOutRaw??e.out??e.raw,e.decimals):c;return[["Quote out (raw)",h(e.amountOutRaw??e.out??e.raw)],["Quote out",r===c?c:`${n(r)} ${n(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 le(t={}){let e=t||{};return b(`ORACLE TOKEN \u2014 ${n(e.symbol??e.token??e.name)}`,[["Chain",y(e)],["Venue",D(e)],["Name",n(e.name)],["Address",h(e.address??e.mint??e.contract)],["Price",m(e.priceUsd,{decimals:8})],["Market cap",m(e.marketCapUsd)],["Liquidity",m(e.liquidityUsd)],["Volume 24h",m(e.volume24hUsd)],["Change 24h",I(e.priceChange24h)],["Fee tier",p(e.feeTier)?`${N(Number(e.feeTier)/100)} (${$(e.feeTier,{decimals:0})})`:c],["Age",n(e.age)],...ce(e),F(e),k(e)],e)}function ue(t={}){let e=t||{};return b(`ORACLE LAUNCH \u2014 ${n(e.symbol??e.token??e.name)}`,[["Chain",y(e)],["Venue",D(e)],["Address",h(e.address??e.mint??e.contract)],["Pool",h(e.pool?.address??e.poolAddress??e.pool)],["Liquidity",m(e.liquidityUsd)],["Route ready",n(e.routeReady)],["Sellable",n(e.sellable)],["Sell sim",n(e.sellSimulation??e.sellSim)],["Smart wallets",n(e.smartWalletOverlap)],["Risk",n(e.risk??e.riskStatus)],["Prepared ticket",n(e.preparedTicket??e.ticketStatus)],F(e),k(e)],e)}function de(t={}){let e=t||{};return b(`ORACLE HIP-3 \u2014 ${n(e.market??e.coin??e.name)}`,[["Venue",`Hyperliquid builder-dex ${n(e.dex)}`],["Market",n(e.market??e.coin)],["Mark",m(e.markPx,{decimals:6})],["Oracle",m(e.oraclePx,{decimals:6})],["Funding",I(e.funding,{decimals:6})],["Open interest",m(e.openInterestUsd)],["Depth",n(e.depth)],["Liquidation notes",n(e.liquidationNotes??e.riskNotes)],["Account context",n(e.accountContext)],k(e)],e)}function pe(t={}){let e=t||{};return b(`ORACLE HIP-4 \u2014 ${n(e.event??e.market??e.name)}`,[["Venue",`Hyperliquid HIP-4 ${n(e.dex??"outcome")}`],["Event",n(e.event)],["Outcome",n(e.outcome)],["Market id",h(e.marketId??e.market)],["Bid",m(e.bid,{decimals:6})],["Ask",m(e.ask,{decimals:6})],["Depth",n(e.depth)],["Edge",I(e.edge)],["Position",n(e.position)],k(e)],e)}function me(t={}){let e=t||{};return b(`ORACLE POLYMARKET \u2014 ${n(e.event??e.market??e.name)}`,[["Venue","Polymarket CLOB"],["Event",n(e.event)],["Market",n(e.market)],["Market id",h(e.marketId??e.conditionId??e.tokenId)],["Yes",m(e.yesPrice,{decimals:4})],["No",m(e.noPrice,{decimals:4})],["Best bid / ask",`${m(e.bestBid,{decimals:4})} / ${m(e.bestAsk,{decimals:4})}`],["Volume",m(e.volumeUsd)],["Resolution risk",n(e.resolutionRisk)],["Order intent",n(e.orderIntent)],k(e)],e)}function fe(t={}){let e=t||{},r=p(e.completedSplits)&&p(e.totalSplits)?`${$(e.completedSplits,{decimals:0})} / ${$(e.totalSplits,{decimals:0})}`:c;return b(`ORACLE TWAP \u2014 ${n(e.pair??e.symbol??e.name)}`,[["Chain",y(e)],["Side",n(e.side??e.direction)],["Amount",`${n(x(e.amountTotal??e.amount,e.decimals??18))} ${n(e.symbol??"")}`.trim()],["Splits",`${$(e.totalSplits,{decimals:0})} over ${n(e.window)}`],["Progress",r],["Avg price",m(e.averagePrice,{decimals:6})],["Next split",n(e.nextSplitAt)],["Slippage cap",N(e.slippageBps)],["Status",n(e.status)],k(e)],e)}function he(t={}){let e=t||{},r=e.approval??e.revokeCheck??{},o=r.needsRevoke&&r.spender?`revoke.cash \u2014 ${n(r.spender)}`:r.needsRevoke===!1?"revoke.cash \u2014 clean":"revoke.cash \u2014 unchecked";return b(`ORACLE BRIDGE \u2014 ${n(e.pair??e.fromSymbol)} \u2192 ${n(e.toSymbol??"")}`.replace(/→ $/,""),[["Bridging","deBridge \xB7 LI.FI \u2014 best route wins"],["From chain",y({chainId:e.fromChainId,chain:e.fromChain})],["To chain",y({chainId:e.toChainId,chain:e.toChain})],["Amount",`${n(x(e.amount,e.fromDecimals??18))} ${n(e.fromSymbol??"")}`.trim()],["Best route",n(e.bestRoute??e.winner)],["Est. received",`${n(x(e.amountOut,e.toDecimals??18))} ${n(e.toSymbol??"")}`.trim()],["Fee",m(e.feeUsd)],["Est. time",n(e.estimatedTime)],["Revoke check",o],["All providers",n(e.providers?.join(", "))],["Preparable",n(e.preparable)],k(e)],e)}function ge(t){let r=(Array.isArray(t)?t:[]).slice(1,4).map(o=>{let s=n(o.source??o.venue??o.name),a=o.improvementBps==null&&o.deltaBps==null?null:Number(o.improvementBps??o.deltaBps),i=Number.isFinite(a)?`${Math.abs(a).toFixed(0)} bps behind`:"spread UNKNOWN";return`${s} (${i})`});return r.length?r.join("; "):c}function be(t){let e=t.rankedOn??t.swap?.rankedOn??t.best?.rankedOn;return p(e)?n(e):c}function ke(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=`${n(e.tokenInSymbol??e.fromSymbol??"IN")} \u2192 ${n(e.tokenOutSymbol??e.toSymbol??"OUT")}`,i=[["Intent",n(e.intent??"swap")],["Chain",y({chainId:e.chainId??r.chainId,chain:e.chain??r.chain})],["Pair",a],["Amount in",`${n(x(e.amountIn??r.amountIn,e.decimalsIn??18))} ${n(e.tokenInSymbol??"")}`.trim()],["Best swap",n(s.source??s.venue??r.bestRoute??e.bestRoute)],["Net out",`${n(x(s.netOut??s.amountOut??r.amountOut,e.decimalsOut??18))} ${n(e.tokenOutSymbol??"")}`.trim()],["Ranked on",be(r)],["Gas accounted",n(s.costAccounted===!0?"yes":s.costAccounted===!1?"no \u2014 gross ranking may flatter this route":null)],["Spread vs next",p(r.improvementBps)?`${n(r.improvementBps)} bps`:c],["Runners-up",ge(r.routes??e.routes)]];if(o){let l=o.best??o.winner??{};i.push(["Best bridge",n(l.source??o.bestRoute??e.bestBridge)],["Bridge out",`${n(x(l.netOut??l.amountOut??o.amountOut,e.bridgeDecimalsOut??e.decimalsOut??18))} ${n(e.bridgeOutSymbol??e.tokenOutSymbol??"")}`.trim()],["Bridge to",y({chainId:o.toChainId??e.toChainId,chain:o.toChain??e.toChain})],["Est. time",n(o.estimatedTime??l.meta?.durationSeconds)])}else i.push(["Best bridge","same-chain \u2014 use Best swap"]);return i.push(["Preparable",n(e.preparable??s.executionReady)],k(e)),b(`ORACLE SWAP \u2014 ${a}`,i,e)}function ye(t={}){let e=t||{};return b("ORACLE APPROVE \u2014 local signer",[["Pending id",h(e.id??(typeof e.digest=="string"?e.digest.slice(0,8):null))],["Surface",n(e.surface)],["Action",n(e.action)],["Chain",y({chainId:e.chain??e.chainId,chain:e.chainName})],["To",h(e.to??e.destination)],["Value",p(e.value)?n(e.value):c],["Signer",n(e.armed===!0?"running + armed":e.armed===!1?"running, disarmed":"not running")],k({confidence:e.confidence??(e.armed===!0?"high":"low")})],e)}var Ue=Object.freeze({token:le,launch:ue,hip3:de,hip4:pe,polymarket:me,twap:fe,bridge:he,swap:ke,approve:ye});var Ne=Object.freeze(["deepen","refresh","prepare","ta","fa","long","short","allow","deny"]),_e=new Set(Ne),L=/^[a-z0-9-]{4,40}$/i,q=/^[0-9a-f]{32}$/,V=/^\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 R=S();function T(){return R}function W(t,{readFile:e=Se}={}){try{let r=JSON.parse(String(e(t)));R={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{R=S()}return R}function z(t,e=R,{writeFile:r=Ce,mkdir:o=xe}={}){o(Re(t),{recursive:!0,mode:448}),r(t,JSON.stringify(e),{mode:384})}function w(t){return t==null?!1:typeof t=="string"?t.trim()!=="":!0}function K(t){return we("sha256").update(String(t)).digest("hex")}function v(t){if(Array.isArray(t))return t.map(v);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]=v(o));return e}function Oe(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(!L.test(s))return{kind:"text_menu",text:"no artifact to continue",cancelHint:""};let a=[],i=[{text:"TA",callback_data:`oracle:card:ta:${s}`},{text:"FA",callback_data:`oracle:card:fa:${s}`}],l=O=>M(r,{side:O}),u=l("long"),d=l("short"),g=u&&d?[{text:"LONG",url:u},{text:"SHORT",url:d}]:[{text:"LONG",callback_data:`oracle:card:long:${s}`},{text:"SHORT",callback_data:`oracle:card:short:${s}`}];return w(r)?(a.push([{text:"Open",url:String(r)},i[0]]),a.push(g),a.push(o?[i[1],{text:"Prep",callback_data:`oracle:card:prepare:${s}`}]:[i[1]])):(a.push(i),a.push(g),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=[`*${w(t.title)?n(t.title):"Oracle artifact"}*`,`Kind: ${w(t.kind)?n(t.kind):c}`,`Id: ${w(t.id)?`\`${String(t.id).replace(/`/g,"")}\``:c}`,`Summary: ${w(t.summary)?n(t.summary):c}`,`Confidence: ${E(t.confidence)}`];(w(t.source)||w(t.fetchedAt))&&r.push(`Source: ${n(t.source)} at ${n(t.fetchedAt)}`),Array.isArray(t.warnings)&&t.warnings.length&&r.push(`Warnings: ${t.warnings.map(s=>n(s)).join("; ")}`);let o=A(t);return r.push(o.allowed?"Actions: TA / FA / LONG / SHORT open the graph. Execute on CONFIRM there.":`Actions: TA / FA / LONG / SHORT \u2014 ${n(o.reason)}`),r.join(`
3
+ `)}function Ie(t,e={},{now:r=Date.now()}={}){let o=t||S(),s=String(e.id||"").trim().toLowerCase();if(!L.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:w(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:v(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(),i=String(r||"").trim().toLowerCase();if(!a)throw new TypeError("chat id required");if(!L.test(i))throw new TypeError("artifact id required");return s.threads[a]={artifactId:i,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 i=t.artifacts?.[a.artifactId];return i?`Continue artifact ${i.id} (${i.kind}). Prior: ${i.summary||i.title}. User: ${s}`:null}function Q(t,{ownerId:e,botUsername:r,now:o=Date.now(),ttlMs:s=600*1e3,token:a,randomBytes:i=$e}={}){let l=t||S(),u=String(e||"").trim(),d=String(r||"").replace(/^@/,"").trim();if(!V.test(u))throw new TypeError("owner Telegram id required");if(!/^[A-Za-z0-9_]{5,32}$/.test(d))throw new TypeError("bot username required");let g=a||i(16).toString("hex");if(!q.test(g))throw new TypeError("link token must be 32 hex chars");return l.links[K(g)]={ownerId:u,expiresAt:o+Number(s)},{token:g,url:`https://t.me/${d}?start=${g}`,expiresAt:o+Number(s)}}function Z(t,{token:e,telegramUserId:r,now:o=Date.now()}={}){let s=t||S(),a=String(e||"").trim(),i=String(r||"").trim();if(!q.test(a))return{ok:!1,error:"invalid start token"};if(!V.test(i))return{ok:!1,error:"invalid telegram user"};let l=K(a),u=s.links[l];return u?(delete s.links[l],Number(u.expiresAt)<=o?{ok:!1,error:"start token expired"}:String(u.ownerId)!==i?{ok:!1,error:"start token is bound to a different owner"}:{ok:!0,ownerId:i}):{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=Oe(e);if(!a)return null;if(!_e.has(a.action))return{text:"That card action is not available.",buttons:null};let i=t?.artifacts?.[a.artifactId];if(!i)return{text:"That artifact is gone. Ask again and I will issue a new card.",buttons:null};r&&B(t,{chatId:r,artifactId:i.id,now:s});let l=A({grant:o},{now:s}),u=Y({artifactId:i.id,openUrl:i.openUrl,hasGrant:l.allowed});return a.action==="refresh"?{text:G(i),buttons:u,prompt:null}:a.action==="deepen"?{text:null,buttons:null,prompt:`Deepen artifact ${i.id} (${i.kind}). Prior: ${i.summary||i.title}. Be terse. Do not sign or broadcast.`}:a.action==="ta"?{text:null,buttons:null,prompt:`TA artifact ${i.id}. Prior: ${i.summary||i.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 ${i.id}. Prior: ${i.summary||i.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 ${i.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 ${i.id}. Prior: ${i.summary||i.title}. Size from the connected HL account. Execute only on CONFIRM on the graph. Never sign from Telegram.`}:l.allowed?{text:`Queued unsigned prepare for ${i.id}. Nothing signed. Allow/Deny still required.`,buttons:u,prompt:null,prepare:{artifactId:i.id,unsigned:!0,broadcast:!1}}:{text:`Prepare blocked \u2014 ${l.reason}. Deepen and Refresh still work.`,buttons:u,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),i=Ie(s,{...t,id:a},{now:r}),l=A({grant:e},{now:r});return{text:G({...i,grant:e}),replyMarkup:Y({artifactId:i.id,openUrl:i.openUrl,hasGrant:l.allowed}).replyMarkup,artifact:i,state:s}}var U=`oracle telegram \u2014 TrueNorth-style interactive cards (native, no Hermes)
5
4
 
6
5
  oracle telegram link --owner <tg-id> --bot <username>
7
6
  oracle telegram redeem --token <32hex> --user <tg-id>
@@ -11,10 +10,10 @@ import{createHash as be,randomBytes as ke}from"node:crypto";import{mkdirSync as
11
10
 
12
11
  Native oracle-gateway uses the same module. Hermes is an optional adapter that
13
12
  must call this CLI instead of owning card state. Prepare is unsigned. Execute
14
- stays on Allow/Deny.`;function f(t,e){let r=t.indexOf(e);return r<0||r+1>=t.length?null:t[r+1]}function Z(t,e){return t.includes(e)}function Ie(){return q(L()),P()}function I(t){V(L(),t)}function S(t,e){t.write(JSON.stringify(e)+`
15
- `)}async function Ee(t=[],e={}){let r=e.out??process.stdout,i=e.err??process.stderr,a=t[0];if(!a||a==="--help"||a==="-h"||a==="help")return r.write(T+`
16
- `),0;let s=Ie();if(a==="link")try{let o=J(s,{ownerId:f(t,"--owner"),botUsername:f(t,"--bot")});return I(s),S(r,{ok:!0,...o}),0}catch(o){return i.write(String(o.message||o)+`
17
- `),1}if(a==="redeem"){let o=Q(s,{token:f(t,"--token"),telegramUserId:f(t,"--user")});return I(s),S(r,o),o.ok?0:1}if(a==="wrap")try{let o=X({id:f(t,"--id"),kind:f(t,"--kind")||"thesis",title:f(t,"--title")||"Oracle artifact",summary:f(t,"--summary")||"",openUrl:f(t,"--url"),source:"oracle-telegram"},{grant:Z(t,"--grant")?{local:!0}:null,state:s}),l=f(t,"--chat");return l&&B(s,{chatId:l,artifactId:o.artifact.id}),I(s),S(r,{ok:!0,text:o.text,replyMarkup:o.replyMarkup||null,artifactId:o.artifact.id,fallback:`Reply: deepen ${o.artifact.id} | refresh ${o.artifact.id}`}),0}catch(o){return i.write(String(o.message||o)+`
18
- `),1}if(a==="callback"){let o=G(s,{data:f(t,"--data"),chatId:f(t,"--chat"),grant:Z(t,"--grant")?{local:!0}:null});return I(s),o?(S(r,{ok:!0,...o}),0):(S(r,{ok:!1,error:"not an interactive card callback"}),1)}if(a==="continue"){let o=z(s,{chatId:f(t,"--chat"),text:f(t,"--text")});return S(r,{ok:!0,prompt:o}),0}return i.write(`unknown telegram verb '${a}'
19
- ${T}
20
- `),1}var Fe={name:"telegram",summary:"native interactive Telegram cards (TrueNorth-style, no Hermes)",group:"system",usage:T,run:t=>Ee(t.argv||[])};export{Fe as default,Ee as run};
13
+ stays on Allow/Deny.`;function f(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 Ee(){return W(P()),T()}function _(t){z(P(),t)}function C(t,e){t.write(JSON.stringify(e)+`
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(U+`
15
+ `),0;let a=Ee();if(s==="link")try{let i=Q(a,{ownerId:f(t,"--owner"),botUsername:f(t,"--bot")});return _(a),C(r,{ok:!0,...i}),0}catch(i){return o.write(String(i.message||i)+`
16
+ `),1}if(s==="redeem"){let i=Z(a,{token:f(t,"--token"),telegramUserId:f(t,"--user")});return _(a),C(r,i),i.ok?0:1}if(s==="wrap")try{let i=ee({id:f(t,"--id"),kind:f(t,"--kind")||"thesis",title:f(t,"--title")||"Oracle artifact",summary:f(t,"--summary")||"",openUrl:f(t,"--url"),source:"oracle-telegram"},{grant:te(t,"--grant")?{local:!0}:null,state:a}),l=f(t,"--chat");return l&&B(a,{chatId:l,artifactId:i.artifact.id}),_(a),C(r,{ok:!0,text:i.text,replyMarkup:i.replyMarkup||null,artifactId:i.artifact.id,fallback:`Reply: deepen ${i.artifact.id} | refresh ${i.artifact.id}`}),0}catch(i){return o.write(String(i.message||i)+`
17
+ `),1}if(s==="callback"){let i=X(a,{data:f(t,"--data"),chatId:f(t,"--chat"),grant:te(t,"--grant")?{local:!0}:null});return _(a),i?(C(r,{ok:!0,...i}),0):(C(r,{ok:!1,error:"not an interactive card callback"}),1)}if(s==="continue"){let i=J(a,{chatId:f(t,"--chat"),text:f(t,"--text")});return C(r,{ok:!0,prompt:i}),0}return o.write(`unknown telegram verb '${s}'
18
+ ${U}
19
+ `),1}var Ke={name:"telegram",summary:"native interactive Telegram cards (TrueNorth-style, no Hermes)",group:"system",usage:U,run:t=>ve(t.argv||[])};export{Ke as default,ve as run};