Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package picsart-gen-ai for openSUSE:Factory checked in at 2026-08-25 13:20:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/picsart-gen-ai (Old) and /work/SRC/openSUSE:Factory/.picsart-gen-ai.new.1258 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "picsart-gen-ai" Tue Aug 25 13:20:05 2026 rev:3 rq:1373481 version:2.69.0 Changes: -------- --- /work/SRC/openSUSE:Factory/picsart-gen-ai/picsart-gen-ai.changes 2026-08-24 12:15:03.242319092 +0200 +++ /work/SRC/openSUSE:Factory/.picsart-gen-ai.new.1258/picsart-gen-ai.changes 2026-08-25 13:20:25.263659179 +0200 @@ -1,0 +2,11 @@ +Mon Aug 24 20:12:35 UTC 2026 - Martin Pluskal <[email protected]> + +- Update to version 2.69.0: + * Report the generation-tracking events under event_type instead + of event, so the started and completed events match the current + telemetry schema +- Re-vendor the runtime dependencies for the new release: picomatch + 4.0.5 -> 4.0.7 is the only change, the dependency set is otherwise + unchanged + +------------------------------------------------------------------- Old: ---- gen-ai-2.68.1.tgz New: ---- gen-ai-2.69.0.tgz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ picsart-gen-ai.spec ++++++ --- /var/tmp/diff_new_pack.SaBrJK/_old 2026-08-25 13:20:26.587705930 +0200 +++ /var/tmp/diff_new_pack.SaBrJK/_new 2026-08-25 13:20:26.592706106 +0200 @@ -28,7 +28,7 @@ %define npm_name gen-ai %define npm_scope @picsart Name: picsart-gen-ai -Version: 2.68.1 +Version: 2.69.0 Release: 0 Summary: Picsart AI CLI for generating images, video and audio # Legal-Review-Notice: the CLI itself is MIT. The published cli.js is a bundle ++++++ gen-ai-2.68.1.tgz -> gen-ai-2.69.0.tgz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/package/cli.js new/package/cli.js --- old/package/cli.js 1985-10-26 09:15:00.000000000 +0100 +++ new/package/cli.js 1985-10-26 09:15:00.000000000 +0100 @@ -373,7 +373,7 @@ `);}return r.out.result(t.text),true}function _J(t,e,r){if(nMe(t,e,r))return;if(e.jsonMode){r.out.json({url:t.url,model:t.model.id,results:t.results,durationMs:t.durationMs});return}if(e.quietMode){t.url&&r.out.result(t.url);return}let i=FJ(t.durationMs),n=[["Model",t.model.name]];i&&n.push(["Time",i]);let o=t.results??[];o.length>1&&n.push(["Results",`${o.length} items`]);let s=[];for(let A of o)A.url&&(s.push(r.color.link(A.url,A.url)),A.exploreImageId&&s.push(` ${r.color.dim(`id: ${A.exploreImageId}`)}`));let a=[...Te(n,{color:r.color}).split(` `),"",...s];process.stderr.write(`${ae(a,{color:r.color,title:"\u2713 Generation Complete",borderColor:"#64ED68",maxWidth:process.stdout.columns||120,plain:e.plainMode})} `),t.url&&r.out.success(`Result: ${t.url}`);}function TJ(t,e,r){if(e.jsonMode){r.out.json({error:t.error,model:t.model.id,durationMs:t.durationMs});return}r.out.error(`Generation failed: ${t.error??"unknown error"}`);}function xJ(t,e,r){if(e.jsonMode){r.out.json({status:"cancelled",model:t.model.id,durationMs:t.durationMs,...t.taskId?{taskId:t.taskId}:{}});return}r.out.info("Generation cancelled");}function MJ(t,e,r){if(e.jsonMode){r.out.json({error:t.error,taskId:t.taskId,model:t.model.id,durationMs:t.durationMs,status:"timeout"});return}r.out.warn(`Generation still running. Task id: ${t.taskId??"unknown"}`),t.error&&r.out.info(t.error),r.out.info("Tip: `gen-ai history` will show the latest entry once it finishes.");}ht();async function NJ(t,e,r){let i=as(e),n=new URL(t),s=(He.basename(n.pathname)||"output").replace(/[<>:"|?*\u0000-\u001f]/g,"_")||"output";Ie.mkdirSync(i,{recursive:true});let a=He.join(i,s);if(Ie.existsSync(a)){let l=He.extname(s),d=s.slice(0,s.length-l.length);for (let f=1;;f++){let g=He.join(i,`${d}-${f}${l}`);if(!Ie.existsSync(g)){a=g;break}}}r.out.info(`Downloading to ${a}...`);let A=await fetch(t,{signal:AbortSignal.timeout(12e4)});if(!A.ok)throw new Error(`Download failed: ${A.status}`);let u=await A.arrayBuffer();return Ie.writeFileSync(a,Buffer.from(u)),r.out.success(`Saved: ${a}`),a}function LJ(t,e){let r=t.split("?")[0].split(".").pop()?.toLowerCase();return r&&["mp4","webm","mp3","wav","png","jpg","jpeg","webp","gif"].includes(r)?r:e==="video"?"mp4":e==="audio"?"mp3":"png"}function UJ(t,e,r){let i=LJ(t,e),n=String(Date.now()).slice(-6);return `${(r||"generation").slice(0,40).replace(/[^a-zA-Z0-9]+/g,"-")}-${n}.${i}`}var oMe="Generate a short, descriptive filename for an AI-generated asset. Rules: 3-6 words, kebab-case, lowercase, English only, no file extension, no quotes, no markdown. Describe the visual/audio content, not the technical process. Example outputs: golden-hour-mountain-flight, neon-cyberpunk-city-rain, calm-ocean-wave s-sunset";function sMe(t){return t.replace(/[`"'*_#]/g,"").replace(/\s+/g,"-").toLowerCase().replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,60)}function OJ(t,e){let r={tool:"ai-playground",model:t.modelId||t.id,prompt:e.prompt||"",subType:t.inputType,service:t.provider};e.duration!=null&&(r.duration=String(e.duration));let i={};return e.aspectRatio&&(i.aspectRatio=e.aspectRatio),e.resolution&&(i.resolution=e.resolution),e.quality&&(i.quality=e.quality),e.imageUrls?.length&&(i.referenceImageUrls=e.imageUrls),e.videoUrl&&(i.referenceVideoUrl=e.videoUrl),e.audioUrl&&(i.referenceAudioUrl=e.audioUrl),Object.keys(i).length>0&&(r.textScript=JSON.stringify(i)),r}async function PJ(t,e,r,i,n,o){let s=LJ(t,e),a=String(Date.now()).slice(-6);if(!r)return UJ(t,e,r);try{let A=`Generate a kebab-case filename for this ${e} (${n}) made with ${i}: -"${r}"`,l=(await o({model:"gpt-4.1-mini",messages:[{role:"system",content:oMe},{role:"user",content:A}],max_tokens:32,temperature:.3}))?.choices?.[0]?.message?.content;if(!l)throw new Error("Empty response");let d=sMe(l);if(!d)throw new Error("Sanitized to empty");return `${d}-${a}.${s}`}catch{return UJ(t,e,r)}}var GJ=false,LI=false;function AMe(t){let e;try{e=new URL(t);}catch{return false}if(e.protocol!=="https:")return false;let r=e.hostname.replace(/^\[|\]$/g,"").toLowerCase();if(r==="localhost")return false;let i=isIP(r);return i===0?true:!YJ(r,i)}function YJ(t,e){return e===4?t==="0.0.0.0"||t.startsWith("0.")||t.startsWith("127.")||t.startsWith("10.")||t.startsWith("192.168.")||t.startsWith("169.254.")||/^172\.(1[6-9]|2\d|3[01])\./.test(t)||/^100\.(6[4-9]|[7-9]\d|1[01]\d|12[0-7])\./.test(t):t==="::1"||t.startsWith("fe80")||t.startsWith("fc")||t.startsWith("fd")||t.startsWith("::ffff:")}async function uMe(t){if(!AMe(t))return false;let e=new URL(t).hostname.replace(/^\[|\]$ /g,"").toLowerCase();if(isIP(e)!==0)return true;try{let r=await lookup(e,{all:!0});return !Array.isArray(r)||r.length===0?!1:r.every(i=>{let n=i.address.toLowerCase(),o=isIP(n);return o!==0&&!YJ(n,o)})}catch{return false}}function lMe(){if(GJ)return LI;try{execFileSync("ffmpeg",["-version"],{stdio:"ignore"}),LI=!0;}catch{LI=false;}return GJ=true,LI}async function HJ(t,e){if(!lMe()||!await uMe(t))return;let r=Ie.mkdtempSync(He.join(ji.tmpdir(),"gen-ai-preview-")),i=He.join(r,"frame.jpg");try{return execFileSync("ffmpeg",["-i",t,"-vframes","1","-q:v","2",i,"-y"],{stdio:"ignore",timeout:3e4}),Ie.existsSync(i)?await rn(i,e):void 0}catch{return}finally{try{Ie.rmSync(r,{recursive:!0,force:!0});}catch{}}}async function uD(t,e,r){if(!(t.status!=="completed"||!t.url))try{let i=t.model,n=t.params.prompt,o=await PJ(t.url,i.mode,n,i.name,i.inputType,e.runCompletion),s=OJ(i,t.params),a;i.mode==="video"&&(a=await HJ(t.url,{token:e.token,uid:e.uid,uploadUrl:e.uploadUrl})),r.out.info("Saving to P icsart Drive..."),await e.saveFn({url:t.url,name:o,resourceType:wc(i.mode),attributes:s,folderUid:e.folderUid,previewUrl:a}),r.out.success("Saved to Drive");}catch(i){r.out.error(`Drive save failed: ${i.message}`);}}CE();async function WJ(t,e,r){if(t.status!=="completed"||!t.url){if(e.bell&&vb(),e.notify){let i=t.status==="cancelled"?"Generation cancelled":t.status==="timeout"?`Generation still running. Task id: ${t.taskId??"unknown"}`:`Generation failed: ${t.error??"unknown"}`;Qb("gen-ai",i);}return}if(e.imagePreview!==false&&t.model.mode==="image"&&nu())try{await Lj(t.url,"result");}catch{}e.clipboard&&xj(t.url)&&r.out.info("URL copied to clipboard"),e.open&&CA(t.url),e.bell&&vb(),e.notify&&Qb("gen-ai",`${t.model.name} generation complete`);}async function jJ(t,e,r,i){let n={jsonMode:e.jsonMode,quietMode:e.quietMode,plainMode:e.plainMode};t.status==="completed"?_J(t,n,r):t.status==="cancelled"?xJ(t,n,r):t.status==="timeout"?MJ(t,n,r):TJ(t,n,r);let o=t.text!=null;if(!o&&t.status=== "completed"&&e.download){let u=t.results&&t.results.length>0?t.results.map(l=>l.url):t.url?[t.url]:[];for(let l of u)try{await NJ(l,e.download,r);}catch(d){r.out.error(`Download failed: ${d.message}`);}}if(!o&&t.status==="completed"&&e.driveSave&&i)if(t.results&&t.results.length>1)for(let u of t.results){let l={...t,url:u.url,results:[u]};await uD(l,i,r);}else await uD(t,i,r);let s=t.results&&t.results.length>0?t.results.map(u=>u.url):t.url?[t.url]:[],a=t.params,A={timestamp:new Date().toISOString(),model:t.model.id,modelName:t.model.name,prompt:a.prompt,params:t.params,imageUrls:a.imageUrls,videoUrl:a.videoUrl,audioUrl:a.audioUrl,videoUrls:a.videoUrls,audioUrls:a.audioUrls,startFrame:a.startFrame,endFrame:a.endFrame,staticMask:a.staticMask,sceneImage:a.sceneImage,styleImage:a.styleImage,resultUrl:s[0],rawResultUrl:s[0],resultUrls:s.length>1?s:void 0,durationMs:t.durationMs,status:t.status==="completed"?"completed":t.status==="timeout"?"timeout":t.status==="cancelled"?"cancelled":"f ailed",error:t.error};try{Gj(A);}catch{}await WJ(t,e,r);}ht();Xt();async function JJ(t){try{let e=t.driveFolder?await yI(t.driveFolder):await EI();return {token:t.token,uid:t.uid,folderUid:e,uploadUrl:t.uploadUrl,runCompletion:async r=>await(await Ye()).runWorkflow("CHAT_COMPLETIONS",r,{mode:"sync"}),saveFn:r=>CI({url:r.url,name:r.name,resourceType:r.resourceType,attributes:r.attributes,folderUid:r.folderUid,previewUrl:r.previewUrl})}}catch(e){let r=e instanceof Error?e.message:String(e);be().warn(`Drive save unavailable (${r}) \u2014 result will not be saved to Drive`);return}}ht();function $J(t,e,r){let i=t.clipboard||(e.autoClipboard??false),n=t.bell||(e.autoBell??false),o=t.notify||(e.autoNotify??false),s=t.open!=null?t.open:e.autoOpen??false,a;return t["no-download"]?a=void 0:t.download?a=as(t.download):e.downloadDir?a=as(e.downloadDir):a="./output",{download:a,driveSave:t["save-to-drive"]??true,driveFolder:t["drive-folder"]??"gen-ai-cli",open:s,clipboard:i,bell:n,notify:o,imag ePreview:e.imagePreview??true,jsonMode:r.json,quietMode:r.quiet,plainMode:r.plain}}CE();var cMe="https://picsart.com/pricing",dMe=["page_origin","action_button"],zJ={page_origin:"gen_ai_cli",action_button:"gen_ai_cli_credits_wall"};function KJ(t){let e=new URLSearchParams({checkout:"credit"});for(let r of dMe){let i=t[r];i&&e.set(r,i);}return `${cMe}?${e.toString()}`}function ZJ(t){return !!(t instanceof Sc||t instanceof Rs&&t.statusCode===402||t instanceof Error&&/402|not enough.*credit|insufficient.*credit/i.test(t.message))}async function XJ(t,e){let r=t instanceof Error?t.message:"not enough credits";if(e.out.error(`Insufficient credits: ${r}`),e.flags.noInput)return true;let i=await xe({message:"What would you like to do?",choices:[{name:"Open browser to add credits",value:"buy"},{name:"Exit",value:"exit"}],cancelOnly:true});return i===j||i===X||i==="exit"||i==="buy"&&(CA(KJ(zJ)),e.out.info("Opening checkout in browser...")),true}async function fMe(t,e){try{let i=(await Ye()). getCredits,n=await i(t,e);return typeof n=="number"?n:null}catch{return null}}async function e3(t,e){let r=await fMe(t,e);if(r!=null)return {value:r,exact:true};let i=pMe(t,e);return i==null?null:{value:i,exact:false}}function gMe(t,e){if(!t)return null;let r=t.max;t.unit==="second"&&e.duration&&e.duration>0&&(r*=e.duration);let i=e.count&&e.count>0?e.count:1;return Math.ceil(r*i)}function pMe(t,e){let r={};typeof e.resolution=="string"&&(r.resolution=e.resolution),typeof e.generateAudio=="boolean"&&(r.generateAudio=e.generateAudio);let i=Or(t).getCreditsInfo(Object.keys(r).length?r:void 0),n=typeof e.duration=="number"?e.duration:void 0,o=typeof e.count=="number"?e.count:void 0;return gMe(i,{duration:n,count:o})}async function t3(t,e,r,i){await xs(),await Pr.pricing.load();let n=await e3(t.id,e);if(!n){i.warn(`Could not determine cost for ${t.name}; --max-cost not enforced for this run.`);return}if(n.value>r){let o=n.exact?`Cost ${n.value}`:`Estimated cost ~${n.value}`;throw new R( `${o} credits exceeds --max-cost ${r} for ${t.name}. Raise --max-cost or adjust params (resolution/duration/count) to proceed.`)}}async function r3(t,e,r,i){await xs(),await Pr.pricing.load();let o=(await Promise.all(t.map(a=>e3(a.id,e)))).filter(a=>a!=null);if(o.length===0){i.warn("Could not determine cost for any of the models; --max-cost not enforced for this run.");return}let s=o.reduce((a,A)=>a+A.value,0);if(s>r){let a=o.every(A=>A.exact)?`Total cost ${s}`:`Estimated total cost ~${s}`;throw new R(`${a} credits across ${t.length} models exceeds --max-cost ${r}. Raise --max-cost or compare fewer models.`)}}function i3(t){let e=Math.floor(t/1e3);if(e<60)return `${e}s`;let r=Math.floor(e/60),i=e%60;if(r<60)return `${r}m ${i}s`;let n=Math.floor(r/60),o=r%60;return `${n}h ${String(o).padStart(2,"0")}m`}function mMe(t,e=30,r){let i=Math.round(t/100*e),n=e-i,o=cu.green("\u2588".repeat(i))+cu.dim("\u2591".repeat(n)),s=r!=null?` ${cu.dim(`(${i3(r)})`)}`:"";return `${o} ${t.toFixed(0)}%${ s}`}function n3(t){let e=t;return r=>{if(r.percent!=null)e.text=mMe(r.percent,30,r.elapsed);else {let i=i3(r.elapsed);e.text=`${r.status}... ${cu.dim(`(${i})`)}`;}}}kE();function s3(t){RE.event({event:"cli_generation_started",data:{flow_id:t.flow.id,model_id:t.inputs.model.id,model_name:t.inputs.model.name,model_vendor:t.inputs.model.provider,params:a3(t.inputs.params),files:A3(t.inputs.files)}});}function PI(t){let{result:e,error:r,inputs:i}=t,n=e?.status??t.status??"failed";RE.event({event:"cli_generation_completed",data:{flow_id:t.flow.id,model_id:i?.model.id,model_name:i?.model.name,model_vendor:i?.model.provider,status:n,duration_ms:e?.durationMs,task_id:e?.taskId,result_count:e?.results.length,error_name:r===void 0?void 0:r instanceof Error?r.constructor.name:"Unknown",error_message:r===void 0?void 0:r instanceof Error?r.message:String(r),params:i?a3(i.params):void 0,files:i?A3(i.files):void 0}});}function a3(t){let e=process.env.PULSE_REDACT_PROMPTS==="1",r={};for(let[i,n]of Object.entries(t)){if(i==="prompt"&&e){r[i]="[redacted]";continue}if(typeof n=="string"&&hMe(n)){r[i]=`[file:${He.extname(n).slice(1)||"unknown"}]`;continue}r[i]=n;}return r}function A3(t){let e={};return t.images?.length&&(e.images_count=t.images.length),t.startFrame&&(e.has_start_frame=true),t.endFrame&&(e.has_end_frame=true),t.video&&(e.has_video=true),t.audio&&(e.has_audio=true),t.videos?.length&&(e.videos_count=t.videos.length),t.audios?.length&&(e.audios_count=t.audios.length),e}function hMe(t){return t.startsWith("http://")||t.startsWith("https://")?false:!!(t.startsWith("/")||t.startsWith("./")||t.startsWith("../")||t.startsWith("~")||/^[a-zA-Z]:[\\/]/.test(t))}Xt();function EMe(t){let e=sn(t);if(e==="image")return {imageUrls:[t]};if(e==="video")return {videoUrl:t};if(e==="audio")return {audioUrl:t};throw new Error(`Unsupported file type: ${t}`)}function yMe(t){let e=[...new Set(t.map(sn))];if(e.includes(null))throw new Error("Unsupported file type in directory input");let r =e;if(r.length!==1)throw new Error("Multi mode requires files of a single media type");let i=r[0];if(i==="image")return t.flatMap(n=>["--image",n]);if(t.length!==1)throw new Error(`Multi mode supports exactly one ${i} file. Use --batch instead.`);return i==="video"?["--video",t[0]]:["--audio",t[0]]}function IMe(t){let e=[];for(let r=0;r<t.length;r++){let i=t[r];if(i==="--download"&&r+1<t.length){e.push("--output",t[++r]);continue}i==="--no-download"&&e.push("--no-download");}return e}async function c3(t,e){let r=be(),i=bI(t.type),n=Gs(He.resolve(t.inputDir),i,0);if(n.length===0)throw new R(`No matching files found in: ${t.inputDir}`);if(n.length>t.maxFiles)throw new R(`Found ${n.length} files, exceeds --max-files (${t.maxFiles}). Use --max-files to increase.`);r.info(`Found ${n.length} file(s) in ${t.inputDir}`);let o;if(t.multi)o="multi";else if(t.batch)o="batch";else if(Ao()&&!t.silent){let u=await xe({message:"Input directory mode",choices:[{name:"Multi-image \u2014 send all file s as inputs to one generation",value:"multi"},{name:"Batch \u2014 one generation per file",value:"batch"}]});if(u===j||u===X)return {kind:"cancelled"};o=u;}else throw new R("--input-dir requires --multi or --batch in non-interactive mode");if(o==="multi"){if(n.length>14)throw new R(`Multi mode supports max 14 files, got ${n.length}. Use --batch instead.`);let u=["--model",e.id,...yMe(n),...t.extraArgs];return t.prompt&&u.push("--prompt",t.prompt),t.dryRun&&u.push("--dry-run"),t.silent&&u.push("--silent"),{kind:"multi-generate",generateArgs:u}}let s={defaults:{...t.prompt?{prompt:t.prompt}:{}},jobs:n.map(u=>({id:He.basename(u,He.extname(u)),model:e.id,...EMe(u)}))};kW(s.jobs);let a=He.join(ji.tmpdir(),`gen-ai-batch-${Date.now()}.json`);Ie.writeFileSync(a,JSON.stringify(s,null,2));let A=[a,"--concurrency",String(t.concurrency),...IMe(t.extraArgs)];return t.dryRun&&A.push("--dry-run"),{kind:"run-batch",batchArgs:A,tmpFile:a}}var CMe=new Set(["input-dir","multi","batch","type","max-file s","concurrency","model","prompt","dry-run","silent","image","video","audio"]);async function g3(t,e,r){let i=e["input-dir"];if(typeof i!="string"||i.length===0)return;let n=typeof e.model=="string"?e.model:void 0;if(!n)throw new R("--input-dir requires --model (-m) to know which model to dispatch.");let o=xI(n,t);if(!o)throw new R(`Model "${n}" is not in the ${t.id} flow's catalog.`);let s=BMe(e),a=await c3({inputDir:i,prompt:typeof e.prompt=="string"?e.prompt:void 0,multi:e.multi===true,batch:e.batch===true,type:e.type,maxFiles:typeof e["max-files"]=="number"?e["max-files"]:30,concurrency:typeof e.concurrency=="number"?e.concurrency:3,dryRun:e["dry-run"]===true,silent:r.flags.noInput,extraArgs:s},o);if(a.kind!=="cancelled"){if(a.kind==="multi-generate"){await run([t.id,...a.generateArgs]);return}try{await run(["batch:run",...a.batchArgs]);}finally{try{Ie.unlinkSync(a.tmpFile);}catch{}}}}function BMe(t){let e=[];for(let[r,i]of Object.entries(t))if(!CMe.has(r)&&!(i==null||i===false) ){if(i===true){e.push(`--${r}`);continue}if(Array.isArray(i)){for(let n of i)e.push(`--${r}`,String(n));continue}e.push(`--${r}`,String(i));}return e}async function QMe(t,e,r){if(typeof e["input-dir"]=="string"&&e["input-dir"].length>0){await g3(t,e,r);return}let i=$J(e,Et(),{json:r.flags.json||e.output==="json",quiet:r.flags.quiet,plain:r.flags.plain}),n,o,s,a=false;try{let A=await vJ(t,e,r);if(!A)return;n=A,typeof e["max-cost"]=="number"&&await t3(A.model,A.params,e["max-cost"],r.out);let{authenticatedFetch:u,creds:l}=await Bi(),d=u,f=_t(),g=ss(),h;i.driveSave&&(h=await JJ({token:l.token,uid:l.uid,uploadUrl:g,driveFolder:i.driveFolder}));let m=oJ(`${A.model.name}...`,r.flags.quiet);o=m;let E=new AbortController,y=()=>{E.abort(),m.fail("Cancelled"),process.removeListener("SIGINT",y),process.once("SIGINT",()=>process.exit(130)),(async()=>{try{PI({flow:t,flags:e,inputs:A,status:"cancelled",error:new Error("User cancelled (SIGINT)")}),await FE();}finally{process.exit(130);}})().catch( ()=>{});};s=y,process.on("SIGINT",y),m.start();let B=e["poll-timeout"],Q=typeof B=="string"?kJ(B):void 0;s3({flow:t,flags:e,inputs:A});let b=await RJ(A,{apiUrl:f,uploadUrl:g,authenticatedFetch:d},{signal:E.signal,onProgress:n3(m),pollTimeoutMs:Q});if(PI({flow:t,flags:e,inputs:A,result:b}),a=!0,b.status==="completed"){let T=Math.floor(b.durationMs/1e3);m.succeed(`${A.model.name} \xB7 ${T}s`);}else b.status==="cancelled"?m.fail("Cancelled"):b.status==="timeout"?m.warn("Still running on server"):m.fail("Failed");process.removeListener("SIGINT",y);let w=RW(r,{authenticatedFetch:d,uploadUrl:g});await jJ(b,i,w,h);}catch(A){if(s&&process.removeListener("SIGINT",s),o?.stop(),a||PI({flow:t,inputs:n,status:"failed",error:A}),ZJ(A)){process.exitCode=ue.CREDITS_ERROR,await XJ(A,r);return}throw A}}function $(t){class e extends F{static summary=t.description;static examples=t.examples?[...t.examples]:[];static flags=JS(t,on(),P.list());async run(){let{flags:i}=await this.parse(this.constructor);a wait QMe(t,i,this.deps);}}return e}var Kt=$(J.generate);function lD(t){let e=Math.floor(t/1e3);if(e<60)return `${e}s`;let r=Math.floor(e/60),i=e%60;if(r<60)return `${r}m ${i}s`;let n=Math.floor(r/60),o=r%60;return `${n}h ${String(o).padStart(2,"0")}m`}function GI(t,e){let r=t.status==="completed"?e.green("completed"):t.status==="cancelled"?e.dim("cancelled"):e.red(t.status==="timeout"?"timeout":"failed"),i=[];return t.id&&i.push(["Id",t.id]),i.push(["Model",`${t.modelName??t.model} (${t.model})`],["Prompt",t.prompt??"(none)"],["Status",r]),t.resultUrl&&i.push(["Result",t.resultUrl]),t.resultUrls&&t.resultUrls.length>1&&i.push(["Results",`${t.resultUrls.length} items`]),t.durationMs&&i.push(["Duration",lD(t.durationMs)]),i.push(["Time",t.timestamp]),t.error&&i.push(["Error",t.error]),Object.keys(t.params).length>0&&i.push(["Params",JSON.stringify(t.params)]),Te(i,{color:e}).split(` +"${r}"`,l=(await o({model:"gpt-4.1-mini",messages:[{role:"system",content:oMe},{role:"user",content:A}],max_tokens:32,temperature:.3}))?.choices?.[0]?.message?.content;if(!l)throw new Error("Empty response");let d=sMe(l);if(!d)throw new Error("Sanitized to empty");return `${d}-${a}.${s}`}catch{return UJ(t,e,r)}}var GJ=false,LI=false;function AMe(t){let e;try{e=new URL(t);}catch{return false}if(e.protocol!=="https:")return false;let r=e.hostname.replace(/^\[|\]$/g,"").toLowerCase();if(r==="localhost")return false;let i=isIP(r);return i===0?true:!YJ(r,i)}function YJ(t,e){return e===4?t==="0.0.0.0"||t.startsWith("0.")||t.startsWith("127.")||t.startsWith("10.")||t.startsWith("192.168.")||t.startsWith("169.254.")||/^172\.(1[6-9]|2\d|3[01])\./.test(t)||/^100\.(6[4-9]|[7-9]\d|1[01]\d|12[0-7])\./.test(t):t==="::1"||t.startsWith("fe80")||t.startsWith("fc")||t.startsWith("fd")||t.startsWith("::ffff:")}async function uMe(t){if(!AMe(t))return false;let e=new URL(t).hostname.replace(/^\[|\]$ /g,"").toLowerCase();if(isIP(e)!==0)return true;try{let r=await lookup(e,{all:!0});return !Array.isArray(r)||r.length===0?!1:r.every(i=>{let n=i.address.toLowerCase(),o=isIP(n);return o!==0&&!YJ(n,o)})}catch{return false}}function lMe(){if(GJ)return LI;try{execFileSync("ffmpeg",["-version"],{stdio:"ignore"}),LI=!0;}catch{LI=false;}return GJ=true,LI}async function HJ(t,e){if(!lMe()||!await uMe(t))return;let r=Ie.mkdtempSync(He.join(ji.tmpdir(),"gen-ai-preview-")),i=He.join(r,"frame.jpg");try{return execFileSync("ffmpeg",["-i",t,"-vframes","1","-q:v","2",i,"-y"],{stdio:"ignore",timeout:3e4}),Ie.existsSync(i)?await rn(i,e):void 0}catch{return}finally{try{Ie.rmSync(r,{recursive:!0,force:!0});}catch{}}}async function uD(t,e,r){if(!(t.status!=="completed"||!t.url))try{let i=t.model,n=t.params.prompt,o=await PJ(t.url,i.mode,n,i.name,i.inputType,e.runCompletion),s=OJ(i,t.params),a;i.mode==="video"&&(a=await HJ(t.url,{token:e.token,uid:e.uid,uploadUrl:e.uploadUrl})),r.out.info("Saving to P icsart Drive..."),await e.saveFn({url:t.url,name:o,resourceType:wc(i.mode),attributes:s,folderUid:e.folderUid,previewUrl:a}),r.out.success("Saved to Drive");}catch(i){r.out.error(`Drive save failed: ${i.message}`);}}CE();async function WJ(t,e,r){if(t.status!=="completed"||!t.url){if(e.bell&&vb(),e.notify){let i=t.status==="cancelled"?"Generation cancelled":t.status==="timeout"?`Generation still running. Task id: ${t.taskId??"unknown"}`:`Generation failed: ${t.error??"unknown"}`;Qb("gen-ai",i);}return}if(e.imagePreview!==false&&t.model.mode==="image"&&nu())try{await Lj(t.url,"result");}catch{}e.clipboard&&xj(t.url)&&r.out.info("URL copied to clipboard"),e.open&&CA(t.url),e.bell&&vb(),e.notify&&Qb("gen-ai",`${t.model.name} generation complete`);}async function jJ(t,e,r,i){let n={jsonMode:e.jsonMode,quietMode:e.quietMode,plainMode:e.plainMode};t.status==="completed"?_J(t,n,r):t.status==="cancelled"?xJ(t,n,r):t.status==="timeout"?MJ(t,n,r):TJ(t,n,r);let o=t.text!=null;if(!o&&t.status=== "completed"&&e.download){let u=t.results&&t.results.length>0?t.results.map(l=>l.url):t.url?[t.url]:[];for(let l of u)try{await NJ(l,e.download,r);}catch(d){r.out.error(`Download failed: ${d.message}`);}}if(!o&&t.status==="completed"&&e.driveSave&&i)if(t.results&&t.results.length>1)for(let u of t.results){let l={...t,url:u.url,results:[u]};await uD(l,i,r);}else await uD(t,i,r);let s=t.results&&t.results.length>0?t.results.map(u=>u.url):t.url?[t.url]:[],a=t.params,A={timestamp:new Date().toISOString(),model:t.model.id,modelName:t.model.name,prompt:a.prompt,params:t.params,imageUrls:a.imageUrls,videoUrl:a.videoUrl,audioUrl:a.audioUrl,videoUrls:a.videoUrls,audioUrls:a.audioUrls,startFrame:a.startFrame,endFrame:a.endFrame,staticMask:a.staticMask,sceneImage:a.sceneImage,styleImage:a.styleImage,resultUrl:s[0],rawResultUrl:s[0],resultUrls:s.length>1?s:void 0,durationMs:t.durationMs,status:t.status==="completed"?"completed":t.status==="timeout"?"timeout":t.status==="cancelled"?"cancelled":"f ailed",error:t.error};try{Gj(A);}catch{}await WJ(t,e,r);}ht();Xt();async function JJ(t){try{let e=t.driveFolder?await yI(t.driveFolder):await EI();return {token:t.token,uid:t.uid,folderUid:e,uploadUrl:t.uploadUrl,runCompletion:async r=>await(await Ye()).runWorkflow("CHAT_COMPLETIONS",r,{mode:"sync"}),saveFn:r=>CI({url:r.url,name:r.name,resourceType:r.resourceType,attributes:r.attributes,folderUid:r.folderUid,previewUrl:r.previewUrl})}}catch(e){let r=e instanceof Error?e.message:String(e);be().warn(`Drive save unavailable (${r}) \u2014 result will not be saved to Drive`);return}}ht();function $J(t,e,r){let i=t.clipboard||(e.autoClipboard??false),n=t.bell||(e.autoBell??false),o=t.notify||(e.autoNotify??false),s=t.open!=null?t.open:e.autoOpen??false,a;return t["no-download"]?a=void 0:t.download?a=as(t.download):e.downloadDir?a=as(e.downloadDir):a="./output",{download:a,driveSave:t["save-to-drive"]??true,driveFolder:t["drive-folder"]??"gen-ai-cli",open:s,clipboard:i,bell:n,notify:o,imag ePreview:e.imagePreview??true,jsonMode:r.json,quietMode:r.quiet,plainMode:r.plain}}CE();var cMe="https://picsart.com/pricing",dMe=["page_origin","action_button"],zJ={page_origin:"gen_ai_cli",action_button:"gen_ai_cli_credits_wall"};function KJ(t){let e=new URLSearchParams({checkout:"credit"});for(let r of dMe){let i=t[r];i&&e.set(r,i);}return `${cMe}?${e.toString()}`}function ZJ(t){return !!(t instanceof Sc||t instanceof Rs&&t.statusCode===402||t instanceof Error&&/402|not enough.*credit|insufficient.*credit/i.test(t.message))}async function XJ(t,e){let r=t instanceof Error?t.message:"not enough credits";if(e.out.error(`Insufficient credits: ${r}`),e.flags.noInput)return true;let i=await xe({message:"What would you like to do?",choices:[{name:"Open browser to add credits",value:"buy"},{name:"Exit",value:"exit"}],cancelOnly:true});return i===j||i===X||i==="exit"||i==="buy"&&(CA(KJ(zJ)),e.out.info("Opening checkout in browser...")),true}async function fMe(t,e){try{let i=(await Ye()). getCredits,n=await i(t,e);return typeof n=="number"?n:null}catch{return null}}async function e3(t,e){let r=await fMe(t,e);if(r!=null)return {value:r,exact:true};let i=pMe(t,e);return i==null?null:{value:i,exact:false}}function gMe(t,e){if(!t)return null;let r=t.max;t.unit==="second"&&e.duration&&e.duration>0&&(r*=e.duration);let i=e.count&&e.count>0?e.count:1;return Math.ceil(r*i)}function pMe(t,e){let r={};typeof e.resolution=="string"&&(r.resolution=e.resolution),typeof e.generateAudio=="boolean"&&(r.generateAudio=e.generateAudio);let i=Or(t).getCreditsInfo(Object.keys(r).length?r:void 0),n=typeof e.duration=="number"?e.duration:void 0,o=typeof e.count=="number"?e.count:void 0;return gMe(i,{duration:n,count:o})}async function t3(t,e,r,i){await xs(),await Pr.pricing.load();let n=await e3(t.id,e);if(!n){i.warn(`Could not determine cost for ${t.name}; --max-cost not enforced for this run.`);return}if(n.value>r){let o=n.exact?`Cost ${n.value}`:`Estimated cost ~${n.value}`;throw new R( `${o} credits exceeds --max-cost ${r} for ${t.name}. Raise --max-cost or adjust params (resolution/duration/count) to proceed.`)}}async function r3(t,e,r,i){await xs(),await Pr.pricing.load();let o=(await Promise.all(t.map(a=>e3(a.id,e)))).filter(a=>a!=null);if(o.length===0){i.warn("Could not determine cost for any of the models; --max-cost not enforced for this run.");return}let s=o.reduce((a,A)=>a+A.value,0);if(s>r){let a=o.every(A=>A.exact)?`Total cost ${s}`:`Estimated total cost ~${s}`;throw new R(`${a} credits across ${t.length} models exceeds --max-cost ${r}. Raise --max-cost or compare fewer models.`)}}function i3(t){let e=Math.floor(t/1e3);if(e<60)return `${e}s`;let r=Math.floor(e/60),i=e%60;if(r<60)return `${r}m ${i}s`;let n=Math.floor(r/60),o=r%60;return `${n}h ${String(o).padStart(2,"0")}m`}function mMe(t,e=30,r){let i=Math.round(t/100*e),n=e-i,o=cu.green("\u2588".repeat(i))+cu.dim("\u2591".repeat(n)),s=r!=null?` ${cu.dim(`(${i3(r)})`)}`:"";return `${o} ${t.toFixed(0)}%${ s}`}function n3(t){let e=t;return r=>{if(r.percent!=null)e.text=mMe(r.percent,30,r.elapsed);else {let i=i3(r.elapsed);e.text=`${r.status}... ${cu.dim(`(${i})`)}`;}}}kE();function s3(t){RE.event({event_type:"cli_generation_started",data:{flow_id:t.flow.id,model_id:t.inputs.model.id,model_name:t.inputs.model.name,model_vendor:t.inputs.model.provider,params:a3(t.inputs.params),files:A3(t.inputs.files)}});}function PI(t){let{result:e,error:r,inputs:i}=t,n=e?.status??t.status??"failed";RE.event({event_type:"cli_generation_completed",data:{flow_id:t.flow.id,model_id:i?.model.id,model_name:i?.model.name,model_vendor:i?.model.provider,status:n,duration_ms:e?.durationMs,task_id:e?.taskId,result_count:e?.results.length,error_name:r===void 0?void 0:r instanceof Error?r.constructor.name:"Unknown",error_message:r===void 0?void 0:r instanceof Error?r.message:String(r),params:i?a3(i.params):void 0,files:i?A3(i.files):void 0}});}function a3(t){let e=process.env.PULSE_REDACT_PROMPTS==="1",r={};for(l et[i,n]of Object.entries(t)){if(i==="prompt"&&e){r[i]="[redacted]";continue}if(typeof n=="string"&&hMe(n)){r[i]=`[file:${He.extname(n).slice(1)||"unknown"}]`;continue}r[i]=n;}return r}function A3(t){let e={};return t.images?.length&&(e.images_count=t.images.length),t.startFrame&&(e.has_start_frame=true),t.endFrame&&(e.has_end_frame=true),t.video&&(e.has_video=true),t.audio&&(e.has_audio=true),t.videos?.length&&(e.videos_count=t.videos.length),t.audios?.length&&(e.audios_count=t.audios.length),e}function hMe(t){return t.startsWith("http://")||t.startsWith("https://")?false:!!(t.startsWith("/")||t.startsWith("./")||t.startsWith("../")||t.startsWith("~")||/^[a-zA-Z]:[\\/]/.test(t))}Xt();function EMe(t){let e=sn(t);if(e==="image")return {imageUrls:[t]};if(e==="video")return {videoUrl:t};if(e==="audio")return {audioUrl:t};throw new Error(`Unsupported file type: ${t}`)}function yMe(t){let e=[...new Set(t.map(sn))];if(e.includes(null))throw new Error("Unsupported file type in directory inp ut");let r=e;if(r.length!==1)throw new Error("Multi mode requires files of a single media type");let i=r[0];if(i==="image")return t.flatMap(n=>["--image",n]);if(t.length!==1)throw new Error(`Multi mode supports exactly one ${i} file. Use --batch instead.`);return i==="video"?["--video",t[0]]:["--audio",t[0]]}function IMe(t){let e=[];for(let r=0;r<t.length;r++){let i=t[r];if(i==="--download"&&r+1<t.length){e.push("--output",t[++r]);continue}i==="--no-download"&&e.push("--no-download");}return e}async function c3(t,e){let r=be(),i=bI(t.type),n=Gs(He.resolve(t.inputDir),i,0);if(n.length===0)throw new R(`No matching files found in: ${t.inputDir}`);if(n.length>t.maxFiles)throw new R(`Found ${n.length} files, exceeds --max-files (${t.maxFiles}). Use --max-files to increase.`);r.info(`Found ${n.length} file(s) in ${t.inputDir}`);let o;if(t.multi)o="multi";else if(t.batch)o="batch";else if(Ao()&&!t.silent){let u=await xe({message:"Input directory mode",choices:[{name:"Multi-image \u2014 sen d all files as inputs to one generation",value:"multi"},{name:"Batch \u2014 one generation per file",value:"batch"}]});if(u===j||u===X)return {kind:"cancelled"};o=u;}else throw new R("--input-dir requires --multi or --batch in non-interactive mode");if(o==="multi"){if(n.length>14)throw new R(`Multi mode supports max 14 files, got ${n.length}. Use --batch instead.`);let u=["--model",e.id,...yMe(n),...t.extraArgs];return t.prompt&&u.push("--prompt",t.prompt),t.dryRun&&u.push("--dry-run"),t.silent&&u.push("--silent"),{kind:"multi-generate",generateArgs:u}}let s={defaults:{...t.prompt?{prompt:t.prompt}:{}},jobs:n.map(u=>({id:He.basename(u,He.extname(u)),model:e.id,...EMe(u)}))};kW(s.jobs);let a=He.join(ji.tmpdir(),`gen-ai-batch-${Date.now()}.json`);Ie.writeFileSync(a,JSON.stringify(s,null,2));let A=[a,"--concurrency",String(t.concurrency),...IMe(t.extraArgs)];return t.dryRun&&A.push("--dry-run"),{kind:"run-batch",batchArgs:A,tmpFile:a}}var CMe=new Set(["input-dir","multi","batch","type" ,"max-files","concurrency","model","prompt","dry-run","silent","image","video","audio"]);async function g3(t,e,r){let i=e["input-dir"];if(typeof i!="string"||i.length===0)return;let n=typeof e.model=="string"?e.model:void 0;if(!n)throw new R("--input-dir requires --model (-m) to know which model to dispatch.");let o=xI(n,t);if(!o)throw new R(`Model "${n}" is not in the ${t.id} flow's catalog.`);let s=BMe(e),a=await c3({inputDir:i,prompt:typeof e.prompt=="string"?e.prompt:void 0,multi:e.multi===true,batch:e.batch===true,type:e.type,maxFiles:typeof e["max-files"]=="number"?e["max-files"]:30,concurrency:typeof e.concurrency=="number"?e.concurrency:3,dryRun:e["dry-run"]===true,silent:r.flags.noInput,extraArgs:s},o);if(a.kind!=="cancelled"){if(a.kind==="multi-generate"){await run([t.id,...a.generateArgs]);return}try{await run(["batch:run",...a.batchArgs]);}finally{try{Ie.unlinkSync(a.tmpFile);}catch{}}}}function BMe(t){let e=[];for(let[r,i]of Object.entries(t))if(!CMe.has(r)&&!(i==null|| i===false)){if(i===true){e.push(`--${r}`);continue}if(Array.isArray(i)){for(let n of i)e.push(`--${r}`,String(n));continue}e.push(`--${r}`,String(i));}return e}async function QMe(t,e,r){if(typeof e["input-dir"]=="string"&&e["input-dir"].length>0){await g3(t,e,r);return}let i=$J(e,Et(),{json:r.flags.json||e.output==="json",quiet:r.flags.quiet,plain:r.flags.plain}),n,o,s,a=false;try{let A=await vJ(t,e,r);if(!A)return;n=A,typeof e["max-cost"]=="number"&&await t3(A.model,A.params,e["max-cost"],r.out);let{authenticatedFetch:u,creds:l}=await Bi(),d=u,f=_t(),g=ss(),h;i.driveSave&&(h=await JJ({token:l.token,uid:l.uid,uploadUrl:g,driveFolder:i.driveFolder}));let m=oJ(`${A.model.name}...`,r.flags.quiet);o=m;let E=new AbortController,y=()=>{E.abort(),m.fail("Cancelled"),process.removeListener("SIGINT",y),process.once("SIGINT",()=>process.exit(130)),(async()=>{try{PI({flow:t,flags:e,inputs:A,status:"cancelled",error:new Error("User cancelled (SIGINT)")}),await FE();}finally{process.exit(130);}} )().catch(()=>{});};s=y,process.on("SIGINT",y),m.start();let B=e["poll-timeout"],Q=typeof B=="string"?kJ(B):void 0;s3({flow:t,flags:e,inputs:A});let b=await RJ(A,{apiUrl:f,uploadUrl:g,authenticatedFetch:d},{signal:E.signal,onProgress:n3(m),pollTimeoutMs:Q});if(PI({flow:t,flags:e,inputs:A,result:b}),a=!0,b.status==="completed"){let T=Math.floor(b.durationMs/1e3);m.succeed(`${A.model.name} \xB7 ${T}s`);}else b.status==="cancelled"?m.fail("Cancelled"):b.status==="timeout"?m.warn("Still running on server"):m.fail("Failed");process.removeListener("SIGINT",y);let w=RW(r,{authenticatedFetch:d,uploadUrl:g});await jJ(b,i,w,h);}catch(A){if(s&&process.removeListener("SIGINT",s),o?.stop(),a||PI({flow:t,inputs:n,status:"failed",error:A}),ZJ(A)){process.exitCode=ue.CREDITS_ERROR,await XJ(A,r);return}throw A}}function $(t){class e extends F{static summary=t.description;static examples=t.examples?[...t.examples]:[];static flags=JS(t,on(),P.list());async run(){let{flags:i}=await this.parse(this.cons tructor);await QMe(t,i,this.deps);}}return e}var Kt=$(J.generate);function lD(t){let e=Math.floor(t/1e3);if(e<60)return `${e}s`;let r=Math.floor(e/60),i=e%60;if(r<60)return `${r}m ${i}s`;let n=Math.floor(r/60),o=r%60;return `${n}h ${String(o).padStart(2,"0")}m`}function GI(t,e){let r=t.status==="completed"?e.green("completed"):t.status==="cancelled"?e.dim("cancelled"):e.red(t.status==="timeout"?"timeout":"failed"),i=[];return t.id&&i.push(["Id",t.id]),i.push(["Model",`${t.modelName??t.model} (${t.model})`],["Prompt",t.prompt??"(none)"],["Status",r]),t.resultUrl&&i.push(["Result",t.resultUrl]),t.resultUrls&&t.resultUrls.length>1&&i.push(["Results",`${t.resultUrls.length} items`]),t.durationMs&&i.push(["Duration",lD(t.durationMs)]),i.push(["Time",t.timestamp]),t.error&&i.push(["Error",t.error]),Object.keys(t.params).length>0&&i.push(["Params",JSON.stringify(t.params)]),Te(i,{color:e}).split(` `)}var od=class t extends F{static description="Browse recent generation history (interactive) or print it as a table";static examples=[{command:"<%= config.bin %> history",description:"Browse with arrow keys; select an entry to view details or replay it"},{command:"<%= config.bin %> replay <id>",description:"Re-run a specific entry by the id shown here"},{command:"<%= config.bin %> history -n 50 --json",description:"Last 50 entries as JSON (includes ids)"}];static flags={...F.baseFlags,n:Flags.integer({char:"n",description:"Number of entries to show",default:20,min:1})};async run(){let{flags:e}=await this.parse(t),r=qj(e.n);if(r.length===0){this.out.info("No generation history yet.");return}if(this.isJsonMode){this.out.json(r);return}if(this.noInput){this.renderTable(r);return}await this.browse(r);}async browse(e){let r=e.map((i,n)=>({name:this.formatRow(i),value:n}));for(;;){let i=await xe({message:"Generation history (\u2191\u2193 to browse, Enter for details):",choices:r,pageSiz e:15});if(i===j||i===X)return;let n=e[i];this.out.card(GI(n,this.color),{title:"Generation Details"});let o=await xe({message:"What next?",choices:[{name:"Replay this generation",value:"replay"},{name:"Back to list",value:"back"}]});if(o==="replay"){await Kt.run(Au(n));return}if(o===j||o===X)return}}formatRow(e){let r=this.color.dim((e.id??"").padEnd(11).slice(0,11)),i=e.timestamp.replace("T"," ").slice(0,19),n=(e.modelName??e.model).padEnd(22).slice(0,22),o=Ir(e.prompt??"(no prompt)",32).padEnd(32),s=e.status==="completed"?this.color.green("OK"):this.color.red("FAIL");return `${r} ${this.color.dim(i)} ${n} ${o} ${s}`}renderTable(e){this.out.divider({label:"Generation History"}),process.stderr.write(` `);let r=e.map(i=>({id:i.id??"-",time:i.timestamp.replace("T"," ").slice(0,19),model:i.modelName??i.model,prompt:Ir(i.prompt??"(no prompt)",30),status:i.status==="completed"?this.color.green("OK"):this.color.red("FAIL"),duration:i.durationMs?lD(i.durationMs):"-"}));if(this.out.richTable(r,{columns:[{key:"id",label:"Id"},{key:"time",label:"Time"},{key:"model",label:"Model"},{key:"prompt",label:"Prompt"},{key:"status",label:"Status"},{key:"duration",label:"Duration"}]}),!this.isQuiet){let i=ou().length;this.out.result(` ${e.length} entries (total: ${i})`);}}};var sd=class extends F{static description="Show the most recent generation entry";static examples=["<%= config.bin %> history last","<%= config.bin %> history last --json"];static flags={...F.baseFlags};async run(){let e=qs();if(!e){this.out.info("No generation history.");return}if(this.isJsonMode){this.out.json(e);return}this.out.card(GI(e,this.color),{title:"Last Generation"});}};var kMe=fileURLToPath(import.meta.url),cD=dirname(kMe);function FMe(t){try{return readdirSync(t,{withFileTypes:!0}).some(e=>e.isDirectory()&&existsSync(join(t,e.name,"SKILL.md")))}catch{return false}}function _Me(){let t=[join(cD,"skills"),join(cD,"..","..","..","skills"),join(cD,"..","..","..","install","skills")];return t.find(FMe)??t.find(e=>existsSync(e))??t[0]}async function TMe(t={}){let e=process.env.GEN_AI_SKILLS_SRC??_Me(),r=process.env.GEN_AI_SKILLS_DEST??t.to??join(homedir(),".claude","skills");if(!existsSync(e))throw new Error(`Skills source not found: ${e}`);mkdirSync(r,{recursive:true});let i=readdirSync(e,{withFileTypes:true}).filter(A=>A.isDirectory()&&existsSync(join(e,A.name,"SKILL.md"))).map(A=>A.name),n=0,o=0;for(let A of i){let u=join(r,A);if(existsSync(u)&&!t.force){o++,process.stderr.write(`\u2014 ${A} (already exists; use --force to overwrite) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/package/package.json new/package/package.json --- old/package/package.json 1985-10-26 09:15:00.000000000 +0100 +++ new/package/package.json 1985-10-26 09:15:00.000000000 +0100 @@ -1,6 +1,6 @@ { "name": "@picsart/gen-ai", - "version": "2.68.1", + "version": "2.69.0", "type": "module", "description": "Picsart AI CLI — generate images, video, and audio from the terminal", "license": "MIT", ++++++ node_modules.obscpio ++++++ Binary files old/picomatch-4.0.5.tgz and new/picomatch-4.0.5.tgz differ Binary files old/picomatch-4.0.7.tgz and new/picomatch-4.0.7.tgz differ ++++++ node_modules.spec.inc ++++++ --- /var/tmp/diff_new_pack.SaBrJK/_old 2026-08-25 13:20:27.197727469 +0200 +++ /var/tmp/diff_new_pack.SaBrJK/_new 2026-08-25 13:20:27.208727857 +0200 @@ -52,7 +52,7 @@ Source10051: https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz#/mute-stream-3.0.0.tgz Source10052: https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz#/onetime-7.0.0.tgz Source10053: https://registry.npmjs.org/ora/-/ora-8.2.0.tgz#/ora-8.2.0.tgz -Source10054: https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz#/picomatch-4.0.5.tgz +Source10054: https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz#/picomatch-4.0.7.tgz Source10055: https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz#/powershell-utils-0.1.0.tgz Source10056: https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz#/restore-cursor-5.1.0.tgz Source10057: https://registry.npmjs.org/semver/-/semver-7.8.5.tgz#/semver-7.8.5.tgz ++++++ node_modules.sums ++++++ --- /var/tmp/diff_new_pack.SaBrJK/_old 2026-08-25 13:20:27.274730188 +0200 +++ /var/tmp/diff_new_pack.SaBrJK/_new 2026-08-25 13:20:27.279730364 +0200 @@ -52,7 +52,7 @@ SHA512 (mute-stream-3.0.0.tgz) = 7641093d5bee9f816bcaa0666792a10e8d0af620d70309f4f2d30b0e29cd75104d3dc6040e2598cac2dc73a9379a34cc95b3fd2b2ca5bd1a5de3016dc2b4fdaf SHA512 (onetime-7.0.0.tgz) = 55726373cec549c17cf2e69f4b726594382f026f9cfd295fcf4ea5a2b8f6b80637e2b954bb436dfaff30ade88899cae00238c81e9d6b5e94c394b386c36f56c1 SHA512 (ora-8.2.0.tgz) = c1e3fe059f0c54d9e50a6f1cd1075cd56496ab8427ec8fbd0891a6ed06a58ba838e1efcf5336e336a257e4d27d96394d328b1f26f8357ca10620b9252bd7309f -SHA512 (picomatch-4.0.5.tgz) = 46fc3072bb8d8c8d67713e7145a91ec92f4b7fc95c22dbf7e0a0fe6a27fe547f6476e0327d8062a46875db6ef8c6d7a720f675d7dfd1f4175305af200304a1d0 +SHA512 (picomatch-4.0.7.tgz) = a9c26ef3c436216a89b030f9dbd24a31dc069bf76f2275b81ef427470887f49b62849bf318eb1c0ed1c4df1d6904a794393cac43c91598b9c9da426eef285c18 SHA512 (powershell-utils-0.1.0.tgz) = 74cd2356e5c93ec0cde83bd1a5e6b8f38b4251a3225d68ee0a7fbe1c64ea516cc60e3bf9b5990466574027f50c96a458185ac3fdeb41ca8e3fc4eb82fec9d7d8 SHA512 (restore-cursor-5.1.0.tgz) = a0c03675caf0eaed187f12505e6df8d9b14a5ff138b06f6b6d3ccef69b54711fdef00df7707baf4ad8983b01fb7ecce4665675cffb5af400283e4d85e2a20e1c SHA512 (semver-7.8.5.tgz) = 63bfca0ec6fc2e3a28669c1aa86cae94ee8342592c8029dc7211c693eb19218e1206f52870c044147e54af57c8e1d57e26f974c3a723bee71a222e34a6e462a0 ++++++ package-lock.json ++++++ --- /var/tmp/diff_new_pack.SaBrJK/_old 2026-08-25 13:20:27.332732236 +0200 +++ /var/tmp/diff_new_pack.SaBrJK/_new 2026-08-25 13:20:27.344732660 +0200 @@ -1,12 +1,12 @@ { "name": "@picsart/gen-ai", - "version": "2.68.1", + "version": "2.69.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@picsart/gen-ai", - "version": "2.68.1", + "version": "2.69.0", "license": "MIT", "dependencies": { "@inquirer/checkbox": "^5.1.2", @@ -750,9 +750,9 @@ } }, "node_modules/picomatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", - "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "engines": { "node": ">=12"
