@tim-fs/cli 0.1.3-alpha.0 → 0.1.4-alpha

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 (3) hide show
  1. package/README.md +13 -2
  2. package/dist/index.js +27 -27
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  # @tim-fs/cli
2
2
 
3
- The public command-line package for [TIM/FS](https://github.com/dht/tim-fs), a filesystem event bus
4
- for explicit, inspectable automation.
3
+ The public command-line package for [TIM/FS](https://github.com/dht/tim-fs), a local
4
+ filesystem-triggered workflow runner for explicit, inspectable automation. TIM dispatches file
5
+ events in the foreground; it is not a durable message queue.
5
6
 
6
7
  TIM/FS is currently alpha software. Its configuration, bot API, and filesystem contracts may
7
8
  change before `1.0`; breaking changes will be documented in release notes. Alpha releases are
@@ -18,6 +19,16 @@ npx @tim-fs/cli@alpha start [directory]
18
19
  `~/.tim/prompts`. `start` defaults to the current directory and stays in the foreground until you
19
20
  press `Ctrl-C`.
20
21
 
22
+ Load a trusted local JavaScript bot explicitly with the repeatable `--bot` option:
23
+
24
+ ```sh
25
+ npx @tim-fs/cli@alpha start ./workspace --bot ./bots/my-bot.mjs
26
+ ```
27
+
28
+ The module can export one bot or an array of bots. See the repository's
29
+ [custom bot guide](https://github.com/dht/tim-fs/blob/main/custom-bots.md) for the export contract,
30
+ dependency rules, and security model.
31
+
21
32
  The watcher, configuration, and artifacts are local. Bots configured with network AI providers
22
33
  send their inputs to those providers; “local-first” does not mean offline or local inference. See
23
34
  the repository README for the current reliability, privacy, and platform limitations.
package/dist/index.js CHANGED
@@ -1,35 +1,35 @@
1
1
  #!/usr/bin/env node
2
- import Ae from"node:fs";import js from"node:path";import yp from"node:readline/promises";import{Writable as hp}from"node:stream";import{Command as bp}from"commander";import{minimatch as vt}from"minimatch";import x from"path";import Vs from"fs-extra";var Ws=Vs;function N(){return Ws}var Bo=()=>({existsSync:e=>N().existsSync(e),readdirSync:e=>N().readdirSync(e),readFileSync:((e,t)=>N().readFileSync(e,t)),readJsonSync:e=>N().readJsonSync(e)});var Ks=Symbol.for("tim-core.runtime-state"),Ys=globalThis,mt=Ys[Ks]??={logger:null,root:""},zo=e=>{mt.root=e},oe=()=>mt.root;var qo=e=>{mt.logger=e},Sr=()=>mt.logger;var Hs=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)});var lt=()=>Hs().substring(0,4);var Xs=["console"],Zs=(e,t,r,o)=>typeof e=="string"?{message:e,level:t,source:r,data:o}:{...e,level:e.level??t,source:e.source??r,data:e.data??o},Uo=(e={})=>{let t=e.transports?.length?e.transports:Xs,r=!1,o=async(p,d)=>{let f=Zs(p,"info",e.source,d),m=f.level??"info",h={...f,level:m},y=[];t.includes("console")&&(m==="error"?console.error:m==="warn"?console.warn:console.log)(h),t.includes("custom")&&(e.addLog?y.push(Promise.resolve(e.addLog(h))):r||(r=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))),y.length&&await Promise.all(y)};return{log:o,debug:async(p,d)=>o({message:p,level:"debug",data:d,source:e.source}),info:async(p,d)=>o({message:p,level:"info",data:d,source:e.source}),warn:async(p,d)=>o({message:p,level:"warn",data:d,source:e.source}),error:async(p,d)=>o({message:p,level:"error",data:d,source:e.source}),clearLogs:async()=>{}}},Fp=Uo();import P from"kleur";import*as ce from"node:fs/promises";import*as ft from"node:path";import*as Cr from"node:util";import{createLogger as ei,transports as Vo,format as ve}from"winston";import ti from"winston-transport";var Go={aspectRatio:"gray",bot:"pink",configuredDirectoriesCount:"yellow",cost:"pink",dimensions:"gray",duration:"yellow",file:"gray",format:"gray",message:"white",model:"gray",operation:"gray",outputCount:"gray",outputSize:"gray",promptId:"pink",promptLabel:"white",quality:"gray",systemProviders:"cyan",systemVersion:"cyan",tokens:"gray",voice:"gray",workingDirectory:"cyan"};function gt(e){if(e===void 0)return e;if(Array.isArray(e))return e.filter(r=>r!==void 0).map(r=>gt(r));if(e&&typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))o!==void 0&&(t[r]=gt(o));return t}return e}var ri=Symbol.for("message"),oi=e=>{if(!e||typeof e!="object")return;let t=e.logPath;return typeof t=="string"&&t.length?t:void 0},xr=class extends ti{defaultLogPath;ensuredDirs=new Set;lineFormat;constructor({defaultLogPath:t,format:r}){super(),this.defaultLogPath=t,this.lineFormat=r}log(t,r){setImmediate(()=>this.emit("logged",t));let o=oi(t.logEvent?.data)??this.defaultLogPath;if(!o){r();return}(async()=>{let s=ft.dirname(o);this.ensuredDirs.has(s)||(this.ensuredDirs.add(s),await ce.mkdir(s,{recursive:!0}).catch(()=>{}));let i=this.lineFormat.transform({...t},this.lineFormat.options??{}),a=i[ri]??i.message??"";await ce.appendFile(o,`${a}
3
- `,"utf8")})().catch(s=>{let i=s instanceof Error?s.message:Cr.format("%o",s);console.warn("[tim-logger] Failed to write log file",{logPath:o,error:i})}).finally(r)}},ni=ve.combine(ve.timestamp({format:()=>new Date().toISOString()}),ve.printf(e=>{let t=e.logEvent??{},r=e.timestamp??new Date().toISOString(),o=String(t.source??"LOG"),n=String(t.message??e.message??""),s=Wo(t.data),i=s&&typeof s=="object"&&Object.keys(s).length?` | ${JSON.stringify(s)}`:"";return`[${r}] ${o.padStart(12)}: ${n}${i}`})),si=["console"],ii=(e,t,r,o)=>typeof e=="string"?{message:e,level:t,source:r,data:o}:{...e,level:e.level??t,source:e.source??r,data:e.data??o},ai=e=>{if(!e)return"";try{return JSON.stringify(e)}catch{return"[unserializable data]"}},ui=e=>e==null?!1:typeof e!="object"||Array.isArray(e)?!0:Object.keys(e).length>0;function Wo(e){if(!e||typeof e!="object"||Array.isArray(e)||!("logPath"in e))return e;let{logPath:t,...r}=e;return r}function yt(e,t){return e==="verbose"?!0:e==="quiet"?t.level==="error"||t.level==="warn":t.level!=="debug"}var Ko=e=>typeof e!="number"?"":e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}s`:`${e}ms`;var k=(e,t,r=!1)=>{let o=String(t??""),n=Go[e],s=n==="blue"?P.blue:n==="cyan"?P.cyan:n==="green"?P.green:n==="red"?P.red:n==="yellow"?P.yellow:n==="pink"?P.magenta:n==="white"?P.white:n==="gray"?P.gray:P.white;return r?s().bold(o):s(o)},ci=e=>{if(!e.operationId)return"";let t=e.operationId;return e.operationLogPath?`\x1B]8;;${`file://${encodeURI(e.operationLogPath)}`}\x07${P.underline(k("operation",t))}\x1B]8;;\x07`:k("operation",t)},pi=e=>e.split(" \xB7 ").map((t,r)=>r===0&&t.startsWith("Created ")?`Created ${k("file",t.slice(8),!0)}`:t.startsWith("$")?k("cost",t,!0):/\btokens?\b/i.test(t)?k("tokens",t,!0):t.includes("\xD7")?k("dimensions",t,!0):/^(?:generated|media)\s+/i.test(t)||/\d(?:\.\d+)?s\b/.test(t)?k("duration",t,!0):/\b(?:B|KB|MB|GB)\b/.test(t)?k("outputSize",t,!0):t.includes("/")?k("model",t,!0):k("message",t,!0)).join(P.gray(" \xB7 ")),Ie=e=>e&&typeof e=="object"&&!Array.isArray(e)?e:{},mi=e=>typeof e!="number"||!Number.isFinite(e)||e<0?"":e<1024?`${e} B`:e<1024**2?`${(e/1024).toFixed(e>=100*1024?0:1)} KB`:`${(e/1024**2).toFixed(e>=100*1024**2?0:1)} MB`,Yo=e=>{if(typeof e=="number"&&Number.isFinite(e))return e;let t=Ie(e);for(let r of["totalCost","costUSD","total","usd"])if(typeof t[r]=="number"&&Number.isFinite(t[r]))return t[r]},li=e=>{let t=Yo(e);return t===void 0?"":`$${t.toFixed(t<.01?4:2)}`},di=e=>{let t=Ie(e);for(let n of["totalTokens","total_tokens","totalTokenCount"])if(typeof t[n]=="number"&&Number.isFinite(t[n]))return t[n];let r=t.inputTokens??t.input_tokens??t.promptTokens??t.prompt_tokens,o=t.outputTokens??t.output_tokens??t.completionTokens??t.completion_tokens;return typeof r=="number"||typeof o=="number"?(typeof r=="number"?r:0)+(typeof o=="number"?o:0):void 0},Ho=e=>{let t=Array.isArray(e.outputs)?e.outputs.map(Ie):[];return t.length?t:[e]},gi=e=>[e.provider,e.model].filter(t=>typeof t=="string"&&t.length>0).join("/"),fi=e=>{let t=Ie(e.data),r=Ho(t),o=[...new Set(r.map(gi).filter(Boolean))],n=r[0]??t,s=[];o.length===1?s.push(k("model",o[0],!0)):o.length>1&&s.push(k("model",`${o.length} models`,!0));let i=n.imageSize||n.size||n.resolution;return i&&s.push(k("dimensions",i,!0)),n.quality&&s.push(`${P.gray("quality")} ${k("quality",n.quality,!0)}`),n.aspectRatio&&s.push(k("aspectRatio",n.aspectRatio,!0)),n.voiceId&&s.push(`${P.gray("voice")} ${k("voice",n.voiceId,!0)}`),n.outputFormat&&s.push(k("format",n.outputFormat,!0)),typeof n.mediaDurationSeconds=="number"&&s.push(k("duration",`${n.mediaDurationSeconds}s media`,!0)),r.length>1&&s.push(k("outputCount",`${r.length} outputs`,!0)),s.join(P.gray(" \xB7 "))},yi=e=>{let t=Ie(Ie(e.data).result);if(!Object.keys(t).length)return{target:"",details:""};let r=Ho(t),o=r[0]??t,n=r.reduce((f,m)=>f+(typeof m.outputSizeBytes=="number"?m.outputSizeBytes:0),0),s=r.map(f=>Yo(f.cost)),i=s.some(f=>f!==void 0)?s.reduce((f,m)=>f+(m??0),0):void 0,a=r.reduce((f,m)=>f+(di(m.usage??m.tokenUsage)??0),0),u=r.length>1?k("outputCount",`${r.length} outputs`,!0):typeof o.outputFileName=="string"?k("file",o.outputFileName,!0):"",p=[];o.width&&o.height?p.push(k("dimensions",`${o.width}\xD7${o.height}`,!0)):o.resolution&&p.push(k("dimensions",o.resolution,!0)),n>0&&p.push(k("outputSize",mi(n),!0)),typeof o.mediaDurationSeconds=="number"&&p.push(k("duration",`${o.mediaDurationSeconds}s media`,!0));let d=li(i);return d&&p.push(k("cost",d,!0)),a>0&&p.push(k("tokens",`${a.toLocaleString()} tokens`,!0)),{target:u,details:p.join(P.gray(" \xB7 "))}},hi=e=>{let t=e.data&&typeof e.data=="object"&&!Array.isArray(e.data)?e.data:{};if(typeof t.version=="string")return`TIM version ${k("systemVersion",t.version,!0)}`;if(typeof t.root=="string"&&typeof t.configuredDirectories=="number"){let r=t.configuredDirectories;return`Listener started in ${k("workingDirectory",t.root,!0)} with ${k("configuredDirectoriesCount",r,!0)} configured director${r===1?"y":"ies"}`}return typeof t.providers=="string"?`Providers: ${k("systemProviders",t.providers,!0)}`:k("message",e.message??"")},bi=e=>{let t=e.message??"",r=Ie(e.data).promptId;if(typeof r=="string"&&r.length>0){let o=t.indexOf(r);return o>=0?`${k("promptLabel",t.slice(0,o))}${k("promptId",r,!0)}${k("promptLabel",t.slice(o+r.length))}`:`${k("promptLabel",t)} ${P.gray("\xB7 prompt")} ${k("promptId",r,!0)}`}return k("message",t)};function Xo(e,t=""){let r=e.source??"LOG",o=r==="tim-core"||r==="LOG",n=f=>`${P.gray(t)} ${f}`.trimStart(),s=k("bot",e.botName??"unknown-bot",!0),i=k("file",e.fileName??e.filePath??"unknown-file",!0),a=Ko(e.duration),u=ci(e),p=u?` ${P.gray("\xB7 op")} ${u}`:"",d=f=>f.padEnd(6);switch(e.kind){case"crud":return`${n(P.cyan().bold("\u25C6"))} ${P.cyan().bold(d("CRUD"))} ${P.cyan(String(e.crudVerb??e.verb??"").toUpperCase())} ${i}`;case"bot-delay":return`${n(P.yellow("\u25F7"))} ${P.yellow().bold(d("WAIT"))} ${s} ${k("duration",a||String(e.message??""),!0)} ${P.gray("\xB7")} ${i}`;case"bot-start":{let f=fi(e);return`${n(P.magenta("\u25B6"))} ${P.magenta().bold(d("START"))} ${s}${f?` ${P.gray("\xB7")} ${f}`:""} ${P.gray("\xB7")} ${i}${p}`}case"bot-step":{let f=e.level==="error"?"ERROR":e.level==="warn"?"WARN":"STEP",m=e.level==="error"?P.red:e.level==="warn"?P.yellow:P.cyan,h=e.level==="error"?P.red("\u2715"):e.level==="warn"?P.yellow("!"):P.cyan("\u2022");return`${n(h)} ${m().bold(f.padEnd(6))} ${s} ${P.gray("\xB7")} ${bi(e)}${a?` ${P.gray("(")}${k("duration",a)}${P.gray(")")}`:""}${p}`}case"bot-output":return`${n(P.green("\u25A3"))} ${P.green().bold(d("OUTPUT"))} ${pi(e.message??"")}`;case"bot-done":{let f=yi(e),m=f.target||i;return`${n(P.green("\u2713"))} ${P.green().bold(d("DONE"))} ${s}${a?` ${k("duration",a,!0)}`:""} ${P.gray("\xB7")} ${m}${f.details?` ${P.gray("\xB7")} ${f.details}`:""}${p}`}case"bot-skip":return`${n(P.gray("\u21B7"))} ${P.gray().bold(d("SKIP"))} ${k("bot",e.botName??"")} ${k("message",e.message??"")}`.trim();case"bot-error":return`${n(P.red("\u2715"))} ${P.red().bold(d("ERROR"))} ${s} ${P.gray("\xB7")} ${i}${p} ${k("message",e.message??"Bot failed")}`;case"system":return`${n(P.blue().bold("\u25C6"))} ${P.blue().bold(d("SYSTEM"))} ${hi(e)}`;default:{let f=String(e.level??"info").toUpperCase(),m=e.level==="error"?P.red:e.level==="warn"?P.yellow:P.cyan,h=ui(e.data)?k("message",` ${ai(e.data)}`):"",y=e.level==="error"?P.red("\u2715"):e.level==="warn"?P.yellow("!"):o?P.blue("\u25C6"):P.magenta("\u2022");return`${n(y)} ${m(d(f))} ${k("message",e.message??"")}${h}`}}}var vi=e=>({...e,at:new Date(e.timestamp??Date.now()).toISOString()});function Ii(e){let t=e.botName??e.source??"tim",r=e.fileName?` \xB7 ${e.fileName}`:"",o=Ko(e.duration),n=e.operationId?` \xB7 op ${e.operationId}`:"";switch(e.kind){case"bot-delay":return`WAIT ${o} ${t}${r}`;case"bot-start":return`START ${t}${r}${n}`;case"bot-step":return`${e.level==="error"?"ERROR":e.level==="warn"?"WARN":"STEP"} ${t} \xB7 ${e.message}${o?` \xB7 ${o}`:""}${n}`;case"bot-output":return`OUTPUT ${e.message}`;case"bot-skip":return`SKIP ${t}${r} \xB7 ${e.message}`;case"bot-done":return`DONE ${o} ${t}${r}${n}`;case"bot-error":return`ERROR ${t}${r} \xB7 ${e.message}${n}`;default:return`${String(e.level??"info").toUpperCase()} ${e.message}`}}function wr(e,t,r){for(let o of t){if(!yt(o.detail??"default",e))continue;let n=ft.dirname(o.path);r.ensureDirSync(n);let s=vi(e);if(o.format==="text"){r.appendFileSync(o.path,`${s.at} ${Ii(e)}
4
- `,{encoding:"utf-8"});continue}if(o.format==="jsonl"){r.appendFileSync(o.path,`${JSON.stringify(s)}
5
- `,{encoding:"utf-8"});continue}let i=r.existsSync(o.path)?r.readJsonSync(o.path):{},a=Array.isArray(i.events)?i.events:[];r.writeJsonSync(o.path,{...i,id:e.operationId,botName:e.botName??i.botName,command:e.data?.command??i.command??e.botName,fileName:e.fileName??i.fileName,filePath:e.filePath??i.filePath,sourceFileName:e.data?.sourceFileName??i.sourceFileName??e.fileName,sourceFilePath:e.data?.sourceFilePath??i.sourceFilePath??e.filePath,startedAt:e.kind==="bot-start"?s.at:i.startedAt??s.at,endedAt:e.kind==="bot-done"||e.kind==="bot-error"?s.at:i.endedAt??null,durationMs:e.duration??i.durationMs??null,status:e.kind==="bot-error"?"error":e.kind==="bot-done"?"done":i.status??"started",phase:e.kind==="bot-error"?"error":e.kind==="bot-done"?"done":i.phase??"started",lastEventAt:s.at,lastMessage:e.message,events:[...a,s]},{spaces:2})}}var Si=ve.combine(ve.timestamp({format:"HH:mm:ss"}),ve.errors({stack:!0}),ve.printf(e=>{let{timestamp:t,level:r="info",message:o="",stack:n,logEvent:s}=e,i={...s??{},level:s?.level??r,message:s?.message??String(o),data:Wo(s?.data)},a=Xo(i,t);return n?`${a}
6
- ${n}`:a})),ht=(e={})=>{let t=e.transports?.length?e.transports:si,r=!1,o=[];t.includes("console")&&o.push(new Vo.Console({format:Si}));let n=e.logPath??e.fsPath??"log.txt";t.includes("fs")&&o.push(new xr({defaultLogPath:n,format:ni}));let s=ei({level:"debug",transports:o.length?o:[new Vo.Console]}),i=async(m,h)=>{let y=ii(m,"info",e.source,h),I=y.level??"info",A={...y,level:I,timestamp:y.timestamp??Date.now()};if(s.log({level:I,message:A.message,logEvent:A}),t.includes("custom"))if(e.addLog){let C=gt({...A});await Promise.resolve(e.addLog(C))}else r||(r=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))},a=async(m,h)=>i({message:m,level:"debug",data:h,source:e.source}),u=async(m,h)=>i({message:m,level:"info",data:h,source:e.source}),p=async(m,h)=>i({message:m,level:"warn",data:h,source:e.source});return{log:i,debug:a,info:u,warn:p,error:async(m,h)=>i({message:m,level:"error",data:h,source:e.source}),clearLogs:async(m=()=>!0)=>{if(t.includes("fs"))try{await ce.mkdir(ft.dirname(n),{recursive:!0}).catch(()=>{}),await ce.writeFile(n,"",{flag:"a"}),await ce.truncate(n,0),await u("\u{1F9F9} Logs cleared",{logPath:n})}catch(h){let y=h instanceof Error?h.message:Cr.format("%o",h);await p("Failed to clear logs",{logPath:n,error:y})}t.includes("custom")&&e.clearLogs&&await e.clearLogs(m)}}},Dp=ht();import qe from"node:path";var Zo=()=>{let e=ht({source:"tim-core",transports:["console"]});return qo(e),e},Ue=(e,t={})=>{let r={...t,message:e,level:t.level??"info",timestamp:t.timestamp??Date.now()},o=Sr();return o&&o.log(r),r},G=(e,t,r={})=>Ue(e,{kind:"diagnostic",level:"error",data:{...r,error:t instanceof Error?t.message:String(t),...t instanceof Error&&t.stack?{stack:t.stack}:{}}});function K(e,t,r={}){let o=qe.resolve(oe()||e.paths.rootFull||process.cwd()),n=t.operationId??e.operationId,s=e.global.logs.operation,i=n&&s.enabled?qe.join(o,s.directory,`${n}.json`):void 0,a=t.botName??e.botName,u={...t,operationId:n,operationLogPath:i,botName:a,fileName:t.fileName??e.fileName,filePath:t.filePath??e.paths.file,machineId:t.machineId??e.machineId,sessionId:t.sessionId??e.sessionId,scope:t.scope??e.scope,userId:t.userId??e.userId,source:t.source??(t.kind?.startsWith("bot-")?a:e.botName)??"tim-core",level:t.level??"info",timestamp:t.timestamp??Date.now()},p=e.global.logs.console,d=p.silenceCrudDelete&&u.kind==="crud"&&u.crudVerb==="delete",f=p.silenceRequestBotStartDone&&u.botName?.startsWith("req-")&&(u.kind==="bot-start"||u.kind==="bot-done");if(r.console!==!1&&p.enabled&&!d&&!f&&yt(p.detail,u)){let h=Sr();h&&h.log(u)}let m=[];if(r.local!==!1&&e.global.logs.local.enabled){let h=r.localPath??qe.join(e.paths.sessionFull||qe.dirname(e.paths.fileFull),"log.txt");m.push({path:h,format:"text",detail:e.global.logs.local.detail})}return r.workspace!==!1&&e.global.logs.workspace.enabled&&m.push({path:qe.join(o,"_tim","logs","events.jsonl"),format:"jsonl",detail:e.global.logs.workspace.detail}),r.operation!==!1&&n&&s.enabled&&m.push({path:i,format:"operation",detail:s.detail}),m.length&&wr(u,m,N()),u}var Qo=e=>e.replace(/(\d+)(?=\.\w+$)/,t=>String(Number(t)+1).padStart(t.length,"0"));import xi from"node:crypto";import Ci from"node:os";import en from"node:path";function wi(e){return xi.createHash("sha1").update(en.resolve(e)).digest("hex").slice(0,12)}function bt(e){return en.join(Ci.tmpdir(),"tim-core",wi(e))}var Q=()=>Bo(),M=e=>N().existsSync(e);var Ge=e=>N().ensureDirSync(e);var Tr=e=>N().removeSync(e),Fr=(e,t)=>N().copySync(e,t);var xt=e=>N().readJsonSync(e),Ce=(e,t={})=>{try{return N().existsSync(e)?N().readJsonSync(e):t}catch(r){return G(`Failed to read JSON from ${e}`,r,{filePath:e}),t}},Ar=(e,t="utf-8")=>N().readFileSync(e,t),D=e=>N().readFileSync(e),kr=(e,t,r="utf-8")=>N().writeFileSync(e,t,{encoding:r}),Er=(e,t,r=2)=>N().writeJsonSync(e,t,{spaces:r}),Ve=(e,t)=>N().writeFileSync(e,t),Ct="_meta",Pi="_temp",tn="_done",It="_cleanup",rn=new Set(["_analysis",It,"_partial","_parts","_transcript"]),Ti=new Set(["_analysis",It,tn,Ct,"_parts","_prompts",Pi,"_transcript"]),Fi=["_partial.","_transcribing.","_transcript."];function Ai(e){return x.basename(e).endsWith(".meta.json")}function ki(e,t){return e.split(/[\\/]+/).includes(t)}function wt(e){return e.split(/[\\/]+/).filter(Boolean)}function xe(e){return e.replace(/^\/+|\/+$/g,"").replace(/[^a-z0-9._-]+/gi,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()}function Ei(e){return xe(e.paths.file||e.fileName||"source")||"source"}function _i(e){let t=x.dirname(e.paths.file||"");return xe(t==="."?e.paths.session||"session":t)||"session"}function _r(e){return(e.operationId||"manual").replace(/[^a-z0-9._-]+/gi,"-")}function Li(e){let[t]=wt(e);return rn.has(t)}function Ni(e,t){let r=wt(t),o=xe(r.shift()||"work").replace(/^_+/,"")||"work",n=xe(r.join("__")||x.basename(t)||"file");return`${_i(e)}__${o}__${n}`}function on(e,t){let r=x.basename(t),o=xe(r),n=xe(e.fileName.replace(/\.[^.]+$/,""));if(!n||o.startsWith(`${n}.`))return o;let i=o.replace(/^_+/,"").replace(/\.meta\.json$/i,""),[a,...u]=i.split("."),p=u.join(".");return a&&p&&xe(p)===n?`${p}.${a}.meta.json`:o}function Oi(e,t){let r=on(e,t);return`${_r(e)}__${r}`}function St(e){return sn(e,e.global.meta,"meta")}function nn(e){return sn(e,e.global.intermediates,"intermediates")}function sn(e,t,r){switch(t.location){case"source":return e.paths.sessionFull;case"source-subdirectory":return x.join(e.paths.sessionFull,t.directory);case"workspace":return x.join(e.paths.rootFull,t.directory);case"none":return x.join(bt(e.paths.rootFull),"_ephemeral",_r(e),r);default:return x.join(bt(e.paths.rootFull),t.directory)}}function Pr(e,t,r,o){return r.location==="source"||r.location==="source-subdirectory"?x.basename(t):o==="meta"?Oi(e,t):Ni(e,t)}function Se(e,t,r={}){let o=wt(t),n=o[0]===Ct?o.slice(1).join("/"):t;if(Ai(t)){let s=x.join(St(e),Pr(e,n,e.global.meta,"meta"));return r.forWrite?s:Ri(e,n)||s}return Li(t)?x.join(nn(e),Pr(e,t,e.global.intermediates,"intermediates")):x.join(e.paths.sessionFull,t)}function Lr(e,t,r={}){return Se(e,t,r)}function Ri(e,t){let r=N(),o=x.basename(t),n=on(e,t),s=Ei(e),i=St(e),a=x.join(i,Pr(e,t,e.global.meta,"meta"));if(r.existsSync(a))return a;if(r.existsSync(i)){let d=r.readdirSync(i).filter(f=>f.endsWith(`__${n}`)||f.endsWith(`__${o}`)&&f.includes(`__${s}__`)).sort();if(d.length)return x.join(i,d[d.length-1])}let u=x.join(e.paths.sessionFull,Ct,o);if(r.existsSync(u))return u;let p=x.join(e.paths.sessionFull,o);return r.existsSync(p)?p:null}function an(e){let t=N(),r=x.join(bt(e.paths.rootFull),"_ephemeral",_r(e));t.existsSync(r)&&t.removeSync(r)}function $i(e,t){if(!e.existsSync(t))return t;let r=x.dirname(t),o=x.extname(t),n=x.basename(t,o);for(let s=2;s<1e4;s+=1){let i=x.join(r,`${n}.${s}${o}`);if(!e.existsSync(i))return i}return x.join(r,`${n}.${Date.now()}${o}`)}var E=e=>{let t=N();function r(l,g){try{let{paths:b}=e,S=l==="sessionFull"?Se(e,g):x.join(b[l],g);return t.existsSync(S)?t.readJsonSync(S):{}}catch(b){G("File manager failed to read JSON",b,{filePath:g})}}function o(l,g,b){try{let{paths:S}=e,F=l==="sessionFull"?Se(e,g,{forWrite:!0}):x.join(S[l],g);t.ensureDirSync(x.dirname(F)),t.writeJsonSync(F,b,{spaces:2})}catch(S){G("File manager failed to write JSON",S,{filePath:g})}}function n(l,g,b,S){try{let{paths:F}=e,j=x.join(F[l],`${g}.${S}.json`);t.writeJsonSync(j,b,{spaces:2})}catch(F){G("File manager failed to write AI request",F,{id:g,suffix:S})}}function s(l,g,b){return n(l,g,b,"llm")}function i(l,g,b){return n(l,g,b,"convo")}function a(l,g,b){return n(l,g,b,"image")}function u(l,g,b){return n(l,g,b,"vision")}function p(l,g,b){return n(l,g,b,"tts")}function d(l,g={}){try{let{paths:b,machineId:S,sessionId:F,userId:j}=e,z={id:lt(),ts:Date.now(),userId:j,machineId:S,sessionId:F,orderType:l,...g},re=x.join(b.rootFull,"_orders",`${z.id}.json`);t.ensureDirSync(x.dirname(re)),t.writeJsonSync(re,z,{spaces:4})}catch(b){G("File manager failed to write bridge order",b,{orderType:l})}}function f(l,g,b){try{let{paths:S}=e,F=l==="sessionFull"?Se(e,g,{forWrite:!0}):x.join(S[l],g);t.ensureDirSync(x.dirname(F)),t.writeFileSync(F,b)}catch(S){G("File manager failed to write binary file",S,{filePath:g})}}function m(l,g,b){try{let{paths:S}=e,F=l==="sessionFull"?Se(e,g,{forWrite:!0}):x.join(S[l],g);t.ensureDirSync(x.dirname(F)),t.copySync(b,F)}catch(S){G("File manager failed to copy file",S,{filePath:g,sourcePath:b})}}function h(l,g){try{let{paths:b}=e,S=l==="sessionFull"?Se(e,g):x.join(b[l],g);return t.readFileSync(S,"utf-8")}catch(b){G("File manager failed to read binary file",b,{filePath:g})}}function y(l,g){try{let{paths:b}=e,S=x.join(b[l],g);return t.readdirSync(S)}catch(b){return G("File manager failed to read directory",b,{path:g}),[]}}function I(l,g,b){let S=b?x.join(e.paths[l],b):e.paths[l],F=(_,J=!0)=>t.existsSync(_)?t.readdirSync(_).filter(B=>B.endsWith(".json")&&(!J||!g||vt(B,g))).reduce((B,Z)=>(B[Z]=t.readJsonSync(x.join(_,Z)),B),{}):{},j=["workspace","os-temp","none"].includes(e.global.meta.location),z=l==="sessionFull"&&!b&&j?Object.entries(F(St(e),!1)).reduce((_,[J,B])=>{let Z=J.split("__").pop()||J;return(!g||vt(Z,g)||vt(J,g))&&(_[Z]=B),_},{}):{},re=!b&&e.global.meta.location==="source-subdirectory"?F(St(e)):{},W=b?{}:F(x.join(S,Ct));return{...F(S),...W,...re,...z}}function A(l){let{paths:g}=e;t.emptyDirSync(g[l])}function C(l,g){let{paths:b}=e,S=x.join(b[l],`${g}.md`);t.existsSync(S)&&t.unlinkSync(S),t.writeFileSync(S,Date.now().toString(),{encoding:"utf-8"})}function w(l,g){let{paths:b}=e,S=x.join(b[l],`${g}.md`);t.existsSync(S)&&t.removeSync(S)}async function v(l,g){C(l,g),w(l,g)}function T(l,g){let{paths:b}=e,S=l==="sessionFull"&&rn.has(wt(g)[0])?nn(e):x.join(b[l],g);t.ensureDirSync(S)}function L(l,g){let{paths:b}=e,S=l==="sessionFull"?Se(e,g):x.join(b[l],g);return t.existsSync(S)}function R(){return U(e.fileName)}function U(l){let g=x.join(e.paths.sessionFull,l);if(!g||!t.existsSync(g)||l.split(/[\\/]+/).some(F=>Ti.has(F))||Fi.some(F=>x.basename(l).startsWith(F))||l==="config.json"||l==="log.txt")return null;let b=x.join(e.paths.sessionFull,tn),S=$i(t,x.join(b,x.basename(l)));return t.ensureDirSync(b),t.copySync(g,S),t.removeSync(g),S}function ke(l,g){let b=g.startsWith(".")?g:`.${g}`,S=x.extname(l);return S?l.slice(0,-S.length)+b:`${l}${b}`}function be(l){let g=e.config||{};return(g.cleanUp||g.cleanup||{})?.[l]||null}function ct(l){let g=[],b=new Set;for(let S of l){let F=be(S);if(!F)continue;let j=[],z=(_,J)=>{let B=`move-to-done:${_}`;if(b.has(B))return;b.add(B);let Z=U(_);j.push({action:"move-to-done",reason:J,fileName:_,status:Z?"moved":"skipped",donePath:Z})},re=(_,J)=>{let B=`delete:${_}`;if(b.has(B))return;b.add(B);let Z=x.join(e.paths.sessionFull,_);if(!t.existsSync(Z)){j.push({action:"delete",reason:J,fileName:_,status:"missing"});return}t.removeSync(Z),j.push({action:"delete",reason:J,fileName:_,status:"deleted"})},W=(_,J)=>{if(F.verb==="done"){z(_,J);return}F.verb==="delete"&&re(_,J)};W(e.fileName,"trigger");for(let _ of Array.isArray(F.additionalExt)?F.additionalExt:[])W(ke(e.fileName,_),`additionalExt:${_}`);for(let _ of Array.isArray(F.additionalFiles)?F.additionalFiles:[])W(_,"additionalFiles");g.push({commandName:S,policy:F,actions:j})}return g}function Ms(l,g,b){if(!b.length)return null;let S=g.replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase(),F=x.join(It,`${l}.${S}.cleanup.json`);return o("sessionFull",F,{botName:l,sourceFileName:g,createdAt:Date.now(),actions:b}),F}function Js(l){let g=x.join(e.paths.sessionFull,It);if(!t.existsSync(g))return[];let b=[],S=t.readdirSync(g).filter(F=>F.endsWith(".cleanup.json")).sort();for(let F of S){let j=x.join(g,F),z=t.readJsonSync(j);if(z.sourceFileName&&z.sourceFileName!==l)continue;let re=Array.isArray(z.actions)?z.actions:[],W=[];for(let _ of re){if(!_?.fileName||ki(_.fileName,".."))continue;let J=x.join(e.paths.sessionFull,_.fileName);if(!t.existsSync(J)){W.push({..._,status:"missing"});continue}if(_.action==="move-to-done"){let B=U(_.fileName);W.push({..._,status:B?"moved":"skipped",donePath:B});continue}_.action==="delete"&&(t.removeSync(J),W.push({..._,status:"deleted"}))}t.removeSync(j),b.push({manifestFileName:F,botName:z.botName,sourceFileName:z.sourceFileName,actions:W})}return b}function Bs(l,g){for(let b in g)f(l,b,g[b])}function zs(l,g,b){let S=g.replace(/\.[^.]+$/,".meta.json"),F=g.replace(/\.[^.]+$/,".txt"),{usage:j,cost:z,model:re,duration:W}=b||{};return o(l,S,{model:re,usage:j,cost:z,duration:W,sourceFileName:g,outputFileName:F}),S}function jo(l){let{paths:g}=e,b=g[l];return t.existsSync(b)||(b=x.dirname(g.fileFull)),t.existsSync(b)?x.join(b,"log.txt"):null}function Mo(l,g={}){let b=g.type==="error"?"error":g.type==="warn"?"warn":"info";return{kind:g.type==="skip"?"bot-skip":g.type==="output"?"bot-output":"bot-step",level:b,message:l,data:g.data,duration:g.duration}}function qs(l,g,b={}){let S=jo(l);S&&K(e,Mo(g,b),{console:!1,local:!0,localPath:S,operation:!1,workspace:!1})}function Us(l,g,b={}){let S=jo(l);K(e,Mo(g,b),{local:!!S,localPath:S??void 0,operation:!0,workspace:!0})}function pt(l,g,b){let F={...r(l,g),...b};return o(l,g,F)}function Jo(l,g=""){let{paths:b}=e,S=b[l];return g&&(S=x.join(S,g)),t.readdirSync(S)}function Gs(l,g,b){let S=Jo(l,b).filter(j=>!g||vt(j,g));if(S.length===0)return null;S.sort();let F=S.pop();return F?Qo(F):null}return{sessionFull:e.paths.sessionFull,machineFull:e.paths.machineFull,readFile:l=>t.readJsonSync(`${oe()}${l}`),orders:{writeBridgeOrder:d},session:{read:l=>l.endsWith(".json")?r("sessionFull",l):h("sessionFull",l),write:(l,g)=>l.endsWith(".json")?o("sessionFull",l,g):typeof g=="string"&&x.isAbsolute(g)&&t.existsSync(g)?m("sessionFull",l,g):f("sessionFull",l,g),patch:(l,g)=>pt("sessionFull",l,g),writeTextToTextRequest:(l,g)=>s("sessionFull",l,g),writeConvoRequest:(l,g)=>i("sessionFull",l,g),writeImageRequest:(l,g)=>a("sessionFull",l,g),writeVisionRequest:(l,g)=>u("sessionFull",l,g),writeTtsRequest:(l,g)=>p("sessionFull",l,g),removeCheckpoint:l=>w("sessionFull",l),recycleCheckpoint:l=>v("sessionFull",l),readDir:l=>y("sessionFull",l),readDirJsons:(l,g)=>I("sessionFull",l,g),ensureDir:l=>T("sessionFull",l),emptyDir:()=>A("sessionFull"),copyFrom(l){let g=x.join(e.paths.machineFull,"sessions",l),b=e.paths.sessionFull;t.copySync(g,b)},exists:l=>L("sessionFull",l),writeByFile:l=>Bs("sessionFull",l),saveMeta:(l,g)=>zs("sessionFull",l,g),patchSessionJson:l=>{if(!(!e.machineId||!e.sessionId))return pt("sessionFull","_session.json",l)},saveTimeline:l=>{if(!(!e.machineId||!e.sessionId))return o("sessionFull","_timeline.json",l)},listFiles:()=>Jo("sessionFull"),addToLog:(l,g={})=>Us("sessionFull",l,g),addToLocalLog:(l,g={})=>qs("sessionFull",l,g),generateMd:l=>C("sessionFull",l),getNextFile:(l,g)=>Gs("sessionFull",l,g),moveInputFileToDone:R,applyCleanupPolicy:ct,writeCleanupManifest:Ms,applyCleanupManifests:Js},machine:{read:l=>r("machineFull",l),write:(l,g)=>o("machineFull",l,g),patch:(l,g)=>pt("machineFull",l,g),patchState:l=>pt("machineFull","state.json",l),readDir:l=>y("machineFull",l),readDirJsons:(l,g)=>I("machineFull",l,g),ensureDir:l=>T("machineFull",l),generateMd:l=>C("machineFull",l)},srcData:{read:l=>{let g=x.resolve("./src");return t.readJsonSync(x.join(g,"data",l))}}}};import Tt from"lodash";var le={logs:{console:{enabled:!0,detail:"default",silenceCrudDelete:!0,silenceRequestBotStartDone:!0},local:{enabled:!0,detail:"default"},operation:{enabled:!0,detail:"verbose",directory:"_tim/operations"},workspace:{enabled:!0,detail:"default"}},intermediates:{location:"os-temp",directory:"_temp"},meta:{location:"workspace",directory:"_meta"}},Di=new Set(["source","source-subdirectory","workspace","os-temp","none"]);function un(e,t){let r=Tt.merge({},t,e),o=typeof r.directory=="string"?r.directory.trim():"",n=o.length>0&&!o.startsWith("/")&&!o.startsWith("\\")&&!o.split(/[\\/]+/).includes("..");return{location:Di.has(r.location)?r.location:t.location,directory:n?o:t.directory}}function Pt(e,t){let r=Tt.merge({},t,e),o=r.detail==="quiet"||r.detail==="default"||r.detail==="verbose"?r.detail:t.detail;return{enabled:typeof r.enabled=="boolean"?r.enabled:t.enabled,detail:o}}function ji(e,t){let r=Pt(e,t),o=Tt.merge({},t,e),n=typeof o.directory=="string"?o.directory.trim():"",s=n.length>0&&!n.startsWith("/")&&!n.startsWith("\\")&&!n.split(/[\\/]+/).includes("..");return{...r,directory:s?n:t.directory}}function Mi(e,t){let r=Pt(e,t),o=Tt.merge({},t,e);return{...r,silenceCrudDelete:typeof o.silenceCrudDelete=="boolean"?o.silenceCrudDelete:t.silenceCrudDelete,silenceRequestBotStartDone:typeof o.silenceRequestBotStartDone=="boolean"?o.silenceRequestBotStartDone:t.silenceRequestBotStartDone}}function We(e){let t=e&&typeof e=="object"?e:{};return{logs:{console:Mi(t.logs?.console,le.logs.console),local:Pt(t.logs?.local,le.logs.local),operation:ji(t.logs?.operation,le.logs.operation),workspace:Pt(t.logs?.workspace,le.logs.workspace)},intermediates:un(t.intermediates,le.intermediates),meta:un(t.meta,le.meta)}}import we from"lodash";import c from"lodash";function ne(e){let t=e?.trim().toLowerCase();if(t)return t==="azure-openai"||t==="azure_openai"||t==="microsoft"?"azure":t==="gemini"||t==="google-generative-ai"?"google":t==="eleven"||t==="eleven-labs"?"elevenlabs":t==="gpt-image"?"openai":t==="claude"?"anthropic":t==="grok"?"xai":t==="byte-dance"||t==="byte_dance"||t==="seedream"?"bytedance":t==="hf"||t==="hugging-face"?"huggingface":t}function se(e,t="llm"){let r=e?.trim().toLowerCase();return t==="tts"||t==="speech"?r?.startsWith("tts-")||r?.startsWith("gpt-4o-mini-tts")?"openai":"elevenlabs":t==="image"?r?.startsWith("gpt-image")||r?.startsWith("dall-e")?"openai":r?.startsWith("grok")?"xai":r?.startsWith("gemini")||r?.startsWith("nano")?"google":r?.startsWith("seedream")?"bytedance":void 0:t==="video"?r?.startsWith("seedance")||r?.startsWith("dreamina")?"bytedance":void 0:r?.startsWith("gemini")||r?.startsWith("nano")?"google":r?.startsWith("azure/")?"azure":r?.startsWith("claude")?"anthropic":r?.startsWith("grok")?"xai":r?.startsWith("seedance")||r?.startsWith("dreamina")?"bytedance":"openai"}function ee(e={}){return c.pickBy(e,t=>t!=null&&t!=="")}function Ft(e={}){let t=c.get(e,"options");return!t||typeof t!="object"||Array.isArray(t)?e:{...t,...e}}function At(e){return typeof e=="string"&&/^\d+x\d+$/i.test(e.trim())}function Ji(e={},t){let r=t==="speech"?"tts":t,o=c.get(e,[`ai-${r}`,"output"]);if(!o||Array.isArray(o)||typeof o!="object")return{};if(r==="image"){let n=Ft(o),s=c.get(n,"imageSize");return ee({task:"image",provider:c.get(n,"provider")??c.get(n,"imageProvider"),model:c.get(n,"model")??c.get(n,"imageModel"),size:c.get(n,"size")??(At(s)?s:void 0),aspectRatio:c.get(n,"aspectRatio")??c.get(n,"imageAspectRatio"),imageSize:c.get(n,"googleImageSize")??c.get(n,"resolution")??c.get(n,"imageResolution")??(At(s)?void 0:s),quality:c.get(n,"quality")??c.get(n,"imageQuality"),outputFormat:c.get(n,"outputFormat")??c.get(n,"imageOutputFormat"),background:c.get(n,"background")??c.get(n,"imageBackground"),moderation:c.get(n,"moderation")??c.get(n,"imageModeration"),n:c.get(n,"n")??c.get(n,"imageN"),outputCompression:c.get(n,"outputCompression")??c.get(n,"imageOutputCompression"),providerOptions:c.get(n,"providerOptions")??c.get(n,"imageProviderOptions"),reference:c.get(n,"reference")??c.get(n,"imageReference"),references:c.get(n,"references")??c.get(n,"imageReferences"),referenceImagePath:c.get(n,"referenceImagePath")??c.get(n,"imageReferencePath"),referenceImagePaths:c.get(n,"referenceImagePaths")??c.get(n,"imageReferencePaths"),referenceType:c.get(n,"referenceType")??c.get(n,"imageReferenceType"),referenceTypes:c.get(n,"referenceTypes")??c.get(n,"imageReferenceTypes")})}if(r==="video"){let n=Ft(o);return ee({task:"video",provider:c.get(n,"provider")??c.get(n,"videoProvider"),model:c.get(n,"model")??c.get(n,"videoModel"),aspectRatio:c.get(n,"aspectRatio")??c.get(n,"videoAspectRatio"),resolution:c.get(n,"resolution")??c.get(n,"videoResolution"),duration:c.get(n,"duration")??c.get(n,"videoDuration"),fps:c.get(n,"fps")??c.get(n,"videoFps"),seed:c.get(n,"seed")??c.get(n,"videoSeed"),reference:c.get(n,"reference"),referenceImagePath:c.get(n,"referenceImagePath"),providerOptions:c.get(n,"providerOptions")??c.get(n,"videoProviderOptions")})}return ee(r==="tts"?{task:"tts",provider:c.get(o,"provider")??c.get(o,"ttsProvider"),model:c.get(o,"model")??c.get(o,"ttsModel"),voiceId:c.get(o,"voiceId"),outputFormat:c.get(o,"outputFormat")??c.get(o,"ttsOutputFormat"),languageCode:c.get(o,"languageCode"),speed:c.get(o,"speed"),instructions:c.get(o,"instructions"),providerOptions:c.get(o,"providerOptions")??c.get(o,"ttsProviderOptions")}:{task:r,provider:c.get(o,"provider")??c.get(o,"llmProvider"),model:c.get(o,"model")??c.get(o,"llmModel"),providerOptions:c.get(o,"providerOptions")??c.get(o,"llmProviderOptions")})}function Bi(e={},t){if(t==="image"){let r=Ft(c.get(e,"image",{})),o=c.get(e,"imageSize")??c.get(r,"imageSize");return ee({task:"image",provider:c.get(e,"imageProvider")??c.get(r,"provider"),model:c.get(e,"imageModel")??c.get(r,"model"),size:c.get(e,"size")??c.get(r,"size")??(At(o)?o:void 0),aspectRatio:c.get(e,"imageAspectRatio")??c.get(r,"aspectRatio"),imageSize:c.get(e,"googleImageSize")??c.get(r,"googleImageSize")??c.get(e,"imageResolution")??c.get(r,"resolution")??(At(o)?void 0:o),quality:c.get(e,"imageQuality")??c.get(r,"quality"),outputFormat:c.get(e,"imageOutputFormat")??c.get(r,"outputFormat"),background:c.get(e,"imageBackground")??c.get(r,"background"),moderation:c.get(e,"imageModeration")??c.get(r,"moderation"),n:c.get(e,"imageN")??c.get(r,"n"),outputCompression:c.get(e,"imageOutputCompression")??c.get(r,"outputCompression"),providerOptions:c.get(e,"imageProviderOptions")??c.get(r,"providerOptions"),reference:c.get(e,"reference")??c.get(e,"imageReference")??c.get(r,"reference")??c.get(r,"imageReference"),references:c.get(e,"references")??c.get(e,"imageReferences")??c.get(r,"references")??c.get(r,"imageReferences"),referenceImagePath:c.get(e,"referenceImagePath")??c.get(e,"imageReferencePath")??c.get(r,"referenceImagePath")??c.get(r,"imageReferencePath"),referenceImagePaths:c.get(e,"referenceImagePaths")??c.get(e,"imageReferencePaths")??c.get(r,"referenceImagePaths")??c.get(r,"imageReferencePaths"),referenceType:c.get(e,"referenceType")??c.get(e,"imageReferenceType")??c.get(r,"referenceType")??c.get(r,"imageReferenceType"),referenceTypes:c.get(e,"referenceTypes")??c.get(e,"imageReferenceTypes")??c.get(r,"referenceTypes")??c.get(r,"imageReferenceTypes")})}if(t==="video"){let r=Ft(c.get(e,"video",{}));return ee({task:"video",provider:c.get(e,"videoProvider")??c.get(r,"provider"),model:c.get(e,"videoModel")??c.get(r,"model"),aspectRatio:c.get(e,"videoAspectRatio")??c.get(r,"aspectRatio"),resolution:c.get(e,"videoResolution")??c.get(r,"resolution"),duration:c.get(e,"videoDuration")??c.get(r,"duration"),fps:c.get(e,"videoFps")??c.get(r,"fps"),seed:c.get(e,"videoSeed")??c.get(r,"seed"),reference:c.get(e,"videoReference")??c.get(r,"reference"),referenceImagePath:c.get(e,"videoReferenceImagePath")??c.get(r,"referenceImagePath"),providerOptions:c.get(e,"videoProviderOptions")??c.get(r,"providerOptions")})}if(t==="tts"||t==="speech"){let r=c.get(e,"tts",c.get(e,"speech",{}));return ee({task:"tts",provider:c.get(e,"ttsProvider")??c.get(e,"speechProvider")??c.get(r,"provider"),model:c.get(e,"ttsModel")??c.get(e,"speechModel")??c.get(r,"model"),voiceId:c.get(e,"voiceId")??c.get(r,"voiceId"),outputFormat:c.get(e,"ttsOutputFormat")??c.get(e,"speechOutputFormat")??c.get(r,"outputFormat"),languageCode:c.get(e,"languageCode")??c.get(r,"languageCode"),speed:c.get(e,"speed")??c.get(r,"speed"),instructions:c.get(e,"instructions")??c.get(r,"instructions"),providerOptions:c.get(e,"ttsProviderOptions")??c.get(e,"speechProviderOptions")??c.get(r,"providerOptions")})}if(t==="transcription"){let r=c.get(e,"transcription",{});return ee({task:"transcription",provider:c.get(e,"transcriptionProvider")??c.get(e,"aiProvider")??c.get(e,"provider")??c.get(r,"provider"),model:c.get(e,"transcriptionModel")??c.get(r,"model"),providerOptions:c.get(e,"transcriptionProviderOptions")??c.get(r,"providerOptions")})}return ee({task:"llm",provider:c.get(e,"llmProvider")??c.get(e,"aiProvider")??c.get(e,"provider"),model:c.get(e,"llmModel")??c.get(e,"model"),providerOptions:c.get(e,"llmProviderOptions")??c.get(e,"providerOptions")})}function Y(e={},t,r={}){let o=c.get(e,"ai",{}),n=t==="speech"?"tts":t,s=c.get(r,"profile")??c.get(e,[`${n}Profile`])??c.get(e,[n,"profile"])??c.get(o,["defaults",n]),i=s?c.get(o,["profiles",s],{}):{},a=c.get(o,n,{}),u=c.merge({},i,a,Bi(e,n),Ji(e,n),ee(r));return u.task=n,u.provider=ne(u.provider),u.provider||(u.provider=se(u.model,n)),ee(u)}var zi={ara:"ar",chi:"zh",deu:"de",dut:"nl",eng:"en",fre:"fr",fra:"fr",ger:"de",heb:"he",ita:"it",jpn:"ja",nld:"nl",por:"pt",rus:"ru",spa:"es",swe:"sv",zho:"zh"};function Nr(e){if(typeof e!="string")return;let t=e.trim().toLowerCase();if(!t)return;let r=t.split("-")[0];return/^[a-z]{2}$/.test(r)?r:zi[t]}function cn(e,t){return Nr(t)??Nr(e.params?.language)??Nr(e.params?.languageCode)}import sa from"node:fs";import Lt from"node:fs";import hn from"lodash";import Ne from"path";import Ui from"chokidar";import Gi from"fs-extra";import{globSync as Vi}from"glob";import pn from"kleur";import{minimatch as Or}from"minimatch";import{dirname as mn,isAbsolute as ln,join as _e}from"node:path";var Ee=["node_modules/**","**/node_modules/**","**/dist/**","**/build/**","**/out/**","**/coverage/**","**/.cache/**","**/.tmp/**","**/tmp/**","**/log.txt"],Em=[...Ee,/(^|[\/\\])\../];import{globSync as qi}from"glob";var Ke=(e,t,r=[])=>qi(t,{cwd:e,ignore:[...Ee,...r],nodir:!0,dot:!1}),kt=(e,t,r=[])=>Ke(e,t,r).length;function Et(e){return e.replace(/\\/g,"/").replace(/^\/+/,"")}function Wi(e,t){let r=Et(t).replace(/\/+$/,"");if(!r||r.startsWith("#")||r.startsWith("!"))return[];let o=Et(t.startsWith("/")?r:_e(e,r));if(!r.includes("/")){let n=Et(_e(e,"**",r));return[o,`${o}/**`,n,`${n}/**`]}return[o,`${o}/**`]}function Ki(e){return Vi("**/.timignore",{cwd:e,nodir:!0,dot:!0,ignore:Ee}).flatMap(r=>{let o=mn(r)==="."?"":mn(r);return Gi.readFileSync(_e(e,r),"utf-8").split(/\r?\n/).map(s=>s.trim()).flatMap(s=>Wi(o,s))})}function Rr(e){let{cwd:t,target:r,watchPaths:o,depth:n,callbacks:s={},createContext:i,ignore:a=[],ignoreLogs:u,silent:p=!1}=e,d=Ki(t),f=[...a,...d],m=d.map(v=>_e(t,v)),h=o?.length?o.map(v=>ln(v)?v:_e(t,v)):[t],y=o?.length?o.reduce((v,T)=>v+kt(ln(T)?T:_e(t,T),"*",f),0):kt(t,r,f),I=Ui.watch(h,{persistent:!0,depth:n,ignored:[...Ee,...f,...m,/(^|[\/\\])\../],ignoreInitial:!0}),A=(v,T)=>i?i(v,T):v,C=v=>Or(Et(v),r),w=v=>{let T=v.replace(/\\/g,"/"),L=T.replace(/^\/+/,"");return f.some(R=>Or(T,R)||Or(L,R))};return I.on("all",(v,T)=>{let L=T.replace(t,""),R=L.endsWith("log.txt");if(u&&R||w(L))return;let U=C(L);e.debug}).on("add",async v=>{let T=v.replace(t,""),L=T.endsWith("log.txt");if(u&&L||w(T))return;let R=C(T);!s.onAdd||!R||(p||console.log(pn.green("File added:"),T),s.onAdd(A(T,"create")))}).on("change",async v=>{let T=v.replace(t,""),L=T.endsWith("log.txt");if(u&&L||w(T))return;let R=C(T);!s.onChange||!R||s.onChange(A(T,"update"))}).on("unlink",async v=>{let T=v.replace(t,""),L=C(T),R=T.endsWith("log.txt");u&&R||w(T)||!s.onUnlink||!L||s.onUnlink(A(T,"delete"))}).on("ready",()=>{p||console.log(pn.magenta("watching:"),y,"files")}),I}import Ye from"node:path";function _t(e,t){let r=t?Ye.dirname(t):e,o=Ye.relative(e,r);if(!o||o==="."||o.startsWith("..")||Ye.isAbsolute(o))return[e];let n=o.split(Ye.sep).filter(Boolean),s=[e];for(let i=1;i<=n.length;i++)s.push(Ye.join(e,...n.slice(0,i)));return s}import Wm from"fs-extra";import{homedir as Yi}from"node:os";import Hi from"node:path";import dn from"lodash";var de=new Map,gn=Symbol.for("tim.resolvedGalleryImports");function Le(e=[]){for(let t of e){if(!t.name||!t.config||typeof t.config!="object")throw new TypeError("Each IO gallery must provide a non-empty name and config object.");de.set(t.name,t);for(let r of t.aliases||[])de.set(r,t)}}function fn(e){return e[gn]??[]}function ge(){return process.env.TIM_PROMPTS_HOME||Hi.join(Yi(),".tim","prompts")}function Xi(e,t){return Object.defineProperty(e,gn,{value:[...t],enumerable:!1,configurable:!0}),e}function Zi(e){let{import:t,...r}=e;return r}function Qi(e){return typeof e=="string"?e.trim()?[e.trim()]:[]:Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.trim()).filter(Boolean):[]}function yn(e,t){if(typeof e=="string"){t(e);return}if(Array.isArray(e))for(let r of e)yn(r,t)}function ea(e){let t=new Set,r=e.triggers;if(!r||typeof r!="object")return t;for(let o of Object.values(r))if(!(!o||typeof o!="object"))for(let n of Object.values(o))yn(n,s=>{de.has(s)&&t.add(s)});return t}function ta(e,t,r){let o=e.config?.triggers?.[t],n=o?.[r];if(typeof n=="string"&&!de.has(n))return n;if(o&&typeof o=="object"){for(let s of Object.values(o))if(typeof s=="string"&&!de.has(s))return s}throw new Error(`IO gallery "${e.name}" does not define an entry command for ${t}.`)}function ra(e){let t=e.triggers;if(!(!t||typeof t!="object")){for(let[r,o]of Object.entries(t))if(!(!o||typeof o!="object"))for(let[n,s]of Object.entries(o))typeof s=="string"&&de.has(s)&&(o[n]=ta(de.get(s),r,n))}}function oa(e,t,r){if(t.has(e))throw new Error(`Circular IO gallery import detected: ${[...t,e].join(" -> ")}`);let o=de.get(e);if(!o)throw new Error(`Unknown IO gallery import: ${e}`);r.add(o.name),t.add(e);let n=pe(o.config,t,r);return t.delete(e),n}function pe(e,t=new Set,r=new Set){if(!e||typeof e!="object")return e;let o=new Set(Qi(e.import));for(let s of ea(e))o.add(s);let n={};for(let s of o)dn.merge(n,oa(s,t,r));return dn.merge(n,Zi(e)),ra(n),Xi(n,r)}function bn(e){return e.file.startsWith("/_requests/")&&e.sessionFull?e.sessionFull:e.fileFull}var Nt=(e,t,r={},o)=>{let n={},{paths:s}=e,{rootFull:i}=s,a=bn(s),u=[];t==="_prompts"&&u.push({dirPath:ge(),fs:{existsSync:Lt.existsSync,readdirSync:Lt.readdirSync,readFileSync:Lt.readFileSync,readJsonSync:p=>JSON.parse(Lt.readFileSync(p,"utf-8"))}}),u.push(..._t(i,a).map(p=>({dirPath:Ne.join(p,t),fs:o})));for(let{dirPath:p,fs:d}of u){if(!d.existsSync(p))continue;let f=d.readdirSync(p).filter(m=>m.endsWith(".md"));for(let m of f){let h=Ne.basename(m),y=Ne.parse(h).name;y.includes(".")&&(y=y.split(".").pop());let I="";I=d.readFileSync(Ne.join(p,m),"utf-8"),I=I.trim().replace(`
7
- `,"");let A=t==="voices"?"voiceId":"promptTemplate";n[y]={[A]:na(I,r)};let C=m.replace(".md",".schema.json"),w=Ne.join(p,C);if(d.existsSync(w)){let v=d.readJsonSync(w);n[y].schema=v}}}return n},vn=(e,t)=>{let r={},o=new Set,{paths:n}=e,{rootFull:s}=n,i=bn(n),a=_t(s,i).map(u=>Ne.join(u,"config.json"));for(let u of a){if(!t.existsSync(u))continue;let p=pe(t.readJsonSync(u),new Set,o);hn.merge(r,p)}return pe(r,new Set,o)};function na(e,t){return e.replace(/\$\{([^}]+)\}/g,(r,o)=>{let n=String(o).trim(),s=hn.get(t,n);return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s,null,2)})}var te=e=>({resolveConfig:t=>vn(t,e),resolveLibrary:(t,r,o={})=>Nt(t,r,o,e),resolvePrompts:(t,r={})=>{let o=fn(t.config||{}),n=ge();if(o.length>0&&!sa.existsSync(n))throw new Error(`IO gallery prompts were not found at ${n}. Run "tim init" to install gallery prompts.`);return Nt(t,"_prompts",r,e)},resolveVoices:t=>Nt(t,"voices",{},e)});var Pe=()=>({prepareTextToTextRequest(e,t){let{promptId:r,inject:o,extra:n}=t,s=te(Q()),i=o??{...e.settings,...e.params,fileContent:e.fileContent?.text},a=s.resolvePrompts(e,i),u=Y(e.settings,"llm",{provider:t.provider,model:t.model,providerOptions:t.providerOptions}),{provider:p,model:d,providerOptions:f}=u,m=we.get(a,[r,"promptTemplate"],""),h=we.get(a,[r,"schema"],{});if(!m)throw new Error(`No prompt template found for promptId: ${r}`);let y={provider:p,model:d,prompt:m,schema:h,providerOptions:f,...n||{}};return we.pickBy(y,I=>I!=null&&I!=="")},prepareTtsRequest(e,t){let{text:r,prompt:o,promptId:n,inject:s}=t,i=te(Q()),a=s??{...e.settings,...e.params,fileContent:e.fileContent?.text};if(n&&!o&&!r){let m=i.resolvePrompts(e,a);o=we.get(m,[n,"promptTemplate"],"")}if(r=(r||o||e.fileContent?.text||"").trim(),!r)throw new Error("No TTS text found in prompt template or source file content.");let u=Y(e.settings,"tts",{provider:t.provider,model:t.model,voiceId:t.voiceId,outputFormat:t.outputFormat,speed:t.speed,instructions:t.instructions,providerOptions:t.providerOptions}),p=u.voiceId||t.voiceId,d=u.model||"eleven_v3",f=cn(e,t.languageCode);return we.pickBy({provider:u.provider,text:r,voiceId:p,model:d,outputFormat:u.outputFormat,speed:u.speed,instructions:u.instructions,providerOptions:u.providerOptions,...t.extra||{},...f?{languageCode:f}:{}},m=>m!=null&&m!=="")},prepareImageRequest(e,t,r={}){let{prompt:o,promptId:n,inject:s}=t,i=Y(e.settings,"image",{provider:t.provider,model:t.model,size:t.size,aspectRatio:t.aspectRatio,imageSize:t.imageSize,quality:t.quality,outputFormat:t.outputFormat,background:t.background,moderation:t.moderation,n:t.n,outputCompression:t.outputCompression,reference:t.reference,references:t.references,referenceImagePath:t.referenceImagePath,referenceImagePaths:t.referenceImagePaths,referenceType:t.referenceType,referenceTypes:t.referenceTypes,providerOptions:t.providerOptions}),a=te(Q()),u=s??{...e.settings,...e.params,fileContent:e.fileContent?.text};if(n&&!o){let d=a.resolvePrompts(e,u);o=we.get(d,[n,"promptTemplate"],"")}if(o||(o=e.fileContent?.text??""),o=(o??"").trim(),!o)throw new Error("No image prompt found in prompt template or source file content.");return we.pickBy({provider:i.provider,model:i.model,prompt:o,size:i.size,aspectRatio:i.aspectRatio,imageSize:i.imageSize,quality:i.quality,outputFormat:i.outputFormat,background:i.background,moderation:i.moderation,n:i.n,outputCompression:i.outputCompression,reference:i.reference,references:i.references,referenceImagePath:i.referenceImagePath,referenceImagePaths:i.referenceImagePaths,referenceType:i.referenceType,referenceTypes:i.referenceTypes,providerOptions:i.providerOptions,...r||{}},d=>d!=null&&d!=="")}});import{createAnthropic as ua}from"@ai-sdk/anthropic";import{createAzure as ca}from"@ai-sdk/azure";import{createByteDance as pa}from"@ai-sdk/bytedance";import{createElevenLabs as ma}from"@ai-sdk/elevenlabs";import{createGoogleGenerativeAI as la}from"@ai-sdk/google";import{createHuggingFace as da}from"@ai-sdk/huggingface";import{createOpenAI as ga}from"@ai-sdk/openai";import{createXai as fa}from"@ai-sdk/xai";import{Output as ya,experimental_generateSpeech as ha,experimental_generateVideo as ba,experimental_transcribe as va,generateImage as Ia,generateText as Ot,jsonSchema as Sa}from"ai";var ie={inputCost:0,cachedInputCost:0,outputCost:0,totalCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0}};var In={currency:"USD",unit:"perMillionTokens",updatedAt:"2026-07-15",providers:{openai:{models:{"gpt-image-1.5":{aliases:["gpt-image-1.5-2025-12-16"],input:5,cachedInput:1.25,output:32},"gpt-image-2":{aliases:["gpt-image-2-2026-04-21"],input:5,cachedInput:1.25,output:30}}},google:{models:{"gemini-2.5-flash-image":{input:.3,cachedInput:0,output:30},"gemini-3-pro-image":{aliases:["gemini-3-pro-image-preview","nano-banana-pro-preview"],input:2,cachedInput:0,output:120}}},bytedance:{models:{}}}};function aa(e,t){let r=In.providers[e.toLowerCase()]?.models;if(!r)return;let o=t.replace(/^models\//,"").toLowerCase();return Object.entries(r).find(([n,s])=>n.toLowerCase()===o||s.aliases?.some(i=>i.toLowerCase()===o))?.[1]}function $r(e,t,r){let o=aa(e,t),n=Number(r?.inputTokens??r?.input_tokens??0),s=Number(r?.outputTokens??r?.output_tokens??0),i=Number(r?.cachedInputTokens??r?.input_tokens_details?.cached_tokens??0);if(!o||!n&&!s)return{...ie,breakdown:{...ie.breakdown,inputTokens:n,cachedTokens:i,billedInputTokens:Math.max(0,n-i),outputTokens:s}};let a=Math.max(0,n-i),u=a*o.input/1e6,p=i*o.cachedInput/1e6,d=s*o.output/1e6;return{inputCost:u,cachedInputCost:p,outputCost:d,totalCost:u+p+d,breakdown:{inputTokens:n,cachedTokens:i,billedInputTokens:a,outputTokens:s,audioTokens:0}}}function Dr(){return ga({apiKey:process.env.OPENAI_API_KEY})}function xn(){return ca({resourceName:process.env.AZURE_OPENAI_RESOURCE_NAME,baseURL:process.env.AZURE_OPENAI_BASE_URL,apiKey:process.env.AZURE_OPENAI_API_KEY||process.env.AZURE_API_KEY,apiVersion:process.env.AZURE_OPENAI_API_VERSION})}function jr(){return la({apiKey:process.env.GOOGLE_API_KEY})}function Cn(){return ma({apiKey:process.env.ELEVENLABS_API_KEY||process.env.ELEVEN_LABS_API_KEY})}function xa(){return ua({apiKey:process.env.ANTHROPIC_API_KEY})}function wn(){return fa({apiKey:process.env.XAI_API_KEY})}function Ca(){return da({apiKey:process.env.HUGGINGFACE_API_KEY||process.env.HF_TOKEN})}function Oe(e,t){try{e?.(t)}catch{}}function wa(e){let t=0;return pa({apiKey:process.env.ARK_API_KEY,fetch:async(r,o)=>{let n=await globalThis.fetch(r,o);if(!n.ok)return n;try{let s=(o?.method||(r instanceof Request?r.method:"GET")).toUpperCase(),i=r instanceof Request?r.url:String(r),a=await n.clone().json();if(s==="POST"&&/\/contents\/generations\/tasks\/?$/.test(i))Oe(e,{phase:"submitted",taskId:typeof a.id=="string"?a.id:void 0});else if(s==="GET"&&/\/contents\/generations\/tasks\//.test(i)){t+=1;let u=typeof a.status=="string"?a.status:"unknown";Oe(e,{phase:u==="succeeded"?"ready":"polling",status:u,taskId:typeof a.id=="string"?a.id:void 0,pollCount:t})}}catch{}return n}})}function Re(e,t){if(!t)throw new Error(`AI provider "${e}" requires an explicit model in settings or request.`);return t}function Mr(e,t){let r=ne(e)||se(t,"llm");if(r==="azure"){let o=Re("azure",t);return{provider:"azure",model:o,sdkModel:xn()(o)}}if(r==="anthropic"){let o=Re("anthropic",t);return{provider:"anthropic",model:o,sdkModel:xa()(o)}}if(r==="xai"){let o=Re("xai",t);return{provider:"xai",model:o,sdkModel:wn()(o)}}if(r==="huggingface"){let o=Re("huggingface",t);return{provider:"huggingface",model:o,sdkModel:Ca()(o)}}if(r==="bytedance")throw new Error("The @ai-sdk/bytedance provider is installed for video generation, but TIM does not have a ByteDance LLM executor yet.");return r==="google"?{provider:"google",model:t||"gemini-2.5-pro",sdkModel:jr()(t||"gemini-2.5-pro")}:{provider:"openai",model:t||"gpt-5.2",sdkModel:Dr()(t||"gpt-5.2")}}function Pa(e,t,r){let o=ne(e)||se(t,"video");if(o!=="bytedance")throw new Error(`AI provider "${o||"unknown"}" is not supported for TIM video generation.`);let n=t||"dreamina-seedance-2-0-260128";return{provider:"bytedance",model:n,sdkModel:wa(r).video(n)}}function Ta(e,t){let r=ne(e)||se(t,"image");if(r==="xai"){let o=Re("xai",t);return{provider:"xai",model:o,sdkModel:wn().image(o)}}if(r==="anthropic"||r==="huggingface"||r==="bytedance")throw new Error(`AI provider "${r}" is not supported for TIM image generation.`);if(r==="google"){let o=Fa(t);return{provider:"google",model:o,sdkModel:jr().image(o)}}return{provider:"openai",model:t||"gpt-image-1",sdkModel:Dr().image(t||"gpt-image-1")}}function Fa(e){let t={FLASH2_5:"gemini-2.5-flash-image",NANO_BANANA_PRO:"nano-banana-pro-preview",GEMINI_3_PRO:"gemini-3-pro-image-preview"};return e?t[e]||e:"gemini-2.5-flash-image"}function Aa(e){let t=Buffer.from(e);return t.subarray(0,3).equals(Buffer.from([255,216,255]))?"image/jpeg":t.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?"image/png":t.subarray(0,4).toString("ascii")==="GIF8"?"image/gif":t.subarray(0,4).toString("ascii")==="RIFF"&&t.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":"image/jpeg"}function ka(e){if(typeof e=="string")return e;let t=Buffer.from(e);return`data:${Aa(t)};base64,${t.toString("base64")}`}async function Ea(e,t){let o=e.providerOptions?.bytedance||e.providerOptions||{},n=o.apiKey||process.env.ARK_API_KEY,s=o.baseURL||process.env.ARK_BASE_URL||"https://ark.ap-southeast.bytepluses.com/api/v3";if(!n)throw new Error("ByteDance image generation requires ARK_API_KEY.");let{apiKey:i,baseURL:a,responseFormat:u,response_format:p,outputFormat:d,output_format:f,...m}=o,h=e.referenceImages?.map(ka),y=await globalThis.fetch(`${s.replace(/\/$/,"")}/images/generations`,{method:"POST",headers:{Authorization:`Bearer ${n}`,"Content-Type":"application/json"},body:JSON.stringify({...m,model:t,prompt:e.prompt,...h?.length?{image:h.length===1?h[0]:h}:{},...e.size||e.imageSize?{size:e.size||e.imageSize}:{},output_format:e.outputFormat||d||f||"jpeg",response_format:u||p||"b64_json"})}),I=await y.json();if(!y.ok)throw new Error(`ByteDance image generation failed (${y.status}): ${I?.error?.message||y.statusText}`);let A=I?.data?.find(w=>w?.b64_json||w?.url);if(!A){let w=I?.data?.find(v=>v?.error)?.error?.message;throw new Error(`ByteDance image generation returned no image${w?`: ${w}`:"."}`)}let C;if(A.b64_json)C=Buffer.from(A.b64_json,"base64");else{let w=await globalThis.fetch(A.url);if(!w.ok)throw new Error(`ByteDance image download failed (${w.status}): ${w.statusText}`);C=Buffer.from(await w.arrayBuffer())}return Ve(e.outputPath,C),{provider:"bytedance",model:I.model||t,usage:I.usage||{},cost:$r("bytedance",I.model||t,I.usage),outputFormat:e.outputFormat||d||f||"jpeg",providerMetadata:{bytedance:{created:I.created,size:A.size}},warnings:[]}}function _a(e,t){return(ne(e)||se(t,"tts"))==="openai"?{provider:"openai",model:t||"tts-1",sdkModel:Dr().speech(t||"tts-1")}:{provider:"elevenlabs",model:t||"eleven_v3",sdkModel:Cn().speech(t||"eleven_v3")}}function La(e,t){let r=ne(e)||se(t,"transcription");if(r==="elevenlabs"){let o=t||"scribe_v2";return{provider:"elevenlabs",model:o,sdkModel:Cn().transcription(o)}}if(r==="azure"){let o=Re("azure",t);return{provider:"azure",model:o,sdkModel:xn().transcription(o)}}if(r!=="google")throw new Error(`AI SDK transcription is only implemented for Google/Gemini, Azure, and ElevenLabs. Received provider "${r||"unknown"}".`);return{provider:"google",model:t||"gemini-2.5-flash",sdkModel:jr()(t||"gemini-2.5-flash")}}function $e(e){let t=Number(e?.inputTokens??e?.input_tokens??0),r=Number(e?.outputTokens??e?.output_tokens??0),o=Number(e?.totalTokens??e?.total_tokens??t+r),n=Number(e?.cachedInputTokens??e?.input_tokens_details?.cached_tokens??e?.cacheCreationInputTokens??0);return{input_tokens:t,input_tokens_details:{cached_tokens:n},output_tokens:r,total_tokens:o}}function Na(e){let n=e.input_tokens_details?.cached_tokens??0,s=Math.max(0,e.input_tokens-n),i=s*125e-8,a=n*125e-9,u=e.output_tokens*1e-5;return{inputCost:i,cachedInputCost:a,outputCost:u,totalCost:i+a+u,breakdown:{inputTokens:e.input_tokens,cachedTokens:n,billedInputTokens:s,outputTokens:e.output_tokens,audioTokens:0}}}function Oa(e,t){let r=t.replace(/^models\//,"").toLowerCase(),o=e.input_tokens,n=e.input_tokens_details?.cached_tokens??0,s=Math.max(0,o-n),i=e.output_tokens,a=.3,u=.03,p=2.5;(r.startsWith("gemini-2.5-pro")||r.startsWith("gemini-3-pro"))&&(a=o>2e5?2.5:1.25,u=o>2e5?.25:.125,p=o>2e5?15:10);let d=s*a/1e6,f=n*u/1e6,m=i*p/1e6;return{inputCost:d,cachedInputCost:f,outputCost:m,totalCost:d+f+m,breakdown:{inputTokens:o,cachedTokens:n,billedInputTokens:s,outputTokens:i,audioTokens:0}}}function Rt(e,t,r){let o=$e(r),n=o.input_tokens_details?.cached_tokens??0;return!o.input_tokens&&!o.output_tokens?ie:e==="google"?Oa(o,t):e==="openai"?Na(o):{...ie,breakdown:{inputTokens:o.input_tokens,cachedTokens:n,billedInputTokens:Math.max(0,o.input_tokens-n),outputTokens:o.output_tokens,audioTokens:0}}}function Sn(e){return!!(e&&typeof e=="object"&&Object.keys(e).length>0)}async function Ra(e){let{provider:t,model:r,sdkModel:o}=Mr(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkLlm: "prompt" is required.');let n=await Ot({model:o,prompt:e.prompt,providerOptions:e.providerOptions,...Sn(e.schema)?{output:ya.object({schema:Sa(e.schema),name:"schema"})}:{}}),s=Sn(e.schema)?n.output:n.text,i=$e(n.usage);return{output:s,usage:i,model:n.response?.modelId||r,provider:t,cost:Rt(t,r,i),providerMetadata:n.providerMetadata,warnings:n.warnings}}async function $a(e){let{provider:t,model:r,sdkModel:o}=Mr(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkText: "prompt" is required.');let n=await Ot({model:o,prompt:e.prompt,providerOptions:e.providerOptions}),s=n.text?.trim();if(!s)throw new Error("llm: Empty text response from model.");let i=$e(n.usage);return{output:s,usage:i,model:n.response?.modelId||r,provider:t,cost:Rt(t,r,i),providerMetadata:n.providerMetadata,warnings:n.warnings}}async function Jr(e){let{provider:t,model:r,sdkModel:o}=Mr(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkVisionText: "prompt" is required.');let n=await Ot({model:o,messages:[{role:"user",content:[{type:"text",text:e.prompt},{type:"image",image:e.image,...e.imageProviderOptions?{providerOptions:e.imageProviderOptions}:{}}]}],providerOptions:e.providerOptions}),s=n.text?.trim();if(!s)throw new Error("llm: Empty text response from model.");let i=$e(n.usage);return{output:s,usage:i,model:n.response?.modelId||r,provider:t,cost:Rt(t,r,i),providerMetadata:n.providerMetadata,warnings:n.warnings}}async function Pn(e){if((ne(e.provider)||se(e.model,"image"))==="bytedance"){if(!e.prompt)throw new Error('generateAiSdkImage: "prompt" is required.');return Ea(e,e.model||"seedream-5-0-260128")}let{provider:r,model:o,sdkModel:n}=Ta(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkImage: "prompt" is required.');let s=e.imageSize,i=r==="google"&&!!(e.aspectRatio||s),a={...e.providerOptions||{},...r==="openai"?{openai:{...e.providerOptions?.openai||{},...e.quality?{quality:e.quality}:{},...e.background?{background:e.background}:{},...e.outputFormat?{outputFormat:e.outputFormat}:{},...typeof e.outputCompression=="number"?{outputCompression:e.outputCompression}:{},...e.moderation?{moderation:e.moderation}:{}}}:{},...i?{google:{...e.providerOptions?.google||{},responseFormat:e.providerOptions?.google?.responseFormat||[{type:"image",...e.aspectRatio?{aspectRatio:e.aspectRatio}:{},...s?{imageSize:s}:{}}]}}:{}},u=await Ia({model:n,prompt:e.referenceImages?.length?{text:e.prompt,images:e.referenceImages}:e.prompt,...e.n?{n:e.n}:{},...e.size&&r!=="google"?{size:e.size}:{},...e.aspectRatio&&!i?{aspectRatio:e.aspectRatio}:{},providerOptions:a}),p=u.image;if(!p)throw new Error("generateAiSdkImage: no image returned.");Ve(e.outputPath,Buffer.from(p.uint8Array));let d=u.providerMetadata?.openai?.images?.[0]?.revisedPrompt;return{provider:r,model:o,usage:u.usage||{},cost:$r(r,o,u.usage),outputFormat:e.outputFormat,revisedPrompt:d,providerMetadata:u.providerMetadata,warnings:u.warnings}}async function Br(e){if(!e.prompt)throw new Error('generateAiSdkVideo: "prompt" is required.');let{provider:t,model:r,sdkModel:o}=Pa(e.provider,e.model,e.onProgress);Oe(e.onProgress,{phase:"preparing"});try{let n=await ba({model:o,prompt:e.referenceImage?{text:e.prompt,image:e.referenceImage}:e.prompt,...e.aspectRatio?{aspectRatio:e.aspectRatio}:{},...e.resolution?{resolution:e.resolution}:{},...typeof e.duration=="number"?{duration:e.duration}:{},...typeof e.fps=="number"?{fps:e.fps}:{},...typeof e.seed=="number"?{seed:e.seed}:{},providerOptions:e.providerOptions}),s=Buffer.from(n.video.uint8Array);return Oe(e.onProgress,{phase:"downloaded",bytes:s.byteLength,mediaType:n.video.mediaType}),Ve(e.outputPath,s),Oe(e.onProgress,{phase:"written",bytes:s.byteLength,mediaType:n.video.mediaType}),{provider:t,model:r,mediaType:n.video.mediaType,providerMetadata:n.providerMetadata,warnings:n.warnings}}catch(n){throw Oe(e.onProgress,{phase:"failed",error:n instanceof Error?n.message:String(n)}),n}}async function Tn(e){let{provider:t,model:r,sdkModel:o}=_a(e.provider,e.model);if(!e.text)throw new Error('generateAiSdkSpeech: "text" is required.');if(!e.voiceId)throw new Error('generateAiSdkSpeech: "voiceId" is required.');let n=await ha({model:o,text:e.text,voice:e.voiceId,...e.outputFormat?{outputFormat:e.outputFormat}:{},...e.languageCode?{language:e.languageCode}:{},...typeof e.speed=="number"?{speed:e.speed}:{},...e.instructions?{instructions:e.instructions}:{},providerOptions:e.providerOptions});return{buffer:Buffer.from(n.audio.uint8Array),provider:t,model:r,voiceId:e.voiceId,outputFormat:n.audio.format||e.outputFormat||"mp3",mediaType:n.audio.mediaType,warnings:n.warnings,providerMetadata:n.providerMetadata}}function Da(e="audio.m4a"){let t=e.toLowerCase();return t.endsWith(".mp3")||t.endsWith(".mpeg")||t.endsWith(".mpga")?"audio/mpeg":t.endsWith(".wav")?"audio/wav":t.endsWith(".ogg")?"audio/ogg":t.endsWith(".webm")?"audio/webm":t.endsWith(".aac")?"audio/aac":t.endsWith(".mp4")||t.endsWith(".m4a")?"audio/mp4":t.endsWith(".flac")?"audio/flac":"audio/mp4"}function ja(e){let t=[e.prompt||"Transcribe the audio accurately. Do not summarize.","Return only the transcript text."];return e.language&&t.push(`The expected language hint is: ${e.language}.`),t.join(`
8
- `)}async function Fn(e){let t=La(e.provider,e.model);if(t.provider!=="google"){let s=await va({model:t.sdkModel,audio:e.audio,providerOptions:e.providerOptions}),i=$e({});return{text:s.text,task:"transcribe",usage:i,model:t.model,provider:t.provider,cost:ie,providerMetadata:s.providerMetadata,warnings:s.warnings}}let r=await Ot({model:t.sdkModel,messages:[{role:"user",content:[{type:"text",text:ja(e)},{type:"file",data:e.audio,filename:e.fileName||"audio.m4a",mediaType:Da(e.fileName)}]}],providerOptions:e.providerOptions}),o=r.text?.trim();if(!o)throw new Error("transcription: Empty text response from model.");let n=$e(r.usage);return{text:o,task:"transcribe",usage:n,model:r.response?.modelId||t.model,provider:t.provider,cost:Rt(t.provider,t.model,n),providerMetadata:r.providerMetadata,warnings:r.warnings}}var zr=Ra,qr=$a;function Ur(e,t){let r=e?.[`ai-${t}`];return!!(r&&typeof r=="object"&&!Array.isArray(r))}function $t(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Ma(e){return Object.fromEntries(Object.entries(e||{}).filter(([,t])=>t!=null&&t!==""))}function kn(e){return`ai-${e}`}function En(e){return String(e??"").trim().replace(/[\\/]/g,"-").replace(/\s+/g,"-").replace(/^\.+|\.+$/g,"")||void 0}function q(e,t){let r=En(t);return r?`${e}.${r}`:e}function Ja(e,t){let r=kn(t);if(!$t(e))throw new Error(`settings must be an object with a "${r}" section.`);let o=e[r];if(!$t(o))throw new Error(`settings.${r} must be an object.`);return o}function An(e,t){if(!$t(e)){let a=t.index===void 0?"output":`output variant at index ${t.index}`;throw new Error(`AI ${a} must be an object.`)}let r=En(e.suffix);if(t.requireSuffix&&!r)throw new Error(`AI output variant at index ${t.index} is missing a suffix.`);let{suffix:o,disabled:n,enabled:s,...i}=e;return{output:Ma(i),suffix:r}}function Ba(e){if(!("output"in e))throw new Error("AI command settings must include an output object or output array.");let{output:t}=e;if(Array.isArray(t)){if(!t.length)throw new Error("AI output array must include at least one variant.");let r=new Set;return t.flatMap((o,n)=>{if(!$t(o))throw new Error(`AI output variant at index ${n} must be an object.`);if(o.disabled===!0||o.enabled===!1)return[];let s=An(o,{index:n,requireSuffix:!0});if(s.suffix&&r.has(s.suffix))throw new Error(`Duplicate AI output suffix: ${s.suffix}`);return s.suffix&&r.add(s.suffix),[s]})}return[An(t,{requireSuffix:!1})]}function $(e,t){let r=Ja(e,t),o=kn(t),{output:n,...s}=r;return Ba(r).map(a=>({commandSettings:s,output:a.output,settings:{...e,[o]:{...s,output:a.output},...s,...a.output},suffix:a.suffix}))}import Gr from"lodash";import za from"openai";import{toFile as _n}from"openai/uploads";var qa={GPT_5_2:"gpt-5.2",GPT_5_1:"gpt-5.1",GPT_5:"gpt-5",GPT_5_MINI:"gpt-5-mini",GPT_5_NANO:"gpt-5-nano",GPT_5_PRO:"gpt-5-pro"},Dt;function jt(){if(Dt)return Dt;let e=process.env.OPENAI_API_KEY;if(!e)throw new Error("OPENAI_API_KEY is not configured");return Dt=new za({apiKey:e}),Dt}var Ua=1.25/1e6,Ga=.125/1e6,Va=10/1e6,Wa=e=>{let t=e.input_tokens_details?.cached_tokens??0,r=e.input_tokens-t,o=r*Ua,n=t*Ga,s=e.output_tokens*Va,i=o+n+s;return{inputCost:o,cachedInputCost:n,outputCost:s,totalCost:i,breakdown:{inputTokens:e.input_tokens,cachedTokens:t,billedInputTokens:r,outputTokens:e.output_tokens,audioTokens:0}}};var Ka=2.5/1e6,Ya=10/1e6,Ln=e=>{let t=e?.usage;if(t?.type==="duration")return{cachedInputCost:0,inputCost:0,totalCost:0,outputCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0,audioSeconds:t.seconds||0}};let r={cachedInputCost:0,inputCost:0,totalCost:0,outputCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0}};try{r.breakdown.inputTokens=Gr.get(e,"usage.input_tokens",0),r.breakdown.outputTokens=Gr.get(e,"usage.output_tokens",0),r.breakdown.audioTokens=Gr.get(e,"usage.input_token_details.audio_tokens",0),r.inputCost=r.breakdown.inputTokens*Ka,r.outputCost=r.breakdown.outputTokens*Ya,r.totalCost=r.inputCost+r.outputCost}catch{}return r};var Nn=async(e,t="audio.m4a",r={},o)=>{let{model:n="gpt-4o-transcribe",prompt:s,language:i}=r,u={file:await _n(e,t),model:n,stream:!0};s&&(u.prompt=s),i&&(u.language=i);let p=await jt().audio.transcriptions.create(u),d="",f;for await(let y of p){if(y.type==="transcript.text.delta"){d+=y.delta||"",o?.({type:"delta",text:d,usage:f});continue}y.type==="transcript.text.done"&&(d=y.text||d,f=y.usage,o?.({type:"done",text:d,usage:f}))}let m={text:d,task:"transcribe",usage:f},h=Ln(m);return{...m,cost:h}},On=async(e,t="audio.mp3",r={},o)=>{let n=typeof r=="function"?{}:r,s=typeof r=="function"?r:o,{model:i="gpt-4o-transcribe-diarize",prompt:a,language:u}=n,d={file:await _n(e,t),model:i,response_format:"diarized_json",chunking_strategy:"auto",stream:!0};a&&(d.prompt=a),u&&(d.language=u);let f=await jt().audio.transcriptions.create(d),m=[],h="",y;for await(let C of f){if(C.type==="transcript.text.segment"){m.push(C),s?.({type:"segment",segment:C,segments:[...m]});continue}if(C.type==="transcript.text.delta"){h+=C.delta||"",s?.({type:"delta",text:h,segments:[...m]});continue}C.type==="transcript.text.done"&&(h=C.text||h,y=C.usage,s?.({type:"done",text:h,usage:y,segments:[...m]}))}let I={text:h,task:"transcribe",duration:m.reduce((C,w)=>Math.max(C,Number(w.end)||0),0),segments:m,usage:y},A=Ln(I);return{...I,cost:A}},Vr=async e=>{let{model:t=qa.GPT_5_2,prompt:r,instructions:o}=e;if(!r)throw new Error('generateConvo: "prompt" is required in settings.');let s=(await jt().conversations.create()).id;if(!s)return{cost:{}};let i={model:t,conversation:s,instructions:r,input:[{role:"user",content:[{type:"input_text",text:r}]}]},a=await jt().responses.create(i),u=a.output_text??a.output?.[0]?.content?.[0]?.text;if(!u)throw new Error("llm: Empty text response from model.");let p=u,d=a.usage,f=Wa(d)??{};return{output:p,cost:f,conversationId:s}};import Rn from"lodash";import Wr from"path";function $n(e){return ne(e)}function Dn(e){return se(e,"image")}function O(e,t){let r=t.replace(/^image/,""),o=r?r.charAt(0).toLowerCase()+r.slice(1):t;return Rn.get(e,t)??Rn.get(e,["image",o])}function Ha(e){let t=e?.toLowerCase();return!t||t==="jpeg"?"jpg":t==="jpg"||t==="png"||t==="webp"?t:"jpg"}function He(...e){let t=[];for(let r of e){if(Array.isArray(r)){t.push(...He(...r));continue}let o=typeof r=="string"?r.trim():"";o&&t.push(o)}return t}function jn(e){return/^https?:\/\//i.test(e)||/^data:/i.test(e)}function Xa(e={},t={},r=process.cwd()){let o=He(e.referenceImagePath,e.referenceImagePaths,e.reference,e.references),n=He(O(t,"imageReferencePath"),O(t,"imageReferencePaths"),O(t,"reference"),O(t,"references")),s=o.length?o:n;return[...new Set(s)].map(i=>jn(i)||Wr.isAbsolute(i)?i:Wr.resolve(r,i))}function Za(e){return e.map(t=>{if(jn(t))return t;if(!M(t))throw new Error(`genai.images: reference image not found: ${t}`);return D(t)})}function Qa(e={},t={}){let r=He(e.referenceType,e.referenceTypes),o=He(O(t,"imageReferenceType"),O(t,"imageReferenceTypes"),O(t,"referenceType"),O(t,"referenceTypes"));return r.length?r:o}var eu={style:"Use the reference image for visual style: rendering language, palette, materials, lighting, texture, and mood. Do not copy its subject unless the prompt explicitly asks.",character:"Use the reference image for character identity and design: preserve recognizable features, proportions, clothing cues, and personality while following the prompt.",environment:"Use the reference image for the environment: preserve the location, spatial layout, architecture, background cues, materials, and atmosphere while following the prompt.",object:"Use the reference image for the object or product: preserve its shape, structure, material cues, scale, and distinctive details while following the prompt.",composition:"Use the reference image for composition: camera angle, framing, layout, depth, subject placement, and visual hierarchy.",palette:"Use the reference image for palette and material language: colors, contrast, surface qualities, and overall color temperature.",lighting:"Use the reference image for lighting: direction, softness, contrast, time of day, shadow character, and mood.",scenario:"Use the reference image for scenario: preserve the depicted situation, relationships between elements, activity, and environmental logic while following the prompt.",general:"Use the reference image as a general visual reference while following the prompt."};function tu(e,t){if(!t.length)return e;let r=[...new Set(t)].map(o=>{let n=o.trim().toLowerCase();return eu[n]||`Use the reference image as a ${o} reference.`});return`${e}
2
+ import Fe from"node:fs";import Bi from"node:path";import vc from"node:readline/promises";import{Writable as Ic}from"node:stream";import{Command as Sc}from"commander";import{minimatch as vt}from"minimatch";import P from"path";import Wi from"fs-extra";var Ki=Wi;function N(){return Ki}var qo=()=>({existsSync:e=>N().existsSync(e),readdirSync:e=>N().readdirSync(e),readFileSync:((e,t)=>N().readFileSync(e,t)),readJsonSync:e=>N().readJsonSync(e)});var Hi=Symbol.for("tim-core.runtime-state"),Yi=globalThis,ct=Yi[Hi]??={logger:null,root:""},Uo=e=>{ct.root=e},ae=()=>ct.root;var Go=e=>{ct.logger=e},xr=()=>ct.logger;var Xi=["console"],Zi=(e,t,r,o)=>typeof e=="string"?{message:e,level:t,source:r,data:o}:{...e,level:e.level??t,source:e.source??r,data:e.data??o},Vo=(e={})=>{let t=e.transports?.length?e.transports:Xi,r=!1,o=async(c,l)=>{let d=Zi(c,"info",e.source,l),m=d.level??"info",h={...d,level:m},y=[];t.includes("console")&&(m==="error"?console.error:m==="warn"?console.warn:console.log)(h),t.includes("custom")&&(e.addLog?y.push(Promise.resolve(e.addLog(h))):r||(r=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))),y.length&&await Promise.all(y)};return{log:o,debug:async(c,l)=>o({message:c,level:"debug",data:l,source:e.source}),info:async(c,l)=>o({message:c,level:"info",data:l,source:e.source}),warn:async(c,l)=>o({message:c,level:"warn",data:l,source:e.source}),error:async(c,l)=>o({message:c,level:"error",data:l,source:e.source}),clearLogs:async()=>{}}},kc=Vo();import C from"kleur";import*as pe from"node:fs/promises";import*as dt from"node:path";import*as Cr from"node:util";import{createLogger as es,transports as Ko,format as ve}from"winston";import ts from"winston-transport";var Wo={aspectRatio:"gray",bot:"pink",configuredDirectoriesCount:"yellow",cost:"pink",dimensions:"gray",duration:"yellow",file:"gray",format:"gray",message:"white",model:"gray",operation:"gray",outputCount:"gray",outputSize:"gray",promptId:"pink",promptLabel:"white",quality:"gray",systemProviders:"cyan",systemVersion:"cyan",tokens:"gray",voice:"gray",workingDirectory:"cyan"};function lt(e){if(e===void 0)return e;if(Array.isArray(e))return e.filter(r=>r!==void 0).map(r=>lt(r));if(e&&typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))o!==void 0&&(t[r]=lt(o));return t}return e}var rs=Symbol.for("message"),os=e=>{if(!e||typeof e!="object")return;let t=e.logPath;return typeof t=="string"&&t.length?t:void 0},wr=class extends ts{defaultLogPath;ensuredDirs=new Set;lineFormat;constructor({defaultLogPath:t,format:r}){super(),this.defaultLogPath=t,this.lineFormat=r}log(t,r){setImmediate(()=>this.emit("logged",t));let o=os(t.logEvent?.data)??this.defaultLogPath;if(!o){r();return}(async()=>{let i=dt.dirname(o);this.ensuredDirs.has(i)||(this.ensuredDirs.add(i),await pe.mkdir(i,{recursive:!0}).catch(()=>{}));let s=this.lineFormat.transform({...t},this.lineFormat.options??{}),a=s[rs]??s.message??"";await pe.appendFile(o,`${a}
3
+ `,"utf8")})().catch(i=>{let s=i instanceof Error?i.message:Cr.format("%o",i);console.warn("[tim-logger] Failed to write log file",{logPath:o,error:s})}).finally(r)}},ns=ve.combine(ve.timestamp({format:()=>new Date().toISOString()}),ve.printf(e=>{let t=e.logEvent??{},r=e.timestamp??new Date().toISOString(),o=String(t.source??"LOG"),n=String(t.message??e.message??""),i=Ho(t.data),s=i&&typeof i=="object"&&Object.keys(i).length?` | ${JSON.stringify(i)}`:"";return`[${r}] ${o.padStart(12)}: ${n}${s}`})),is=["console"],ss=(e,t,r,o)=>typeof e=="string"?{message:e,level:t,source:r,data:o}:{...e,level:e.level??t,source:e.source??r,data:e.data??o},as=e=>{if(!e)return"";try{return JSON.stringify(e)}catch{return"[unserializable data]"}},ps=e=>e==null?!1:typeof e!="object"||Array.isArray(e)?!0:Object.keys(e).length>0;function Ho(e){if(!e||typeof e!="object"||Array.isArray(e)||!("logPath"in e))return e;let{logPath:t,...r}=e;return r}function gt(e,t){return e==="verbose"?!0:e==="quiet"?t.level==="error"||t.level==="warn":t.level!=="debug"}var Yo=e=>typeof e!="number"?"":e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}s`:`${e}ms`;var k=(e,t,r=!1)=>{let o=String(t??""),n=Wo[e],i=n==="blue"?C.blue:n==="cyan"?C.cyan:n==="green"?C.green:n==="red"?C.red:n==="yellow"?C.yellow:n==="pink"?C.magenta:n==="white"?C.white:n==="gray"?C.gray:C.white;return r?i().bold(o):i(o)},us=e=>{if(!e.operationId)return"";let t=e.operationId;return e.operationLogPath?`\x1B]8;;${`file://${encodeURI(e.operationLogPath)}`}\x07${C.underline(k("operation",t))}\x1B]8;;\x07`:k("operation",t)},cs=e=>e.split(" \xB7 ").map((t,r)=>r===0&&t.startsWith("Created ")?`Created ${k("file",t.slice(8),!0)}`:t.startsWith("$")?k("cost",t,!0):/\btokens?\b/i.test(t)?k("tokens",t,!0):t.includes("\xD7")?k("dimensions",t,!0):/^(?:generated|media)\s+/i.test(t)||/\d(?:\.\d+)?s\b/.test(t)?k("duration",t,!0):/\b(?:B|KB|MB|GB)\b/.test(t)?k("outputSize",t,!0):t.includes("/")?k("model",t,!0):k("message",t,!0)).join(C.gray(" \xB7 ")),Ie=e=>e&&typeof e=="object"&&!Array.isArray(e)?e:{},ms=e=>typeof e!="number"||!Number.isFinite(e)||e<0?"":e<1024?`${e} B`:e<1024**2?`${(e/1024).toFixed(e>=100*1024?0:1)} KB`:`${(e/1024**2).toFixed(e>=100*1024**2?0:1)} MB`,Xo=e=>{if(typeof e=="number"&&Number.isFinite(e))return e;let t=Ie(e);for(let r of["totalCost","costUSD","total","usd"])if(typeof t[r]=="number"&&Number.isFinite(t[r]))return t[r]},ls=e=>{let t=Xo(e);return t===void 0?"":`$${t.toFixed(t<.01?4:2)}`},ds=e=>{let t=Ie(e);for(let n of["totalTokens","total_tokens","totalTokenCount"])if(typeof t[n]=="number"&&Number.isFinite(t[n]))return t[n];let r=t.inputTokens??t.input_tokens??t.promptTokens??t.prompt_tokens,o=t.outputTokens??t.output_tokens??t.completionTokens??t.completion_tokens;return typeof r=="number"||typeof o=="number"?(typeof r=="number"?r:0)+(typeof o=="number"?o:0):void 0},Zo=e=>{let t=Array.isArray(e.outputs)?e.outputs.map(Ie):[];return t.length?t:[e]},gs=e=>[e.provider,e.model].filter(t=>typeof t=="string"&&t.length>0).join("/"),fs=e=>{let t=Ie(e.data),r=Zo(t),o=[...new Set(r.map(gs).filter(Boolean))],n=r[0]??t,i=[];o.length===1?i.push(k("model",o[0],!0)):o.length>1&&i.push(k("model",`${o.length} models`,!0));let s=n.imageSize||n.size||n.resolution;return s&&i.push(k("dimensions",s,!0)),n.quality&&i.push(`${C.gray("quality")} ${k("quality",n.quality,!0)}`),n.aspectRatio&&i.push(k("aspectRatio",n.aspectRatio,!0)),n.voiceId&&i.push(`${C.gray("voice")} ${k("voice",n.voiceId,!0)}`),n.outputFormat&&i.push(k("format",n.outputFormat,!0)),typeof n.mediaDurationSeconds=="number"&&i.push(k("duration",`${n.mediaDurationSeconds}s media`,!0)),r.length>1&&i.push(k("outputCount",`${r.length} outputs`,!0)),i.join(C.gray(" \xB7 "))},ys=e=>{let t=Ie(Ie(e.data).result);if(!Object.keys(t).length)return{target:"",details:""};let r=Zo(t),o=r[0]??t,n=r.reduce((d,m)=>d+(typeof m.outputSizeBytes=="number"?m.outputSizeBytes:0),0),i=r.map(d=>Xo(d.cost)),s=i.some(d=>d!==void 0)?i.reduce((d,m)=>d+(m??0),0):void 0,a=r.reduce((d,m)=>d+(ds(m.usage??m.tokenUsage)??0),0),u=r.length>1?k("outputCount",`${r.length} outputs`,!0):typeof o.outputFileName=="string"?k("file",o.outputFileName,!0):"",c=[];o.width&&o.height?c.push(k("dimensions",`${o.width}\xD7${o.height}`,!0)):o.resolution&&c.push(k("dimensions",o.resolution,!0)),n>0&&c.push(k("outputSize",ms(n),!0)),typeof o.mediaDurationSeconds=="number"&&c.push(k("duration",`${o.mediaDurationSeconds}s media`,!0));let l=ls(s);return l&&c.push(k("cost",l,!0)),a>0&&c.push(k("tokens",`${a.toLocaleString()} tokens`,!0)),{target:u,details:c.join(C.gray(" \xB7 "))}},hs=e=>{let t=e.data&&typeof e.data=="object"&&!Array.isArray(e.data)?e.data:{};if(typeof t.version=="string")return`TIM version ${k("systemVersion",t.version,!0)}`;if(typeof t.root=="string"&&typeof t.configuredDirectories=="number"){let r=t.configuredDirectories;return`Listener started in ${k("workingDirectory",t.root,!0)} with ${k("configuredDirectoriesCount",r,!0)} configured director${r===1?"y":"ies"}`}return typeof t.providers=="string"?`Providers: ${k("systemProviders",t.providers,!0)}`:k("message",e.message??"")},bs=e=>{let t=e.message??"",r=Ie(e.data).promptId;if(typeof r=="string"&&r.length>0){let o=t.indexOf(r);return o>=0?`${k("promptLabel",t.slice(0,o))}${k("promptId",r,!0)}${k("promptLabel",t.slice(o+r.length))}`:`${k("promptLabel",t)} ${C.gray("\xB7 prompt")} ${k("promptId",r,!0)}`}return k("message",t)};function Qo(e,t=""){let r=e.source??"LOG",o=r==="tim-core"||r==="LOG",n=d=>`${C.gray(t)} ${d}`.trimStart(),i=k("bot",e.botName??"unknown-bot",!0),s=k("file",e.fileName??e.filePath??"unknown-file",!0),a=Yo(e.duration),u=us(e),c=u?` ${C.gray("\xB7 op")} ${u}`:"",l=d=>d.padEnd(6);switch(e.kind){case"crud":return`${n(C.cyan().bold("\u25C6"))} ${C.cyan().bold(l("CRUD"))} ${C.cyan(String(e.crudVerb??e.verb??"").toUpperCase())} ${s}`;case"bot-delay":return`${n(C.yellow("\u25F7"))} ${C.yellow().bold(l("WAIT"))} ${i} ${k("duration",a||String(e.message??""),!0)} ${C.gray("\xB7")} ${s}`;case"bot-start":{let d=fs(e);return`${n(C.magenta("\u25B6"))} ${C.magenta().bold(l("START"))} ${i}${d?` ${C.gray("\xB7")} ${d}`:""} ${C.gray("\xB7")} ${s}${c}`}case"bot-step":{let d=e.level==="error"?"ERROR":e.level==="warn"?"WARN":"STEP",m=e.level==="error"?C.red:e.level==="warn"?C.yellow:C.cyan,h=e.level==="error"?C.red("\u2715"):e.level==="warn"?C.yellow("!"):C.cyan("\u2022");return`${n(h)} ${m().bold(d.padEnd(6))} ${i} ${C.gray("\xB7")} ${bs(e)}${a?` ${C.gray("(")}${k("duration",a)}${C.gray(")")}`:""}${c}`}case"bot-output":return`${n(C.green("\u25A3"))} ${C.green().bold(l("OUTPUT"))} ${cs(e.message??"")}`;case"bot-done":{let d=ys(e),m=d.target||s;return`${n(C.green("\u2713"))} ${C.green().bold(l("DONE"))} ${i}${a?` ${k("duration",a,!0)}`:""} ${C.gray("\xB7")} ${m}${d.details?` ${C.gray("\xB7")} ${d.details}`:""}${c}`}case"bot-skip":return`${n(C.gray("\u21B7"))} ${C.gray().bold(l("SKIP"))} ${k("bot",e.botName??"")} ${k("message",e.message??"")}`.trim();case"bot-error":return`${n(C.red("\u2715"))} ${C.red().bold(l("ERROR"))} ${i} ${C.gray("\xB7")} ${s}${c} ${k("message",e.message??"Bot failed")}`;case"system":return`${n(C.blue().bold("\u25C6"))} ${C.blue().bold(l("SYSTEM"))} ${hs(e)}`;default:{let d=String(e.level??"info").toUpperCase(),m=e.level==="error"?C.red:e.level==="warn"?C.yellow:C.cyan,h=ps(e.data)?k("message",` ${as(e.data)}`):"",y=e.level==="error"?C.red("\u2715"):e.level==="warn"?C.yellow("!"):o?C.blue("\u25C6"):C.magenta("\u2022");return`${n(y)} ${m(l(d))} ${k("message",e.message??"")}${h}`}}}var vs=e=>({...e,at:new Date(e.timestamp??Date.now()).toISOString()});function Is(e){let t=e.botName??e.source??"tim",r=e.fileName?` \xB7 ${e.fileName}`:"",o=Yo(e.duration),n=e.operationId?` \xB7 op ${e.operationId}`:"";switch(e.kind){case"bot-delay":return`WAIT ${o} ${t}${r}`;case"bot-start":return`START ${t}${r}${n}`;case"bot-step":return`${e.level==="error"?"ERROR":e.level==="warn"?"WARN":"STEP"} ${t} \xB7 ${e.message}${o?` \xB7 ${o}`:""}${n}`;case"bot-output":return`OUTPUT ${e.message}`;case"bot-skip":return`SKIP ${t}${r} \xB7 ${e.message}`;case"bot-done":return`DONE ${o} ${t}${r}${n}`;case"bot-error":return`ERROR ${t}${r} \xB7 ${e.message}${n}`;default:return`${String(e.level??"info").toUpperCase()} ${e.message}`}}function Pr(e,t,r){for(let o of t){if(!gt(o.detail??"default",e))continue;let n=dt.dirname(o.path);r.ensureDirSync(n);let i=vs(e);if(o.format==="text"){r.appendFileSync(o.path,`${i.at} ${Is(e)}
4
+ `,{encoding:"utf-8"});continue}if(o.format==="jsonl"){r.appendFileSync(o.path,`${JSON.stringify(i)}
5
+ `,{encoding:"utf-8"});continue}let s=r.existsSync(o.path)?r.readJsonSync(o.path):{},a=Array.isArray(s.events)?s.events:[];r.writeJsonSync(o.path,{...s,id:e.operationId,botName:e.botName??s.botName,command:e.data?.command??s.command??e.botName,fileName:e.fileName??s.fileName,filePath:e.filePath??s.filePath,sourceFileName:e.data?.sourceFileName??s.sourceFileName??e.fileName,sourceFilePath:e.data?.sourceFilePath??s.sourceFilePath??e.filePath,startedAt:e.kind==="bot-start"?i.at:s.startedAt??i.at,endedAt:e.kind==="bot-done"||e.kind==="bot-error"?i.at:s.endedAt??null,durationMs:e.duration??s.durationMs??null,status:e.kind==="bot-error"?"error":e.kind==="bot-done"?"done":s.status??"started",phase:e.kind==="bot-error"?"error":e.kind==="bot-done"?"done":s.phase??"started",lastEventAt:i.at,lastMessage:e.message,events:[...a,i]},{spaces:2})}}var Ss=ve.combine(ve.timestamp({format:"HH:mm:ss"}),ve.errors({stack:!0}),ve.printf(e=>{let{timestamp:t,level:r="info",message:o="",stack:n,logEvent:i}=e,s={...i??{},level:i?.level??r,message:i?.message??String(o),data:Ho(i?.data)},a=Qo(s,t);return n?`${a}
6
+ ${n}`:a})),ft=(e={})=>{let t=e.transports?.length?e.transports:is,r=!1,o=[];t.includes("console")&&o.push(new Ko.Console({format:Ss}));let n=e.logPath??e.fsPath??"log.txt";t.includes("fs")&&o.push(new wr({defaultLogPath:n,format:ns}));let i=es({level:"debug",transports:o.length?o:[new Ko.Console]}),s=async(m,h)=>{let y=ss(m,"info",e.source,h),I=y.level??"info",T={...y,level:I,timestamp:y.timestamp??Date.now()};if(i.log({level:I,message:T.message,logEvent:T}),t.includes("custom"))if(e.addLog){let x=lt({...T});await Promise.resolve(e.addLog(x))}else r||(r=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))},a=async(m,h)=>s({message:m,level:"debug",data:h,source:e.source}),u=async(m,h)=>s({message:m,level:"info",data:h,source:e.source}),c=async(m,h)=>s({message:m,level:"warn",data:h,source:e.source});return{log:s,debug:a,info:u,warn:c,error:async(m,h)=>s({message:m,level:"error",data:h,source:e.source}),clearLogs:async(m=()=>!0)=>{if(t.includes("fs"))try{await pe.mkdir(dt.dirname(n),{recursive:!0}).catch(()=>{}),await pe.writeFile(n,"",{flag:"a"}),await pe.truncate(n,0),await u("\u{1F9F9} Logs cleared",{logPath:n})}catch(h){let y=h instanceof Error?h.message:Cr.format("%o",h);await c("Failed to clear logs",{logPath:n,error:y})}t.includes("custom")&&e.clearLogs&&await e.clearLogs(m)}}},Mc=ft();import yt from"node:path";var en=()=>{let e=ft({source:"tim-core",transports:["console"]});return Go(e),e},ht=(e,t={})=>{let r={...t,message:e,level:t.level??"info",timestamp:t.timestamp??Date.now()},o=xr();return o&&o.log(r),r},q=(e,t,r={})=>ht(e,{kind:"diagnostic",level:"error",data:{...r,error:t instanceof Error?t.message:String(t),...t instanceof Error&&t.stack?{stack:t.stack}:{}}});function K(e,t,r={}){let o=yt.resolve(ae()||e.paths.rootFull||process.cwd()),n=t.operationId??e.operationId,i=e.global.logs.operation,s=n&&i.enabled?yt.join(o,i.directory,`${n}.json`):void 0,a=t.botName??e.botName,u={...t,operationId:n,operationLogPath:s,botName:a,fileName:t.fileName??e.fileName,filePath:t.filePath??e.paths.file,source:t.source??(t.kind?.startsWith("bot-")?a:e.botName)??"tim-core",level:t.level??"info",timestamp:t.timestamp??Date.now()},c=e.global.logs.console,l=c.silenceCrudDelete&&u.kind==="crud"&&u.crudVerb==="delete",d=c.silenceRequestBotStartDone&&u.botName?.startsWith("req-")&&(u.kind==="bot-start"||u.kind==="bot-done");if(r.console!==!1&&c.enabled&&!l&&!d&&gt(c.detail,u)){let h=xr();h&&h.log(u)}let m=[];if(r.local!==!1&&e.global.logs.local.enabled){let h=r.localPath??yt.join(e.paths.nodeFull,"log.txt");m.push({path:h,format:"text",detail:e.global.logs.local.detail})}return r.workspace!==!1&&e.global.logs.workspace.enabled&&m.push({path:yt.join(o,"_tim","logs","events.jsonl"),format:"jsonl",detail:e.global.logs.workspace.detail}),r.operation!==!1&&n&&i.enabled&&m.push({path:s,format:"operation",detail:i.detail}),m.length&&Pr(u,m,N()),u}var tn=e=>e.replace(/(\d+)(?=\.\w+$)/,t=>String(Number(t)+1).padStart(t.length,"0"));import xs from"node:crypto";import ws from"node:os";import rn from"node:path";function Cs(e){return xs.createHash("sha1").update(rn.resolve(e)).digest("hex").slice(0,12)}function bt(e){return rn.join(ws.tmpdir(),"tim-core",Cs(e))}var Z=()=>qo(),j=e=>N().existsSync(e);var Ge=e=>N().ensureDirSync(e);var Fr=e=>N().removeSync(e),Ar=(e,t)=>N().copySync(e,t);var xt=e=>N().readJsonSync(e),we=(e,t={})=>{try{return N().existsSync(e)?N().readJsonSync(e):t}catch(r){return q(`Failed to read JSON from ${e}`,r,{filePath:e}),t}},kr=(e,t="utf-8")=>N().readFileSync(e,t),R=e=>N().readFileSync(e),Er=(e,t,r="utf-8")=>N().writeFileSync(e,t,{encoding:r}),_r=(e,t,r=2)=>N().writeJsonSync(e,t,{spaces:r}),Ve=(e,t)=>N().writeFileSync(e,t),wt="_meta",Ps="_temp",on="_done",It="_cleanup",nn=new Set(["_analysis",It,"_partial","_parts","_transcript"]),Ts=new Set(["_analysis",It,on,wt,"_parts","_prompts",Ps,"_transcript"]),Fs=["_partial.","_transcribing.","_transcript."];function As(e){return P.basename(e).endsWith(".meta.json")}function ks(e,t){return e.split(/[\\/]+/).includes(t)}function Ct(e){return e.split(/[\\/]+/).filter(Boolean)}function xe(e){return e.replace(/^\/+|\/+$/g,"").replace(/[^a-z0-9._-]+/gi,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()}function Es(e){return xe(e.paths.file||e.fileName||"source")||"source"}function _s(e){let t=P.dirname(e.paths.file||"");return xe(t==="."?e.paths.node||"node":t)||"node"}function Lr(e){return(e.operationId||"manual").replace(/[^a-z0-9._-]+/gi,"-")}function Ls(e){let[t]=Ct(e);return nn.has(t)}function Ns(e,t){let r=Ct(t),o=xe(r.shift()||"work").replace(/^_+/,"")||"work",n=xe(r.join("__")||P.basename(t)||"file");return`${_s(e)}__${o}__${n}`}function sn(e,t){let r=P.basename(t),o=xe(r),n=xe(e.fileName.replace(/\.[^.]+$/,""));if(!n||o.startsWith(`${n}.`))return o;let s=o.replace(/^_+/,"").replace(/\.meta\.json$/i,""),[a,...u]=s.split("."),c=u.join(".");return a&&c&&xe(c)===n?`${c}.${a}.meta.json`:o}function Os(e,t){let r=sn(e,t);return`${Lr(e)}__${r}`}function St(e){return pn(e,e.global.meta,"meta")}function an(e){return pn(e,e.global.intermediates,"intermediates")}function pn(e,t,r){switch(t.location){case"source":return e.paths.nodeFull;case"source-subdirectory":return P.join(e.paths.nodeFull,t.directory);case"workspace":return P.join(e.paths.rootFull,t.directory);case"none":return P.join(bt(e.paths.rootFull),"_ephemeral",Lr(e),r);default:return P.join(bt(e.paths.rootFull),t.directory)}}function Tr(e,t,r,o){return r.location==="source"||r.location==="source-subdirectory"?P.basename(t):o==="meta"?Os(e,t):Ns(e,t)}function Se(e,t,r={}){let o=Ct(t),n=o[0]===wt?o.slice(1).join("/"):t;if(As(t)){let i=P.join(St(e),Tr(e,n,e.global.meta,"meta"));return r.forWrite?i:Rs(e,n)||i}return Ls(t)?P.join(an(e),Tr(e,t,e.global.intermediates,"intermediates")):P.join(e.paths.nodeFull,t)}function Nr(e,t,r={}){return Se(e,t,r)}function Rs(e,t){let r=N(),o=P.basename(t),n=sn(e,t),i=Es(e),s=St(e),a=P.join(s,Tr(e,t,e.global.meta,"meta"));if(r.existsSync(a))return a;if(r.existsSync(s)){let l=r.readdirSync(s).filter(d=>d.endsWith(`__${n}`)||d.endsWith(`__${o}`)&&d.includes(`__${i}__`)).sort();if(l.length)return P.join(s,l[l.length-1])}let u=P.join(e.paths.nodeFull,wt,o);if(r.existsSync(u))return u;let c=P.join(e.paths.nodeFull,o);return r.existsSync(c)?c:null}function un(e){let t=N(),r=P.join(bt(e.paths.rootFull),"_ephemeral",Lr(e));t.existsSync(r)&&t.removeSync(r)}function $s(e,t){if(!e.existsSync(t))return t;let r=P.dirname(t),o=P.extname(t),n=P.basename(t,o);for(let i=2;i<1e4;i+=1){let s=P.join(r,`${n}.${i}${o}`);if(!e.existsSync(s))return s}return P.join(r,`${n}.${Date.now()}${o}`)}var E=e=>{let t=N();function r(f,g){try{let{paths:v}=e,S=f==="nodeFull"?Se(e,g):P.join(v[f],g);return t.existsSync(S)?t.readJsonSync(S):{}}catch(v){q("File manager failed to read JSON",v,{filePath:g})}}function o(f,g,v){try{let{paths:S}=e,A=f==="nodeFull"?Se(e,g,{forWrite:!0}):P.join(S[f],g);t.ensureDirSync(P.dirname(A)),t.writeJsonSync(A,v,{spaces:2})}catch(S){q("File manager failed to write JSON",S,{filePath:g})}}function n(f,g,v,S){try{let{paths:A}=e,J=P.join(A[f],`${g}.${S}.json`);t.writeJsonSync(J,v,{spaces:2})}catch(A){q("File manager failed to write AI request",A,{id:g,suffix:S})}}function i(f,g,v){return n(f,g,v,"llm")}function s(f,g,v){return n(f,g,v,"image")}function a(f,g,v){return n(f,g,v,"vision")}function u(f,g,v){return n(f,g,v,"tts")}function c(f,g,v){try{let{paths:S}=e,A=f==="nodeFull"?Se(e,g,{forWrite:!0}):P.join(S[f],g);t.ensureDirSync(P.dirname(A)),t.writeFileSync(A,v)}catch(S){q("File manager failed to write binary file",S,{filePath:g})}}function l(f,g,v){try{let{paths:S}=e,A=f==="nodeFull"?Se(e,g,{forWrite:!0}):P.join(S[f],g);t.ensureDirSync(P.dirname(A)),t.copySync(v,A)}catch(S){q("File manager failed to copy file",S,{filePath:g,sourcePath:v})}}function d(f,g){try{let{paths:v}=e,S=f==="nodeFull"?Se(e,g):P.join(v[f],g);return t.readFileSync(S,"utf-8")}catch(v){q("File manager failed to read binary file",v,{filePath:g})}}function m(f,g){try{let{paths:v}=e,S=P.join(v[f],g);return t.readdirSync(S)}catch(v){return q("File manager failed to read directory",v,{path:g}),[]}}function h(f,g,v){let S=v?P.join(e.paths[f],v):e.paths[f],A=(L,M=!0)=>t.existsSync(L)?t.readdirSync(L).filter(B=>B.endsWith(".json")&&(!M||!g||vt(B,g))).reduce((B,X)=>(B[X]=t.readJsonSync(P.join(L,X)),B),{}):{},J=["workspace","os-temp","none"].includes(e.global.meta.location),V=f==="nodeFull"&&!v&&J?Object.entries(A(St(e),!1)).reduce((L,[M,B])=>{let X=M.split("__").pop()||M;return(!g||vt(X,g)||vt(M,g))&&(L[X]=B),L},{}):{},be=!v&&e.global.meta.location==="source-subdirectory"?A(St(e)):{},W=v?{}:A(P.join(S,wt));return{...A(S),...W,...be,...V}}function y(f){let{paths:g}=e;t.emptyDirSync(g[f])}function I(f,g){let{paths:v}=e,S=P.join(v[f],`${g}.md`);t.existsSync(S)&&t.unlinkSync(S),t.writeFileSync(S,Date.now().toString(),{encoding:"utf-8"})}function T(f,g){let{paths:v}=e,S=P.join(v[f],`${g}.md`);t.existsSync(S)&&t.removeSync(S)}async function x(f,g){I(f,g),T(f,g)}function w(f,g){let{paths:v}=e,S=f==="nodeFull"&&nn.has(Ct(g)[0])?an(e):P.join(v[f],g);t.ensureDirSync(S)}function b(f,g){let{paths:v}=e,S=f==="nodeFull"?Se(e,g):P.join(v[f],g);return t.existsSync(S)}function F(){return _(e.fileName)}function _(f){let g=P.join(e.paths.nodeFull,f);if(!g||!t.existsSync(g)||f.split(/[\\/]+/).some(A=>Ts.has(A))||Fs.some(A=>P.basename(f).startsWith(A))||f==="config.json"||f==="log.txt")return null;let v=P.join(e.paths.nodeFull,on),S=$s(t,P.join(v,P.basename(f)));return t.ensureDirSync(v),t.copySync(g,S),t.removeSync(g),S}function $(f,g){let v=g.startsWith(".")?g:`.${g}`,S=P.extname(f);return S?f.slice(0,-S.length)+v:`${f}${v}`}function G(f){let g=e.config||{};return(g.cleanUp||g.cleanup||{})?.[f]||null}function Ae(f){let g=[],v=new Set;for(let S of f){let A=G(S);if(!A)continue;let J=[],V=(L,M)=>{let B=`move-to-done:${L}`;if(v.has(B))return;v.add(B);let X=_(L);J.push({action:"move-to-done",reason:M,fileName:L,status:X?"moved":"skipped",donePath:X})},be=(L,M)=>{let B=`delete:${L}`;if(v.has(B))return;v.add(B);let X=P.join(e.paths.nodeFull,L);if(!t.existsSync(X)){J.push({action:"delete",reason:M,fileName:L,status:"missing"});return}t.removeSync(X),J.push({action:"delete",reason:M,fileName:L,status:"deleted"})},W=(L,M)=>{if(A.verb==="done"){V(L,M);return}A.verb==="delete"&&be(L,M)};W(e.fileName,"trigger");for(let L of Array.isArray(A.additionalExt)?A.additionalExt:[])W($(e.fileName,L),`additionalExt:${L}`);for(let L of Array.isArray(A.additionalFiles)?A.additionalFiles:[])W(L,"additionalFiles");g.push({commandName:S,policy:A,actions:J})}return g}function he(f,g,v){if(!v.length)return null;let S=g.replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase(),A=P.join(It,`${f}.${S}.cleanup.json`);return o("nodeFull",A,{botName:f,sourceFileName:g,createdAt:Date.now(),actions:v}),A}function ut(f){let g=P.join(e.paths.nodeFull,It);if(!t.existsSync(g))return[];let v=[],S=t.readdirSync(g).filter(A=>A.endsWith(".cleanup.json")).sort();for(let A of S){let J=P.join(g,A),V=t.readJsonSync(J);if(V.sourceFileName&&V.sourceFileName!==f)continue;let be=Array.isArray(V.actions)?V.actions:[],W=[];for(let L of be){if(!L?.fileName||ks(L.fileName,".."))continue;let M=P.join(e.paths.nodeFull,L.fileName);if(!t.existsSync(M)){W.push({...L,status:"missing"});continue}if(L.action==="move-to-done"){let B=_(L.fileName);W.push({...L,status:B?"moved":"skipped",donePath:B});continue}L.action==="delete"&&(t.removeSync(M),W.push({...L,status:"deleted"}))}t.removeSync(J),v.push({manifestFileName:A,botName:V.botName,sourceFileName:V.sourceFileName,actions:W})}return v}function Ji(f,g){for(let v in g)c(f,v,g[v])}function zi(f,g,v){let S=g.replace(/\.[^.]+$/,".meta.json"),A=g.replace(/\.[^.]+$/,".txt"),{usage:J,cost:V,model:be,duration:W}=v||{};return o(f,S,{model:be,usage:J,cost:V,duration:W,sourceFileName:g,outputFileName:A}),S}function Bo(f){let{paths:g}=e,v=g[f];return t.existsSync(v)||(v=P.dirname(g.fileFull)),t.existsSync(v)?P.join(v,"log.txt"):null}function Jo(f,g={}){let v=g.type==="error"?"error":g.type==="warn"?"warn":"info";return{kind:g.type==="skip"?"bot-skip":g.type==="output"?"bot-output":"bot-step",level:v,message:f,data:g.data,duration:g.duration}}function qi(f,g,v={}){let S=Bo(f);S&&K(e,Jo(g,v),{console:!1,local:!0,localPath:S,operation:!1,workspace:!1})}function Ui(f,g,v={}){let S=Bo(f);K(e,Jo(g,v),{local:!!S,localPath:S??void 0,operation:!0,workspace:!0})}function Gi(f,g,v){let A={...r(f,g),...v};return o(f,g,A)}function zo(f,g=""){let{paths:v}=e,S=v[f];return g&&(S=P.join(S,g)),t.readdirSync(S)}function Vi(f,g,v){let S=zo(f,v).filter(J=>!g||vt(J,g));if(S.length===0)return null;S.sort();let A=S.pop();return A?tn(A):null}return{nodeFull:e.paths.nodeFull,readFile:f=>t.readJsonSync(`${ae()}${f}`),node:{read:f=>f.endsWith(".json")?r("nodeFull",f):d("nodeFull",f),write:(f,g)=>f.endsWith(".json")?o("nodeFull",f,g):typeof g=="string"&&P.isAbsolute(g)&&t.existsSync(g)?l("nodeFull",f,g):c("nodeFull",f,g),patch:(f,g)=>Gi("nodeFull",f,g),writeTextToTextRequest:(f,g)=>i("nodeFull",f,g),writeImageRequest:(f,g)=>s("nodeFull",f,g),writeVisionRequest:(f,g)=>a("nodeFull",f,g),writeTtsRequest:(f,g)=>u("nodeFull",f,g),removeCheckpoint:f=>T("nodeFull",f),recycleCheckpoint:f=>x("nodeFull",f),readDir:f=>m("nodeFull",f),readDirJsons:(f,g)=>h("nodeFull",f,g),ensureDir:f=>w("nodeFull",f),emptyDir:()=>y("nodeFull"),exists:f=>b("nodeFull",f),writeByFile:f=>Ji("nodeFull",f),saveMeta:(f,g)=>zi("nodeFull",f,g),listFiles:()=>zo("nodeFull"),addToLog:(f,g={})=>Ui("nodeFull",f,g),addToLocalLog:(f,g={})=>qi("nodeFull",f,g),generateMd:f=>I("nodeFull",f),getNextFile:(f,g)=>Vi("nodeFull",f,g),moveInputFileToDone:F,applyCleanupPolicy:Ae,writeCleanupManifest:he,applyCleanupManifests:ut}}};import Tt from"lodash";var me={logs:{console:{enabled:!0,detail:"default",silenceCrudDelete:!0,silenceRequestBotStartDone:!0},local:{enabled:!0,detail:"default"},operation:{enabled:!0,detail:"verbose",directory:"_tim/operations"},workspace:{enabled:!0,detail:"default"}},intermediates:{location:"os-temp",directory:"_temp"},meta:{location:"workspace",directory:"_meta"}},Ds=new Set(["source","source-subdirectory","workspace","os-temp","none"]);function cn(e,t){let r=Tt.merge({},t,e),o=typeof r.directory=="string"?r.directory.trim():"",n=o.length>0&&!o.startsWith("/")&&!o.startsWith("\\")&&!o.split(/[\\/]+/).includes("..");return{location:Ds.has(r.location)?r.location:t.location,directory:n?o:t.directory}}function Pt(e,t){let r=Tt.merge({},t,e),o=r.detail==="quiet"||r.detail==="default"||r.detail==="verbose"?r.detail:t.detail;return{enabled:typeof r.enabled=="boolean"?r.enabled:t.enabled,detail:o}}function js(e,t){let r=Pt(e,t),o=Tt.merge({},t,e),n=typeof o.directory=="string"?o.directory.trim():"",i=n.length>0&&!n.startsWith("/")&&!n.startsWith("\\")&&!n.split(/[\\/]+/).includes("..");return{...r,directory:i?n:t.directory}}function Ms(e,t){let r=Pt(e,t),o=Tt.merge({},t,e);return{...r,silenceCrudDelete:typeof o.silenceCrudDelete=="boolean"?o.silenceCrudDelete:t.silenceCrudDelete,silenceRequestBotStartDone:typeof o.silenceRequestBotStartDone=="boolean"?o.silenceRequestBotStartDone:t.silenceRequestBotStartDone}}function We(e){let t=e&&typeof e=="object"?e:{};return{logs:{console:Ms(t.logs?.console,me.logs.console),local:Pt(t.logs?.local,me.logs.local),operation:js(t.logs?.operation,me.logs.operation),workspace:Pt(t.logs?.workspace,me.logs.workspace)},intermediates:cn(t.intermediates,me.intermediates),meta:cn(t.meta,me.meta)}}import Ce from"lodash";import p from"lodash";function re(e){let t=e?.trim().toLowerCase();if(t)return t==="azure-openai"||t==="azure_openai"||t==="microsoft"?"azure":t==="gemini"||t==="google-generative-ai"?"google":t==="eleven"||t==="eleven-labs"?"elevenlabs":t==="gpt-image"?"openai":t==="claude"?"anthropic":t==="grok"?"xai":t==="byte-dance"||t==="byte_dance"||t==="seedream"?"bytedance":t==="hf"||t==="hugging-face"?"huggingface":t}function oe(e,t="llm"){let r=e?.trim().toLowerCase();return t==="tts"||t==="speech"?r?.startsWith("tts-")||r?.startsWith("gpt-4o-mini-tts")?"openai":"elevenlabs":t==="image"?r?.startsWith("gpt-image")||r?.startsWith("dall-e")?"openai":r?.startsWith("grok")?"xai":r?.startsWith("gemini")||r?.startsWith("nano")?"google":r?.startsWith("seedream")?"bytedance":void 0:t==="video"?r?.startsWith("seedance")||r?.startsWith("dreamina")?"bytedance":void 0:r?.startsWith("gemini")||r?.startsWith("nano")?"google":r?.startsWith("azure/")?"azure":r?.startsWith("claude")?"anthropic":r?.startsWith("grok")?"xai":r?.startsWith("seedance")||r?.startsWith("dreamina")?"bytedance":"openai"}function Q(e={}){return p.pickBy(e,t=>t!=null&&t!=="")}function Ft(e={}){let t=p.get(e,"options");return!t||typeof t!="object"||Array.isArray(t)?e:{...t,...e}}function At(e){return typeof e=="string"&&/^\d+x\d+$/i.test(e.trim())}function Bs(e={},t){let r=t==="speech"?"tts":t,o=p.get(e,[`ai-${r}`,"output"]);if(!o||Array.isArray(o)||typeof o!="object")return{};if(r==="image"){let n=Ft(o),i=p.get(n,"imageSize");return Q({task:"image",provider:p.get(n,"provider")??p.get(n,"imageProvider"),model:p.get(n,"model")??p.get(n,"imageModel"),size:p.get(n,"size")??(At(i)?i:void 0),aspectRatio:p.get(n,"aspectRatio")??p.get(n,"imageAspectRatio"),imageSize:p.get(n,"googleImageSize")??p.get(n,"resolution")??p.get(n,"imageResolution")??(At(i)?void 0:i),quality:p.get(n,"quality")??p.get(n,"imageQuality"),outputFormat:p.get(n,"outputFormat")??p.get(n,"imageOutputFormat"),background:p.get(n,"background")??p.get(n,"imageBackground"),moderation:p.get(n,"moderation")??p.get(n,"imageModeration"),n:p.get(n,"n")??p.get(n,"imageN"),outputCompression:p.get(n,"outputCompression")??p.get(n,"imageOutputCompression"),providerOptions:p.get(n,"providerOptions")??p.get(n,"imageProviderOptions"),reference:p.get(n,"reference")??p.get(n,"imageReference"),references:p.get(n,"references")??p.get(n,"imageReferences"),referenceImagePath:p.get(n,"referenceImagePath")??p.get(n,"imageReferencePath"),referenceImagePaths:p.get(n,"referenceImagePaths")??p.get(n,"imageReferencePaths"),referenceType:p.get(n,"referenceType")??p.get(n,"imageReferenceType"),referenceTypes:p.get(n,"referenceTypes")??p.get(n,"imageReferenceTypes")})}if(r==="video"){let n=Ft(o);return Q({task:"video",provider:p.get(n,"provider")??p.get(n,"videoProvider"),model:p.get(n,"model")??p.get(n,"videoModel"),aspectRatio:p.get(n,"aspectRatio")??p.get(n,"videoAspectRatio"),resolution:p.get(n,"resolution")??p.get(n,"videoResolution"),duration:p.get(n,"duration")??p.get(n,"videoDuration"),fps:p.get(n,"fps")??p.get(n,"videoFps"),seed:p.get(n,"seed")??p.get(n,"videoSeed"),reference:p.get(n,"reference"),referenceImagePath:p.get(n,"referenceImagePath"),providerOptions:p.get(n,"providerOptions")??p.get(n,"videoProviderOptions")})}return Q(r==="tts"?{task:"tts",provider:p.get(o,"provider")??p.get(o,"ttsProvider"),model:p.get(o,"model")??p.get(o,"ttsModel"),voiceId:p.get(o,"voiceId"),outputFormat:p.get(o,"outputFormat")??p.get(o,"ttsOutputFormat"),languageCode:p.get(o,"languageCode"),speed:p.get(o,"speed"),instructions:p.get(o,"instructions"),providerOptions:p.get(o,"providerOptions")??p.get(o,"ttsProviderOptions")}:{task:r,provider:p.get(o,"provider")??p.get(o,"llmProvider"),model:p.get(o,"model")??p.get(o,"llmModel"),providerOptions:p.get(o,"providerOptions")??p.get(o,"llmProviderOptions")})}function Js(e={},t){if(t==="image"){let r=Ft(p.get(e,"image",{})),o=p.get(e,"imageSize")??p.get(r,"imageSize");return Q({task:"image",provider:p.get(e,"imageProvider")??p.get(r,"provider"),model:p.get(e,"imageModel")??p.get(r,"model"),size:p.get(e,"size")??p.get(r,"size")??(At(o)?o:void 0),aspectRatio:p.get(e,"imageAspectRatio")??p.get(r,"aspectRatio"),imageSize:p.get(e,"googleImageSize")??p.get(r,"googleImageSize")??p.get(e,"imageResolution")??p.get(r,"resolution")??(At(o)?void 0:o),quality:p.get(e,"imageQuality")??p.get(r,"quality"),outputFormat:p.get(e,"imageOutputFormat")??p.get(r,"outputFormat"),background:p.get(e,"imageBackground")??p.get(r,"background"),moderation:p.get(e,"imageModeration")??p.get(r,"moderation"),n:p.get(e,"imageN")??p.get(r,"n"),outputCompression:p.get(e,"imageOutputCompression")??p.get(r,"outputCompression"),providerOptions:p.get(e,"imageProviderOptions")??p.get(r,"providerOptions"),reference:p.get(e,"reference")??p.get(e,"imageReference")??p.get(r,"reference")??p.get(r,"imageReference"),references:p.get(e,"references")??p.get(e,"imageReferences")??p.get(r,"references")??p.get(r,"imageReferences"),referenceImagePath:p.get(e,"referenceImagePath")??p.get(e,"imageReferencePath")??p.get(r,"referenceImagePath")??p.get(r,"imageReferencePath"),referenceImagePaths:p.get(e,"referenceImagePaths")??p.get(e,"imageReferencePaths")??p.get(r,"referenceImagePaths")??p.get(r,"imageReferencePaths"),referenceType:p.get(e,"referenceType")??p.get(e,"imageReferenceType")??p.get(r,"referenceType")??p.get(r,"imageReferenceType"),referenceTypes:p.get(e,"referenceTypes")??p.get(e,"imageReferenceTypes")??p.get(r,"referenceTypes")??p.get(r,"imageReferenceTypes")})}if(t==="video"){let r=Ft(p.get(e,"video",{}));return Q({task:"video",provider:p.get(e,"videoProvider")??p.get(r,"provider"),model:p.get(e,"videoModel")??p.get(r,"model"),aspectRatio:p.get(e,"videoAspectRatio")??p.get(r,"aspectRatio"),resolution:p.get(e,"videoResolution")??p.get(r,"resolution"),duration:p.get(e,"videoDuration")??p.get(r,"duration"),fps:p.get(e,"videoFps")??p.get(r,"fps"),seed:p.get(e,"videoSeed")??p.get(r,"seed"),reference:p.get(e,"videoReference")??p.get(r,"reference"),referenceImagePath:p.get(e,"videoReferenceImagePath")??p.get(r,"referenceImagePath"),providerOptions:p.get(e,"videoProviderOptions")??p.get(r,"providerOptions")})}if(t==="tts"||t==="speech"){let r=p.get(e,"tts",p.get(e,"speech",{}));return Q({task:"tts",provider:p.get(e,"ttsProvider")??p.get(e,"speechProvider")??p.get(r,"provider"),model:p.get(e,"ttsModel")??p.get(e,"speechModel")??p.get(r,"model"),voiceId:p.get(e,"voiceId")??p.get(r,"voiceId"),outputFormat:p.get(e,"ttsOutputFormat")??p.get(e,"speechOutputFormat")??p.get(r,"outputFormat"),languageCode:p.get(e,"languageCode")??p.get(r,"languageCode"),speed:p.get(e,"speed")??p.get(r,"speed"),instructions:p.get(e,"instructions")??p.get(r,"instructions"),providerOptions:p.get(e,"ttsProviderOptions")??p.get(e,"speechProviderOptions")??p.get(r,"providerOptions")})}if(t==="transcription"){let r=p.get(e,"transcription",{});return Q({task:"transcription",provider:p.get(e,"transcriptionProvider")??p.get(e,"aiProvider")??p.get(e,"provider")??p.get(r,"provider"),model:p.get(e,"transcriptionModel")??p.get(r,"model"),providerOptions:p.get(e,"transcriptionProviderOptions")??p.get(r,"providerOptions")})}return Q({task:"llm",provider:p.get(e,"llmProvider")??p.get(e,"aiProvider")??p.get(e,"provider"),model:p.get(e,"llmModel")??p.get(e,"model"),providerOptions:p.get(e,"llmProviderOptions")??p.get(e,"providerOptions")})}function H(e={},t,r={}){let o=p.get(e,"ai",{}),n=t==="speech"?"tts":t,i=p.get(r,"profile")??p.get(e,[`${n}Profile`])??p.get(e,[n,"profile"])??p.get(o,["defaults",n]),s=i?p.get(o,["profiles",i],{}):{},a=p.get(o,n,{}),u=p.merge({},s,a,Js(e,n),Bs(e,n),Q(r));return u.task=n,u.provider=re(u.provider),u.provider||(u.provider=oe(u.model,n)),Q(u)}var zs={ara:"ar",chi:"zh",deu:"de",dut:"nl",eng:"en",fre:"fr",fra:"fr",ger:"de",heb:"he",ita:"it",jpn:"ja",nld:"nl",por:"pt",rus:"ru",spa:"es",swe:"sv",zho:"zh"};function Or(e){if(typeof e!="string")return;let t=e.trim().toLowerCase();if(!t)return;let r=t.split("-")[0];return/^[a-z]{2}$/.test(r)?r:zs[t]}function mn(e,t){return Or(t)??Or(e.params?.language)??Or(e.params?.languageCode)}import ia from"node:fs";import Lt from"node:fs";import vn from"lodash";import Le from"path";import Us from"chokidar";import Gs from"fs-extra";import{globSync as Vs}from"glob";import ln from"kleur";import{minimatch as Rr}from"minimatch";import{dirname as dn,isAbsolute as gn,join as Ee}from"node:path";var ke=["node_modules/**","**/node_modules/**","**/dist/**","**/build/**","**/out/**","**/coverage/**","**/.cache/**","**/.tmp/**","**/tmp/**","**/log.txt"],_m=[...ke,/(^|[\/\\])\../];import{globSync as qs}from"glob";var Ke=(e,t,r=[])=>qs(t,{cwd:e,ignore:[...ke,...r],nodir:!0,dot:!1}),kt=(e,t,r=[])=>Ke(e,t,r).length;function Et(e){return e.replace(/\\/g,"/").replace(/^\/+/,"")}function Ws(e,t){let r=Et(t).replace(/\/+$/,"");if(!r||r.startsWith("#")||r.startsWith("!"))return[];let o=Et(t.startsWith("/")?r:Ee(e,r));if(!r.includes("/")){let n=Et(Ee(e,"**",r));return[o,`${o}/**`,n,`${n}/**`]}return[o,`${o}/**`]}function Ks(e){return Vs("**/.timignore",{cwd:e,nodir:!0,dot:!0,ignore:ke}).flatMap(r=>{let o=dn(r)==="."?"":dn(r);return Gs.readFileSync(Ee(e,r),"utf-8").split(/\r?\n/).map(i=>i.trim()).flatMap(i=>Ws(o,i))})}function $r(e){let{cwd:t,target:r,watchPaths:o,depth:n,callbacks:i={},createContext:s,ignore:a=[],ignoreLogs:u,silent:c=!1}=e,l=Ks(t),d=[...a,...l],m=l.map(b=>Ee(t,b)),h=o?.length?o.map(b=>gn(b)?b:Ee(t,b)):[t],y=o?.length?o.reduce((b,F)=>b+kt(gn(F)?F:Ee(t,F),"*",d),0):kt(t,r,d),I=Us.watch(h,{persistent:!0,depth:n,ignored:[...ke,...d,...m,/(^|[\/\\])\../],ignoreInitial:!0}),T=(b,F)=>s?s(b,F):b,x=b=>Rr(Et(b),r),w=b=>{let F=b.replace(/\\/g,"/"),_=F.replace(/^\/+/,"");return d.some($=>Rr(F,$)||Rr(_,$))};return I.on("all",(b,F)=>{let _=F.replace(t,""),$=_.endsWith("log.txt");if(u&&$||w(_))return;let G=x(_);e.debug}).on("add",async b=>{let F=b.replace(t,""),_=F.endsWith("log.txt");if(u&&_||w(F))return;let $=x(F);!i.onAdd||!$||(c||console.log(ln.green("File added:"),F),i.onAdd(T(F,"create")))}).on("change",async b=>{let F=b.replace(t,""),_=F.endsWith("log.txt");if(u&&_||w(F))return;let $=x(F);!i.onChange||!$||i.onChange(T(F,"update"))}).on("unlink",async b=>{let F=b.replace(t,""),_=x(F),$=F.endsWith("log.txt");u&&$||w(F)||!i.onUnlink||!_||i.onUnlink(T(F,"delete"))}).on("ready",()=>{c||console.log(ln.magenta("watching:"),y,"files")}),I}import He from"node:path";function _t(e,t){let r=t?He.dirname(t):e,o=He.relative(e,r);if(!o||o==="."||o.startsWith("..")||He.isAbsolute(o))return[e];let n=o.split(He.sep).filter(Boolean),i=[e];for(let s=1;s<=n.length;s++)i.push(He.join(e,...n.slice(0,s)));return i}import Km from"fs-extra";import{homedir as Hs}from"node:os";import Ys from"node:path";import fn from"lodash";var le=new Map,yn=Symbol.for("tim.resolvedGalleryImports");function _e(e=[]){for(let t of e){if(!t.name||!t.config||typeof t.config!="object")throw new TypeError("Each IO gallery must provide a non-empty name and config object.");le.set(t.name,t);for(let r of t.aliases||[])le.set(r,t)}}function hn(e){return e[yn]??[]}function de(){return process.env.TIM_PROMPTS_HOME||Ys.join(Hs(),".tim","prompts")}function Xs(e,t){return Object.defineProperty(e,yn,{value:[...t],enumerable:!1,configurable:!0}),e}function Zs(e){let{import:t,...r}=e;return r}function Qs(e){return typeof e=="string"?e.trim()?[e.trim()]:[]:Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.trim()).filter(Boolean):[]}function bn(e,t){if(typeof e=="string"){t(e);return}if(Array.isArray(e))for(let r of e)bn(r,t)}function ea(e){let t=new Set,r=e.triggers;if(!r||typeof r!="object")return t;for(let o of Object.values(r))if(!(!o||typeof o!="object"))for(let n of Object.values(o))bn(n,i=>{le.has(i)&&t.add(i)});return t}function ta(e,t,r){let o=e.config?.triggers?.[t],n=o?.[r];if(typeof n=="string"&&!le.has(n))return n;if(o&&typeof o=="object"){for(let i of Object.values(o))if(typeof i=="string"&&!le.has(i))return i}throw new Error(`IO gallery "${e.name}" does not define an entry command for ${t}.`)}function ra(e){let t=e.triggers;if(!(!t||typeof t!="object")){for(let[r,o]of Object.entries(t))if(!(!o||typeof o!="object"))for(let[n,i]of Object.entries(o))typeof i=="string"&&le.has(i)&&(o[n]=ta(le.get(i),r,n))}}function oa(e,t,r){if(t.has(e))throw new Error(`Circular IO gallery import detected: ${[...t,e].join(" -> ")}`);let o=le.get(e);if(!o)throw new Error(`Unknown IO gallery import: ${e}`);r.add(o.name),t.add(e);let n=ue(o.config,t,r);return t.delete(e),n}function ue(e,t=new Set,r=new Set){if(!e||typeof e!="object")return e;let o=new Set(Qs(e.import));for(let i of ea(e))o.add(i);let n={};for(let i of o)fn.merge(n,oa(i,t,r));return fn.merge(n,Zs(e)),ra(n),Xs(n,r)}var Nt=(e,t,r={},o)=>{let n={},{paths:i}=e,{rootFull:s}=i,a=i.fileFull,u=[];t==="_prompts"&&u.push({dirPath:de(),fs:{existsSync:Lt.existsSync,readdirSync:Lt.readdirSync,readFileSync:Lt.readFileSync,readJsonSync:c=>JSON.parse(Lt.readFileSync(c,"utf-8"))}}),u.push(..._t(s,a).map(c=>({dirPath:Le.join(c,t),fs:o})));for(let{dirPath:c,fs:l}of u){if(!l.existsSync(c))continue;let d=l.readdirSync(c).filter(m=>m.endsWith(".md"));for(let m of d){let h=Le.basename(m),y=Le.parse(h).name;y.includes(".")&&(y=y.split(".").pop());let I="";I=l.readFileSync(Le.join(c,m),"utf-8"),I=I.trim().replace(`
7
+ `,"");let T=t==="voices"?"voiceId":"promptTemplate";n[y]={[T]:na(I,r)};let x=m.replace(".md",".schema.json"),w=Le.join(c,x);if(l.existsSync(w)){let b=l.readJsonSync(w);n[y].schema=b}}}return n},In=(e,t)=>{let r={},o=new Set,{paths:n}=e,{rootFull:i}=n,s=n.fileFull,a=_t(i,s).map(u=>Le.join(u,"config.json"));for(let u of a){if(!t.existsSync(u))continue;let c=ue(t.readJsonSync(u),new Set,o);vn.merge(r,c)}return ue(r,new Set,o)};function na(e,t){return e.replace(/\$\{([^}]+)\}/g,(r,o)=>{let n=String(o).trim(),i=vn.get(t,n);return i==null?"":typeof i=="string"?i:typeof i=="number"||typeof i=="boolean"?String(i):JSON.stringify(i,null,2)})}var ee=e=>({resolveConfig:t=>In(t,e),resolveLibrary:(t,r,o={})=>Nt(t,r,o,e),resolvePrompts:(t,r={})=>{let o=hn(t.config||{}),n=de();if(o.length>0&&!ia.existsSync(n))throw new Error(`IO gallery prompts were not found at ${n}. Run "tim init" to install gallery prompts.`);return Nt(t,"_prompts",r,e)},resolveVoices:t=>Nt(t,"voices",{},e)});var Ye=()=>({prepareTextToTextRequest(e,t){let{promptId:r,inject:o,extra:n}=t,i=ee(Z()),s=o??{...e.settings,...e.params,fileContent:e.fileContent?.text},a=i.resolvePrompts(e,s),u=H(e.settings,"llm",{provider:t.provider,model:t.model,providerOptions:t.providerOptions}),{provider:c,model:l,providerOptions:d}=u,m=Ce.get(a,[r,"promptTemplate"],""),h=Ce.get(a,[r,"schema"],{});if(!m)throw new Error(`No prompt template found for promptId: ${r}`);let y={provider:c,model:l,prompt:m,schema:h,providerOptions:d,...n||{}};return Ce.pickBy(y,I=>I!=null&&I!=="")},prepareTtsRequest(e,t){let{text:r,prompt:o,promptId:n,inject:i}=t,s=ee(Z()),a=i??{...e.settings,...e.params,fileContent:e.fileContent?.text};if(n&&!o&&!r){let m=s.resolvePrompts(e,a);o=Ce.get(m,[n,"promptTemplate"],"")}if(r=(r||o||e.fileContent?.text||"").trim(),!r)throw new Error("No TTS text found in prompt template or source file content.");let u=H(e.settings,"tts",{provider:t.provider,model:t.model,voiceId:t.voiceId,outputFormat:t.outputFormat,speed:t.speed,instructions:t.instructions,providerOptions:t.providerOptions}),c=u.voiceId||t.voiceId,l=u.model||"eleven_v3",d=mn(e,t.languageCode);return Ce.pickBy({provider:u.provider,text:r,voiceId:c,model:l,outputFormat:u.outputFormat,speed:u.speed,instructions:u.instructions,providerOptions:u.providerOptions,...t.extra||{},...d?{languageCode:d}:{}},m=>m!=null&&m!=="")},prepareImageRequest(e,t,r={}){let{prompt:o,promptId:n,inject:i}=t,s=H(e.settings,"image",{provider:t.provider,model:t.model,size:t.size,aspectRatio:t.aspectRatio,imageSize:t.imageSize,quality:t.quality,outputFormat:t.outputFormat,background:t.background,moderation:t.moderation,n:t.n,outputCompression:t.outputCompression,reference:t.reference,references:t.references,referenceImagePath:t.referenceImagePath,referenceImagePaths:t.referenceImagePaths,referenceType:t.referenceType,referenceTypes:t.referenceTypes,providerOptions:t.providerOptions}),a=ee(Z()),u=i??{...e.settings,...e.params,fileContent:e.fileContent?.text};if(n&&!o){let l=a.resolvePrompts(e,u);o=Ce.get(l,[n,"promptTemplate"],"")}if(o||(o=e.fileContent?.text??""),o=(o??"").trim(),!o)throw new Error("No image prompt found in prompt template or source file content.");return Ce.pickBy({provider:s.provider,model:s.model,prompt:o,size:s.size,aspectRatio:s.aspectRatio,imageSize:s.imageSize,quality:s.quality,outputFormat:s.outputFormat,background:s.background,moderation:s.moderation,n:s.n,outputCompression:s.outputCompression,reference:s.reference,references:s.references,referenceImagePath:s.referenceImagePath,referenceImagePaths:s.referenceImagePaths,referenceType:s.referenceType,referenceTypes:s.referenceTypes,providerOptions:s.providerOptions,...r||{}},l=>l!=null&&l!=="")}});import{createAnthropic as pa}from"@ai-sdk/anthropic";import{createAzure as ua}from"@ai-sdk/azure";import{createByteDance as ca}from"@ai-sdk/bytedance";import{createElevenLabs as ma}from"@ai-sdk/elevenlabs";import{createGoogleGenerativeAI as la}from"@ai-sdk/google";import{createHuggingFace as da}from"@ai-sdk/huggingface";import{createOpenAI as ga}from"@ai-sdk/openai";import{createXai as fa}from"@ai-sdk/xai";import{Output as ya,experimental_generateSpeech as ha,experimental_generateVideo as ba,experimental_transcribe as va,generateImage as Ia,generateText as Ot,jsonSchema as Sa}from"ai";var ne={inputCost:0,cachedInputCost:0,outputCost:0,totalCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0}};var Sn={currency:"USD",unit:"perMillionTokens",updatedAt:"2026-07-15",providers:{openai:{models:{"gpt-image-1.5":{aliases:["gpt-image-1.5-2025-12-16"],input:5,cachedInput:1.25,output:32},"gpt-image-2":{aliases:["gpt-image-2-2026-04-21"],input:5,cachedInput:1.25,output:30}}},google:{models:{"gemini-2.5-flash-image":{input:.3,cachedInput:0,output:30},"gemini-3-pro-image":{aliases:["gemini-3-pro-image-preview","nano-banana-pro-preview"],input:2,cachedInput:0,output:120}}},bytedance:{models:{}}}};function aa(e,t){let r=Sn.providers[e.toLowerCase()]?.models;if(!r)return;let o=t.replace(/^models\//,"").toLowerCase();return Object.entries(r).find(([n,i])=>n.toLowerCase()===o||i.aliases?.some(s=>s.toLowerCase()===o))?.[1]}function Dr(e,t,r){let o=aa(e,t),n=Number(r?.inputTokens??r?.input_tokens??0),i=Number(r?.outputTokens??r?.output_tokens??0),s=Number(r?.cachedInputTokens??r?.input_tokens_details?.cached_tokens??0);if(!o||!n&&!i)return{...ne,breakdown:{...ne.breakdown,inputTokens:n,cachedTokens:s,billedInputTokens:Math.max(0,n-s),outputTokens:i}};let a=Math.max(0,n-s),u=a*o.input/1e6,c=s*o.cachedInput/1e6,l=i*o.output/1e6;return{inputCost:u,cachedInputCost:c,outputCost:l,totalCost:u+c+l,breakdown:{inputTokens:n,cachedTokens:s,billedInputTokens:a,outputTokens:i,audioTokens:0}}}function jr(){return ga({apiKey:process.env.OPENAI_API_KEY})}function wn(){return ua({resourceName:process.env.AZURE_OPENAI_RESOURCE_NAME,baseURL:process.env.AZURE_OPENAI_BASE_URL,apiKey:process.env.AZURE_OPENAI_API_KEY||process.env.AZURE_API_KEY,apiVersion:process.env.AZURE_OPENAI_API_VERSION})}function Mr(){return la({apiKey:process.env.GOOGLE_API_KEY})}function Cn(){return ma({apiKey:process.env.ELEVENLABS_API_KEY||process.env.ELEVEN_LABS_API_KEY})}function xa(){return pa({apiKey:process.env.ANTHROPIC_API_KEY})}function Pn(){return fa({apiKey:process.env.XAI_API_KEY})}function wa(){return da({apiKey:process.env.HUGGINGFACE_API_KEY||process.env.HF_TOKEN})}function Ne(e,t){try{e?.(t)}catch{}}function Ca(e){let t=0;return ca({apiKey:process.env.ARK_API_KEY,fetch:async(r,o)=>{let n=await globalThis.fetch(r,o);if(!n.ok)return n;try{let i=(o?.method||(r instanceof Request?r.method:"GET")).toUpperCase(),s=r instanceof Request?r.url:String(r),a=await n.clone().json();if(i==="POST"&&/\/contents\/generations\/tasks\/?$/.test(s))Ne(e,{phase:"submitted",taskId:typeof a.id=="string"?a.id:void 0});else if(i==="GET"&&/\/contents\/generations\/tasks\//.test(s)){t+=1;let u=typeof a.status=="string"?a.status:"unknown";Ne(e,{phase:u==="succeeded"?"ready":"polling",status:u,taskId:typeof a.id=="string"?a.id:void 0,pollCount:t})}}catch{}return n}})}function Oe(e,t){if(!t)throw new Error(`AI provider "${e}" requires an explicit model in settings or request.`);return t}function Br(e,t){let r=re(e)||oe(t,"llm");if(r==="azure"){let o=Oe("azure",t);return{provider:"azure",model:o,sdkModel:wn()(o)}}if(r==="anthropic"){let o=Oe("anthropic",t);return{provider:"anthropic",model:o,sdkModel:xa()(o)}}if(r==="xai"){let o=Oe("xai",t);return{provider:"xai",model:o,sdkModel:Pn()(o)}}if(r==="huggingface"){let o=Oe("huggingface",t);return{provider:"huggingface",model:o,sdkModel:wa()(o)}}if(r==="bytedance")throw new Error("The @ai-sdk/bytedance provider is installed for video generation, but TIM does not have a ByteDance LLM executor yet.");return r==="google"?{provider:"google",model:t||"gemini-2.5-pro",sdkModel:Mr()(t||"gemini-2.5-pro")}:{provider:"openai",model:t||"gpt-5.6",sdkModel:jr()(t||"gpt-5.6")}}function Pa(e,t,r){let o=re(e)||oe(t,"video");if(o!=="bytedance")throw new Error(`AI provider "${o||"unknown"}" is not supported for TIM video generation.`);let n=t||"dreamina-seedance-2-0-260128";return{provider:"bytedance",model:n,sdkModel:Ca(r).video(n)}}function Ta(e,t){let r=re(e)||oe(t,"image");if(r==="xai"){let o=Oe("xai",t);return{provider:"xai",model:o,sdkModel:Pn().image(o)}}if(r==="anthropic"||r==="huggingface"||r==="bytedance")throw new Error(`AI provider "${r}" is not supported for TIM image generation.`);if(r==="google"){let o=Fa(t);return{provider:"google",model:o,sdkModel:Mr().image(o)}}return{provider:"openai",model:t||"gpt-image-1",sdkModel:jr().image(t||"gpt-image-1")}}function Fa(e){let t={FLASH2_5:"gemini-2.5-flash-image",NANO_BANANA_PRO:"nano-banana-pro-preview",GEMINI_3_PRO:"gemini-3-pro-image-preview"};return e?t[e]||e:"gemini-2.5-flash-image"}function Aa(e){let t=Buffer.from(e);return t.subarray(0,3).equals(Buffer.from([255,216,255]))?"image/jpeg":t.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?"image/png":t.subarray(0,4).toString("ascii")==="GIF8"?"image/gif":t.subarray(0,4).toString("ascii")==="RIFF"&&t.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":"image/jpeg"}function ka(e){if(typeof e=="string")return e;let t=Buffer.from(e);return`data:${Aa(t)};base64,${t.toString("base64")}`}async function Ea(e,t){let o=e.providerOptions?.bytedance||e.providerOptions||{},n=o.apiKey||process.env.ARK_API_KEY,i=o.baseURL||process.env.ARK_BASE_URL||"https://ark.ap-southeast.bytepluses.com/api/v3";if(!n)throw new Error("ByteDance image generation requires ARK_API_KEY.");let{apiKey:s,baseURL:a,responseFormat:u,response_format:c,outputFormat:l,output_format:d,...m}=o,h=e.referenceImages?.map(ka),y=await globalThis.fetch(`${i.replace(/\/$/,"")}/images/generations`,{method:"POST",headers:{Authorization:`Bearer ${n}`,"Content-Type":"application/json"},body:JSON.stringify({...m,model:t,prompt:e.prompt,...h?.length?{image:h.length===1?h[0]:h}:{},...e.size||e.imageSize?{size:e.size||e.imageSize}:{},output_format:e.outputFormat||l||d||"jpeg",response_format:u||c||"b64_json"})}),I=await y.json();if(!y.ok)throw new Error(`ByteDance image generation failed (${y.status}): ${I?.error?.message||y.statusText}`);let T=I?.data?.find(w=>w?.b64_json||w?.url);if(!T){let w=I?.data?.find(b=>b?.error)?.error?.message;throw new Error(`ByteDance image generation returned no image${w?`: ${w}`:"."}`)}let x;if(T.b64_json)x=Buffer.from(T.b64_json,"base64");else{let w=await globalThis.fetch(T.url);if(!w.ok)throw new Error(`ByteDance image download failed (${w.status}): ${w.statusText}`);x=Buffer.from(await w.arrayBuffer())}return Ve(e.outputPath,x),{provider:"bytedance",model:I.model||t,usage:I.usage||{},cost:Dr("bytedance",I.model||t,I.usage),outputFormat:e.outputFormat||l||d||"jpeg",providerMetadata:{bytedance:{created:I.created,size:T.size}},warnings:[]}}function _a(e,t){return(re(e)||oe(t,"tts"))==="openai"?{provider:"openai",model:t||"tts-1",sdkModel:jr().speech(t||"tts-1")}:{provider:"elevenlabs",model:t||"eleven_v3",sdkModel:Cn().speech(t||"eleven_v3")}}function La(e,t){let r=re(e)||oe(t,"transcription");if(r==="elevenlabs"){let o=t||"scribe_v2";return{provider:"elevenlabs",model:o,sdkModel:Cn().transcription(o)}}if(r==="azure"){let o=Oe("azure",t);return{provider:"azure",model:o,sdkModel:wn().transcription(o)}}if(r!=="google")throw new Error(`AI SDK transcription is only implemented for Google/Gemini, Azure, and ElevenLabs. Received provider "${r||"unknown"}".`);return{provider:"google",model:t||"gemini-2.5-flash",sdkModel:Mr()(t||"gemini-2.5-flash")}}function Re(e){let t=Number(e?.inputTokens??e?.input_tokens??0),r=Number(e?.outputTokens??e?.output_tokens??0),o=Number(e?.totalTokens??e?.total_tokens??t+r),n=Number(e?.cachedInputTokens??e?.input_tokens_details?.cached_tokens??e?.cacheCreationInputTokens??0);return{input_tokens:t,input_tokens_details:{cached_tokens:n},output_tokens:r,total_tokens:o}}function Na(e){let n=e.input_tokens_details?.cached_tokens??0,i=Math.max(0,e.input_tokens-n),s=i*125e-8,a=n*125e-9,u=e.output_tokens*1e-5;return{inputCost:s,cachedInputCost:a,outputCost:u,totalCost:s+a+u,breakdown:{inputTokens:e.input_tokens,cachedTokens:n,billedInputTokens:i,outputTokens:e.output_tokens,audioTokens:0}}}function Oa(e,t){let r=t.replace(/^models\//,"").toLowerCase(),o=e.input_tokens,n=e.input_tokens_details?.cached_tokens??0,i=Math.max(0,o-n),s=e.output_tokens,a=.3,u=.03,c=2.5;(r.startsWith("gemini-2.5-pro")||r.startsWith("gemini-3-pro"))&&(a=o>2e5?2.5:1.25,u=o>2e5?.25:.125,c=o>2e5?15:10);let l=i*a/1e6,d=n*u/1e6,m=s*c/1e6;return{inputCost:l,cachedInputCost:d,outputCost:m,totalCost:l+d+m,breakdown:{inputTokens:o,cachedTokens:n,billedInputTokens:i,outputTokens:s,audioTokens:0}}}function Rt(e,t,r){let o=Re(r),n=o.input_tokens_details?.cached_tokens??0;return!o.input_tokens&&!o.output_tokens?ne:e==="google"?Oa(o,t):e==="openai"?Na(o):{...ne,breakdown:{inputTokens:o.input_tokens,cachedTokens:n,billedInputTokens:Math.max(0,o.input_tokens-n),outputTokens:o.output_tokens,audioTokens:0}}}function xn(e){return!!(e&&typeof e=="object"&&Object.keys(e).length>0)}async function Ra(e){let{provider:t,model:r,sdkModel:o}=Br(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkLlm: "prompt" is required.');let n=await Ot({model:o,prompt:e.prompt,providerOptions:e.providerOptions,...xn(e.schema)?{output:ya.object({schema:Sa(e.schema),name:"schema"})}:{}}),i=xn(e.schema)?n.output:n.text,s=Re(n.usage);return{output:i,usage:s,model:n.response?.modelId||r,provider:t,cost:Rt(t,r,s),providerMetadata:n.providerMetadata,warnings:n.warnings}}async function $a(e){let{provider:t,model:r,sdkModel:o}=Br(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkText: "prompt" is required.');let n=await Ot({model:o,prompt:e.prompt,providerOptions:e.providerOptions}),i=n.text?.trim();if(!i)throw new Error("llm: Empty text response from model.");let s=Re(n.usage);return{output:i,usage:s,model:n.response?.modelId||r,provider:t,cost:Rt(t,r,s),providerMetadata:n.providerMetadata,warnings:n.warnings}}async function Jr(e){let{provider:t,model:r,sdkModel:o}=Br(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkVisionText: "prompt" is required.');let n=await Ot({model:o,messages:[{role:"user",content:[{type:"text",text:e.prompt},{type:"image",image:e.image,...e.imageProviderOptions?{providerOptions:e.imageProviderOptions}:{}}]}],providerOptions:e.providerOptions}),i=n.text?.trim();if(!i)throw new Error("llm: Empty text response from model.");let s=Re(n.usage);return{output:i,usage:s,model:n.response?.modelId||r,provider:t,cost:Rt(t,r,s),providerMetadata:n.providerMetadata,warnings:n.warnings}}async function Tn(e){if((re(e.provider)||oe(e.model,"image"))==="bytedance"){if(!e.prompt)throw new Error('generateAiSdkImage: "prompt" is required.');return Ea(e,e.model||"seedream-5-0-260128")}let{provider:r,model:o,sdkModel:n}=Ta(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkImage: "prompt" is required.');let i=e.imageSize,s=r==="google"&&!!(e.aspectRatio||i),a={...e.providerOptions||{},...r==="openai"?{openai:{...e.providerOptions?.openai||{},...e.quality?{quality:e.quality}:{},...e.background?{background:e.background}:{},...e.outputFormat?{outputFormat:e.outputFormat}:{},...typeof e.outputCompression=="number"?{outputCompression:e.outputCompression}:{},...e.moderation?{moderation:e.moderation}:{}}}:{},...s?{google:{...e.providerOptions?.google||{},responseFormat:e.providerOptions?.google?.responseFormat||[{type:"image",...e.aspectRatio?{aspectRatio:e.aspectRatio}:{},...i?{imageSize:i}:{}}]}}:{}},u=await Ia({model:n,prompt:e.referenceImages?.length?{text:e.prompt,images:e.referenceImages}:e.prompt,...e.n?{n:e.n}:{},...e.size&&r!=="google"?{size:e.size}:{},...e.aspectRatio&&!s?{aspectRatio:e.aspectRatio}:{},providerOptions:a}),c=u.image;if(!c)throw new Error("generateAiSdkImage: no image returned.");Ve(e.outputPath,Buffer.from(c.uint8Array));let l=u.providerMetadata?.openai?.images?.[0]?.revisedPrompt;return{provider:r,model:o,usage:u.usage||{},cost:Dr(r,o,u.usage),outputFormat:e.outputFormat,revisedPrompt:l,providerMetadata:u.providerMetadata,warnings:u.warnings}}async function zr(e){if(!e.prompt)throw new Error('generateAiSdkVideo: "prompt" is required.');let{provider:t,model:r,sdkModel:o}=Pa(e.provider,e.model,e.onProgress);Ne(e.onProgress,{phase:"preparing"});try{let n=await ba({model:o,prompt:e.referenceImage?{text:e.prompt,image:e.referenceImage}:e.prompt,...e.aspectRatio?{aspectRatio:e.aspectRatio}:{},...e.resolution?{resolution:e.resolution}:{},...typeof e.duration=="number"?{duration:e.duration}:{},...typeof e.fps=="number"?{fps:e.fps}:{},...typeof e.seed=="number"?{seed:e.seed}:{},providerOptions:e.providerOptions}),i=Buffer.from(n.video.uint8Array);return Ne(e.onProgress,{phase:"downloaded",bytes:i.byteLength,mediaType:n.video.mediaType}),Ve(e.outputPath,i),Ne(e.onProgress,{phase:"written",bytes:i.byteLength,mediaType:n.video.mediaType}),{provider:t,model:r,mediaType:n.video.mediaType,providerMetadata:n.providerMetadata,warnings:n.warnings}}catch(n){throw Ne(e.onProgress,{phase:"failed",error:n instanceof Error?n.message:String(n)}),n}}async function Fn(e){let{provider:t,model:r,sdkModel:o}=_a(e.provider,e.model);if(!e.text)throw new Error('generateAiSdkSpeech: "text" is required.');if(!e.voiceId)throw new Error('generateAiSdkSpeech: "voiceId" is required.');let n=await ha({model:o,text:e.text,voice:e.voiceId,...e.outputFormat?{outputFormat:e.outputFormat}:{},...e.languageCode?{language:e.languageCode}:{},...typeof e.speed=="number"?{speed:e.speed}:{},...e.instructions?{instructions:e.instructions}:{},providerOptions:e.providerOptions});return{buffer:Buffer.from(n.audio.uint8Array),provider:t,model:r,voiceId:e.voiceId,outputFormat:n.audio.format||e.outputFormat||"mp3",mediaType:n.audio.mediaType,warnings:n.warnings,providerMetadata:n.providerMetadata}}function Da(e="audio.m4a"){let t=e.toLowerCase();return t.endsWith(".mp3")||t.endsWith(".mpeg")||t.endsWith(".mpga")?"audio/mpeg":t.endsWith(".wav")?"audio/wav":t.endsWith(".ogg")?"audio/ogg":t.endsWith(".webm")?"audio/webm":t.endsWith(".aac")?"audio/aac":t.endsWith(".mp4")||t.endsWith(".m4a")?"audio/mp4":t.endsWith(".flac")?"audio/flac":"audio/mp4"}function ja(e){let t=[e.prompt||"Transcribe the audio accurately. Do not summarize.","Return only the transcript text."];return e.language&&t.push(`The expected language hint is: ${e.language}.`),t.join(`
8
+ `)}async function An(e){let t=La(e.provider,e.model);if(t.provider!=="google"){let i=await va({model:t.sdkModel,audio:e.audio,providerOptions:e.providerOptions}),s=Re({});return{text:i.text,task:"transcribe",usage:s,model:t.model,provider:t.provider,cost:ne,providerMetadata:i.providerMetadata,warnings:i.warnings}}let r=await Ot({model:t.sdkModel,messages:[{role:"user",content:[{type:"text",text:ja(e)},{type:"file",data:e.audio,filename:e.fileName||"audio.m4a",mediaType:Da(e.fileName)}]}],providerOptions:e.providerOptions}),o=r.text?.trim();if(!o)throw new Error("transcription: Empty text response from model.");let n=Re(r.usage);return{text:o,task:"transcribe",usage:n,model:r.response?.modelId||t.model,provider:t.provider,cost:Rt(t.provider,t.model,n),providerMetadata:r.providerMetadata,warnings:r.warnings}}var qr=Ra,Ur=$a;function Gr(e,t){let r=e?.[`ai-${t}`];return!!(r&&typeof r=="object"&&!Array.isArray(r))}function $t(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Ma(e){return Object.fromEntries(Object.entries(e||{}).filter(([,t])=>t!=null&&t!==""))}function En(e){return`ai-${e}`}function _n(e){return String(e??"").trim().replace(/[\\/]/g,"-").replace(/\s+/g,"-").replace(/^\.+|\.+$/g,"")||void 0}function z(e,t){let r=_n(t);return r?`${e}.${r}`:e}function Ba(e,t){let r=En(t);if(!$t(e))throw new Error(`settings must be an object with a "${r}" section.`);let o=e[r];if(!$t(o))throw new Error(`settings.${r} must be an object.`);return o}function kn(e,t){if(!$t(e)){let a=t.index===void 0?"output":`output variant at index ${t.index}`;throw new Error(`AI ${a} must be an object.`)}let r=_n(e.suffix);if(t.requireSuffix&&!r)throw new Error(`AI output variant at index ${t.index} is missing a suffix.`);let{suffix:o,disabled:n,enabled:i,...s}=e;return{output:Ma(s),suffix:r}}function Ja(e){if(!("output"in e))throw new Error("AI command settings must include an output object or output array.");let{output:t}=e;if(Array.isArray(t)){if(!t.length)throw new Error("AI output array must include at least one variant.");let r=new Set;return t.flatMap((o,n)=>{if(!$t(o))throw new Error(`AI output variant at index ${n} must be an object.`);if(o.disabled===!0||o.enabled===!1)return[];let i=kn(o,{index:n,requireSuffix:!0});if(i.suffix&&r.has(i.suffix))throw new Error(`Duplicate AI output suffix: ${i.suffix}`);return i.suffix&&r.add(i.suffix),[i]})}return[kn(t,{requireSuffix:!1})]}function D(e,t){let r=Ba(e,t),o=En(t),{output:n,...i}=r;return Ja(r).map(a=>({commandSettings:i,output:a.output,settings:{...e,[o]:{...i,output:a.output},...i,...a.output},suffix:a.suffix}))}import Ln from"lodash";import Vr from"path";function Nn(e){return re(e)}function On(e){return oe(e,"image")}function O(e,t){let r=t.replace(/^image/,""),o=r?r.charAt(0).toLowerCase()+r.slice(1):t;return Ln.get(e,t)??Ln.get(e,["image",o])}function za(e){let t=e?.toLowerCase();return!t||t==="jpeg"?"jpg":t==="jpg"||t==="png"||t==="webp"?t:"jpg"}function Xe(...e){let t=[];for(let r of e){if(Array.isArray(r)){t.push(...Xe(...r));continue}let o=typeof r=="string"?r.trim():"";o&&t.push(o)}return t}function Rn(e){return/^https?:\/\//i.test(e)||/^data:/i.test(e)}function qa(e={},t={},r=process.cwd()){let o=Xe(e.referenceImagePath,e.referenceImagePaths,e.reference,e.references),n=Xe(O(t,"imageReferencePath"),O(t,"imageReferencePaths"),O(t,"reference"),O(t,"references")),i=o.length?o:n;return[...new Set(i)].map(s=>Rn(s)||Vr.isAbsolute(s)?s:Vr.resolve(r,s))}function Ua(e){return e.map(t=>{if(Rn(t))return t;if(!j(t))throw new Error(`genai.images: reference image not found: ${t}`);return R(t)})}function Ga(e={},t={}){let r=Xe(e.referenceType,e.referenceTypes),o=Xe(O(t,"imageReferenceType"),O(t,"imageReferenceTypes"),O(t,"referenceType"),O(t,"referenceTypes"));return r.length?r:o}var Va={style:"Use the reference image for visual style: rendering language, palette, materials, lighting, texture, and mood. Do not copy its subject unless the prompt explicitly asks.",character:"Use the reference image for character identity and design: preserve recognizable features, proportions, clothing cues, and personality while following the prompt.",environment:"Use the reference image for the environment: preserve the location, spatial layout, architecture, background cues, materials, and atmosphere while following the prompt.",object:"Use the reference image for the object or product: preserve its shape, structure, material cues, scale, and distinctive details while following the prompt.",composition:"Use the reference image for composition: camera angle, framing, layout, depth, subject placement, and visual hierarchy.",palette:"Use the reference image for palette and material language: colors, contrast, surface qualities, and overall color temperature.",lighting:"Use the reference image for lighting: direction, softness, contrast, time of day, shadow character, and mood.",scenario:"Use the reference image for scenario: preserve the depicted situation, relationships between elements, activity, and environmental logic while following the prompt.",general:"Use the reference image as a general visual reference while following the prompt."};function Wa(e,t){if(!t.length)return e;let r=[...new Set(t)].map(o=>{let n=o.trim().toLowerCase();return Va[n]||`Use the reference image as a ${o} reference.`});return`${e}
9
9
 
10
10
  Reference image guidance:
11
11
  ${r.map(o=>`- ${o}`).join(`
12
- `)}`}function Xe(e={},t={}){return $n(e.provider)||$n(O(t,"imageProvider"))||Dn(e.model)||Dn(O(t,"imageModel"))||"google"}function Kr(e={},t={}){let r=Xe(e,t);return r==="openai"||r==="bytedance"?Ha(e.outputFormat||e.output_format||O(t,"imageOutputFormat")||"jpeg"):"jpg"}function Ze(e={},t={}){return{provider:Xe(e,t),model:e.model||O(t,"imageModel"),size:e.size||O(t,"imageSize"),aspectRatio:e.aspectRatio||O(t,"imageAspectRatio"),imageSize:e.imageSize||e.resolution||O(t,"googleImageSize")||O(t,"imageResolution"),quality:e.quality||O(t,"imageQuality"),outputFormat:e.outputFormat||e.output_format||O(t,"imageOutputFormat"),background:e.background||O(t,"imageBackground"),moderation:e.moderation||O(t,"imageModeration"),n:e.n||O(t,"imageN"),outputCompression:e.outputCompression||e.output_compression||O(t,"imageOutputCompression"),providerOptions:e.providerOptions||O(t,"imageProviderOptions")}}async function Yr(e,t,r={}){let o=Ze(e,r),n=Xa(e,r,Wr.dirname(t)),s=Za(n),i=Qa(e,r),a=tu(e.prompt||"",i);if(!a)throw new Error("genai.images: prompt is required.");return Pn({...o,prompt:a,outputPath:t,referenceImages:s})}import Mt from"lodash";import fe from"path";function Jt(e){return/^https?:\/\//i.test(e)||/^data:/i.test(e)}function Bt(e={},t={},r=process.cwd()){let o=Y(t,"video",e),n=String(o.referenceImagePath||o.reference||"").trim(),s=!!e.referenceImagePaths?.length,i=n||(!s&&M(fe.resolve(r,"ref.png"))?"ref.png":"");return!i||Jt(i)||fe.isAbsolute(i)?i||void 0:fe.resolve(r,i)}function zt(e=[],t=process.cwd()){return[...new Set(e.map(r=>r.trim()).filter(Boolean))].map(r=>Jt(r)||fe.isAbsolute(r)?r:fe.resolve(t,r))}function ru(e){if(!e||Jt(e))return e;if(!M(e))throw new Error(`genai.videos: reference image not found: ${e}`);return D(e)}function ou(e){let t=fe.extname(e).toLowerCase();return t===".jpg"||t===".jpeg"?"image/jpeg":t===".webp"?"image/webp":t===".gif"?"image/gif":t===".bmp"?"image/bmp":t===".tif"||t===".tiff"?"image/tiff":"image/png"}function nu(e){if(Jt(e))return e;if(!M(e))throw new Error(`genai.videos: reference image not found: ${e}`);return`data:${ou(e)};base64,${D(e).toString("base64")}`}async function Hr(e,t,r={}){let o=Y(r,"video",e),n=String(o.prompt||e.prompt||"").trim();if(!n)throw new Error("genai.videos: prompt is required.");let s=Bt(e,r,fe.dirname(t)),i=zt(e.referenceImagePaths,fe.dirname(t));if(s&&i.length)throw new Error("genai.videos: first-frame referenceImagePath cannot be combined with body reference images.");let a=Mt.merge({},o.providerOptions,i.length?{bytedance:{referenceImages:i.map(nu)}}:{});return Br({provider:o.provider||"bytedance",model:o.model,prompt:n,outputPath:t,referenceImage:ru(s),aspectRatio:o.aspectRatio,resolution:o.resolution,duration:Mt.isNumber(o.duration)?o.duration:void 0,fps:Mt.isNumber(o.fps)?o.fps:void 0,seed:Mt.isNumber(o.seed)?o.seed:void 0,providerOptions:a,onProgress:e.onProgress})}import{promises as su}from"node:fs";import iu from"sharp";async function Xr(e){let[t,r]=await Promise.all([iu(e).metadata(),su.stat(e)]);return{path:e,format:t.format,width:t.width,height:t.height,density:t.density,hasAlpha:t.hasAlpha,pages:t.pages,sizeBytes:r.size}}var Zr=(e,t=.22)=>e/60*t;import{spawn as au}from"node:child_process";function Qr(e,t,r=[]){return e.includes(t)?e:[t,...r,...e]}function Jn(e,t,r={}){let{collectStdout:o=!0}=r;return new Promise((n,s)=>{let i=au(e,t,{stdio:["ignore",o?"pipe":"ignore","pipe"]}),a="",u="";i.stdout?.on("data",p=>{a+=p.toString()}),i.stderr?.on("data",p=>{u+=p.toString()}),i.on("error",s),i.on("close",p=>{if(p===0){n(a);return}s(new Error(`${e} exited with code ${p}: ${u||a}`))})})}async function Bn(e,t={}){let{hideBanner:r=!0,logLevel:o="error",overwrite:n=!0}=t,s=[...e];n&&(s=Qr(s,"-y")),o&&(s=Qr(s,"-loglevel",[o])),r&&(s=Qr(s,"-hide_banner")),await Jn("ffmpeg",s,{collectStdout:!1})}async function qt(e){let t=await Jn("ffprobe",["-hide_banner","-v","error","-show_entries","format=duration","-of","default=noprint_wrappers=1:nokey=1",e]),r=Number(t.trim());if(!Number.isFinite(r)||r<=0)throw new Error(`Could not determine audio duration for ${e}`);return r}async function eo(e){await Bn(["-ss",String(e.start),"-t",String(e.duration),"-i",e.inputPath,"-map","0:a:0","-ac",String(e.channels??1),"-ar",String(e.sampleRate??16e3),"-c:a",e.codec??"aac","-b:a",e.bitrate??"48k",e.outputPath])}async function zn(e){await Bn(["-i",e.inputPath,"-vn","-ac",String(e.channels??1),"-ar",String(e.sampleRate??16e3),"-b:a",e.bitrate??"24k",e.outputPath])}async function to(e){return qt(e)}import{ElevenLabsClient as uu}from"@elevenlabs/elevenlabs-js";import cu from"path";var Ut;function pu(){return Ut||(Ut=new uu({apiKey:process.env.ELEVENLABS_API_KEY||process.env.ELEVEN_LABS_API_KEY}),Ut)}async function mu(e,t,r={}){let{modelId:o="eleven_v3",languageCode:n,outputFormat:s="mp3_44100_128"}=r,a=(await pu().textToSpeech.convert(t,{text:e,modelId:o,...n?{languageCode:n}:{},outputFormat:s})).getReader(),u=[],p,d;for(;{done:p,value:d}=await a.read(),!p;)u.push(d);return{buffer:Buffer.concat(u),provider:"elevenlabs-native",model:o,voiceId:t,outputFormat:s}}var ro=async(e,t,r,o={})=>{if(r){let n=oe(),s=cu.join(n,"beep.mp3");return Ue("Debug speech mode returning beep audio",{kind:"diagnostic",level:"debug",data:{beepPath:s}}),{buffer:D(s),provider:"debug",model:o.modelId||"beep",voiceId:t,outputFormat:"mp3"}}return o.provider==="native-elevenlabs"||o.provider==="elevenlabs-native"?mu(e,t,o):Tn({provider:o.provider||"elevenlabs",text:e,voiceId:t,model:o.modelId||"eleven_v3",languageCode:o.languageCode,outputFormat:o.outputFormat||"mp3_44100_128",speed:o.speed,instructions:o.instructions,providerOptions:o.providerOptions})};import lu from"p-limit";import Qe from"node:fs";import du from"node:os";import Te from"node:path";var so=13,et={extension:"m4a",codec:"aac",channels:1,sampleRate:16e3,bitrate:"48k"},Gn=300,Vn=2,gu=24,fu="gpt-4o-transcribe",yu="gpt-4o-transcribe-diarize",hu="gemini-2.5-flash",bu=2e3,vu=1e4,Wn=/\.(m4a|mp3|mp4|mpeg|mpga|ogg|wav|webm)$/i;function Vt(e,t){let r=Number(e);return Number.isFinite(r)&&r>0?r:t}function Gt(e,t){return Math.max(1,Math.floor(Vt(e,t)))}function qn(e,t){if(typeof e=="boolean")return e;if(typeof e=="string"){if(["true","1","yes"].includes(e.toLowerCase()))return!0;if(["false","0","no"].includes(e.toLowerCase()))return!1}return t}function Iu(e){return e.replace(Wn,"")}function Su(e){return`_parts/${e.replace(/\.[^.]+$/,".transcript.json")}`}function oo(e){if(typeof e!="string")return;let t=e.toLowerCase();if(t==="diarized")return"diarized";if(t==="chunked")return"chunked"}function xu(e){let t=e?.transcriptionDefinition??e?.transcription;return typeof t=="string"?{mode:t}:t&&typeof t=="object"?t:{}}function io(e){let t=e.settings||{},r=xu(t),o=Y(t,"transcription"),s=oo(r.mode)||oo(r.type)||oo(t.transcriptionMode)||(qn(r.diarize??t.transcriptionDiarize,!1)?"diarized":void 0)||"chunked",i=Vt(r.maxUploadMb??t.maxTranscriptionUploadMb,gu),a=o.model||(s==="chunked"?t.model:void 0)||(o.provider==="google"?hu:void 0)||(s==="diarized"?yu:fu),u=s==="diarized"?vu:bu;return{mode:s,provider:o.provider||"openai",model:a,providerOptions:o.providerOptions,prompt:r.prompt??t.transcriptionPrompt,language:r.language??t.transcriptionLanguage,partSeconds:Vt(r.partSeconds??t.transcriptionPartSeconds,Gn),overlapSeconds:Vt(r.overlapSeconds??t.transcriptionOverlapSeconds,Vn),parallelLimit:Gt(r.parallelLimit??t.transcriptionParallelLimit,so),maxUploadMb:i,maxUploadBytes:i*1024*1024,progressWriteIntervalMs:Gt(r.progressWriteIntervalMs??t.transcriptionProgressWriteIntervalMs,u),waitForStableFile:qn(r.waitForStableFile??t.transcriptionWaitForStableFile,!0),stableFileSamples:Gt(r.stableFileSamples??t.transcriptionStableFileSamples,3),stableFileIntervalMs:Gt(r.stableFileIntervalMs??t.transcriptionStableFileIntervalMs,1e3)}}function Wt(e){let t=Iu(e);return{baseName:t,progressFileName:`_transcript/_transcribing.${t}.json`,partialTextFileName:`_partial/_partial.${t}.transcript.txt`,partialJsonFileName:`_partial/_partial.${t}.transcript.json`,finalTextFileName:`${t}.transcript.txt`,finalJsonFileName:`${t}.transcript.json`,metaFileName:`_transcript.${t}.meta.json`,manifestFileName:`_parts/${t}.parts.json`}}function ao(e){let t=e.partSeconds??Gn,r=e.overlapSeconds??Vn,o=[];for(let n=0,s=0;n<e.duration;n+=t,s+=1){let i=Math.min(e.duration,n+t),a=Math.max(0,n-r),u=Math.min(e.duration,i+r),p=`${e.baseName}.part-${String(s).padStart(3,"0")}.${et.extension}`;o.push({index:s,fileName:p,start:a,end:u,duration:u-a,nominalStart:n,nominalEnd:i,overlapBefore:n-a,overlapAfter:u-i})}return o}function Kt(e){return N().statSync(e).size}function Kn(e,t){return Lr(e,Te.join("_parts",t),{forWrite:!0})}function no(e){return D(e).length}function Cu(e,t){let r=Lr(e,t);if(!M(r))return null;let o=xt(r),n=Array.isArray(o.parts)?o.parts:[];if(!n.length)return null;let s=n.map(a=>({...a,fullPath:Kn(e,a.fileName)}));return s.every(a=>a.fileName&&M(a.fullPath))?s:null}async function wu(e,t){let r=E(e),o=await qt(e.paths.fileFull),n=ao({baseName:t.baseName,duration:o,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds}),s=[];r.session.ensureDir("_parts");for(let i of n){let a=Kn(e,i.fileName);await eo({inputPath:e.paths.fileFull,outputPath:a,start:i.start,duration:i.duration,channels:et.channels,sampleRate:et.sampleRate,codec:et.codec,bitrate:et.bitrate});let u=no(a);if(u>t.maxUploadBytes&&(await eo({inputPath:e.paths.fileFull,outputPath:a,start:i.start,duration:i.duration,channels:1,sampleRate:16e3,codec:"aac",bitrate:"48k"}),u=no(a)),u>t.maxUploadBytes)throw new Error(`${i.fileName} is still larger than max upload size after compression.`);s.push({...i,sizeBytes:u,fullPath:a})}return r.session.write(t.manifestFileName,{sourceFileName:e.fileName,sourcePath:e.paths.file,duration:o,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,parts:s.map(({fullPath:i,...a})=>a)}),s}async function Pu(e,t){E(e).session.ensureDir("_parts");let o=Cu(e,t.manifestFileName);return o?o.map(n=>({...n,sizeBytes:n.sizeBytes??no(n.fullPath)})):wu(e,t)}function Un(e){return e.map(t=>t.trim()).filter(Boolean).join(`
12
+ `)}`}function Ze(e={},t={}){return Nn(e.provider)||Nn(O(t,"imageProvider"))||On(e.model)||On(O(t,"imageModel"))||"google"}function Wr(e={},t={}){let r=Ze(e,t);return r==="openai"||r==="bytedance"?za(e.outputFormat||e.output_format||O(t,"imageOutputFormat")||"jpeg"):"jpg"}function Qe(e={},t={}){return{provider:Ze(e,t),model:e.model||O(t,"imageModel"),size:e.size||O(t,"imageSize"),aspectRatio:e.aspectRatio||O(t,"imageAspectRatio"),imageSize:e.imageSize||e.resolution||O(t,"googleImageSize")||O(t,"imageResolution"),quality:e.quality||O(t,"imageQuality"),outputFormat:e.outputFormat||e.output_format||O(t,"imageOutputFormat"),background:e.background||O(t,"imageBackground"),moderation:e.moderation||O(t,"imageModeration"),n:e.n||O(t,"imageN"),outputCompression:e.outputCompression||e.output_compression||O(t,"imageOutputCompression"),providerOptions:e.providerOptions||O(t,"imageProviderOptions")}}async function Kr(e,t,r={}){let o=Qe(e,r),n=qa(e,r,Vr.dirname(t)),i=Ua(n),s=Ga(e,r),a=Wa(e.prompt||"",s);if(!a)throw new Error("genai.images: prompt is required.");return Tn({...o,prompt:a,outputPath:t,referenceImages:i})}import Dt from"lodash";import ge from"path";function jt(e){return/^https?:\/\//i.test(e)||/^data:/i.test(e)}function Mt(e={},t={},r=process.cwd()){let o=H(t,"video",e),n=String(o.referenceImagePath||o.reference||"").trim(),i=!!e.referenceImagePaths?.length,s=n||(!i&&j(ge.resolve(r,"ref.png"))?"ref.png":"");return!s||jt(s)||ge.isAbsolute(s)?s||void 0:ge.resolve(r,s)}function Bt(e=[],t=process.cwd()){return[...new Set(e.map(r=>r.trim()).filter(Boolean))].map(r=>jt(r)||ge.isAbsolute(r)?r:ge.resolve(t,r))}function Ka(e){if(!e||jt(e))return e;if(!j(e))throw new Error(`genai.videos: reference image not found: ${e}`);return R(e)}function Ha(e){let t=ge.extname(e).toLowerCase();return t===".jpg"||t===".jpeg"?"image/jpeg":t===".webp"?"image/webp":t===".gif"?"image/gif":t===".bmp"?"image/bmp":t===".tif"||t===".tiff"?"image/tiff":"image/png"}function Ya(e){if(jt(e))return e;if(!j(e))throw new Error(`genai.videos: reference image not found: ${e}`);return`data:${Ha(e)};base64,${R(e).toString("base64")}`}async function Hr(e,t,r={}){let o=H(r,"video",e),n=String(o.prompt||e.prompt||"").trim();if(!n)throw new Error("genai.videos: prompt is required.");let i=Mt(e,r,ge.dirname(t)),s=Bt(e.referenceImagePaths,ge.dirname(t));if(i&&s.length)throw new Error("genai.videos: first-frame referenceImagePath cannot be combined with body reference images.");let a=Dt.merge({},o.providerOptions,s.length?{bytedance:{referenceImages:s.map(Ya)}}:{});return zr({provider:o.provider||"bytedance",model:o.model,prompt:n,outputPath:t,referenceImage:Ka(i),aspectRatio:o.aspectRatio,resolution:o.resolution,duration:Dt.isNumber(o.duration)?o.duration:void 0,fps:Dt.isNumber(o.fps)?o.fps:void 0,seed:Dt.isNumber(o.seed)?o.seed:void 0,providerOptions:a,onProgress:e.onProgress})}import{promises as Xa}from"node:fs";import Za from"sharp";async function Yr(e){let[t,r]=await Promise.all([Za(e).metadata(),Xa.stat(e)]);return{path:e,format:t.format,width:t.width,height:t.height,density:t.density,hasAlpha:t.hasAlpha,pages:t.pages,sizeBytes:r.size}}var Xr=(e,t=.22)=>e/60*t;import{spawn as Qa}from"node:child_process";function Zr(e,t,r=[]){return e.includes(t)?e:[t,...r,...e]}function Dn(e,t,r={}){let{collectStdout:o=!0}=r;return new Promise((n,i)=>{let s=Qa(e,t,{stdio:["ignore",o?"pipe":"ignore","pipe"]}),a="",u="";s.stdout?.on("data",c=>{a+=c.toString()}),s.stderr?.on("data",c=>{u+=c.toString()}),s.on("error",i),s.on("close",c=>{if(c===0){n(a);return}i(new Error(`${e} exited with code ${c}: ${u||a}`))})})}async function jn(e,t={}){let{hideBanner:r=!0,logLevel:o="error",overwrite:n=!0}=t,i=[...e];n&&(i=Zr(i,"-y")),o&&(i=Zr(i,"-loglevel",[o])),r&&(i=Zr(i,"-hide_banner")),await Dn("ffmpeg",i,{collectStdout:!1})}async function Jt(e){let t=await Dn("ffprobe",["-hide_banner","-v","error","-show_entries","format=duration","-of","default=noprint_wrappers=1:nokey=1",e]),r=Number(t.trim());if(!Number.isFinite(r)||r<=0)throw new Error(`Could not determine audio duration for ${e}`);return r}async function Qr(e){await jn(["-ss",String(e.start),"-t",String(e.duration),"-i",e.inputPath,"-map","0:a:0","-ac",String(e.channels??1),"-ar",String(e.sampleRate??16e3),"-c:a",e.codec??"aac","-b:a",e.bitrate??"48k",e.outputPath])}async function Mn(e){await jn(["-i",e.inputPath,"-vn","-ac",String(e.channels??1),"-ar",String(e.sampleRate??16e3),"-b:a",e.bitrate??"24k",e.outputPath])}async function eo(e){return Jt(e)}import{ElevenLabsClient as ep}from"@elevenlabs/elevenlabs-js";import tp from"path";var zt;function rp(){return zt||(zt=new ep({apiKey:process.env.ELEVENLABS_API_KEY||process.env.ELEVEN_LABS_API_KEY}),zt)}async function op(e,t,r={}){let{modelId:o="eleven_v3",languageCode:n,outputFormat:i="mp3_44100_128"}=r,a=(await rp().textToSpeech.convert(t,{text:e,modelId:o,...n?{languageCode:n}:{},outputFormat:i})).getReader(),u=[],c,l;for(;{done:c,value:l}=await a.read(),!c;)u.push(l);return{buffer:Buffer.concat(u),provider:"elevenlabs-native",model:o,voiceId:t,outputFormat:i}}var to=async(e,t,r,o={})=>{if(r){let n=ae(),i=tp.join(n,"beep.mp3");return ht("Debug speech mode returning beep audio",{kind:"diagnostic",level:"debug",data:{beepPath:i}}),{buffer:R(i),provider:"debug",model:o.modelId||"beep",voiceId:t,outputFormat:"mp3"}}return o.provider==="native-elevenlabs"||o.provider==="elevenlabs-native"?op(e,t,o):Fn({provider:o.provider||"elevenlabs",text:e,voiceId:t,model:o.modelId||"eleven_v3",languageCode:o.languageCode,outputFormat:o.outputFormat||"mp3_44100_128",speed:o.speed,instructions:o.instructions,providerOptions:o.providerOptions})};import ap from"p-limit";import et from"node:fs";import pp from"node:os";import Pe from"node:path";import ro from"lodash";import np from"openai";import{toFile as Bn}from"openai/uploads";var qt;function Jn(){if(qt)return qt;let e=process.env.OPENAI_API_KEY;if(!e)throw new Error("OPENAI_API_KEY is not configured");return qt=new np({apiKey:e}),qt}var Ad=1.25/1e6,kd=.125/1e6,Ed=10/1e6;var ip=2.5/1e6,sp=10/1e6,zn=e=>{let t=e?.usage;if(t?.type==="duration")return{cachedInputCost:0,inputCost:0,totalCost:0,outputCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0,audioSeconds:t.seconds||0}};let r={cachedInputCost:0,inputCost:0,totalCost:0,outputCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0}};try{r.breakdown.inputTokens=ro.get(e,"usage.input_tokens",0),r.breakdown.outputTokens=ro.get(e,"usage.output_tokens",0),r.breakdown.audioTokens=ro.get(e,"usage.input_token_details.audio_tokens",0),r.inputCost=r.breakdown.inputTokens*ip,r.outputCost=r.breakdown.outputTokens*sp,r.totalCost=r.inputCost+r.outputCost}catch{}return r};var qn=async(e,t="audio.m4a",r={},o)=>{let{model:n="gpt-4o-transcribe",prompt:i,language:s}=r,u={file:await Bn(e,t),model:n,stream:!0};i&&(u.prompt=i),s&&(u.language=s);let c=await Jn().audio.transcriptions.create(u),l="",d;for await(let y of c){if(y.type==="transcript.text.delta"){l+=y.delta||"",o?.({type:"delta",text:l,usage:d});continue}y.type==="transcript.text.done"&&(l=y.text||l,d=y.usage,o?.({type:"done",text:l,usage:d}))}let m={text:l,task:"transcribe",usage:d},h=zn(m);return{...m,cost:h}},Un=async(e,t="audio.mp3",r={},o)=>{let n=typeof r=="function"?{}:r,i=typeof r=="function"?r:o,{model:s="gpt-4o-transcribe-diarize",prompt:a,language:u}=n,l={file:await Bn(e,t),model:s,response_format:"diarized_json",chunking_strategy:"auto",stream:!0};a&&(l.prompt=a),u&&(l.language=u);let d=await Jn().audio.transcriptions.create(l),m=[],h="",y;for await(let x of d){if(x.type==="transcript.text.segment"){m.push(x),i?.({type:"segment",segment:x,segments:[...m]});continue}if(x.type==="transcript.text.delta"){h+=x.delta||"",i?.({type:"delta",text:h,segments:[...m]});continue}x.type==="transcript.text.done"&&(h=x.text||h,y=x.usage,i?.({type:"done",text:h,usage:y,segments:[...m]}))}let I={text:h,task:"transcribe",duration:m.reduce((x,w)=>Math.max(x,Number(w.end)||0),0),segments:m,usage:y},T=zn(I);return{...I,cost:T}};var io=13,tt={extension:"m4a",codec:"aac",channels:1,sampleRate:16e3,bitrate:"48k"},Wn=300,Kn=2,up=24,cp="gpt-4o-transcribe",mp="gpt-4o-transcribe-diarize",lp="gemini-2.5-flash",dp=2e3,gp=1e4,Hn=/\.(m4a|mp3|mp4|mpeg|mpga|ogg|wav|webm)$/i;function Gt(e,t){let r=Number(e);return Number.isFinite(r)&&r>0?r:t}function Ut(e,t){return Math.max(1,Math.floor(Gt(e,t)))}function Gn(e,t){if(typeof e=="boolean")return e;if(typeof e=="string"){if(["true","1","yes"].includes(e.toLowerCase()))return!0;if(["false","0","no"].includes(e.toLowerCase()))return!1}return t}function fp(e){return e.replace(Hn,"")}function yp(e){return`_parts/${e.replace(/\.[^.]+$/,".transcript.json")}`}function oo(e){if(typeof e!="string")return;let t=e.toLowerCase();if(t==="diarized")return"diarized";if(t==="chunked")return"chunked"}function hp(e){let t=e?.transcriptionDefinition??e?.transcription;return typeof t=="string"?{mode:t}:t&&typeof t=="object"?t:{}}function so(e){let t=e.settings||{},r=hp(t),o=H(t,"transcription"),i=oo(r.mode)||oo(r.type)||oo(t.transcriptionMode)||(Gn(r.diarize??t.transcriptionDiarize,!1)?"diarized":void 0)||"chunked",s=Gt(r.maxUploadMb??t.maxTranscriptionUploadMb,up),a=o.model||(i==="chunked"?t.model:void 0)||(o.provider==="google"?lp:void 0)||(i==="diarized"?mp:cp),u=i==="diarized"?gp:dp;return{mode:i,provider:o.provider||"openai",model:a,providerOptions:o.providerOptions,prompt:r.prompt??t.transcriptionPrompt,language:r.language??t.transcriptionLanguage,partSeconds:Gt(r.partSeconds??t.transcriptionPartSeconds,Wn),overlapSeconds:Gt(r.overlapSeconds??t.transcriptionOverlapSeconds,Kn),parallelLimit:Ut(r.parallelLimit??t.transcriptionParallelLimit,io),maxUploadMb:s,maxUploadBytes:s*1024*1024,progressWriteIntervalMs:Ut(r.progressWriteIntervalMs??t.transcriptionProgressWriteIntervalMs,u),waitForStableFile:Gn(r.waitForStableFile??t.transcriptionWaitForStableFile,!0),stableFileSamples:Ut(r.stableFileSamples??t.transcriptionStableFileSamples,3),stableFileIntervalMs:Ut(r.stableFileIntervalMs??t.transcriptionStableFileIntervalMs,1e3)}}function Vt(e){let t=fp(e);return{baseName:t,progressFileName:`_transcript/_transcribing.${t}.json`,partialTextFileName:`_partial/_partial.${t}.transcript.txt`,partialJsonFileName:`_partial/_partial.${t}.transcript.json`,finalTextFileName:`${t}.transcript.txt`,finalJsonFileName:`${t}.transcript.json`,metaFileName:`_transcript.${t}.meta.json`,manifestFileName:`_parts/${t}.parts.json`}}function ao(e){let t=e.partSeconds??Wn,r=e.overlapSeconds??Kn,o=[];for(let n=0,i=0;n<e.duration;n+=t,i+=1){let s=Math.min(e.duration,n+t),a=Math.max(0,n-r),u=Math.min(e.duration,s+r),c=`${e.baseName}.part-${String(i).padStart(3,"0")}.${tt.extension}`;o.push({index:i,fileName:c,start:a,end:u,duration:u-a,nominalStart:n,nominalEnd:s,overlapBefore:n-a,overlapAfter:u-s})}return o}function Wt(e){return N().statSync(e).size}function Yn(e,t){return Nr(e,Pe.join("_parts",t),{forWrite:!0})}function no(e){return R(e).length}function bp(e,t){let r=Nr(e,t);if(!j(r))return null;let o=xt(r),n=Array.isArray(o.parts)?o.parts:[];if(!n.length)return null;let i=n.map(a=>({...a,fullPath:Yn(e,a.fileName)}));return i.every(a=>a.fileName&&j(a.fullPath))?i:null}async function vp(e,t){let r=E(e),o=await Jt(e.paths.fileFull),n=ao({baseName:t.baseName,duration:o,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds}),i=[];r.node.ensureDir("_parts");for(let s of n){let a=Yn(e,s.fileName);await Qr({inputPath:e.paths.fileFull,outputPath:a,start:s.start,duration:s.duration,channels:tt.channels,sampleRate:tt.sampleRate,codec:tt.codec,bitrate:tt.bitrate});let u=no(a);if(u>t.maxUploadBytes&&(await Qr({inputPath:e.paths.fileFull,outputPath:a,start:s.start,duration:s.duration,channels:1,sampleRate:16e3,codec:"aac",bitrate:"48k"}),u=no(a)),u>t.maxUploadBytes)throw new Error(`${s.fileName} is still larger than max upload size after compression.`);i.push({...s,sizeBytes:u,fullPath:a})}return r.node.write(t.manifestFileName,{sourceFileName:e.fileName,sourcePath:e.paths.file,duration:o,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,parts:i.map(({fullPath:s,...a})=>a)}),i}async function Ip(e,t){E(e).node.ensureDir("_parts");let o=bp(e,t.manifestFileName);return o?o.map(n=>({...n,sizeBytes:n.sizeBytes??no(n.fullPath)})):vp(e,t)}function Vn(e){return e.map(t=>t.trim()).filter(Boolean).join(`
13
13
 
14
- `)}function Tu(e){return e.map(t=>t.text).filter(Boolean).join(`
15
- `)}function Fu(e){let t={cachedInputCost:0,inputCost:0,outputCost:0,totalCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0,audioSeconds:0}};for(let r of e){let o=r.cost||{};t.cachedInputCost+=Number(o.cachedInputCost||0),t.inputCost+=Number(o.inputCost||0),t.outputCost+=Number(o.outputCost||0),t.totalCost+=Number(o.totalCost||0);for(let n of Object.keys(t.breakdown))t.breakdown[n]+=Number(o.breakdown?.[n]||0)}return t}function Au(e){return new Promise(t=>setTimeout(t,e))}async function Yn(e,t,r){let o=-1,n=0;for(;n<t;){let s=Kt(e);s>0&&s===o?n+=1:(n=0,o=s),n<t&&await Au(r)}return o}function ku(e){return M(e)?D(e):Qe.readFileSync(e)}async function Eu(e,t,r){let o=Kt(e);if(o<=r)return{uploadPath:e,cleanup:()=>{},originalSizeBytes:o,uploadSizeBytes:o,compressed:!1};let n=Qe.mkdtempSync(Te.join(du.tmpdir(),"tim-transcribe-audio-")),s=Te.join(n,`${t}.transcribe.mp3`);await zn({inputPath:e,outputPath:s,channels:1,sampleRate:16e3,bitrate:"24k"});let i=Qe.statSync(s).size;if(i>r)throw Qe.rmSync(n,{recursive:!0,force:!0}),new Error(`${t}.transcribe.mp3 is still larger than max upload size after compression.`);return{uploadPath:s,cleanup:()=>Qe.rmSync(n,{recursive:!0,force:!0}),originalSizeBytes:o,uploadSizeBytes:i,compressed:!0}}async function _u(e,t){let{fileName:r}=e,o=E(e),n=Wt(r),s=Date.now(),i=0;if(o.session.exists(n.finalJsonFileName)||o.session.exists(n.finalTextFileName)){o.session.addToLog("Transcript already exists",{type:"skip"});return}let a=(u,p={},d=!1)=>{let f=Date.now();!d&&f-i<t.progressWriteIntervalMs||(i=f,o.session.write(n.progressFileName,{status:u,mode:t.mode,model:t.model,sourceFileName:r,outputFileName:n.finalJsonFileName,startedAt:s,updatedAt:f,elapsedMs:f-s,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,parallelLimit:t.parallelLimit,...p}))};try{o.session.addToLog(`Starting ${t.mode} transcription`,{data:{mode:t.mode,model:t.model}}),a("preparing-parts",{},!0);let u=t.waitForStableFile?await Yn(e.paths.fileFull,t.stableFileSamples,t.stableFileIntervalMs):Kt(e.paths.fileFull),p=await Pu(e,{baseName:n.baseName,manifestFileName:n.manifestFileName,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,maxUploadBytes:t.maxUploadBytes}),d=Array.from({length:p.length},()=>""),f=p.map(v=>({index:v.index,fileName:v.fileName,status:"pending"})),m=lu(t.parallelLimit),h=()=>{let v=Un(d);v&&o.session.write(n.partialTextFileName,`${v}
16
- `)};a("transcribing",{stableSizeBytes:u,totalParts:p.length,completedParts:0,parts:f},!0);let y=await Promise.all(p.map(v=>m(async()=>{let T=f[v.index];T.status="transcribing",a("transcribing",{totalParts:p.length,parts:f});let L=Su(v.fileName);try{if(o.session.exists(L)){let be=o.session.read(L),ct=String(be.text||"");return d[v.index]=ct,T.status="done",h(),{...v,status:"skip",text:ct,usage:be.usage,cost:be.cost}}let R=D(v.fullPath),U=t.provider!=="openai"?await Fn({provider:t.provider,model:t.model,audio:R,fileName:v.fileName,prompt:t.prompt,language:t.language,providerOptions:t.providerOptions}):await Nn(R,v.fileName,{model:t.model,prompt:t.prompt,language:t.language},be=>{d[v.index]=be.text||d[v.index],h(),a("transcribing",{totalParts:p.length,parts:f,latestPartIndex:v.index,latestTextLength:d[v.index].length})});d[v.index]=U.text||d[v.index],T.status="done";let ke={...v,status:"done",text:d[v.index],usage:U.usage,cost:U.cost};return o.session.write(L,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,partFileName:v.fileName,index:v.index,start:v.start,end:v.end,duration:v.duration,nominalStart:v.nominalStart,nominalEnd:v.nominalEnd,overlapBefore:v.overlapBefore,overlapAfter:v.overlapAfter,text:ke.text,usage:ke.usage,cost:ke.cost}),h(),ke}catch(R){return T.status="error",{...v,status:"error",text:d[v.index],error:R?.message||"Unknown error"}}}))),I=y.filter(v=>v.status==="error");if(I.length){let v=new Error(`Failed to transcribe ${I.length}/${p.length} audio part(s) for ${r}`);throw a("error",{totalParts:p.length,completedParts:y.length-I.length,failedParts:I,parts:f},!0),v}let A=Un(y.map(v=>v.text)),C=Fu(y),w=Date.now();o.session.write(n.finalTextFileName,`${A.trim()}
17
- `),o.session.write(n.finalJsonFileName,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,text:A,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,parallelLimit:t.parallelLimit,parts:y.map(({fullPath:v,...T})=>T)}),o.session.write(n.metaFileName,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,outputFileName:n.finalJsonFileName,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,parallelLimit:t.parallelLimit,partCount:y.length,elapsedMs:w-s,usage:y.map(v=>v.usage),cost:C}),a("done",{totalParts:p.length,completedParts:y.length,textLength:A.length,cost:C,parts:f},!0),o.session.addToLog(`Wrote ${n.finalJsonFileName}`,{duration:w-s,data:{outputFileName:n.finalJsonFileName}})}catch(u){throw a("error",{error:u?.message||"Unknown error"},!0),u}}async function Lu(e,t){if(t.provider!=="openai")throw new Error(`${t.provider} transcription currently supports only mode "chunked", not "diarized".`);let{fileName:r,paths:o}=e,n=E(e),s=Wt(r),i=Date.now(),a=()=>{},u=0,p=0;if(n.session.exists(s.finalJsonFileName)){n.session.addToLog("Transcript already exists",{type:"skip"});return}let d=(f,m=!1)=>{let h=Date.now(),y=f.segmentCount??p;return m||h-u>=t.progressWriteIntervalMs||y>=p+10?(u=h,p=y,n.session.write(s.progressFileName,{status:"transcribing",mode:t.mode,model:t.model,sourceFileName:r,outputFileName:s.finalJsonFileName,startedAt:i,updatedAt:h,elapsedMs:h-i,...f}),!0):!1};try{n.session.addToLog(`Starting ${t.mode} transcription`,{data:{mode:t.mode,model:t.model}}),d({segmentCount:0,textLength:0},!0);let f=t.waitForStableFile?await Yn(o.fileFull,t.stableFileSamples,t.stableFileIntervalMs):Kt(o.fileFull),m=await Eu(o.fileFull,s.baseName,t.maxUploadBytes);a=m.cleanup,d({stage:m.compressed?"compressed-for-upload":"uploading-original",stableSizeBytes:f,originalSizeBytes:m.originalSizeBytes,uploadSizeBytes:m.uploadSizeBytes,maxUploadMb:t.maxUploadMb},!0);let h=ku(m.uploadPath),y=await On(h,Te.basename(m.uploadPath),{model:t.model,prompt:t.prompt,language:t.language},A=>{let C=A.segments.length,w=A.segments[C-1],v=A.text?.length||0;d({segmentCount:C,textLength:v,latestSegment:w,usage:A.usage},A.type==="done")&&(A.type==="segment"||A.type==="done")&&n.session.write(s.partialJsonFileName,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,text:A.text||Tu(A.segments),task:"transcribe",segments:A.segments,usage:A.usage,partial:A.type!=="done",updatedAt:Date.now()})});a(),a=()=>{};let I={mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,uploadFileName:Te.basename(m.uploadPath),originalSizeBytes:m.originalSizeBytes,uploadSizeBytes:m.uploadSizeBytes,compressedForUpload:m.compressed,text:y.text,duration:y.duration,task:y.task,segments:y.segments||[],usage:y.usage};n.session.write(s.finalJsonFileName,I),n.session.write(s.metaFileName,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,outputFileName:s.finalJsonFileName,duration:y.duration,originalSizeBytes:m.originalSizeBytes,uploadSizeBytes:m.uploadSizeBytes,compressedForUpload:m.compressed,usage:y.usage,cost:y.cost}),n.session.write(s.progressFileName,{status:"done",mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,outputFileName:s.finalJsonFileName,startedAt:i,updatedAt:Date.now(),elapsedMs:Date.now()-i,segmentCount:I.segments.length,textLength:I.text?.length||0,usage:y.usage}),n.session.addToLog(`Wrote ${s.finalJsonFileName}`,{duration:Date.now()-i,data:{outputFileName:s.finalJsonFileName}})}catch(f){throw a(),n.session.write(s.progressFileName,{status:"error",mode:t.mode,model:t.model,sourceFileName:r,updatedAt:Date.now(),error:f?.message||"Unknown error"}),f}}async function Nu(e){let{fileName:t,paths:r}=e;if(r.file.includes("/_parts/")||!Wn.test(t))return;let o=io(e);if(o.mode==="diarized"){await Lu(e,o);return}await _u(e,o)}function Ou(e){return Ur(e.settings,"transcription")?$(e.settings,"transcription").map(t=>({...e,fileName:q(e.fileName.slice(0,e.fileName.length-Te.extname(e.fileName).length),t.suffix)+Te.extname(e.fileName),settings:t.settings})):[e]}async function Fe(e){let t=Ou(e),r=await Promise.allSettled(t.map(n=>Nu(n))),o=r.filter(n=>n.status==="rejected");if(o.length){let n=`${o.length}/${r.length} configured transcription outputs failed`;throw new Error(n)}}function Ru(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(!e||typeof e!="object")return;let t=e;for(let r of["totalCost","costUSD","total","usd"]){let o=t[r];if(typeof o=="number"&&Number.isFinite(o))return o}}function Hn(e){return`${e.toFixed(e>=10?1:2)}s`}function H(e){let t=[`Created ${e.outputFileName}`],r=[e.provider,e.model].filter(n=>typeof n=="string"&&n.length>0).join("/");r&&t.push(r),e.width&&e.height&&t.push(`${e.width}\xD7${e.height}`),typeof e.mediaDurationSeconds=="number"&&t.push(`media ${Hn(e.mediaDurationSeconds)}`),typeof e.durationMs=="number"&&t.push(`generated ${Hn(e.durationMs/1e3)}`);let o=Ru(e.cost);return o!==void 0&&t.push(`$${o.toFixed(o<.01?4:2)}`),t.join(" \xB7 ")}var Xn=e=>({provider:"openai",model:e.fileContent?.model,outputFormat:"conversation JSON"});function $u(e){return Buffer.byteLength(typeof e=="string"?e:JSON.stringify(e??""))}var Yt=async e=>{let{fileName:t,fileContent:r,isDebug:o}=e,n=E(e);try{n.session.addToLog("Generating conversation response");let s=t.replace(".convo.json",".out.json"),i=t.replace(".convo.json",".meta.json"),{prompt:a,schema:u,model:p}=r,d=Date.now(),f=await Vr({prompt:a,model:p}),m=Date.now()-d,{conversationId:h=""}=f;n.session.write(s,f.output);let y={provider:"openai",model:p,cost:f.cost,duration:m/1e3,generationTimeMs:m,sourceFileName:t,outputFileName:s,conversationId:h,outputSizeBytes:$u(f.output)};return n.session.write(i,y),n.session.addToLog(H({outputFileName:s,provider:y.provider,model:y.model,cost:y.cost,durationMs:m}),{type:"output",duration:m,data:y}),n.session.patchSessionJson({conversationId:h}),{logData:y}}catch(s){throw s}};var uo={name:"ai-convo",run:Yt,lifecycle:{start:Xn}};var Zn=e=>{let t=Ze(e.fileContent,e.settings);return{provider:t.provider,model:t.model,quality:t.quality,size:t.size,imageSize:t.imageSize,aspectRatio:t.aspectRatio,outputFormat:t.outputFormat}},Ht=async e=>{let{fileName:t,fileContent:r,paths:o,settings:n}=e,s=E(e);try{s.session.addToLog("Generating image");let i=t.replace(/\.image\.json$/i,""),a=r,u=Kr(a,n),p=`${i}.${u}`,d=p.replace(/\.[^.]+$/,".meta.json"),f=`${o.sessionFull}/${p}`,m=Date.now(),h=await Yr(a,f,n),y=Date.now()-m,I=await Xr(f),A=D(f).byteLength,C=I.width||0,w=I.height||0,v=h.provider||Xe(a,n),T=h.model||a.model||n.imageModel,L=h.usage||{},R=co(Ze(a,n)),U={provider:v,model:T,usage:L,tokenUsage:L,cost:h.cost||ie,duration:y/1e3,generationTimeMs:y,modelParams:{...R,provider:v,model:T,outputFormat:h.outputFormat||u},sourceFileName:t,outputFileName:p,outputFormat:h.outputFormat||u,referenceImagePath:a.referenceImagePath,referenceImagePaths:a.referenceImagePaths,referenceType:a.referenceType,referenceTypes:a.referenceTypes,revisedPrompt:h.revisedPrompt,width:C,height:w,outputSizeBytes:A,ratio:C&&w?C/w:0};return s.session.write(d,U),s.session.addToLog(H({outputFileName:p,provider:v,model:T,cost:U.cost,durationMs:y,width:C,height:w}),{type:"output",duration:y,data:U}),{logData:U}}catch(i){throw i}};function co(e){return Array.isArray(e)?e.map(co):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).map(([t,r])=>[t,/(api[-_]?key|access[-_]?token|secret|password|authorization)$/i.test(t)?"[redacted]":co(r)]))}var po={name:"ai-image",run:Ht,lifecycle:{start:Zn}};function Qn(e){return!!(e&&typeof e=="object"&&Object.keys(e).length>0)}function Du(e){return Buffer.byteLength(typeof e=="string"?e:JSON.stringify(e??""))}var es=e=>{let t=e.fileContent||{};return{provider:t.provider,model:t.model,outputFormat:Qn(t.schema)?"structured JSON":"Markdown"}},Xt=async e=>{let{fileName:t,fileContent:r,isDebug:o}=e,n=E(e);try{n.session.addToLog("Generating text response");let{prompt:s,schema:i,provider:a,model:u,providerOptions:p}=r,d=t.replace(".llm.json",Qn(i)?".out.json":".out.md"),f=t.replace(".llm.json",".meta.json"),m=Date.now(),h=await zr({provider:a,prompt:s,schema:i,model:u,providerOptions:p}),y=Date.now()-m;n.session.write(d,h.output);let I={provider:h.provider||a,model:h.model||u,usage:h.usage||{},cost:h.cost,duration:y/1e3,generationTimeMs:y,sourceFileName:t,outputFileName:d,providerMetadata:h.providerMetadata||{},warnings:h.warnings||[],outputSizeBytes:Du(h.output)};return n.session.write(f,I),n.session.addToLog(H({outputFileName:d,provider:I.provider,model:I.model,cost:I.cost,durationMs:y}),{type:"output",duration:y,data:I}),{logData:I}}catch(s){throw s}};var mo={name:"ai-llm",run:Xt,lifecycle:{start:es}};var ts=e=>{let t=e.fileContent||{};return{provider:t.provider,model:t.model,voiceId:t.voiceId,languageCode:t.languageCode,outputFormat:t.outputFormat,speed:t.speed}},Zt=async e=>{let{fileName:t,fileContent:r,isDebug:o}=e,n=E(e);try{n.session.addToLog("Generating speech");let s=t.replace(".tts.json",".mp3"),i=t.replace(".tts.json",".meta.json"),{text:a,voiceId:u,provider:p,model:d,languageCode:f,outputFormat:m,providerOptions:h,speed:y,instructions:I}=r,A=Date.now(),C=await ro(a,u,o,{provider:p,modelId:d,languageCode:f,outputFormat:m,providerOptions:h,speed:y,instructions:I}),w=Date.now()-A;n.session.write(s,C.buffer);let v=0;try{v=await to(`${e.paths.sessionFull}/${s}`)}catch(L){n.session.addToLog(`Could not measure ${s} duration`,{type:"warn",data:{error:L instanceof Error?L.message:String(L),outputFileName:s}})}let T={provider:C.provider,model:C.model||d,voiceId:C.voiceId||u,outputFormat:C.outputFormat||m,mediaType:C.mediaType,duration:Number(v.toFixed(2)),mediaDurationSeconds:Number(v.toFixed(2)),cost:Number(Zr(v).toFixed(4)),sourceFileName:t,outputFileName:s,warnings:C.warnings||[],providerMetadata:C.providerMetadata||{},generationTimeMs:w,outputSizeBytes:C.buffer.byteLength};return n.session.write(i,T),n.session.addToLog(H({outputFileName:s,provider:T.provider,model:T.model,cost:T.cost,durationMs:w,mediaDurationSeconds:T.duration}),{type:"output",duration:w,data:T}),{logData:T}}catch(s){throw s}};var lo={name:"ai-tts",run:Zt,lifecycle:{start:ts}};import rs from"path";import{parse as ju}from"yaml";var os=e=>{let t=ns(String(e.fileContent?.text||"")),o=$(e.settings,"video").map(({output:n})=>{let s={...e.fileContent,...n,...t.overrides};return{provider:s.provider,model:s.model,resolution:s.resolution,aspectRatio:s.aspectRatio,mediaDurationSeconds:s.duration,fps:s.fps}});return o.length===1?o[0]:{outputCount:o.length,outputs:o}};function Mu(e){return e.replace(/\.video\.json$/i,"").replace(/\.prompt\.(?:md|txt)$/i,"")}var Ju=["provider","model","aspectRatio","resolution","duration","fps","seed","reference","referenceImagePath","providerOptions"];function go(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function ns(e){let t=e.match(/^\uFEFF?---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)([\s\S]*)$/),r=t?ju(t[1]):void 0;if(r!=null&&!go(r))throw new Error("ai-video: Markdown frontmatter must be a YAML object.");let o=go(r)?r:{},n=go(o.video)?o.video:{},s=Object.fromEntries(Ju.flatMap(i=>{let a=n[i]??o[i];return a==null||a===""?[]:[[i,a]]}));return{...zu(t?t[2]:e),overrides:s}}var Bu=/!?\[[^\]]*\]\(([^)]+\.(?:jpe?g|png|webp|gif|bmp|tiff?|heic|heif))\)|@((?:\.{0,2}\/)?[^\s,;:!?()[\]{}]+\.(?:jpe?g|png|webp|gif|bmp|tiff?|heic|heif))/gi;function zu(e){let t=[],r=new Map;return{prompt:e.replace(Bu,(n,s,i)=>{let a=String(s||i).trim(),u=r.get(a);return u||(t.push(a),u=t.length,r.set(a,u)),`[Image ${u}]`}).trim(),referenceImagePaths:t}}var Qt=async e=>{let t=E(e),r=ns(String(e.fileContent?.text||"")),o=String(e.fileContent?.prompt||r.prompt).trim();if(!o)throw new Error("ai-video: prompt is required.");t.session.addToLog("Preparing video generation");let n=$(e.settings,"video"),s=[];for(let i of n){let a=`${q(Mu(e.fileName),i.suffix)}.mp4`,u=a.replace(/\.mp4$/i,".meta.json"),p=rs.join(e.paths.sessionFull,a),d={...e.fileContent,prompt:o,...i.output,...r.overrides,referenceImagePaths:r.referenceImagePaths},f=Date.now(),m=w=>{let v=typeof w.phase=="string"?w.phase:"progress";t.session.addToLog(`Video ${v}`,{data:{...w,elapsedSeconds:Number(((Date.now()-f)/1e3).toFixed(1)),outputFileName:a}})},h=Bt(d,i.settings,e.paths.sessionFull),y=zt(r.referenceImagePaths,e.paths.sessionFull);y.length&&t.session.addToLog(`Using ${y.length} reference image${y.length===1?"":"s"}`,{data:{count:y.length,files:y.map(w=>rs.basename(w)),outputFileName:a}});let I=await Hr({...d,onProgress:m},p,i.settings),A=Date.now()-f,C={provider:I.provider,model:I.model,mediaType:I.mediaType,duration:A/1e3,generationTimeMs:A,sourceFileName:e.fileName,outputFileName:a,referenceImagePath:h,referenceImagePaths:y,providerMetadata:I.providerMetadata,warnings:I.warnings,resolution:d.resolution,aspectRatio:d.aspectRatio,mediaDurationSeconds:d.duration,fps:d.fps,outputSizeBytes:D(p).byteLength};t.session.write(u,C),t.session.addToLog(H({outputFileName:a,provider:C.provider,model:C.model,durationMs:A}),{type:"output",duration:A,data:C}),s.push(C)}return{logData:s.length===1?s[0]:{outputCount:s.length,outputs:s}}};var fo={name:"ai-video",run:Qt,lifecycle:{start:os}};import ss from"path";function qu(e){return e.replace(/\.vision\.json$/i,"")}var is=e=>{let r=$(e.settings,"vision").map(({output:o})=>({provider:o.provider,model:o.model}));return r.length===1?r[0]:{outputCount:r.length,outputs:r}};function Uu(e){return e==="~"?process.env.HOME||e:e.replace(/^~(?=\/|\\)/,process.env.HOME||"~")}function Gu(e){let t=e.fileContent||{},r=t.imagePath||t.sourceImagePath||t.referenceImagePath||t.image||t.source;if(typeof r!="string"||!r.trim())throw new Error("ai-vision: imagePath is required.");let o=Uu(r.trim());return ss.isAbsolute(o)?o:ss.resolve(e.paths.sessionFull,o)}var er=async e=>{let t=E(e),r=e.fileContent||{},o=Gu(e),n=D(o),s=$(e.settings,"vision"),i=e.settings["ai-vision"]||{},a=String(r.prompt||i.prompt||"Describe this image accurately. Transcribe all visible text verbatim and distinguish observation from inference.").trim(),u=qu(e.fileName);t.session.addToLog(`Processing ${s.length} vision output${s.length===1?"":"s"}`,{data:{outputCount:s.length}});let p=await Promise.allSettled(s.map(async({output:m,suffix:h})=>{let y=h||m.provider||m.model||"output",I=`${u}.${y}.txt`,A=`${u}.${y}.meta.json`,C=Date.now();try{let w=await Jr({provider:m.provider,model:m.model,prompt:a,image:n,providerOptions:m.providerOptions,imageProviderOptions:m.imageProviderOptions}),v=`${w.output.trim()}
18
- `;t.session.write(I,v);let T=Date.now()-C,L={provider:w.provider||m.provider,model:w.model||m.model,sourceFileName:e.fileName,sourceImagePath:o,outputFileName:I,prompt:a,elapsedMs:T,usage:w.usage||{},cost:w.cost,providerMetadata:w.providerMetadata||{},warnings:w.warnings||[],outputSizeBytes:Buffer.byteLength(v)};return t.session.write(A,L),t.session.addToLog(H({outputFileName:I,provider:L.provider,model:L.model,cost:L.cost,durationMs:T}),{type:"output",duration:T,data:L}),L}catch(w){throw t.session.write(`${u}.${y}.error.json`,{provider:m.provider,model:m.model,sourceFileName:e.fileName,sourceImagePath:o,prompt:a,elapsedMs:Date.now()-C,error:w instanceof Error?w.message:String(w)}),w}})),d=p.filter(m=>m.status==="rejected");if(d.length)throw new Error(`${d.length}/${p.length} configured vision outputs failed`);let f=p.flatMap(m=>m.status==="fulfilled"?[m.value]:[]);return{logData:f.length===1?f[0]:{outputCount:f.length,outputs:f}}};var yo={name:"ai-vision",run:er,lifecycle:{start:is}};import ae from"node:path";var as="analyze-transcript";function us(e){return e.replace(/\.transcript\.(json|md|txt)$/i,"").replace(/\.(json|ya?ml|mp3|m4a|txt|md)$/i,"").replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase()}function Vu(e){return e.replace(/\.transcript\.(json|md|txt)$/i,"").replace(/\.(json|ya?ml|mp3|m4a|txt|md)$/i,"")}function Wu(e){let t=e.settings?.analysisOutputDir||e.settings?.lecturesDir;if(!t||t==="."||t==="./")return e.paths.sessionFull;let r=Ku(t);return ae.isAbsolute(r)?r:ae.resolve(e.paths.rootFull,r)}function Ku(e){return e==="~"?process.env.HOME||e:e.replace(/^~(?=\/|\\)/,process.env.HOME||"~")}function cs(e){let t=Array.isArray(e.segments)?e.segments:[];return t.length?t.map(r=>{let o=r.speaker?`Speaker ${r.speaker}`:"Speaker",n=typeof r.start=="number"?r.start.toFixed(1):"?",s=typeof r.end=="number"?r.end.toFixed(1):"?";return`[${n}-${s}] ${o}: ${r.text}`}).join(`
19
- `):""}function Yu(e){let t=e.fileContent;if(typeof t?.text=="string")return t.text;if(typeof t=="string")return t;if(t?.text)return String(t.text);let r=cs(t);return r||JSON.stringify(t||{},null,2)}function Hu(e){let t=Vu(e.fileName),r={...Ce(ae.join(e.paths.sessionFull,`_captions.${t}.meta.json`)),...Ce(ae.join(e.paths.sessionFull,"_captions",`${t}.meta.json`)),...Ce(ae.join(e.paths.sessionFull,"_captions",`_captions.${t}.meta.json`)),...Ce(ae.join(e.paths.sessionFull,"_meta",`${t}.meta.json`)),...Ce(ae.join(e.paths.sessionFull,"_meta",`_captions.${t}.meta.json`))};return{url:r.url||e.fileContent?.url||"",flavour:e.settings?.analysisPromptId||r.flavour||e.fileContent?.flavour||e.settings?.flavour||as,title:r.title||e.fileContent?.title||t,descriptorFileName:r.sourceFileName,sourceFileName:e.fileName,audioFileName:e.fileContent?.sourceFileName||r.audioFileName}}function Xu(e,t,r){let o=te(Q()),n=e.settings?.analysisPromptId||e.settings?.textAnalysisPromptId||r.flavour||as,s={...e.settings,...e.params,analysisText:t,text:t,transcriptText:t,transcript:e.fileContent,transcriptSegments:cs(e.fileContent),source:r,sourceTitle:r.title,sourceFileName:e.fileName,title:r.title,url:r.url,flavour:r.flavour},a=o.resolvePrompts(e,s)[n]?.promptTemplate;if(!a)throw new Error(`No prompt template found for promptId: ${n}`);return{prompt:a,promptId:n}}function Zu(e,t){let r=us(e),o=String(t||"").replace(/^\.+|\.+$/g,"");return o?`${r}.${o}.md`:`${r}.md`}var tr=async e=>{let t=E(e),r=Date.now(),o=us(e.fileName),n=ae.join("_analysis",`_analysis.${o}.json`),s=(i,a={})=>{t.session.ensureDir("_analysis"),t.session.write(n,{status:i,sourceFileName:e.fileName,startedAt:r,updatedAt:Date.now(),elapsedMs:Date.now()-r,...a})};try{let i=Yu(e).trim();if(!i||i==="{}"){s("skipped",{reason:"empty text"});return}t.session.addToLog("Building analysis prompt"),s("building-prompt",{textLength:i.length});let a=Hu(e),{prompt:u,promptId:p}=Xu(e,i,a),d=Y(e.settings,"llm",{model:e.settings?.analysisModel||e.settings?.model,provider:e.settings?.analysisProvider,providerOptions:e.settings?.analysisProviderOptions}),f=d.model;s("calling-llm",{source:a,promptId:p,model:f,promptLength:u.length,textLength:i.length});let m=await qr({provider:d.provider,model:f,prompt:u,providerOptions:d.providerOptions}),h=Wu(e);Ge(h);let y=Zu(e.fileName,e.settings?.analysisOutputSuffix),I=ae.join(h,y),A=ae.relative(h,e.paths.fileFull),C=[`# ${a.title||o}`,"",`- Source: ${a.url?`[${a.url}](${a.url})`:e.fileName}`,`- Input: [${e.fileName}](${A})`,`- Prompt: ${p}`,""].join(`
20
- `);kr(I,`${C}${m.output.trim()}
21
- `);let w=y.replace(/\.md$/i,".meta.json");t.session.write(w,{source:a,inputFileName:e.fileName,inputPath:e.paths.fileFull,outputFileName:y,promptId:p,provider:m.provider||d.provider,model:m.model||f,usage:m.usage,cost:m.cost,textLength:i.length,outputLength:m.output?.length||0}),s("done",{source:a,outputPath:I,outputFileName:y,promptId:p,provider:m.provider||d.provider,model:m.model||f,outputLength:m.output?.length||0,usage:m.usage,cost:m.cost}),t.session.addToLog(`Wrote ${y}`,{data:{outputFileName:y,outputPath:I}})}catch(i){throw s("error",{error:i?.message||"Unknown error"}),i}};var ho={name:"analyze-text",run:tr};function me(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function ye(e,t){let r=e.settings?.[t];return me(r)?r:{}}function De(e,t,r){return ye(e,t)[r]}function rr(e,t,r,o){let n=De(e,t,r);return typeof n=="string"?n:o}function or(e,t,r,o){let n=Number(De(e,t,r)??o);return Number.isFinite(n)?n:o}function tt(e,t,r,o){let n=De(e,t,r);return Array.isArray(n)?n.filter(s=>typeof s=="string"):o}function ps(e,t,r,o){let n=De(e,t,r);return typeof n=="boolean"?n:o}import nr from"node:path";var ms=["inputOutputPair","promptId","sameName"];function Qu(e,t,r="promptId"){let o=De(e,t,"outputNamingConvention");if(typeof o=="string"){if(ms.includes(o))return o;throw new Error(`${t}.outputNamingConvention must be one of: ${ms.join(", ")}.`)}return r}function sr(e,t){let r=rr(e,t,"promptId");if(r?.trim())return r.trim();throw new Error(`${t} requires settings.${t}.promptId.`)}function X(e,t,r,o="promptId"){let n=Qu(e,t,o);if(n==="sameName")return nr.basename(e.fileName,nr.extname(e.fileName));if(n==="inputOutputPair"){let s=ec(e.fileName);return s?`${r}.${s}`:r}return r}function ec(e){let r=nr.basename(e,nr.extname(e)).split(".").filter(Boolean);if(!(r.length<=1))return r[0]==="input"?r.slice(1).join("."):r[r.length-1]==="input"?r.slice(0,-1).join("."):r.slice(1).join(".")}var rt="req-edit-image";function tc(e){return["Edit the referenced source image according to this fix.","Preserve the original frame composition, character identity, cinematic style, aspect ratio, and story continuity unless the fix explicitly asks otherwise.","","Fix:",e].join(`
22
- `)}var ir=async e=>{let t=E(e),r=String(e.fileContent?.text||"").trim();if(t.session.addToLog("Preparing image edit request"),r.length<or(e,rt,"minPromptLength",1)){t.session.addToLog("Prompt is too short",{type:"skip"});return}if(!r)throw new Error("req-edit-image: fix text is required.");let o=rr(e,rt,"fixSourceExtension","jpg"),n=e.fileName.replace(/\.fix\.txt$/i,""),s=X(e,rt,rt,"sameName"),i=$(e.settings,"image");for(let a of i){let u=q(s,a.suffix),p={...a.output,prompt:tc(r),referenceImagePaths:[`./${n}.${o}`],referenceTypes:tt(e,rt,"fixReferenceTypes",["composition","scenario","style","character"])};t.session.writeImageRequest(u,p)}};var bo={name:"req-edit-image",run:ir};import rc from"node:path";var ls="req-image-to-text";function oc(e){return e.slice(0,e.length-rc.extname(e).length)}function nc(e){let t=ye(e,ls);return me(t.request)?t.request:{}}var ar=async e=>{let t=E(e);t.session.addToLog("Prepared image-to-text request");let r=X(e,ls,oc(e.fileName),"sameName"),o={...nc(e),imagePath:`./${e.fileName}`};t.session.writeVisionRequest(r,o)};var vo={name:"req-image-to-text",run:ar};var ot="req-image-to-image";function sc(e){if(!ps(e,ot,"sourceImageAsReference",!0))return{};let t=e.fileName.split(".").pop()?.toLowerCase()||"";return tt(e,ot,"sourceImageExtensions",["jpg","jpeg","png","webp"]).map(o=>o.replace(/^\./,"").toLowerCase()).includes(t)?{referenceImagePaths:[`./${e.fileName}`],referenceTypes:tt(e,ot,"sourceImageReferenceTypes",["general"])}:{}}function ic(e,t){let n=te(Q()).resolvePrompts(e,{...e.settings,...e.params,fileContent:e.fileContent?.text})[t]?.promptTemplate;return typeof n=="string"?n.trim():""}var ur=async e=>{let t=E(e),r=sr(e,ot),o=ic(e,r);if(t.session.addToLog(`Using prompt ${r}`,{data:{promptId:r}}),!o)throw new Error(`req-image-to-image: no prompt template found for promptId: ${r}`);let n=X(e,ot,r,"inputOutputPair"),s=$(e.settings,"image");for(let i of s){let a=q(n,i.suffix),u={...i.output,prompt:o,...sc(e)};t.session.writeImageRequest(a,u)}};var Io={name:"req-image-to-image",run:ur};var cr="req-text-to-image";function ac(e){let t=ye(e,cr);return me(t.request)?t.request:{}}var pr=async e=>{let t=E(e),r=String(e.fileContent?.text||"").trim();if(t.session.addToLog("Preparing text-to-image request"),r.length<or(e,cr,"minPromptLength",1)){t.session.addToLog("Prompt is too short",{type:"skip"});return}if(!r)throw new Error("req-text-to-image: source prompt text is required.");let o=X(e,cr,cr,"sameName"),n=$(e.settings,"image");for(let s of n){let i=q(o,s.suffix),a={...ac(e),...s.output,prompt:r};t.session.writeImageRequest(i,a)}};var So={name:"req-text-to-image",run:pr};var nt="req-text-to-speech";function uc(e){return String(e.fileContent?.text||"").trim()}function cc(e){return e.match(/^\s*([^:\n]{1,80}):\s+/)?.[1]?.trim()}function pc(e){let t=e.match(/line-[^.]*([A-Z])(?:\.[^.]+)?$/i);if(t?.[1])return t[1].toUpperCase().charCodeAt(0)-65}function mc(e,t){let r=ye(e,nt);if(typeof r.voiceId=="string"&&r.voiceId.trim())return r.voiceId.trim();let o=cc(t),n=me(r.characterVoices)?r.characterVoices:me(e.settings?.characterVoices)?e.settings.characterVoices:void 0;if(o&&n){let p=n[o]||n[o.toLowerCase()];if(typeof p=="string"&&p.trim())return p.trim()}let s=Array.isArray(r.characterNames)?r.characterNames:Array.isArray(e.settings?.characterNames)?e.settings.characterNames:[],i=Array.isArray(r.characterVoiceIds)?r.characterVoiceIds:Array.isArray(e.settings?.characterVoiceIds)?e.settings.characterVoiceIds:[];if(o){let p=s.findIndex(f=>typeof f=="string"&&f.toLowerCase()===o.toLowerCase()),d=p>=0?i[p]:void 0;if(typeof d=="string"&&d.trim())return d.trim()}let a=pc(e.fileName),u=typeof a=="number"?i[a]:void 0;return typeof u=="string"&&u.trim()?u.trim():void 0}function lc(e){let t=ye(e,nt),r=me(t.request)?t.request:{};return{...r,provider:t.provider??r.provider,model:t.model??r.model,languageCode:t.languageCode??r.languageCode,outputFormat:t.outputFormat??r.outputFormat,speed:t.speed??r.speed,instructions:t.instructions??r.instructions,providerOptions:t.providerOptions??r.providerOptions}}var mr=async e=>{let t=E(e),r=Pe(),o=uc(e);if(t.session.addToLog("Prepared text-to-speech request"),!o)throw new Error(`${nt}: source text is required.`);let n=$(e.settings,"tts");for(let s of n){let i={...e,settings:s.settings},a=r.prepareTtsRequest(i,{...lc(i),text:o,voiceId:mc(i,o)}),u=X(i,nt,nt,"sameName"),p=q(u,s.suffix);t.session.writeTtsRequest(p,a)}};var xo={name:"req-text-to-speech",run:mr};var ds="req-text-to-text",lr=async e=>{let t=E(e),r=Pe(),o=sr(e,ds);t.session.addToLog(`Using prompt ${o}`,{data:{promptId:o}});let n=$(e.settings,"llm");for(let s of n){let i={...e,settings:s.settings},a=r.prepareTextToTextRequest(i,{promptId:o}),u=X(i,ds,o),p=q(u,s.suffix);t.session.writeTextToTextRequest(p,a)}};var Co={name:"req-text-to-text",run:lr};import he from"node:path";function dc(e){return e==="~"?process.env.HOME||e:e.replace(/^~(?=\/|\\)/,process.env.HOME||"~")}function gc(e){return e==="move"?"move":"copy"}function fc(e,t){if(typeof e=="boolean")return e;if(typeof e=="string"){if(["true","1","yes"].includes(e.toLowerCase()))return!0;if(["false","0","no"].includes(e.toLowerCase()))return!1}return t}function yc(e){let t=e.settings||{},r=t["place-output"];if(r&&typeof r=="object")return r;let o=t.outputPlacement;return o&&typeof o=="object"?o:{}}function hc(e){let t=yc(e),r=t.dir??t.outputDir??t.destinationDir??t.destination,o=typeof r=="string"&&r.trim()?r.trim():e.paths.sessionFull;return{dir:dc(o),mode:gc(t.mode),overwrite:fc(t.overwrite,!0)}}function bc(e,t){let r=he.isAbsolute(t.dir)?t.dir:he.resolve(e.paths.rootFull,t.dir);return he.join(r,e.fileName)}function vc(e){return`_placement.${e.replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase()||"output"}.json`}var dr=async e=>{let t=E(e),r=hc(e),o=bc(e,r),n=e.paths.fileFull,s=Date.now(),i=(a,u={})=>{Er(he.join(e.paths.sessionFull,vc(e.fileName)),{status:a,sourceFileName:e.fileName,sourcePath:n,destinationPath:o,mode:r.mode,startedAt:s,updatedAt:Date.now(),elapsedMs:Date.now()-s,...u})};try{if(he.resolve(n)===he.resolve(o)){i("skipped",{reason:"destination is source"}),t.session.addToLog("Destination is the source file",{type:"skip"});return}if(M(o)&&!r.overwrite){i("skipped",{reason:"destination exists"}),t.session.addToLog("Destination already exists",{type:"skip",data:{destinationPath:o}});return}Ge(he.dirname(o)),Fr(n,o),r.mode==="move"&&Tr(n),i("done"),t.session.addToLog(`Placed output at ${he.basename(o)}`,{data:{destinationPath:o}})}catch(a){throw i("error",{error:a?.message||"Unknown error"}),a}};var wo={name:"place-output",run:dr};var Po={name:"transcribe-audio",run:Fe};var gs=[uo,po,mo,lo,fo,yo,ho,wo,bo,Io,vo,So,xo,Co,Po];import Qc from"node:fs";import{fileURLToPath as _s}from"node:url";import{homedir as Fs}from"os";import Lo from"path";import{homedir as ws}from"os";import Ic from"node:path";function fs(e,t=[]){return Ke(e,"**/config.json",t).map(r=>Ic.dirname(r)).filter((r,o,n)=>n.indexOf(r)===o).sort()}import To from"lodash";import{minimatch as ys}from"minimatch";import ue from"path";var Sc=!0;function xc(e,t){if(!Sc)return t;let r=e.match(/request-(.*)\.json$/);if(r&&r[1])return r[1]}function Cc(e){let t=oe();return e.replace(t,"")}function wc(e){let t=e.replace(/^\/+|\/+$/g,"").split("/"),r=/^U-\d{4}$/i,o=/^[A-Z]-\d{3}$/i,n=/^\/_requests\/request-.*\.json$/i,s,i,a;t[0]==="users"&&t[1]&&r.test(t[1])&&(s=t[1],i=`/users/${s}`,a=t[2]&&o.test(t[2])?t[2]:void 0);let u,p="none";if(a){let f=s?2:0;t[f+1]==="sessions"&&t[f+2]?(u=t[f+2],p="session"):p="machine"}let d=oe();if(n.test(e)&&d){let f=`${d}${e}`,m=Fo(f);m?.userId&&m?.machineId&&m?.id&&(s=m.userId,i=`/users/${s}`,a=m.machineId,u=xc(e,m.id),p="session")}return{userId:s,userPath:i,machineId:a,sessionId:u,scope:p,isScoped:p!=="none"}}function Fo(e){try{return M(e)?xt(e):{}}catch(t){return G(`Failed to read JSON from ${e}`,t,{filePath:e}),{}}}var hs=(e,t="create")=>{let r=oe(),o=Cc(e),n=wc(o),s=ue.basename(o),i=ue.dirname(o),a={fileName:s,fileContent:{},fileVerb:t,...n,prompts:{},promptIds:[],paths:{},settings:{},params:{},session:{},isDebug:!1,global:We(void 0)},u={root:"/",rootFull:ue.resolve(r),file:"",fileFull:"",user:"",userFull:"",machine:"",machineFull:"",state:"",stateFull:"",session:"",sessionFull:""};switch(u.file=o,u.fileFull=ue.resolve(`${r}${o}`),u.session=i,u.sessionFull=ue.resolve(`${r}${i}`),ue.extname(o).toLowerCase()){case".json":a.fileContent=Fo(u.fileFull);break;case".md":case".txt":let h=M(u.fileFull)?Ar(u.fileFull):"";a.fileContent={text:h};break}if(n.isScoped){let h=n.userPath?`${n.userPath}/${n.machineId}`:`/${n.machineId}`;if(n.userPath&&(u.user=n.userPath,u.userFull=ue.resolve(`${r}${n.userPath}`)),u.machine=h,u.machineFull=ue.resolve(`${r}${h}`),u.state=`${h}/state.json`,u.stateFull=ue.resolve(`${r}${h}/state.json`),n.sessionId){a.sessionId=n.sessionId,u.session=`${h}/sessions/${n.sessionId}`,u.sessionFull=ue.resolve(`${r}${h}/sessions/${n.sessionId}`);let y=`${u.sessionFull}/_session.json`,I=Fo(y);a.params=I.params||{},a.session=I||{},M(`${u.sessionFull}/_debug.md`)&&(a.isDebug=!0)}}a.paths=u;let f=te(Q()).resolveConfig(a);a.config=f,a.global=We(f.global);let m=(f.triggers??{})[t]||{};return a.settings=Pc(f.settings||{},s),a.params=To.merge({},f.params||{},a.params||{}),a.ioBots=m,a.command=Fc(m,o),a.promptIds=Tc(a.settings),a.paths=u,a};function Pc(e,t){let r=To.cloneDeep(e);for(let[o,n]of Object.entries(r)){if(!n||typeof n!="object"||Array.isArray(n))continue;let s=n.fileOverrides;if(!Array.isArray(s))continue;let i=n;for(let a of s){if(!a||typeof a!="object"||Array.isArray(a))continue;let{glob:u,...p}=a;typeof u!="string"||!ys(t,u)||(i=To.mergeWith({},i,p,(d,f)=>Array.isArray(f)?f:void 0))}r[o]=i}return r}function Tc(e){let t=new Set;function r(o){if(!(!o||typeof o!="object")){if(Array.isArray(o)){for(let n of o)r(n);return}for(let[n,s]of Object.entries(o))typeof s=="string"&&s.trim()&&(n==="promptId"||n.endsWith("PromptId"))&&t.add(s.trim()),r(s)}}return r(e),[...t]}function Fc(e,t){let r=[];for(let o in e){let n=o.includes("/")?o:`**/${o}`;ys(t,n)&&r.push(e[o])}return r}var Ac=[{provider:"OpenAI",environmentVariables:["OPENAI_API_KEY"]},{provider:"Azure OpenAI",environmentVariables:["AZURE_OPENAI_API_KEY","AZURE_API_KEY"]},{provider:"Google",environmentVariables:["GOOGLE_API_KEY"]},{provider:"ElevenLabs",environmentVariables:["ELEVENLABS_API_KEY","ELEVEN_LABS_API_KEY"]},{provider:"Anthropic",environmentVariables:["ANTHROPIC_API_KEY"]},{provider:"xAI",environmentVariables:["XAI_API_KEY"]},{provider:"Hugging Face",environmentVariables:["HUGGINGFACE_API_KEY","HF_TOKEN"]},{provider:"ByteDance",environmentVariables:["ARK_API_KEY"]}];function kc(e=process.env){return Ac.filter(({environmentVariables:t})=>t.some(r=>e[r]?.trim())).map(({provider:t})=>t)}function bs(e=process.env){return kc(e).join(", ")||"none"}var Ao={};function ko(e={}){let t=Array.isArray(e)?e.map(({name:r,run:o,lifecycle:n})=>[r,{run:o,lifecycle:n}]):Object.entries(e).map(([r,o])=>[r,{run:o}]);for(let[r,o]of t){if(!r||typeof o.run!="function")throw new TypeError("Each IO bot must provide a non-empty name and a run(context) function.");Ao[r]=o}}function vs(e){return Ao[e]?.run}function Is(e){return Ao[e]?.lifecycle}import Ss from"path";function Ec(e){let t=e.outputNamingConvention;if(!t)return"promptId";if(t==="promptId"||t==="sameName"||t==="inputOutputPair")return t;throw new Error("outputNamingConvention must be one of: inputOutputPair, promptId, sameName.")}function _c(e,t,r){let{fileName:o}=r,n=Ss.basename(o,Ss.extname(o));switch(e){case"sameName":return n;case"inputOutputPair":{let s=n.split(".").filter(Boolean);return s.length<=1?t:s[0]==="input"?`${t}.${s.slice(1).join(".")}`:s[s.length-1]==="input"?`${t}.${s.slice(0,-1).join(".")}`:`${t}.${s.slice(1).join(".")}`}default:return t}}var xs=async(e,t)=>{let{settings:r,fileContent:o}=t,{conversationId:n}=o??{};if(n)return;let s=Ec(r),i=e.replace("convo-",""),a=E(t),u=Pe();a.session.addToLog(`Using conversation prompt ${i}`,{data:{promptId:i}});let p=u.prepareTextToTextRequest(t,{promptId:i}),d=_c(s,i,t);a.session.writeConvoRequest(d,p)};function Cs(e,t){let r=E(t),o=[...r.session.applyCleanupPolicy([e]),...r.session.applyCleanupManifests(t.fileName)];for(let n of o)K(t,{botName:e,kind:"diagnostic",level:"debug",message:`IO bot ${e} cleanup completed`,data:n},{console:!1,local:!0,operation:!0,workspace:!1});return o}var Lc=e=>e.startsWith("convo-")?"convo":"main",Nc=async(e,t)=>{let r=Lc(e),o=new Date().toISOString(),n=Date.now(),s=Oc(new Date(n)),i={...t,botName:e,operationId:s},a=Is(e),u={};try{u=a?.start?.(i)??{}}catch{}let p={botName:e,command:e,eventType:"operation",operationId:s,phase:"started",sourceFileName:t.fileName,sourceFilePath:t.paths?.file,startedAt:o,...u};K(i,{botName:e,kind:"bot-start",level:"info",message:`IO bot ${e} started`,operationId:s,data:p});let d=(m,h={})=>{let y=new Date().toISOString(),I=Date.now()-n;K(i,{botName:e,duration:I,kind:m==="done"?"bot-done":"bot-error",level:m==="done"?"info":"error",message:m==="done"?`IO bot ${e} completed`:String(h.error??`IO bot ${e} failed`),operationId:s,data:{...p,...h,durationMs:I,endedAt:y,phase:m}}),an(i)},f=m=>{Cs(e,i),d("done",m?.logData?{result:m.logData}:{})};try{if(r==="convo"){await xs(e,i),f(void 0);return}if(r!=="main"){d("error",{error:`Command type not supported: ${r}`});return}let m=vs(e);if(typeof m!="function"){d("error",{error:`No command found for: ${e}`});return}let h=await m(i);f(h)}catch(m){let h=m instanceof Error?m.message:String(m);d("error",{error:h,...m instanceof Error&&m.stack?{stack:m.stack}:{}})}};function Oc(e){let t=e.getFullYear(),r=Math.floor((Date.UTC(t,e.getMonth(),e.getDate())-Date.UTC(t,0,1))/864e5)+1,o=String(e.getHours()).padStart(2,"0"),n=String(e.getMinutes()).padStart(2,"0");return`${t}-${String(r).padStart(3,"0")}-${o}-${n}-${lt()}`}var st=async(e,t)=>{let r=[];for(let o of e){let n;Array.isArray(o)?n=st(o,t):n=Nc(o,t),r.push(n)}return Promise.all(r)};var Eo=new Map,Rc=new Set(["_analysis","_cleanup","_done","_meta","_parts","_partial","_prompts","_temp","_transcript"]),$c=["_partial.","_transcribing.","_transcript."],Dc=(e,t)=>e.split(/[\\/]+/).some(r=>Rc.has(r))||$c.some(r=>t.startsWith(r));function jc(e){return`${e.charAt(0).toUpperCase()}${e.slice(1)}`}function Mc(e){if(typeof e=="number")return Number.isFinite(e)&&e>0?e:0;if(typeof e!="string")return 0;let t=e.trim().match(/^(\d+(?:\.\d+)?)(ms|s|m|h)?$/i);if(!t)return 0;let r=Number(t[1]);if(!Number.isFinite(r)||r<=0)return 0;let o=(t[2]||"ms").toLowerCase(),n=o==="h"?3600*1e3:o==="m"?60*1e3:o==="s"?1e3:1;return Math.round(r*n)}function Jc(e,t){let r=e.config?.triggers;if(!r||typeof r!="object")return 0;let o=r[`delay${jc(t)}`];return Mc(o??r.delay)}function je(e){return(Array.isArray(e.command)?e.command:[e.command]).filter(r=>typeof r=="string"&&r.length>0)}var Bc=e=>e.some(t=>t.startsWith("ai-"));function zc(e){return Dc(e.paths.file,e.fileName)||e.fileName.endsWith("log.txt")}function qc(e,t){for(let r of je(e))K(e,{botName:r,duration:t,kind:"bot-delay",level:"info",message:`IO bot ${r} waiting ${t}ms`,crudVerb:e.fileVerb,data:{delayMs:t}},{operation:!1})}function Uc(e){for(let t of je(e))K(e,{botName:t,kind:"bot-skip",level:"info",message:"Delay superseded by a newer filesystem event",crudVerb:e.fileVerb},{operation:!1})}function _o(e,t,r){if(zc(e))return Promise.resolve();K(e,{crudVerb:t,kind:"crud",level:"info",message:`${t} ${e.fileName}`},{local:!1,operation:!1});let o=je(e);if(o.length===0)return Promise.resolve();let n=Bc(o)?0:Jc(e,t);if(n<=0)return r(e);let s=`${e.paths.sessionFull}:${t}`,i=Eo.get(s);return i&&(clearTimeout(i.timer),Uc(i.context),i.resolve()),new Promise((a,u)=>{qc(e,n);let p=setTimeout(()=>{Eo.delete(s),r(e).then(a,u)},n);Eo.set(s,{context:e,timer:p,resolve:a})})}var Gc=async e=>{await st(je(e),e)},Vc=async e=>{await st(je(e),e)},Wc=async e=>{},Kc=async e=>{await st(je(e),e)},Yc=e=>_o(e,"create",Gc),Hc=e=>_o(e,"update",Vc),Xc=e=>_o(e,"delete",Kc),gr={bootstrap:Wc,create:Yc,update:Hc,delete:Xc};var Ps=["_partial*","**/_partial*","_transcribing*","**/_transcribing*","_transcript.*","**/_transcript.*","_analysis/**","**/_analysis/**","_cleanup/**","**/_cleanup/**","_done/**","**/_done/**","_meta/**","**/_meta/**","_parts/**","**/_parts/**","_prompts/**","**/_prompts/**","_temp/**","**/_temp/**","_transcript/**","**/_transcript/**","**/node_modules/**","**/dist/**","**/__pycache__/**","**/*.egg-info/**","_tim/**","**/_tim/**"];async function Ts(e){let t=e.cwd,r=e.version||"unknown",o=t.startsWith(ws())?t.replace(ws(),"~"):t,n=fs(t,Ps);if(!n.length)throw new Error(`No config.json files found recursively under ${o}. Add config.json to each directory TIM should watch.`);zo(t);let s=Zo(),i=bs();return await s.log({kind:"system",level:"info",message:`TIM version ${r}`,data:{version:r}}),await s.log({kind:"system",level:"info",message:`Listener started in ${o} with ${n.length} configured director${n.length===1?"y":"ies"}`,data:{root:o,configuredDirectories:n.length}}),await s.log({kind:"system",level:"info",message:`Providers: ${i}`,data:{providers:i}}),Rr({cwd:t,watchPaths:n,depth:0,target:"**/*",ignore:Ps,createContext:hs,silent:!0,callbacks:{onAdd:gr.create,onChange:gr.update,onUnlink:gr.delete},ignoreLogs:!0})}function No(e,t=process.cwd()){if(!e)return Lo.resolve(t);let r=e==="~"?Fs():e.startsWith("~/")?Lo.join(Fs(),e.slice(2)):e;return Lo.resolve(t,r)}function As(e={}){return ko(e.bots),Le(e.galleries),Ts({cwd:No(e.cwd),version:e.version})}var ks={id:"character-sheets",title:"Character Sheets",description:"Reusable image-to-image workflow for generating polished character sheet outputs from input artwork.",triggers:{create:{"input.*.png":"req-image-to-image","*.image.json":"ai-image"},update:{"input.*.png":"req-image-to-image","*.image.json":"ai-image"}},settings:{"req-image-to-image":{outputNamingConvention:"inputOutputPair",promptId:"character-sheet",sourceImageAsReference:!0,sourceImageReferenceTypes:["character","style"]},"ai-image":{output:{provider:"google",model:"gemini-3-pro-image",aspectRatio:"3:2",imageSize:"4K"}}}};var Es=_s(new URL("./prompts/character-sheets",import.meta.url)),ep=_s(new URL("../src/character-sheets/_prompts",import.meta.url)),tp=Qc.existsSync(Es)?Es:ep,Ls={name:"g-character-sheets",aliases:["character-sheets","character-sheet"],config:ks},fr=[Ls],Oo=[{gallery:Ls.name,from:tp}];Le(fr);var yr={name:"@tim-fs/cli",publishConfig:{access:"public",tag:"alpha"},version:"0.1.3-alpha.0",type:"module",description:"Turn ordinary folders into durable, inspectable AI and code workflows that any person, agent, or program can invoke by writing a file",bin:{tim:"dist/index.js"},files:["dist"],scripts:{build:"npm run clean && npm run build:debug","build:release":"node build.mjs --release","build:debug":"node build.mjs",clean:"rm -rf dist",link:"npm run build && npm link",prepack:"npm run clean && npm run build:release",test:"npm run build && node --test test/*.test.mjs",typecheck:"tsc -p tsconfig.json",watch:'nodemon --watch src --ext ts --exec "npm run build"'},keywords:["automation","filesystem","file-watcher","ai","workflow"],license:"MIT",engines:{node:">=20"},repository:{type:"git",url:"git+https://github.com/dht/tim-fs.git",directory:"cli"},bugs:{url:"https://github.com/dht/tim-fs/issues"},homepage:"https://github.com/dht/tim-fs#readme",dependencies:{"@ai-sdk/anthropic":"^3.0.84","@ai-sdk/azure":"^3.0.87","@ai-sdk/bytedance":"^1.0.17","@ai-sdk/elevenlabs":"^2.0.35","@ai-sdk/google":"^3.0.82","@ai-sdk/huggingface":"^1.0.52","@ai-sdk/openai":"^3.0.71","@ai-sdk/xai":"^3.0.95","@elevenlabs/elevenlabs-js":"^2.58.0",ai:"^6.0.205",chokidar:"^5.0.0",commander:"^12.1.0",dotenv:"^17.2.3","fs-extra":"^11.3.2",glob:"13.0.0",kleur:"^4.1.5",lodash:"^4.18.1",logform:"^2.7.0",minimatch:"^10.2.5",openai:"^6.48.0","p-limit":"^7.2.0",sharp:"^0.34.5",winston:"^3.18.3","winston-transport":"^4.9.0",ws:"^8.21.1",yaml:"^2.9.0"},devDependencies:{"@tim-fs/core":"workspace:^","@tim-fs/io-core":"workspace:^","@tim-fs/io-gallery":"workspace:^","@types/node":"^20.19.25",esbuild:"^0.27.2",nodemon:"^3.1.7",typescript:"^5.9.3"}};import{config as cp}from"dotenv";import Me from"node:fs";import op from"node:os";import hr from"node:path";import{parse as np}from"dotenv";var it=[{name:"OPENAI_API_KEY",label:"OpenAI"},{name:"ANTHROPIC_API_KEY",label:"Anthropic"},{name:"GOOGLE_API_KEY",label:"Google Gemini"},{name:"ELEVENLABS_API_KEY",label:"ElevenLabs",aliases:["ELEVEN_LABS_API_KEY"]},{name:"XAI_API_KEY",label:"xAI"},{name:"HUGGINGFACE_API_KEY",label:"Hugging Face",aliases:["HF_TOKEN","HF_ACCESS_TOKEN"]},{name:"ARK_API_KEY",label:"ByteDance ModelArk"},{name:"AZURE_OPENAI_API_KEY",label:"Azure OpenAI",aliases:["AZURE_API_KEY"]}];function sp(e=process.env){return e.TIM_HOME||hr.join(op.homedir(),".tim")}function Je(e=process.env){return e.TIM_ENV_FILE||hr.join(sp(e),".env")}function ip(e){return Me.existsSync(e)?np(Me.readFileSync(e)):{}}function ap(e,...t){for(let r of t)for(let o of[e.name,...e.aliases||[]]){let n=r[o]?.trim();if(n)return n}return""}function up(e){return e?JSON.stringify(e):""}function Ns(e={}){let t=e.environment||process.env,r=e.destination||Je(t),o=ip(r);return Object.fromEntries(it.map(n=>[n.name,ap(n,o,t)]))}function Os(e,t=Je()){let r=["# TIM provider credentials","# Run `npx @tim-fs/cli@alpha init` again to update this file.","",...it.map(o=>`${o.name}=${up(e[o.name]||"")}`),""];Me.mkdirSync(hr.dirname(t),{recursive:!0,mode:448}),Me.chmodSync(hr.dirname(t),448),Me.writeFileSync(t,r.join(`
23
- `),{encoding:"utf8",mode:384}),Me.chmodSync(t,384)}cp({path:Je(),quiet:!0});import{emitKeypressEvents as pp}from"node:readline";import V from"kleur";var mp=["\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557","\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D"," \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557"," \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u255A\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551"," \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551"," \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"],lp=e=>V.enabled?`\x1B[38;5;208m${e}\x1B[39m`:e;function Rs(e){let t=mp.map((r,o)=>o<3?V.cyan(r):lp(r));console.log(`
14
+ `)}function Sp(e){return e.map(t=>t.text).filter(Boolean).join(`
15
+ `)}function xp(e){let t={cachedInputCost:0,inputCost:0,outputCost:0,totalCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0,audioSeconds:0}};for(let r of e){let o=r.cost||{};t.cachedInputCost+=Number(o.cachedInputCost||0),t.inputCost+=Number(o.inputCost||0),t.outputCost+=Number(o.outputCost||0),t.totalCost+=Number(o.totalCost||0);for(let n of Object.keys(t.breakdown))t.breakdown[n]+=Number(o.breakdown?.[n]||0)}return t}function wp(e){return new Promise(t=>setTimeout(t,e))}async function Xn(e,t,r){let o=-1,n=0;for(;n<t;){let i=Wt(e);i>0&&i===o?n+=1:(n=0,o=i),n<t&&await wp(r)}return o}function Cp(e){return j(e)?R(e):et.readFileSync(e)}async function Pp(e,t,r){let o=Wt(e);if(o<=r)return{uploadPath:e,cleanup:()=>{},originalSizeBytes:o,uploadSizeBytes:o,compressed:!1};let n=et.mkdtempSync(Pe.join(pp.tmpdir(),"tim-transcribe-audio-")),i=Pe.join(n,`${t}.transcribe.mp3`);await Mn({inputPath:e,outputPath:i,channels:1,sampleRate:16e3,bitrate:"24k"});let s=et.statSync(i).size;if(s>r)throw et.rmSync(n,{recursive:!0,force:!0}),new Error(`${t}.transcribe.mp3 is still larger than max upload size after compression.`);return{uploadPath:i,cleanup:()=>et.rmSync(n,{recursive:!0,force:!0}),originalSizeBytes:o,uploadSizeBytes:s,compressed:!0}}async function Tp(e,t){let{fileName:r}=e,o=E(e),n=Vt(r),i=Date.now(),s=0;if(o.node.exists(n.finalJsonFileName)||o.node.exists(n.finalTextFileName)){o.node.addToLog("Transcript already exists",{type:"skip"});return}let a=(u,c={},l=!1)=>{let d=Date.now();!l&&d-s<t.progressWriteIntervalMs||(s=d,o.node.write(n.progressFileName,{status:u,mode:t.mode,model:t.model,sourceFileName:r,outputFileName:n.finalJsonFileName,startedAt:i,updatedAt:d,elapsedMs:d-i,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,parallelLimit:t.parallelLimit,...c}))};try{o.node.addToLog(`Starting ${t.mode} transcription`,{data:{mode:t.mode,model:t.model}}),a("preparing-parts",{},!0);let u=t.waitForStableFile?await Xn(e.paths.fileFull,t.stableFileSamples,t.stableFileIntervalMs):Wt(e.paths.fileFull),c=await Ip(e,{baseName:n.baseName,manifestFileName:n.manifestFileName,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,maxUploadBytes:t.maxUploadBytes}),l=Array.from({length:c.length},()=>""),d=c.map(b=>({index:b.index,fileName:b.fileName,status:"pending"})),m=ap(t.parallelLimit),h=()=>{let b=Vn(l);b&&o.node.write(n.partialTextFileName,`${b}
16
+ `)};a("transcribing",{stableSizeBytes:u,totalParts:c.length,completedParts:0,parts:d},!0);let y=await Promise.all(c.map(b=>m(async()=>{let F=d[b.index];F.status="transcribing",a("transcribing",{totalParts:c.length,parts:d});let _=yp(b.fileName);try{if(o.node.exists(_)){let he=o.node.read(_),ut=String(he.text||"");return l[b.index]=ut,F.status="done",h(),{...b,status:"skip",text:ut,usage:he.usage,cost:he.cost}}let $=R(b.fullPath),G=t.provider!=="openai"?await An({provider:t.provider,model:t.model,audio:$,fileName:b.fileName,prompt:t.prompt,language:t.language,providerOptions:t.providerOptions}):await qn($,b.fileName,{model:t.model,prompt:t.prompt,language:t.language},he=>{l[b.index]=he.text||l[b.index],h(),a("transcribing",{totalParts:c.length,parts:d,latestPartIndex:b.index,latestTextLength:l[b.index].length})});l[b.index]=G.text||l[b.index],F.status="done";let Ae={...b,status:"done",text:l[b.index],usage:G.usage,cost:G.cost};return o.node.write(_,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,partFileName:b.fileName,index:b.index,start:b.start,end:b.end,duration:b.duration,nominalStart:b.nominalStart,nominalEnd:b.nominalEnd,overlapBefore:b.overlapBefore,overlapAfter:b.overlapAfter,text:Ae.text,usage:Ae.usage,cost:Ae.cost}),h(),Ae}catch($){return F.status="error",{...b,status:"error",text:l[b.index],error:$?.message||"Unknown error"}}}))),I=y.filter(b=>b.status==="error");if(I.length){let b=new Error(`Failed to transcribe ${I.length}/${c.length} audio part(s) for ${r}`);throw a("error",{totalParts:c.length,completedParts:y.length-I.length,failedParts:I,parts:d},!0),b}let T=Vn(y.map(b=>b.text)),x=xp(y),w=Date.now();o.node.write(n.finalTextFileName,`${T.trim()}
17
+ `),o.node.write(n.finalJsonFileName,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,text:T,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,parallelLimit:t.parallelLimit,parts:y.map(({fullPath:b,...F})=>F)}),o.node.write(n.metaFileName,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,outputFileName:n.finalJsonFileName,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,parallelLimit:t.parallelLimit,partCount:y.length,elapsedMs:w-i,usage:y.map(b=>b.usage),cost:x}),a("done",{totalParts:c.length,completedParts:y.length,textLength:T.length,cost:x,parts:d},!0),o.node.addToLog(`Wrote ${n.finalJsonFileName}`,{duration:w-i,data:{outputFileName:n.finalJsonFileName}})}catch(u){throw a("error",{error:u?.message||"Unknown error"},!0),u}}async function Fp(e,t){if(t.provider!=="openai")throw new Error(`${t.provider} transcription currently supports only mode "chunked", not "diarized".`);let{fileName:r,paths:o}=e,n=E(e),i=Vt(r),s=Date.now(),a=()=>{},u=0,c=0;if(n.node.exists(i.finalJsonFileName)){n.node.addToLog("Transcript already exists",{type:"skip"});return}let l=(d,m=!1)=>{let h=Date.now(),y=d.segmentCount??c;return m||h-u>=t.progressWriteIntervalMs||y>=c+10?(u=h,c=y,n.node.write(i.progressFileName,{status:"transcribing",mode:t.mode,model:t.model,sourceFileName:r,outputFileName:i.finalJsonFileName,startedAt:s,updatedAt:h,elapsedMs:h-s,...d}),!0):!1};try{n.node.addToLog(`Starting ${t.mode} transcription`,{data:{mode:t.mode,model:t.model}}),l({segmentCount:0,textLength:0},!0);let d=t.waitForStableFile?await Xn(o.fileFull,t.stableFileSamples,t.stableFileIntervalMs):Wt(o.fileFull),m=await Pp(o.fileFull,i.baseName,t.maxUploadBytes);a=m.cleanup,l({stage:m.compressed?"compressed-for-upload":"uploading-original",stableSizeBytes:d,originalSizeBytes:m.originalSizeBytes,uploadSizeBytes:m.uploadSizeBytes,maxUploadMb:t.maxUploadMb},!0);let h=Cp(m.uploadPath),y=await Un(h,Pe.basename(m.uploadPath),{model:t.model,prompt:t.prompt,language:t.language},T=>{let x=T.segments.length,w=T.segments[x-1],b=T.text?.length||0;l({segmentCount:x,textLength:b,latestSegment:w,usage:T.usage},T.type==="done")&&(T.type==="segment"||T.type==="done")&&n.node.write(i.partialJsonFileName,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,text:T.text||Sp(T.segments),task:"transcribe",segments:T.segments,usage:T.usage,partial:T.type!=="done",updatedAt:Date.now()})});a(),a=()=>{};let I={mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,uploadFileName:Pe.basename(m.uploadPath),originalSizeBytes:m.originalSizeBytes,uploadSizeBytes:m.uploadSizeBytes,compressedForUpload:m.compressed,text:y.text,duration:y.duration,task:y.task,segments:y.segments||[],usage:y.usage};n.node.write(i.finalJsonFileName,I),n.node.write(i.metaFileName,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,outputFileName:i.finalJsonFileName,duration:y.duration,originalSizeBytes:m.originalSizeBytes,uploadSizeBytes:m.uploadSizeBytes,compressedForUpload:m.compressed,usage:y.usage,cost:y.cost}),n.node.write(i.progressFileName,{status:"done",mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,outputFileName:i.finalJsonFileName,startedAt:s,updatedAt:Date.now(),elapsedMs:Date.now()-s,segmentCount:I.segments.length,textLength:I.text?.length||0,usage:y.usage}),n.node.addToLog(`Wrote ${i.finalJsonFileName}`,{duration:Date.now()-s,data:{outputFileName:i.finalJsonFileName}})}catch(d){throw a(),n.node.write(i.progressFileName,{status:"error",mode:t.mode,model:t.model,sourceFileName:r,updatedAt:Date.now(),error:d?.message||"Unknown error"}),d}}async function Ap(e){let{fileName:t,paths:r}=e;if(r.file.includes("/_parts/")||!Hn.test(t))return;let o=so(e);if(o.mode==="diarized"){await Fp(e,o);return}await Tp(e,o)}function kp(e){return Gr(e.settings,"transcription")?D(e.settings,"transcription").map(t=>({...e,fileName:z(e.fileName.slice(0,e.fileName.length-Pe.extname(e.fileName).length),t.suffix)+Pe.extname(e.fileName),settings:t.settings})):[e]}async function Te(e){let t=kp(e),r=await Promise.allSettled(t.map(n=>Ap(n))),o=r.filter(n=>n.status==="rejected");if(o.length){let n=`${o.length}/${r.length} configured transcription outputs failed`;throw new Error(n)}}function Ep(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(!e||typeof e!="object")return;let t=e;for(let r of["totalCost","costUSD","total","usd"]){let o=t[r];if(typeof o=="number"&&Number.isFinite(o))return o}}function Zn(e){return`${e.toFixed(e>=10?1:2)}s`}function ie(e){let t=[`Created ${e.outputFileName}`],r=[e.provider,e.model].filter(n=>typeof n=="string"&&n.length>0).join("/");r&&t.push(r),e.width&&e.height&&t.push(`${e.width}\xD7${e.height}`),typeof e.mediaDurationSeconds=="number"&&t.push(`media ${Zn(e.mediaDurationSeconds)}`),typeof e.durationMs=="number"&&t.push(`generated ${Zn(e.durationMs/1e3)}`);let o=Ep(e.cost);return o!==void 0&&t.push(`$${o.toFixed(o<.01?4:2)}`),t.join(" \xB7 ")}var Qn=e=>{let t=Qe(e.fileContent,e.settings);return{provider:t.provider,model:t.model,quality:t.quality,size:t.size,imageSize:t.imageSize,aspectRatio:t.aspectRatio,outputFormat:t.outputFormat}},Kt=async e=>{let{fileName:t,fileContent:r,paths:o,settings:n}=e,i=E(e);try{i.node.addToLog("Generating image");let s=t.replace(/\.image\.json$/i,""),a=r,u=Wr(a,n),c=`${s}.${u}`,l=c.replace(/\.[^.]+$/,".meta.json"),d=`${o.nodeFull}/${c}`,m=Date.now(),h=await Kr(a,d,n),y=Date.now()-m,I=await Yr(d),T=R(d).byteLength,x=I.width||0,w=I.height||0,b=h.provider||Ze(a,n),F=h.model||a.model||n.imageModel,_=h.usage||{},$=po(Qe(a,n)),G={provider:b,model:F,usage:_,tokenUsage:_,cost:h.cost||ne,duration:y/1e3,generationTimeMs:y,modelParams:{...$,provider:b,model:F,outputFormat:h.outputFormat||u},sourceFileName:t,outputFileName:c,outputFormat:h.outputFormat||u,referenceImagePath:a.referenceImagePath,referenceImagePaths:a.referenceImagePaths,referenceType:a.referenceType,referenceTypes:a.referenceTypes,revisedPrompt:h.revisedPrompt,width:x,height:w,outputSizeBytes:T,ratio:x&&w?x/w:0};return i.node.write(l,G),i.node.addToLog(ie({outputFileName:c,provider:b,model:F,cost:G.cost,durationMs:y,width:x,height:w}),{type:"output",duration:y,data:G}),{logData:G}}catch(s){throw s}};function po(e){return Array.isArray(e)?e.map(po):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).map(([t,r])=>[t,/(api[-_]?key|access[-_]?token|secret|password|authorization)$/i.test(t)?"[redacted]":po(r)]))}var uo={name:"ai-image",run:Kt,lifecycle:{start:Qn}};function ei(e){return!!(e&&typeof e=="object"&&Object.keys(e).length>0)}function _p(e){return Buffer.byteLength(typeof e=="string"?e:JSON.stringify(e??""))}var ti=e=>{let t=e.fileContent||{};return{provider:t.provider,model:t.model,outputFormat:ei(t.schema)?"structured JSON":"Markdown"}},Ht=async e=>{let{fileName:t,fileContent:r}=e,o=E(e);try{o.node.addToLog("Generating text response");let{prompt:n,schema:i,provider:s,model:a,providerOptions:u}=r,c=t.replace(".llm.json",ei(i)?".out.json":".out.md"),l=t.replace(".llm.json",".meta.json"),d=Date.now(),m=await qr({provider:s,prompt:n,schema:i,model:a,providerOptions:u}),h=Date.now()-d;o.node.write(c,m.output);let y={provider:m.provider||s,model:m.model||a,usage:m.usage||{},cost:m.cost,duration:h/1e3,generationTimeMs:h,sourceFileName:t,outputFileName:c,providerMetadata:m.providerMetadata||{},warnings:m.warnings||[],outputSizeBytes:_p(m.output)};return o.node.write(l,y),o.node.addToLog(ie({outputFileName:c,provider:y.provider,model:y.model,cost:y.cost,durationMs:h}),{type:"output",duration:h,data:y}),{logData:y}}catch(n){throw n}};var co={name:"ai-llm",run:Ht,lifecycle:{start:ti}};var ri=e=>{let t=e.fileContent||{};return{provider:t.provider,model:t.model,voiceId:t.voiceId,languageCode:t.languageCode,outputFormat:t.outputFormat,speed:t.speed}},Yt=async e=>{let{fileName:t,fileContent:r}=e,o=e.settings?.debug===!0,n=E(e);try{n.node.addToLog("Generating speech");let i=t.replace(".tts.json",".mp3"),s=t.replace(".tts.json",".meta.json"),{text:a,voiceId:u,provider:c,model:l,languageCode:d,outputFormat:m,providerOptions:h,speed:y,instructions:I}=r,T=Date.now(),x=await to(a,u,o,{provider:c,modelId:l,languageCode:d,outputFormat:m,providerOptions:h,speed:y,instructions:I}),w=Date.now()-T;n.node.write(i,x.buffer);let b=0;try{b=await eo(`${e.paths.nodeFull}/${i}`)}catch(_){n.node.addToLog(`Could not measure ${i} duration`,{type:"warn",data:{error:_ instanceof Error?_.message:String(_),outputFileName:i}})}let F={provider:x.provider,model:x.model||l,voiceId:x.voiceId||u,outputFormat:x.outputFormat||m,mediaType:x.mediaType,duration:Number(b.toFixed(2)),mediaDurationSeconds:Number(b.toFixed(2)),cost:Number(Xr(b).toFixed(4)),sourceFileName:t,outputFileName:i,warnings:x.warnings||[],providerMetadata:x.providerMetadata||{},generationTimeMs:w,outputSizeBytes:x.buffer.byteLength};return n.node.write(s,F),n.node.addToLog(ie({outputFileName:i,provider:F.provider,model:F.model,cost:F.cost,durationMs:w,mediaDurationSeconds:F.duration}),{type:"output",duration:w,data:F}),{logData:F}}catch(i){throw i}};var mo={name:"ai-tts",run:Yt,lifecycle:{start:ri}};import oi from"path";import{parse as Lp}from"yaml";var ni=e=>{let t=ii(String(e.fileContent?.text||"")),o=D(e.settings,"video").map(({output:n})=>{let i={...e.fileContent,...n,...t.overrides};return{provider:i.provider,model:i.model,resolution:i.resolution,aspectRatio:i.aspectRatio,mediaDurationSeconds:i.duration,fps:i.fps}});return o.length===1?o[0]:{outputCount:o.length,outputs:o}};function Np(e){return e.replace(/\.video\.json$/i,"").replace(/\.prompt\.(?:md|txt)$/i,"")}var Op=["provider","model","aspectRatio","resolution","duration","fps","seed","reference","referenceImagePath","providerOptions"];function lo(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function ii(e){let t=e.match(/^\uFEFF?---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)([\s\S]*)$/),r=t?Lp(t[1]):void 0;if(r!=null&&!lo(r))throw new Error("ai-video: Markdown frontmatter must be a YAML object.");let o=lo(r)?r:{},n=lo(o.video)?o.video:{},i=Object.fromEntries(Op.flatMap(s=>{let a=n[s]??o[s];return a==null||a===""?[]:[[s,a]]}));return{...$p(t?t[2]:e),overrides:i}}var Rp=/!?\[[^\]]*\]\(([^)]+\.(?:jpe?g|png|webp|gif|bmp|tiff?|heic|heif))\)|@((?:\.{0,2}\/)?[^\s,;:!?()[\]{}]+\.(?:jpe?g|png|webp|gif|bmp|tiff?|heic|heif))/gi;function $p(e){let t=[],r=new Map;return{prompt:e.replace(Rp,(n,i,s)=>{let a=String(i||s).trim(),u=r.get(a);return u||(t.push(a),u=t.length,r.set(a,u)),`[Image ${u}]`}).trim(),referenceImagePaths:t}}var Xt=async e=>{let t=E(e),r=ii(String(e.fileContent?.text||"")),o=String(e.fileContent?.prompt||r.prompt).trim();if(!o)throw new Error("ai-video: prompt is required.");t.node.addToLog("Preparing video generation");let n=D(e.settings,"video"),i=[];for(let s of n){let a=`${z(Np(e.fileName),s.suffix)}.mp4`,u=a.replace(/\.mp4$/i,".meta.json"),c=oi.join(e.paths.nodeFull,a),l={...e.fileContent,prompt:o,...s.output,...r.overrides,referenceImagePaths:r.referenceImagePaths},d=Date.now(),m=w=>{let b=typeof w.phase=="string"?w.phase:"progress";t.node.addToLog(`Video ${b}`,{data:{...w,elapsedSeconds:Number(((Date.now()-d)/1e3).toFixed(1)),outputFileName:a}})},h=Mt(l,s.settings,e.paths.nodeFull),y=Bt(r.referenceImagePaths,e.paths.nodeFull);y.length&&t.node.addToLog(`Using ${y.length} reference image${y.length===1?"":"s"}`,{data:{count:y.length,files:y.map(w=>oi.basename(w)),outputFileName:a}});let I=await Hr({...l,onProgress:m},c,s.settings),T=Date.now()-d,x={provider:I.provider,model:I.model,mediaType:I.mediaType,duration:T/1e3,generationTimeMs:T,sourceFileName:e.fileName,outputFileName:a,referenceImagePath:h,referenceImagePaths:y,providerMetadata:I.providerMetadata,warnings:I.warnings,resolution:l.resolution,aspectRatio:l.aspectRatio,mediaDurationSeconds:l.duration,fps:l.fps,outputSizeBytes:R(c).byteLength};t.node.write(u,x),t.node.addToLog(ie({outputFileName:a,provider:x.provider,model:x.model,durationMs:T}),{type:"output",duration:T,data:x}),i.push(x)}return{logData:i.length===1?i[0]:{outputCount:i.length,outputs:i}}};var go={name:"ai-video",run:Xt,lifecycle:{start:ni}};import si from"path";function Dp(e){return e.replace(/\.vision\.json$/i,"")}var ai=e=>{let r=D(e.settings,"vision").map(({output:o})=>({provider:o.provider,model:o.model}));return r.length===1?r[0]:{outputCount:r.length,outputs:r}};function jp(e){return e==="~"?process.env.HOME||e:e.replace(/^~(?=\/|\\)/,process.env.HOME||"~")}function Mp(e){let t=e.fileContent||{},r=t.imagePath||t.sourceImagePath||t.referenceImagePath||t.image||t.source;if(typeof r!="string"||!r.trim())throw new Error("ai-vision: imagePath is required.");let o=jp(r.trim());return si.isAbsolute(o)?o:si.resolve(e.paths.nodeFull,o)}var Zt=async e=>{let t=E(e),r=e.fileContent||{},o=Mp(e),n=R(o),i=D(e.settings,"vision"),s=e.settings["ai-vision"]||{},a=String(r.prompt||s.prompt||"Describe this image accurately. Transcribe all visible text verbatim and distinguish observation from inference.").trim(),u=Dp(e.fileName);t.node.addToLog(`Processing ${i.length} vision output${i.length===1?"":"s"}`,{data:{outputCount:i.length}});let c=await Promise.allSettled(i.map(async({output:m,suffix:h})=>{let y=h||m.provider||m.model||"output",I=`${u}.${y}.txt`,T=`${u}.${y}.meta.json`,x=Date.now();try{let w=await Jr({provider:m.provider,model:m.model,prompt:a,image:n,providerOptions:m.providerOptions,imageProviderOptions:m.imageProviderOptions}),b=`${w.output.trim()}
18
+ `;t.node.write(I,b);let F=Date.now()-x,_={provider:w.provider||m.provider,model:w.model||m.model,sourceFileName:e.fileName,sourceImagePath:o,outputFileName:I,prompt:a,elapsedMs:F,usage:w.usage||{},cost:w.cost,providerMetadata:w.providerMetadata||{},warnings:w.warnings||[],outputSizeBytes:Buffer.byteLength(b)};return t.node.write(T,_),t.node.addToLog(ie({outputFileName:I,provider:_.provider,model:_.model,cost:_.cost,durationMs:F}),{type:"output",duration:F,data:_}),_}catch(w){throw t.node.write(`${u}.${y}.error.json`,{provider:m.provider,model:m.model,sourceFileName:e.fileName,sourceImagePath:o,prompt:a,elapsedMs:Date.now()-x,error:w instanceof Error?w.message:String(w)}),w}})),l=c.filter(m=>m.status==="rejected");if(l.length)throw new Error(`${l.length}/${c.length} configured vision outputs failed`);let d=c.flatMap(m=>m.status==="fulfilled"?[m.value]:[]);return{logData:d.length===1?d[0]:{outputCount:d.length,outputs:d}}};var fo={name:"ai-vision",run:Zt,lifecycle:{start:ai}};import se from"node:path";var pi="analyze-transcript";function ui(e){return e.replace(/\.transcript\.(json|md|txt)$/i,"").replace(/\.(json|ya?ml|mp3|m4a|txt|md)$/i,"").replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase()}function Bp(e){return e.replace(/\.transcript\.(json|md|txt)$/i,"").replace(/\.(json|ya?ml|mp3|m4a|txt|md)$/i,"")}function Jp(e){let t=e.settings?.analysisOutputDir||e.settings?.lecturesDir;if(!t||t==="."||t==="./")return e.paths.nodeFull;let r=zp(t);return se.isAbsolute(r)?r:se.resolve(e.paths.rootFull,r)}function zp(e){return e==="~"?process.env.HOME||e:e.replace(/^~(?=\/|\\)/,process.env.HOME||"~")}function ci(e){let t=Array.isArray(e.segments)?e.segments:[];return t.length?t.map(r=>{let o=r.speaker?`Speaker ${r.speaker}`:"Speaker",n=typeof r.start=="number"?r.start.toFixed(1):"?",i=typeof r.end=="number"?r.end.toFixed(1):"?";return`[${n}-${i}] ${o}: ${r.text}`}).join(`
19
+ `):""}function qp(e){let t=e.fileContent;if(typeof t?.text=="string")return t.text;if(typeof t=="string")return t;if(t?.text)return String(t.text);let r=ci(t);return r||JSON.stringify(t||{},null,2)}function Up(e){let t=Bp(e.fileName),r={...we(se.join(e.paths.nodeFull,`_captions.${t}.meta.json`)),...we(se.join(e.paths.nodeFull,"_captions",`${t}.meta.json`)),...we(se.join(e.paths.nodeFull,"_captions",`_captions.${t}.meta.json`)),...we(se.join(e.paths.nodeFull,"_meta",`${t}.meta.json`)),...we(se.join(e.paths.nodeFull,"_meta",`_captions.${t}.meta.json`))};return{url:r.url||e.fileContent?.url||"",flavour:e.settings?.analysisPromptId||r.flavour||e.fileContent?.flavour||e.settings?.flavour||pi,title:r.title||e.fileContent?.title||t,descriptorFileName:r.sourceFileName,sourceFileName:e.fileName,audioFileName:e.fileContent?.sourceFileName||r.audioFileName}}function Gp(e,t,r){let o=ee(Z()),n=e.settings?.analysisPromptId||e.settings?.textAnalysisPromptId||r.flavour||pi,i={...e.settings,...e.params,analysisText:t,text:t,transcriptText:t,transcript:e.fileContent,transcriptSegments:ci(e.fileContent),source:r,sourceTitle:r.title,sourceFileName:e.fileName,title:r.title,url:r.url,flavour:r.flavour},a=o.resolvePrompts(e,i)[n]?.promptTemplate;if(!a)throw new Error(`No prompt template found for promptId: ${n}`);return{prompt:a,promptId:n}}function Vp(e,t){let r=ui(e),o=String(t||"").replace(/^\.+|\.+$/g,"");return o?`${r}.${o}.md`:`${r}.md`}var Qt=async e=>{let t=E(e),r=Date.now(),o=ui(e.fileName),n=se.join("_analysis",`_analysis.${o}.json`),i=(s,a={})=>{t.node.ensureDir("_analysis"),t.node.write(n,{status:s,sourceFileName:e.fileName,startedAt:r,updatedAt:Date.now(),elapsedMs:Date.now()-r,...a})};try{let s=qp(e).trim();if(!s||s==="{}"){i("skipped",{reason:"empty text"});return}t.node.addToLog("Building analysis prompt"),i("building-prompt",{textLength:s.length});let a=Up(e),{prompt:u,promptId:c}=Gp(e,s,a),l=H(e.settings,"llm",{model:e.settings?.analysisModel||e.settings?.model,provider:e.settings?.analysisProvider,providerOptions:e.settings?.analysisProviderOptions}),d=l.model;i("calling-llm",{source:a,promptId:c,model:d,promptLength:u.length,textLength:s.length});let m=await Ur({provider:l.provider,model:d,prompt:u,providerOptions:l.providerOptions}),h=Jp(e);Ge(h);let y=Vp(e.fileName,e.settings?.analysisOutputSuffix),I=se.join(h,y),T=se.relative(h,e.paths.fileFull),x=[`# ${a.title||o}`,"",`- Source: ${a.url?`[${a.url}](${a.url})`:e.fileName}`,`- Input: [${e.fileName}](${T})`,`- Prompt: ${c}`,""].join(`
20
+ `);Er(I,`${x}${m.output.trim()}
21
+ `);let w=y.replace(/\.md$/i,".meta.json");t.node.write(w,{source:a,inputFileName:e.fileName,inputPath:e.paths.fileFull,outputFileName:y,promptId:c,provider:m.provider||l.provider,model:m.model||d,usage:m.usage,cost:m.cost,textLength:s.length,outputLength:m.output?.length||0}),i("done",{source:a,outputPath:I,outputFileName:y,promptId:c,provider:m.provider||l.provider,model:m.model||d,outputLength:m.output?.length||0,usage:m.usage,cost:m.cost}),t.node.addToLog(`Wrote ${y}`,{data:{outputFileName:y,outputPath:I}})}catch(s){throw i("error",{error:s?.message||"Unknown error"}),s}};var yo={name:"analyze-text",run:Qt};function ce(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function fe(e,t){let r=e.settings?.[t];return ce(r)?r:{}}function $e(e,t,r){return fe(e,t)[r]}function er(e,t,r,o){let n=$e(e,t,r);return typeof n=="string"?n:o}function tr(e,t,r,o){let n=Number($e(e,t,r)??o);return Number.isFinite(n)?n:o}function rt(e,t,r,o){let n=$e(e,t,r);return Array.isArray(n)?n.filter(i=>typeof i=="string"):o}function mi(e,t,r,o){let n=$e(e,t,r);return typeof n=="boolean"?n:o}import rr from"node:path";var li=["inputOutputPair","promptId","sameName"];function Wp(e,t,r="promptId"){let o=$e(e,t,"outputNamingConvention");if(typeof o=="string"){if(li.includes(o))return o;throw new Error(`${t}.outputNamingConvention must be one of: ${li.join(", ")}.`)}return r}function or(e,t){let r=er(e,t,"promptId");if(r?.trim())return r.trim();throw new Error(`${t} requires settings.${t}.promptId.`)}function Y(e,t,r,o="promptId"){let n=Wp(e,t,o);if(n==="sameName")return rr.basename(e.fileName,rr.extname(e.fileName));if(n==="inputOutputPair"){let i=Kp(e.fileName);return i?`${r}.${i}`:r}return r}function Kp(e){let r=rr.basename(e,rr.extname(e)).split(".").filter(Boolean);if(!(r.length<=1))return r[0]==="input"?r.slice(1).join("."):r[r.length-1]==="input"?r.slice(0,-1).join("."):r.slice(1).join(".")}var ot="req-edit-image";function Hp(e){return["Edit the referenced source image according to this fix.","Preserve the original frame composition, character identity, cinematic style, aspect ratio, and story continuity unless the fix explicitly asks otherwise.","","Fix:",e].join(`
22
+ `)}var nr=async e=>{let t=E(e),r=String(e.fileContent?.text||"").trim();if(t.node.addToLog("Preparing image edit request"),r.length<tr(e,ot,"minPromptLength",1)){t.node.addToLog("Prompt is too short",{type:"skip"});return}if(!r)throw new Error("req-edit-image: fix text is required.");let o=er(e,ot,"fixSourceExtension","jpg"),n=e.fileName.replace(/\.fix\.txt$/i,""),i=Y(e,ot,ot,"sameName"),s=D(e.settings,"image");for(let a of s){let u=z(i,a.suffix),c={...a.output,prompt:Hp(r),referenceImagePaths:[`./${n}.${o}`],referenceTypes:rt(e,ot,"fixReferenceTypes",["composition","scenario","style","character"])};t.node.writeImageRequest(u,c)}};var ho={name:"req-edit-image",run:nr};import Yp from"node:path";var di="req-image-to-text";function Xp(e){return e.slice(0,e.length-Yp.extname(e).length)}function Zp(e){let t=fe(e,di);return ce(t.request)?t.request:{}}var ir=async e=>{let t=E(e);t.node.addToLog("Prepared image-to-text request");let r=Y(e,di,Xp(e.fileName),"sameName"),o={...Zp(e),imagePath:`./${e.fileName}`};t.node.writeVisionRequest(r,o)};var bo={name:"req-image-to-text",run:ir};var nt="req-image-to-image";function Qp(e){if(!mi(e,nt,"sourceImageAsReference",!0))return{};let t=e.fileName.split(".").pop()?.toLowerCase()||"";return rt(e,nt,"sourceImageExtensions",["jpg","jpeg","png","webp"]).map(o=>o.replace(/^\./,"").toLowerCase()).includes(t)?{referenceImagePaths:[`./${e.fileName}`],referenceTypes:rt(e,nt,"sourceImageReferenceTypes",["general"])}:{}}function eu(e,t){let n=ee(Z()).resolvePrompts(e,{...e.settings,...e.params,fileContent:e.fileContent?.text})[t]?.promptTemplate;return typeof n=="string"?n.trim():""}var sr=async e=>{let t=E(e),r=or(e,nt),o=eu(e,r);if(t.node.addToLog(`Using prompt ${r}`,{data:{promptId:r}}),!o)throw new Error(`req-image-to-image: no prompt template found for promptId: ${r}`);let n=Y(e,nt,r,"inputOutputPair"),i=D(e.settings,"image");for(let s of i){let a=z(n,s.suffix),u={...s.output,prompt:o,...Qp(e)};t.node.writeImageRequest(a,u)}};var vo={name:"req-image-to-image",run:sr};var ar="req-text-to-image";function tu(e){let t=fe(e,ar);return ce(t.request)?t.request:{}}var pr=async e=>{let t=E(e),r=String(e.fileContent?.text||"").trim();if(t.node.addToLog("Preparing text-to-image request"),r.length<tr(e,ar,"minPromptLength",1)){t.node.addToLog("Prompt is too short",{type:"skip"});return}if(!r)throw new Error("req-text-to-image: source prompt text is required.");let o=Y(e,ar,ar,"sameName"),n=D(e.settings,"image");for(let i of n){let s=z(o,i.suffix),a={...tu(e),...i.output,prompt:r};t.node.writeImageRequest(s,a)}};var Io={name:"req-text-to-image",run:pr};var it="req-text-to-speech";function ru(e){return String(e.fileContent?.text||"").trim()}function ou(e){return e.match(/^\s*([^:\n]{1,80}):\s+/)?.[1]?.trim()}function nu(e){let t=e.match(/line-[^.]*([A-Z])(?:\.[^.]+)?$/i);if(t?.[1])return t[1].toUpperCase().charCodeAt(0)-65}function iu(e,t){let r=fe(e,it);if(typeof r.voiceId=="string"&&r.voiceId.trim())return r.voiceId.trim();let o=ou(t),n=ce(r.characterVoices)?r.characterVoices:ce(e.settings?.characterVoices)?e.settings.characterVoices:void 0;if(o&&n){let c=n[o]||n[o.toLowerCase()];if(typeof c=="string"&&c.trim())return c.trim()}let i=Array.isArray(r.characterNames)?r.characterNames:Array.isArray(e.settings?.characterNames)?e.settings.characterNames:[],s=Array.isArray(r.characterVoiceIds)?r.characterVoiceIds:Array.isArray(e.settings?.characterVoiceIds)?e.settings.characterVoiceIds:[];if(o){let c=i.findIndex(d=>typeof d=="string"&&d.toLowerCase()===o.toLowerCase()),l=c>=0?s[c]:void 0;if(typeof l=="string"&&l.trim())return l.trim()}let a=nu(e.fileName),u=typeof a=="number"?s[a]:void 0;return typeof u=="string"&&u.trim()?u.trim():void 0}function su(e){let t=fe(e,it),r=ce(t.request)?t.request:{};return{...r,provider:t.provider??r.provider,model:t.model??r.model,languageCode:t.languageCode??r.languageCode,outputFormat:t.outputFormat??r.outputFormat,speed:t.speed??r.speed,instructions:t.instructions??r.instructions,providerOptions:t.providerOptions??r.providerOptions}}var ur=async e=>{let t=E(e),r=Ye(),o=ru(e);if(t.node.addToLog("Prepared text-to-speech request"),!o)throw new Error(`${it}: source text is required.`);let n=D(e.settings,"tts");for(let i of n){let s={...e,settings:i.settings},a=r.prepareTtsRequest(s,{...su(s),text:o,voiceId:iu(s,o)}),u=Y(s,it,it,"sameName"),c=z(u,i.suffix);t.node.writeTtsRequest(c,a)}};var So={name:"req-text-to-speech",run:ur};var gi="req-text-to-text",cr=async e=>{let t=E(e),r=Ye(),o=or(e,gi);t.node.addToLog(`Using prompt ${o}`,{data:{promptId:o}});let n=D(e.settings,"llm");for(let i of n){let s={...e,settings:i.settings},a=r.prepareTextToTextRequest(s,{promptId:o}),u=Y(s,gi,o),c=z(u,i.suffix);t.node.writeTextToTextRequest(c,a)}};var xo={name:"req-text-to-text",run:cr};import ye from"node:path";function au(e){return e==="~"?process.env.HOME||e:e.replace(/^~(?=\/|\\)/,process.env.HOME||"~")}function pu(e){return e==="move"?"move":"copy"}function uu(e,t){if(typeof e=="boolean")return e;if(typeof e=="string"){if(["true","1","yes"].includes(e.toLowerCase()))return!0;if(["false","0","no"].includes(e.toLowerCase()))return!1}return t}function cu(e){let t=e.settings||{},r=t["place-output"];if(r&&typeof r=="object")return r;let o=t.outputPlacement;return o&&typeof o=="object"?o:{}}function mu(e){let t=cu(e),r=t.dir??t.outputDir??t.destinationDir??t.destination,o=typeof r=="string"&&r.trim()?r.trim():e.paths.nodeFull;return{dir:au(o),mode:pu(t.mode),overwrite:uu(t.overwrite,!0)}}function lu(e,t){let r=ye.isAbsolute(t.dir)?t.dir:ye.resolve(e.paths.rootFull,t.dir);return ye.join(r,e.fileName)}function du(e){return`_placement.${e.replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase()||"output"}.json`}var mr=async e=>{let t=E(e),r=mu(e),o=lu(e,r),n=e.paths.fileFull,i=Date.now(),s=(a,u={})=>{_r(ye.join(e.paths.nodeFull,du(e.fileName)),{status:a,sourceFileName:e.fileName,sourcePath:n,destinationPath:o,mode:r.mode,startedAt:i,updatedAt:Date.now(),elapsedMs:Date.now()-i,...u})};try{if(ye.resolve(n)===ye.resolve(o)){s("skipped",{reason:"destination is source"}),t.node.addToLog("Destination is the source file",{type:"skip"});return}if(j(o)&&!r.overwrite){s("skipped",{reason:"destination exists"}),t.node.addToLog("Destination already exists",{type:"skip",data:{destinationPath:o}});return}Ge(ye.dirname(o)),Ar(n,o),r.mode==="move"&&Fr(n),s("done"),t.node.addToLog(`Placed output at ${ye.basename(o)}`,{data:{destinationPath:o}})}catch(a){throw s("error",{error:a?.message||"Unknown error"}),a}};var wo={name:"place-output",run:mr};var Co={name:"transcribe-audio",run:Te};import Po from"node:fs";import gu from"node:os";import To from"node:path";import fu from"sharp";var Fo="tinify-image",yu=/\.input\.(png|jpe?g|webp)$/i,te={force:!1,outputSuffix:"tiny",jpeg:{quality:80,progressive:!0,mozjpeg:!0},png:{quality:80,compressionLevel:9,palette:!0,effort:7},webp:{quality:80,effort:6}};function De(e,t,r,o){return typeof e=="number"&&Number.isFinite(e)?Math.min(o,Math.max(r,Math.round(e))):t}function lr(e,t){return typeof e=="boolean"?e:t}function dr(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:{}}function hu(e={}){let t=dr(e[Fo]),r=dr(t.jpeg),o=dr(t.png),n=dr(t.webp),s=(typeof t.outputSuffix=="string"?t.outputSuffix.trim():"").replace(/[^a-z0-9_-]+/gi,"-").replace(/^-+|-+$/g,"");return{force:lr(t.force,te.force),outputSuffix:s||te.outputSuffix,jpeg:{quality:De(r.quality,te.jpeg.quality,1,100),progressive:lr(r.progressive,te.jpeg.progressive),mozjpeg:lr(r.mozjpeg,te.jpeg.mozjpeg)},png:{quality:De(o.quality,te.png.quality,1,100),compressionLevel:De(o.compressionLevel,te.png.compressionLevel,0,9),palette:lr(o.palette,te.png.palette),effort:De(o.effort,te.png.effort,1,10)},webp:{quality:De(n.quality,te.webp.quality,1,100),effort:De(n.effort,te.webp.effort,0,6)}}}function bu(e,t){let r=e.match(yu);if(!r)throw new Error(`${Fo}: expected a *.input.png, *.input.jpg, *.input.jpeg, or *.input.webp file.`);let o=r[1].toLowerCase(),n=o==="png"?"png":o==="webp"?"webp":"jpeg",i=e.slice(0,-r[0].length),s=`${i}.${t}.${o}`;return{format:n,outputFileName:s,metadataFileName:`${i}.${t}.meta.json`}}async function vu(e,t,r,o){let n=fu(e).rotate();return r==="png"?n.png(o.png).toFile(t):r==="webp"?n.webp(o.webp).toFile(t):n.jpeg(o.jpeg).toFile(t)}var Iu={createFileManager:E,encode:vu,makeTempDir:()=>Po.mkdtempSync(To.join(gu.tmpdir(),"tim-tinify-image-")),pathExists:j,readBuffer:R,removeTempDir:e=>Po.rmSync(e,{recursive:!0,force:!0}),stat:e=>Po.statSync(e)};async function Su(e,t=Iu){let r=t.createFileManager(e),o=hu(e.settings||{}),{format:n,outputFileName:i,metadataFileName:s}=bu(e.fileName,o.outputSuffix),a=e.paths.fileFull,u=To.join(e.paths.nodeFull,i);if(!o.force&&t.pathExists(u)){let h=t.stat(a);if(t.stat(u).mtimeMs>=h.mtimeMs)return r.node.addToLog(`${i} is already current`,{type:"skip"}),{skipped:!0,outputFileName:i}}let c=Date.now(),l=t.stat(a),d=t.makeTempDir(),m=To.join(d,i);r.node.addToLog(`Tinyfying ${e.fileName}`);try{let h=await t.encode(a,m,n,o),y=t.readBuffer(m);r.node.write(i,y);let I=y.byteLength,T=l.size-I,x=l.size>0?Number((T/l.size*100).toFixed(2)):0;return r.node.write(s,{bot:Fo,sourceFileName:e.fileName,outputFileName:i,format:n,inputSizeBytes:l.size,outputSizeBytes:I,savedBytes:T,reductionPercent:x,width:h.width,height:h.height,elapsedMs:Date.now()-c,settings:o}),r.node.addToLog(`Wrote ${i}`,{data:{inputSizeBytes:l.size,outputSizeBytes:I,reductionPercent:x}}),{skipped:!1,outputFileName:i,metadataFileName:s}}catch(h){throw r.node.addToLog(`Failed to tinyfy ${e.fileName}`,{type:"error",data:{error:h?.message||"Unknown error"}}),h}finally{t.removeTempDir(d)}}var gr=async e=>{await Su(e)};var Ao={name:"tinify-image",run:gr};var fi=[uo,co,mo,go,fo,yo,wo,ho,vo,bo,Io,So,xo,Co,Ao];import Xu from"node:fs";import{fileURLToPath as _i}from"node:url";import{homedir as Fi}from"os";import Oo from"path";import{homedir as Ci}from"os";import xu from"node:path";function yi(e,t=[]){return Ke(e,"**/config.json",t).map(r=>xu.dirname(r)).filter((r,o,n)=>n.indexOf(r)===o).sort()}import ko from"lodash";import{minimatch as hi}from"minimatch";import je from"path";function wu(e){let t=ae();return e.replace(t,"")}function Cu(e){try{return j(e)?xt(e):{}}catch(t){return q(`Failed to read JSON from ${e}`,t,{filePath:e}),{}}}var bi=(e,t="create")=>{let r=ae(),o=wu(e),n=je.basename(o),i=je.dirname(o),s={fileName:n,fileContent:{},fileVerb:t,prompts:{},promptIds:[],paths:{},settings:{},params:{},global:We(void 0)},a={root:"/",rootFull:je.resolve(r),file:"",fileFull:"",node:"",nodeFull:""};switch(a.file=o,a.fileFull=je.resolve(`${r}${o}`),a.node=i,a.nodeFull=je.resolve(`${r}${i}`),je.extname(o).toLowerCase()){case".json":s.fileContent=Cu(a.fileFull);break;case".md":case".txt":let m=j(a.fileFull)?kr(a.fileFull):"";s.fileContent={text:m};break}s.paths=a;let l=ee(Z()).resolveConfig(s);s.config=l,s.global=We(l.global);let d=(l.triggers??{})[t]||{};return s.settings=Pu(l.settings||{},n),s.params=ko.merge({},l.params||{},s.params||{}),s.ioBots=d,s.command=Fu(d,o),s.promptIds=Tu(s.settings),s.paths=a,s};function Pu(e,t){let r=ko.cloneDeep(e);for(let[o,n]of Object.entries(r)){if(!n||typeof n!="object"||Array.isArray(n))continue;let i=n.fileOverrides;if(!Array.isArray(i))continue;let s=n;for(let a of i){if(!a||typeof a!="object"||Array.isArray(a))continue;let{glob:u,...c}=a;typeof u!="string"||!hi(t,u)||(s=ko.mergeWith({},s,c,(l,d)=>Array.isArray(d)?d:void 0))}r[o]=s}return r}function Tu(e){let t=new Set;function r(o){if(!(!o||typeof o!="object")){if(Array.isArray(o)){for(let n of o)r(n);return}for(let[n,i]of Object.entries(o))typeof i=="string"&&i.trim()&&(n==="promptId"||n.endsWith("PromptId"))&&t.add(i.trim()),r(i)}}return r(e),[...t]}function Fu(e,t){let r=[];for(let o in e){let n=o.includes("/")?o:`**/${o}`;hi(t,n)&&r.push(e[o])}return r}var Au=[{provider:"OpenAI",environmentVariables:["OPENAI_API_KEY"]},{provider:"Azure OpenAI",environmentVariables:["AZURE_OPENAI_API_KEY","AZURE_API_KEY"]},{provider:"Google",environmentVariables:["GOOGLE_API_KEY"]},{provider:"ElevenLabs",environmentVariables:["ELEVENLABS_API_KEY","ELEVEN_LABS_API_KEY"]},{provider:"Anthropic",environmentVariables:["ANTHROPIC_API_KEY"]},{provider:"xAI",environmentVariables:["XAI_API_KEY"]},{provider:"Hugging Face",environmentVariables:["HUGGINGFACE_API_KEY","HF_TOKEN"]},{provider:"ByteDance",environmentVariables:["ARK_API_KEY"]}];function ku(e=process.env){return Au.filter(({environmentVariables:t})=>t.some(r=>e[r]?.trim())).map(({provider:t})=>t)}function vi(e=process.env){return ku(e).join(", ")||"none"}var Eo={};function _o(e={}){let t=Array.isArray(e)?e.map(({name:r,run:o,lifecycle:n})=>[r,{run:o,lifecycle:n}]):Object.entries(e).map(([r,o])=>[r,{run:o}]);for(let[r,o]of t){if(!r||typeof o.run!="function")throw new TypeError("Each IO bot must provide a non-empty name and a run(context) function.");Eo[r]=o}}function Ii(e){return Eo[e]?.run}function Si(e){return Eo[e]?.lifecycle}var Eu=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)});var xi=()=>Eu().substring(0,4);function wi(e,t){let r=E(t),o=[...r.node.applyCleanupPolicy([e]),...r.node.applyCleanupManifests(t.fileName)];for(let n of o)K(t,{botName:e,kind:"diagnostic",level:"debug",message:`IO bot ${e} cleanup completed`,data:n},{console:!1,local:!0,operation:!0,workspace:!1});return o}var _u=async(e,t)=>{let r=new Date().toISOString(),o=Date.now(),n=Lu(new Date(o)),i={...t,botName:e,operationId:n},s=Si(e),a={};try{a=s?.start?.(i)??{}}catch{}let u={botName:e,command:e,eventType:"operation",operationId:n,phase:"started",sourceFileName:t.fileName,sourceFilePath:t.paths?.file,startedAt:r,...a};K(i,{botName:e,kind:"bot-start",level:"info",message:`IO bot ${e} started`,operationId:n,data:u});let c=(d,m={})=>{let h=new Date().toISOString(),y=Date.now()-o;K(i,{botName:e,duration:y,kind:d==="done"?"bot-done":"bot-error",level:d==="done"?"info":"error",message:d==="done"?`IO bot ${e} completed`:String(m.error??`IO bot ${e} failed`),operationId:n,data:{...u,...m,durationMs:y,endedAt:h,phase:d}}),un(i)},l=d=>{wi(e,i),c("done",d?.logData?{result:d.logData}:{})};try{let d=Ii(e);if(typeof d!="function"){c("error",{error:`No command found for: ${e}`});return}let m=await d(i);l(m)}catch(d){let m=d instanceof Error?d.message:String(d);c("error",{error:m,...d instanceof Error&&d.stack?{stack:d.stack}:{}})}};function Lu(e){let t=e.getFullYear(),r=Math.floor((Date.UTC(t,e.getMonth(),e.getDate())-Date.UTC(t,0,1))/864e5)+1,o=String(e.getHours()).padStart(2,"0"),n=String(e.getMinutes()).padStart(2,"0");return`${t}-${String(r).padStart(3,"0")}-${o}-${n}-${xi()}`}var st=async(e,t)=>{let r=[];for(let o of e){let n;Array.isArray(o)?n=st(o,t):n=_u(o,t),r.push(n)}return Promise.all(r)};var Lo=new Map,Nu=new Set(["_analysis","_cleanup","_done","_meta","_parts","_partial","_prompts","_temp","_transcript"]),Ou=["_partial.","_transcribing.","_transcript."],Ru=(e,t)=>e.split(/[\\/]+/).some(r=>Nu.has(r))||Ou.some(r=>t.startsWith(r));function $u(e){return`${e.charAt(0).toUpperCase()}${e.slice(1)}`}function Du(e){if(typeof e=="number")return Number.isFinite(e)&&e>0?e:0;if(typeof e!="string")return 0;let t=e.trim().match(/^(\d+(?:\.\d+)?)(ms|s|m|h)?$/i);if(!t)return 0;let r=Number(t[1]);if(!Number.isFinite(r)||r<=0)return 0;let o=(t[2]||"ms").toLowerCase(),n=o==="h"?3600*1e3:o==="m"?60*1e3:o==="s"?1e3:1;return Math.round(r*n)}function ju(e,t){let r=e.config?.triggers;if(!r||typeof r!="object")return 0;let o=r[`delay${$u(t)}`];return Du(o??r.delay)}function Me(e){return(Array.isArray(e.command)?e.command:[e.command]).filter(r=>typeof r=="string"&&r.length>0)}var Mu=e=>e.some(t=>t.startsWith("ai-"));function Bu(e){return Ru(e.paths.file,e.fileName)||e.fileName.endsWith("log.txt")}function Ju(e,t){for(let r of Me(e))K(e,{botName:r,duration:t,kind:"bot-delay",level:"info",message:`IO bot ${r} waiting ${t}ms`,crudVerb:e.fileVerb,data:{delayMs:t}},{operation:!1})}function zu(e){for(let t of Me(e))K(e,{botName:t,kind:"bot-skip",level:"info",message:"Delay superseded by a newer filesystem event",crudVerb:e.fileVerb},{operation:!1})}function No(e,t,r){if(Bu(e))return Promise.resolve();K(e,{crudVerb:t,kind:"crud",level:"info",message:`${t} ${e.fileName}`},{local:!1,operation:!1});let o=Me(e);if(o.length===0)return Promise.resolve();let n=Mu(o)?0:ju(e,t);if(n<=0)return r(e);let i=`${e.paths.nodeFull}:${t}`,s=Lo.get(i);return s&&(clearTimeout(s.timer),zu(s.context),s.resolve()),new Promise((a,u)=>{Ju(e,n);let c=setTimeout(()=>{Lo.delete(i),r(e).then(a,u)},n);Lo.set(i,{context:e,timer:c,resolve:a})})}var qu=async e=>{await st(Me(e),e)},Uu=async e=>{await st(Me(e),e)},Gu=async e=>{},Vu=async e=>{await st(Me(e),e)},Wu=e=>No(e,"create",qu),Ku=e=>No(e,"update",Uu),Hu=e=>No(e,"delete",Vu),fr={bootstrap:Gu,create:Wu,update:Ku,delete:Hu};var Pi=["_partial*","**/_partial*","_transcribing*","**/_transcribing*","_transcript.*","**/_transcript.*","_analysis/**","**/_analysis/**","_cleanup/**","**/_cleanup/**","_done/**","**/_done/**","_meta/**","**/_meta/**","_parts/**","**/_parts/**","_prompts/**","**/_prompts/**","_temp/**","**/_temp/**","_transcript/**","**/_transcript/**","**/node_modules/**","**/dist/**","**/__pycache__/**","**/*.egg-info/**","_tim/**","**/_tim/**"];async function Ti(e){let t=e.cwd,r=e.version||"unknown",o=t.startsWith(Ci())?t.replace(Ci(),"~"):t,n=yi(t,Pi);if(!n.length)throw new Error(`No config.json files found recursively under ${o}. Add config.json to each directory TIM should watch.`);Uo(t);let i=en(),s=vi();return await i.log({kind:"system",level:"info",message:`TIM version ${r}`,data:{version:r}}),await i.log({kind:"system",level:"info",message:`Listener started in ${o} with ${n.length} configured director${n.length===1?"y":"ies"}`,data:{root:o,configuredDirectories:n.length}}),await i.log({kind:"system",level:"info",message:`Providers: ${s}`,data:{providers:s}}),$r({cwd:t,watchPaths:n,depth:0,target:"**/*",ignore:Pi,createContext:bi,silent:!0,callbacks:{onAdd:fr.create,onChange:fr.update,onUnlink:fr.delete},ignoreLogs:!0})}function Ro(e,t=process.cwd()){if(!e)return Oo.resolve(t);let r=e==="~"?Fi():e.startsWith("~/")?Oo.join(Fi(),e.slice(2)):e;return Oo.resolve(t,r)}function Ai(e={}){return _o(e.bots),_e(e.galleries),Ti({cwd:Ro(e.cwd),version:e.version})}var ki={id:"character-sheets",title:"Character Sheets",description:"Reusable image-to-image workflow for generating polished character sheet outputs from input artwork.",triggers:{create:{"input.*.png":"req-image-to-image","*.image.json":"ai-image"},update:{"input.*.png":"req-image-to-image","*.image.json":"ai-image"}},settings:{"req-image-to-image":{outputNamingConvention:"inputOutputPair",promptId:"character-sheet",sourceImageAsReference:!0,sourceImageReferenceTypes:["character","style"]},"ai-image":{output:{provider:"google",model:"gemini-3-pro-image",aspectRatio:"3:2",imageSize:"4K"}}}};var Ei=_i(new URL("./prompts/character-sheets",import.meta.url)),Zu=_i(new URL("../src/character-sheets/_prompts",import.meta.url)),Qu=Xu.existsSync(Ei)?Ei:Zu,Li={name:"g-character-sheets",aliases:["character-sheets","character-sheet"],config:ki},yr=[Li],$o=[{gallery:Li.name,from:Qu}];_e(yr);var hr={name:"@tim-fs/cli",publishConfig:{access:"public",tag:"alpha"},version:"0.1.4-alpha",type:"module",description:"Turn ordinary folders into explicit, inspectable AI and code workflows that any person, agent, or program can invoke by writing a file",bin:{tim:"dist/index.js"},files:["dist"],scripts:{build:"npm run clean && npm run build:debug","build:release":"node build.mjs --release","build:debug":"node build.mjs",clean:"rm -rf dist",link:"npm run build && npm link",prepack:"npm run clean && npm run build:release",test:"npm run build && node --test test/*.test.mjs",typecheck:"tsc -p tsconfig.json",watch:'nodemon --watch src --ext ts --exec "npm run build"'},keywords:["automation","filesystem","file-watcher","ai","workflow"],license:"MIT",engines:{node:">=20"},repository:{type:"git",url:"git+https://github.com/dht/tim-fs.git",directory:"cli"},bugs:{url:"https://github.com/dht/tim-fs/issues"},homepage:"https://github.com/dht/tim-fs#readme",dependencies:{"@ai-sdk/anthropic":"^3.0.84","@ai-sdk/azure":"^3.0.87","@ai-sdk/bytedance":"^1.0.17","@ai-sdk/elevenlabs":"^2.0.35","@ai-sdk/google":"^3.0.82","@ai-sdk/huggingface":"^1.0.52","@ai-sdk/openai":"^3.0.71","@ai-sdk/xai":"^3.0.95","@elevenlabs/elevenlabs-js":"^2.58.0",ai:"^6.0.205",chokidar:"^5.0.0",commander:"^12.1.0",dotenv:"^17.2.3","fs-extra":"^11.3.2",glob:"13.0.0",kleur:"^4.1.5",lodash:"^4.18.1",logform:"^2.7.0",minimatch:"^10.2.5",openai:"^6.48.0","p-limit":"^7.2.0",sharp:"^0.34.5",winston:"^3.18.3","winston-transport":"^4.9.0",ws:"^8.21.1",yaml:"^2.9.0"},devDependencies:{"@tim-fs/core":"workspace:^","@tim-fs/io-core":"workspace:^","@tim-fs/io-gallery":"workspace:^","@types/node":"^20.19.25",esbuild:"^0.27.2",nodemon:"^3.1.7",typescript:"^5.9.3"}};import{config as ac}from"dotenv";import Be from"node:fs";import tc from"node:os";import br from"node:path";import{parse as rc}from"dotenv";var at=[{name:"OPENAI_API_KEY",label:"OpenAI"},{name:"ANTHROPIC_API_KEY",label:"Anthropic"},{name:"GOOGLE_API_KEY",label:"Google Gemini"},{name:"ELEVENLABS_API_KEY",label:"ElevenLabs",aliases:["ELEVEN_LABS_API_KEY"]},{name:"XAI_API_KEY",label:"xAI"},{name:"HUGGINGFACE_API_KEY",label:"Hugging Face",aliases:["HF_TOKEN","HF_ACCESS_TOKEN"]},{name:"ARK_API_KEY",label:"ByteDance ModelArk"},{name:"AZURE_OPENAI_API_KEY",label:"Azure OpenAI",aliases:["AZURE_API_KEY"]}];function oc(e=process.env){return e.TIM_HOME||br.join(tc.homedir(),".tim")}function Je(e=process.env){return e.TIM_ENV_FILE||br.join(oc(e),".env")}function nc(e){return Be.existsSync(e)?rc(Be.readFileSync(e)):{}}function ic(e,...t){for(let r of t)for(let o of[e.name,...e.aliases||[]]){let n=r[o]?.trim();if(n)return n}return""}function sc(e){return e?JSON.stringify(e):""}function Ni(e={}){let t=e.environment||process.env,r=e.destination||Je(t),o=nc(r);return Object.fromEntries(at.map(n=>[n.name,ic(n,o,t)]))}function Oi(e,t=Je()){let r=["# TIM provider credentials","# Run `npx @tim-fs/cli@alpha init` again to update this file.","",...at.map(o=>`${o.name}=${sc(e[o.name]||"")}`),""];Be.mkdirSync(br.dirname(t),{recursive:!0,mode:448}),Be.chmodSync(br.dirname(t),448),Be.writeFileSync(t,r.join(`
23
+ `),{encoding:"utf8",mode:384}),Be.chmodSync(t,384)}ac({path:Je(),quiet:!0});import{emitKeypressEvents as pc}from"node:readline";import U from"kleur";var uc=["\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557","\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D"," \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557"," \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u255A\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551"," \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551"," \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"],cc=e=>U.enabled?`\x1B[38;5;208m${e}\x1B[39m`:e;function Ri(e){let t=uc.map((r,o)=>o<3?U.cyan(r):cc(r));console.log(`
24
24
  ${t.join(`
25
- `)}`),console.log(`${V.bold("TIM-FS")} ${V.dim(`v${e}`)} ${V.dim("\xB7")} Filesystem automation, made friendly.
26
- `),console.log(`${V.green("\u25CF")} Provider keys are saved locally in ${V.cyan("~/.tim/.env")}
27
- `)}async function $s(e,t,r=process.stdin,o=process.stdout){let n=new Set(t),s=0,i=0,a=r.isRaw,u=()=>{i>0&&o.write(`\x1B[${i}A\r\x1B[J`);let p=[V.bold("Which providers would you like to configure?"),V.dim("Use \u2191/\u2193 to move, Space to select, and Enter to continue."),"",...e.map((d,f)=>{let m=f===s?V.cyan("\u276F"):" ",h=n.has(d.name)?V.green("\u25C9"):V.dim("\u25CB"),y=t.has(d.name)?V.dim(" (configured)"):"";return`${m} ${h} ${d.label}${y}`})];o.write(`${p.join(`
25
+ `)}`),console.log(`${U.bold("TIM-FS")} ${U.dim(`v${e}`)} ${U.dim("\xB7")} Filesystem automation, made friendly.
26
+ `),console.log(`${U.green("\u25CF")} Provider keys are saved locally in ${U.cyan("~/.tim/.env")}
27
+ `)}async function $i(e,t,r=process.stdin,o=process.stdout){let n=new Set(t),i=0,s=0,a=r.isRaw,u=()=>{s>0&&o.write(`\x1B[${s}A\r\x1B[J`);let c=[U.bold("Which providers would you like to configure?"),U.dim("Use \u2191/\u2193 to move, Space to select, and Enter to continue."),"",...e.map((l,d)=>{let m=d===i?U.cyan("\u276F"):" ",h=n.has(l.name)?U.green("\u25C9"):U.dim("\u25CB"),y=t.has(l.name)?U.dim(" (configured)"):"";return`${m} ${h} ${l.label}${y}`})];o.write(`${c.join(`
28
28
  `)}
29
- `),i=p.length};return new Promise((p,d)=>{let f=()=>{r.off("keypress",m),r.setRawMode(!!a),o.write("\x1B[?25h"),a||r.pause()},m=(h,y)=>{if(y.ctrl&&y.name==="c"){f(),d(new Error("Setup cancelled."));return}if(y.name==="up"||y.name==="k"){s=(s-1+e.length)%e.length,u();return}if(y.name==="down"||y.name==="j"){s=(s+1)%e.length,u();return}if(y.name==="space"||h===" "){let I=e[s].name;n.has(I)?n.delete(I):n.add(I),u();return}(y.name==="return"||y.name==="enter")&&(f(),o.write(`
30
- `),p(e.filter(I=>n.has(I.name))))};pp(r),r.setRawMode(!0),r.resume(),r.on("keypress",m),o.write("\x1B[?25l"),u()})}import Ir from"node:fs";import Ro from"node:path";import at from"node:fs";import Be from"node:path";function br(e){let t=new Set;function r(o){if(!(!o||typeof o!="object")){if(Array.isArray(o)){for(let n of o)r(n);return}for(let[n,s]of Object.entries(o))typeof s=="string"&&s.trim()&&(n==="promptId"||n.endsWith("PromptId"))&&t.add(s.trim()),r(s)}}return r(e),[...t]}function dp(e){let t=Be.parse(Be.basename(e)).name;return t.includes(".")&&(t=t.split(".").pop()),t}function vr(e,t,r){let o=at.readdirSync(e).find(i=>i.endsWith(".md")&&dp(i)===r);if(!o)throw new Error(`Prompt "${r}" was not found in ${e}. Run "tim init" first.`);at.mkdirSync(t,{recursive:!0}),at.copyFileSync(Be.join(e,o),Be.join(t,o));let n=o.replace(/\.md$/,".schema.json"),s=Be.join(e,n);at.existsSync(s)&&at.copyFileSync(s,Be.join(t,n))}var $o=["eject","bot","preset"];function gp(e,t){return e.find(r=>r.name===t||r.aliases?.includes(t))}function fp(e){let t={};for(let[r,o]of Object.entries(e.config.triggers||{})){if(!o||typeof o!="object")continue;let n=Object.keys(o)[0];n&&(t[r]={[n]:e.name})}if(Object.keys(t).length===0)throw new Error(`IO gallery "${e.name}" does not define any triggers.`);return{triggers:t}}function Ds(e){let{cwd:t,directory:r,galleryName:o,flavour:n,galleries:s,promptSources:i}=e,a=gp(s,o);if(!a){let d=s.flatMap(f=>f.aliases||[f.name]).join(", ");throw new Error(`Unknown IO gallery preset: ${o}. Available presets: ${d}`)}let u=Ro.resolve(t,r);if(Ir.existsSync(u))throw new Error(`Cannot create TIM directory because the path already exists: ${u}`);let p;n==="eject"?p=pe(a.config):n==="bot"?p=fp(a):p={import:a.name},Ir.mkdirSync(u,{recursive:!0});try{if(Ir.writeFileSync(Ro.join(u,"config.json"),`${JSON.stringify(p,null,2)}
31
- `),n==="eject"){let d=i.find(m=>m.gallery===a.name),f=br(p.settings||{});if(f.length>0&&!d)throw new Error(`No bundled prompt source is registered for ${a.name}.`);for(let m of f)vr(d.from,Ro.join(u,"_prompts"),m)}}catch(d){throw Ir.rmSync(u,{recursive:!0,force:!0}),d}return{target:u,gallery:a.name,flavour:n}}var ze=new bp,ut=process.cwd(),Do=class extends hp{muted=!1;_write(t,r,o){this.muted||process.stdout.write(t),o()}};async function vp(e,t,r){process.stdout.write(r),t.muted=!0;let o=await e.question("");return t.muted=!1,process.stdout.write(o?`\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022
29
+ `),s=c.length};return new Promise((c,l)=>{let d=()=>{r.off("keypress",m),r.setRawMode(!!a),o.write("\x1B[?25h"),a||r.pause()},m=(h,y)=>{if(y.ctrl&&y.name==="c"){d(),l(new Error("Setup cancelled."));return}if(y.name==="up"||y.name==="k"){i=(i-1+e.length)%e.length,u();return}if(y.name==="down"||y.name==="j"){i=(i+1)%e.length,u();return}if(y.name==="space"||h===" "){let I=e[i].name;n.has(I)?n.delete(I):n.add(I),u();return}(y.name==="return"||y.name==="enter")&&(d(),o.write(`
30
+ `),c(e.filter(I=>n.has(I.name))))};pc(r),r.setRawMode(!0),r.resume(),r.on("keypress",m),o.write("\x1B[?25l"),u()})}import Sr from"node:fs";import Do from"node:path";import pt from"node:fs";import ze from"node:path";function vr(e){let t=new Set;function r(o){if(!(!o||typeof o!="object")){if(Array.isArray(o)){for(let n of o)r(n);return}for(let[n,i]of Object.entries(o))typeof i=="string"&&i.trim()&&(n==="promptId"||n.endsWith("PromptId"))&&t.add(i.trim()),r(i)}}return r(e),[...t]}function mc(e){let t=ze.parse(ze.basename(e)).name;return t.includes(".")&&(t=t.split(".").pop()),t}function Ir(e,t,r){let o=pt.readdirSync(e).find(s=>s.endsWith(".md")&&mc(s)===r);if(!o)throw new Error(`Prompt "${r}" was not found in ${e}. Run "tim init" first.`);pt.mkdirSync(t,{recursive:!0}),pt.copyFileSync(ze.join(e,o),ze.join(t,o));let n=o.replace(/\.md$/,".schema.json"),i=ze.join(e,n);pt.existsSync(i)&&pt.copyFileSync(i,ze.join(t,n))}var jo=["eject","bot","preset"];function lc(e,t){return e.find(r=>r.name===t||r.aliases?.includes(t))}function dc(e){let t={};for(let[r,o]of Object.entries(e.config.triggers||{})){if(!o||typeof o!="object")continue;let n=Object.keys(o)[0];n&&(t[r]={[n]:e.name})}if(Object.keys(t).length===0)throw new Error(`IO gallery "${e.name}" does not define any triggers.`);return{triggers:t}}function Di(e){let{cwd:t,directory:r,galleryName:o,flavour:n,galleries:i,promptSources:s}=e,a=lc(i,o);if(!a){let l=i.flatMap(d=>d.aliases||[d.name]).join(", ");throw new Error(`Unknown IO gallery preset: ${o}. Available presets: ${l}`)}let u=Do.resolve(t,r);if(Sr.existsSync(u))throw new Error(`Cannot create TIM directory because the path already exists: ${u}`);let c;n==="eject"?c=ue(a.config):n==="bot"?c=dc(a):c={import:a.name},Sr.mkdirSync(u,{recursive:!0});try{if(Sr.writeFileSync(Do.join(u,"config.json"),`${JSON.stringify(c,null,2)}
31
+ `),n==="eject"){let l=s.find(m=>m.gallery===a.name),d=vr(c.settings||{});if(d.length>0&&!l)throw new Error(`No bundled prompt source is registered for ${a.name}.`);for(let m of d)Ir(l.from,Do.join(u,"_prompts"),m)}}catch(l){throw Sr.rmSync(u,{recursive:!0,force:!0}),l}return{target:u,gallery:a.name,flavour:n}}import gc from"node:fs";import fc from"node:path";import{pathToFileURL as yc}from"node:url";function hc(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.name=="string"&&t.name.trim().length>0&&typeof t.run=="function"}function bc(e,t){let r=t.default??t.bot??t.bots,o=Array.isArray(r)?r:[r];if(o.length===0||o.some(n=>!hc(n)))throw new TypeError(`Custom bot module ${e} must export an IO bot or IO bot array as default, bot, or bots.`);return o}async function ji(e,t=process.cwd()){let r=[];for(let o of e){let n=fc.resolve(t,o);if(!gc.existsSync(n))throw new Error(`Custom bot module not found: ${n}`);let i=await import(yc(n).href);r.push(...bc(n,i))}return r}function Mi(e,t){let r=new Set;for(let o of[...e,...t]){if(r.has(o.name))throw new Error(`Duplicate IO bot name: ${o.name}`);r.add(o.name)}return[...e,...t]}var Ue=new Sc,qe=process.cwd(),Mo=class extends Ic{muted=!1;_write(t,r,o){this.muted||process.stdout.write(t),o()}};async function xc(e,t,r){process.stdout.write(r),t.muted=!0;let o=await e.question("");return t.muted=!1,process.stdout.write(o?`\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022
32
32
  `:`
33
- `),o.trim()}ze.name("tim").description("Run filesystem-driven IO bots from configured directories.").version(yr.version);ze.command("init").description("Configure provider keys and install bundled prompts in ~/.tim.").option("--non-interactive","create the env file without prompting").action(async e=>{Rs(yr.version);let t=Je(),r=Ns({destination:t});if(!e.nonInteractive&&process.stdin.isTTY&&process.stdout.isTTY){let s=new Set(it.filter(p=>!!r[p.name]).map(p=>p.name)),i=await $s(it,s),a=new Do,u=yp.createInterface({input:process.stdin,output:a,terminal:!0});try{i.length===0&&console.log(`No providers selected. Skipping provider key setup.
34
- `);for(let p of i){let d=!!r[p.name],f=await vp(u,a,`${p.label}${d?" (press Enter to keep current key)":""}: `);f&&(r[p.name]=f)}}finally{a.muted=!1,u.close()}}Os(r,t);let o=Object.values(r).filter(Boolean).length;console.log(`Saved ${o} provider key(s) to ${t}`);let n=ge();Ae.mkdirSync(n,{recursive:!0});for(let s of Oo){if(!Ae.existsSync(s.from))throw new Error(`Gallery prompt source not found: ${s.from}`);Ae.cpSync(s.from,n,{recursive:!0,force:!0}),console.log(`Installed ${s.gallery} prompts to ${n}`)}});ze.command("create <directory> <preset>").description("Bootstrap a TIM directory from an IO gallery preset.").option("--flavour <flavour>","output style: eject, bot, or preset","eject").action((e,t,r)=>{if(!$o.includes(r.flavour))throw new Error(`Unknown create flavour: ${r.flavour}. Expected one of: ${$o.join(", ")}`);let o=Ds({cwd:ut,directory:e,galleryName:t,flavour:r.flavour,galleries:fr,promptSources:Oo});console.log(`Created ${o.gallery} TIM directory at ${o.target} (${o.flavour} flavour)`)});ze.command("eject").description("Expand gallery convenience config and copy referenced prompts into ./_prompts.").action(()=>{let e=js.join(ut,"config.json");if(!Ae.existsSync(e))throw new Error(`No config.json found in ${ut}`);let t=JSON.parse(Ae.readFileSync(e,"utf-8")),r=pe(t),o=br(r.settings||{}),n=ge();if(o.length>0&&!Ae.existsSync(n))throw new Error(`TIM prompts were not found at ${n}. Run "tim init" first.`);if(Ae.writeFileSync(e,`${JSON.stringify(r,null,2)}
35
- `),o.length>0){let s=js.join(ut,"_prompts");for(let i of o)vr(n,s,i);console.log(`Copied ${o.length} prompt(s) to ${s}`)}console.log(`Expanded gallery config at ${e}`)});ze.command("start [directory]").description("Watch configured directories in the foreground.").action(async e=>{await As({cwd:No(e,ut),bots:gs,galleries:fr,version:yr.version})});ze.parseAsync(process.argv).catch(e=>{console.error(e instanceof Error?e.message:e),process.exitCode=1});
33
+ `),o.trim()}Ue.name("tim").description("Run filesystem-driven IO bots from configured directories.").version(hr.version);Ue.command("init").description("Configure provider keys and install bundled prompts in ~/.tim.").option("--non-interactive","create the env file without prompting").action(async e=>{Ri(hr.version);let t=Je(),r=Ni({destination:t});if(!e.nonInteractive&&process.stdin.isTTY&&process.stdout.isTTY){let i=new Set(at.filter(c=>!!r[c.name]).map(c=>c.name)),s=await $i(at,i),a=new Mo,u=vc.createInterface({input:process.stdin,output:a,terminal:!0});try{s.length===0&&console.log(`No providers selected. Skipping provider key setup.
34
+ `);for(let c of s){let l=!!r[c.name],d=await xc(u,a,`${c.label}${l?" (press Enter to keep current key)":""}: `);d&&(r[c.name]=d)}}finally{a.muted=!1,u.close()}}Oi(r,t);let o=Object.values(r).filter(Boolean).length;console.log(`Saved ${o} provider key(s) to ${t}`);let n=de();Fe.mkdirSync(n,{recursive:!0});for(let i of $o){if(!Fe.existsSync(i.from))throw new Error(`Gallery prompt source not found: ${i.from}`);Fe.cpSync(i.from,n,{recursive:!0,force:!0}),console.log(`Installed ${i.gallery} prompts to ${n}`)}});Ue.command("create <directory> <preset>").description("Bootstrap a TIM directory from an IO gallery preset.").option("--flavour <flavour>","output style: eject, bot, or preset","eject").action((e,t,r)=>{if(!jo.includes(r.flavour))throw new Error(`Unknown create flavour: ${r.flavour}. Expected one of: ${jo.join(", ")}`);let o=Di({cwd:qe,directory:e,galleryName:t,flavour:r.flavour,galleries:yr,promptSources:$o});console.log(`Created ${o.gallery} TIM directory at ${o.target} (${o.flavour} flavour)`)});Ue.command("eject").description("Expand gallery convenience config and copy referenced prompts into ./_prompts.").action(()=>{let e=Bi.join(qe,"config.json");if(!Fe.existsSync(e))throw new Error(`No config.json found in ${qe}`);let t=JSON.parse(Fe.readFileSync(e,"utf-8")),r=ue(t),o=vr(r.settings||{}),n=de();if(o.length>0&&!Fe.existsSync(n))throw new Error(`TIM prompts were not found at ${n}. Run "tim init" first.`);if(Fe.writeFileSync(e,`${JSON.stringify(r,null,2)}
35
+ `),o.length>0){let i=Bi.join(qe,"_prompts");for(let s of o)Ir(n,i,s);console.log(`Copied ${o.length} prompt(s) to ${i}`)}console.log(`Expanded gallery config at ${e}`)});Ue.command("start [directory]").description("Watch configured directories in the foreground.").option("--bot <path>","load a custom JavaScript bot module (repeatable)",(e,t)=>[...t,e],[]).action(async(e,t)=>{let r=await ji(t.bot,qe);await Ai({cwd:Ro(e,qe),bots:Mi(fi,r),galleries:yr,version:hr.version})});Ue.parseAsync(process.argv).catch(e=>{console.error(e instanceof Error?e.message:e),process.exitCode=1});
package/package.json CHANGED
@@ -4,9 +4,9 @@
4
4
  "access": "public",
5
5
  "tag": "alpha"
6
6
  },
7
- "version": "0.1.3-alpha.0",
7
+ "version": "0.1.4-alpha",
8
8
  "type": "module",
9
- "description": "Turn ordinary folders into durable, inspectable AI and code workflows that any person, agent, or program can invoke by writing a file",
9
+ "description": "Turn ordinary folders into explicit, inspectable AI and code workflows that any person, agent, or program can invoke by writing a file",
10
10
  "bin": {
11
11
  "tim": "dist/index.js"
12
12
  },