@oracle-agent/oracle 0.12.0 → 0.13.1
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 +31 -4
- package/SETUP.md +5 -2
- package/artifacts/specialist-packs/oracle-full-crypto.json +3 -0
- package/dist/address-book.mjs +2 -2
- package/dist/assets/profiles/_template/SOUL.md +54 -0
- package/dist/assets/profiles/_template/profile.json +22 -0
- package/dist/assets/profiles/bitcoin-agent/SOUL.md +31 -0
- package/dist/assets/profiles/bitcoin-agent/profile.json +32 -0
- package/dist/assets/profiles/hyperliquid-agent/SOUL.md +34 -0
- package/dist/assets/profiles/hyperliquid-agent/profile.json +38 -0
- package/dist/assets/profiles/oracle/SOUL.md +134 -0
- package/dist/assets/profiles/oracle/profile.json +40 -0
- package/dist/assets/profiles/polymarket-agent/SOUL.md +35 -0
- package/dist/assets/profiles/polymarket-agent/profile.json +34 -0
- package/dist/assets/profiles/profile.schema.json +90 -0
- package/dist/assets/profiles/protocol-builder/SOUL.md +57 -0
- package/dist/assets/profiles/protocol-builder/profile.json +39 -0
- package/dist/assets/profiles/robinhood-agent/SOUL.md +53 -0
- package/dist/assets/profiles/robinhood-agent/profile.json +41 -0
- package/dist/assets/profiles/solana-agent/SOUL.md +37 -0
- package/dist/assets/profiles/solana-agent/profile.json +38 -0
- package/dist/assets/profiles/stable-agent/SOUL.md +43 -0
- package/dist/assets/profiles/stable-agent/profile.json +38 -0
- package/dist/assets/skills/balance/SKILL.md +176 -0
- package/dist/assets/skills/bitcoin-l1.md +33 -0
- package/dist/assets/skills/chain-defi-ecosystem-profiling.md +27 -0
- package/dist/assets/skills/evm-contract-research.md +27 -0
- package/dist/assets/skills/hyperliquid.md +26 -0
- package/dist/assets/skills/multichain-exec-desk.md +33 -0
- package/dist/assets/skills/oracle-action-semantics/SKILL.md +40 -0
- package/dist/assets/skills/oracle-best-execution/SKILL.md +127 -0
- package/dist/assets/skills/oracle-best-execution.md +27 -0
- package/dist/assets/skills/oracle-bitcoin/SKILL.md +53 -0
- package/dist/assets/skills/oracle-chain-graphs-telegram-cards/SKILL.md +59 -0
- package/dist/assets/skills/oracle-chat/SKILL.md +61 -0
- package/dist/assets/skills/oracle-chat/chain.SKILL.md +31 -0
- package/dist/assets/skills/oracle-chat/setup.SKILL.md +37 -0
- package/dist/assets/skills/oracle-circuit-breaker/SKILL.md +51 -0
- package/dist/assets/skills/oracle-contract-research/SKILL.md +55 -0
- package/dist/assets/skills/oracle-desk/SKILL.md +58 -0
- package/dist/assets/skills/oracle-desk.md +27 -0
- package/dist/assets/skills/oracle-dex-launch/SKILL.md +38 -0
- package/dist/assets/skills/oracle-equities/SKILL.md +62 -0
- package/dist/assets/skills/oracle-grants/SKILL.md +69 -0
- package/dist/assets/skills/oracle-hypercore-staking/SKILL.md +57 -0
- package/dist/assets/skills/oracle-hyperliquid/SKILL.md +56 -0
- package/dist/assets/skills/oracle-meme-token-sniper/SKILL.md +73 -0
- package/dist/assets/skills/oracle-multichain-nft-launch/SKILL.md +338 -0
- package/dist/assets/skills/oracle-multichain-token-launch/SKILL.md +300 -0
- package/dist/assets/skills/oracle-nft-gacha-launch/SKILL.md +48 -0
- package/dist/assets/skills/oracle-nft-mint-gas-war/SKILL.md +63 -0
- package/dist/assets/skills/oracle-polymarket/SKILL.md +60 -0
- package/dist/assets/skills/oracle-protocol-builder/SKILL.md +59 -0
- package/dist/assets/skills/oracle-protocol-security/SKILL.md +60 -0
- package/dist/assets/skills/oracle-public-product/SKILL.md +44 -0
- package/dist/assets/skills/oracle-receipts/SKILL.md +52 -0
- package/dist/assets/skills/oracle-receipts.md +29 -0
- package/dist/assets/skills/oracle-rfq-tokenized-assets/SKILL.md +69 -0
- package/dist/assets/skills/oracle-smart-wallet-scanner/SKILL.md +49 -0
- package/dist/assets/skills/oracle-solana/SKILL.md +65 -0
- package/dist/assets/skills/oracle-solana-nft/SKILL.md +54 -0
- package/dist/assets/skills/oracle-token-research/SKILL.md +67 -0
- package/dist/assets/skills/solana.md +22 -0
- package/dist/bin/desk-server.mjs +56 -11
- package/dist/bin/oracle-data-mcp.mjs +6 -6
- package/dist/bin/oracle-equities.mjs +20 -0
- package/dist/bin/oracle-init.mjs +19 -19
- package/dist/bin/oracle-public-server.mjs +4 -4
- package/dist/bin/oracle-route.mjs +13 -13
- package/dist/bin/oracle-scan.mjs +10 -10
- package/dist/bin/oracle.mjs +35 -27
- package/dist/cli/commands/auth.mjs +11 -11
- package/dist/cli/commands/bootstrap.mjs +6 -6
- package/dist/cli/commands/chain.mjs +12 -12
- package/dist/cli/commands/chat.mjs +39 -29
- package/dist/cli/commands/data-mcp.mjs +2 -2
- package/dist/cli/commands/data.mjs +5 -5
- package/dist/cli/commands/doctor.mjs +3 -3
- package/dist/cli/commands/equities.mjs +15 -0
- package/dist/cli/commands/farm.mjs +59 -0
- package/dist/cli/commands/follow.mjs +28 -0
- package/dist/cli/commands/gate.mjs +4 -4
- package/dist/cli/commands/harness.mjs +15 -0
- package/dist/cli/commands/init.mjs +3 -3
- package/dist/cli/commands/mcp.mjs +50 -23
- package/dist/cli/commands/model.mjs +44 -34
- package/dist/cli/commands/plugins.mjs +38 -0
- package/dist/cli/commands/prepare.mjs +2 -2
- package/dist/cli/commands/public.mjs +3 -3
- package/dist/cli/commands/resolve.mjs +23 -0
- package/dist/cli/commands/route.mjs +2 -2
- package/dist/cli/commands/scan.mjs +2 -2
- package/dist/cli/commands/setup.mjs +12 -12
- package/dist/cli/commands/sign.mjs +19 -2
- package/dist/cli/commands/swap.mjs +36 -0
- package/dist/cli/commands/upgrade.mjs +2 -2
- package/dist/cli/commands/version.mjs +2 -2
- package/dist/data/desk-data.mjs +53 -10
- package/dist/data/names.mjs +2 -0
- package/dist/data/providers/farming.mjs +2 -0
- package/dist/equities/index.mjs +1 -0
- package/dist/index.mjs +58 -15
- package/dist/public-api/agent-grants.mjs +3 -0
- package/dist/router/index.mjs +2 -2
- package/dist/scanner/index.mjs +3 -3
- package/package.json +8 -3
- package/public/oracle-splash/_variants/ice.html +2073 -0
- package/public/oracle-splash/_variants/ivory.html +2075 -0
- package/public/oracle-splash/assets/agents/claude.png +0 -0
- package/public/oracle-splash/assets/agents/codex.png +0 -0
- package/public/oracle-splash/assets/desktop-app.jpg +0 -0
- package/public/oracle-splash/assets/hero/cli-session-poster.jpg +0 -0
- package/public/oracle-splash/assets/hero/cli-session.mp4 +0 -0
- package/public/oracle-splash/assets/hero/cli-session.webm +0 -0
- package/public/oracle-splash/assets/hero/orb-poster.jpg +0 -0
- package/public/oracle-splash/assets/hero/orb.webm +0 -0
- package/public/oracle-splash/assets/hero/risk-session-poster.jpg +0 -0
- package/public/oracle-splash/assets/hero/risk-session.mp4 +0 -0
- package/public/oracle-splash/assets/hero/risk-session.webm +0 -0
- package/public/oracle-splash/assets/hero/route-session-poster.jpg +0 -0
- package/public/oracle-splash/assets/hero/route-session.mp4 +0 -0
- package/public/oracle-splash/assets/hero/route-session.webm +0 -0
- package/public/oracle-splash/downloads/index.html +241 -0
- package/public/oracle-splash/index.html +1211 -242
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import l from"node:fs";import p from"node:path";import{spawnSync as D}from"node:child_process";import S from"node:os";import f from"node:path";import{fileURLToPath as k}from"node:url";var x=f.dirname(k(import.meta.url)),H=f.resolve(x,"../..");function v(){return process.env.ORACLE_FAKE_HOME||S.homedir()}function b(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function y(){return b()?process.env.ORACLE_CONFIG_DIR||f.join(v(),".config","oracle"):f.join(v(),".config","oracle")}import c from"node:fs";import u from"node:path";var d="https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",P=/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?:\.[a-z0-9]+(?:[._-][a-z0-9]+)*)*$/;function C(n){let e=[],t=[];if(!n||typeof n!="object"||Array.isArray(n))return e.push("plugin.json must be a JSON object"),{valid:!1,errors:e,warnings:t};n.$schema!==d&&(n.$schema?e.push(`unsupported $schema: ${n.$schema} (expected ${d})`):e.push("$schema is required \u2014 must be "+d)),!n.name||typeof n.name!="string"?e.push("name is required (string)"):P.test(n.name)||e.push(`name "${n.name}" must be kebab-case dot-separated (e.g. deployment.tools)`),(n.version===void 0||n.version===null||n.version==="")&&t.push("version is missing \u2014 semantic versioning recommended"),n.description!==void 0&&typeof n.description!="string"&&t.push("description must be a string"),n.author!==void 0&&(typeof n.author!="object"||Array.isArray(n.author))&&t.push("author must be an object with optional name, email, url"),n.keywords!==void 0&&(Array.isArray(n.keywords)||t.push("keywords must be an array")),n.license!==void 0&&typeof n.license!="string"&&t.push("license must be a string");let s=new Set(["$schema","name","version","description","author","homepage","repository","license","keywords","extensions"]);for(let r of Object.keys(n))s.has(r)||t.push(`unknown field "${r}" \u2014 will be ignored (use extensions.<namespace> for client data)`);return{valid:e.length===0,errors:e,warnings:t}}function E(n){let e=u.join(n,"skills"),t=[];if(!c.existsSync(e)||!c.statSync(e).isDirectory())return t;function s(r,i=""){for(let o of c.readdirSync(r,{withFileTypes:!0})){let a=u.join(r,o.name);if(o.isDirectory())s(a,i?`${i}/${o.name}`:o.name);else if(o.name.endsWith(".md")){let w=i?`${i}/${o.name.replace(/\.md$/,"")}`:o.name.replace(/\.md$/,"");t.push({name:w,path:a,relativePath:u.relative(e,a)})}}}return s(e),t}function A(n){let e=u.join(n,"mcp"),t=[];if(!c.existsSync(e)||!c.statSync(e).isDirectory())return t;for(let s of c.readdirSync(e,{withFileTypes:!0})){if(!s.isFile()||!s.name.endsWith(".json"))continue;let r=u.join(e,s.name);try{let i=JSON.parse(c.readFileSync(r,"utf8"));t.push({name:s.name.replace(/\.json$/,""),path:r,config:i})}catch(i){t.push({name:s.name.replace(/\.json$/,""),path:r,error:`invalid JSON: ${i.message}`})}}return t}function g(n){let e=u.resolve(n);if(!c.existsSync(e)||!c.statSync(e).isDirectory())return{ok:!1,error:`plugin directory not found: ${e}`};let t=u.join(e,"plugin.json");if(!c.existsSync(t))return{ok:!1,error:`missing plugin.json in ${e}`};let s;try{s=JSON.parse(c.readFileSync(t,"utf8"))}catch(a){return{ok:!1,error:`invalid plugin.json: ${a.message}`}}let r=C(s);if(!r.valid)return{ok:!1,error:"manifest validation failed",errors:r.errors};let i=E(e),o=A(e);return{ok:!0,plugin:{name:s.name,version:s.version||"0.0.0",description:s.description||"",author:s.author||{},license:s.license||"UNLICENSED",root:e,manifest:s,skills:i,mcpServers:o,warnings:[...r.warnings]}}}function $(n){let e=[];if(!c.existsSync(n))return e;for(let t of c.readdirSync(n,{withFileTypes:!0})){if(!t.isDirectory())continue;let s=u.join(n,t.name),r=g(s);r.ok&&e.push(r.plugin)}return e}function m(){let n=p.join(y(),"plugins");return l.existsSync(n)||l.mkdirSync(n,{recursive:!0}),n}function h(){return["oracle plugins \u2014 manage Agent Plugins (https://agent-plugins.org/)",""," oracle plugins install <path> install from a local directory"," oracle plugins install <git-url> clone a repo and install"," oracle plugins list show installed plugins"," oracle plugins remove <name> uninstall a plugin"," oracle plugins scan <path> validate without installing"," oracle plugins setup interactive setup wizard","","plugins are installed to ~/.config/oracle/plugins/<name>/",`schema: ${d}`].join(`
|
|
2
|
+
`)}function j(n,{name:e}={}){let t=p.resolve(n);if(!l.existsSync(t)||!l.statSync(t).isDirectory())return process.stderr.write(`error: ${n} is not a directory
|
|
3
|
+
`),1;let s=g(t);if(!s.ok){if(process.stderr.write(`error: invalid plugin at ${t}
|
|
4
|
+
`),s.errors)for(let a of s.errors)process.stderr.write(` - ${a}
|
|
5
|
+
`);return 1}let r=s.plugin,i=e||r.name.replace(/\//g,"-"),o=p.join(m(),i);if(l.existsSync(o))return process.stderr.write(`plugin "${i}" already installed. use oracle plugins remove first.
|
|
6
|
+
`),1;if(l.cpSync(t,o,{recursive:!0}),process.stdout.write(`installed ${r.name} (v${r.version}) to ${o}
|
|
7
|
+
`),process.stdout.write(` ${r.skills.length} skills, ${r.mcpServers.length} MCP servers
|
|
8
|
+
`),r.warnings.length)for(let a of r.warnings)process.stdout.write(` warning: ${a}
|
|
9
|
+
`);return 0}function _(n){let e=p.join(m(),".tmp-"+Date.now());try{let t=D("git",["clone","--depth","1",n,e],{stdio:"pipe",timeout:6e4});return t.status!==0?(process.stderr.write(`error: git clone failed: ${String(t.stderr).slice(0,200)}
|
|
10
|
+
`),1):j(e)}finally{try{l.rmSync(e,{recursive:!0,force:!0})}catch{}}}function O(){let n=$(m());if(!n.length)return process.stdout.write(`no plugins installed
|
|
11
|
+
`),process.stdout.write(`install with: oracle plugins install <path|url>
|
|
12
|
+
`),0;process.stdout.write(`${n.length} plugin(s) installed
|
|
13
|
+
|
|
14
|
+
`);for(let e of n){let t=p.basename(e.root);process.stdout.write(` ${e.name} (v${e.version})
|
|
15
|
+
`),process.stdout.write(` path: ${e.root}
|
|
16
|
+
`),e.description&&process.stdout.write(` desc: ${e.description}
|
|
17
|
+
`),process.stdout.write(` ${e.skills.length} skills, ${e.mcpServers.length} MCP servers
|
|
18
|
+
`),e.license!=="UNLICENSED"&&process.stdout.write(` license: ${e.license}
|
|
19
|
+
`),process.stdout.write(`
|
|
20
|
+
`)}return 0}function R(n){if(!n)return process.stderr.write(`usage: oracle plugins remove <name>
|
|
21
|
+
`),1;let e=p.join(m(),n);return l.existsSync(e)?(l.rmSync(e,{recursive:!0,force:!0}),process.stdout.write(`removed plugin "${n}"
|
|
22
|
+
`),0):(process.stderr.write(`plugin "${n}" not found
|
|
23
|
+
`),1)}function M(n){let e=p.resolve(n),t=g(e);if(!t.ok){if(process.stderr.write(`invalid plugin: ${t.error}
|
|
24
|
+
`),t.errors)for(let r of t.errors)process.stderr.write(` error: ${r}
|
|
25
|
+
`);return 1}let s=t.plugin;process.stdout.write(`valid plugin: ${s.name} (v${s.version})
|
|
26
|
+
`),process.stdout.write(` schema: ${s.manifest.$schema}
|
|
27
|
+
`),process.stdout.write(` skills: ${s.skills.length} found
|
|
28
|
+
`);for(let r of s.skills)process.stdout.write(` - ${r.name} (${r.relativePath})
|
|
29
|
+
`);process.stdout.write(` mcp servers: ${s.mcpServers.length} found
|
|
30
|
+
`);for(let r of s.mcpServers){let i=r.error?`ERROR: ${r.error}`:"ok";process.stdout.write(` - ${r.name}: ${i}
|
|
31
|
+
`)}if(s.warnings.length){process.stdout.write(` warnings:
|
|
32
|
+
`);for(let r of s.warnings)process.stdout.write(` - ${r}
|
|
33
|
+
`)}return 0}function N(){return process.stdout.write(["oracle plugins setup","","Agent Plugins (https://agent-plugins.org/) is an open standard for","portable AI agent tooling. Plugins ship skills and MCP servers in a","standard package format that works across compatible clients.","","To create a plugin:"," 1. Create a directory with a plugin.json manifest"," 2. Add skills as .md files in skills/"," 3. Add MCP server configs as .json files in mcp/"," 4. Validate: oracle plugins scan <dir>"," 5. Install: oracle plugins install <dir>","","To install an existing plugin:"," oracle plugins install <path> local directory"," oracle plugins install <git-url> git repository","",`schema: ${d}`,""].join(`
|
|
34
|
+
`)),0}var V={name:"plugins",summary:"manage Agent Plugins (open-standard portable agent tooling)",group:"read",usage:h(),async run(n){let e=[...n.argv],t=(e[0]||"help").toLowerCase(),s=e.slice(1);if(t==="-h"||t==="--help"||t==="help")return process.stdout.write(h()+`
|
|
35
|
+
`),0;if(t==="list"||t==="ls")return O();if(t==="install"||t==="add"){let r=s[0];return r?r.startsWith("http://")||r.startsWith("https://")||r.startsWith("git@")?_(r):j(r):(process.stderr.write(`usage: oracle plugins install <path|url>
|
|
36
|
+
`),1)}return t==="remove"||t==="rm"||t==="uninstall"?R(s[0]):t==="scan"||t==="validate"?M(s[0]||"."):t==="setup"?N():(process.stderr.write(`oracle plugins: unknown verb '${t}'
|
|
37
|
+
${h()}
|
|
38
|
+
`),1)}};export{V as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{spawnSync as
|
|
2
|
-
`),1):typeof r.status=="number"?r.status:1}};export{
|
|
1
|
+
import{spawnSync as t}from"node:child_process";var s={name:"prepare",summary:"build an unsigned swap (alias of route prepare)",group:"read",usage:"oracle prepare <chain> <tokenIn> <tokenOut> <taker> [amt]",async run(e){let a=e.bin("oracle-route.mjs"),r=t(process.execPath,[a,"prepare",...e.argv],{stdio:"inherit"});return r.error?(process.stderr.write(`oracle: failed to spawn oracle-route: ${r.error.message}
|
|
2
|
+
`),1):typeof r.status=="number"?r.status:1}};export{s as default};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import
|
|
2
|
-
`),l(1))}),e.once("exit",(r,t)=>{if(i)return;i=!0,u();let f=a||t;if(f){process.kill(process.pid,f);return}l(r??1)})})}var
|
|
3
|
-
`),1;let
|
|
1
|
+
import{parseArgs as v}from"node:util";import{spawn as g}from"node:child_process";var m=["SIGINT","SIGTERM","SIGHUP"];function d(s,c=[],o={},n=s){return new Promise(l=>{let e=g(s,c,o),i=!1,a=null,p=new Map(m.map(r=>[r,()=>{a||=r,e.exitCode===null&&e.signalCode===null&&e.kill(r)}]));for(let[r,t]of p)process.on(r,t);let u=()=>{for(let[r,t]of p)process.off(r,t)};e.once("error",r=>{i||(i=!0,u(),process.stderr.write(`oracle: could not start ${n}: ${r.message}
|
|
2
|
+
`),l(1))}),e.once("exit",(r,t)=>{if(i)return;i=!0,u();let f=a||t;if(f){process.kill(process.pid,f);return}l(r??1)})})}var S={name:"public",summary:"secret-free public HTTP surface",group:"read",usage:"oracle public serve [--port N]",async run(s){if((s.argv[0]||"serve")!=="serve")return process.stderr.write(`usage: oracle public serve [--port N]
|
|
3
|
+
`),1;let o=null;try{let{values:e}=v({args:s.argv.slice(1),options:{port:{type:"string"}},allowPositionals:!0,strict:!1});o=e.port||null}catch{}let n={...process.env};o&&(n.ORACLE_PUBLIC_PORT=String(o));let l=s.bin("oracle-public-server.mjs");return d(process.execPath,[l],{stdio:"inherit",env:n},"oracle-public-server")}};export{S as default};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import{keccak_256 as S}from"@noble/hashes/sha3.js";import{createHash as q}from"node:crypto";var X=new Set([408,425,429,500,502,503,504]),v=new Set(["GET","HEAD","OPTIONS","PUT","DELETE"]),K=2,C=4e3,T=["authorization","x-api-key","x-tensor-api-key","0x-api-key","api-key","cookie","proxy-authorization"],Z=new Set([301,302,303,307,308]),I=3;function Q(t){let e=String(t||"").toLowerCase();return T.includes(e)||/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(e)}function ee(t){let e={};for(let[n,r]of Object.entries(t||{}))Q(n)||(e[n]=r);return e}function te(t,e){if(!t)throw new Error(`HTTP redirect from ${e} missing Location`);let n=new URL(String(t),String(e));if(n.protocol!=="http:"&&n.protocol!=="https:")throw new Error(`HTTP redirect from ${e} used unsupported protocol ${n.protocol}`);return n.toString()}function ne(t,e){return new URL(String(t)).origin===new URL(String(e)).origin}var R=new Map;function re(t,e,n){let r={};for(let[c,b]of Object.entries(n||{}))r[c.toLowerCase()]=b;let o=Object.keys(r).filter(c=>/(^|-)(api[-_]?key|key|token|secret|auth|authorization|session|cookie|signature|access)(-|$)/.test(c)),a=[...new Set([...T,...o])].sort().map(c=>`${c}=${r[c]??""}`).join(`
|
|
2
|
+
`),i=q("sha256").update(a).digest("hex").slice(0,32);return`${t} ${e} ${i}`}function oe(t,e){let n=Number(e);return Number.isFinite(n)&&n>0?Math.min(n*1e3,C):Math.min(250*2**t,C)+Math.floor(Math.random()*100)}var se=t=>new Promise(e=>setTimeout(e,t));async function ce(t,{fetchImpl:e,method:n,headers:r,body:o,timeoutMs:s}){let a=new AbortController,i=setTimeout(()=>a.abort(),s);try{let c=String(t),b={...r||{}};for(let h=0;h<=I;h+=1){let u=await e(c,{method:n,headers:b,body:o,signal:a.signal,redirect:"manual"}),p=await u.text(),f=null;if(p)try{f=JSON.parse(p)}catch{f=null}if(Z.has(u.status)){if(n!=="GET"&&n!=="HEAD"){let d=new Error(`HTTP ${u.status} ${n} ${c} redirected non-idempotent request`);throw d.status=u.status,d.body=f??p.slice(0,300),d}if(h===I)throw new Error(`HTTP redirect loop for ${t}`);let l=te(u.headers?.get?.("location"),c);ne(l,c)||(b=ee(b)),c=l;continue}if(!u.ok){let l=new Error(`HTTP ${u.status} ${n} ${c}`);throw l.status=u.status,l.retryAfter=u.headers?.get?.("retry-after")??null,l.body=f??p.slice(0,300),l}return f??p}throw new Error(`HTTP redirect loop for ${t}`)}finally{clearTimeout(i)}}async function N(t,e={}){let n=e.fetchImpl||globalThis.fetch;if(typeof n!="function")throw new Error("fetch unavailable \u2014 pass opts.fetchImpl");let r=e.timeoutMs??12e3,o=(e.method||"GET").toUpperCase(),s={Accept:"application/json",...e.headers||{}},a=e.body;a!=null&&typeof a!="string"&&(s["Content-Type"]=s["Content-Type"]||"application/json",a=JSON.stringify(a));let i=Number.isInteger(e.retries)?Math.max(e.retries,0):K,c=async()=>{let f;for(let l=0;l<=i;l++)try{return await ce(t,{fetchImpl:n,method:o,headers:s,body:a,timeoutMs:r})}catch(d){f=d;let E=d?.status,G=d?.name==="AbortError",J=new Set([408,425,429]),W=E!=null?J.has(E)||X.has(E)&&v.has(o):!G&&v.has(o);if(l===i||!W)throw d;await se(oe(l,d?.retryAfter))}throw f};if(!(e.dedupe!==!1&&o==="GET"&&a==null))return c();let h=re(o,t,s),u=R.get(h);if(u)return u;let p=c().finally(()=>R.delete(h));return R.set(h,p),p}var k={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}},ae=new Map(Object.values(k).map(t=>[t.chainId,t]));function L(t){return ae.get(Number(t))||null}function P(t,e=process.env){let n=L(t);if(!n)return null;for(let r of n.rpcEnv){let o=(e[r]||"").trim();if(o)return o}return null}import{Interface as ie,getAddress as ke}from"ethers";var Le=new ie(["function allowance(address owner,address spender) view returns (uint256)","function balanceOf(address account) view returns (uint256)"]);var ue={1:"https://ethereum.publicnode.com",137:"https://polygon-bor-rpc.publicnode.com",42161:"https://arbitrum-one-rpc.publicnode.com",8453:"https://base-rpc.publicnode.com",10:"https://optimism-rpc.publicnode.com",988:"https://rpc.stable.xyz",56:"https://bsc-rpc.publicnode.com",43114:"https://avalanche-c-chain-rpc.publicnode.com",999:"https://rpc.hyperliquid.xyz/evm",2741:"https://api.mainnet.abs.xyz",4663:"https://rpc.mainnet.chain.robinhood.com"};function le(t,{rpcUrl:e,env:n=process.env}={}){if(e)return e;let r=P(t,n);return r||ue[Number(t)]||null}var de=/^(?:eth_(?:call|blocknumber|chainid|get[a-z0-9]+|feehistory|gasprice|maxpriorityfeepergas|syncing|protocolversion|estimategas|createaccesslist)|net_(?:version|listening|peercount)|web3_(?:clientversion|sha3))$/;function pe(t){let e=String(t||""),n=e.toLowerCase();if(e!==e.trim()||!/^[a-zA-Z0-9_]+$/.test(e)||!de.test(n))throw new Error(`evm-rpc: ${e} refused \u2014 @oracle-agent/oracle is prepare-only (read RPC only; no broadcast/sign)`);return n}async function $(t,e,n=[],r={}){let o=String(e||"");pe(o);let s=le(t,r);if(!s)throw new Error(`No RPC URL for chainId ${t} (set env from chain registry rpcEnv or pass rpcUrl)`);let i=await N(s,{method:"POST",body:{jsonrpc:"2.0",id:1,method:e,params:n},fetchImpl:r.fetchImpl,timeoutMs:r.timeoutMs??12e3});if(i?.error){let c=new Error(i.error.message||JSON.stringify(i.error));throw c.code=i.error.code,c}return i.result}var g=999,x=1,fe=8453,H="0x1d9d87eBc14e71490bB87f1C39F65BDB979f3cb7",he="0x4d5e4ed4D5e4A160Fa136853597cDc2eBBe66494",B="0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",me="0xC6d566A56A1aFf6508b41f6c90ff131615583BCD",we=".80002105.reverse",_=/^0x[a-fA-F0-9]{40}$/,U=new TextEncoder,M=t=>"0x"+Buffer.from(t).toString("hex"),m=t=>M(S(U.encode(t))).slice(0,10),O=t=>t.toLowerCase().replace(/^0x/,"").padStart(64,"0");function y(t){let e=new Uint8Array(32);if(t)for(let n of String(t).split(".").reverse()){let r=S(U.encode(n)),o=new Uint8Array(64);o.set(e,0),o.set(r,32),e=S(o)}return M(e)}function A(t){if(!t||t==="0x"||/^0x0*$/.test(t))return"";try{let e=t.slice(2),n=parseInt(e.slice(0,64),16)*2,r=parseInt(e.slice(n,n+64),16);if(!Number.isFinite(r)||r<=0)return"";let o=e.slice(n+64,n+64+r*2);return Buffer.from(o,"hex").toString("utf8")}catch{return""}}async function w(t,e,n){try{return await $(t,"eth_call",[{to:e,data:n},"latest"])}catch{return null}}async function be(t){let e=await w(g,H,m("primaryName(address)")+O(t)),n=A(e);return n?n.endsWith(".hl")?n:`${n}.hl`:null}async function ye(t){let e=await w(g,he,m("getName(address)")+O(t)),n=A(e);return n?n.endsWith(".hype")?n:`${n}.hype`:null}async function D(t,e,n){let r=await w(t,n,m("name(bytes32)")+e.slice(2));return A(r)||null}async function Ee(t){let e=y(`${t.slice(2).toLowerCase()}.addr.reverse`),n=await w(x,B,m("resolver(bytes32)")+e.slice(2));if(!n)return null;let r="0x"+n.slice(-40);return/^0x0+$/.test(r)?null:D(x,e,r)}async function Re(t){let e=y(t.slice(2).toLowerCase()+we);return D(fe,e,me)}var F=[{source:"hl",fn:be},{source:"hype",fn:ye},{source:"ens",fn:Ee},{source:"basename",fn:Re}];async function j(t){if(!_.test(String(t||"").trim()))return null;let e=String(t).trim();for(let{source:n,fn:r}of F){let o=await r(e);if(o)return{name:o,source:n,address:e}}return null}async function Se(t){let e=y(t),n=await w(g,H,m("ownerOf(uint256)")+e.slice(2));if(!n||n.length<66)return null;let r="0x"+n.slice(-40);return/^0x0+$/.test(r)?null:r}async function xe(t,e,n){let r=y(e),o=await w(t,n,m("resolver(bytes32)")+r.slice(2));if(!o)return null;let s="0x"+o.slice(-40);if(/^0x0+$/.test(s))return null;let a=await w(t,s,m("addr(bytes32)")+r.slice(2));if(!a)return null;let i="0x"+a.slice(-40);return/^0x0+$/.test(i)?null:i}async function V(t){let e=String(t||"").trim().toLowerCase();if(!e||!e.includes("."))return null;if(e.endsWith(".hl")){let n=await Se(e);return n?{address:n,source:"hl",name:e}:null}if(e.endsWith(".eth")){let n=await xe(x,e,B);return n?{address:n,source:e.endsWith(".base.eth")?"basename":"ens",name:e}:null}return null}var z=F.map(t=>t.source);var Y=`oracle resolve <name-or-address> [--json]
|
|
3
|
+
|
|
4
|
+
oracle resolve demi.hl
|
|
5
|
+
oracle resolve vitalik.eth
|
|
6
|
+
oracle resolve 0x4d47b6757afd42c3dbd9691b71b43d74afa4b6b2
|
|
7
|
+
|
|
8
|
+
Reads on-chain name records. No API key: HL Names publishes a paid REST API,
|
|
9
|
+
but the contract answers primaryName(address) for free.
|
|
10
|
+
|
|
11
|
+
Sources, in priority order: ${z.join(", ")}.`;async function ge(t=[]){let e=t.filter(o=>o!=="--json"),n=t.includes("--json"),r=(e[0]||"").trim();if(!r||r==="--help"||r==="-h")return process.stdout.write(Y+`
|
|
12
|
+
`),r?0:1;try{if(_.test(r)){let s=await j(r);return n?(process.stdout.write(JSON.stringify({address:r,name:s?.name??null,source:s?.source??null})+`
|
|
13
|
+
`),0):s?(process.stdout.write(`${r}
|
|
14
|
+
${s.name} [${s.source}]
|
|
15
|
+
`),0):(process.stdout.write(`${r}
|
|
16
|
+
no name record found
|
|
17
|
+
`),0)}let o=await V(r);return n?(process.stdout.write(JSON.stringify({name:r,address:o?.address??null,source:o?.source??null})+`
|
|
18
|
+
`),0):o?(process.stdout.write(`${r}
|
|
19
|
+
${o.address} [${o.source}]
|
|
20
|
+
`),0):(process.stdout.write(`${r}
|
|
21
|
+
unresolved (no owner record)
|
|
22
|
+
`),0)}catch(o){return process.stderr.write(`resolve failed: ${o?.message||o}
|
|
23
|
+
`),1}}var Me={name:"resolve",summary:"resolve .hl/.hype/.eth names to addresses and back",usage:Y,async run(t){return ge(t.argv||[])}};export{Me as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{spawnSync as
|
|
2
|
-
`),1):typeof r.status=="number"?r.status:1}};export{
|
|
1
|
+
import{spawnSync as o}from"node:child_process";var t={name:"route",summary:"swap/bridge prepare helpers",group:"read",usage:"oracle route <swap|bridge|prepare|prepare-bridge> ...",async run(e){let a=e.bin("oracle-route.mjs"),r=o(process.execPath,[a,...e.argv],{stdio:"inherit"});return r.error?(process.stderr.write(`oracle: failed to spawn oracle-route: ${r.error.message}
|
|
2
|
+
`),1):typeof r.status=="number"?r.status:1}};export{t as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{spawnSync as a}from"node:child_process";
|
|
2
|
-
`),1):typeof r.status=="number"?r.status:1}};export{
|
|
1
|
+
import{spawnSync as a}from"node:child_process";var o={name:"scan",summary:"chain scanner",group:"read",usage:"oracle scan <chains|head|token|pools|risk|quote|sell> ...",async run(e){let s=e.bin("oracle-scan.mjs"),r=a(process.execPath,[s,...e.argv],{stdio:"inherit"});return r.error?(process.stderr.write(`oracle: failed to spawn oracle-scan: ${r.error.message}
|
|
2
|
+
`),1):typeof r.status=="number"?r.status:1}};export{o as default};
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import{spawnSync as we}from"node:child_process";import{stdin as m,stdout as J}from"node:process";var j=Object.freeze([{key:"telegram",name:"telegram",hermes:["gateway","setup"],required:["TELEGRAM_BOT_TOKEN"],optional:["TELEGRAM_ALLOWED_USERS","TELEGRAM_PROXY"],note:"dms \xB7 groups \xB7 topics"},{key:"discord",name:"discord",hermes:["gateway","setup"],required:["DISCORD_BOT_TOKEN"],optional:["DISCORD_ALLOWED_USERS"],note:"dms \xB7 channels \xB7 threads"},{key:"slack",name:"slack",hermes:["gateway","setup"],required:["SLACK_BOT_TOKEN","SLACK_APP_TOKEN"],optional:["SLACK_ALLOWED_USERS"],note:"socket mode"},{key:"whatsapp",name:"whatsapp",hermes:["whatsapp"],required:[],optional:["WHATSAPP_ALLOWED_USERS","WHATSAPP_MODE"],note:"qr bridge"},{key:"whatsapp-cloud",name:"whatsapp cloud",hermes:["whatsapp-cloud"],required:[],optional:[],note:"business cloud api"},{key:"signal",name:"signal",hermes:["gateway","setup"],required:["SIGNAL_HTTP_URL","SIGNAL_ACCOUNT"],optional:["SIGNAL_ALLOWED_USERS"],note:"signal-cli rest bridge"},{key:"matrix",name:"matrix",hermes:["gateway","setup"],required:["MATRIX_HOMESERVER","MATRIX_ACCESS_TOKEN","MATRIX_USER_ID"],optional:["MATRIX_ALLOWED_USERS"],note:"rooms \xB7 dms"},{key:"mattermost",name:"mattermost",hermes:["gateway","setup"],required:["MATTERMOST_URL","MATTERMOST_TOKEN"],optional:["MATTERMOST_ALLOWED_USERS"],note:"channels \xB7 dms"},{key:"email",name:"email",hermes:["gateway","setup"],required:["EMAIL_ADDRESS","EMAIL_PASSWORD","EMAIL_IMAP_HOST","EMAIL_SMTP_HOST"],optional:[],note:"imap/smtp mailbox"},{key:"bluebubbles",name:"bluebubbles",hermes:["gateway","setup"],required:[],optional:[],note:"imessage via bluebubbles"},{key:"homeassistant",name:"homeassistant",hermes:["gateway","setup"],required:["HASS_URL","HASS_TOKEN"],optional:[],note:"smart home"},{key:"webhook",name:"webhook",hermes:["gateway","setup"],required:[],optional:[],note:"http ingress"},{key:"api-server",name:"api server",hermes:["gateway","setup"],required:[],optional:[],note:"local http api"},{key:"dingtalk",name:"dingtalk",hermes:["gateway","setup"],required:[],optional:[],note:"dingtalk bot"},{key:"feishu",name:"feishu",hermes:["gateway","setup"],required:[],optional:[],note:"feishu / lark"},{key:"wecom",name:"wecom",hermes:["gateway","setup"],required:[],optional:[],note:"wecom"},{key:"weixin",name:"weixin",hermes:["gateway","setup"],required:[],optional:[],note:"weixin"},{key:"qqbot",name:"qqbot",hermes:["gateway","setup"],required:[],optional:[],note:"qq bot"}]);function K(t){return String(t||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}function
|
|
1
|
+
import{spawnSync as we}from"node:child_process";import{stdin as m,stdout as J}from"node:process";var j=Object.freeze([{key:"telegram",name:"telegram",hermes:["gateway","setup"],required:["TELEGRAM_BOT_TOKEN"],optional:["TELEGRAM_ALLOWED_USERS","TELEGRAM_PROXY"],note:"dms \xB7 groups \xB7 topics"},{key:"discord",name:"discord",hermes:["gateway","setup"],required:["DISCORD_BOT_TOKEN"],optional:["DISCORD_ALLOWED_USERS"],note:"dms \xB7 channels \xB7 threads"},{key:"slack",name:"slack",hermes:["gateway","setup"],required:["SLACK_BOT_TOKEN","SLACK_APP_TOKEN"],optional:["SLACK_ALLOWED_USERS"],note:"socket mode"},{key:"whatsapp",name:"whatsapp",hermes:["whatsapp"],required:[],optional:["WHATSAPP_ALLOWED_USERS","WHATSAPP_MODE"],note:"qr bridge"},{key:"whatsapp-cloud",name:"whatsapp cloud",hermes:["whatsapp-cloud"],required:[],optional:[],note:"business cloud api"},{key:"signal",name:"signal",hermes:["gateway","setup"],required:["SIGNAL_HTTP_URL","SIGNAL_ACCOUNT"],optional:["SIGNAL_ALLOWED_USERS"],note:"signal-cli rest bridge"},{key:"matrix",name:"matrix",hermes:["gateway","setup"],required:["MATRIX_HOMESERVER","MATRIX_ACCESS_TOKEN","MATRIX_USER_ID"],optional:["MATRIX_ALLOWED_USERS"],note:"rooms \xB7 dms"},{key:"mattermost",name:"mattermost",hermes:["gateway","setup"],required:["MATTERMOST_URL","MATTERMOST_TOKEN"],optional:["MATTERMOST_ALLOWED_USERS"],note:"channels \xB7 dms"},{key:"email",name:"email",hermes:["gateway","setup"],required:["EMAIL_ADDRESS","EMAIL_PASSWORD","EMAIL_IMAP_HOST","EMAIL_SMTP_HOST"],optional:[],note:"imap/smtp mailbox"},{key:"bluebubbles",name:"bluebubbles",hermes:["gateway","setup"],required:[],optional:[],note:"imessage via bluebubbles"},{key:"photon",name:"photon",hermes:["photon"],required:["PHOTON_PROJECT_ID","PHOTON_PROJECT_SECRET"],optional:["PHOTON_ALLOWED_USERS","PHOTON_HOME_CHANNEL"],note:"imessage via spectrum (no mac)"},{key:"homeassistant",name:"homeassistant",hermes:["gateway","setup"],required:["HASS_URL","HASS_TOKEN"],optional:[],note:"smart home"},{key:"webhook",name:"webhook",hermes:["gateway","setup"],required:[],optional:[],note:"http ingress"},{key:"api-server",name:"api server",hermes:["gateway","setup"],required:[],optional:[],note:"local http api"},{key:"dingtalk",name:"dingtalk",hermes:["gateway","setup"],required:[],optional:[],note:"dingtalk bot"},{key:"feishu",name:"feishu",hermes:["gateway","setup"],required:[],optional:[],note:"feishu / lark"},{key:"wecom",name:"wecom",hermes:["gateway","setup"],required:[],optional:[],note:"wecom"},{key:"weixin",name:"weixin",hermes:["gateway","setup"],required:[],optional:[],note:"weixin"},{key:"qqbot",name:"qqbot",hermes:["gateway","setup"],required:[],optional:[],note:"qq bot"}]);function K(t){return String(t||"").trim().toLowerCase().replace(/^\/+/,"").replace(/\s+/g,"-")}function T(){return j.slice()}function v(t){let r=K(t);if(!r)return null;for(let e of j)if(e.key===r||K(e.name)===r)return e;return null}function W({profile:t="oracle",statuses:r={}}={}){let e=["oracle setup","","one oracle. many models. every connected channel.",`profile: ${t}`,"","messaging platforms:",""];for(let n of j){let s=r[n.key]||"unset";e.push(` ${n.key.padEnd(16)} ${String(s).padEnd(8)} ${n.note}`)}return e.push(""),e.push("commands:"),e.push(" oracle setup this menu"),e.push(" oracle setup messaging open hermes gateway setup"),e.push(" oracle setup telegram configure telegram bot token"),e.push(" oracle setup discord configure discord bot token"),e.push(" oracle setup status show configured platforms (no secrets)"),e.push(" oracle setup gateway start/status hermes gateway"),e.push(" /setup same menu inside chat"),e.push(""),e.push("notes:"),e.push(" tokens stay in the hermes profile .env on this machine"),e.push(" oracle never prints bot tokens or app secrets"),e.push(" after setup: hermes -p oracle gateway restart"),e.join(`
|
|
2
2
|
`)+`
|
|
3
|
-
`}import f from"node:fs";import
|
|
4
|
-
`),{mode:384});try{f.chmodSync(n,384)}catch{}return{path:n,key:r,set:!0}}function A(t="oracle"){let r=
|
|
5
|
-
`,{mode:384}),n}import l from"node:fs";import p from"node:path";import{createHash as
|
|
6
|
-
`)}function
|
|
3
|
+
`}import f from"node:fs";import se from"node:os";import C from"node:path";import Q from"node:fs";import ee from"node:os";import y from"node:path";import{fileURLToPath as te}from"node:url";var re=y.dirname(te(import.meta.url)),Ae=y.resolve(re,"../..");function S(){return process.env.ORACLE_FAKE_HOME||ee.homedir()}function ne(){return process.env.ORACLE_PUBLIC_DESKTOP==="1"}function _(){return ne()?process.env.ORACLE_CONFIG_DIR||y.join(S(),".config","oracle"):y.join(S(),".config","oracle")}function k(){return process.env.HERMES_HOME?y.resolve(process.env.HERMES_HOME):y.join(S(),".hermes")}function h(t){return Q.mkdirSync(t,{recursive:!0}),t}var oe=/(TOKEN|SECRET|PASSWORD|KEY|AUTH|PRIVATE|MNEMONIC|SEED)/i;function b(t="oracle"){return C.join(k(),"profiles",t,".env")}function ie(t){let r={};for(let e of String(t||"").split(/\r?\n/)){let n=e.trim();if(!n||n.startsWith("#"))continue;let s=n.indexOf("=");if(s<=0)continue;let i=n.slice(0,s).trim(),o=n.slice(s+1).trim();(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),r[i]=o}return r}function ae(t="oracle"){let r=b(t);return f.existsSync(r)?ie(f.readFileSync(r,"utf8")):{}}function B(t,r,e){if(!r||oe.test(r)===!1&&/[^A-Z0-9_]/.test(r),!/^[A-Z][A-Z0-9_]*$/.test(r)){let c=new Error(`invalid env key '${r}'`);throw c.code="BAD_KEY",c}if(e==null||String(e).trim()===""){let c=new Error(`empty value for ${r}`);throw c.code="EMPTY",c}let n=b(t);h(C.dirname(n));let s=f.existsSync(n)?f.readFileSync(n,"utf8"):"",i=s?s.split(/\r?\n/):[],o=[],a=!1,u=`${r}=${String(e)}`;for(let c of i)c.startsWith(`${r}=`)?(o.push(u),a=!0):(c.length||o.length)&&o.push(c);for(a||(o.length&&o[o.length-1]!==""&&o.push(""),o.push(u));o.length&&o[o.length-1]==="";)o.pop();o.push(""),f.writeFileSync(n,o.join(`
|
|
4
|
+
`),{mode:384});try{f.chmodSync(n,384)}catch{}return{path:n,key:r,set:!0}}function A(t="oracle"){let r=ae(t),e={};for(let n of T()){if(!n.required.length){e[n.key]="manual";continue}let s=n.required.filter(i=>!String(r[i]||"").trim());e[n.key]=s.length?"unset":"ready"}return{profile:t,statuses:e,envPath:b(t)}}function P(t="oracle"){let{statuses:r}=A(t);return W({profile:t,statuses:r})}function V(t,r,e,n={}){let s=v(r);if(!s){let o=new Error(`unknown platform '${r}'`);throw o.code="UNKNOWN_PLATFORM",o}if(!s.required.length){let o=new Error(`${s.key} uses hermes interactive setup (oracle setup messaging)`);throw o.code="NEEDS_INTERACTIVE",o}let i=s.required[0];B(t,i,e);for(let[o,a]of Object.entries(n||{}))a!=null&&String(a).trim()&&B(t,o,a);return{platform:s.key,set:s.required,profile:t,path:b(t)}}function ue(){return C.join(_(),"setup-state.json")}function R(t={}){h(_());let r=ue(),e={};if(f.existsSync(r))try{e=JSON.parse(f.readFileSync(r,"utf8"))}catch{e={}}let n={...e,...t,updatedAt:new Date().toISOString(),host:se.hostname()};return f.writeFileSync(r,JSON.stringify(n,null,2)+`
|
|
5
|
+
`,{mode:384}),n}import l from"node:fs";import p from"node:path";import{createHash as ce}from"node:crypto";import{spawnSync as E}from"node:child_process";var pe="0.19.0",Y=`hermes-agent==${pe}`,D=[3,11],$=[3,14],x="3.13",M="0.12.1",N=Object.freeze({posix:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${M}/uv-installer.sh`,sha256:"d3f5412d38c99f9d024901843bf98206f0d2c6dbe64df40d0b740e2751ca62c1"}),windows:Object.freeze({url:`https://github.com/astral-sh/uv/releases/download/${M}/uv-installer.ps1`,sha256:"b9ec035151bfbb11d616dbd69886498d885551489eddf095ea3c0ad59f640eb0"})});function le(t,{windows:r=process.platform==="win32"}={}){let e=Buffer.isBuffer(t)?t:Buffer.from(t),n=r?N.windows:N.posix,s=ce("sha256").update(e).digest("hex"),i=e.toString("utf8");return s===n.sha256&&i.length>=1e3&&i.includes(M)}function g(){return p.join(_(),"runtime")}function G(){return p.join(g(),"venv")}function U(t){let r=process.platform==="win32"?"Scripts":"bin",e=process.platform==="win32"?`${t}.exe`:t;return p.join(G(),r,e)}function L(){return U("hermes")}function fe(){let t=U("python3");return l.existsSync(t)?t:U("python")}function O(){return p.join(g(),"uv",process.platform==="win32"?"uv.exe":"uv")}function w(t){let r=process.platform==="win32"&&!p.extname(t)?["",".exe",".cmd",".bat"]:[""];for(let e of(process.env.PATH||"").split(p.delimiter))if(e)for(let n of r){let s=p.join(e,`${t}${n}`);try{if(l.existsSync(s))return s}catch{}}return null}function de(t){let r=/Python (\d+)\.(\d+)\.(\d+)/.exec(t||"");return r?[Number(r[1]),Number(r[2]),Number(r[3])]:null}function me(t){if(!t)return!1;let[r,e]=t;return!(r<D[0]||r===D[0]&&e<D[1]||r>$[0]||r===$[0]&&e>=$[1])}function he(){let t=[process.env.ORACLE_PYTHON,"python3.13","python3.12","python3.11","python3","python"].filter(Boolean);for(let r of t){let e=p.isAbsolute(r)?l.existsSync(r)?r:null:w(r);if(!e)continue;let n=E(e,["--version"],{encoding:"utf8",timeout:15e3}),s=de(`${n.stdout||""}${n.stderr||""}`);if(me(s))return{bin:e,version:s.join("."),source:"host"}}return null}function ge(){return process.env.ORACLE_UV_BIN||w("uv")||(l.existsSync(p.join(S(),".local","bin","uv"))?p.join(S(),".local","bin","uv"):null)||(l.existsSync(O())?O():null)}function ye(t,r){let e=["const fs=require('node:fs');","const [url,dest]=process.argv.slice(1);","fetch(url).then(r=>{if(!r.ok)throw new Error('http '+r.status);return r.arrayBuffer()})",".then(b=>fs.writeFileSync(dest,Buffer.from(b)))",".catch(e=>{console.error(e.message);process.exit(1)});"].join("");return E(process.execPath,["-e",e,t,r],{encoding:"utf8",timeout:2*6e4})}function Se({quiet:t=!1}={}){let r=ge();if(r)return{ok:!0,bin:r,reused:!0};h(g());let e=process.platform==="win32",n=p.join(g(),e?"uv-install.ps1":"uv-install.sh"),s=e?N.windows:N.posix,i=ye(s.url,n);if(i.status!==0)return{ok:!1,reason:`could not download the uv installer (${i.status})`,stderr:(i.stderr||"").slice(-800)};let o=l.readFileSync(n);if(!le(o,{windows:e}))return{ok:!1,reason:`uv ${M} installer checksum mismatch`};let a=p.dirname(O());h(a);let u=e?w("powershell.exe")||w("powershell"):w("sh")||"/bin/sh";if(!u)return{ok:!1,reason:e?"PowerShell not found":"sh not found"};let d=E(u,e?["-NoProfile","-ExecutionPolicy","Bypass","-File",n]:[n],{stdio:t?"pipe":"inherit",encoding:"utf8",timeout:5*6e4,env:{...process.env,UV_INSTALL_DIR:a,UV_NO_MODIFY_PATH:"1"}});return d.status!==0||!l.existsSync(O())?{ok:!1,reason:`uv install failed (${d.status})`,stderr:(d.stderr||"").slice(-800)}:{ok:!0,bin:O(),reused:!1}}function F({quiet:t=!1}={}){let r=Se({quiet:t});if(!r.ok)return r;let e=r.bin,n={...process.env,UV_PYTHON_INSTALL_DIR:p.join(g(),"python"),UV_CACHE_DIR:p.join(g(),"cache")},s=E(e,["python","install","--no-bin",x],{stdio:t?"pipe":"inherit",encoding:"utf8",timeout:15*6e4,env:n});if(s.status!==0)return{ok:!1,reason:`uv python install ${x} failed (${s.status})`,stderr:(s.stderr||"").slice(-800)};let i=E(e,["python","find",x],{encoding:"utf8",timeout:6e4,env:n}),o=(i.stdout||"").trim().split(/\r?\n/)[0];return i.status!==0||!o||!l.existsSync(o)?{ok:!1,reason:`uv could not locate python ${x}`}:{ok:!0,bin:o,version:x,source:"uv"}}function z(){if(process.env.ORACLE_HERMES_BIN)return{ok:!0,bin:process.env.ORACLE_HERMES_BIN,source:"env"};let t=w("hermes");if(t)return{ok:!0,bin:t,source:"path"};let r=L();return l.existsSync(r)?{ok:!0,bin:r,source:"managed"}:{ok:!1,bin:null,source:null}}function I(t,r,{quiet:e}){return E(t,r,{stdio:e?"pipe":"inherit",encoding:"utf8",timeout:20*6e4})}function X({quiet:t=!1,upgrade:r=!1}={}){let e=he();if(!e){let c=F({quiet:t});if(c.ok)e={bin:c.bin,version:c.version,source:"uv"};else return{ok:!1,reason:`no supported python found (need 3.11-3.13) and uv could not provide one: ${c.reason}. install uv (https://docs.astral.sh/uv) or python 3.13, then re-run 'oracle bootstrap'`}}h(g());let n=G();if(l.existsSync(L())&&!r)return{ok:!0,bin:L(),reused:!0};if(!l.existsSync(p.join(n,"pyvenv.cfg"))){let c=I(e.bin,["-m","venv",n],{quiet:t});if(c.status!==0&&e.source!=="uv"){l.rmSync(n,{recursive:!0,force:!0});let d=F({quiet:t});if(d.ok)e={bin:d.bin,version:d.version,source:"uv"},c=I(e.bin,["-m","venv",n],{quiet:t});else return{ok:!1,reason:`python -m venv failed (${c.status}) and uv fallback failed: ${d.reason}`,stderr:(c.stderr||"").slice(-800)}}if(c.status!==0)return{ok:!1,reason:`isolated python -m venv failed (${c.status})`,stderr:(c.stderr||"").slice(-800)}}let i=fe();if(!l.existsSync(i))return{ok:!1,reason:`venv python missing at ${i}`};let o=["-m","pip","install","--disable-pip-version-check"];r&&o.push("--upgrade"),o.push(Y);let a=I(i,o,{quiet:t});if(a.status!==0)return{ok:!1,reason:`pip install ${Y} failed (${a.status})`,stderr:(a.stderr||"").slice(-1200)};let u=L();return l.existsSync(u)?{ok:!0,bin:u,reused:!1,python:e.version}:{ok:!1,reason:`hermes entrypoint not found after install (${u})`}}function H(){return["oracle setup \u2014 wire messaging + local agent surface",""," oracle setup menu + platform status"," oracle setup status same, machine-friendly with --json"," oracle setup messaging open hermes gateway setup wizard"," oracle setup telegram set TELEGRAM_BOT_TOKEN for profile"," oracle setup discord set DISCORD_BOT_TOKEN for profile"," oracle setup slack set slack tokens"," oracle setup <platform> any supported hermes platform"," oracle setup gateway [status|restart|start|stop]"," oracle setup profile [name] default: oracle","","chat:"," /setup"," /setup telegram"," /setup status","","tokens stay local in ~/.hermes/profiles/<profile>/.env","oracle never prints secrets."].join(`
|
|
6
|
+
`)}function Ee(t){let r=t.indexOf("--profile");if(r>=0&&t[r+1])return t[r+1];let e=t.indexOf("-p");return e>=0&&t[e+1]?t[e+1]:process.env.ORACLE_PROFILE||"oracle"}function ve(t){let r=[];for(let e=0;e<t.length;e++){if(t[e]==="--profile"||t[e]==="-p"){e+=1;continue}r.push(t[e])}return r}function q(t,{inherit:r=!0,env:e=process.env}={}){let n=z();if(!n.ok&&process.stdin.isTTY&&process.stdout.isTTY&&process.env.ORACLE_NO_BOOTSTRAP!=="1"){process.stdout.write(`setting up oracle's local messaging runtime (one time)
|
|
7
7
|
|
|
8
8
|
`);let i=X();i.ok&&(n={ok:!0,bin:i.bin})}if(!n.ok)return process.stderr.write(`oracle setup needs the local runtime
|
|
9
9
|
run: oracle bootstrap
|
|
10
10
|
`),1;let s=we(n.bin,t,{stdio:r?"inherit":"pipe",encoding:"utf8",env:e});return s.error?(process.stderr.write(`oracle setup: failed to run hermes: ${s.error.message}
|
|
11
11
|
`),1):(r||(s.stdout&&process.stdout.write(s.stdout),s.stderr&&process.stderr.write(s.stderr)),typeof s.status=="number"?s.status:1)}async function Z(t){if(!m.isTTY||typeof m.setRawMode!="function"){let r=new Error("interactive token entry requires a tty");throw r.code="NO_TTY",r}return J.write(`${t}: `),new Promise((r,e)=>{let n="",s=()=>{m.off("data",i),m.setRawMode(!1),m.pause(),J.write(`
|
|
12
12
|
`)},i=o=>{for(let a of String(o)){if(a==="\r"||a===`
|
|
13
|
-
`){s(),r(n.trim());return}if(a===""){s(),e(new Error("cancelled"));return}a==="\x7F"||a==="\b"?n=n.slice(0,-1):n+=a}};m.setRawMode(!0),m.resume(),m.on("data",i)})}async function
|
|
14
|
-
`),process.stderr.write(`known: ${
|
|
13
|
+
`){s(),r(n.trim());return}if(a===""){s(),e(new Error("cancelled"));return}a==="\x7F"||a==="\b"?n=n.slice(0,-1):n+=a}};m.setRawMode(!0),m.resume(),m.on("data",i)})}async function _e(t,r,e=[]){let n=v(r);if(!n)return process.stderr.write(`oracle setup: unknown platform '${r}'
|
|
14
|
+
`),process.stderr.write(`known: ${T().map(u=>u.key).join(", ")}
|
|
15
15
|
`),1;if(!n.required.length)return process.stdout.write(`opening hermes setup for ${n.key} (interactive)
|
|
16
16
|
`),R({lastPlatform:n.key,profile:t}),q(["-p",t,...n.hermes||["gateway","setup"]]);let s={},i=[];for(let u=0;u<e.length;u++){let c=e[u];if(c==="--token"&&e[u+1]){s.token=e[++u];continue}if(c==="--allowed-users"&&e[u+1]){s.allowedUsers=e[++u];continue}if(c==="--app-token"&&e[u+1]){s.appToken=e[++u];continue}if(c.startsWith("-"))return process.stderr.write(`oracle setup: unknown flag ${c}
|
|
17
17
|
`),1;i.push(c)}let o=s.token||i[0]||"";if(!o)try{o=await Z(`${n.key} bot token`)}catch(u){if(u?.code==="NO_TTY")return process.stderr.write(`oracle setup ${n.key}: pass --token <value> in non-interactive mode
|
|
@@ -21,14 +21,14 @@ run: oracle bootstrap
|
|
|
21
21
|
path: ${u.path}
|
|
22
22
|
next: oracle setup gateway restart
|
|
23
23
|
`),0}catch(u){return process.stderr.write(`oracle setup: ${u.message}
|
|
24
|
-
`),1}}var
|
|
24
|
+
`),1}}var ze={name:"setup",summary:"configure telegram/discord/slack messaging platforms",group:"read",usage:H(),async run(t){let r=[...t.argv],e=r.includes("--json"),n=Ee(r),s=ve(r).filter(a=>a!=="--json"),i=(s[0]||"menu").toLowerCase(),o=s.slice(1);if(["-h","--help","help"].includes(i))return process.stdout.write(H()+`
|
|
25
25
|
`),0;if(["menu","list","ls"].includes(i))return e?process.stdout.write(JSON.stringify(A(n),null,2)+`
|
|
26
26
|
`):process.stdout.write(P(n)),0;if(["status","show"].includes(i)){let a=A(n);return e?process.stdout.write(JSON.stringify(a,null,2)+`
|
|
27
|
-
`):(process.stdout.write(P(n)),process.stdout.write(`hermes root: ${
|
|
27
|
+
`):(process.stdout.write(P(n)),process.stdout.write(`hermes root: ${k()}
|
|
28
28
|
`)),0}if(["messaging","gateway-setup","platforms"].includes(i))return R({lastAction:"messaging",profile:n}),process.stdout.write(`opening hermes gateway setup wizard...
|
|
29
29
|
`),q(["-p",n,"gateway","setup"]);if(i==="gateway"){let a=(o[0]||"status").toLowerCase();return["status","start","stop","restart","run","install"].includes(a)?q(["-p",n,"gateway",a]):(process.stderr.write(`usage: oracle setup gateway [status|start|stop|restart|run|install]
|
|
30
30
|
`),1)}if(i==="profile"){let a=o[0]||n;return process.stdout.write(`profile: ${a}
|
|
31
|
-
hermes: ${
|
|
32
|
-
`),process.stdout.write(P(a)),0}return
|
|
31
|
+
hermes: ${k()}/profiles/${a}
|
|
32
|
+
`),process.stdout.write(P(a)),0}return v(i)?_e(n,i,o):(process.stderr.write(`oracle setup: unknown verb '${i}'
|
|
33
33
|
${H()}
|
|
34
|
-
`),1)}};export{
|
|
34
|
+
`),1)}};export{ze as default};
|
|
@@ -1,4 +1,21 @@
|
|
|
1
|
-
var
|
|
1
|
+
var A={name:"sign",summary:"provision / check / import local signer keys",group:"sign",usage:"oracle sign <init|doctor|import> ...",async run(e){let c=e.argv[0];if(c==="init")return e.dispatchOperator("oracle-agentic-init",e.argv.slice(1),{appendHintOnError:!0});if(c==="doctor")return e.dispatchOperator("oracle-agentic-doctor",e.argv.slice(1),{appendHintOnError:!0});if(c==="import"){let{createInterface:m}=await import("node:readline"),{writeFileSync:n,mkdirSync:u,existsSync:a,unlinkSync:v,readFileSync:k,statSync:w}=await import("node:fs"),{join:s,parse:S}=await import("node:path"),{homedir:E,platform:x}=await import("node:os"),l=process.env.ORACLE_CONFIG_DIR||s(E(),".config","oracle"),p=s(l,"keys"),r=s(p,"evm.json"),t=e.argv.includes("--keyfile")?e.argv[e.argv.indexOf("--keyfile")+1]:null;if(t){if(!a(t))return process.stderr.write(`oracle sign: ${t} not found
|
|
2
|
+
`),1;let i=k(t,"utf8").trim(),o=i.startsWith("{")&&JSON.parse(i).key||i;if(!o.startsWith("0x")||o.length<64)return process.stderr.write(`oracle sign: invalid private key in file
|
|
3
|
+
`),1;if(a(r))return process.stderr.write(`oracle sign: ${r} already exists
|
|
4
|
+
`),1;u(p,{recursive:!0,mode:448}),n(r,JSON.stringify({key:o},null,2)+`
|
|
5
|
+
`,{mode:384}),process.stderr.write(`Saved to ${r} (0600)
|
|
6
|
+
`);try{try{n(t,Buffer.alloc(w(t).size,0))}catch{}v(t)}catch{}let f=s(l,"exec.env");return n(f,`ORACLE_EXEC_ENABLED=1
|
|
7
|
+
`,"utf8"),process.stderr.write(`Armed: ${f}
|
|
8
|
+
`),0}let y=m({input:process.stdin,output:process.stderr}),h=i=>new Promise(o=>y.question(i,o));process.stderr.write(`
|
|
9
|
+
Your key stays local \u2014 Oracle never sends it anywhere.
|
|
10
|
+
`),process.stderr.write(`Paste your EVM private key (0x...):
|
|
11
|
+
> `);let O=await h("");y.close();let d=O.trim();if(!d.startsWith("0x")||d.length<64)return process.stderr.write(`oracle sign: invalid private key \u2014 must be 0x-prefixed hex
|
|
12
|
+
`),1;if(a(r))return process.stderr.write(`oracle sign: ${r} already exists \u2014 remove it first or use 'oracle sign doctor'
|
|
13
|
+
`),1;u(p,{recursive:!0,mode:448}),n(r,JSON.stringify({key:d},null,2)+`
|
|
14
|
+
`,{mode:384}),process.stderr.write(`Saved to ${r} (0600)
|
|
15
|
+
`);let g=s(l,"exec.env");return n(g,`ORACLE_EXEC_ENABLED=1
|
|
16
|
+
`,"utf8"),process.stderr.write(`Armed: ${g}
|
|
17
|
+
`),0}return process.stderr.write(`usage: oracle sign <init|doctor|import> ...
|
|
2
18
|
oracle sign init provision keys + policy (interactive)
|
|
19
|
+
oracle sign import import an existing EVM private key
|
|
3
20
|
oracle sign doctor check local signer readiness
|
|
4
|
-
`),1
|
|
21
|
+
`),1}};export{A as default};
|