fluxflow-cli 4.24.8 → 4.25.0

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 (27) hide show
  1. package/dist/chunks/{ai-GKU62P7B.js → ai-IHT7BYEA.js} +1 -1
  2. package/dist/chunks/{app-UBBTQ7FY.js → app-FPNTVYSV.js} +2 -2
  3. package/dist/chunks/chunk-A73HW6DI.js +5 -0
  4. package/dist/chunks/{chunk-7M3AFLUN.js → chunk-NQTRYK6U.js} +1 -1
  5. package/dist/chunks/chunk-NYIPDIEQ.js +31 -0
  6. package/dist/chunks/{chunk-DYIWPH2W.js → chunk-RTT7P5KS.js} +1 -1
  7. package/dist/chunks/{chunk-VB5NDACN.js → chunk-S5MJT3L5.js} +75 -76
  8. package/dist/chunks/{chunk-LQHSNXBM.js → chunk-U2NRX2PX.js} +4 -4
  9. package/dist/chunks/click-NULWZ3IK.js +2 -0
  10. package/dist/chunks/{computer_action-2XHXRO56.js → computer_action-OQ3CWQU3.js} +1 -1
  11. package/dist/chunks/{drag-UYQLP2NB.js → drag-RLRC6JFF.js} +1 -1
  12. package/dist/chunks/{exec_command-THB36X3Y.js → exec_command-J23EG77W.js} +1 -1
  13. package/dist/chunks/{export-DEFENSGY.js → export-GPCAD6JI.js} +1 -1
  14. package/dist/chunks/{invoke-X747MSTY.js → invoke-AYPOVSTU.js} +2 -2
  15. package/dist/chunks/{invokeSync-XXYD7O2F.js → invokeSync-XW4AQKZ3.js} +2 -2
  16. package/dist/chunks/{key_press-IN6BOWVJ.js → key_press-7F6CAPZD.js} +1 -1
  17. package/dist/chunks/{keyboard_typing-YEMPELE2.js → keyboard_typing-RPPKNVTA.js} +1 -1
  18. package/dist/chunks/screen_grid-3F55Z22R.js +1 -0
  19. package/dist/chunks/{scroll-C7SG5G2G.js → scroll-QVQD7I6A.js} +1 -1
  20. package/dist/chunks/ui_detector_onnx-YGGFMOK5.js +1 -0
  21. package/dist/cli.js +5 -5
  22. package/dist/package.json +4 -3
  23. package/package.json +4 -3
  24. package/dist/chunks/chunk-6AWSJNXE.js +0 -31
  25. package/dist/chunks/chunk-KNCL7AK2.js +0 -5
  26. package/dist/chunks/click-2HXMMZIS.js +0 -2
  27. package/dist/chunks/screen_grid-GBIGOR5Q.js +0 -1
@@ -1,4 +1,4 @@
1
- import{execSync as a}from"child_process";var t=null,k=()=>{if(process.platform!=="win32")return!1;if(t!==null)return t;try{a("where.exe pwsh.exe",{stdio:"ignore",windowsHide:!0}),t=!0}catch{t=!1}return t},r=null,o=()=>{if(process.platform!=="win32")return!1;if(r!==null)return r;try{a("where.exe powershell.exe",{stdio:"ignore",windowsHide:!0}),r=!0}catch{r=!1}return r},w=()=>k()?"pwsh":o()?"powershell":"cmd",n=null,v=(e,l,c,u,d=!1,g=!0,p,f=!1)=>{n===null&&(n=d);let m=`- JSON escape literal sequences, backslash: \\\\, newLine: \\ n
1
+ import{execSync as o}from"child_process";var t=null,k=()=>{if(process.platform!=="win32")return!1;if(t!==null)return t;try{o("where.exe pwsh.exe",{stdio:"ignore",windowsHide:!0}),t=!0}catch{t=!1}return t},r=null,a=()=>{if(process.platform!=="win32")return!1;if(r!==null)return r;try{o("where.exe powershell.exe",{stdio:"ignore",windowsHide:!0}),r=!0}catch{r=!1}return r},w=()=>k()?"pwsh":a()?"powershell":"cmd",n=null,v=(e,l,c,u,d=!1,g=!0,p,f=!1)=>{n===null&&(n=d);let m=`- JSON escape literal sequences, backslash: \\\\, newLine: \\ n
2
2
  - Same file, multiple edits? One PatchFile (\u226415 blocks)${p?"":`
3
3
  - Action denied? Ask for guidance`}
4
4
  - Need text or huge file? CodeSearch > Full Read
@@ -11,7 +11,7 @@ import{execSync as a}from"child_process";var t=null,k=()=>{if(process.platform!=
11
11
  - PatchFile(path=string, allowMultiple?=bool, searchContent1="string match OR ^LINE:start..end$", newContent1=string, ...MAX15). Small searchString. Line Anchor: ^LINE:...$ syntax, must for large blocks & escape sequences
12
12
  - WriteFile(path=string, content=string). Creates/Overwrites. File Exist? PatchFile > WriteFile
13
13
  - CodeSearch(keyword=string, path?="dir/file/glob, inclusion/exclusion ;-separated", regex?=bool:auto). Find relevant code
14
- - Run(command=string). Runs ${l==="Windows"?o()?"powershell":"windows CMD":"bash"} command. Destructive command \u2192 Ask user${f?"":`
14
+ - Run(command=string). Runs ${l==="Windows"?a()?"powershell":"windows CMD":"bash"} command. Destructive command \u2192 Ask user${f?"":`
15
15
  - Goal(method="create/append/get", tasks=string[], markDone=string[]). If long multi-task: create Goals before starting. get + markDone marks complete`}
16
16
  ${n?`
17
17
  **Emergency**
@@ -30,7 +30,7 @@ Invocations:
30
30
  - Cancel(id=string). Cancel async task ONLY if stalled (2m+) or incorrect`:""}`,h=`**Creative Actions (path = relative; first argument, path separator: '/')**
31
31
  - WritePDF(path=string, content=string, orientation="landscape/portrait"). Proactive A4 page breaks must in css. HTML/CSS for premium layout, stable margins & headers/footers, no watermarks
32
32
  - WriteDoc(path=string, content=string). A4 Word document, no watermarks, stable margins & headers/footers`,s=`**Computer Use (Desktop Automation)**
33
- - Click(gridId=int, type="single/double", button="left/middle/right", intendedClickText=string). Click target grid number, intendedClickText: literal text/symbol on screen (OCR scannable, upto 3 words). Double click desktop icons
33
+ - Click(gridId=int, type="single/double", button="left/middle/right", intendedClickText=string, ocrCorrection?=bool:true). Click target grid number, intendedClickText: literal text/symbol on screen (OCR scannable, upto 3 words). Double click desktop icons, nonOCR element/icon/toggle? ocrCorrection=false
34
34
  - Drag(fromGridId=int, toGridId=int). Drag mouse from start grid number to target grid number
35
35
  - Scroll(direction="up/down", gridId=int). Scroll viewport vertically
36
36
  - KeyboardTyping(text=string, autoPressEnter?=bool). Type text string into currently active input. JSON escape literal escape sequences
@@ -49,4 +49,4 @@ ${e==="Flux"||e.toLowerCase()==="fluxcu"?`${m}`:""}
49
49
  - WebScrape(url=string). Proactive use for specific webpage/docs
50
50
 
51
51
  ${e==="ICU"?`${s}`:e==="FluxCU"?`${i}
52
- ${s}`:e==="Flux"?`${i}`:`${h}`}`.trim()};export{o as a,w as b,v as c};
52
+ ${s}`:e==="Flux"?`${i}`:`${h}`}`.trim()};export{a,w as b,v as c};
@@ -0,0 +1,2 @@
1
+ import{a as z}from"./chunk-NQTRYK6U.js";import{f as U}from"./chunk-A73HW6DI.js";import{a as j}from"./chunk-Y5JU726N.js";import F from"screenshot-desktop";import I from"sharp";import G from"fs-extra";import H from"path";import"@nut-tree-fork/nut-js";async function P(t,n,e){if(!(!process.env.SHOW_DEBUG_GRID&&!process.env.DEBUG_OCR))try{let r=H.resolve(process.cwd(),"screenshots",t);await G.ensureDir(r),await G.writeFile(H.join(r,n),e)}catch{}}function J(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function K(t,n,e=1/0){if(t===n)return 0;if(t.length===0)return n.length;if(n.length===0)return t.length;if(Math.abs(t.length-n.length)>e)return e+1;let r=Array.from({length:n.length+1},(s,i)=>i);for(let s=1;s<=t.length;s++){let i=[s],l=s;for(let o=1;o<=n.length;o++){let f=t[s-1]===n[o-1]?0:1,a=Math.min(i[o-1]+1,r[o]+1,r[o-1]+f);i.push(a),a<l&&(l=a)}if(r=i,l>e)return e+1}return r[n.length]}function Q(t){return t<=4?0:t<=8?1:2}async function B(t,n=3){let e=await I(t).metadata();return I(t).resize(Math.round(e.width*n),Math.round(e.height*n),{kernel:"lanczos3"}).greyscale().normalise().toBuffer()}function V(t){if(!t)return{words:[],lines:[]};let n=[],e=new Map;for(let s of t.split(`
2
+ `)){let i=s.split(" ");if(i.length<12||parseInt(i[0])!==5)continue;let o=i[2],f=i[3],a=i[4],h=parseInt(i[6]),g=parseInt(i[7]),w=parseInt(i[8]),M=parseInt(i[9]),c=parseFloat(i[10]),p=i.slice(11).join(" ").trim();if(!p||c<0)continue;let x={x0:h,y0:g,x1:h+w,y1:g+M},y={text:p,confidence:c,bbox:x};n.push(y);let d=`${o}_${f}_${a}`;e.has(d)||e.set(d,{words:[],bbox:{x0:1/0,y0:1/0,x1:-1/0,y1:-1/0}});let u=e.get(d);u.words.push(y),u.bbox.x0=Math.min(u.bbox.x0,x.x0),u.bbox.y0=Math.min(u.bbox.y0,x.y0),u.bbox.x1=Math.max(u.bbox.x1,x.x1),u.bbox.y1=Math.max(u.bbox.y1,x.y1)}let r=[];for(let s of e.values())s.words.length>0&&r.push({text:s.words.map(i=>i.text).join(" "),bbox:s.bbox,words:s.words});return{words:n,lines:r}}function Z(t){if(!(t.words&&t.words.length>0)){if(t.blocks&&t.blocks.length>0){t.words=[],t.lines=[];for(let n of t.blocks)for(let e of n.paragraphs||[])for(let r of e.lines||[]){r.bbox&&t.lines.push(r);for(let s of r.words||[])s.bbox&&t.words.push(s)}if(t.words.length>0)return}if(t.tsv){let n=V(t.tsv);t.words=n.words,t.lines=n.lines}}}function A(t,n,e=0,r=0,s=1){Z(t);let i=o=>({x0:Math.round(o.x0/s)+e,y0:Math.round(o.y0/s)+r,x1:Math.round(o.x1/s)+e,y1:Math.round(o.y1/s)+r}),l=[];if(t.lines&&t.lines.length>0)for(let o of t.lines){let f=o.text?o.text.toLowerCase().trim():"";if(!f||!o.bbox||!(f===n||new RegExp(`\\b${J(n)}\\b`,"i").test(f)))continue;let h=o.words||(t.words?t.words.filter(c=>c.bbox&&c.bbox.x0>=o.bbox.x0-5&&c.bbox.x1<=o.bbox.x1+5&&c.bbox.y0>=o.bbox.y0-5&&c.bbox.y1<=o.bbox.y1+5):[]),g=n.split(/\s+/),w=g.map(c=>c.replace(/[^a-z0-9]/g,"")).join(" "),M=!1;if(h.length>0)for(let c=0;c<=h.length-g.length;c++){let p=h.slice(c,c+g.length),x=p.map(y=>(y.text||"").toLowerCase().trim().replace(/[^a-z0-9]/g,"")).join(" ");if(x===w||x.includes(w)){let y={x0:Math.min(...p.map(d=>d.bbox.x0)),y0:Math.min(...p.map(d=>d.bbox.y0)),x1:Math.max(...p.map(d=>d.bbox.x1)),y1:Math.max(...p.map(d=>d.bbox.y1))};l.push(i(y)),M=!0}}M||l.push(i(o.bbox))}if(l.length===0&&t.words&&t.words.length>0)for(let o of t.words){let f=o.text?o.text.toLowerCase().trim().replace(/[^a-z0-9]/g,""):"",a=n.replace(/[^a-z0-9]/g,"");f===a&&o.bbox&&l.push(i(o.bbox))}if(l.length===0&&t.words&&t.words.length>0){let o=Q(n.length);for(let f of t.words){let a=f.text?f.text.toLowerCase().trim():"";a.length>=3&&Math.abs(a.length-n.length)<=o&&K(a,n,o)<=o&&f.bbox&&l.push(i(f.bbox))}}return l}function E(t,n){let e=null,r=1/0;for(let s of t){let i=Math.round((s.x0+s.x1)/2),l=Math.round((s.y0+s.y1)/2),o=n.x>=s.x0&&n.x<=s.x1&&n.y>=s.y0&&n.y<=s.y1,f=Math.hypot(i-n.x,l-n.y),a=o?0:f;a<r&&(r=a,e={x:i,y:l,dist:f,containsPoint:o,bbox:s})}return e}function X(t,n,e,r){let l=Math.ceil(t/4),o=Math.ceil(n/2),f=[];for(let a=0;a<2;a++)for(let h=0;h<4;h++){let g=h*l,w=a*o,M=Math.min(l,t-g),c=Math.min(o,n-w),p=g+M/2,x=w+c/2,y=e>=g&&e<g+M&&r>=w&&r<w+c;f.push({x0:g,y0:w,w:M,h:c,cx:p,cy:x,containsTarget:y})}return f.sort((a,h)=>{if(a.containsTarget)return-1;if(h.containsTarget)return 1;let g=Math.hypot(a.cx-e,a.cy-r),w=Math.hypot(h.cx-e,h.cy-r);return g-w})}var W=null;async function Y(){return W||(W=(async()=>{let{createWorker:t}=await import("tesseract.js"),n=await import("fs-extra"),{CU_CACHE_DIR:e}=await import("./paths-2EXHWUSL.js");return n.ensureDirSync(e),t("eng",1,{cachePath:e,logger:()=>{}})})().catch(t=>{throw W=null,t})),W}var O=null,N=null;async function tt(){let{getActiveDisplay:t}=await import("./screen_grid-3F55Z22R.js"),n=await t();if(O&&N===n)return O;N=n,O={format:"png"};try{let e=await F.listDisplays();e&&e.length>0&&(O={format:"png",screen:(e[n]||e[0]).id})}catch{}return O}var ut=async(t,n={})=>{let e=j(t),r=e.gridId||e.grid||e.coordinate||e.target||e.id,s=(e.type||e.clickType||"single").toLowerCase(),i=(e.button||"left").toLowerCase(),l=e.intendedClickText||e.text||"",o=e.ocrCorrection!==void 0?e.ocrCorrection===!0||e.ocrCorrection==="true":e.useOCR!==void 0?e.useOCR===!0||e.useOCR==="true":!0;if(!r&&!l)return'ERROR: Missing required "gridId" parameter for Click tool.';let f=r;if(o&&l)try{let h=r?U(r):null,g=await tt(),w=await F(g),M=await I(w).metadata(),c=M.width||1920,p=M.height||1080,x=h?{x:Math.round(h.x*(c/1280)),y:Math.round(h.y*(p/720))}:{x:c/2,y:p/2},y=l.toLowerCase().trim(),d=await Y(),u=null,$="",q=h?220:500;if(h){let _=Math.min(Math.round(c/3),c),k=Math.min(Math.round(p/3),p),b=Math.max(0,Math.min(c-_,x.x-Math.floor(_/2))),m=Math.max(0,Math.min(p-k,x.y-Math.floor(k/2))),T=await I(w).extract({left:b,top:m,width:_,height:k}).toBuffer(),D=2,R=await B(T,D),v=y.replace(/[^a-z0-9]/g,"_");await P("cropped",`crop_${Date.now()}_${v}.png`,R),await d.setParameters({tessedit_pageseg_mode:"11"});let{data:C}=await d.recognize(R,{},{tsv:!0,blocks:!0});if(C&&C.text){let L=A(C,y,b,m,D);if(L.length>0){let S=E(L,x);S&&(S.containsPoint||S.dist<=q)&&(u=S,$="centered target crop OCR")}}}if(!u){let _=await B(w,2),k=y.replace(/[^a-z0-9]/g,"_");await P("fullscreen",`full_${Date.now()}_${k}.png`,_),await d.setParameters({tessedit_pageseg_mode:"3"});let{data:b}=await d.recognize(_,{},{tsv:!0,blocks:!0});if(b&&b.text){let m=A(b,y,0,0,2);if(m.length>0){let T=E(m,x);T&&(u=T,$="full-screen OCR")}}}if(!u){let _=X(c,p,x.x,x.y),k=y.replace(/[^a-z0-9]/g,"_");await d.setParameters({tessedit_pageseg_mode:"11"});for(let b=0;b<_.length;b++){let m=_[b],T=await I(w).extract({left:m.x0,top:m.y0,width:m.w,height:m.h}).toBuffer(),D=await B(T,3);await P("tiles",`tile_${b+1}_${Date.now()}_${k}.png`,D);let{data:R}=await d.recognize(D,{},{tsv:!0,blocks:!0});if(!R||!R.text)continue;let v=A(R,y,m.x0,m.y0,3);if(v.length>0){let C=E(v,x);if(C){u=C,$=`tile ${b+1} OCR (${m.containsTarget?"target tile":`offset ${m.x0},${m.y0}`})`;break}}}}if(u){let _={x:Math.round(u.x*(1280/c)),y:Math.round(u.y*(720/p))};return`${await z("click",_,{button:i,clickType:s})} (${$} for "${l}" at ${Math.round(u.dist)}px distance)`}}catch{}return await z("click",f,{button:i,clickType:s})};export{ut as click};
@@ -1 +1 @@
1
- import{a as i,b as s}from"./chunk-7M3AFLUN.js";import"./chunk-KNCL7AK2.js";import{a as c}from"./chunk-Y5JU726N.js";var d=async(a,p={})=>{let e=c(a),r=e.action||e.type||e.cmd,n=e.target||e.grid||e.gridCode||e.location||e.input;if(!r)return'ERROR: Missing required "action" argument for computer_action (e.g. move, click, drag, scroll, type, key_press, key_combination).';let t=r.toLowerCase();if(t.startsWith("mouse_")||["move","click","drag","scroll"].includes(t)){let o=t.replace("mouse_","");return await i(o,n,{button:e.button,clickType:e.clickType||e.type,from:e.from,to:e.to,direction:e.direction,amount:e.amount?parseInt(e.amount,10):void 0})}if(t.startsWith("key_")||t==="type"||t==="press"){let o=t;t==="press"&&(o="key_press");let u=e.autoPressEnter===!0||e.autoPressEnter==="true"||e.enter===!0||e.enter==="true";return await s(o,n||e.text||e.keys,{...e,autoPressEnter:u})}return`ERROR: Unrecognized action "${r}". Supported actions: move, click, drag, scroll, type, key_press, key_combination.`};export{d as computer_action};
1
+ import{a as i,b as s}from"./chunk-NQTRYK6U.js";import"./chunk-A73HW6DI.js";import{a as c}from"./chunk-Y5JU726N.js";var d=async(a,p={})=>{let e=c(a),r=e.action||e.type||e.cmd,n=e.target||e.grid||e.gridCode||e.location||e.input;if(!r)return'ERROR: Missing required "action" argument for computer_action (e.g. move, click, drag, scroll, type, key_press, key_combination).';let t=r.toLowerCase();if(t.startsWith("mouse_")||["move","click","drag","scroll"].includes(t)){let o=t.replace("mouse_","");return await i(o,n,{button:e.button,clickType:e.clickType||e.type,from:e.from,to:e.to,direction:e.direction,amount:e.amount?parseInt(e.amount,10):void 0})}if(t.startsWith("key_")||t==="type"||t==="press"){let o=t;t==="press"&&(o="key_press");let u=e.autoPressEnter===!0||e.autoPressEnter==="true"||e.enter===!0||e.enter==="true";return await s(o,n||e.text||e.keys,{...e,autoPressEnter:u})}return`ERROR: Unrecognized action "${r}". Supported actions: move, click, drag, scroll, type, key_press, key_combination.`};export{d as computer_action};
@@ -1 +1 @@
1
- import{a as e}from"./chunk-7M3AFLUN.js";import"./chunk-KNCL7AK2.js";import{a as d}from"./chunk-Y5JU726N.js";var m=async(a,i={})=>{let r=d(a),o=r.fromGridId||r.from||r.start,t=r.toGridId||r.to||r.end;return!o||!t?'ERROR: Drag requires both "fromGridId" and "toGridId" parameters.':await e("drag",o,{from:o,to:t})};export{m as drag};
1
+ import{a as e}from"./chunk-NQTRYK6U.js";import"./chunk-A73HW6DI.js";import{a as d}from"./chunk-Y5JU726N.js";var m=async(a,i={})=>{let r=d(a),o=r.fromGridId||r.from||r.start,t=r.toGridId||r.to||r.end;return!o||!t?'ERROR: Drag requires both "fromGridId" and "toGridId" parameters.':await e("drag",o,{from:o,to:t})};export{m as drag};
@@ -1 +1 @@
1
- import{a,b,c,d,e,f,g,h,i}from"./chunk-DYIWPH2W.js";import"./chunk-LQHSNXBM.js";import"./chunk-Y5JU726N.js";export{d as activeChildProcess,h as adjustWindowsCommand,c as cleanTerminalOutput,i as exec_command,e as isActiveCommandPty,a as isPtyAvailable,b as stripAnsi,g as terminateActiveCommand,f as writeToActiveCommand};
1
+ import{a,b,c,d,e,f,g,h,i}from"./chunk-RTT7P5KS.js";import"./chunk-U2NRX2PX.js";import"./chunk-Y5JU726N.js";export{d as activeChildProcess,h as adjustWindowsCommand,c as cleanTerminalOutput,i as exec_command,e as isActiveCommandPty,a as isPtyAvailable,b as stripAnsi,g as terminateActiveCommand,f as writeToActiveCommand};
@@ -1 +1 @@
1
- import{a,b,c,d,e}from"./chunk-6AWSJNXE.js";import"./chunk-DSVLWYIT.js";export{b as exportCurrentChat,d as exportErrorLogs,e as handleExport,a as parseAgentText,c as parseLogEntries};
1
+ import{a,b,c,d,e}from"./chunk-NYIPDIEQ.js";import"./chunk-DSVLWYIT.js";export{b as exportCurrentChat,d as exportErrorLogs,e as handleExport,a as parseAgentText,c as parseLogEntries};
@@ -1,6 +1,6 @@
1
- import{a as k,c as d}from"./chunk-56EJGQU3.js";import{a as b}from"./chunk-Y5JU726N.js";var I=async(w,s={})=>{let{runSubagent:U}=await import("./ai-GKU62P7B.js"),l=b(w),c=l.task||l.instruction||l.prompt,E=l.model||null,C=l.title||null,m=l.tools||null;if(!c)return'ERROR: Missing "task" argument for invoke.';let f=null;if(m)try{let t=m.trim();t.startsWith("[")&&t.endsWith("]")&&(t=t.substring(1,t.length-1)),f=t.split(",").map(n=>n.trim().replace(/^["']|["']$/g,"")).filter(Boolean)}catch{}let i=`subagent-${Date.now()}-${Math.floor(Math.random()*1e3)}`,h=null,S=null,$=new Promise((t,n)=>{h=t,S=n}),e={id:i,title:C||c.substring(0,30),task:c,status:"running",startedAt:Date.now(),lastChunkTime:Date.now(),wps:0,questions:[],pendingSteerMessages:[],steer:t=>{t&&e.pendingSteerMessages.push(t)},completionPromise:$,_resolveCompletion:h,_rejectCompletion:S,progress:[]},r={chunks:[],totalWords:0};k.push(e),s.onSubagentUpdate&&s.onSubagentUpdate();let a=[],A={...s,taskId:i,onAskMain:async t=>{let n=`q-${Date.now()}-${Math.floor(Math.random()*1e3)}`,o=null,p=new Promise(g=>{o=g}),u={id:n,question:t,answered:!1,answer:null,askedAt:Date.now(),_resolve:o};return e.questions.push(u),e.status="waiting",s.onSubagentUpdate&&s.onSubagentUpdate(),d(`[SYSTEM] Background subagent "${e.title}" is WAITING FOR YOUR INPUT: "${t}"
1
+ import{a as k,c as d}from"./chunk-56EJGQU3.js";import{a as b}from"./chunk-Y5JU726N.js";var I=async(w,s={})=>{let{runSubagent:U}=await import("./ai-IHT7BYEA.js"),l=b(w),c=l.task||l.instruction||l.prompt,E=l.model||null,C=l.title||null,m=l.tools||null;if(!c)return'ERROR: Missing "task" argument for invoke.';let f=null;if(m)try{let t=m.trim();t.startsWith("[")&&t.endsWith("]")&&(t=t.substring(1,t.length-1)),f=t.split(",").map(n=>n.trim().replace(/^["']|["']$/g,"")).filter(Boolean)}catch{}let i=`subagent-${Date.now()}-${Math.floor(Math.random()*1e3)}`,h=null,S=null,$=new Promise((t,n)=>{h=t,S=n}),e={id:i,title:C||c.substring(0,30),task:c,status:"running",startedAt:Date.now(),lastChunkTime:Date.now(),wps:0,questions:[],pendingSteerMessages:[],steer:t=>{t&&e.pendingSteerMessages.push(t)},completionPromise:$,_resolveCompletion:h,_rejectCompletion:S,progress:[]},r={chunks:[],totalWords:0};k.push(e),s.onSubagentUpdate&&s.onSubagentUpdate();let a=[],A={...s,taskId:i,onAskMain:async t=>{let n=`q-${Date.now()}-${Math.floor(Math.random()*1e3)}`,o=null,p=new Promise(g=>{o=g}),u={id:n,question:t,answered:!1,answer:null,askedAt:Date.now(),_resolve:o};return e.questions.push(u),e.status="waiting",s.onSubagentUpdate&&s.onSubagentUpdate(),d(`[SYSTEM] Background subagent "${e.title}" is WAITING FOR YOUR INPUT: "${t}"
2
2
  Respond using tool: [action:Answer(id="${i}", answer="...")]
3
3
  [/SYSTEM]`),await p},onVisualFeedback:t=>{e.lastChunkTime=Date.now();let n=t.replace(/\x1b\[[0-9;]*m/g,""),o=n.match(/[✔✘✗✖🔍📖→➕↻•]\s*([A-Za-z0-9\s-]+)/);o?e.currentTool=o[1].trim():e.currentTool=n,s.onSubagentUpdate&&s.onSubagentUpdate()},onTokenChunk:(t,n)=>{let o=Date.now();if(e.lastChunkTime=o,e.currentTool="Thinking",typeof n=="number"&&n>0){r.totalWords+=n,r.chunks.push({time:o,words:n});let p=o-400;if(r.chunks=r.chunks.filter(u=>u.time>=p),r.chunks.length>0){let u=r.chunks.reduce((M,_)=>M+_.words,0),T=r.chunks[0].time,g=Math.max(.4,(o-T)/1e3);e.wps=Math.round(u/g)}}s.onSubagentUpdate&&s.onSubagentUpdate()}};return U(c,A,E,f,50,t=>{if(e.status==="cancelled")return;if(t.startsWith("[Subagent Turn")&&a.length>0&&(e.progress.push([...a]),a=[]),t.includes("[Executing Tool]")){let o=t.match(/\[Executing Tool\]\s*([a-zA-Z0-9_]+)/);o&&(!e.currentTool||e.currentTool==="Thinking")&&(e.currentTool=o[1])}let n=t;if(n.startsWith("[Tool Result]")||n.startsWith("[Action Result]")){let o=n.split(`
4
4
  `);o.length>5&&(n=o.slice(0,4).join(`
5
5
  `)+`
6
- ... [Content/Diff Truncated from Logs] ...`)}a.push(n),s.onSubagentUpdate&&s.onSubagentUpdate()},!0).then(t=>{if(e.status==="cancelled"){e._resolveCompletion&&e._resolveCompletion(t);return}a.length>0&&(e.progress.push([...a]),a=[]),e.status="completed",e.finalAnswer=t,s.onSubagentUpdate&&s.onSubagentUpdate(),d(`[SYSTEM] Background subagent "${e.title}" (id: ${i}) has FINISHED. Call GetProgress(id="${i}") to see the final result. [/SYSTEM]`),e._resolveCompletion&&e._resolveCompletion(t)}).catch(async t=>{let{isTerminationSignaled:n}=await import("./ai-GKU62P7B.js");if(t.message==="Subagent task was cancelled."||e.status==="cancelled"||n()){e.status="cancelled",a.push("[SUBAGENT CANCELLED] Task was cancelled."),e.progress.push([...a]),s.onSubagentUpdate&&s.onSubagentUpdate(),e._resolveCompletion&&e._resolveCompletion(null);return}a.push(`[SUBAGENT FAILURE] Error: ${t.message}`),e.progress.push([...a]),e.status="failed",e.error=t.message,s.onSubagentUpdate&&s.onSubagentUpdate(),d(`[SYSTEM] Background subagent "${e.title}" (id: ${i}) FAILED with error: ${t.message}. [/SYSTEM]`),e._rejectCompletion&&e._rejectCompletion(t)}),`Background subagent started. Task ID: ${i}`};export{I as invoke};
6
+ ... [Content/Diff Truncated from Logs] ...`)}a.push(n),s.onSubagentUpdate&&s.onSubagentUpdate()},!0).then(t=>{if(e.status==="cancelled"){e._resolveCompletion&&e._resolveCompletion(t);return}a.length>0&&(e.progress.push([...a]),a=[]),e.status="completed",e.finalAnswer=t,s.onSubagentUpdate&&s.onSubagentUpdate(),d(`[SYSTEM] Background subagent "${e.title}" (id: ${i}) has FINISHED. Call GetProgress(id="${i}") to see the final result. [/SYSTEM]`),e._resolveCompletion&&e._resolveCompletion(t)}).catch(async t=>{let{isTerminationSignaled:n}=await import("./ai-IHT7BYEA.js");if(t.message==="Subagent task was cancelled."||e.status==="cancelled"||n()){e.status="cancelled",a.push("[SUBAGENT CANCELLED] Task was cancelled."),e.progress.push([...a]),s.onSubagentUpdate&&s.onSubagentUpdate(),e._resolveCompletion&&e._resolveCompletion(null);return}a.push(`[SUBAGENT FAILURE] Error: ${t.message}`),e.progress.push([...a]),e.status="failed",e.error=t.message,s.onSubagentUpdate&&s.onSubagentUpdate(),d(`[SYSTEM] Background subagent "${e.title}" (id: ${i}) FAILED with error: ${t.message}. [/SYSTEM]`),e._rejectCompletion&&e._rejectCompletion(t)}),`Background subagent started. Task ID: ${i}`};export{I as invoke};
@@ -1,3 +1,3 @@
1
- import{a as o}from"./chunk-Y5JU726N.js";var k=async(b,t={})=>{let{runSubagent:u}=await import("./ai-GKU62P7B.js"),s=o(b),a=s.task||s.instruction||s.prompt,m=s.model||null,l=s.tools||null;if(!a)return'ERROR: Missing "task" argument for invokeSync.';let r=null;if(l)try{let e=l.trim();e.startsWith("[")&&e.endsWith("]")&&(e=e.substring(1,e.length-1)),r=e.split(",").map(i=>i.trim().replace(/^["']|["']$/g,"")).filter(Boolean)}catch{}let n=s.title||a.substring(0,30);try{t.onVisualFeedback&&t.onVisualFeedback(`\x1B[95mSubAgent\x1B[0m: \x1B[32mGeneralist\x1B[0m \u2192 ${n}`);let e=await u(a,t,m,r,50);return t.onVisualFeedback&&t.onVisualFeedback(`\x1B[95mSubAgent\x1B[0m: \x1B[32mGeneralist\x1B[0m \u2192 ${n} [COMPLETED]
2
- `),e}catch(e){let{isTerminationSignaled:i}=await import("./ai-GKU62P7B.js"),c=e.message==="Subagent task was cancelled by user."||i();if(t.onVisualFeedback){let d=c?"[CANCELLED]":"[FAILED]";t.onVisualFeedback(`\x1B[95mSubAgent\x1B[0m: \x1B[32mGeneralist\x1B[0m \u2192 ${n} ${d}
1
+ import{a as o}from"./chunk-Y5JU726N.js";var k=async(b,t={})=>{let{runSubagent:u}=await import("./ai-IHT7BYEA.js"),s=o(b),a=s.task||s.instruction||s.prompt,m=s.model||null,l=s.tools||null;if(!a)return'ERROR: Missing "task" argument for invokeSync.';let r=null;if(l)try{let e=l.trim();e.startsWith("[")&&e.endsWith("]")&&(e=e.substring(1,e.length-1)),r=e.split(",").map(i=>i.trim().replace(/^["']|["']$/g,"")).filter(Boolean)}catch{}let n=s.title||a.substring(0,30);try{t.onVisualFeedback&&t.onVisualFeedback(`\x1B[95mSubAgent\x1B[0m: \x1B[32mGeneralist\x1B[0m \u2192 ${n}`);let e=await u(a,t,m,r,50);return t.onVisualFeedback&&t.onVisualFeedback(`\x1B[95mSubAgent\x1B[0m: \x1B[32mGeneralist\x1B[0m \u2192 ${n} [COMPLETED]
2
+ `),e}catch(e){let{isTerminationSignaled:i}=await import("./ai-IHT7BYEA.js"),c=e.message==="Subagent task was cancelled by user."||i();if(t.onVisualFeedback){let d=c?"[CANCELLED]":"[FAILED]";t.onVisualFeedback(`\x1B[95mSubAgent\x1B[0m: \x1B[32mGeneralist\x1B[0m \u2192 ${n} ${d}
3
3
  `)}return`ERROR: Subagent execution failed: ${e.message}`}};export{k as invokeSync};
@@ -1 +1 @@
1
- import{b as e}from"./chunk-7M3AFLUN.js";import"./chunk-KNCL7AK2.js";import{a as i}from"./chunk-Y5JU726N.js";var k=async(s,c={})=>{let t=i(s),a=t.key||t.keys||t.input||t.shortcut;if(!a)return'ERROR: Missing required "key" parameter for KeyPress tool.';let r=String(a).trim().toLowerCase();if(r==="clearinput"||r==="clear_input"||r==="clear")return await e("clear_input");if(r==="back"||r==="browser_back"||r==="browserBack")return await e("browser_back");if(r.includes(";")||r.includes("+")){let o=r.split(/[;+]/).map(n=>n.trim()).filter(Boolean);return await e("key_combination",o)}return await e("key_press",r)};export{k as key_press};
1
+ import{b as e}from"./chunk-NQTRYK6U.js";import"./chunk-A73HW6DI.js";import{a as i}from"./chunk-Y5JU726N.js";var k=async(s,c={})=>{let t=i(s),a=t.key||t.keys||t.input||t.shortcut;if(!a)return'ERROR: Missing required "key" parameter for KeyPress tool.';let r=String(a).trim().toLowerCase();if(r==="clearinput"||r==="clear_input"||r==="clear")return await e("clear_input");if(r==="back"||r==="browser_back"||r==="browserBack")return await e("browser_back");if(r.includes(";")||r.includes("+")){let o=r.split(/[;+]/).map(n=>n.trim()).filter(Boolean);return await e("key_combination",o)}return await e("key_press",r)};export{k as key_press};
@@ -1 +1 @@
1
- import{b as n}from"./chunk-7M3AFLUN.js";import"./chunk-KNCL7AK2.js";import{a as r}from"./chunk-Y5JU726N.js";var p=async(o,u={})=>{let t=r(o),e=t.text||t.input||t.value||"",s=t.autoPressEnter===!0||t.autoPressEnter==="true"||t.enter===!0||t.enter==="true";return e==null?'ERROR: Missing required "text" parameter for KeyboardTyping tool.':await n("type",String(e),{autoPressEnter:s})};export{p as keyboard_typing};
1
+ import{b as n}from"./chunk-NQTRYK6U.js";import"./chunk-A73HW6DI.js";import{a as r}from"./chunk-Y5JU726N.js";var p=async(o,u={})=>{let t=r(o),e=t.text||t.input||t.value||"",s=t.autoPressEnter===!0||t.autoPressEnter==="true"||t.enter===!0||t.enter==="true";return e==null?'ERROR: Missing required "text" parameter for KeyboardTyping tool.':await n("type",String(e),{autoPressEnter:s})};export{p as keyboard_typing};
@@ -0,0 +1 @@
1
+ import{a,b,c,d,e,f,g}from"./chunk-A73HW6DI.js";export{a as GRID_CONFIG,e as captureGriddedScreenshot,d as getActiveDisplay,g as gridToNativeCoordinates,f as parseGridCodeTo720p,c as rawModelOnly,b as useModel};
@@ -1 +1 @@
1
- import{a as r}from"./chunk-7M3AFLUN.js";import"./chunk-KNCL7AK2.js";import{a as t}from"./chunk-Y5JU726N.js";var m=async(n,i={})=>{let o=t(n),e=(o.direction||"down").toLowerCase(),c=o.amount?parseInt(o.amount,10):6,s=o.gridId||o.grid||o.coordinate||o.target||o.id||null;return await r("scroll",s,{direction:e,amount:c})};export{m as scroll};
1
+ import{a as r}from"./chunk-NQTRYK6U.js";import"./chunk-A73HW6DI.js";import{a as t}from"./chunk-Y5JU726N.js";var m=async(n,i={})=>{let o=t(n),e=(o.direction||"down").toLowerCase(),c=o.amount?parseInt(o.amount,10):6,s=o.gridId||o.grid||o.coordinate||o.target||o.id||null;return await r("scroll",s,{direction:e,amount:c})};export{m as scroll};
@@ -0,0 +1 @@
1
+ import*as K from"onnxruntime-node";import et from"sharp";import S from"fs-extra";import Q from"path";import ft from"https";import ut from"os";var z=null,H=!1,nt=!1,J=Q.join(ut.homedir(),".fluxflow","models"),mt="ui_detector_nano.onnx",D=Q.join(J,mt),ht="https://github.com/KushalRoyChowdhury/fluxflow-cli/releases/latest/download/yolov8n.onnx",C=640,Mt=.02,dt=.3,pt=32,xt=32;function at(o,t){return new Promise((n,e)=>{let a={headers:{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}};ft.get(o,a,l=>{if(l.statusCode>=300&&l.statusCode<400&&l.headers.location){at(l.headers.location,t).then(n).catch(e);return}if(l.statusCode!==200)return e(new Error(`Download failed with status: ${l.statusCode}`));let i=S.createWriteStream(t);l.pipe(i),i.on("finish",()=>{i.close(),n()}),i.on("error",e)}).on("error",e)})}async function wt(){if(await S.pathExists(D))return D;let o=Q.resolve(process.cwd(),"yolov8n.onnx");if(await S.pathExists(o))try{return await S.ensureDir(J),await S.copy(o,D),D}catch{return o}await S.ensureDir(J);let t=`${D}.tmp`;console.log(`[FluxFlow] Downloading UI ONNX model (~80MB) to ${D}...`);try{return await at(ht,t),await S.move(t,D,{overwrite:!0}),console.log("[FluxFlow] UI ONNX model downloaded successfully."),D}catch(n){throw console.warn(`[FluxFlow] UI Model download failed: ${n.message}. Falling back to default.`),await S.remove(t).catch(()=>{}),n}}async function yt(){if(z)return z;if(nt)return null;if(H){for(;H;)await new Promise(o=>setTimeout(o,100));return z}H=!0;try{let o=await wt();return z=await K.InferenceSession.create(o,{executionProviders:["cpu"],graphOptimizationLevel:"all"}),H=!1,z}catch(o){return console.warn("[FluxFlow] ONNX session creation failed:",o.message),nt=!0,H=!1,null}}async function Nt(o){let{data:t}=await et(o).resize(C,C,{fit:"fill"}).removeAlpha().raw().toBuffer({resolveWithObject:!0}),n=C*C,e=new Float32Array(3*n);for(let a=0;a<n;a++)e[a]=t[a*3]/255,e[n+a]=t[a*3+1]/255,e[2*n+a]=t[a*3+2]/255;return new K.Tensor("float32",e,[1,3,C,C])}function Ot(o,t,n,e,a,l,i){if(!o||i<14)return 3;let v=Math.min(t,e+l),m=Math.min(n,a+i),h=Math.max(2,Math.floor((m-a)/3)),V=0,R=0,M=0,d=0,Y=0,j=0;for(let r=a;r<m;r+=2)for(let s=e;s<v;s+=2){let c=o[r*t+s];r<a+h?(V+=c,R++):r>m-h?(Y+=c,j++):(M+=c,d++)}let _=(V+M+Y)/(R+d+j||1),F=0,I=0,E=0;for(let r=a;r<m;r+=2)for(let s=e;s<v;s+=2){let f=o[r*t+s]-_;r<a+h?F+=f*f:r>m-h?E+=f*f:I+=f*f}let X=Math.sqrt(F/(R||1)),L=Math.sqrt(I/(d||1)),y=Math.sqrt(E/(j||1));return X>y+3?Math.min(10,Math.floor(i/3)):y>X+3||L>12?-Math.min(8,Math.floor(i/3)):3}function Dt(o,t){let n=Math.max(o.x1,t.x1),e=Math.max(o.y1,t.y1),a=Math.min(o.x2,t.x2),l=Math.min(o.y2,t.y2),i=Math.max(0,a-n)*Math.max(0,l-e),v=(o.x2-o.x1)*(o.y2-o.y1),m=(t.x2-t.x1)*(t.y2-t.y1);return i/(v+m-i||1)}function St(o,t){o.sort((e,a)=>a.score-e.score);let n=[];for(let e of o){let a=!0;for(let l of n)if(Dt(e,l)>t){a=!1;break}a&&n.push(e)}return n}async function vt(o,t=1280,n=720){try{let e=await yt();if(!e)return null;let a=await Nt(o),{data:l}=await et(o).resize(t,n,{fit:"fill"}).greyscale().raw().toBuffer({resolveWithObject:!0}),i=e.inputNames[0]||"images",v=await e.run({[i]:a}),m=e.outputNames[0],h=v[m];if(!h||!h.data)return null;let[V,R,M]=h.dims,d=h.data,Y=[],j=R-4,_=t/C,F=n/C,I=40,E=30,X=t/I,L=n/E,y=Array.from({length:E},()=>new Float32Array(I));for(let s=0;s<M;s++){let c=d[0*M+s],f=d[1*M+s],T=d[2*M+s],U=d[3*M+s],p=0;for(let u=0;u<j;u++){let x=d[(4+u)*M+s];x>p&&(p=x)}if(p>1e-4){let u=Math.max(0,(c-T/2)*_),x=Math.max(0,(f-U/2)*F),N=Math.min(t,(c+T/2)*_),w=Math.min(n,(f+U/2)*F),O=Math.max(0,Math.floor(u/X)),g=Math.max(0,Math.floor(x/L)),k=Math.min(I-1,Math.floor(N/X)),W=Math.min(E-1,Math.floor(w/L));for(let A=g;A<=W;A++)for(let P=O;P<=k;P++)p>y[A][P]&&(y[A][P]=p)}if(p>=Mt){let u=Math.max(0,(c-T/2)*_),x=Math.max(0,(f-U/2)*F),N=Math.min(t,(c+T/2)*_),w=Math.min(n,(f+U/2)*F),O=N-u,g=w-x,k=Math.max(O,pt),W=Math.max(g,xt),A=(u+N)/2,P=(x+w)/2,$=Math.max(0,Math.min(t-k,A-k/2)),q=Math.max(0,Math.min(n-W,P-W/2)),tt=Math.min(t,$+k),ot=Math.min(n,q+W),B=Math.floor($),Z=Math.floor(q),b=Math.floor(tt-$),G=Math.floor(ot-q),st=$,rt=q,ct=tt,lt=ot,it=Ot(l,t,n,B,Z,b,G);Y.push({x1:st,y1:rt,x2:ct,y2:lt,startX:B,startY:Z,cellW:b,cellH:G,cx:Math.floor(B+b/2),cy:Math.floor(Z+G/2),score:p,yOffset:it})}}let r=St(Y,dt);return!r||r.length===0?null:(r.confidenceMap=y,r.getModelConfidence=(s,c,f,T)=>{let U=Math.max(0,Math.floor(s/X)),p=Math.max(0,Math.floor(c/L)),u=Math.min(I-1,Math.floor((s+f)/X)),x=Math.min(E-1,Math.floor((c+T)/L)),N=0;for(let w=p;w<=x;w++)for(let O=U;O<=u;O++)y[w][O]>N&&(N=y[w][O]);return N},r.sort((s,c)=>Math.abs(s.startY-c.startY)>20?s.startY-c.startY:s.startX-c.startX),r.forEach((s,c)=>{s.badgeId=c+1}),r)}catch(e){return console.error("[FluxFlow] detectUIBoxesONNX Error:",e),null}}export{vt as detectUIBoxesONNX,yt as getDetectorSession};
package/dist/cli.js CHANGED
@@ -6,7 +6,7 @@ import{a as b}from"./chunks/chunk-DSVLWYIT.js";import{spawn as we}from"child_pro
6
6
  \u2726 FluxFlow Token Usage & Analytics Dashboard
7
7
  \u2800\u2800\u2514\u2500 Serving at: ${m}
8
8
  \u2800\u2800\u2514\u2500 Opened in default browser. Press Ctrl+C to stop.
9
- `),await new Promise(()=>{})}if(Q||K||f||Z||ee){let o=await import("fs"),m=await import("path"),{fileURLToPath:r}=await import("url"),d=m.join(m.dirname(r(import.meta.url)),"../package.json"),n=JSON.parse(o.readFileSync(d,"utf8")).version;if(ee){let C=(t[1]||"").toLowerCase();if(C==="error"||C==="logs")try{let{exportErrorLogs:g}=await import("./chunks/export-DEFENSGY.js"),l=await g();console.log(`[EXPORT LOGS] Exported ${l.entryCount} error log entries (FluxFlow: ${l.fluxflowCount}, Memory: ${l.memoryCount}, Usage: ${l.usageCount}) to "${l.exportFile}"`),process.exit(0)}catch(g){console.error(`[EXPORT ERROR] Failed to export error logs: ${g.message}`),process.exit(1)}else console.error(`[EXPORT ERROR] Invalid export target "${t[1]||""}". --export only supports 'error'.
9
+ `),await new Promise(()=>{})}if(Q||K||f||Z||ee){let o=await import("fs"),m=await import("path"),{fileURLToPath:r}=await import("url"),d=m.join(m.dirname(r(import.meta.url)),"../package.json"),n=JSON.parse(o.readFileSync(d,"utf8")).version;if(ee){let C=(t[1]||"").toLowerCase();if(C==="error"||C==="logs")try{let{exportErrorLogs:g}=await import("./chunks/export-GPCAD6JI.js"),l=await g();console.log(`[EXPORT LOGS] Exported ${l.entryCount} error log entries (FluxFlow: ${l.fluxflowCount}, Memory: ${l.memoryCount}, Usage: ${l.usageCount}) to "${l.exportFile}"`),process.exit(0)}catch(g){console.error(`[EXPORT ERROR] Failed to export error logs: ${g.message}`),process.exit(1)}else console.error(`[EXPORT ERROR] Invalid export target "${t[1]||""}". --export only supports 'error'.
10
10
  Usage: fluxflow --export error`),process.exit(1)}if(Q&&(console.log(`v${n}`),process.exit(0)),K&&(console.log(`FluxFlow CLI Arguments:
11
11
  --mode <flux|flow|icu|omni> Set startup mode (Agent / Chat / Computer Use / Sentient being)
12
12
  --model <model_name> Set startup AI model
@@ -66,19 +66,19 @@ Usage: fluxflow --export error`),process.exit(1)}if(Q&&(console.log(`v${n}`),pro
66
66
  /docs View documentation
67
67
  /fluxflow init Create FluxFlow.md template
68
68
  /update check Check for new version
69
- /update latest Install latest release`),process.exit(0)),Z){let C=t[1]||"latest";if(C==="check"){let g=t[2]==="latest";try{let h=(await(await fetch("https://registry.npmjs.org/fluxflow-cli",{cache:"no-store"})).json())["dist-tags"]?.latest;h||(console.error("Error: Could not retrieve latest version."),process.exit(1)),console.log(g?`Latest version: v${h}`:h!==n?`A new version of FluxFlow is available: v${h} (current: v${n}). Run "fluxflow --update latest" to upgrade.`:`FluxFlow is up to date (v${n}).`)}catch(l){console.error("Error checking for updates:",l.message),process.exit(1)}process.exit(0)}else if(C==="latest"){console.log("Checking latest version and settings...");try{let c=(await(await fetch("https://registry.npmjs.org/fluxflow-cli",{cache:"no-store"})).json())["dist-tags"]?.latest;c||(console.error("Error: Could not retrieve latest version."),process.exit(1)),c===n&&(console.log(`FluxFlow is already up to date (v${n}).`),process.exit(0));let h=async()=>{let s=(await import("react")).default,{useState:N}=s,{render:_,Box:y,Text:S}=await import("ink"),D=(await import("ink-select-input")).default,E=(await import("ink-text-input")).default;return new Promise(W=>{let M=[{label:"NPM",value:"npm"},{label:"PNPM",value:"pnpm"},{label:"Yarn",value:"yarn"},{label:"Bun",value:"bun"},{label:"Custom Command",value:"custom"}],H=({label:k,isSelected:F})=>s.createElement(y,{width:"100%"},s.createElement(S,{bold:F},"\u2514\u2500 ",F?"\x1B[32m\u25CF\x1B[0m":"\u25CB"," ",k)),O,X=()=>{let[k,F]=N("select"),[z,J]=N(""),P=e=>{e.value==="custom"?F("custom"):B({manager:e.value})},L=e=>{B({manager:"custom",customCommand:e})};return k==="custom"?s.createElement(y,{flexDirection:"column",marginY:1},s.createElement(y,{marginBottom:1},s.createElement(S,{color:"magenta",bold:!0},"\u{1F527} Enter custom update command:")),s.createElement(y,{flexDirection:"row"},s.createElement(S,{color:"cyan",bold:!0}," \u276F "),s.createElement(E,{value:z,onChange:J,onSubmit:L})),s.createElement(y,{marginTop:1},s.createElement(S,{color:"gray",dimColor:!0,italic:!0}," (Press Enter to confirm)"))):s.createElement(y,{flexDirection:"column",marginY:1},s.createElement(y,{marginBottom:1},s.createElement(S,{color:"magenta",bold:!0},"\u{1F4E6} Select a package manager for the update:")),s.createElement(D,{items:M,onSelect:P,itemComponent:H,indicatorComponent:()=>null}))},B=k=>{O&&O(),W(k)},{unmount:V}=_(s.createElement(X,null));O=V})},i,$="",A;try{let{loadSettings:s}=await import("./chunks/settings-KKYNW25D.js");A=await s(),i=A?.systemSettings?.updateManager||A?.updateManager}catch{}if(!i){let s=await h();i=s.manager,$=s.customCommand}let p="";i==="pnpm"?p=`pnpm add -g fluxflow-cli@${c}`:i==="bun"?p=`bun add -g fluxflow-cli@${c}`:i==="yarn"?p=`yarn global add fluxflow-cli@${c}`:i==="custom"?p=$||A?.customUpdateCommand||`npm install -g fluxflow-cli@${c}`:p=`npm install -g fluxflow-cli@${c}`,console.log(`Updating FluxFlow to v${c} using ${i}...`),console.log(`Running: ${p}`);let{execSync:v}=await import("child_process");v(p,{stdio:"inherit"}),console.log(`\x1B[32m\u2705 Update successful! FluxFlow updated to v${c}.\x1B[0m`)}catch(g){console.error("\x1B[31m\u274C Update failed:\x1B[0m",g.message),process.exit(1)}process.exit(0)}else console.error("Unknown update command. Available options: --update, --update check, --update check latest, --update latest"),process.exit(1)}}let{default:ae}=await import("react"),{render:le}=await import("ink"),{default:ce}=await import("./chunks/app-UBBTQ7FY.js");process.env.NODE_NO_WARNINGS="1";let pe=["cuimp","Found existing binary","Binary verified","curl.exe not found","Falling back to .bat file","DeprecationWarning"],me=console.log,de=console.warn,ue=console.error,G=o=>{let m=o.map(String).join(" ");return pe.some(r=>m.includes(r))};console.log=(...o)=>!G(o)&&me(...o),console.warn=(...o)=>!G(o)&&de(...o),console.error=(...o)=>!G(o)&&ue(...o);let Y=t.findIndex(o=>o==="--cwd"||o==="--path");if(Y!==-1&&Y+1<t.length){let o=t[Y+1],m=await import("path"),r=await import("fs-extra"),d=m.default.resolve(o);try{r.default.existsSync(d)&&r.default.statSync(d).isDirectory()?process.chdir(d):(console.error(`[ERROR] Directory not found: "${o}"`),process.exit(0))}catch(x){console.error(`[ERROR] Failed to change directory to "${o}": ${x.message}`),process.exit(0)}}let I=t.includes("--commit_8f4a2b9c"),q=t.findIndex(o=>o==="-p"||o==="--prompt");if(q!==-1||I){let o=t.includes("--new")||t.includes("-n"),r=(q!==-1?t.slice(q+1).filter(e=>e!=="-n"&&e!=="--new"):[])[0];if(I)try{let{execSync:e}=await import("child_process"),a=e("git diff --cached",{encoding:"utf8",stdio:["ignore","pipe","pipe"]}).trim();a||process.exit(0),r=`Git Staged Diff:
69
+ /update latest Install latest release`),process.exit(0)),Z){let C=t[1]||"latest";if(C==="check"){let g=t[2]==="latest";try{let h=(await(await fetch("https://registry.npmjs.org/fluxflow-cli",{cache:"no-store"})).json())["dist-tags"]?.latest;h||(console.error("Error: Could not retrieve latest version."),process.exit(1)),console.log(g?`Latest version: v${h}`:h!==n?`A new version of FluxFlow is available: v${h} (current: v${n}). Run "fluxflow --update latest" to upgrade.`:`FluxFlow is up to date (v${n}).`)}catch(l){console.error("Error checking for updates:",l.message),process.exit(1)}process.exit(0)}else if(C==="latest"){console.log("Checking latest version and settings...");try{let c=(await(await fetch("https://registry.npmjs.org/fluxflow-cli",{cache:"no-store"})).json())["dist-tags"]?.latest;c||(console.error("Error: Could not retrieve latest version."),process.exit(1)),c===n&&(console.log(`FluxFlow is already up to date (v${n}).`),process.exit(0));let h=async()=>{let s=(await import("react")).default,{useState:N}=s,{render:_,Box:y,Text:S}=await import("ink"),D=(await import("ink-select-input")).default,E=(await import("ink-text-input")).default;return new Promise(W=>{let M=[{label:"NPM",value:"npm"},{label:"PNPM",value:"pnpm"},{label:"Yarn",value:"yarn"},{label:"Bun",value:"bun"},{label:"Custom Command",value:"custom"}],H=({label:k,isSelected:F})=>s.createElement(y,{width:"100%"},s.createElement(S,{bold:F},"\u2514\u2500 ",F?"\x1B[32m\u25CF\x1B[0m":"\u25CB"," ",k)),O,X=()=>{let[k,F]=N("select"),[z,J]=N(""),P=e=>{e.value==="custom"?F("custom"):B({manager:e.value})},L=e=>{B({manager:"custom",customCommand:e})};return k==="custom"?s.createElement(y,{flexDirection:"column",marginY:1},s.createElement(y,{marginBottom:1},s.createElement(S,{color:"magenta",bold:!0},"\u{1F527} Enter custom update command:")),s.createElement(y,{flexDirection:"row"},s.createElement(S,{color:"cyan",bold:!0}," \u276F "),s.createElement(E,{value:z,onChange:J,onSubmit:L})),s.createElement(y,{marginTop:1},s.createElement(S,{color:"gray",dimColor:!0,italic:!0}," (Press Enter to confirm)"))):s.createElement(y,{flexDirection:"column",marginY:1},s.createElement(y,{marginBottom:1},s.createElement(S,{color:"magenta",bold:!0},"\u{1F4E6} Select a package manager for the update:")),s.createElement(D,{items:M,onSelect:P,itemComponent:H,indicatorComponent:()=>null}))},B=k=>{O&&O(),W(k)},{unmount:V}=_(s.createElement(X,null));O=V})},i,$="",A;try{let{loadSettings:s}=await import("./chunks/settings-KKYNW25D.js");A=await s(),i=A?.systemSettings?.updateManager||A?.updateManager}catch{}if(!i){let s=await h();i=s.manager,$=s.customCommand}let p="";i==="pnpm"?p=`pnpm add -g fluxflow-cli@${c}`:i==="bun"?p=`bun add -g fluxflow-cli@${c}`:i==="yarn"?p=`yarn global add fluxflow-cli@${c}`:i==="custom"?p=$||A?.customUpdateCommand||`npm install -g fluxflow-cli@${c}`:p=`npm install -g fluxflow-cli@${c}`,console.log(`Updating FluxFlow to v${c} using ${i}...`),console.log(`Running: ${p}`);let{execSync:v}=await import("child_process");v(p,{stdio:"inherit"}),console.log(`\x1B[32m\u2705 Update successful! FluxFlow updated to v${c}.\x1B[0m`)}catch(g){console.error("\x1B[31m\u274C Update failed:\x1B[0m",g.message),process.exit(1)}process.exit(0)}else console.error("Unknown update command. Available options: --update, --update check, --update check latest, --update latest"),process.exit(1)}}let{default:ae}=await import("react"),{render:le}=await import("ink"),{default:ce}=await import("./chunks/app-FPNTVYSV.js");process.env.NODE_NO_WARNINGS="1";let pe=["cuimp","Found existing binary","Binary verified","curl.exe not found","Falling back to .bat file","DeprecationWarning"],me=console.log,de=console.warn,ue=console.error,G=o=>{let m=o.map(String).join(" ");return pe.some(r=>m.includes(r))};console.log=(...o)=>!G(o)&&me(...o),console.warn=(...o)=>!G(o)&&de(...o),console.error=(...o)=>!G(o)&&ue(...o);let Y=t.findIndex(o=>o==="--cwd"||o==="--path");if(Y!==-1&&Y+1<t.length){let o=t[Y+1],m=await import("path"),r=await import("fs-extra"),d=m.default.resolve(o);try{r.default.existsSync(d)&&r.default.statSync(d).isDirectory()?process.chdir(d):(console.error(`[ERROR] Directory not found: "${o}"`),process.exit(0))}catch(x){console.error(`[ERROR] Failed to change directory to "${o}": ${x.message}`),process.exit(0)}}let I=t.includes("--commit_8f4a2b9c"),q=t.findIndex(o=>o==="-p"||o==="--prompt");if(q!==-1||I){let o=t.includes("--new")||t.includes("-n"),r=(q!==-1?t.slice(q+1).filter(e=>e!=="-n"&&e!=="--new"):[])[0];if(I)try{let{execSync:e}=await import("child_process"),a=e("git diff --cached",{encoding:"utf8",stdio:["ignore","pipe","pipe"]}).trim();a||process.exit(0),r=`Git Staged Diff:
70
70
  ${a}
71
71
  ---
72
72
 
73
- Write as conventional, title + bullet description style commit message. No markdown, emojis, fluff`}catch{process.exit(0)}let d=t.findIndex(e=>e==="-r"||e==="--run"),x=null,n=null;if(d!==-1&&d+1<t.length){x=t[d+1];try{let{execSync:e}=await import("child_process");n=e(x,{encoding:"utf8",stdio:["ignore","pipe","pipe"]}).trim()}catch(e){n=(e.stdout?e.stdout.toString().trim():"")||(e.stderr?e.stderr.toString().trim():"")||e.message}}if(n){let{stripAnsi:e}=await import("./chunks/exec_command-THB36X3Y.js");n=e(n).trim(),r?r=`Stdin Context (${x}):
73
+ Write as conventional, title + bullet description style commit message. No markdown, emojis, fluff`}catch{process.exit(0)}let d=t.findIndex(e=>e==="-r"||e==="--run"),x=null,n=null;if(d!==-1&&d+1<t.length){x=t[d+1];try{let{execSync:e}=await import("child_process");n=e(x,{encoding:"utf8",stdio:["ignore","pipe","pipe"]}).trim()}catch(e){n=(e.stdout?e.stdout.toString().trim():"")||(e.stderr?e.stderr.toString().trim():"")||e.message}}if(n){let{stripAnsi:e}=await import("./chunks/exec_command-J23EG77W.js");n=e(n).trim(),r?r=`Stdin Context (${x}):
74
74
  ${n}
75
75
  ---
76
76
 
77
- ${r}`:r=n}if(!I&&!process.stdin.isTTY){let e=[];for await(let w of process.stdin)e.push(w);let a=Buffer.concat(e).toString("utf8").trim();if(a){let{stripAnsi:w}=await import("./chunks/exec_command-THB36X3Y.js");a=w(a).trim(),r?r=`Stdin Context:
77
+ ${r}`:r=n}if(!I&&!process.stdin.isTTY){let e=[];for await(let w of process.stdin)e.push(w);let a=Buffer.concat(e).toString("utf8").trim();if(a){let{stripAnsi:w}=await import("./chunks/exec_command-J23EG77W.js");a=w(a).trim(),r?r=`Stdin Context:
78
78
  ${a}
79
79
  ---
80
80
 
81
- ${r}`:r=a}}r||(console.error("[ERROR] -p/--prompt requires a prompt string (or piped stdin input)."),process.exit(1));let{loadSettings:C}=await import("./chunks/settings-KKYNW25D.js"),{getProviderAPIKey:g}=await import("./chunks/secrets-LPVNWDTB.js"),{getDefaultModel:l}=await import("./chunks/model_config-M24OEKJE.js"),{generateSimpleContent:c}=await import("./chunks/ai-GKU62P7B.js"),{checkQuotaDetailed:h}=await import("./chunks/usage-VLICZGBC.js"),i=await C(),$=t.filter(e=>e!=="-p"&&e!=="--prompt"&&e!==r&&e!=="-n"&&e!=="--new"),A=I||$.includes("--raw")||t.includes("--raw"),p=e=>{for(let a of e){let w=$.indexOf(a);if(w!==-1&&w+1<$.length)return $[w+1]}return null},v=p(["--provider"])||i.aiProvider||"Google",s=p(["--model"])||i.activeModel||l(v,i.apiTier)||l(v,"paid"),N=p(["--key"])||await g(v);N||(console.error(`[ERROR] No API key resolved for provider "${v}".`),process.exit(1));let _=await h("agent",{aiProvider:v});_.allowed||(console.error(`[ERROR] ${_.reason||"Budget Exhausted"} - adjust with /budget set.`),process.exit(1));let{name:y="",nickname:S="",instructions:D=""}=i?.profileData??{},E={aiProvider:v,apiKey:N,model:s,mode:"flow",thinkingLevel:p(["--thinking"])||"Fast",systemSettings:i.systemSettings||{}},W=process.platform==="win32"?"Windows":process.platform==="darwin"?"macOS":"Linux",M=new Date,H=M.getFullYear(),O=M.toLocaleString("en-US",{month:"short"}).toUpperCase(),X=String(M.getDate()).padStart(2,"0"),B=M.toLocaleTimeString([],{hour:"2-digit",hour12:!0}),V=`${H}-${O}-${X}, ${B}`,k=`Identity: FluxFlow. Sassy, CLI Assistant
81
+ ${r}`:r=a}}r||(console.error("[ERROR] -p/--prompt requires a prompt string (or piped stdin input)."),process.exit(1));let{loadSettings:C}=await import("./chunks/settings-KKYNW25D.js"),{getProviderAPIKey:g}=await import("./chunks/secrets-LPVNWDTB.js"),{getDefaultModel:l}=await import("./chunks/model_config-M24OEKJE.js"),{generateSimpleContent:c}=await import("./chunks/ai-IHT7BYEA.js"),{checkQuotaDetailed:h}=await import("./chunks/usage-VLICZGBC.js"),i=await C(),$=t.filter(e=>e!=="-p"&&e!=="--prompt"&&e!==r&&e!=="-n"&&e!=="--new"),A=I||$.includes("--raw")||t.includes("--raw"),p=e=>{for(let a of e){let w=$.indexOf(a);if(w!==-1&&w+1<$.length)return $[w+1]}return null},v=p(["--provider"])||i.aiProvider||"Google",s=p(["--model"])||i.activeModel||l(v,i.apiTier)||l(v,"paid"),N=p(["--key"])||await g(v);N||(console.error(`[ERROR] No API key resolved for provider "${v}".`),process.exit(1));let _=await h("agent",{aiProvider:v});_.allowed||(console.error(`[ERROR] ${_.reason||"Budget Exhausted"} - adjust with /budget set.`),process.exit(1));let{name:y="",nickname:S="",instructions:D=""}=i?.profileData??{},E={aiProvider:v,apiKey:N,model:s,mode:"flow",thinkingLevel:p(["--thinking"])||"Fast",systemSettings:i.systemSettings||{}},W=process.platform==="win32"?"Windows":process.platform==="darwin"?"macOS":"Linux",M=new Date,H=M.getFullYear(),O=M.toLocaleString("en-US",{month:"short"}).toUpperCase(),X=String(M.getDate()).padStart(2,"0"),B=M.toLocaleTimeString([],{hour:"2-digit",hour12:!0}),V=`${H}-${O}-${X}, ${B}`,k=`Identity: FluxFlow. Sassy, CLI Assistant
82
82
  Use NO markdown, only plain text
83
83
  Additional Context:
84
84
  - OS: ${W}
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "fluxflow-cli",
3
- "version": "4.24.8",
4
- "date": "2026-10-02",
3
+ "version": "4.25.0",
4
+ "date": "2026-10-03",
5
5
  "description": "One of the lightest, fastest, high-fidelity agentic CLI with sub-agents & computer use.",
6
6
  "keywords": [
7
7
  "ai",
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "scripts": {
45
45
  "start": "tsx ./src/cli.jsx",
46
- "build": "esbuild ./src/cli.jsx --bundle --platform=node --format=esm --splitting --minify --tree-shaking=true --chunk-names=chunks/[name]-[hash] --outdir=./dist --external:react --external:ink --external:chalk --external:fs-extra --external:gradient-string --external:ink-text-input --external:ink-select-input --external:ink-spinner --external:@google/genai --external:zod --external:nanoid --external:puppeteer --external:pdf-lib --external:node-pty --external:html-to-docx --external:typescript --external:ws --external:web-tree-sitter --external:diff --external:dotenv --external:fast-glob --external:turndown --external:turndown-plugin-gfm --external:@nut-tree-fork/nut-js --external:sharp --external:screenshot-desktop --external:tesseract.js --external:ollama --external:minimatch && copy package.json dist\\package.json && copy src\\entry.js dist\\entry.js && copy model_config.json dist\\model_config.json"
46
+ "build": "esbuild ./src/cli.jsx --bundle --platform=node --format=esm --splitting --minify --tree-shaking=true --chunk-names=chunks/[name]-[hash] --outdir=./dist --external:react --external:ink --external:chalk --external:fs-extra --external:gradient-string --external:ink-text-input --external:ink-select-input --external:ink-spinner --external:@google/genai --external:zod --external:nanoid --external:puppeteer --external:pdf-lib --external:node-pty --external:html-to-docx --external:typescript --external:ws --external:web-tree-sitter --external:diff --external:dotenv --external:fast-glob --external:turndown --external:turndown-plugin-gfm --external:@nut-tree-fork/nut-js --external:sharp --external:screenshot-desktop --external:tesseract.js --external:ollama --external:minimatch --external:onnxruntime-node && copy package.json dist\\package.json && copy src\\entry.js dist\\entry.js && copy model_config.json dist\\model_config.json"
47
47
  },
48
48
  "dependencies": {
49
49
  "@google/genai": "^1.52.0",
@@ -64,6 +64,7 @@
64
64
  "nanoid": "^5.1.9",
65
65
  "node-pty": "^1.1.0",
66
66
  "ollama": "^0.6.3",
67
+ "onnxruntime-node": "^1.30.0",
67
68
  "pdf-lib": "^1.17.1",
68
69
  "puppeteer": "24.43.1",
69
70
  "react": "^19.2.5",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "fluxflow-cli",
3
- "version": "4.24.8",
4
- "date": "2026-10-02",
3
+ "version": "4.25.0",
4
+ "date": "2026-10-03",
5
5
  "description": "One of the lightest, fastest, high-fidelity agentic CLI with sub-agents & computer use.",
6
6
  "keywords": [
7
7
  "ai",
@@ -43,7 +43,7 @@
43
43
  },
44
44
  "scripts": {
45
45
  "start": "tsx ./src/cli.jsx",
46
- "build": "esbuild ./src/cli.jsx --bundle --platform=node --format=esm --splitting --minify --tree-shaking=true --chunk-names=chunks/[name]-[hash] --outdir=./dist --external:react --external:ink --external:chalk --external:fs-extra --external:gradient-string --external:ink-text-input --external:ink-select-input --external:ink-spinner --external:@google/genai --external:zod --external:nanoid --external:puppeteer --external:pdf-lib --external:node-pty --external:html-to-docx --external:typescript --external:ws --external:web-tree-sitter --external:diff --external:dotenv --external:fast-glob --external:turndown --external:turndown-plugin-gfm --external:@nut-tree-fork/nut-js --external:sharp --external:screenshot-desktop --external:tesseract.js --external:ollama --external:minimatch && copy package.json dist\\package.json && copy src\\entry.js dist\\entry.js && copy model_config.json dist\\model_config.json"
46
+ "build": "esbuild ./src/cli.jsx --bundle --platform=node --format=esm --splitting --minify --tree-shaking=true --chunk-names=chunks/[name]-[hash] --outdir=./dist --external:react --external:ink --external:chalk --external:fs-extra --external:gradient-string --external:ink-text-input --external:ink-select-input --external:ink-spinner --external:@google/genai --external:zod --external:nanoid --external:puppeteer --external:pdf-lib --external:node-pty --external:html-to-docx --external:typescript --external:ws --external:web-tree-sitter --external:diff --external:dotenv --external:fast-glob --external:turndown --external:turndown-plugin-gfm --external:@nut-tree-fork/nut-js --external:sharp --external:screenshot-desktop --external:tesseract.js --external:ollama --external:minimatch --external:onnxruntime-node && copy package.json dist\\package.json && copy src\\entry.js dist\\entry.js && copy model_config.json dist\\model_config.json"
47
47
  },
48
48
  "dependencies": {
49
49
  "@google/genai": "^1.52.0",
@@ -64,6 +64,7 @@
64
64
  "nanoid": "^5.1.9",
65
65
  "node-pty": "^1.1.0",
66
66
  "ollama": "^0.6.3",
67
+ "onnxruntime-node": "^1.30.0",
67
68
  "pdf-lib": "^1.17.1",
68
69
  "puppeteer": "24.43.1",
69
70
  "react": "^19.2.5",
@@ -1,31 +0,0 @@
1
- import{d as $}from"./chunk-DSVLWYIT.js";import R from"fs-extra";import y from"path";var N=l=>{if(!l)return[];let u=[],p=/\[tool:(.*?)\((.*?)\)\]/g,n=0,i;for(;(i=p.exec(l))!==null;){if(i.index>n){let e=l.slice(n,i.index);e.trim()&&u.push({type:"output",content:e})}u.push({type:"tool",toolName:i[1],args:i[2]}),n=p.lastIndex}if(n<l.length){let e=l.slice(n);e.trim()&&u.push({type:"output",content:e})}return u},b=async(l,u,p=process.cwd())=>{let n=`export-fluxflow-${l}.txt`,i=y.join(p,n),e=[],o=!1;for(let m=0;m<u.length;m++){let r=u[m];if(r&&!(r.role==="system"||r.isMeta||r.isLogo||String(r.id).startsWith("welcome"))){if(r.role==="user"){let s=r.text||"";s=s.replace(/\s*\[Prompted on:.*?\]/g,"").trim(),e.length>0&&e.push(""),e.push("[USER]"),e.push(s),o=!1}else if(r.role==="think"){o||(e.push(""),e.push("[AGENT]"),o=!0);let s=(r.text||"").replace(/\[\[\s*turn\s*:\s*(continue|finish)\s*\]\]/gi,"").replace(/\[\[END\]\]/gi,"").replace(/\[\[(?:TOOL|ACTION) RESULTS\]\]/gi,"").replace(/\[(?:TOOL|ACTION) RESULTS\]/gi,"").replace(/\[(?:TOOL|ACTION) RESULT\]/gi,"").trim();s&&(e.push("[thoughts]"),e.push(s))}else if(r.role==="agent"){o||(e.push(""),e.push("[AGENT]"),o=!0);let s=N(r.text||"");for(let c of s)if(c.type==="output"){let a=c.content.replace(/\[\[\s*turn\s*:\s*(continue|finish)\s*\]\]/gi,"").replace(/\[\[END\]\]/gi,"").replace(/\[\[(?:TOOL|ACTION) RESULTS\]\]/gi,"").replace(/\[(?:TOOL|ACTION) RESULTS\]/gi,"").replace(/\[(?:TOOL|ACTION) RESULT\]/gi,"").trim();a&&(e.push("[output]"),e.push(a))}else c.type==="tool"&&(e.push("[tool]"),e.push(`${c.toolName} ${c.args}`))}}}let O=e.join(`
2
- `);return await R.writeFile(i,O,"utf8"),{exportFile:n,exportPath:i,totalLines:e.length}},j=(l,u="FluxFlow",p=null)=>{if(!l||!l.trim())return[];let n=l.split(`
3
- `),i=[],e=[],o=/^\s*(?:CRITICAL\s+ERROR|ERROR|DEBUG|SEARCH|PUPPETEER|WARN|WARNING|INFO)\b/i,O=/^\s*-{3,}\s*$/,m=!1;for(let s of n)if(o.test(s)){m=!0;break}if(!m){let s=l.trim();if(!s)return[];let c=p?new Date(p).toLocaleString():"Unknown Time",a=/\bjanitor\b/i.test(s)?"Memory":u;return[{timestamp:c,level:"ERROR",source:a,message:s}]}for(let s of n)O.test(s)?e.length>0&&(i.push(e.join(`
4
- `).trim()),e=[]):o.test(s)?(e.length>0&&(i.push(e.join(`
5
- `).trim()),e=[]),e.push(s)):(e.length>0||s.trim())&&e.push(s);e.length>0&&i.push(e.join(`
6
- `).trim());let r=[];for(let s of i){if(!s)continue;let c=s.split(`
7
- `).map(t=>t.trimEnd()),a=c[0]||"";if(!/\bERROR\b/i.test(s))continue;let T=a.match(/\[(.*?)\]/),d=T?T[1]:null,L="ERROR";/CRITICAL\s+ERROR/i.test(a)&&(L="CRITICAL ERROR");let E="";if(T){let t=a.indexOf("]:");t!==-1?E=a.substring(t+2).trim():E=a.replace(o,"").replace(/\[.*?\]/,"").replace(/^:\s*/,"").trim()}else E=a.replace(o,"").replace(/^:\s*/,"").trim();if(c.length>1){let t=c.slice(1).join(`
8
- `).trim();t&&(E=E?`${E}
9
- ${t}`:t)}if(E){let t=/\bjanitor\b/i.test(s)?"Memory":u;r.push({timestamp:d||(p?new Date(p).toLocaleString():"Unknown Time"),level:L,source:t,message:E})}}return r},A=async(l=process.cwd())=>{let u=`fluxflow-error-${Date.now()}.txt`,p=y.join(l,u),n=async t=>{if(!await R.pathExists(t))return[];let h=await R.readdir(t),f=[];for(let g of h){let x=y.join(t,g),w=await R.stat(x);if(w.isDirectory()){let C=await n(x);f=f.concat(C)}else(g.endsWith(".log")||g.endsWith(".txt"))&&f.push({path:x,mtime:w.mtimeMs})}return f},i=await n($),e=[];for(let t of i)try{let h=await R.readFile(t.path,"utf8");if(h.trim()){let f=t.path.replace(/\\/g,"/").toLowerCase(),g="FluxFlow";f.includes("/janitor")||f.includes("janitor")?g="Memory":f.includes("/usage")||f.includes("usage")?g="Usage":!f.includes("/agent")&&!f.includes("agent")&&(g="Other");let x=j(h,g,t.mtime);e=e.concat(x)}}catch{}let o=[],O=new Set;for(let t of e){let h=`${t.source}::${t.timestamp}::${t.message.trim()}`;O.has(h)||(O.add(h),o.push(t))}let m=o.filter(t=>t.source==="FluxFlow"),r=o.filter(t=>t.source==="Memory"),s=o.filter(t=>t.source==="Usage"),c=o.filter(t=>!["FluxFlow","Memory","Usage"].includes(t.source)),a=(t,h,f)=>{let g=["================================================================================",`${t} (${h.length})`,"================================================================================"].join(`
10
- `);if(h.length===0)return`${g}
11
- No ${f} error entries found.`;let x=h.map((w,C)=>{let F=`[${f} #${C+1}] ${w.timestamp} (${w.level})`,U=w.message.split(`
12
- `).map(I=>` ${I}`).join(`
13
- `);return`${F}
14
- ${U}`});return`${g}
15
-
16
- `+x.join(`
17
-
18
- --------------------------------------------------------------------------------
19
-
20
- `)},S=[`FluxFlow: ${m.length}`,`Memory: ${r.length}`,`Usage: ${s.length}`];c.length>0&&S.push(`Other: ${c.length}`);let T=["================================================================================","FLUXFLOW ERROR LOGS EXPORT",`Exported At : ${new Date().toLocaleString()}`,`Total Errors: ${o.length} (${S.join(" | ")})`,"================================================================================",""].join(`
21
- `),d=1,L=[a(`SECTION ${d++}: FLUXFLOW ERRORS`,m,"FluxFlow"),a(`SECTION ${d++}: MEMORY ERRORS`,r,"Memory"),a(`SECTION ${d++}: USAGE ERRORS`,s,"Usage")];c.length>0&&L.push(a(`SECTION ${d++}: OTHER SYSTEM ERRORS`,c,"Other"));let E=T+L.join(`
22
-
23
-
24
- `)+`
25
- `;await R.writeFile(p,E,"utf8");try{await R.pathExists($)&&await R.emptyDir($)}catch{}return{exportFile:u,exportPath:p,entryCount:o.length,fluxflowCount:m.length,memoryCount:r.length,usageCount:s.length}},P=async(l,{chatId:u,messages:p})=>{let n=(l[1]||"chat").toLowerCase();return n==="chat"?{success:!0,type:"chat",message:`\u2726 Chat Exported
26
- \u2800\u2800\u2514\u2500 ${(await b(u,p)).exportFile}
27
- \u2800`}:n==="logs"?{success:!0,type:"logs",message:`\u2726 Error Logs Exported
28
- \u2800\u2800\u2514\u2500 ${(await A()).exportFile}
29
- \u2800`}:{success:!1,message:`[EXPORT USAGE] Unknown subcommand "${n}". Options:
30
- \u2022 /export chat current
31
- \u2022 /export logs error`}};export{N as a,b,j as c,A as d,P as e};
@@ -1,5 +0,0 @@
1
- import{screen as j}from"@nut-tree-fork/nut-js";import B from"screenshot-desktop";import K from"sharp";import P from"fs-extra";import Z from"path";var l={TARGET_WIDTH:1280,TARGET_HEIGHT:720,COLS:40,ROWS:30},U=[];async function et(o){try{let{data:t,info:C}=await K(o).resize(l.TARGET_WIDTH,l.TARGET_HEIGHT,{fit:"fill"}).greyscale().raw().toBuffer({resolveWithObject:!0}),a=C.width,x=C.height,c=l.COLS,d=l.ROWS,u=a/c,s=x/d,G=[],w=1;for(let e=0;e<d;e++)for(let r=0;r<c;r++){let M=Math.floor(r*u),g=Math.floor(e*s),X=Math.floor((r+1)*u),b=Math.floor((e+1)*s),N=Math.floor((b-g)/3),E=0,$=0,F=0,L=0,i=0,n=0;for(let h=g;h<b;h+=2)for(let T=M;T<X;T+=2){let q=t[h*a+T];h<g+N?(F+=q,L++):h>b-N?(i+=q,n++):(E+=q,$++)}let S=(F+E+i)/(L+$+n),f=0,p=0,H=0;for(let h=g;h<b;h+=2)for(let T=M;T<X;T+=2){let W=t[h*a+T]-S;h<g+N?p+=W*W:h>b-N?H+=W*W:f+=W*W}let R=Math.sqrt(f/($||1)),D=Math.sqrt(p/(L||1)),O=Math.sqrt(H/(n||1)),A=Math.sqrt((p+f+H)/(L+$+n||1)),I=3;D>O+3?I=10:(O>D+3||R>12)&&(I=-8),A>18&&G.push({cellNum:w,cx:Math.floor(M+u/2),cy:Math.floor(g+s/2),cellW:u,cellH:s,startX:M,startY:g,yOffset:I,mean:S,stdDev:A}),w++}let m=Array.from({length:d},()=>Array(c).fill(null));for(let e of G){let r=Math.floor((e.cellNum-1)/c),M=(e.cellNum-1)%c;m[r][M]=e}let v=Array.from({length:d},()=>Array(c).fill(!1)),y=[];for(let e=0;e<d;e++)for(let r=0;r<c;r++)if(m[e][r]&&!v[e][r]){let M=e,g=e,X=r,b=r,N=[[e,r]],E=[m[e][r]],$=Array.from({length:d},()=>Array(c).fill(!1));for($[e][r]=!0;N.length>0;){let[i,n]=N.shift();M=Math.min(M,i),g=Math.max(g,i),X=Math.min(X,n),b=Math.max(b,n);let S=[[i-1,n],[i+1,n],[i,n-1],[i,n+1],[i-1,n-1],[i-1,n+1],[i+1,n-1],[i+1,n+1]];for(let[f,p]of S)f>=0&&f<d&&p>=0&&p<c&&m[f][p]&&!$[f][p]&&($[f][p]=!0,N.push([f,p]),E.push(m[f][p]))}let F=g-M+1,L=b-X+1;if(F<=4&&L<=4){for(let D of E){let O=Math.floor((D.cellNum-1)/c),A=(D.cellNum-1)%c;v[O][A]=!0}let i=Math.floor(X*u),n=Math.floor(M*s),S=Math.floor((b+1)*u),f=Math.floor((g+1)*s),p=S-i,H=f-n,R=3;if(H>s){let D=E.filter(h=>h.startY<n+H/2),O=E.filter(h=>h.startY>=n+H/2),A=D.reduce((h,T)=>h+T.stdDev,0)/(D.length||1),I=O.reduce((h,T)=>h+T.stdDev,0)/(O.length||1);I>A+2?R=-Math.floor(H/4):A>I+2?R=Math.floor(H/4):R=-12}else R=(E.find(O=>O.yOffset!==3)||E[0]).yOffset;y.push({cellNum:E[0].cellNum,cx:Math.floor(i+p/2),cy:Math.floor(n+H/2),cellW:p,cellH:H,startX:i,startY:n,yOffset:R})}else{v[e][r]=!0;let i=m[e][r],n=e+1<d?m[e+1][r]:null;if(n&&!v[e+1][r]){v[e+1][r]=!0;let S=Math.floor(r*u),f=Math.floor(e*s),p=Math.floor((r+1)*u),H=Math.floor((e+2)*s),R=p-S,D=H-f,O=Math.floor(s*.25),A=Math.floor(f+s-O),I=Math.floor(f+s+O),h=0,T=0;for(let Y=A;Y<I;Y+=2)for(let _=S;_<p;_+=2)h+=t[Y*a+_],T++;let q=h/(T||1),W=0;for(let Y=A;Y<I;Y+=2)for(let _=S;_<p;_+=2){let z=t[Y*a+_]-q;W+=z*z}let tt=Math.sqrt(W/(T||1)),k;if(tt<14)k=Math.floor(f+s)+4;else{let Y=i.stdDev||0,_=n.stdDev||0;Y<_?k=Math.floor(f+s/2)+(i.yOffset!==3?i.yOffset:-4):k=Math.floor(f+s+s/2)+(n.yOffset!==3?n.yOffset:4)}k=Math.max(f+11,Math.min(f+D-2,k)),y.push({cellNum:i.cellNum,cx:Math.floor(S+R/2),cy:k,cellW:R,cellH:D,startX:S,startY:f,yOffset:0,isCustomY:!0})}else y.push(i)}}return U=y,y}catch(t){return console.error("UI Element Detection error:",t),[]}}function ot(o,t,C,a,x=[]){let c=o/C,d=t/a,u="";for(let s of x){let{cellNum:G,startX:w,startY:m,cellW:v,cellH:y,cx:e,cy:r}=s;u+=`
2
- <rect x="${w+1}" y="${m+1}" width="${v-2}" height="${y-2}" fill="rgba(0, 255, 255, 0.015)" stroke="rgba(255, 255, 0, 0.3)" stroke-width="1.1" rx="2"/>
3
- `;let M;if(s.isCustomY)M=r;else{let g=r+(s.yOffset!==void 0?s.yOffset:3);M=Math.max(m+11,Math.min(m+y+3,g))}u+=`
4
- <text x="${e}" y="${M}" font-family="'Segoe UI', Roboto, sans-serif" font-size="14" font-weight="600" fill="#FFFF00" stroke="#000000" stroke-width="2" paint-order="stroke fill" stroke-linejoin="round" opacity="0.8" text-anchor="middle">${G}</text>
5
- `}return`<svg width="${o}" height="${t}" xmlns="http://www.w3.org/2000/svg">${u}</svg>`}var J=1,V=o=>new Promise(t=>setTimeout(t,o));async function Q(){try{let{loadSettings:o}=await import("./settings-KKYNW25D.js"),t=await o();return Number(t.display||0)}catch{return 0}}async function st(){let o=await Q();try{let t=await B.listDisplays();if(t&&t.length>0)return{format:"png",screen:(t[o]||t[0]).id}}catch{}return{format:"png"}}async function rt(){let o=0,t=await st();for(;o<2;){let C=await B(t);await V(500);let a=await B(t);if(C.equals(a))return a;o++,o<2&&await V(3e3)}return await V(3e3),await B(t)}async function ht(){try{let o=await rt(),t=await et(o),C=ot(l.TARGET_WIDTH,l.TARGET_HEIGHT,l.COLS,l.ROWS,t),a=await K(o).resize(l.TARGET_WIDTH,l.TARGET_HEIGHT,{fit:"fill"}).composite([{input:Buffer.from(C),top:0,left:0}]).png({quality:100}).toBuffer();if(process.env.SHOW_DEBUG_GRID)try{let s=Z.resolve(process.cwd(),"screenshots");await P.ensureDir(s);let G=Z.join(s,`${J}.png`);await P.writeFile(G,a),J++}catch{}let x=a.toString("base64"),c=t.length,d=o,u=a;return d=null,u=null,{base64:x,mimeType:"image/png",width:l.TARGET_WIDTH,height:l.TARGET_HEIGHT,detectedCount:c}}catch(o){return console.error("Failed to capture gridded screenshot:",o),null}}function nt(o){if(o==null)return null;let t=null;if(typeof o=="number")t=o;else if(typeof o=="string"){let w=o.trim();if(/^\d+$/.test(w))t=parseInt(w,10);else{let m=w.match(/^([A-Z])([0-9]{1,2})$/i);if(m){let v=m[1].toUpperCase().charCodeAt(0)-65,y=parseInt(m[2],10)-1;t=v*l.COLS+y+1}}}if(t===null||isNaN(t))return null;if(U&&U.length>0){let w=U.find(m=>m.cellNum===t);if(w)return{x:w.cx,y:w.cy,colIdx:Math.floor((t-1)%l.COLS),rowIdx:Math.floor((t-1)/l.COLS),cellNum:t}}let C=l.COLS*l.ROWS;if(t<1||t>C)return null;let a=t-1,x=Math.floor(a/l.COLS),c=a%l.COLS,d=l.TARGET_WIDTH/l.COLS,u=l.TARGET_HEIGHT/l.ROWS,s=Math.floor(c*d+d/2),G=Math.floor(x*u+u/2);return{x:s,y:G,colIdx:c,rowIdx:x,cellNum:t}}async function ut(o,t,C){let a=null;if(typeof o=="number"||typeof o=="string"?a=nt(o):o&&typeof o.x=="number"&&typeof o.y=="number"&&(a=o),!a)return null;let x=t,c=C,d=0,u=0,s=await Q();try{let y=await B.listDisplays();if(y&&y.length>0){let e=y[s]||y[0];e.width&&e.height&&(x=e.width,c=e.height),e.left!==void 0&&(d=e.left),e.top!==void 0&&(u=e.top)}}catch{}if(!x||!c)try{x=await j.width(),c=await j.height()}catch{x=1920,c=1080}let G=x/l.TARGET_WIDTH,w=c/l.TARGET_HEIGHT,m=Math.round(a.x*G)+d,v=Math.round(a.y*w)+u;return{x:m,y:v,screenW:x,screenH:c,offsetX:d,offsetY:u}}export{l as a,Q as b,ht as c,nt as d,ut as e};
@@ -1,2 +0,0 @@
1
- import{a as B}from"./chunk-7M3AFLUN.js";import{d as H}from"./chunk-KNCL7AK2.js";import{a as j}from"./chunk-Y5JU726N.js";import J from"screenshot-desktop";import v from"sharp";import N from"fs-extra";import q from"path";import"@nut-tree-fork/nut-js";async function A(t,n,s){if(!(!process.env.SHOW_DEBUG_GRID&&!process.env.DEBUG_OCR))try{let i=q.resolve(process.cwd(),"screenshots",t);await N.ensureDir(i),await N.writeFile(q.join(i,n),s)}catch{}}function Q(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Z(t,n,s=1/0){if(t===n)return 0;if(t.length===0)return n.length;if(n.length===0)return t.length;if(Math.abs(t.length-n.length)>s)return s+1;let i=Array.from({length:n.length+1},(r,e)=>e);for(let r=1;r<=t.length;r++){let e=[r],c=r;for(let o=1;o<=n.length;o++){let f=t[r-1]===n[o-1]?0:1,a=Math.min(e[o-1]+1,i[o]+1,i[o-1]+f);e.push(a),a<c&&(c=a)}if(i=e,c>s)return s+1}return i[n.length]}function X(t){return t<=4?0:t<=8?1:2}async function F(t,n=3){let s=await v(t).metadata();return v(t).resize(Math.round(s.width*n),Math.round(s.height*n),{kernel:"lanczos3"}).greyscale().normalise().toBuffer()}function Y(t){if(!t)return{words:[],lines:[]};let n=[],s=new Map;for(let r of t.split(`
2
- `)){let e=r.split(" ");if(e.length<12||parseInt(e[0])!==5)continue;let o=e[2],f=e[3],a=e[4],h=parseInt(e[6]),x=parseInt(e[7]),b=parseInt(e[8]),u=parseInt(e[9]),l=parseFloat(e[10]),g=e.slice(11).join(" ").trim();if(!g||l<0)continue;let m={x0:h,y0:x,x1:h+b,y1:x+u},w={text:g,confidence:l,bbox:m};n.push(w);let p=`${o}_${f}_${a}`;s.has(p)||s.set(p,{words:[],bbox:{x0:1/0,y0:1/0,x1:-1/0,y1:-1/0}});let d=s.get(p);d.words.push(w),d.bbox.x0=Math.min(d.bbox.x0,m.x0),d.bbox.y0=Math.min(d.bbox.y0,m.y0),d.bbox.x1=Math.max(d.bbox.x1,m.x1),d.bbox.y1=Math.max(d.bbox.y1,m.y1)}let i=[];for(let r of s.values())r.words.length>0&&i.push({text:r.words.map(e=>e.text).join(" "),bbox:r.bbox,words:r.words});return{words:n,lines:i}}function tt(t){if(!(t.words&&t.words.length>0)){if(t.blocks&&t.blocks.length>0){t.words=[],t.lines=[];for(let n of t.blocks)for(let s of n.paragraphs||[])for(let i of s.lines||[]){i.bbox&&t.lines.push(i);for(let r of i.words||[])r.bbox&&t.words.push(r)}if(t.words.length>0)return}if(t.tsv){let n=Y(t.tsv);t.words=n.words,t.lines=n.lines}}}function G(t,n,s=0,i=0,r=1){tt(t);let e=o=>({x0:Math.round(o.x0/r)+s,y0:Math.round(o.y0/r)+i,x1:Math.round(o.x1/r)+s,y1:Math.round(o.y1/r)+i}),c=[];if(t.lines&&t.lines.length>0)for(let o of t.lines){let f=o.text?o.text.toLowerCase().trim():"";if(!f||!o.bbox||!(f===n||new RegExp(`\\b${Q(n)}\\b`,"i").test(f)))continue;let h=o.words||(t.words?t.words.filter(l=>l.bbox&&l.bbox.x0>=o.bbox.x0-5&&l.bbox.x1<=o.bbox.x1+5&&l.bbox.y0>=o.bbox.y0-5&&l.bbox.y1<=o.bbox.y1+5):[]),x=n.split(/\s+/),b=x.map(l=>l.replace(/[^a-z0-9]/g,"")).join(" "),u=!1;if(h.length>0)for(let l=0;l<=h.length-x.length;l++){let g=h.slice(l,l+x.length),m=g.map(w=>(w.text||"").toLowerCase().trim().replace(/[^a-z0-9]/g,"")).join(" ");if(m===b||m.includes(b)){let w={x0:Math.min(...g.map(p=>p.bbox.x0)),y0:Math.min(...g.map(p=>p.bbox.y0)),x1:Math.max(...g.map(p=>p.bbox.x1)),y1:Math.max(...g.map(p=>p.bbox.y1))};c.push(e(w)),u=!0}}u||c.push(e(o.bbox))}if(c.length===0&&t.words&&t.words.length>0)for(let o of t.words){let f=o.text?o.text.toLowerCase().trim().replace(/[^a-z0-9]/g,""):"",a=n.replace(/[^a-z0-9]/g,"");f===a&&o.bbox&&c.push(e(o.bbox))}if(c.length===0&&t.words&&t.words.length>0){let o=X(n.length);for(let f of t.words){let a=f.text?f.text.toLowerCase().trim():"";a.length>=3&&Math.abs(a.length-n.length)<=o&&Z(a,n,o)<=o&&f.bbox&&c.push(e(f.bbox))}}return c}function L(t,n){let s=null,i=1/0;for(let r of t){let e=Math.round((r.x0+r.x1)/2),c=Math.round((r.y0+r.y1)/2),o=n.x>=r.x0&&n.x<=r.x1&&n.y>=r.y0&&n.y<=r.y1,f=Math.hypot(e-n.x,c-n.y),a=o?0:f;a<i&&(i=a,s={x:e,y:c,dist:f,containsPoint:o,bbox:r})}return s}function et(t,n,s,i){let c=Math.ceil(t/4),o=Math.ceil(n/2),f=[];for(let a=0;a<2;a++)for(let h=0;h<4;h++){let x=h*c,b=a*o,u=Math.min(c,t-x),l=Math.min(o,n-b),g=x+u/2,m=b+l/2,w=s>=x&&s<x+u&&i>=b&&i<b+l;f.push({x0:x,y0:b,w:u,h:l,cx:g,cy:m,containsTarget:w})}return f.sort((a,h)=>{if(a.containsTarget)return-1;if(h.containsTarget)return 1;let x=Math.hypot(a.cx-s,a.cy-i),b=Math.hypot(h.cx-s,h.cy-i);return x-b})}var W=null;async function nt(){return W||(W=(async()=>{let{createWorker:t}=await import("tesseract.js"),n=await import("fs-extra"),{CU_CACHE_DIR:s}=await import("./paths-2EXHWUSL.js");return n.ensureDirSync(s),t("eng",1,{cachePath:s,logger:()=>{}})})().catch(t=>{throw W=null,t})),W}var S=null,V=null;async function ot(){let{getActiveDisplay:t}=await import("./screen_grid-GBIGOR5Q.js"),n=await t();if(S&&V===n)return S;V=n,S={format:"png"};try{let s=await J.listDisplays();s&&s.length>0&&(S={format:"png",screen:(s[n]||s[0]).id})}catch{}return S}var gt=async(t,n={})=>{let s=!!(process.env.SHOW_DEBUG_GRID||process.env.DEBUG_OCR||process.env.VERBOSE),i=performance.now(),r=i,e=u=>{if(!s)return;let l=performance.now(),g=(l-r).toFixed(0),m=(l-i).toFixed(0);console.log(`[Click Perf] +${g}ms (${m}ms total) -> ${u}`),r=l};e("Starting click()");let c=j(t),o=c.gridId||c.grid||c.coordinate||c.target||c.id,f=(c.type||c.clickType||"single").toLowerCase(),a=(c.button||"left").toLowerCase(),h=c.intendedClickText||c.text||"";if(!o&&!h)return'ERROR: Missing required "gridId" parameter for Click tool.';let x=o;if(h)try{e("Parsing grid code");let u=o?H(o):null;e("Getting display options");let l=await ot();e("Taking desktop screenshot");let g=await J(l);e("Getting image metadata");let m=await v(g).metadata(),w=m.width||1920,p=m.height||1080,d=u?{x:Math.round(u.x*(w/1280)),y:Math.round(u.y*(p/720))}:{x:w/2,y:p/2},C=h.toLowerCase().trim();e("Acquiring OCR worker");let O=await nt(),R=null,P="",K=u?220:500;if(u){e("Pass 1: Cropping target crop (3x zoom window, 2x upscale)");let k=Math.min(Math.round(w/3),w),T=Math.min(Math.round(p/3),p),M=Math.max(0,Math.min(w-k,d.x-Math.floor(k/2))),y=Math.max(0,Math.min(p-T,d.y-Math.floor(T/2))),$=await v(g).extract({left:M,top:y,width:k,height:T}).toBuffer(),I=2,D=await F($,I),E=C.replace(/[^a-z0-9]/g,"_");await A("cropped",`crop_${Date.now()}_${E}.png`,D),e("Pass 1: Running Tesseract OCR recognize on crop (PSM 11 - Sparse Text)"),await O.setParameters({tessedit_pageseg_mode:"11"});let{data:_}=await O.recognize(D,{},{tsv:!0,blocks:!0});if(e("Pass 1: OCR recognition finished, extracting matches"),_&&_.text){s&&console.log(`[Pass 1 OCR Read]: "${_.text.trim().replace(/\s+/g," ")}"`);let U=G(_,C,M,y,I);if(U.length>0){let z=L(U,d);z&&(z.containsPoint||z.dist<=K)&&(R=z,P="centered target crop OCR")}}}if(!R){e("Pass 2: Entering Full-Screen OCR (broad scan, PSM 3 - Auto)");let k=await F(g,2),T=C.replace(/[^a-z0-9]/g,"_");await A("fullscreen",`full_${Date.now()}_${T}.png`,k),e("Pass 2: Running Tesseract on full screen"),await O.setParameters({tessedit_pageseg_mode:"3"});let{data:M}=await O.recognize(k,{},{tsv:!0,blocks:!0});if(e("Pass 2: Full-screen OCR finished"),M&&M.text){let y=G(M,C,0,0,2);if(y.length>0){let $=L(y,d);$&&(R=$,P="full-screen OCR")}}}if(!R){e("Pass 3: Entering Tiled OCR fallback (high-res 3x)");let k=et(w,p,d.x,d.y),T=C.replace(/[^a-z0-9]/g,"_");await O.setParameters({tessedit_pageseg_mode:"11"});for(let M=0;M<k.length;M++){let y=k[M];e(`Pass 3: Preprocessing tile ${M+1}/${k.length}`);let $=await v(g).extract({left:y.x0,top:y.y0,width:y.w,height:y.h}).toBuffer(),I=await F($,3);await A("tiles",`tile_${M+1}_${Date.now()}_${T}.png`,I),e(`Pass 3: Running Tesseract on tile ${M+1}`);let{data:D}=await O.recognize(I,{},{tsv:!0,blocks:!0});if(!D||!D.text)continue;let E=G(D,C,y.x0,y.y0,3);if(E.length>0){let _=L(E,d);if(_){R=_,P=`tile ${M+1} OCR (${y.containsTarget?"target tile":`offset ${y.x0},${y.y0}`})`;break}}}}if(R){let k={x:Math.round(R.x*(1280/w)),y:Math.round(R.y*(720/p))};e(`Executing mouse click on matched target (${P})`);let T=await B("click",k,{button:a,clickType:f});return e("Click completed successfully"),`${T} (${P} for "${h}" at ${Math.round(R.dist)}px distance)`}else s&&console.log(`[OCR] No match found for "${h}". Falling back to gridId.`)}catch(u){s&&console.error("[OCR Error]",u)}e(`Executing mouse click on fallback gridId: ${x}`);let b=await B("click",x,{button:a,clickType:f});return e("Fallback click completed"),b};export{gt as click};
@@ -1 +0,0 @@
1
- import{a,b,c,d,e}from"./chunk-KNCL7AK2.js";export{a as GRID_CONFIG,c as captureGriddedScreenshot,b as getActiveDisplay,e as gridToNativeCoordinates,d as parseGridCodeTo720p};