oh-my-agent 7.20.0 → 7.20.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.
Files changed (2) hide show
  1. package/bin/cli.js +2 -2
  2. package/package.json +1 -1
package/bin/cli.js CHANGED
@@ -1619,10 +1619,10 @@ ${XJ.default.dim("Examples:")}
1619
1619
  ${XJ.default.cyan("oma scholar lint")} --lenient paper.knows.yaml
1620
1620
  `)}var S8=p2(I4(),1);import{spawn as cU5}from"node:child_process";async function nK2($,z,G){return new Promise((J)=>{let U=cU5($,z,{stdio:["ignore","pipe","pipe"]}),K="",X="";U.stdout.on("data",(Z)=>{K+=Z.toString()}),U.stderr.on("data",(Z)=>{X+=Z.toString()});let Q=()=>U.kill("SIGTERM");G.signal?.addEventListener("abort",Q),U.on("close",(Z)=>{G.signal?.removeEventListener("abort",Q),J({code:Z,stdout:K,stderr:X})}),U.on("error",(Z)=>{G.signal?.removeEventListener("abort",Q),J({code:-1,stdout:K,stderr:`${X}
1621
1621
  spawn_error:${Z.message}`})})})}async function pK2($,z,G={}){let J=G.host??"github",U=G.limit??20,K=performance.now();if(J==="gitlab"){let k=new URLSearchParams({scope:"blobs",search:$,per_page:String(U)}),{code:j,stdout:L,stderr:W}=await nK2("glab",["api",`/search?${k.toString()}`],z);return dK2("gitlab",$,j,L,W,performance.now()-K)}let X=["search","code",$,"--limit",String(U),"--json","repository,path,url,textMatches"];if(G.language)X.push("--language",G.language);if(G.repo)X.push("--repo",G.repo);let{code:Q,stdout:Z,stderr:Y}=await nK2("gh",X,z);return dK2("github",$,Q,Z,Y,performance.now()-K)}function dK2($,z,G,J,U,K){let X=Math.round(K);if(G===null||G!==0){let Q=U.trim();if(/command not found|ENOENT/i.test(Q))return{url:`search:${$}:${z}`,status:"error",strategy:"api",platform:`${$}-cli`,content:"",elapsedMs:X,signals:[],error:$==="github"?"GitHub CLI (gh) not installed. https://cli.github.com/":"GitLab CLI (glab) not installed. https://gitlab.com/gitlab-org/cli"};if(/rate limit/i.test(Q))return{url:`search:${$}:${z}`,status:"blocked",strategy:"api",platform:`${$}-cli`,content:"",elapsedMs:X,signals:[{kind:"rate-limit",detail:Q}],error:Q};return{url:`search:${$}:${z}`,status:"error",strategy:"api",platform:`${$}-cli`,content:"",elapsedMs:X,signals:[],error:Q||`${$} cli exited ${G}`}}return{url:`search:${$}:${z}`,status:"ok",strategy:"api",platform:`${$}-cli`,content:J.trim(),contentType:"application/json",elapsedMs:X,signals:[]}}import{spawn as nU5}from"node:child_process";function dU5(){return process.env.OMA_YTDLP??"yt-dlp"}async function pU5($,z){return new Promise((G)=>{let J=nU5(dU5(),$,{stdio:["ignore","pipe","pipe"]}),U="",K="";J.stdout.on("data",(Q)=>{U+=Q.toString()}),J.stderr.on("data",(Q)=>{K+=Q.toString()});let X=()=>J.kill("SIGTERM");z.signal?.addEventListener("abort",X),J.on("close",(Q)=>{z.signal?.removeEventListener("abort",X),G({code:Q,stdout:U,stderr:K})}),J.on("error",(Q)=>{z.signal?.removeEventListener("abort",X),G({code:-1,stdout:U,stderr:`${K}
1622
- spawn_error:${Q.message}`})})})}async function aK2($,z,G={}){let J=performance.now(),U=["--dump-json","--no-warnings","--skip-download"];if(G.format)U.push("-f",G.format);if(G.subtitles){if(U.push("--write-sub","--write-auto-sub","--sub-format","vtt"),G.subLangs?.length)U.push("--sub-lang",G.subLangs.join(","))}U.push($.toString());let{code:K,stdout:X,stderr:Q}=await pU5(U,z),Z=Math.round(performance.now()-J);if(K===null||K!==0){let Y=Q.trim();if(/executable not found|ENOENT/i.test(Y))return{url:$.toString(),status:"error",strategy:"api",platform:"media",content:"",elapsedMs:Z,signals:[],error:"yt-dlp not installed. Install via `pip install yt-dlp` or `brew install yt-dlp`."};return{url:$.toString(),status:"error",strategy:"api",platform:"media",content:X,elapsedMs:Z,signals:[],error:Y||`yt-dlp exited with code ${K}`}}return{url:$.toString(),status:"ok",strategy:"api",platform:"media",content:X.trim(),contentType:"application/json",elapsedMs:Z,signals:[]}}Y8();var Hu=/<meta\s+([^>]+)>/gi,Bu=/(\w[\w-]*)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/g,tx=/<script[^>]+type=["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/gi,aU5=/<title[^>]*>([\s\S]*?)<\/title>/i,ex=/<link\s+([^>]+)>/gi;function oK2($){let z={};Bu.lastIndex=0;let G=Bu.exec($);while(G!==null){let J=G[1]?.toLowerCase();if(!J){G=Bu.exec($);continue}z[J]=G[2]??G[3]??G[4]??"",G=Bu.exec($)}return z}function Au($){let z={},G=[],J=[],U;Hu.lastIndex=0;let K=Hu.exec($);while(K!==null){let j=K[1];if(!j){K=Hu.exec($);continue}let L=oK2(j),W=L.property??"",H=L.name??"",B=L.content??"";if(W.startsWith("og:"))z[W.slice(3)]=B;if(H==="description"&&!U)U=B;if(H==="twitter:description"&&!U)U=B;K=Hu.exec($)}ex.lastIndex=0;let X=ex.exec($);while(X!==null){let j=X[1];if(j){let L=oK2(j);if(L.rel==="alternate"&&L.type&&(L.type.includes("rss")||L.type.includes("atom")))G.push({type:L.type,href:L.href??"",title:L.title})}X=ex.exec($)}tx.lastIndex=0;let Q=tx.exec($);while(Q!==null){let j=Q[1];if(j)try{J.push(JSON.parse(j))}catch{}Q=tx.exec($)}let Y=aU5.exec($)?.[1]?.trim(),k={};if(Object.keys(z).length>0)k.ogp=z;if(J.length>0)k.jsonLd=J;if(U)k.description=U;if(Y)k.title=Y;if(G.length>0)k.alternate=G;return k}async function rK2($,z){try{let G=await d1($.toString(),{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal}),J=Au(G.text);return{url:$.toString(),status:G.ok?"ok":"error",strategy:"probe",platform:"metadata",httpStatus:G.status,content:G.text,contentType:G.headers.get("content-type")??void 0,elapsedMs:G.elapsedMs,signals:[],metadata:J}}catch(G){return{url:$.toString(),status:"error",strategy:"probe",platform:"metadata",content:"",elapsedMs:0,signals:[],error:G instanceof Error?G.message:String(G)}}}l$();uj();Y8();l$();D3();var oU5=["archive.ph","archive.is","archive.md","archive.vn","archive.li"];function rU5($){return`https://${$.hostname.replace(/\./g,"-")}.cdn.ampproject.org/c/s/${$.hostname}${$.pathname}${$.search}`}async function sU5($,z){try{let G=rU5($),J=await d1(G,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!J.ok||J.text.length<200)return null;let U=j7(J);return{url:$.toString(),status:P6(J,U),strategy:"archive",provenance:"amp",platform:"amp",httpStatus:J.status,content:J.text,contentType:J.headers.get("content-type")??void 0,elapsedMs:J.elapsedMs,signals:U}}catch{return null}}async function tU5($,z){for(let G of oU5){if(z.signal?.aborted)break;try{let J=`https://${G}/newest/${$.toString()}`,U=await d1(J,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!U.ok||U.text.length<200)continue;let K=j7(U);return{url:$.toString(),status:P6(U,K),strategy:"archive",provenance:"archive-today",platform:G,httpStatus:U.status,content:U.text,contentType:U.headers.get("content-type")??void 0,elapsedMs:U.elapsedMs,signals:K}}catch{}}return null}async function eU5($,z){try{let G=await d1(`https://archive.org/wayback/available?url=${encodeURIComponent($.toString())}`,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!G.ok)return null;let U=JSON.parse(G.text).archived_snapshots?.closest;if(!U?.available||!U.url)return null;let K=await d1(U.url,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!K.ok||K.text.length<200)return null;let X=j7(K);return{url:$.toString(),status:P6(K,X),strategy:"archive",provenance:"wayback",platform:"wayback",httpStatus:K.status,content:K.text,contentType:K.headers.get("content-type")??void 0,elapsedMs:K.elapsedMs,signals:X}}catch{return null}}async function cj($,z){let G=[()=>sU5($,z),()=>tU5($,z),()=>eU5($,z)],J=performance.now();for(let U of G){if(z.signal?.aborted)break;let K=await U();if(K)return K}return{...j1({url:$.toString(),strategy:"archive",error:Error("all archive sources exhausted")}),elapsedMs:Math.round(performance.now()-J)}}l$();D3();import{existsSync as ZE2}from"node:fs";import{platform as qb5}from"node:os";var Db5={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Brave Browser.app/Contents/MacOS/Brave Browser","/Applications/Chromium.app/Contents/MacOS/Chromium"],linux:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium","/usr/bin/chromium-browser","/usr/bin/microsoft-edge","/usr/bin/brave-browser"],win32:["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe","C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe"]};function Bd(){if(process.env.OMA_CHROME_PATH&&ZE2(process.env.OMA_CHROME_PATH))return process.env.OMA_CHROME_PATH;let $=Db5[qb5()]??[];for(let z of $)if(ZE2(z))return z;return null}async function Mb5(){try{let $=await Promise.resolve().then(() => (QE2(),XE2));return $.default??$}catch{return null}}async function YE2($,z,G={}){let J=await Mb5();if(!J)return j1({url:$.toString(),strategy:"browser",error:Error("puppeteer-core not installed. Run: bun add puppeteer-core")});let U=Bd();if(!U)return j1({url:$.toString(),strategy:"browser",error:Error("Chrome/Chromium not found. Install a Chromium-based browser or set OMA_CHROME_PATH.")});let K=performance.now(),X=await J.launch({executablePath:U,headless:"new",args:["--disable-blink-features=AutomationControlled","--disable-dev-shm-usage","--no-sandbox"]});try{let Q=await X.newPage();if(await Q.setViewport({width:1280,height:900}),await Q.setExtraHTTPHeaders({"Accept-Language":z.locale}),z.userAgent)await Q.setUserAgent(z.userAgent);let Z=[];if(G.captureNetwork)Q.on("response",(A)=>{let V=A.url(),F=A.headers(),N=F["content-type"]??"";if(!V.startsWith($.origin))return;if(!N.includes("json")&&!N.includes("xml"))return;let u=F["access-control-request-method"]??"GET";Z.push({url:V,status:A.status(),method:u,contentType:N})});let Y=await Q.goto($.toString(),{waitUntil:"networkidle2",timeout:z.timeoutMs});if(G.waitSelector)await Q.waitForFunction(`document.querySelector(${JSON.stringify(G.waitSelector)}) !== null`,{timeout:z.timeoutMs});else if(G.waitMs&&G.waitMs>0)await new Promise((A)=>setTimeout(A,G.waitMs));let k=await Q.content(),j=Y?.status()??0,L=new Headers;if(Y)for(let[A,V]of Object.entries(Y.headers()))try{L.set(A,V)}catch{}let W={ok:j>=200&&j<400,status:j,headers:L,url:$.toString(),text:k,elapsedMs:Math.round(performance.now()-K),redirected:!1},H=j7(W),B=Math.round(performance.now()-K);return{url:$.toString(),status:S02(H)?"blocked":k.length<200?"error":"ok",strategy:"browser",httpStatus:j,content:k,contentType:L.get("content-type")??"text/html",elapsedMs:B,signals:H,hiddenApis:G.captureNetwork?Z:void 0}}catch(Q){let Z=Math.round(performance.now()-K);return{...j1({url:$.toString(),strategy:"browser",error:Q}),elapsedMs:Z}}finally{await X.close()}}Dy();Y8();l$();D3();var kE2="https://r.jina.ai/";function Ib5($){let z=`${$.protocol}//${$.hostname}`,G=$.hostname.startsWith("m.")?$.hostname:`m.${$.hostname.replace(/^www\./,"")}`,J=new URL($.toString());return J.hostname=G,[{label:"jina",url:`${kE2}${$.toString()}`,headers:aG({accept:"text/plain"})},{label:"jina-json",url:`${kE2}${$.toString()}`,headers:aG({accept:"application/json"})},{label:"curl-desktop",url:$.toString(),headers:aG({userAgent:Z8.desktopFirefox,referer:z})},{label:"curl-mobile",url:J.toString(),headers:aG({userAgent:Z8.mobileSafari,referer:z})},{label:"curl-googlebot",url:$.toString(),headers:aG({userAgent:Z8.googlebot})}]}function Tb5($,z){if(!$.startsWith("jina"))return z;return z}async function jE2($,z){let G=Ib5($),J=new AbortController;if(z.signal)if(z.signal.aborted)J.abort(z.signal.reason);else z.signal.addEventListener("abort",()=>J.abort(z.signal?.reason));let U=performance.now(),K={},X=null,Q=G.map(async(Z)=>{let Y=await d1(Z.url,{headers:Z.headers,timeoutMs:z.timeoutMs,signal:J.signal,locale:z.locale}),k=j7(Y);if(Z.label.startsWith("jina")){let j=_02(Y);if(j)throw X=j,Error(`jina-quota:${j.detail}`)}if(!Eb5(Y,k))throw K[Z.label]=`status=${Y.status} size=${Y.text.length}`,Error(`weak-response:${Z.label}`);return{label:Z.label,resp:Y,signals:k}});try{let Z=await Promise.any(Q);J.abort();let Y=Math.round(performance.now()-U);return{url:$.toString(),status:P6(Z.resp,Z.signals),strategy:"probe",platform:Z.label,httpStatus:Z.resp.status,content:Tb5(Z.label,Z.resp.text),contentType:Z.resp.headers.get("content-type")??void 0,elapsedMs:Y,signals:X?[...Z.signals,X]:Z.signals}}catch(Z){let Y=Math.round(performance.now()-U),k=Object.entries(K).map(([j,L])=>`${j}:${L}`).join(" ");if(X)return{...j1({url:$.toString(),error:Error(`probe failed — ${k}`),strategy:"probe"}),elapsedMs:Y,signals:[X]};return{...j1({url:$.toString(),error:Z instanceof AggregateError?Error(k):Z,strategy:"probe"}),elapsedMs:Y}}}function Eb5($,z){if(!$.ok)return!1;if($.text.length<200)return!1;if(z.some((G)=>G.kind==="waf-body"||G.kind==="challenge-body"||G.kind==="js-essential"||G.kind==="http-status"))return!1;return!0}var Rb5=["api","probe","impersonate","browser","archive"];function vb5($){if($.only?.length)return $.only;let z=Rb5.slice();if(!$.includeArchive)z=z.filter((G)=>G!=="archive");if($.skip?.length)z=z.filter((G)=>!$.skip?.includes(G));return z}async function WE2($,z,G){switch($){case"api":return await sF(z,G)??null;case"probe":return jE2(z,G);case"impersonate":return rF(z,G);case"browser":return YE2(z,G);case"archive":return cj(z,G)}}function Ad($){if($.status==="ok")return!0;if($.status==="auth-required"&&h02($.signals))return!0;return!1}function wb5($){return $.status==="auth-required"||$.status==="invalid-input"||$.status==="not-found"}async function Pb5($){let z=Math.floor(Math.random()*500);await new Promise((G)=>setTimeout(G,$+z))}function bb5($){let z=$.find((U)=>U.kind==="rate-limit");if(!z)return 1500;let G=z.detail.match(/retry-after=(\d+)/);if(!G?.[1])return 1500;let J=Number.parseInt(G[1],10);if(Number.isNaN(J)||J>10)return 1500;return J*1000}async function LE2($,z,G={}){let J=vb5(G),U=[],K=new Set,X=null,Q=!1;for(let Z of J){if(z.signal?.aborted)break;if(Q&&Z==="impersonate")continue;let Y=await WE2(Z,$,z);if(!Y)continue;if(U.push({strategy:Z,platform:Y.platform,status:Y.status,httpStatus:Y.httpStatus,elapsedMs:Y.elapsedMs,signals:Y.signals,error:Y.error}),Y.signals.some((k)=>k.kind==="js-essential"))Q=!0;if(Ad(Y))return Y.attempts=U,Y;if(wb5(Y))return Y.attempts=U,Y;if(G.retryOnRateLimit!==!1&&x02(Y.signals)&&!K.has(Z)){K.add(Z),await Pb5(bb5(Y.signals));let k=await WE2(Z,$,z);if(k){if(U.push({strategy:Z,platform:k.platform,status:k.status,httpStatus:k.httpStatus,elapsedMs:k.elapsedMs,signals:k.signals,error:k.error}),Ad(k))return k.attempts=U,k;X=k;continue}}X=Y}if(!J.includes("archive")&&G.includeArchive!==!1){let Z=await cj($,z);if(U.push({strategy:"archive",platform:Z.platform,status:Z.status,httpStatus:Z.httpStatus,elapsedMs:Z.elapsedMs,signals:Z.signals,error:Z.error}),Ad(Z))return Z.attempts=U,Z;X=Z}if(X)return X.attempts=U,X;return{url:$.toString(),status:"error",strategy:J[0]??"probe",content:"",elapsedMs:0,signals:[],attempts:U,error:"all strategies failed"}}Y8();var eE2=p2(sE2(),1);var G_5=["/rss","/feed","/atom.xml","/rss.xml","/index.xml"],J_5=new eE2.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",textNodeName:"#text"});function Dd($){if($===void 0||$===null)return[];return Array.isArray($)?$:[$]}function w3($){if($==null)return;if(typeof $==="string")return $;if(typeof $==="object"){let z=$;if(typeof z["#text"]==="string")return z["#text"];if(typeof z["#cdata"]==="string")return z["#cdata"]}return}function tE2($){for(let z of Dd($)){let G=z?.["@_href"],J=z?.["@_rel"];if(typeof G==="string"&&(J===void 0||J==="alternate"))return G}return}function $R2($){let z;try{z=J_5.parse($)}catch{return null}let G=z.rss;if(G){let U=G.channel;if(!U)return null;let K=Dd(U.item);return{kind:"rss",title:w3(U.title),description:w3(U.description),link:w3(U.link),entries:K.map((X)=>({title:w3(X.title),link:w3(X.link),pubDate:w3(X.pubDate),description:w3(X.description),content:w3(X["content:encoded"])??w3(X.content)}))}}let J=z.feed;if(J){let U=Dd(J.entry);return{kind:"atom",title:w3(J.title),description:w3(J.subtitle),link:tE2(J.link),entries:U.map((K)=>({title:w3(K.title),link:tE2(K.link),pubDate:w3(K.published)??w3(K.updated),description:w3(K.summary),content:w3(K.content)??w3(K.summary)}))}}return null}async function zR2($,z){let G=performance.now(),J;try{let K=await d1($.toString(),{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(K.ok)J=Au(K.text).alternate?.[0]?.href}catch{}let U=new Set;if(J)try{U.add(new URL(J,$).toString())}catch{}for(let K of G_5)U.add(new URL(K,`${$.protocol}//${$.host}`).toString());for(let K of U){if(z.signal?.aborted)break;try{let X=await d1(K,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!X.ok||X.text.length<50)continue;let Q=$R2(X.text);if(!Q||Q.entries.length===0)continue;return{url:$.toString(),status:"ok",strategy:"probe",platform:"rss",httpStatus:X.status,content:X.text,contentType:X.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-G),signals:[],feedUrl:K,feed:Q}}catch{}}return{url:$.toString(),status:"not-found",strategy:"probe",platform:"rss",content:"",elapsedMs:Math.round(performance.now()-G),signals:[],error:"no RSS/Atom feed discovered"}}function GR2($,z="en-US"){let[G,J]=z.split("-"),U=new URL("https://news.google.com/rss/search");return U.searchParams.set("q",$),U.searchParams.set("hl",G??"en"),U.searchParams.set("gl",J??"US"),U.searchParams.set("ceid",`${J??"US"}:${G??"en"}`),U.toString()}uj();Y8();var nM={"github.com":{domain:"github.com",level:"verified",score:0.95,tags:["code-host"],source:"registry"},"docs.github.com":{domain:"docs.github.com",level:"verified",score:0.95,tags:["lang-docs"],source:"registry"},"developer.mozilla.org":{domain:"developer.mozilla.org",level:"verified",score:0.95,tags:["lang-docs"],source:"registry"},"nextjs.org":{domain:"nextjs.org",level:"verified",score:0.9,tags:["vendor","lang-docs"],source:"registry"},"vercel.com":{domain:"vercel.com",level:"verified",score:0.9,tags:["vendor"],source:"registry"},"typescriptlang.org":{domain:"typescriptlang.org",level:"verified",score:0.95,tags:["lang-docs"],source:"registry"},"stackoverflow.com":{domain:"stackoverflow.com",level:"community",score:0.7,tags:["qna"],source:"registry"},"dev.to":{domain:"dev.to",level:"external",score:0.4,tags:["blog"],source:"registry"},"medium.com":{domain:"medium.com",level:"external",score:0.35,tags:["blog"],source:"registry"},"npmjs.com":{domain:"npmjs.com",level:"verified",score:0.9,tags:["registry"],source:"registry"},"pypi.org":{domain:"pypi.org",level:"verified",score:0.9,tags:["registry"],source:"registry"},"news.ycombinator.com":{domain:"news.ycombinator.com",level:"community",score:0.65,tags:["news"],source:"registry"},"reddit.com":{domain:"reddit.com",level:"community",score:0.55,tags:["forum"],source:"registry"},"wikipedia.org":{domain:"wikipedia.org",level:"community",score:0.75,tags:["encyclopedia"],source:"registry"},"arxiv.org":{domain:"arxiv.org",level:"verified",score:0.9,tags:["academic"],source:"registry"},"doi.org":{domain:"doi.org",level:"verified",score:0.95,tags:["academic"],source:"registry"}};function U_5($){return $.replace(/^www\./,"")}function K_5($){if($ in nM){let G=nM[$];return G?{...G}:null}let z=U_5($);if(z in nM){let G=nM[z];return G?{...G}:null}return null}function X_5($){let z=$.split(".").pop();if(z==="gov"||z==="edu"||z==="mil")return{domain:$,level:"verified",score:0.9,tags:["institution"],source:"heuristic"};if(/\.gov\.[a-z]{2}$/.test($)||/\.ac\.[a-z]{2}$/.test($))return{domain:$,level:"verified",score:0.85,tags:["institution"],source:"heuristic"};return null}async function Q_5($){try{let z=await d1(`https://tranco-list.eu/api/ranks/domain/${$}`,{timeoutMs:5000});if(!z.ok)return null;let J=JSON.parse(z.text).ranks?.[0]?.rank;if(!J)return null;let U=J<1e4?0.6:J<1e5?0.4:0.2;return{domain:$,level:J<1e4?"community":"external",score:U,tags:["tranco"],source:"tranco",rank:J}}catch{return null}}async function JR2($){let z=K_5($);if(z)return z;let G=X_5($);if(G)return G;let J=await Q_5($);if(J)return J;return{domain:$,level:"unknown",score:null,tags:[],source:"heuristic"}}var UR2=["api","probe","impersonate","browser","archive"];function KR2($){if(!$)return;let z=$.split(",").map((J)=>J.trim()).filter(Boolean),G=z.filter((J)=>!UR2.includes(J));if(G.length>0)throw Error(`Unknown strategy: ${G.join(", ")}. Valid: ${UR2.join(", ")}`);return z}function nZ($){try{return new URL($)}catch{throw Error(`Invalid URL: ${$}`)}}function oz($){return{timeoutMs:$.timeout?Math.max(1000,Math.floor(Number($.timeout)*1000)):15000,locale:$.locale??"en-US,en;q=0.9"}}function d0($,z){if(z)console.log(JSON.stringify($,null,2));else console.log(JSON.stringify($))}function kU($){if(!$){process.exitCode=1;return}if($.status==="ok")process.exitCode=0;else if($.status==="blocked")process.exitCode=2;else if($.status==="not-found")process.exitCode=3;else if($.status==="invalid-input")process.exitCode=4;else if($.status==="auth-required")process.exitCode=5;else if($.status==="timeout")process.exitCode=6;else process.exitCode=1}function XR2($){let z=$.command("search").description("Mechanical search primitives — fetch, meta, rss, media, trust, code").alias("s");z.command("fetch <url>").description("Fetch URL via auto-escalating strategy pipeline").option("--only <strategies>","Comma-separated strategies to run").option("--skip <strategies>","Comma-separated strategies to skip").option("--include-archive","Include archive strategy as last fallback").option("--timeout <seconds>","Per-strategy timeout","15").option("--locale <value>","Accept-Language header","en-US,en;q=0.9").option("--pretty","Pretty-print JSON output").action(async(G,J)=>{try{let U=nZ(G),K=oz(J),X=await LE2(U,K,{only:KR2(J.only),skip:KR2(J.skip),includeArchive:J.includeArchive});d0(X,Boolean(J.pretty)),kU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("api <url>").description("Fetch via matched platform API (Phase 0)").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=nZ(G);if(!Ty(U)){console.error(S8.default.yellow(`No API handler matches host ${U.hostname}`)),process.exitCode=3;return}let X=oz(J),Q=await sF(U,X);if(!Q){process.exitCode=3;return}d0(Q,Boolean(J.pretty)),kU(Q)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("api:search <query>").description("Fan-out keyword search across platforms that support it").option("--platforms <list>","Comma-separated platform ids").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{let U=oz(J),K=J.platforms?J.platforms.split(",").map((Q)=>Q.trim()).filter(Boolean):void 0,X=await c$(G,U,K);d0(X,Boolean(J.pretty))}),z.command("meta <url>").description("Extract OGP / JSON-LD / Schema.org from URL").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=nZ(G),K=oz(J),X=await rK2(U,K),{content:Q,...Z}=X;d0(Z,Boolean(J.pretty)),kU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("rss <url>").description("Discover and parse RSS/Atom feed for a URL").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=nZ(G),K=oz(J),X=await zR2(U,K),{content:Q,...Z}=X;d0(Z,Boolean(J.pretty)),kU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("rss:google <query>").description("Build Google News RSS URL for a query").option("--locale <value>","Locale (e.g., ko-KR)","en-US").action((G,J)=>{let U=GR2(G,J.locale??"en-US");console.log(U)}),z.command("media <url>").description("Extract media metadata via yt-dlp (1858 sites)").option("--subs","Write subtitles").option("--sub-lang <list>","Subtitle languages (comma-separated)","en").option("--format <spec>","yt-dlp format spec").option("--timeout <seconds>","Timeout","30").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=nZ(G),K=oz(J),X=J.subLang?J.subLang.split(",").map((Z)=>Z.trim()).filter(Boolean):void 0,Q=await aK2(U,K,{subtitles:J.subs,...X?{subLangs:X}:{},...J.format?{format:J.format}:{}});d0(Q,Boolean(J.pretty)),kU(Q)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("archive <url>").description("Fetch via AMP / archive.today / Wayback").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=nZ(G),K=oz(J),X=await cj(U,K);d0(X,Boolean(J.pretty)),kU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("trust <domain>").description("Resolve trust level / score for a domain").option("--pretty","Pretty-print JSON").action(async(G,J)=>{let U=await JR2(G.toLowerCase());d0(U,Boolean(J.pretty))}),z.command("code <query>").description("Search code via gh / glab").option("--host <github|gitlab>","Host","github").option("--language <lang>","Language filter").option("--repo <owner/repo>","Scope to a repo").option("--limit <n>","Max results","20").option("--pretty","Pretty-print JSON").action(async(G,J)=>{let U=J.host==="gitlab"||J.host==="github"?J.host:"github",K=oz({}),X=await pK2(G,K,{host:U,...J.language?{language:J.language}:{},...J.repo?{repo:J.repo}:{},...J.limit?{limit:Number.parseInt(J.limit,10)}:{}});d0(X,Boolean(J.pretty)),kU(X)}),z.command("doctor").description("Check dependencies (Chrome, python3 curl_cffi, yt-dlp, gh)").action(async()=>{let G=[],J=Bd();G.push({name:"chrome",ok:Boolean(J),detail:J??"Install Chrome or set OMA_CHROME_PATH"}),G.push(await Md("python3",["--version"])),G.push(await Z_5()),G.push(await Md("yt-dlp",["--version"])),G.push(await Md("gh",["--version"]));for(let U of G){let K=U.ok?S8.default.green("✓"):S8.default.yellow("!");console.log(`${K} ${U.name}: ${U.detail}`)}if(G.some((U)=>!U.ok))process.exitCode=1})}async function Md($,z){return new Promise((G)=>{let{spawn:J}=X2("node:child_process"),U=J($,z,{stdio:["ignore","pipe","pipe"]}),K="";U.stdout?.on("data",(X)=>{K+=X.toString()}),U.on("error",()=>G({name:$,ok:!1,detail:"not found"})),U.on("close",(X)=>{if(X===0)G({name:$,ok:!0,detail:K.trim()});else G({name:$,ok:!1,detail:`exit code ${X}`})})})}async function Z_5(){return new Promise(($)=>{let{spawn:z}=X2("node:child_process"),G=z("python3",["-c","import curl_cffi; print(curl_cffi.__version__)"],{stdio:["ignore","pipe","pipe"]}),J="";G.stdout?.on("data",(U)=>{J+=U.toString()}),G.on("error",()=>$({name:"curl_cffi",ok:!1,detail:"python3 not found"})),G.on("close",(U)=>{if(U===0)$({name:"curl_cffi",ok:!0,detail:`v${J.trim()}`});else $({name:"curl_cffi",ok:!1,detail:"not installed (pip install curl_cffi)"})})})}X7();var rz=p2(I4(),1);import{execSync as Y_5,spawnSync as QR2}from"node:child_process";import{platform as k_5}from"node:os";function j_5(){let $=k_5();if($==="darwin")return"brew install gh";if($==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function ZR2(){if(console.clear(),d4(rz.default.bgMagenta(rz.default.white(" ⭐ oh-my-agent star "))),!MG()){let z=j_5(),G=await F3({message:`GitHub CLI (gh) is not installed. Install with ${rz.default.cyan(z)}?`});if(k4(G)||!G){P5("Install gh manually and try again.");return}let J=I6();J.start("Installing GitHub CLI...");let U=QR2(z,{shell:!0,stdio:"pipe"});if(U.status!==0){J.stop("Installation failed"),$4.error(U.stderr?.toString()||"Unknown error"),P5("Please install gh manually.");return}J.stop("GitHub CLI installed!")}if(!J8()){$4.warn("GitHub CLI is not authenticated.");let z=await F3({message:`Run ${rz.default.cyan("gh auth login")} now?`});if(k4(z)||!z){P5("Authenticate and try again.");return}if(QR2("gh",["auth","login"],{stdio:"inherit"}),!J8()){P5("Authentication was not completed. Try again.");return}$4.success("Authenticated!")}if(IG()){P5(`Already starred ${rz.default.cyan(K1)}! Thank you! \uD83D\uDE4F`);return}let $=await F3({message:`Star ${rz.default.cyan(K1)} on GitHub?`});if(k4($)||!$){P5("Maybe next time!");return}try{Y_5(`gh api -X PUT /user/starred/${K1}`,{stdio:"ignore"}),P5(`Starred ${rz.default.cyan(K1)}! Thank you! \uD83C\uDF1F`)}catch{$4.error("Failed to star the repository."),P5("Please try again later.")}}function YR2($){$.command("star").description("Star oh-my-agent on GitHub").action(k5(async()=>{await ZR2()}))}X7();px();kk();var P3=p2(I4(),1);import{existsSync as UH,mkdirSync as W_5,readdirSync as L_5,readFileSync as kR2,writeFileSync as LR2}from"node:fs";import{dirname as H_5,join as Id}from"node:path";function B_5($){let z=ne($),G={},J=0,U=0;for(let K of z){J+=K.tokens;let X=ce(K.tokens,K.vendor);U+=X;let Q=G[K.vendor]??{tokens:0,spawns:0,usd:0};Q.tokens+=K.tokens,Q.spawns+=1,Q.usd+=X,G[K.vendor]=Q}return{totalTokens:J,totalSpawns:z.length,estimatedUsd:U,byVendor:G}}function jR2($){return $.toLocaleString("en-US")}function WR2($){if($===0)return"$0.00";if($<0.01)return"<$0.01";return`$${$.toFixed(2)}`}function Td($){return Id($,".agents","state","metrics.json")}function A_5($){return Id($,".serena","metrics.json")}function dM(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function V_5($){let z=Td($);if(UH(z))try{return JSON.parse(kR2(z,"utf-8"))}catch{return dM()}let G=A_5($);if(UH(G))try{return JSON.parse(kR2(G,"utf-8"))}catch{return dM()}return dM()}function F_5($,z){let G=Td($),J=H_5(G);if(!UH(J))W_5(J,{recursive:!0});z.lastUpdated=new Date().toISOString(),LR2(G,JSON.stringify(z,null,2),"utf-8")}function N_5($){let z=Id($,".serena","memories"),G={};if(!UH(z))return G;try{let J=L_5(z);for(let U of J){let K=U.match(/(?:progress|result)-(\w+)/);if(K?.[1]){let X=K[1];G[X]=(G[X]||0)+1}}}catch{}return G}async function HR2($=!1,z=!1){let G=process.cwd(),J=Td(G);if(z){if(UH(J))LR2(J,JSON.stringify(dM(),null,2),"utf-8");if($)console.log(JSON.stringify({reset:!0}));else console.log(P3.default.green("✅ Metrics reset successfully."));return}let U=V_5(G),K=Zu(G),X=N_5(G),Q=qe(G),Z=GV(G),Y=Z.startedAt?new Date(Z.startedAt):null,k=Y&&!Number.isNaN(Y.getTime())?Math.max(0,Math.floor((Date.now()-Y.getTime())/1000)):0;for(let[A,V]of Object.entries(X))U.skillsUsed[A]=(U.skillsUsed[A]||0)+V;if(Q>U.tasksCompleted)U.tasksCompleted=Q;if(Z.id){if(["completed","failed","aborted"].includes(Z.status||"")&&(U.lastSessionId!==Z.id||U.lastSessionStatus!==Z.status)&&k>0)U.totalSessionTime+=k;U.lastSessionId=Z.id,U.lastSessionStatus=Z.status,U.lastSessionStarted=Z.startedAt,U.lastSessionDuration=k}U.filesChanged+=K.filesChanged,U.linesAdded+=K.linesAdded,U.linesRemoved+=K.linesRemoved,U.sessions+=1,F_5(G,U);let j=Math.max(1,Math.ceil((Date.now()-new Date(U.startDate).getTime())/86400000)),L=U.sessions>0?Math.round(U.totalSessionTime/U.sessions):0,W=B_5(G);if($){console.log(JSON.stringify({...U,gitStats:K,daysSinceStart:j,avgSessionTime:L,cost:W},null,2));return}console.clear(),d4(P3.default.bgMagenta(P3.default.white(" \uD83D\uDCCA oh-my-agent stats ")));let H=[P3.default.bold(`\uD83D\uDCC8 Productivity Metrics (${j} days)`),"┌─────────────────────┬──────────────┐",`│ ${P3.default.bold("Metric")} │ ${P3.default.bold("Value")} │`,"├─────────────────────┼──────────────┤",`│ Sessions │ ${String(U.sessions).padEnd(12)} │`,`│ Tasks Completed │ ${String(U.tasksCompleted).padEnd(12)} │`,`│ Files Changed │ ${String(U.filesChanged).padEnd(12)} │`,`│ Lines Added │ ${P3.default.green(`+${U.linesAdded}`).padEnd(12)} │`,`│ Lines Removed │ ${P3.default.red(`-${U.linesRemoved}`).padEnd(12)} │`,"└─────────────────────┴──────────────┘"].join(`
1622
+ spawn_error:${Q.message}`})})})}async function aK2($,z,G={}){let J=performance.now(),U=["--dump-json","--no-warnings","--skip-download"];if(G.format)U.push("-f",G.format);if(G.subtitles){if(U.push("--write-sub","--write-auto-sub","--sub-format","vtt"),G.subLangs?.length)U.push("--sub-lang",G.subLangs.join(","))}U.push($.toString());let{code:K,stdout:X,stderr:Q}=await pU5(U,z),Z=Math.round(performance.now()-J);if(K===null||K!==0){let Y=Q.trim();if(/executable not found|ENOENT/i.test(Y))return{url:$.toString(),status:"error",strategy:"api",platform:"media",content:"",elapsedMs:Z,signals:[],error:"yt-dlp not installed. Install via `pip install yt-dlp` or `brew install yt-dlp`."};return{url:$.toString(),status:"error",strategy:"api",platform:"media",content:X,elapsedMs:Z,signals:[],error:Y||`yt-dlp exited with code ${K}`}}return{url:$.toString(),status:"ok",strategy:"api",platform:"media",content:X.trim(),contentType:"application/json",elapsedMs:Z,signals:[]}}Y8();var Hu=/<meta\s+([^>]+)>/gi,Bu=/(\w[\w-]*)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/g,tx=/<script[^>]+type=["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/gi,aU5=/<title[^>]*>([\s\S]*?)<\/title>/i,ex=/<link\s+([^>]+)>/gi;function oK2($){let z={};Bu.lastIndex=0;let G=Bu.exec($);while(G!==null){let J=G[1]?.toLowerCase();if(!J){G=Bu.exec($);continue}z[J]=G[2]??G[3]??G[4]??"",G=Bu.exec($)}return z}function Au($){let z={},G=[],J=[],U;Hu.lastIndex=0;let K=Hu.exec($);while(K!==null){let j=K[1];if(!j){K=Hu.exec($);continue}let L=oK2(j),W=L.property??"",H=L.name??"",B=L.content??"";if(W.startsWith("og:"))z[W.slice(3)]=B;if(H==="description"&&!U)U=B;if(H==="twitter:description"&&!U)U=B;K=Hu.exec($)}ex.lastIndex=0;let X=ex.exec($);while(X!==null){let j=X[1];if(j){let L=oK2(j);if(L.rel==="alternate"&&L.type&&(L.type.includes("rss")||L.type.includes("atom")))G.push({type:L.type,href:L.href??"",title:L.title})}X=ex.exec($)}tx.lastIndex=0;let Q=tx.exec($);while(Q!==null){let j=Q[1];if(j)try{J.push(JSON.parse(j))}catch{}Q=tx.exec($)}let Y=aU5.exec($)?.[1]?.trim(),k={};if(Object.keys(z).length>0)k.ogp=z;if(J.length>0)k.jsonLd=J;if(U)k.description=U;if(Y)k.title=Y;if(G.length>0)k.alternate=G;return k}async function rK2($,z){try{let G=await d1($.toString(),{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal}),J=Au(G.text);return{url:$.toString(),status:G.ok?"ok":"error",strategy:"probe",platform:"metadata",httpStatus:G.status,content:G.text,contentType:G.headers.get("content-type")??void 0,elapsedMs:G.elapsedMs,signals:[],metadata:J}}catch(G){return{url:$.toString(),status:"error",strategy:"probe",platform:"metadata",content:"",elapsedMs:0,signals:[],error:G instanceof Error?G.message:String(G)}}}l$();uj();Y8();l$();D3();var oU5=["archive.ph","archive.is","archive.md","archive.vn","archive.li"];function rU5($){return`https://${$.hostname.replace(/\./g,"-")}.cdn.ampproject.org/c/s/${$.hostname}${$.pathname}${$.search}`}async function sU5($,z){try{let G=rU5($),J=await d1(G,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!J.ok||J.text.length<200)return null;let U=j7(J);return{url:$.toString(),status:P6(J,U),strategy:"archive",provenance:"amp",platform:"amp",httpStatus:J.status,content:J.text,contentType:J.headers.get("content-type")??void 0,elapsedMs:J.elapsedMs,signals:U}}catch{return null}}async function tU5($,z){for(let G of oU5){if(z.signal?.aborted)break;try{let J=`https://${G}/newest/${$.toString()}`,U=await d1(J,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!U.ok||U.text.length<200)continue;let K=j7(U);return{url:$.toString(),status:P6(U,K),strategy:"archive",provenance:"archive-today",platform:G,httpStatus:U.status,content:U.text,contentType:U.headers.get("content-type")??void 0,elapsedMs:U.elapsedMs,signals:K}}catch{}}return null}async function eU5($,z){try{let G=await d1(`https://archive.org/wayback/available?url=${encodeURIComponent($.toString())}`,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!G.ok)return null;let U=JSON.parse(G.text).archived_snapshots?.closest;if(!U?.available||!U.url)return null;let K=await d1(U.url,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!K.ok||K.text.length<200)return null;let X=j7(K);return{url:$.toString(),status:P6(K,X),strategy:"archive",provenance:"wayback",platform:"wayback",httpStatus:K.status,content:K.text,contentType:K.headers.get("content-type")??void 0,elapsedMs:K.elapsedMs,signals:X}}catch{return null}}async function cj($,z){let G=[()=>sU5($,z),()=>tU5($,z),()=>eU5($,z)],J=performance.now();for(let U of G){if(z.signal?.aborted)break;let K=await U();if(K)return K}return{...j1({url:$.toString(),strategy:"archive",error:Error("all archive sources exhausted")}),elapsedMs:Math.round(performance.now()-J)}}l$();D3();import{existsSync as ZE2}from"node:fs";import{platform as qb5}from"node:os";var Db5={darwin:["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Brave Browser.app/Contents/MacOS/Brave Browser","/Applications/Chromium.app/Contents/MacOS/Chromium"],linux:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium","/usr/bin/chromium-browser","/usr/bin/microsoft-edge","/usr/bin/brave-browser"],win32:["C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe","C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe","C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe"]};function Bd(){if(process.env.OMA_CHROME_PATH&&ZE2(process.env.OMA_CHROME_PATH))return process.env.OMA_CHROME_PATH;let $=Db5[qb5()]??[];for(let z of $)if(ZE2(z))return z;return null}async function Mb5(){try{let $=await Promise.resolve().then(() => (QE2(),XE2));return $.default??$}catch{return null}}async function YE2($,z,G={}){let J=await Mb5();if(!J)return j1({url:$.toString(),strategy:"browser",error:Error("puppeteer-core not installed. Run: bun add puppeteer-core")});let U=Bd();if(!U)return j1({url:$.toString(),strategy:"browser",error:Error("Chrome/Chromium not found. Install a Chromium-based browser or set OMA_CHROME_PATH.")});let K=performance.now(),X=await J.launch({executablePath:U,headless:"new",args:["--disable-blink-features=AutomationControlled","--disable-dev-shm-usage","--no-sandbox"]});try{let Q=await X.newPage();if(await Q.setViewport({width:1280,height:900}),await Q.setExtraHTTPHeaders({"Accept-Language":z.locale}),z.userAgent)await Q.setUserAgent(z.userAgent);let Z=[];if(G.captureNetwork)Q.on("response",(A)=>{let V=A.url(),F=A.headers(),N=F["content-type"]??"";if(!V.startsWith($.origin))return;if(!N.includes("json")&&!N.includes("xml"))return;let u=F["access-control-request-method"]??"GET";Z.push({url:V,status:A.status(),method:u,contentType:N})});let Y=await Q.goto($.toString(),{waitUntil:"networkidle2",timeout:z.timeoutMs});if(G.waitSelector)await Q.waitForFunction(`document.querySelector(${JSON.stringify(G.waitSelector)}) !== null`,{timeout:z.timeoutMs});else if(G.waitMs&&G.waitMs>0)await new Promise((A)=>setTimeout(A,G.waitMs));let k=await Q.content(),j=Y?.status()??0,L=new Headers;if(Y)for(let[A,V]of Object.entries(Y.headers()))try{L.set(A,V)}catch{}let W={ok:j>=200&&j<400,status:j,headers:L,url:$.toString(),text:k,elapsedMs:Math.round(performance.now()-K),redirected:!1},H=j7(W),B=Math.round(performance.now()-K);return{url:$.toString(),status:S02(H)?"blocked":k.length<200?"error":"ok",strategy:"browser",httpStatus:j,content:k,contentType:L.get("content-type")??"text/html",elapsedMs:B,signals:H,hiddenApis:G.captureNetwork?Z:void 0}}catch(Q){let Z=Math.round(performance.now()-K);return{...j1({url:$.toString(),strategy:"browser",error:Q}),elapsedMs:Z}}finally{await X.close()}}Dy();Y8();l$();D3();var kE2="https://r.jina.ai/";function Ib5($){let z=`${$.protocol}//${$.hostname}`,G=$.hostname.startsWith("m.")?$.hostname:`m.${$.hostname.replace(/^www\./,"")}`,J=new URL($.toString());return J.hostname=G,[{label:"jina",url:`${kE2}${$.toString()}`,headers:aG({accept:"text/plain"})},{label:"jina-json",url:`${kE2}${$.toString()}`,headers:aG({accept:"application/json"})},{label:"curl-desktop",url:$.toString(),headers:aG({userAgent:Z8.desktopFirefox,referer:z})},{label:"curl-mobile",url:J.toString(),headers:aG({userAgent:Z8.mobileSafari,referer:z})},{label:"curl-googlebot",url:$.toString(),headers:aG({userAgent:Z8.googlebot})}]}function Tb5($,z){if(!$.startsWith("jina"))return z;return z}async function jE2($,z){let G=Ib5($),J=new AbortController;if(z.signal)if(z.signal.aborted)J.abort(z.signal.reason);else z.signal.addEventListener("abort",()=>J.abort(z.signal?.reason));let U=performance.now(),K={},X=null,Q=G.map(async(Z)=>{let Y=await d1(Z.url,{headers:Z.headers,timeoutMs:z.timeoutMs,signal:J.signal,locale:z.locale}),k=j7(Y);if(Z.label.startsWith("jina")){let j=_02(Y);if(j)throw X=j,Error(`jina-quota:${j.detail}`)}if(!Eb5(Y,k))throw K[Z.label]=`status=${Y.status} size=${Y.text.length}`,Error(`weak-response:${Z.label}`);return{label:Z.label,resp:Y,signals:k}});try{let Z=await Promise.any(Q);J.abort();let Y=Math.round(performance.now()-U);return{url:$.toString(),status:P6(Z.resp,Z.signals),strategy:"probe",platform:Z.label,httpStatus:Z.resp.status,content:Tb5(Z.label,Z.resp.text),contentType:Z.resp.headers.get("content-type")??void 0,elapsedMs:Y,signals:X?[...Z.signals,X]:Z.signals}}catch(Z){let Y=Math.round(performance.now()-U),k=Object.entries(K).map(([j,L])=>`${j}:${L}`).join(" ");if(X)return{...j1({url:$.toString(),error:Error(`probe failed — ${k}`),strategy:"probe"}),elapsedMs:Y,signals:[X]};return{...j1({url:$.toString(),error:Z instanceof AggregateError?Error(k):Z,strategy:"probe"}),elapsedMs:Y}}}function Eb5($,z){if(!$.ok)return!1;if($.text.length<200)return!1;if(z.some((G)=>G.kind==="waf-body"||G.kind==="challenge-body"||G.kind==="js-essential"||G.kind==="http-status"))return!1;return!0}var Rb5=["api","probe","impersonate","browser","archive"];function vb5($){if($.only?.length)return $.only;let z=Rb5.slice();if(!$.includeArchive)z=z.filter((G)=>G!=="archive");if($.skip?.length)z=z.filter((G)=>!$.skip?.includes(G));return z}async function WE2($,z,G){switch($){case"api":return await sF(z,G)??null;case"probe":return jE2(z,G);case"impersonate":return rF(z,G);case"browser":return YE2(z,G);case"archive":return cj(z,G)}}function Ad($){if($.status==="ok")return!0;if($.status==="auth-required"&&h02($.signals))return!0;return!1}function wb5($){return $.status==="auth-required"||$.status==="invalid-input"||$.status==="not-found"}async function Pb5($){let z=Math.floor(Math.random()*500);await new Promise((G)=>setTimeout(G,$+z))}function bb5($){let z=$.find((U)=>U.kind==="rate-limit");if(!z)return 1500;let G=z.detail.match(/retry-after=(\d+)/);if(!G?.[1])return 1500;let J=Number.parseInt(G[1],10);if(Number.isNaN(J)||J>10)return 1500;return J*1000}async function LE2($,z,G={}){let J=vb5(G),U=[],K=new Set,X=null,Q=!1;for(let Z of J){if(z.signal?.aborted)break;if(Q&&Z==="impersonate")continue;let Y=await WE2(Z,$,z);if(!Y)continue;if(U.push({strategy:Z,platform:Y.platform,status:Y.status,httpStatus:Y.httpStatus,elapsedMs:Y.elapsedMs,signals:Y.signals,error:Y.error}),Y.signals.some((k)=>k.kind==="js-essential"))Q=!0;if(Ad(Y))return Y.attempts=U,Y;if(wb5(Y))return Y.attempts=U,Y;if(G.retryOnRateLimit!==!1&&x02(Y.signals)&&!K.has(Z)){K.add(Z),await Pb5(bb5(Y.signals));let k=await WE2(Z,$,z);if(k){if(U.push({strategy:Z,platform:k.platform,status:k.status,httpStatus:k.httpStatus,elapsedMs:k.elapsedMs,signals:k.signals,error:k.error}),Ad(k))return k.attempts=U,k;X=k;continue}}X=Y}if(!J.includes("archive")&&G.includeArchive!==!1){let Z=await cj($,z);if(U.push({strategy:"archive",platform:Z.platform,status:Z.status,httpStatus:Z.httpStatus,elapsedMs:Z.elapsedMs,signals:Z.signals,error:Z.error}),Ad(Z))return Z.attempts=U,Z;X=Z}if(X)return X.attempts=U,X;return{url:$.toString(),status:"error",strategy:J[0]??"probe",content:"",elapsedMs:0,signals:[],attempts:U,error:"all strategies failed"}}Y8();var eE2=p2(sE2(),1);var G_5=["/rss","/feed","/atom.xml","/rss.xml","/index.xml"],J_5=new eE2.XMLParser({ignoreAttributes:!1,attributeNamePrefix:"@_",textNodeName:"#text"});function Dd($){if($===void 0||$===null)return[];return Array.isArray($)?$:[$]}function w3($){if($==null)return;if(typeof $==="string")return $;if(typeof $==="object"){let z=$;if(typeof z["#text"]==="string")return z["#text"];if(typeof z["#cdata"]==="string")return z["#cdata"]}return}function tE2($){for(let z of Dd($)){let G=z?.["@_href"],J=z?.["@_rel"];if(typeof G==="string"&&(J===void 0||J==="alternate"))return G}return}function $R2($){let z;try{z=J_5.parse($)}catch{return null}let G=z.rss;if(G){let U=G.channel;if(!U)return null;let K=Dd(U.item);return{kind:"rss",title:w3(U.title),description:w3(U.description),link:w3(U.link),entries:K.map((X)=>({title:w3(X.title),link:w3(X.link),pubDate:w3(X.pubDate),description:w3(X.description),content:w3(X["content:encoded"])??w3(X.content)}))}}let J=z.feed;if(J){let U=Dd(J.entry);return{kind:"atom",title:w3(J.title),description:w3(J.subtitle),link:tE2(J.link),entries:U.map((K)=>({title:w3(K.title),link:tE2(K.link),pubDate:w3(K.published)??w3(K.updated),description:w3(K.summary),content:w3(K.content)??w3(K.summary)}))}}return null}async function zR2($,z){let G=performance.now(),J;try{let K=await d1($.toString(),{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(K.ok)J=Au(K.text).alternate?.[0]?.href}catch{}let U=new Set;if(J)try{U.add(new URL(J,$).toString())}catch{}for(let K of G_5)U.add(new URL(K,`${$.protocol}//${$.host}`).toString());for(let K of U){if(z.signal?.aborted)break;try{let X=await d1(K,{timeoutMs:z.timeoutMs,locale:z.locale,signal:z.signal});if(!X.ok||X.text.length<50)continue;let Q=$R2(X.text);if(!Q||Q.entries.length===0)continue;return{url:$.toString(),status:"ok",strategy:"probe",platform:"rss",httpStatus:X.status,content:X.text,contentType:X.headers.get("content-type")??void 0,elapsedMs:Math.round(performance.now()-G),signals:[],feedUrl:K,feed:Q}}catch{}}return{url:$.toString(),status:"not-found",strategy:"probe",platform:"rss",content:"",elapsedMs:Math.round(performance.now()-G),signals:[],error:"no RSS/Atom feed discovered"}}function GR2($,z="en-US"){let[G,J]=z.split("-"),U=new URL("https://news.google.com/rss/search");return U.searchParams.set("q",$),U.searchParams.set("hl",G??"en"),U.searchParams.set("gl",J??"US"),U.searchParams.set("ceid",`${J??"US"}:${G??"en"}`),U.toString()}uj();Y8();var nM={"github.com":{domain:"github.com",level:"verified",score:0.95,tags:["code-host"],source:"registry"},"docs.github.com":{domain:"docs.github.com",level:"verified",score:0.95,tags:["lang-docs"],source:"registry"},"developer.mozilla.org":{domain:"developer.mozilla.org",level:"verified",score:0.95,tags:["lang-docs"],source:"registry"},"nextjs.org":{domain:"nextjs.org",level:"verified",score:0.9,tags:["vendor","lang-docs"],source:"registry"},"vercel.com":{domain:"vercel.com",level:"verified",score:0.9,tags:["vendor"],source:"registry"},"typescriptlang.org":{domain:"typescriptlang.org",level:"verified",score:0.95,tags:["lang-docs"],source:"registry"},"stackoverflow.com":{domain:"stackoverflow.com",level:"community",score:0.7,tags:["qna"],source:"registry"},"dev.to":{domain:"dev.to",level:"external",score:0.4,tags:["blog"],source:"registry"},"medium.com":{domain:"medium.com",level:"external",score:0.35,tags:["blog"],source:"registry"},"npmjs.com":{domain:"npmjs.com",level:"verified",score:0.9,tags:["registry"],source:"registry"},"pypi.org":{domain:"pypi.org",level:"verified",score:0.9,tags:["registry"],source:"registry"},"news.ycombinator.com":{domain:"news.ycombinator.com",level:"community",score:0.65,tags:["news"],source:"registry"},"reddit.com":{domain:"reddit.com",level:"community",score:0.55,tags:["forum"],source:"registry"},"wikipedia.org":{domain:"wikipedia.org",level:"community",score:0.75,tags:["encyclopedia"],source:"registry"},"arxiv.org":{domain:"arxiv.org",level:"verified",score:0.9,tags:["academic"],source:"registry"},"doi.org":{domain:"doi.org",level:"verified",score:0.95,tags:["academic"],source:"registry"}};function U_5($){return $.replace(/^www\./,"")}function K_5($){if($ in nM){let G=nM[$];return G?{...G}:null}let z=U_5($);if(z in nM){let G=nM[z];return G?{...G}:null}return null}function X_5($){let z=$.split(".").pop();if(z==="gov"||z==="edu"||z==="mil")return{domain:$,level:"verified",score:0.9,tags:["institution"],source:"heuristic"};if(/\.gov\.[a-z]{2}$/.test($)||/\.ac\.[a-z]{2}$/.test($))return{domain:$,level:"verified",score:0.85,tags:["institution"],source:"heuristic"};return null}async function Q_5($){try{let z=await d1(`https://tranco-list.eu/api/ranks/domain/${$}`,{timeoutMs:5000});if(!z.ok)return null;let J=JSON.parse(z.text).ranks?.[0]?.rank;if(!J)return null;let U=J<1e4?0.6:J<1e5?0.4:0.2;return{domain:$,level:J<1e4?"community":"external",score:U,tags:["tranco"],source:"tranco",rank:J}}catch{return null}}async function JR2($){let z=K_5($);if(z)return z;let G=X_5($);if(G)return G;let J=await Q_5($);if(J)return J;return{domain:$,level:"unknown",score:null,tags:[],source:"heuristic"}}var UR2=["api","probe","impersonate","browser","archive"];function KR2($){if(!$)return;let z=$.split(",").map((J)=>J.trim()).filter(Boolean),G=z.filter((J)=>!UR2.includes(J));if(G.length>0)throw Error(`Unknown strategy: ${G.join(", ")}. Valid: ${UR2.join(", ")}`);return z}function nZ($){try{return new URL($)}catch{throw Error(`Invalid URL: ${$}`)}}function oz($){return{timeoutMs:$.timeout?Math.max(1000,Math.floor(Number($.timeout)*1000)):15000,locale:$.locale??"en-US,en;q=0.9"}}function d0($,z){if(z)console.log(JSON.stringify($,null,2));else console.log(JSON.stringify($))}function kU($){if(!$){process.exitCode=1;return}if($.status==="ok")process.exitCode=0;else if($.status==="blocked")process.exitCode=2;else if($.status==="not-found")process.exitCode=3;else if($.status==="invalid-input")process.exitCode=4;else if($.status==="auth-required")process.exitCode=5;else if($.status==="timeout")process.exitCode=6;else process.exitCode=1}function XR2($){let z=$.command("search").description("Mechanical search primitives — fetch, meta, rss, media, trust, code").alias("s");z.command("fetch <url>").description("Fetch URL via auto-escalating strategy pipeline").option("--only <strategies>","Comma-separated strategies to run").option("--skip <strategies>","Comma-separated strategies to skip").option("--include-archive","Include archive strategy as last fallback").option("--timeout <seconds>","Per-strategy timeout","15").option("--locale <value>","Accept-Language header","en-US,en;q=0.9").option("--pretty","Pretty-print JSON output").action(async(G,J)=>{try{let U=nZ(G),K=oz(J),X=await LE2(U,K,{only:KR2(J.only),skip:KR2(J.skip),includeArchive:J.includeArchive});d0(X,Boolean(J.pretty)),kU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("api <url>").description("Fetch via matched platform API (Phase 0)").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=nZ(G);if(!Ty(U)){console.error(S8.default.yellow(`No API handler matches host ${U.hostname}`)),process.exitCode=3;return}let X=oz(J),Q=await sF(U,X);if(!Q){process.exitCode=3;return}d0(Q,Boolean(J.pretty)),kU(Q)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("api:search <query>").description("Fan-out keyword search across platforms that support it").option("--platforms <list>","Comma-separated platform ids").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{let U=oz(J),K=J.platforms?J.platforms.split(",").map((Q)=>Q.trim()).filter(Boolean):void 0,X=await c$(G,U,K);d0(X,Boolean(J.pretty))}),z.command("meta <url>").description("Extract OGP / JSON-LD / Schema.org from URL").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=nZ(G),K=oz(J),X=await rK2(U,K),{content:Q,...Z}=X;d0(Z,Boolean(J.pretty)),kU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("rss <url>").description("Discover and parse RSS/Atom feed for a URL").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=nZ(G),K=oz(J),X=await zR2(U,K),{content:Q,...Z}=X;d0(Z,Boolean(J.pretty)),kU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("rss:google <query>").description("Build Google News RSS URL for a query").option("--locale <value>","Locale (e.g., ko-KR)","en-US").action((G,J)=>{let U=GR2(G,J.locale??"en-US");console.log(U)}),z.command("media <url>").description("Extract media metadata via yt-dlp (1858 sites)").option("--subs","Write subtitles").option("--sub-lang <list>","Subtitle languages (comma-separated)","en").option("--format <spec>","yt-dlp format spec").option("--timeout <seconds>","Timeout","30").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=nZ(G),K=oz(J),X=J.subLang?J.subLang.split(",").map((Z)=>Z.trim()).filter(Boolean):void 0,Q=await aK2(U,K,{subtitles:J.subs,...X?{subLangs:X}:{},...J.format?{format:J.format}:{}});d0(Q,Boolean(J.pretty)),kU(Q)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("archive <url>").description("Fetch via AMP / archive.today / Wayback").option("--timeout <seconds>","Timeout","15").option("--locale <value>","Accept-Language","en-US,en;q=0.9").option("--pretty","Pretty-print JSON").action(async(G,J)=>{try{let U=nZ(G),K=oz(J),X=await cj(U,K);d0(X,Boolean(J.pretty)),kU(X)}catch(U){console.error(S8.default.red(U.message)),process.exitCode=1}}),z.command("trust <domain>").description("Resolve trust level / score for a domain").option("--pretty","Pretty-print JSON").action(async(G,J)=>{let U=await JR2(G.toLowerCase());d0(U,Boolean(J.pretty))}),z.command("code <query>").description("Search code via gh / glab").option("--host <github|gitlab>","Host","github").option("--language <lang>","Language filter").option("--repo <owner/repo>","Scope to a repo").option("--limit <n>","Max results","20").option("--pretty","Pretty-print JSON").action(async(G,J)=>{let U=J.host==="gitlab"||J.host==="github"?J.host:"github",K=oz({}),X=await pK2(G,K,{host:U,...J.language?{language:J.language}:{},...J.repo?{repo:J.repo}:{},...J.limit?{limit:Number.parseInt(J.limit,10)}:{}});d0(X,Boolean(J.pretty)),kU(X)}),z.command("doctor").description("Check dependencies (Chrome, python3 curl_cffi, yt-dlp, gh)").action(async()=>{let G=[],J=Bd();G.push({name:"chrome",ok:Boolean(J),detail:J??"Install Chrome or set OMA_CHROME_PATH"}),G.push(await Md("python3",["--version"])),G.push(await Z_5()),G.push(await Md("yt-dlp",["--version"])),G.push(await Md("gh",["--version"]));for(let U of G){let K=U.ok?S8.default.green("✓"):S8.default.yellow("!");console.log(`${K} ${U.name}: ${U.detail}`)}if(G.some((U)=>!U.ok))process.exitCode=1})}async function Md($,z){return new Promise((G)=>{let{spawn:J}=X2("node:child_process"),U=J($,z,{stdio:["ignore","pipe","pipe"]}),K="";U.stdout?.on("data",(X)=>{K+=X.toString()}),U.on("error",()=>G({name:$,ok:!1,detail:"not found"})),U.on("close",(X)=>{if(X===0)G({name:$,ok:!0,detail:K.trim()});else G({name:$,ok:!1,detail:`exit code ${X}`})})})}async function Z_5(){return new Promise(($)=>{let{spawn:z}=X2("node:child_process"),G=z("python3",["-c","import curl_cffi; print(curl_cffi.__version__)"],{stdio:["ignore","pipe","pipe"]}),J="";G.stdout?.on("data",(U)=>{J+=U.toString()}),G.on("error",()=>$({name:"curl_cffi",ok:!1,detail:"python3 not found"})),G.on("close",(U)=>{if(U===0)$({name:"curl_cffi",ok:!0,detail:`v${J.trim()}`});else $({name:"curl_cffi",ok:!1,detail:"not installed (pip install curl_cffi)"})})})}X7();var rz=p2(I4(),1);import{execSync as Y_5,spawnSync as QR2}from"node:child_process";import{platform as k_5}from"node:os";function j_5(){let $=k_5();if($==="darwin")return"brew install gh";if($==="win32")return"winget install GitHub.cli";return"sudo apt install gh"}async function ZR2(){if(console.clear(),d4(rz.default.bgMagenta(rz.default.white(" ⭐ oh-my-agent star "))),!MG()){let z=j_5(),G=await F3({message:`GitHub CLI (gh) is not installed. Install with ${rz.default.cyan(z)}?`});if(k4(G)||!G){P5("Install gh manually and try again.");return}let J=I6();J.start("Installing GitHub CLI...");let U=QR2(z,{shell:!0,stdio:"pipe"});if(U.status!==0){J.stop("Installation failed"),$4.error(U.stderr?.toString()||"Unknown error"),P5("Please install gh manually.");return}J.stop("GitHub CLI installed!")}if(!J8()){$4.warn("GitHub CLI is not authenticated.");let z=await F3({message:`Run ${rz.default.cyan("gh auth login")} now?`});if(k4(z)||!z){P5("Authenticate and try again.");return}if(QR2("gh",["auth","login"],{stdio:"inherit"}),!J8()){P5("Authentication was not completed. Try again.");return}$4.success("Authenticated!")}if(IG()){P5(`Already starred ${rz.default.cyan(K1)}! Thank you! \uD83D\uDE4F`);return}let $=await F3({message:`Star ${rz.default.cyan(K1)} on GitHub?`});if(k4($)||!$){P5("Maybe next time!");return}try{Y_5(`gh api -X PUT /user/starred/${K1}`,{stdio:"ignore"}),P5(`Starred ${rz.default.cyan(K1)}! Thank you! \uD83C\uDF1F`)}catch{$4.error("Failed to star the repository."),P5("Please try again later.")}}function YR2($){$.command("star").description("Star oh-my-agent on GitHub").action(k5(async()=>{await ZR2()}))}X7();px();kk();var P3=p2(I4(),1);import{existsSync as UH,mkdirSync as W_5,readdirSync as L_5,readFileSync as kR2,writeFileSync as LR2}from"node:fs";import{dirname as H_5,join as Id}from"node:path";function B_5($){let z=ne($),G={},J=0,U=0;for(let K of z){J+=K.tokens;let X=ce(K.tokens,K.vendor);U+=X;let Q=G[K.vendor]??{tokens:0,spawns:0,usd:0};Q.tokens+=K.tokens,Q.spawns+=1,Q.usd+=X,G[K.vendor]=Q}return{totalTokens:J,totalSpawns:z.length,estimatedUsd:U,byVendor:G}}function jR2($){return $.toLocaleString("en-US")}function WR2($){if($===0)return"$0.00";if($<0.01)return"<$0.01";return`$${$.toFixed(2)}`}function Td($){return Id($,".agents","state","metrics.json")}function A_5($){return Id($,".serena","metrics.json")}function dM(){return{sessions:0,skillsUsed:{},tasksCompleted:0,totalSessionTime:0,filesChanged:0,linesAdded:0,linesRemoved:0,lastUpdated:new Date().toISOString(),startDate:new Date().toISOString()}}function V_5($){let z=Td($);if(UH(z))try{return JSON.parse(kR2(z,"utf-8"))}catch{return dM()}let G=A_5($);if(UH(G))try{return JSON.parse(kR2(G,"utf-8"))}catch{return dM()}return dM()}function F_5($,z){let G=Td($),J=H_5(G);if(!UH(J))W_5(J,{recursive:!0});z.lastUpdated=new Date().toISOString(),LR2(G,JSON.stringify(z,null,2),"utf-8")}function N_5($){let z=Id($,".serena","memories"),G={};if(!UH(z))return G;try{let J=L_5(z);for(let U of J){let K=U.match(/(?:progress|result)-(\w+)/);if(K?.[1]){let X=K[1];G[X]=(G[X]||0)+1}}}catch{}return G}async function HR2($=!1,z=!1){let G=process.cwd(),J=Td(G);if(z){if(UH(J))LR2(J,JSON.stringify(dM(),null,2),"utf-8");if($)console.log(JSON.stringify({reset:!0}));else console.log(P3.default.green("✅ Metrics reset successfully."));return}let U=V_5(G),K=Zu(G),X=N_5(G),Q=qe(G),Z=GV(G),Y=Z.startedAt?new Date(Z.startedAt):null,k=Y&&!Number.isNaN(Y.getTime())?Math.max(0,Math.floor((Date.now()-Y.getTime())/1000)):0;for(let[A,V]of Object.entries(X))U.skillsUsed[A]=(U.skillsUsed[A]||0)+V;if(Q>U.tasksCompleted)U.tasksCompleted=Q;if(Z.id){if(["completed","failed","aborted"].includes(Z.status||"")&&(U.lastSessionId!==Z.id||U.lastSessionStatus!==Z.status)&&k>0)U.totalSessionTime+=k;U.lastSessionId=Z.id,U.lastSessionStatus=Z.status,U.lastSessionStarted=Z.startedAt,U.lastSessionDuration=k}U.filesChanged+=K.filesChanged,U.linesAdded+=K.linesAdded,U.linesRemoved+=K.linesRemoved,U.sessions+=1,F_5(G,U);let j=Math.max(1,Math.ceil((Date.now()-new Date(U.startDate).getTime())/86400000)),L=U.sessions>0?Math.round(U.totalSessionTime/U.sessions):0,W=B_5(G);if($){console.log(JSON.stringify({...U,gitStats:K,daysSinceStart:j,avgSessionTime:L,cost:W},null,2));return}console.clear(),d4(P3.default.bgMagenta(P3.default.white(" \uD83D\uDCCA oh-my-agent stats ")));let H=[P3.default.bold(`\uD83D\uDCC8 Productivity Metrics (${j} days)`),"┌─────────────────────┬──────────────┐",`│ ${P3.default.bold("Metric")} │ ${P3.default.bold("Value")} │`,"├─────────────────────┼──────────────┤",`│ Sessions │ ${String(U.sessions).padEnd(12)} │`,`│ Tasks Completed │ ${String(U.tasksCompleted).padEnd(12)} │`,`│ Files Changed │ ${String(U.filesChanged).padEnd(12)} │`,`│ Lines Added │ ${P3.default.green(`+${U.linesAdded}`.padEnd(12))} │`,`│ Lines Removed │ ${P3.default.red(`-${U.linesRemoved}`.padEnd(12))} │`,"└─────────────────────┴──────────────┘"].join(`
1623
1623
  `);if(G5(H,"Overview"),W.totalSpawns>0){let A=Object.entries(W.byVendor).sort(([,F],[,N])=>N.tokens-F.tokens).map(([F,N])=>` ${F.padEnd(12)} ${jR2(N.tokens).padStart(12)} tokens · ${String(N.spawns).padStart(3)} spawns · ${WR2(N.usd).padStart(7)}`),V=[P3.default.bold("\uD83D\uDCB0 Cost Telemetry (all sessions)"),"┌─────────────────────┬──────────────┐",`│ ${P3.default.bold("Metric")} │ ${P3.default.bold("Value")} │`,"├─────────────────────┼──────────────┤",`│ Total tokens (est.) │ ${jR2(W.totalTokens).padEnd(12)} │`,`│ Total spawns │ ${String(W.totalSpawns).padEnd(12)} │`,`│ Estimated USD │ ${WR2(W.estimatedUsd).padEnd(12)} │`,"└─────────────────────┴──────────────┘",P3.default.dim("By vendor (sorted by tokens):"),...A,P3.default.dim("Estimate is input-only (prompt char approximation); output tokens not yet tracked."),P3.default.dim("Configure session.quota_cap in .agents/oma-config.yaml to enforce budgets.")].join(`
1624
1624
  `);G5(V,"Cost")}let B=Object.entries(U.skillsUsed).sort(([,A],[,V])=>V-A).slice(0,5);if(B.length>0){let A=[P3.default.bold("\uD83C\uDFC6 Top Skills Used"),...B.map(([V,F],N)=>` ${N+1}. ${V} (${F})`)].join(`
1625
- `);G5(A,"Skills")}P5(P3.default.dim(`Data stored in: ${J}`))}function BR2($){$3($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(k5(async(z)=>{await HR2(l1(z),z.reset)},{supportsJsonOutput:!0}))}X7();var c4=p2(I4(),1);import{execSync as NR2}from"node:child_process";import{cpSync as oM,existsSync as x9,mkdirSync as XH,readFileSync as dZ,rmSync as Ed,writeFileSync as WU}from"node:fs";import{tmpdir as T_5}from"node:os";import{dirname as uR2,join as L3}from"node:path";var pM=p2(I4(),1);import{execSync as u_5,spawn as O_5}from"node:child_process";import{realpathSync as AR2}from"node:fs";import KH from"node:process";var jU="oh-my-agent";function q_5($=KH.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(KH.env.IS_BINARY==="true")return{packageManager:"binary",isGlobal:!0,updateMessage:"Running as a standalone binary. Download the latest release from GitHub."};let z;try{z=Y9(AR2($))}catch{return{packageManager:"unknown",isGlobal:!1}}if(z.includes("/.npm/_npx")||z.includes("/npm/_npx"))return{packageManager:"npx",isGlobal:!1,updateMessage:"Running via npx, auto-update not applicable."};if(z.includes("/.pnpm/_pnpx")||z.includes("/.cache/pnpm/dlx"))return{packageManager:"pnpx",isGlobal:!1,updateMessage:"Running via pnpx, auto-update not applicable."};if(z.includes("/.bun/install/cache"))return{packageManager:"bunx",isGlobal:!1,updateMessage:"Running via bunx, auto-update not applicable."};if(KH.platform==="darwin")try{let G=u_5(`brew --prefix ${jU}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=Y9(AR2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${jU}`,updateMessage:"Installed via Homebrew. Updating in background..."}}}catch{}if(z.includes("/.pnpm/global")||z.includes("/.local/share/pnpm"))return{packageManager:"pnpm",isGlobal:!0,updateCommand:`pnpm add -g ${jU}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${jU}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${jU}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${jU}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var VR2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function D_5($,z){let G=$.match(VR2),J=z.match(VR2);if(!G||!J)return!1;for(let U=1;U<=3;U++){let K=Number(G[U]),X=Number(J[U]);if(K<X)return!0;if(K>X)return!1}return!1}async function M_5($=jU,z=2000){try{let G=await x$.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function FR2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(KH.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(KH.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await M_5();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!D_5($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=q_5();if(!G.updateCommand)return $.onNotice?.(pM.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return O_5(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(pM.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(pM.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var aM={name:"oh-my-agent",version:"7.20.0",description:"Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",type:"module",bin:{"oh-my-agent":"./bin/cli.js",oma:"./bin/cli.js"},files:["bin"],keywords:["oh-my-agent","antigravity",".agents","agent","skills","agent-skills","multi-agent","orchestrator","claude","claude-code","codex","opencode","copilot","cursor","chatgpt","pm","frontend","backend","mobile","qa","debug","terraform","database","workflow","bug-fixing","gemini"],author:"our.first.fluke <our.first.fluke@gmail.com>",contributors:["gracefullight <gracefullight.dev@gmail.com>","gahyun-git <go4it.gh@gmail.com>"],license:"MIT",funding:[{type:"github",url:"https://github.com/sponsors/first-fluke"},{type:"buymeacoffee",url:"https://buymeacoffee.com/firstfluke"}],scripts:{"sync:readme":"node ./scripts/sync-readme.mjs","generate:skill-data":"node ./scripts/generate-skill-data.mjs",build:"bun run generate:skill-data && bun run sync:readme && bun build cli.ts --outfile bin/cli.js --target node --minify --external @napi-rs/keyring",dev:"bun run generate:skill-data && bun run cli.ts",lint:"biome check --write --unsafe .","check:boundaries":"node ./scripts/check-boundaries.mjs",test:"vitest run","test:coverage":"vitest run --coverage",prepublishOnly:"bun run build"},dependencies:{"@clack/prompts":"^1.1.0","@date-fns/tz":"^1.4.1","@napi-rs/keyring":"^1.3.0",axios:"^1.15.0","better-sqlite3":"^12.9.0",chokidar:"^5.0.0",commander:"^14.0.3","date-fns":"^4.1.0",eld:"^2.0.3","fast-xml-parser":"^4",minimatch:"^10.2.5","p-map":"^7.0.4",picocolors:"^1.1.1","puppeteer-core":"^24",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-parse":"^11.0.0","smol-toml":"^1.6.1",unified:"^11.0.5",ws:"^8.18.0",yaml:"^2.8.2",zod:"^4.3.6"},devDependencies:{"@biomejs/biome":"2.4.5","@types/better-sqlite3":"^7.6.13","@types/mdast":"^4.0.4","@types/node":"^24","@types/ws":"^8.18.1","@vitest/coverage-v8":"^4.1.4",typescript:"^6",vitest:"^4.0.18"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},antigravity:{skillsPath:".agents/skills",skills:["oma-architecture","oma-brainstorm","oma-coordination","oma-pm","oma-frontend","oma-backend","oma-db","oma-mobile","oma-qa","oma-debug","oma-orchestrator","oma-dev-workflow","oma-tf-infra","oma-scm","oma-pdf","oma-recap"]}};function E_5($){if(!$)return{intro:(G)=>d4(G),outro:(G)=>P5(G),note:(G,J)=>G5(G,J),logError:(G)=>$4.error(G),spinnerStart:(G)=>{let J=I6();return J.start(G),J}};let z={start(G){},stop(G){if(G)console.log(G)},message(G){console.log(G)}};return{intro:(G)=>console.log(G),outro:(G)=>console.log(G),note:(G,J)=>console.log(G),logError:(G)=>console.error(G),spinnerStart:(G)=>{return console.log(G),z}}}function R_5($,z){if($!==null)return"ready";return z?"legacy":"missing"}async function Rd($=!1,z=!1){if(!z&&process.stdout.isTTY)console.clear();let G=E_5(z);G.intro(c4.default.bgMagenta(c4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let J=process.cwd();await FR2({currentVersion:aM.version,enabled:w82(J),onSpawnStart:(k)=>G.note(k,"CLI auto-update"),onNotice:(k)=>G.note(k,"CLI update available")});let U=await wF(J),K=u82(J),X=R_5(U,K);if(X==="missing"){if(G.logError("oh-my-agent is not installed in this project. Run `oma install` first."),z)throw Error("oh-my-agent is not installed in this project. Run `oma install` first.");process.exit(1)}let Q=dG(J);if(Q.length>0)G.note(Q.map((k)=>`${c4.default.green("✓")} ${k}`).join(`
1625
+ `);G5(A,"Skills")}P5(P3.default.dim(`Data stored in: ${J}`))}function BR2($){$3($.command("stats").description("View productivity metrics").option("--reset","Reset metrics data")).action(k5(async(z)=>{await HR2(l1(z),z.reset)},{supportsJsonOutput:!0}))}X7();var c4=p2(I4(),1);import{execSync as NR2}from"node:child_process";import{cpSync as oM,existsSync as x9,mkdirSync as XH,readFileSync as dZ,rmSync as Ed,writeFileSync as WU}from"node:fs";import{tmpdir as T_5}from"node:os";import{dirname as uR2,join as L3}from"node:path";var pM=p2(I4(),1);import{execSync as u_5,spawn as O_5}from"node:child_process";import{realpathSync as AR2}from"node:fs";import KH from"node:process";var jU="oh-my-agent";function q_5($=KH.argv[1]){if(!$)return{packageManager:"unknown",isGlobal:!1};if(KH.env.IS_BINARY==="true")return{packageManager:"binary",isGlobal:!0,updateMessage:"Running as a standalone binary. Download the latest release from GitHub."};let z;try{z=Y9(AR2($))}catch{return{packageManager:"unknown",isGlobal:!1}}if(z.includes("/.npm/_npx")||z.includes("/npm/_npx"))return{packageManager:"npx",isGlobal:!1,updateMessage:"Running via npx, auto-update not applicable."};if(z.includes("/.pnpm/_pnpx")||z.includes("/.cache/pnpm/dlx"))return{packageManager:"pnpx",isGlobal:!1,updateMessage:"Running via pnpx, auto-update not applicable."};if(z.includes("/.bun/install/cache"))return{packageManager:"bunx",isGlobal:!1,updateMessage:"Running via bunx, auto-update not applicable."};if(KH.platform==="darwin")try{let G=u_5(`brew --prefix ${jU}`,{encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(G){let J=Y9(AR2(G));if(z.startsWith(J))return{packageManager:"homebrew",isGlobal:!0,updateCommand:`brew upgrade ${jU}`,updateMessage:"Installed via Homebrew. Updating in background..."}}}catch{}if(z.includes("/.pnpm/global")||z.includes("/.local/share/pnpm"))return{packageManager:"pnpm",isGlobal:!0,updateCommand:`pnpm add -g ${jU}@latest`,updateMessage:"Installed via pnpm. Updating in background..."};if(z.includes("/.yarn/global"))return{packageManager:"yarn",isGlobal:!0,updateCommand:`yarn global add ${jU}@latest`,updateMessage:"Installed via yarn. Updating in background..."};if(z.includes("/.bun/install/global"))return{packageManager:"bun",isGlobal:!0,updateCommand:`bun add -g ${jU}@latest`,updateMessage:"Installed via bun. Updating in background..."};return{packageManager:"npm",isGlobal:!0,updateCommand:`npm install -g ${jU}@latest`,updateMessage:"Installed via npm. Updating in background..."}}var VR2=/^(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/;function D_5($,z){let G=$.match(VR2),J=z.match(VR2);if(!G||!J)return!1;for(let U=1;U<=3;U++){let K=Number(G[U]),X=Number(J[U]);if(K<X)return!0;if(K>X)return!1}return!1}async function M_5($=jU,z=2000){try{let G=await x$.get(`https://registry.npmjs.org/${$}/latest`,{timeout:z});return typeof G.data?.version==="string"?G.data.version:null}catch{return null}}async function FR2($){if(!$.enabled)return{triggered:!1,reason:"disabled"};if(KH.env.OMA_SKIP_VERSION_CHECK==="1")return{triggered:!1,reason:"skipped-env"};if(KH.env.NODE_ENV==="development")return{triggered:!1,reason:"skipped-env"};let z=await M_5();if(!z)return{triggered:!1,reason:"fetch-failed"};if(!D_5($.currentVersion,z))return{triggered:!1,reason:"up-to-date",latest:z};let G=q_5();if(!G.updateCommand)return $.onNotice?.(pM.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. ${G.updateMessage??"Update manually."}`)),{triggered:!1,reason:"non-upgradable",latest:z};try{return O_5(G.updateCommand,{stdio:"ignore",shell:!0,detached:!0}).unref(),$.onSpawnStart?.(pM.default.cyan(`global oh-my-agent ${$.currentVersion} → ${z} updating in background. New version applies on next run.`)),{triggered:!0,latest:z}}catch{return $.onNotice?.(pM.default.yellow(`global oh-my-agent ${$.currentVersion} → ${z} available. Run: ${G.updateCommand}`)),{triggered:!1,reason:"spawn-failed",latest:z}}}var aM={name:"oh-my-agent",version:"7.20.1",description:"Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",type:"module",bin:{"oh-my-agent":"./bin/cli.js",oma:"./bin/cli.js"},files:["bin"],keywords:["oh-my-agent","antigravity",".agents","agent","skills","agent-skills","multi-agent","orchestrator","claude","claude-code","codex","opencode","copilot","cursor","chatgpt","pm","frontend","backend","mobile","qa","debug","terraform","database","workflow","bug-fixing","gemini"],author:"our.first.fluke <our.first.fluke@gmail.com>",contributors:["gracefullight <gracefullight.dev@gmail.com>","gahyun-git <go4it.gh@gmail.com>"],license:"MIT",funding:[{type:"github",url:"https://github.com/sponsors/first-fluke"},{type:"buymeacoffee",url:"https://buymeacoffee.com/firstfluke"}],scripts:{"sync:readme":"node ./scripts/sync-readme.mjs","generate:skill-data":"node ./scripts/generate-skill-data.mjs",build:"bun run generate:skill-data && bun run sync:readme && bun build cli.ts --outfile bin/cli.js --target node --minify --external @napi-rs/keyring",dev:"bun run generate:skill-data && bun run cli.ts",lint:"biome check --write --unsafe .","check:boundaries":"node ./scripts/check-boundaries.mjs",test:"vitest run","test:coverage":"vitest run --coverage",prepublishOnly:"bun run build"},dependencies:{"@clack/prompts":"^1.1.0","@date-fns/tz":"^1.4.1","@napi-rs/keyring":"^1.3.0",axios:"^1.15.0","better-sqlite3":"^12.9.0",chokidar:"^5.0.0",commander:"^14.0.3","date-fns":"^4.1.0",eld:"^2.0.3","fast-xml-parser":"^4",minimatch:"^10.2.5","p-map":"^7.0.4",picocolors:"^1.1.1","puppeteer-core":"^24",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-parse":"^11.0.0","smol-toml":"^1.6.1",unified:"^11.0.5",ws:"^8.18.0",yaml:"^2.8.2",zod:"^4.3.6"},devDependencies:{"@biomejs/biome":"2.4.5","@types/better-sqlite3":"^7.6.13","@types/mdast":"^4.0.4","@types/node":"^24","@types/ws":"^8.18.1","@vitest/coverage-v8":"^4.1.4",typescript:"^6",vitest:"^4.0.18"},repository:{type:"git",url:"https://github.com/first-fluke/oh-my-agent"},antigravity:{skillsPath:".agents/skills",skills:["oma-architecture","oma-brainstorm","oma-coordination","oma-pm","oma-frontend","oma-backend","oma-db","oma-mobile","oma-qa","oma-debug","oma-orchestrator","oma-dev-workflow","oma-tf-infra","oma-scm","oma-pdf","oma-recap"]}};function E_5($){if(!$)return{intro:(G)=>d4(G),outro:(G)=>P5(G),note:(G,J)=>G5(G,J),logError:(G)=>$4.error(G),spinnerStart:(G)=>{let J=I6();return J.start(G),J}};let z={start(G){},stop(G){if(G)console.log(G)},message(G){console.log(G)}};return{intro:(G)=>console.log(G),outro:(G)=>console.log(G),note:(G,J)=>console.log(G),logError:(G)=>console.error(G),spinnerStart:(G)=>{return console.log(G),z}}}function R_5($,z){if($!==null)return"ready";return z?"legacy":"missing"}async function Rd($=!1,z=!1){if(!z&&process.stdout.isTTY)console.clear();let G=E_5(z);G.intro(c4.default.bgMagenta(c4.default.white(" \uD83D\uDEF8 oh-my-agent update ")));let J=process.cwd();await FR2({currentVersion:aM.version,enabled:w82(J),onSpawnStart:(k)=>G.note(k,"CLI auto-update"),onNotice:(k)=>G.note(k,"CLI update available")});let U=await wF(J),K=u82(J),X=R_5(U,K);if(X==="missing"){if(G.logError("oh-my-agent is not installed in this project. Run `oma install` first."),z)throw Error("oh-my-agent is not installed in this project. Run `oma install` first.");process.exit(1)}let Q=dG(J);if(Q.length>0)G.note(Q.map((k)=>`${c4.default.green("✓")} ${k}`).join(`
1626
1626
  `),"Migration");let Z=Q.length>0||Qy(J);if(Q.length>0&&!Qy(J))Zy(J,!0);if(!z)await CF(J);if(X==="legacy")G.note("Existing .agents installation detected without _version.json. Updating in place and restoring version metadata.","Legacy install");let Y;try{Y=G.spinnerStart("Checking for updates...");let k=await T82();if(U===k.version&&!Z){Y.stop(c4.default.green("Already up to date!")),G.outro(`Current version: ${c4.default.cyan(U)}`);return}let j=U===k.version;Y.message(`Downloading ${c4.default.cyan(k.version)}...`);let{dir:L,cleanup:W}=await rK();try{Y.message("Copying files..."),dG(J);let H=L3(J,".agents","oma-config.yaml"),B=L3(J,".agents","mcp.json"),A=!$&&x9(H)?dZ(H):null,V=!$&&x9(B)?dZ(B):null,F=L3(T_5(),`oma-stack-backup-${Date.now()}`),N=L3(J,".agents","skills","oma-backend","stack"),u=!$&&x9(N);if(u)XH(F,{recursive:!0}),oM(N,L3(F,"oma-backend"),{recursive:!0});let q=["snippets.md","tech-stack.md","api-template.py"],I=L3(J,".agents","skills","oma-backend","resources"),M=!$&&!u&&q.some((J2)=>x9(L3(I,J2))),D=Yy(J);if(oM(L3(L,".agents"),L3(J,".agents"),{recursive:!0,force:!0}),A)WU(H,A);if(V)WU(B,V);if(u)try{XH(N,{recursive:!0}),oM(L3(F,"oma-backend"),N,{recursive:!0,force:!0})}finally{Ed(F,{recursive:!0,force:!0})}if(M){let J2=L3(L,".agents","skills","oma-backend","variants","python");if(x9(J2))XH(N,{recursive:!0}),oM(J2,N,{recursive:!0,force:!0}),WU(L3(N,"stack.yaml"),`language: python
1627
1627
  framework: fastapi
1628
1628
  orm: sqlalchemy
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-agent",
3
- "version": "7.20.0",
3
+ "version": "7.20.1",
4
4
  "description": "Portable multi-agent harness for .agents-based skills and workflows across Antigravity, Claude Code, Codex, OpenCode, and more",
5
5
  "type": "module",
6
6
  "bin": {