oioxo-mcp 0.5.85 → 0.5.86
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/bundle/cli.js +2 -2
- package/package.json +1 -1
package/bundle/cli.js
CHANGED
|
@@ -72,7 +72,7 @@ ${I}`:""}`,!J.length)){E={edits:E.edits,out:N.reason,ok:!1};continue}}let Q=awai
|
|
|
72
72
|
${z.errors}`),I=z.errors,E={edits:E.edits,out:z.errors,ok:!1};continue}if(U||(U=!0,R=t.onConfirmRun?await t.onConfirmRun(n).catch(()=>!1):!0,R||e("\xB7 skipping verification (not approved) \u2014 the diff is shown unverified.")),!R){E={edits:E.edits,out:"(verification skipped \u2014 not approved)",ok:!1};break}e("\xB7 verifying on your machine\u2026");let{code:B,out:Y}=await ij(n,T,Kp()?.verifyTimeoutMs);if(B===0){e("\xB7 \u2713 verified green."),E={edits:E.edits,out:Y,ok:!0};break}if(/No module named (pytest|unittest|jest|vitest|mocha)|is not recognized|command not found|No such file or directory|: not found|cannot find|ENOENT|executable not found/i.test(Y)){e("\xB7 (couldn't run the verify oracle here \u2014 it isn't installed; falling back to a syntax check)");let z=await uhe(ie,T);if(E={edits:E.edits,out:z.ok?"\u2713 (syntax ok \u2014 the test oracle isn't installed to run here)":z.errors,ok:z.ok},z.ok)break;I=z.errors;continue}G++,I=sj(Y),e(`\xB7 \u2717 verify failed (exit ${B}) \u2014 feeding the error back.`),E={edits:E.edits,out:Y,ok:!1}}return{ok:E.ok,edits:E.edits,iters:L,savedTokens:y.savedTokens,lastOutput:E.out}}finally{await AQe(T,{recursive:!0,force:!0}).catch(()=>{})}}function IQe(t,e){let r=new Map(t.map(n=>[n.path,n.content]));for(let n of e)r.set(n.path,n.content);return[...r].map(([n,i])=>({path:n,content:i}))}var kQe,aj=fe(()=>{"use strict";y5();eE();Z$();A5();kQe=new RegExp("(^|/)(package\\.json|package-lock\\.json|pnpm-lock\\.yaml|yarn\\.lock|\\.npmrc|\\.yarnrc|\\.yarnrc\\.yml|Makefile|[^/]+\\.config\\.(c|m)?(j|t)s|(jest|vitest|vite|playwright|cypress|ava|karma|webpack|rollup|babel|eslint|prettier|tailwind|postcss|next|nuxt|svelte|astro)\\.config\\.(c|m)?(j|t)s|\\.(babelrc|mocharc|eslintrc|prettierrc|stylelintrc|swcrc)\\.(c|m)?(j|t)s)$","i")});function dhe(){return fb}async function hhe(){if(fhe&&fb)return fb;fhe=!0;try{let t=await fetch(`${Yi}/api/app-config`);if(!t.ok)return fb;let e=await t.json();e.coder&&(fb=e.coder)}catch{}return fb}var fb,fhe,phe=fe(()=>{"use strict";ec();fb=null,fhe=!1});function PQe(t){let e=t.length%4?"=".repeat(4-t.length%4):"",r=atob(t.replace(/-/g,"+").replace(/_/g,"/")+e),n=new Uint8Array(r.length);for(let i=0;i<r.length;i++)n[i]=r.charCodeAt(i);return n}function mhe(t){let e=t.indexOf(".");if(e<1)return null;try{return JSON.parse(FQe.decode(PQe(t.slice(0,e))))}catch{return null}}var NRt,FQe,oj=fe(()=>{"use strict";NRt=new TextEncoder,FQe=new TextDecoder});function ghe(t){let e=atob(t),r=new Uint8Array(e.length);for(let n=0;n<e.length;n++)r[n]=e.charCodeAt(n);return r}async function RQe(t,e){return crypto.subtle.importKey("raw",cj(t),{name:"AES-GCM"},!1,e)}async function xhe(t,e){let r=await crypto.subtle.decrypt({name:"AES-GCM",iv:cj(ghe(t.iv))},await RQe(e,["decrypt"]),cj(ghe(t.ct)));return new Uint8Array(r)}var URt,cj,yhe=fe(()=>{"use strict";URt=new TextEncoder,cj=t=>t});function OQe(t){let e="";for(let r of t)e+=String.fromCharCode(r);return btoa(e)}function NQe(t){let e=atob(t),r=new Uint8Array(e.length);for(let n=0;n<e.length;n++)r[n]=e.charCodeAt(n);return r}async function BQe(){let t=await crypto.subtle.generateKey({name:"ECDH",namedCurve:"P-256"},!1,["deriveBits"]),e=new Uint8Array(await crypto.subtle.exportKey("raw",t.publicKey));return{publicKeyB64:OQe(e),privateKey:t.privateKey}}async function UQe(t){return crypto.subtle.importKey("raw",bhe(NQe(t)),{name:"ECDH",namedCurve:"P-256"},!1,[])}async function MQe(t,e,r){let n=new Uint8Array(await crypto.subtle.deriveBits({name:"ECDH",public:await UQe(e)},t,256)),i=await crypto.subtle.importKey("raw",bhe(n),"HKDF",!1,["deriveBits"]),s=await crypto.subtle.deriveBits({name:"HKDF",hash:"SHA-256",salt:vhe.encode("oioxo:unlock"),info:vhe.encode(r)},i,256);return new Uint8Array(s)}async function LQe(t,e,r,n){let i=`${r}|${n}|${e.assetId}|${t.publicKeyB64}|${e.serverPubB64}`,s=await MQe(t.privateKey,e.serverPubB64,i);return xhe(e.wrapped,s)}async function _he(t,e){let r=e.fetchImpl??globalThis.fetch,n=await BQe(),i=new AbortController,s=setTimeout(()=>i.abort(),e.timeoutMs??15e3),a;try{a=await r(t,{method:"POST",headers:{"content-type":"application/json",...e.extraHeaders??{}},cache:"no-store",body:JSON.stringify({entitlement:e.entitlement,device:e.device,assetId:e.assetId,clientPubB64:n.publicKeyB64}),signal:i.signal})}catch(d){throw d.name==="AbortError"?new Error("unlock timed out"):d}finally{clearTimeout(s)}if(a.status===403){let d=await a.json().catch(()=>({}));throw new Error("unlock denied: "+(d.reason??"forbidden"))}if(!a.ok)throw new Error("unlock unavailable ("+a.status+")");let c=await a.json();return LQe(n,c,e.sub,e.device)}var vhe,bhe,whe=fe(()=>{"use strict";yhe();oj();vhe=new TextEncoder,bhe=t=>t});import{homedir as $Qe,userInfo as jQe}from"node:os";import She from"node:path";import{promises as db,createReadStream as qQe,createWriteStream as zQe}from"node:fs";import{createHash as Ahe,createDecipheriv as WQe}from"node:crypto";import{execFile as HQe}from"node:child_process";async function Ehe(t){try{await db.chmod(t,384)}catch{}if(process.platform==="win32")try{let e=jQe().username;await new Promise(r=>{HQe("icacls",[t,"/inheritance:r","/grant:r",`${e}:F`],{windowsHide:!0},()=>r())})}catch{}}function VQe(t,e){return/^https?:\/\//i.test(e)?e:t.slice(0,t.lastIndexOf("/")+1)+e.replace(/^\.?\//,"")}async function The(t,e){let r=Kp(),n=e??r?.fetchRetryTries??4,i=r?.fetchRetryBackoffMs??600,s;for(let a=0;a<n;a++){try{let c=await fetch(t);if(c.ok)return c;if(s=new Error(`HTTP ${c.status}`),c.status>=400&&c.status<500&&c.status!==429)break}catch(c){s=c}a<n-1&&await new Promise(c=>setTimeout(c,i*(a+1)))}throw new Error(`fetch failed after ${n} tries: ${s instanceof Error?s.message:String(s)}`)}async function GQe(t){let e=await ab(),r=await m5(),n=await fetch(`${Yi}/api/entitlement`,{method:"POST",headers:r,body:JSON.stringify({device:e})});if(!n.ok)throw new Error(`entitlement failed (${n.status}) \u2014 sign in with \`oioxo login\`.`);let{entitlement:i}=await n.json(),s=i?mhe(i):null;if(!i||!s)throw new Error("could not establish a session");if(!s.sub||s.sub==="anon")throw new Error("this model is Pro-only \u2014 your account did not unlock it (free entitlement).");return _he(`${Yi}/api/code-key`,{entitlement:i,sub:s.sub,device:e,assetId:t,extraHeaders:r,timeoutMs:Kp()?.unlockTimeoutMs})}async function khe(t,e,r=()=>{}){let n=She.join($Qe(),".oioxo","models");await db.mkdir(n,{recursive:!0});let i=await(await The(e)).json();if(!i?.chunks?.length||!i.sha256)throw new Error("OIOXO manifest is malformed");let s=She.join(n,`${t}-${i.release}.gguf`);try{if((await db.stat(s)).size===i.totalBytes){let v=Ahe("sha256"),_=qQe(s);for await(let A of _)v.update(A);if(v.digest("hex")===i.sha256)return await Ehe(s),r(`\xB7 OIOXO model cached: ${i.fileName}`),s}}catch{}r(`\xB7 unlocking ${t} (device-bound handshake)\u2026`);let a=Buffer.from(await GQe(t)),c=s+".part",d=zQe(c),h=Ahe("sha256"),p=0,x=[...i.chunks].sort((y,v)=>y.index-v.index);try{for(let y of x){let v=Buffer.from(await(await The(VQe(e,y.url))).arrayBuffer()),_=Buffer.from(y.iv,"base64"),A=v.subarray(v.length-16),k=v.subarray(0,v.length-16),C=WQe("aes-256-gcm",a,_);C.setAuthTag(A);let T=Buffer.concat([C.update(k),C.final()]);h.update(T),d.write(T)||await new Promise(E=>d.once("drain",()=>E())),p+=T.byteLength,r(`\xB7 decrypting OIOXO model\u2026 ${Math.round(p/i.totalBytes*100)}%`)}}finally{await new Promise((y,v)=>d.end(_=>_?v(_):y()))}if(p!==i.totalBytes)throw await db.rm(c,{force:!0}),new Error("OIOXO assembled size mismatch");if(h.digest("hex")!==i.sha256)throw await db.rm(c,{force:!0}),new Error("OIOXO integrity check failed");return await db.rename(c,s),await Ehe(s),r(`\xB7 OIOXO model ready: ${i.fileName} (decrypted, private \u2014 never leaves this machine)`),s}var Che=fe(()=>{"use strict";ec();oj();whe();A5()});var P5={};Cn(P5,{ensureLlamaServer:()=>Phe,findLlamaServer:()=>aE,installedBackend:()=>Fhe,startLlamaServer:()=>hj,stopAllSidecars:()=>F5});import{spawn as KQe,spawnSync as Dhe}from"node:child_process";import{createServer as ZQe}from"node:net";import{randomBytes as XQe}from"node:crypto";import{existsSync as lj,mkdirSync as YQe,createWriteStream as JQe,chmodSync as QQe,readFileSync as eet,writeFileSync as tet}from"node:fs";import{homedir as fj}from"node:os";import i0 from"node:path";import{Readable as net}from"node:stream";import{pipeline as iet}from"node:stream/promises";function F5(){for(let t of sE)try{t()}catch{}sE.clear()}function uj(){return i0.join(fj(),".oioxo","engine",".backend")}function Fhe(){try{return lj(uj())&&eet(uj(),"utf8").trim()||null}catch{return null}}function aE(){let t=process.platform==="win32"?"llama-server.exe":"llama-server",e=[process.env.OIOXO_LLAMA_SERVER,i0.join(fj(),".oioxo","engine",t),i0.join(i0.dirname(new URL(import.meta.url).pathname.replace(/^\/([A-Za-z]:)/,"$1")),"..","..","engine",t)].filter(r=>!!r);for(let r of e)try{if(lj(r))return r}catch{}return null}function dj(t){return process.platform!=="win32"&&t==="cuda"?"vulkan":t}function set(t){let e=process.platform==="win32"?"win-x64":process.platform==="darwin"?"mac-x64":"linux-x64",r=process.platform==="win32"?"zip":"tar.gz";return`llama-server-${dj(t)}-${e}.${r}`}async function Phe(t,e=()=>{}){let r=aE();if(r)return r;let n=i0.join(fj(),".oioxo","engine"),i=set(t),s=`${Ihe}/${i}`;try{YQe(n,{recursive:!0}),e(`\xB7 downloading OIOXO engine (${t}) \u2014 first run only\u2026`);let a=await fetch(s,{headers:{"User-Agent":"oioxo-cli"},redirect:"follow"});if(!a.ok||!a.body)return e(`\xB7 engine download failed (HTTP ${a.status}).`),null;let c=i0.join(n,i);if(await iet(net.fromWeb(a.body),JQe(c)),i.endsWith(".zip")){if(Dhe("powershell",["-NoProfile","-Command",`Expand-Archive -Path '${c}' -DestinationPath '${n}' -Force`],{windowsHide:!0}).status!==0)return e("\xB7 engine unzip failed."),null}else if(Dhe("tar",["-xzf",c,"-C",n],{windowsHide:!0}).status!==0)return e("\xB7 engine untar failed."),null;let d=process.platform==="win32"?"llama-server.exe":"llama-server",h=i0.join(n,d);if(lj(h)){try{process.platform!=="win32"&&QQe(h,493)}catch{}try{tet(uj(),dj(t))}catch{}return e("\xB7 OIOXO engine installed."),h}return aE()}catch(a){return e(`\xB7 engine download error: ${a.message}`),null}}function aet(){return new Promise((t,e)=>{let r=ZQe();r.once("error",e),r.listen(0,"127.0.0.1",()=>{let n=r.address(),i=typeof n=="object"&&n?n.port:0;r.close(()=>i?t(i):e(new Error("no free port")))})})}async function hj(t){let e=t.onNote??(()=>{}),r=await Phe(t.backend,e);if(!r)throw new Error(`OIOXO on-device engine (llama-server) could not be installed. The Bonsai models need OIOXO\u2019s
|
|
73
73
|
unified build (stock llama.cpp cannot run Q2_0). Check your network, or set
|
|
74
74
|
OIOXO_LLAMA_SERVER=<path to llama-server>, or manually install the per-backend archive from
|
|
75
|
-
${Ihe}/ into ~/.oioxo/engine.`);let n=dj(t.backend),i=Fhe(),s=i??n;i&&i!==n&&e(`\xB7 note: using the already-installed ${i} engine (this device resolved to ${n}; delete ~/.oioxo/engine to re-fetch ${n}).`);let a=await aet(),c=XQe(24).toString("base64url"),d=["-m",t.modelPath,"--host","127.0.0.1","--port",String(a),"--api-key",c,"-a","oioxo-local","-ngl","999","-c",String(t.contextSize),"--no-webui","--cache-reuse","256"],h=8192;if(t.contextSize>h){let A=Math.ceil(t.contextSize/h*10)/10;d.push("--rope-scaling","linear","--rope-scale",String(A))}s==="vulkan"&&typeof t.vulkanDevice=="number"&&d.push("--device",`Vulkan${t.vulkanDevice}`),t.isIntegratedGpu&&d.push("--spec-type","ngram-simple"),e(`\xB7 starting OIOXO engine (${s}) on 127.0.0.1:${a}\u2026`);let p=KQe(r,d,{stdio:"ignore",windowsHide:!0,cwd:i0.dirname(r),env:process.env}),x=`http://127.0.0.1:${a}`,y=!1,v=()=>{if(!y){y=!0,sE.delete(v);try{p.kill()}catch{}}};sE.add(v),p.once("exit",()=>{y=!0,sE.delete(v)});let _=Date.now()+10*6e4;for(;Date.now()<_;){if(p.exitCode!==null)throw v(),new Error(`OIOXO engine exited while loading (code ${p.exitCode}). On CUDA, ensure the cudart DLLs are bundled.`);try{if((await fetch(`${x}/health`)).ok)break}catch{}await new Promise(A=>setTimeout(A,400))}return e("\xB7 OIOXO engine ready (private, on-device)."),{baseURL:x,apiKey:c,backend:s,modelLabel:i0.basename(t.modelPath),stop:v,async chat(A,k){let C=!!k?.onToken,T=JSON.stringify({model:"oioxo-local",messages:A,temperature:k?.temperature??.2,max_tokens:k?.maxTokens??4096,repeat_penalty:1.18,repeat_last_n:320,frequency_penalty:.4,presence_penalty:.15,min_p:.05,stop:["</think>","<|im_end|>","<|endoftext|>"],stream:C}),E=await fetch(`${x}/v1/chat/completions`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${c}`},body:T});if(!C)return(await E.json()).choices?.[0]?.message?.content??"";let I="",R=E.body?.getReader(),U=new TextDecoder,L="";for(;R;){let{done:V,value:G}=await R.read();if(V)break;L+=U.decode(G,{stream:!0});let ae;for(;(ae=L.indexOf(`
|
|
75
|
+
${Ihe}/ into ~/.oioxo/engine.`);let n=dj(t.backend),i=Fhe(),s=i??n;i&&i!==n&&e(`\xB7 note: using the already-installed ${i} engine (this device resolved to ${n}; delete ~/.oioxo/engine to re-fetch ${n}).`);let a=await aet(),c=XQe(24).toString("base64url"),d=["-m",t.modelPath,"--host","127.0.0.1","--port",String(a),"--api-key",c,"-a","oioxo-local","-ngl","999","-c",String(t.contextSize),"--no-webui","--cache-reuse","256"],h=8192;if(t.contextSize>h){let A=Math.ceil(t.contextSize/h*10)/10;d.push("--rope-scaling","linear","--rope-scale",String(A))}(s==="vulkan"||s==="cpu")&&d.push("-fit","off"),s==="vulkan"&&typeof t.vulkanDevice=="number"&&d.push("--device",`Vulkan${t.vulkanDevice}`),t.isIntegratedGpu&&d.push("--spec-type","ngram-simple"),e(`\xB7 starting OIOXO engine (${s}) on 127.0.0.1:${a}\u2026`);let p=KQe(r,d,{stdio:"ignore",windowsHide:!0,cwd:i0.dirname(r),env:process.env}),x=`http://127.0.0.1:${a}`,y=!1,v=()=>{if(!y){y=!0,sE.delete(v);try{p.kill()}catch{}}};sE.add(v),p.once("exit",()=>{y=!0,sE.delete(v)});let _=Date.now()+10*6e4;for(;Date.now()<_;){if(p.exitCode!==null)throw v(),new Error(`OIOXO engine exited while loading (code ${p.exitCode}). On CUDA, ensure the cudart DLLs are bundled.`);try{if((await fetch(`${x}/health`)).ok)break}catch{}await new Promise(A=>setTimeout(A,400))}return e("\xB7 OIOXO engine ready (private, on-device)."),{baseURL:x,apiKey:c,backend:s,modelLabel:i0.basename(t.modelPath),stop:v,async chat(A,k){let C=!!k?.onToken,T=JSON.stringify({model:"oioxo-local",messages:A,temperature:k?.temperature??.2,max_tokens:k?.maxTokens??4096,repeat_penalty:1.18,repeat_last_n:320,frequency_penalty:.4,presence_penalty:.15,min_p:.05,stop:["</think>","<|im_end|>","<|endoftext|>"],stream:C}),E=await fetch(`${x}/v1/chat/completions`,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${c}`},body:T});if(!C)return(await E.json()).choices?.[0]?.message?.content??"";let I="",R=E.body?.getReader(),U=new TextDecoder,L="";for(;R;){let{done:V,value:G}=await R.read();if(V)break;L+=U.decode(G,{stream:!0});let ae;for(;(ae=L.indexOf(`
|
|
76
76
|
`))>=0;){let te=L.slice(0,ae).trim();if(L=L.slice(ae+1),!te.startsWith("data:"))continue;let H=te.slice(5).trim();if(H!=="[DONE]")try{let Q=JSON.parse(H).choices?.[0]?.delta?.content;Q&&(I+=Q,k.onToken(Q))}catch{}}}return I}}}var Ihe,sE,hb=fe(()=>{"use strict";Ihe="https://huggingface.co/payam1394/oioxo-desktop/resolve/main/engine",sE=new Set});var O5={};Cn(O5,{DeviceCoderLocal:()=>pj,isNativeEngineAvailable:()=>met,loadDeviceModel:()=>R5,resolveEngineTarget:()=>Ohe});import{homedir as oet,totalmem as cet}from"node:os";import Rhe from"node:path";import{mkdir as uet}from"node:fs/promises";function det(){return dhe()?.cliSystemPrompt||fet}function het(t){return[`TASK:
|
|
77
77
|
${t.task}`,`
|
|
78
78
|
CONTEXT (OIOXO capsule):
|
|
@@ -1442,7 +1442,7 @@ ${k.snippet}`:""}`).join(`
|
|
|
1442
1442
|
`);return Zs(A||"No results.")}catch(v){return Zs(`web_search failed: ${v instanceof Error?v.message:"error"}`)}}),e.tool("fetch_url","Fetch a web page (http/https only) and return its readable text. Use to read a doc/article \u2014 typically a URL found via web_search.",{url:lo.string().describe("The full http(s) URL.")},async({url:x})=>{let y=await pA();if(!y.ok)return hA(y.message);try{let _=await(await fetch(`${Yi}/tools/fetch?url=${encodeURIComponent(x)}`,{signal:AbortSignal.timeout(12e3)})).json();return Zs(_.error?`fetch_url failed: ${_.error}`:_.text??"(empty)")}catch(v){return Zs(`fetch_url failed: ${v instanceof Error?v.message:"error"}`)}});let c=null,d=!1,h=async x=>{if(d=x,c)return c;let{makePlaywrightBackend:y}=await Promise.resolve().then(()=>(BR(),NR)),{BrowserController:v}=await Promise.resolve().then(()=>(Nk(),lK)),_=await y({headless:!1});return c=new v(_,{confirmNavigate:async()=>d,allowEvaluate:!1}),c};e.tool("browser",'Drive a REAL browser on this machine to see and test web pages \u2014 navigate, read a numbered snapshot of clickable elements, click/type by ref, screenshot. Runs LOCALLY (the page never leaves the device). Local URLs (localhost) are always allowed; set allow_external:true to permit other sites. Call one verb at a time; after navigate the result lists elements like [3] button "Sign in" \u2014 click by that ref.',{verb:lo.enum(["navigate","snapshot","screenshot","click","type","waitFor","scrollTo","back","reload","close"]).describe("The action."),url:lo.string().optional().describe("For navigate: the URL."),ref:lo.number().optional().describe("For click/type/scrollTo: element number from the latest snapshot."),text:lo.string().optional().describe("For type: text to enter. For click: visible text to match. For waitFor: text to wait for."),selector:lo.string().optional().describe("Optional CSS selector (prefer ref)."),submit:lo.boolean().optional().describe("For type: press Enter after typing."),allow_external:lo.boolean().optional().describe("Permit navigating to non-local sites (privacy gate; default false).")},async({verb:x,url:y,ref:v,text:_,selector:A,submit:k,allow_external:C})=>{let T=await pA();if(!T.ok)return hA(T.message);try{let E=await h(!!C);if(x==="close")return await E.dispose(),c=null,Zs("Browser closed.");let I=await E.run({verb:x,url:y,ref:v,text:_,selector:A,submit:k});if(!I.ok)return Zs(`browser ${x} failed: ${I.error??"unknown error"}`);let R=`${I.title||""} \u2014 ${I.url}`.trim(),U=I.snapshot?`
|
|
1443
1443
|
${I.snapshot}`:"",L=I.consoleErrors?.length?`
|
|
1444
1444
|
console errors: ${I.consoleErrors.slice(0,3).join(" | ")}`:"",V=`${R}${U}${L}`.trim()||"OK";if(I.screenshot){let G=zIt(I.screenshot);return{content:[{type:"text",text:`${V}
|
|
1445
|
-
(screenshot attached${G?` \u2014 ${G.width}x${G.height}px`:""}, ${I.screenshot.length} bytes)`},{type:"image",data:Buffer.from(I.screenshot).toString("base64"),mimeType:"image/png"}]}}return Zs(V)}catch(E){return Zs(`browser failed: ${E instanceof Error?E.message:"error"}`)}});let p=new hL;await e.connect(p)}y5();eE();ec();var Tue=(()=>{try{return"0.5.
|
|
1445
|
+
(screenshot attached${G?` \u2014 ${G.width}x${G.height}px`:""}, ${I.screenshot.length} bytes)`},{type:"image",data:Buffer.from(I.screenshot).toString("base64"),mimeType:"image/png"}]}}return Zs(V)}catch(E){return Zs(`browser failed: ${E instanceof Error?E.message:"error"}`)}});let p=new hL;await e.connect(p)}y5();eE();ec();var Tue=(()=>{try{return"0.5.86"}catch{}try{return M$e(import.meta.url)("../../package.json").version}catch{return"0.0.0"}})(),DPt=`OIOXO ${Tue} \u2014 context engine + terminal coding agent (https://oioxo.com)
|
|
1446
1446
|
|
|
1447
1447
|
Private, on your device. Cut your AI bill by up to ~90% in Copilot, Cursor & Claude,
|
|
1448
1448
|
and code from your terminal \u2014 nothing leaves your machine.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oioxo-mcp",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.86",
|
|
4
4
|
"description": "OIOXO — cut your AI bill by up to ~90%: it feeds Claude Code, Copilot, Cursor and any MCP agent only the relevant slice of your codebase instead of whole files. Also a private terminal coding agent (`oioxo code`, on-device with --local or any key). Runs on your device; your own devices can build together over Wi-Fi.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"type": "module",
|