glance-cli 0.11.0 → 0.11.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/dist/cli.js +2 -2
  2. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -894,7 +894,7 @@ ${E.message}`:x,K1=[Q1,Q,A].filter(Boolean).join(`
894
894
  `:`
895
895
  `)+B,C=E+1,E=A.indexOf(`
896
896
  `,C)}while(E!==-1);return U+=A.slice(C),U}var{stdout:hkA,stderr:fkA}=gkA,J1A=Symbol("GENERATOR"),y11=Symbol("STYLER"),lB1=Symbol("IS_EMPTY"),kkA=["ansi","ansi","ansi256","ansi16m"],x11=Object.create(null),Fx2=(A,Q={})=>{if(Q.level&&!(Number.isInteger(Q.level)&&Q.level>=0&&Q.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let B=hkA?hkA.level:0;A.level=Q.level===void 0?B:Q.level};var Ex2=(A)=>{let Q=(...B)=>B.join(" ");return Fx2(Q,A),Object.setPrototypeOf(Q,iB1.prototype),Q};function iB1(A){return Ex2(A)}Object.setPrototypeOf(iB1.prototype,Function.prototype);for(let[A,Q]of Object.entries(Ij))x11[A]={get(){let B=kw1(this,U1A(Q.open,Q.close,this[y11]),this[lB1]);return Object.defineProperty(this,A,{value:B}),B}};x11.visible={get(){let A=kw1(this,this[y11],!0);return Object.defineProperty(this,"visible",{value:A}),A}};var I1A=(A,Q,B,...E)=>{if(A==="rgb"){if(Q==="ansi16m")return Ij[B].ansi16m(...E);if(Q==="ansi256")return Ij[B].ansi256(Ij.rgbToAnsi256(...E));return Ij[B].ansi(Ij.rgbToAnsi(...E))}if(A==="hex")return I1A("rgb",Q,B,...Ij.hexToRgb(...E));return Ij[B][A](...E)},Cx2=["rgb","hex","ansi256"];for(let A of Cx2){x11[A]={get(){let{level:B}=this;return function(...E){let C=U1A(I1A(A,kkA[B],"color",...E),Ij.color.close,this[y11]);return kw1(this,C,this[lB1])}}};let Q="bg"+A[0].toUpperCase()+A.slice(1);x11[Q]={get(){let{level:B}=this;return function(...E){let C=U1A(I1A(A,kkA[B],"bgColor",...E),Ij.bgColor.close,this[y11]);return kw1(this,C,this[lB1])}}}}var Yx2=Object.defineProperties(()=>{},{...x11,level:{enumerable:!0,get(){return this[J1A].level},set(A){this[J1A].level=A}}}),U1A=(A,Q,B)=>{let E,C;if(B===void 0)E=A,C=Q;else E=B.openAll+A,C=Q+B.closeAll;return{open:A,close:Q,openAll:E,closeAll:C,parent:B}},kw1=(A,Q,B)=>{let E=(...C)=>Jx2(E,C.length===1?""+C[0]:C.join(" "));return Object.setPrototypeOf(E,Yx2),E[J1A]=A,E[y11]=Q,E[lB1]=B,E},Jx2=(A,Q)=>{if(A.level<=0||!Q)return A[lB1]?"":Q;let B=A[y11];if(B===void 0)return Q;let{openAll:E,closeAll:C}=B;if(Q.includes("\x1B"))while(B!==void 0)Q=ykA(Q,B.close,B.open),B=B.parent;let U=Q.indexOf(`
897
- `);if(U!==-1)Q=xkA(Q,C,E,U);return E+Q+C};Object.defineProperties(iB1.prototype,x11);var Ix2=iB1(),H74=iB1({level:fkA?fkA.level:0});var c6=Ix2;class Uj extends Error{code;userMessage;recoverable;hint;constructor(A,Q,B,E=!1,C){super(A);this.code=Q;this.userMessage=B;this.recoverable=E;this.hint=C;this.name="GlanceError"}}var h11={INVALID_URL:"INVALID_URL",INVALID_LANGUAGE:"INVALID_LANGUAGE",INVALID_MAX_TOKENS:"INVALID_MAX_TOKENS",API_KEY_MISSING:"API_KEY_MISSING",API_KEY_INVALID:"API_KEY_INVALID",FETCH_FAILED:"FETCH_FAILED",CONTENT_TOO_LARGE:"CONTENT_TOO_LARGE",SUMMARIZE_FAILED:"SUMMARIZE_FAILED",CACHE_ERROR:"CACHE_ERROR",VOICE_SYNTHESIS_FAILED:"VOICE_SYNTHESIS_FAILED",SCREENSHOT_FAILED:"SCREENSHOT_FAILED",EXPORT_FAILED:"EXPORT_FAILED"};class _kA{level="info";setLevel(A){this.level=A}getLevel(){return this.level}debug(...A){if(this.level==="debug")console.log(c6.gray("[DEBUG]"),...A)}info(...A){if(["debug","info"].includes(this.level))console.log(c6.blue("[INFO]"),...A)}warn(...A){if(["debug","info","warn"].includes(this.level))console.warn(c6.yellow("[WARN]"),...A)}error(...A){console.error(c6.red("[ERROR]"),...A)}}var bX=new _kA;var jO={VERSION:"0.11.0",MAX_CONTENT_SIZE:10485760,FETCH_TIMEOUT:30000,RETRY_ATTEMPTS:3,RETRY_DELAY:1000,OLLAMA_ENDPOINT:process.env.OLLAMA_ENDPOINT||"http://localhost:11434"},f11={en:"English",fr:"French",es:"Spanish",ht:"Haitian Creole"},$74=Object.keys(f11);function bkA(){console.log(`
897
+ `);if(U!==-1)Q=xkA(Q,C,E,U);return E+Q+C};Object.defineProperties(iB1.prototype,x11);var Ix2=iB1(),H74=iB1({level:fkA?fkA.level:0});var c6=Ix2;class Uj extends Error{code;userMessage;recoverable;hint;constructor(A,Q,B,E=!1,C){super(A);this.code=Q;this.userMessage=B;this.recoverable=E;this.hint=C;this.name="GlanceError"}}var h11={INVALID_URL:"INVALID_URL",INVALID_LANGUAGE:"INVALID_LANGUAGE",INVALID_MAX_TOKENS:"INVALID_MAX_TOKENS",API_KEY_MISSING:"API_KEY_MISSING",API_KEY_INVALID:"API_KEY_INVALID",FETCH_FAILED:"FETCH_FAILED",CONTENT_TOO_LARGE:"CONTENT_TOO_LARGE",SUMMARIZE_FAILED:"SUMMARIZE_FAILED",CACHE_ERROR:"CACHE_ERROR",VOICE_SYNTHESIS_FAILED:"VOICE_SYNTHESIS_FAILED",SCREENSHOT_FAILED:"SCREENSHOT_FAILED",EXPORT_FAILED:"EXPORT_FAILED"};class _kA{level="info";setLevel(A){this.level=A}getLevel(){return this.level}debug(...A){if(this.level==="debug")console.log(c6.gray("[DEBUG]"),...A)}info(...A){if(["debug","info"].includes(this.level))console.log(c6.blue("[INFO]"),...A)}warn(...A){if(["debug","info","warn"].includes(this.level))console.warn(c6.yellow("[WARN]"),...A)}error(...A){console.error(c6.red("[ERROR]"),...A)}}var bX=new _kA;var jO={VERSION:"0.11.1",MAX_CONTENT_SIZE:10485760,FETCH_TIMEOUT:30000,RETRY_ATTEMPTS:3,RETRY_DELAY:1000,OLLAMA_ENDPOINT:process.env.OLLAMA_ENDPOINT||"http://localhost:11434"},f11={en:"English",fr:"French",es:"Spanish",ht:"Haitian Creole"},$74=Object.keys(f11);function bkA(){console.log(`
898
898
  ${c6.bold("glance")} v${jO.VERSION} – AI-powered web reader
899
899
 
900
900
  ${c6.bold("Usage:")}
@@ -1289,7 +1289,7 @@ ${Q}`,y54=Object.getOwnPropertyDescriptor(Function.prototype,"toString"),x54=Obj
1289
1289
 
1290
1290
  `).trim();return E}async function SXA(A,Q={}){let{attempts:B=jO.RETRY_ATTEMPTS,delay:E=jO.RETRY_DELAY,backoff:C=2,onRetry:U}=Q,X;for(let H=1;H<=B;H++)try{return await A()}catch(N){if(X=N,N instanceof Uj&&!N.recoverable)throw N;if(N.status&&[400,401,403,404].includes(N.status))throw N;if(H<B){let w=E*Math.pow(C,H-1);if(U)U(H,N);else bX.debug(`Retry attempt ${H}/${B} after ${w}ms`);await new Promise((L)=>setTimeout(L,w))}}throw X}function sq(A){return qXA({text:A,spinner:"dots",color:"cyan"})}function zh1(A){let Q=["B","KB","MB","GB"],B=A,E=0;while(B>=1024&&E<Q.length-1)B/=1024,E++;return`${B.toFixed(2)} ${Q[E]}`}function V72(A){let Q=A.split(".");return Q.length>1?Q[Q.length-1]?.toLowerCase()??"":""}async function W72(A,Q={}){let B=Date.now();if(Q.debug)bX.setLevel("debug");let E=Q.language||"en",C=f11[E]||"English",U=sq("Fetching webpage...");U.start();let X;try{X=await SXA(()=>X70(A,{fullRender:Q.fullRender}),{onRetry:(g,y)=>{U.text=`Fetching webpage... (retry ${g})`}}),U.succeed("Webpage fetched successfully")}catch(g){throw U.fail("Failed to fetch webpage"),new Uj(g.message,h11.FETCH_FAILED,"Could not fetch the webpage. Please check the URL and your internet connection.",!0,"Try again or use --full-render for JavaScript-heavy sites")}let H=sq("Extracting content...");H.start();let N=RBA(X);if(!Q.language&&c52()){let g=d52(A,X,N,Q.language);if(E=g.detected,C=f11[E]||"English",g.confidence!=="high"&&g.source!=="default")bX.info(`Auto-detected language: ${C}`);if(Q.debug)bX.debug(`Language detected: ${E} (${g.confidence} confidence from ${g.source})`),bX.debug(`Detection signals: ${g.signals.join(", ")}`)}if(N.length>jO.MAX_CONTENT_SIZE)throw H.fail("Content too large"),new Uj(`Content size (${zh1(N.length)}) exceeds maximum allowed`,h11.CONTENT_TOO_LARGE,`The webpage content is too large to process (>${zh1(jO.MAX_CONTENT_SIZE)})`,!1);if(H.succeed(`Content extracted (${zh1(N.length)})`),Q.metadata){let g=eX0(X);console.log(c6.bold(`
1291
1291
  \uD83D\uDCCA Page Metadata:`)),console.log(lg1(JSON.stringify(g,null,2),{format:"json",url:A}))}if(Q.links){let g=tX0(X);console.log(c6.bold(`
1292
- \uD83D\uDD17 Found ${g.length} links:`)),g.forEach((y)=>{let x=y.text?`${y.text} (${y.href})`:y.href;console.log(c6.cyan(` • ${x}`))})}if(Q.screenshot)await A74(A,Q.screenshot);if(Q.full)return await r54(N,{language:E,...Q});let{rawSummary:w,formattedSummary:L}=await t54(N,A,{...Q,language:E});if(Q.read||Q.audioOutput){console.log(L),console.log("");let g=m52(w);return await e54(g,{language:E,...Q}),L}let O=L;if(Q.output)await H72(O,Q.output);let v=Date.now()-B;return bX.debug(`Total execution time: ${v}ms`),O}function G72(A){if(A.format)return{md:"markdown",json:"json",plain:"plain",markdown:"markdown",terminal:"terminal"}[A.format.toLowerCase()]||"terminal";if(A.output){let Q=V72(A.output).toLowerCase(),E={md:"markdown",markdown:"markdown",json:"json",txt:"plain",text:"plain"}[Q];if(E)return E}return"terminal"}async function H72(A,Q){try{await s54(Q,A,"utf-8"),bX.info(`Content saved to ${Q}`)}catch(B){throw new Uj(B.message,h11.EXPORT_FAILED,`Failed to save content to ${Q}`,!1)}}async function r54(A,Q){let B=A,E=Q.language&&Q.language!=="en";{let U=sq(E?"\uD83C\uDF0D Translating and formatting full content...":"\uD83E\uDDFE Applying smart formatting...");U.start();try{let X=Q.model||await GXA(void 0,!!Q.preferQuality),H=YJA(X),N={model:X,language:Q.language,stream:!1,maxTokens:Q.maxTokens||8000,translate:E,format:!0},w=await JJA(B,{model:N.model,language:N.language,stream:N.stream,maxTokens:N.maxTokens,translate:N.translate,format:N.format});B=pI1(w),U.succeed(E?"Translation and formatting complete":"Smart formatting applied")}catch(X){U.fail(E?"Translation failed - showing original content":"Smart formatting failed - showing original content"),bX.error("Full content processing error:",X)}}let C=lg1(B,{format:G72(Q),url:"full-content",isFullContent:!0});if(Q.output)await H72(C,Q.output);return C}async function t54(A,Q,B){let E=B.model||await GXA(void 0,!!B.preferQuality);if(!B.freeOnly)await u52(E);let C=B.stream?null:sq(`Processing with ${E}...`);C?.start();try{let U=await SXA(()=>JJA(A,{model:E,tldr:B.tldr,keyPoints:B.keyPoints,eli5:B.eli5,language:B.language,stream:B.stream,maxTokens:B.maxTokens,customQuestion:B.customQuestion}),{attempts:2,onRetry:(N)=>{if(C)C.text=`Processing with ${E}... (retry ${N})`}});C?.succeed("Summary generated successfully");let X=X72(pI1(U)),H=lg1(X,{format:G72(B),url:Q,customQuestion:B.customQuestion});return{rawSummary:X,formattedSummary:H}}catch(U){throw C?.fail("Failed to generate summary"),new Uj(U.message,h11.SUMMARIZE_FAILED,"Failed to generate summary. The AI service might be unavailable.",!0,"Try a different model with --model or check your API keys")}}async function e54(A,Q){try{let B=WXA();if(Q.audioOutput){let E=sq(`\uD83C\uDFB5 Generating audio file: ${Q.audioOutput}`);E.start();let C=await B.synthesizeCleanedText(A,{voice:Q.voice,language:Q.language,outputFile:Q.audioOutput});if(!C.success)throw new Error(C.error||"Voice synthesis failed");E.succeed(`\uD83C\uDFB5 Audio saved to ${Q.audioOutput}`)}else{let E=sq("\uD83C\uDFA4 Generating speech and preparing to read aloud...");E.start();let C=await B.synthesizeCleanedText(A,{voice:Q.voice,language:Q.language});if(!C.success)throw new Error(C.error||"Voice synthesis failed");E.succeed("\uD83C\uDFA4 Reading aloud completed")}}catch(B){throw bX.error("Voice synthesis failed:",B),new Uj(B.message,h11.VOICE_SYNTHESIS_FAILED,"Failed to synthesize voice. Check your voice settings or try a different voice.",!1)}}async function A74(A,Q){let B=sq(`Capturing screenshot: ${Q}`);B.start();try{await Hj0(A,Q),B.succeed(`Screenshot saved to ${Q}`)}catch(E){B.fail("Failed to capture screenshot"),bX.error("Screenshot error:",E)}}async function K72(){try{let A=WXA(),Q=await A.listVoices("en"),B=await A.listVoices("fr"),E=await A.listVoices("es"),C=await A.listVoices("ht");if(console.log(c6.bold(`
1292
+ \uD83D\uDD17 Found ${g.length} links:`)),g.forEach((y)=>{let x=y.text?`${y.text} (${y.href})`:y.href;console.log(c6.cyan(` • ${x}`))})}if(Q.screenshot)await A74(A,Q.screenshot);if(Q.full)return await r54(N,{...Q,language:E});let{rawSummary:w,formattedSummary:L}=await t54(N,A,{...Q,language:E});if(Q.read||Q.audioOutput){console.log(L),console.log("");let g=m52(w);return await e54(g,{language:E,...Q}),L}let O=L;if(Q.output)await H72(O,Q.output);let v=Date.now()-B;return bX.debug(`Total execution time: ${v}ms`),O}function G72(A){if(A.format)return{md:"markdown",json:"json",plain:"plain",markdown:"markdown",terminal:"terminal"}[A.format.toLowerCase()]||"terminal";if(A.output){let Q=V72(A.output).toLowerCase(),E={md:"markdown",markdown:"markdown",json:"json",txt:"plain",text:"plain"}[Q];if(E)return E}return"terminal"}async function H72(A,Q){try{await s54(Q,A,"utf-8"),bX.info(`Content saved to ${Q}`)}catch(B){throw new Uj(B.message,h11.EXPORT_FAILED,`Failed to save content to ${Q}`,!1)}}async function r54(A,Q){let B=A,E=Q.language&&Q.language!=="en";{let U=sq(E?"\uD83C\uDF0D Translating and formatting full content...":"\uD83E\uDDFE Applying smart formatting...");U.start();try{let X=Q.model||await GXA(void 0,!!Q.preferQuality),H=YJA(X),N={model:X,language:Q.language,stream:!1,maxTokens:Q.maxTokens||8000,translate:E,format:!0},w=await JJA(B,{model:N.model,language:N.language,stream:N.stream,maxTokens:N.maxTokens,translate:N.translate,format:N.format});B=pI1(w),U.succeed(E?"Translation and formatting complete":"Smart formatting applied")}catch(X){U.fail(E?"Translation failed - showing original content":"Smart formatting failed - showing original content"),bX.error("Full content processing error:",X)}}let C=lg1(B,{format:G72(Q),url:"full-content",isFullContent:!0});if(Q.output)await H72(C,Q.output);return C}async function t54(A,Q,B){let E=B.model||await GXA(void 0,!!B.preferQuality);if(!B.freeOnly)await u52(E);let C=B.stream?null:sq(`Processing with ${E}...`);C?.start();try{let U=await SXA(()=>JJA(A,{model:E,tldr:B.tldr,keyPoints:B.keyPoints,eli5:B.eli5,language:B.language,stream:B.stream,maxTokens:B.maxTokens,customQuestion:B.customQuestion}),{attempts:2,onRetry:(N)=>{if(C)C.text=`Processing with ${E}... (retry ${N})`}});C?.succeed("Summary generated successfully");let X=X72(pI1(U)),H=lg1(X,{format:G72(B),url:Q,customQuestion:B.customQuestion});return{rawSummary:X,formattedSummary:H}}catch(U){throw C?.fail("Failed to generate summary"),new Uj(U.message,h11.SUMMARIZE_FAILED,"Failed to generate summary. The AI service might be unavailable.",!0,"Try a different model with --model or check your API keys")}}async function e54(A,Q){try{let B=WXA();if(Q.audioOutput){let E=sq(`\uD83C\uDFB5 Generating audio file: ${Q.audioOutput}`);E.start();let C=await B.synthesizeCleanedText(A,{voice:Q.voice,language:Q.language,outputFile:Q.audioOutput});if(!C.success)throw new Error(C.error||"Voice synthesis failed");E.succeed(`\uD83C\uDFB5 Audio saved to ${Q.audioOutput}`)}else{let E=sq("\uD83C\uDFA4 Generating speech and preparing to read aloud...");E.start();let C=await B.synthesizeCleanedText(A,{voice:Q.voice,language:Q.language});if(!C.success)throw new Error(C.error||"Voice synthesis failed");E.succeed("\uD83C\uDFA4 Reading aloud completed")}}catch(B){throw bX.error("Voice synthesis failed:",B),new Uj(B.message,h11.VOICE_SYNTHESIS_FAILED,"Failed to synthesize voice. Check your voice settings or try a different voice.",!1)}}async function A74(A,Q){let B=sq(`Capturing screenshot: ${Q}`);B.start();try{await Hj0(A,Q),B.succeed(`Screenshot saved to ${Q}`)}catch(E){B.fail("Failed to capture screenshot"),bX.error("Screenshot error:",E)}}async function K72(){try{let A=WXA(),Q=await A.listVoices("en"),B=await A.listVoices("fr"),E=await A.listVoices("es"),C=await A.listVoices("ht");if(console.log(c6.bold(`
1293
1293
  \uD83C\uDFA4 Available Voices by Language:
1294
1294
  `)),Q.length>0)console.log(c6.bold("\uD83C\uDDFA\uD83C\uDDF8 English:")),Q.forEach((U)=>console.log(` ${U}`));if(B.length>0)console.log(c6.bold(`
1295
1295
  \uD83C\uDDEB\uD83C\uDDF7 French:`)),B.forEach((U)=>console.log(` ${U}`));if(E.length>0)console.log(c6.bold(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "glance-cli",
3
- "version": "0.11.0",
3
+ "version": "0.11.1",
4
4
  "author": {
5
5
  "name": "Kenley Jean",
6
6
  "email": "alo@jkenley.me",