@tim-fs/cli 0.1.2 → 0.1.3

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 +24 -5
  2. package/dist/index.js +27 -28
  3. package/package.json +4 -4
package/README.md CHANGED
@@ -1,23 +1,42 @@
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.
6
+
7
+ TIM/FS is currently alpha software. Its configuration, bot API, and filesystem contracts may
8
+ change before `1.0`; breaking changes will be documented in release notes. Alpha releases are
9
+ published under npm's `alpha` tag rather than `latest`.
5
10
 
6
11
  ## Run with npx
7
12
 
8
13
  ```sh
9
- npx @tim-fs/cli init
10
- npx @tim-fs/cli start [directory]
14
+ npx @tim-fs/cli@alpha init
15
+ npx @tim-fs/cli@alpha start [directory]
11
16
  ```
12
17
 
13
18
  `init` stores optional provider credentials in `~/.tim/.env` and installs bundled prompts in
14
19
  `~/.tim/prompts`. `start` defaults to the current directory and stays in the foreground until you
15
20
  press `Ctrl-C`.
16
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
+
32
+ The watcher, configuration, and artifacts are local. Bots configured with network AI providers
33
+ send their inputs to those providers; “local-first” does not mean offline or local inference. See
34
+ the repository README for the current reliability, privacy, and platform limitations.
35
+
17
36
  ## Install globally
18
37
 
19
38
  ```sh
20
- npm install --global @tim-fs/cli
39
+ npm install --global @tim-fs/cli@alpha
21
40
  tim init
22
41
  tim start ~/workspace
23
42
  ```
package/dist/index.js CHANGED
@@ -1,36 +1,35 @@
1
1
  #!/usr/bin/env node
2
- import _e from"node:fs";import Bs from"node:path";import Fc from"node:readline/promises";import{Writable as Ac}from"node:stream";import{Command as kc}from"commander";import{minimatch as St}from"minimatch";import x from"path";import Ys from"fs-extra";var Hs=Ys;function N(){return Hs}var Mo=()=>({existsSync:e=>N().existsSync(e),readdirSync:e=>N().readdirSync(e),readFileSync:((e,t)=>N().readFileSync(e,t)),readJsonSync:e=>N().readJsonSync(e)});var Xs=Symbol.for("tim-core.runtime-state"),Zs=globalThis,dt=Zs[Xs]??={logger:null,root:""},Jo=e=>{dt.root=e},ie=()=>dt.root;var Bo=e=>{dt.logger=e},Sr=()=>dt.logger;var Qs=()=>"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 gt=()=>Qs().substring(0,4);var ei=["console"],ti=(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},zo=(e={})=>{let t=e.transports?.length?e.transports:ei,r=!1,o=async(c,d)=>{let f=ti(c,"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(c,d)=>o({message:c,level:"debug",data:d,source:e.source}),info:async(c,d)=>o({message:c,level:"info",data:d,source:e.source}),warn:async(c,d)=>o({message:c,level:"warn",data:d,source:e.source}),error:async(c,d)=>o({message:c,level:"error",data:d,source:e.source}),clearLogs:async()=>{}}},jc=zo();import P from"kleur";import*as le from"node:fs/promises";import*as ht from"node:path";import*as wr from"node:util";import{createLogger as oi,transports as Uo,format as Se}from"winston";import ni from"winston-transport";var qo={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 yt(e){if(e===void 0)return e;if(Array.isArray(e))return e.filter(r=>r!==void 0).map(r=>yt(r));if(e&&typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))o!==void 0&&(t[r]=yt(o));return t}return e}var si=Symbol.for("message"),ii=e=>{if(!e||typeof e!="object")return;let t=e.logPath;return typeof t=="string"&&t.length?t:void 0},xr=class extends ni{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=ii(t.logEvent?.data)??this.defaultLogPath;if(!o){r();return}(async()=>{let s=ht.dirname(o);this.ensuredDirs.has(s)||(this.ensuredDirs.add(s),await le.mkdir(s,{recursive:!0}).catch(()=>{}));let i=this.lineFormat.transform({...t},this.lineFormat.options??{}),a=i[si]??i.message??"";await le.appendFile(o,`${a}
3
- `,"utf8")})().catch(s=>{let i=s instanceof Error?s.message:wr.format("%o",s);console.warn("[tim-logger] Failed to write log file",{logPath:o,error:i})}).finally(r)}},ai=Se.combine(Se.timestamp({format:()=>new Date().toISOString()}),Se.printf(e=>{let t=e.logEvent??{},r=e.timestamp??new Date().toISOString(),o=String(t.source??"LOG"),n=String(t.message??e.message??""),s=Go(t.data),i=s&&typeof s=="object"&&Object.keys(s).length?` | ${JSON.stringify(s)}`:"";return`[${r}] ${o.padStart(12)}: ${n}${i}`})),ui=["console"],pi=(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},ci=e=>{if(!e)return"";try{return JSON.stringify(e)}catch{return"[unserializable data]"}},mi=e=>e==null?!1:typeof e!="object"||Array.isArray(e)?!0:Object.keys(e).length>0;function Go(e){if(!e||typeof e!="object"||Array.isArray(e)||!("logPath"in e))return e;let{logPath:t,...r}=e;return r}function bt(e,t){return e==="verbose"?!0:e==="quiet"?t.level==="error"||t.level==="warn":t.level!=="debug"}var Vo=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=qo[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)},li=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)},di=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 ")),xe=e=>e&&typeof e=="object"&&!Array.isArray(e)?e:{},gi=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`,Wo=e=>{if(typeof e=="number"&&Number.isFinite(e))return e;let t=xe(e);for(let r of["totalCost","costUSD","total","usd"])if(typeof t[r]=="number"&&Number.isFinite(t[r]))return t[r]},fi=e=>{let t=Wo(e);return t===void 0?"":`$${t.toFixed(t<.01?4:2)}`},yi=e=>{let t=xe(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},Ko=e=>{let t=Array.isArray(e.outputs)?e.outputs.map(xe):[];return t.length?t:[e]},hi=e=>[e.provider,e.model].filter(t=>typeof t=="string"&&t.length>0).join("/"),bi=e=>{let t=xe(e.data),r=Ko(t),o=[...new Set(r.map(hi).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 "))},vi=e=>{let t=xe(xe(e.data).result);if(!Object.keys(t).length)return{target:"",details:""};let r=Ko(t),o=r[0]??t,n=r.reduce((f,m)=>f+(typeof m.outputSizeBytes=="number"?m.outputSizeBytes:0),0),s=r.map(f=>Wo(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+(yi(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",gi(n),!0)),typeof o.mediaDurationSeconds=="number"&&c.push(k("duration",`${o.mediaDurationSeconds}s media`,!0));let d=fi(i);return d&&c.push(k("cost",d,!0)),a>0&&c.push(k("tokens",`${a.toLocaleString()} tokens`,!0)),{target:u,details:c.join(P.gray(" \xB7 "))}},Ii=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??"")},Si=e=>{let t=e.message??"",r=xe(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 Yo(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=Vo(e.duration),u=li(e),c=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=bi(e);return`${n(P.magenta("\u25B6"))} ${P.magenta().bold(d("START"))} ${s}${f?` ${P.gray("\xB7")} ${f}`:""} ${P.gray("\xB7")} ${i}${c}`}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")} ${Si(e)}${a?` ${P.gray("(")}${k("duration",a)}${P.gray(")")}`:""}${c}`}case"bot-output":return`${n(P.green("\u25A3"))} ${P.green().bold(d("OUTPUT"))} ${di(e.message??"")}`;case"bot-done":{let f=vi(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}`:""}${c}`}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}${c} ${k("message",e.message??"Bot failed")}`;case"system":return`${n(P.blue().bold("\u25C6"))} ${P.blue().bold(d("SYSTEM"))} ${Ii(e)}`;default:{let f=String(e.level??"info").toUpperCase(),m=e.level==="error"?P.red:e.level==="warn"?P.yellow:P.cyan,h=mi(e.data)?k("message",` ${ci(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 xi=e=>({...e,at:new Date(e.timestamp??Date.now()).toISOString()});function wi(e){let t=e.botName??e.source??"tim",r=e.fileName?` \xB7 ${e.fileName}`:"",o=Vo(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 Cr(e,t,r){for(let o of t){if(!bt(o.detail??"default",e))continue;let n=ht.dirname(o.path);r.ensureDirSync(n);let s=xi(e);if(o.format==="text"){r.appendFileSync(o.path,`${s.at} ${wi(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 Ci=Se.combine(Se.timestamp({format:"HH:mm:ss"}),Se.errors({stack:!0}),Se.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:Go(s?.data)},a=Yo(i,t);return n?`${a}
6
- ${n}`:a})),vt=(e={})=>{let t=e.transports?.length?e.transports:ui,r=!1,o=[];t.includes("console")&&o.push(new Uo.Console({format:Ci}));let n=e.logPath??e.fsPath??"log.txt";t.includes("fs")&&o.push(new xr({defaultLogPath:n,format:ai}));let s=oi({level:"debug",transports:o.length?o:[new Uo.Console]}),i=async(m,h)=>{let y=pi(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 w=yt({...A});await Promise.resolve(e.addLog(w))}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}),c=async(m,h)=>i({message:m,level:"warn",data:h,source:e.source});return{log:i,debug:a,info:u,warn:c,error:async(m,h)=>i({message:m,level:"error",data:h,source:e.source}),clearLogs:async(m=()=>!0)=>{if(t.includes("fs"))try{await le.mkdir(ht.dirname(n),{recursive:!0}).catch(()=>{}),await le.writeFile(n,"",{flag:"a"}),await le.truncate(n,0),await u("\u{1F9F9} Logs cleared",{logPath:n})}catch(h){let y=h instanceof Error?h.message:wr.format("%o",h);await c("Failed to clear logs",{logPath:n,error:y})}t.includes("custom")&&e.clearLogs&&await e.clearLogs(m)}}},Kc=vt();import Ue from"node:path";var Ho=()=>{let e=vt({source:"tim-core",transports:["console"]});return Bo(e),e},Ge=(e,t={})=>{let r={...t,message:e,level:t.level??"info",timestamp:t.timestamp??Date.now()},o=Sr();return o&&o.log(r),r},V=(e,t,r={})=>Ge(e,{kind:"diagnostic",level:"error",data:{...r,error:t instanceof Error?t.message:String(t),...t instanceof Error&&t.stack?{stack:t.stack}:{}}});function H(e,t,r={}){let o=Ue.resolve(ie()||e.paths.rootFull||process.cwd()),n=t.operationId??e.operationId,s=e.global.logs.operation,i=n&&s.enabled?Ue.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()},c=e.global.logs.console,d=c.silenceCrudDelete&&u.kind==="crud"&&u.crudVerb==="delete",f=c.silenceRequestBotStartDone&&u.botName?.startsWith("req-")&&(u.kind==="bot-start"||u.kind==="bot-done");if(r.console!==!1&&c.enabled&&!d&&!f&&bt(c.detail,u)){let h=Sr();h&&h.log(u)}let m=[];if(r.local!==!1&&e.global.logs.local.enabled){let h=r.localPath??Ue.join(e.paths.sessionFull||Ue.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:Ue.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&&Cr(u,m,N()),u}var Xo=e=>e.replace(/(\d+)(?=\.\w+$)/,t=>String(Number(t)+1).padStart(t.length,"0"));import Pi from"node:crypto";import Ti from"node:os";import Zo from"node:path";function Fi(e){return Pi.createHash("sha1").update(Zo.resolve(e)).digest("hex").slice(0,12)}function It(e){return Zo.join(Ti.tmpdir(),"tim-core",Fi(e))}var re=()=>Mo(),$=e=>N().existsSync(e);var Ve=e=>N().ensureDirSync(e);var Tr=e=>N().removeSync(e),Fr=(e,t)=>N().copySync(e,t);var Ct=e=>N().readJsonSync(e),ae=(e,t={})=>{try{return N().existsSync(e)?N().readJsonSync(e):t}catch(r){return V(`Failed to read JSON from ${e}`,r,{filePath:e}),t}},We=(e,t="utf-8")=>N().readFileSync(e,t),M=e=>N().readFileSync(e),Ar=(e,t,r="utf-8")=>N().writeFileSync(e,t,{encoding:r}),kr=(e,t,r=2)=>N().writeJsonSync(e,t,{spaces:r}),Ke=(e,t)=>N().writeFileSync(e,t),Pt="_meta",Ai="_temp",Qo="_done",xt="_cleanup",en=new Set(["_analysis",xt,"_partial","_parts","_transcript"]),ki=new Set(["_analysis",xt,Qo,Pt,"_parts","_prompts",Ai,"_transcript"]),_i=["_partial.","_transcribing.","_transcript."];function Ei(e){return x.basename(e).endsWith(".meta.json")}function Li(e,t){return e.split(/[\\/]+/).includes(t)}function Tt(e){return e.split(/[\\/]+/).filter(Boolean)}function Ce(e){return e.replace(/^\/+|\/+$/g,"").replace(/[^a-z0-9._-]+/gi,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()}function Ni(e){return Ce(e.paths.file||e.fileName||"source")||"source"}function Oi(e){let t=x.dirname(e.paths.file||"");return Ce(t==="."?e.paths.session||"session":t)||"session"}function _r(e){return(e.operationId||"manual").replace(/[^a-z0-9._-]+/gi,"-")}function Ri(e){let[t]=Tt(e);return en.has(t)}function $i(e,t){let r=Tt(t),o=Ce(r.shift()||"work").replace(/^_+/,"")||"work",n=Ce(r.join("__")||x.basename(t)||"file");return`${Oi(e)}__${o}__${n}`}function tn(e,t){let r=x.basename(t),o=Ce(r),n=Ce(e.fileName.replace(/\.[^.]+$/,""));if(!n||o.startsWith(`${n}.`))return o;let i=o.replace(/^_+/,"").replace(/\.meta\.json$/i,""),[a,...u]=i.split("."),c=u.join(".");return a&&c&&Ce(c)===n?`${c}.${a}.meta.json`:o}function Di(e,t){let r=tn(e,t);return`${_r(e)}__${r}`}function wt(e){return on(e,e.global.meta,"meta")}function rn(e){return on(e,e.global.intermediates,"intermediates")}function on(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(It(e.paths.rootFull),"_ephemeral",_r(e),r);default:return x.join(It(e.paths.rootFull),t.directory)}}function Pr(e,t,r,o){return r.location==="source"||r.location==="source-subdirectory"?x.basename(t):o==="meta"?Di(e,t):$i(e,t)}function we(e,t,r={}){let o=Tt(t),n=o[0]===Pt?o.slice(1).join("/"):t;if(Ei(t)){let s=x.join(wt(e),Pr(e,n,e.global.meta,"meta"));return r.forWrite?s:ji(e,n)||s}return Ri(t)?x.join(rn(e),Pr(e,t,e.global.intermediates,"intermediates")):x.join(e.paths.sessionFull,t)}function Er(e,t,r={}){return we(e,t,r)}function ji(e,t){let r=N(),o=x.basename(t),n=tn(e,t),s=Ni(e),i=wt(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,Pt,o);if(r.existsSync(u))return u;let c=x.join(e.paths.sessionFull,o);return r.existsSync(c)?c:null}function nn(e){let t=N(),r=x.join(It(e.paths.rootFull),"_ephemeral",_r(e));t.existsSync(r)&&t.removeSync(r)}function Mi(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=>{let t=N();function r(l,g){try{let{paths:b}=e,S=l==="sessionFull"?we(e,g):x.join(b[l],g);return t.existsSync(S)?t.readJsonSync(S):{}}catch(b){V("File manager failed to read JSON",b,{filePath:g})}}function o(l,g,b){try{let{paths:S}=e,F=l==="sessionFull"?we(e,g,{forWrite:!0}):x.join(S[l],g);t.ensureDirSync(x.dirname(F)),t.writeJsonSync(F,b,{spaces:2})}catch(S){V("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){V("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 c(l,g,b){return n(l,g,b,"tts")}function d(l,g={}){try{let{paths:b,machineId:S,sessionId:F,userId:J}=e,q={id:gt(),ts:Date.now(),userId:J,machineId:S,sessionId:F,orderType:l,...g},se=x.join(b.rootFull,"_orders",`${q.id}.json`);t.ensureDirSync(x.dirname(se)),t.writeJsonSync(se,q,{spaces:4})}catch(b){V("File manager failed to write bridge order",b,{orderType:l})}}function f(l,g,b){try{let{paths:S}=e,F=l==="sessionFull"?we(e,g,{forWrite:!0}):x.join(S[l],g);t.ensureDirSync(x.dirname(F)),t.writeFileSync(F,b)}catch(S){V("File manager failed to write binary file",S,{filePath:g})}}function m(l,g,b){try{let{paths:S}=e,F=l==="sessionFull"?we(e,g,{forWrite:!0}):x.join(S[l],g);t.ensureDirSync(x.dirname(F)),t.copySync(b,F)}catch(S){V("File manager failed to copy file",S,{filePath:g,sourcePath:b})}}function h(l,g){try{let{paths:b}=e,S=l==="sessionFull"?we(e,g):x.join(b[l],g);return t.readFileSync(S,"utf-8")}catch(b){V("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 V("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=(E,B=!0)=>t.existsSync(E)?t.readdirSync(E).filter(z=>z.endsWith(".json")&&(!B||!g||St(z,g))).reduce((z,te)=>(z[te]=t.readJsonSync(x.join(E,te)),z),{}):{},J=["workspace","os-temp","none"].includes(e.global.meta.location),q=l==="sessionFull"&&!b&&J?Object.entries(F(wt(e),!1)).reduce((E,[B,z])=>{let te=B.split("__").pop()||B;return(!g||St(te,g)||St(B,g))&&(E[te]=z),E},{}):{},se=!b&&e.global.meta.location==="source-subdirectory"?F(wt(e)):{},Y=b?{}:F(x.join(S,Pt));return{...F(S),...Y,...se,...q}}function A(l){let{paths:g}=e;t.emptyDirSync(g[l])}function w(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 C(l,g){let{paths:b}=e,S=x.join(b[l],`${g}.md`);t.existsSync(S)&&t.removeSync(S)}async function v(l,g){w(l,g),C(l,g)}function T(l,g){let{paths:b}=e,S=l==="sessionFull"&&en.has(Tt(g)[0])?rn(e):x.join(b[l],g);t.ensureDirSync(S)}function L(l,g){let{paths:b}=e,S=l==="sessionFull"?we(e,g):x.join(b[l],g);return t.existsSync(S)}function R(){return G(e.fileName)}function G(l){let g=x.join(e.paths.sessionFull,l);if(!g||!t.existsSync(g)||l.split(/[\\/]+/).some(F=>ki.has(F))||_i.some(F=>x.basename(l).startsWith(F))||l==="config.json"||l==="log.txt")return null;let b=x.join(e.paths.sessionFull,Qo),S=Mi(t,x.join(b,x.basename(l)));return t.ensureDirSync(b),t.copySync(g,S),t.removeSync(g),S}function Ee(l,g){let b=g.startsWith(".")?g:`.${g}`,S=x.extname(l);return S?l.slice(0,-S.length)+b:`${l}${b}`}function Ie(l){let g=e.config||{};return(g.cleanUp||g.cleanup||{})?.[l]||null}function mt(l){let g=[],b=new Set;for(let S of l){let F=Ie(S);if(!F)continue;let J=[],q=(E,B)=>{let z=`move-to-done:${E}`;if(b.has(z))return;b.add(z);let te=G(E);J.push({action:"move-to-done",reason:B,fileName:E,status:te?"moved":"skipped",donePath:te})},se=(E,B)=>{let z=`delete:${E}`;if(b.has(z))return;b.add(z);let te=x.join(e.paths.sessionFull,E);if(!t.existsSync(te)){J.push({action:"delete",reason:B,fileName:E,status:"missing"});return}t.removeSync(te),J.push({action:"delete",reason:B,fileName:E,status:"deleted"})},Y=(E,B)=>{if(F.verb==="done"){q(E,B);return}F.verb==="delete"&&se(E,B)};Y(e.fileName,"trigger");for(let E of Array.isArray(F.additionalExt)?F.additionalExt:[])Y(Ee(e.fileName,E),`additionalExt:${E}`);for(let E of Array.isArray(F.additionalFiles)?F.additionalFiles:[])Y(E,"additionalFiles");g.push({commandName:S,policy:F,actions:J})}return g}function zs(l,g,b){if(!b.length)return null;let S=g.replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase(),F=x.join(xt,`${l}.${S}.cleanup.json`);return o("sessionFull",F,{botName:l,sourceFileName:g,createdAt:Date.now(),actions:b}),F}function qs(l){let g=x.join(e.paths.sessionFull,xt);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),q=t.readJsonSync(J);if(q.sourceFileName&&q.sourceFileName!==l)continue;let se=Array.isArray(q.actions)?q.actions:[],Y=[];for(let E of se){if(!E?.fileName||Li(E.fileName,".."))continue;let B=x.join(e.paths.sessionFull,E.fileName);if(!t.existsSync(B)){Y.push({...E,status:"missing"});continue}if(E.action==="move-to-done"){let z=G(E.fileName);Y.push({...E,status:z?"moved":"skipped",donePath:z});continue}E.action==="delete"&&(t.removeSync(B),Y.push({...E,status:"deleted"}))}t.removeSync(J),b.push({manifestFileName:F,botName:q.botName,sourceFileName:q.sourceFileName,actions:Y})}return b}function Us(l,g){for(let b in g)f(l,b,g[b])}function Gs(l,g,b){let S=g.replace(/\.[^.]+$/,".meta.json"),F=g.replace(/\.[^.]+$/,".txt"),{usage:J,cost:q,model:se,duration:Y}=b||{};return o(l,S,{model:se,usage:J,cost:q,duration:Y,sourceFileName:g,outputFileName:F}),S}function $o(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 Do(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 Vs(l,g,b={}){let S=$o(l);S&&H(e,Do(g,b),{console:!1,local:!0,localPath:S,operation:!1,workspace:!1})}function Ws(l,g,b={}){let S=$o(l);H(e,Do(g,b),{local:!!S,localPath:S??void 0,operation:!0,workspace:!0})}function lt(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 Ks(l,g,b){let S=jo(l,b).filter(J=>!g||St(J,g));if(S.length===0)return null;S.sort();let F=S.pop();return F?Xo(F):null}return{sessionFull:e.paths.sessionFull,machineFull:e.paths.machineFull,readFile:l=>t.readJsonSync(`${ie()}${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)=>lt("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)=>c("sessionFull",l,g),removeCheckpoint:l=>C("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=>Us("sessionFull",l),saveMeta:(l,g)=>Gs("sessionFull",l,g),patchSessionJson:l=>{if(!(!e.machineId||!e.sessionId))return lt("sessionFull","_session.json",l)},saveTimeline:l=>{if(!(!e.machineId||!e.sessionId))return o("sessionFull","_timeline.json",l)},listFiles:()=>jo("sessionFull"),addToLog:(l,g={})=>Ws("sessionFull",l,g),addToLocalLog:(l,g={})=>Vs("sessionFull",l,g),generateMd:l=>w("sessionFull",l),getNextFile:(l,g)=>Ks("sessionFull",l,g),moveInputFileToDone:R,applyCleanupPolicy:mt,writeCleanupManifest:zs,applyCleanupManifests:qs},machine:{read:l=>r("machineFull",l),write:(l,g)=>o("machineFull",l,g),patch:(l,g)=>lt("machineFull",l,g),patchState:l=>lt("machineFull","state.json",l),readDir:l=>y("machineFull",l),readDirJsons:(l,g)=>I("machineFull",l,g),ensureDir:l=>T("machineFull",l),generateMd:l=>w("machineFull",l)},srcData:{read:l=>{let g=x.resolve("./src");return t.readJsonSync(x.join(g,"data",l))}}}};import At from"lodash";var ge={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"}},Ji=new Set(["source","source-subdirectory","workspace","os-temp","none"]);function sn(e,t){let r=At.merge({},t,e),o=typeof r.directory=="string"?r.directory.trim():"",n=o.length>0&&!o.startsWith("/")&&!o.startsWith("\\")&&!o.split(/[\\/]+/).includes("..");return{location:Ji.has(r.location)?r.location:t.location,directory:n?o:t.directory}}function Ft(e,t){let r=At.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 Bi(e,t){let r=Ft(e,t),o=At.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 zi(e,t){let r=Ft(e,t),o=At.merge({},t,e);return{...r,silenceCrudDelete:typeof o.silenceCrudDelete=="boolean"?o.silenceCrudDelete:t.silenceCrudDelete,silenceRequestBotStartDone:typeof o.silenceRequestBotStartDone=="boolean"?o.silenceRequestBotStartDone:t.silenceRequestBotStartDone}}function Ye(e){let t=e&&typeof e=="object"?e:{};return{logs:{console:zi(t.logs?.console,ge.logs.console),local:Ft(t.logs?.local,ge.logs.local),operation:Bi(t.logs?.operation,ge.logs.operation),workspace:Ft(t.logs?.workspace,ge.logs.workspace)},intermediates:sn(t.intermediates,ge.intermediates),meta:sn(t.meta,ge.meta)}}import Te from"lodash";import p from"lodash";function ue(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 pe(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 oe(e={}){return p.pickBy(e,t=>t!=null&&t!=="")}function kt(e={}){let t=p.get(e,"options");return!t||typeof t!="object"||Array.isArray(t)?e:{...t,...e}}function _t(e){return typeof e=="string"&&/^\d+x\d+$/i.test(e.trim())}function qi(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=kt(o),s=p.get(n,"imageSize");return oe({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")??(_t(s)?s:void 0),aspectRatio:p.get(n,"aspectRatio")??p.get(n,"imageAspectRatio"),imageSize:p.get(n,"googleImageSize")??p.get(n,"resolution")??p.get(n,"imageResolution")??(_t(s)?void 0:s),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=kt(o);return oe({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 oe(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 Ui(e={},t){if(t==="image"){let r=kt(p.get(e,"image",{})),o=p.get(e,"imageSize")??p.get(r,"imageSize");return oe({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")??(_t(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")??(_t(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=kt(p.get(e,"video",{}));return oe({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 oe({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 oe({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 oe({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 X(e={},t,r={}){let o=p.get(e,"ai",{}),n=t==="speech"?"tts":t,s=p.get(r,"profile")??p.get(e,[`${n}Profile`])??p.get(e,[n,"profile"])??p.get(o,["defaults",n]),i=s?p.get(o,["profiles",s],{}):{},a=p.get(o,n,{}),u=p.merge({},i,a,Ui(e,n),qi(e,n),oe(r));return u.task=n,u.provider=ue(u.provider),u.provider||(u.provider=pe(u.model,n)),oe(u)}var Gi={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 Lr(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:Gi[t]}function an(e,t){return Lr(t)??Lr(e.params?.language)??Lr(e.params?.languageCode)}import ua from"node:fs";import Ot from"node:fs";import fn from"lodash";import Re from"path";import Wi from"chokidar";import Ki from"fs-extra";import{globSync as Yi}from"glob";import un from"kleur";import{minimatch as Nr}from"minimatch";import{dirname as pn,isAbsolute as cn,join as Ne}from"node:path";var Le=["node_modules/**","**/node_modules/**","**/dist/**","**/build/**","**/out/**","**/coverage/**","**/.cache/**","**/.tmp/**","**/tmp/**","**/log.txt"],Bm=[...Le,/(^|[\/\\])\../];import{globSync as Vi}from"glob";var He=(e,t,r=[])=>Vi(t,{cwd:e,ignore:[...Le,...r],nodir:!0,dot:!1}),Et=(e,t,r=[])=>He(e,t,r).length;function Lt(e){return e.replace(/\\/g,"/").replace(/^\/+/,"")}function Hi(e,t){let r=Lt(t).replace(/\/+$/,"");if(!r||r.startsWith("#")||r.startsWith("!"))return[];let o=Lt(t.startsWith("/")?r:Ne(e,r));if(!r.includes("/")){let n=Lt(Ne(e,"**",r));return[o,`${o}/**`,n,`${n}/**`]}return[o,`${o}/**`]}function Xi(e){return Yi("**/.timignore",{cwd:e,nodir:!0,dot:!0,ignore:Le}).flatMap(r=>{let o=pn(r)==="."?"":pn(r);return Ki.readFileSync(Ne(e,r),"utf-8").split(/\r?\n/).map(s=>s.trim()).flatMap(s=>Hi(o,s))})}function Or(e){let{cwd:t,target:r,watchPaths:o,depth:n,callbacks:s={},createContext:i,ignore:a=[],ignoreLogs:u,silent:c=!1}=e,d=Xi(t),f=[...a,...d],m=d.map(v=>Ne(t,v)),h=o?.length?o.map(v=>cn(v)?v:Ne(t,v)):[t],y=o?.length?o.reduce((v,T)=>v+Et(cn(T)?T:Ne(t,T),"*",f),0):Et(t,r,f),I=Wi.watch(h,{persistent:!0,depth:n,ignored:[...Le,...f,...m,/(^|[\/\\])\../],ignoreInitial:!0}),A=(v,T)=>i?i(v,T):v,w=v=>Nr(Lt(v),r),C=v=>{let T=v.replace(/\\/g,"/"),L=T.replace(/^\/+/,"");return f.some(R=>Nr(T,R)||Nr(L,R))};return I.on("all",(v,T)=>{let L=T.replace(t,""),R=L.endsWith("log.txt");if(u&&R||C(L))return;let G=w(L);e.debug}).on("add",async v=>{let T=v.replace(t,""),L=T.endsWith("log.txt");if(u&&L||C(T))return;let R=w(T);!s.onAdd||!R||(c||console.log(un.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||C(T))return;let R=w(T);!s.onChange||!R||s.onChange(A(T,"update"))}).on("unlink",async v=>{let T=v.replace(t,""),L=w(T),R=T.endsWith("log.txt");u&&R||C(T)||!s.onUnlink||!L||s.onUnlink(A(T,"delete"))}).on("ready",()=>{c||console.log(un.magenta("watching:"),y,"files")}),I}import Xe from"node:path";function Nt(e,t){let r=t?Xe.dirname(t):e,o=Xe.relative(e,r);if(!o||o==="."||o.startsWith("..")||Xe.isAbsolute(o))return[e];let n=o.split(Xe.sep).filter(Boolean),s=[e];for(let i=1;i<=n.length;i++)s.push(Xe.join(e,...n.slice(0,i)));return s}import nl from"fs-extra";import{homedir as Zi}from"node:os";import Qi from"node:path";import mn from"lodash";var fe=new Map,ln=Symbol.for("tim.resolvedGalleryImports");function Oe(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.");fe.set(t.name,t);for(let r of t.aliases||[])fe.set(r,t)}}function dn(e){return e[ln]??[]}function ye(){return process.env.TIM_PROMPTS_HOME||Qi.join(Zi(),".tim","prompts")}function ea(e,t){return Object.defineProperty(e,ln,{value:[...t],enumerable:!1,configurable:!0}),e}function ta(e){let{import:t,...r}=e;return r}function ra(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 gn(e,t){if(typeof e=="string"){t(e);return}if(Array.isArray(e))for(let r of e)gn(r,t)}function oa(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))gn(n,s=>{fe.has(s)&&t.add(s)});return t}function na(e,t,r){let o=e.config?.triggers?.[t],n=o?.[r];if(typeof n=="string"&&!fe.has(n))return n;if(o&&typeof o=="object"){for(let s of Object.values(o))if(typeof s=="string"&&!fe.has(s))return s}throw new Error(`IO gallery "${e.name}" does not define an entry command for ${t}.`)}function sa(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"&&fe.has(s)&&(o[n]=na(fe.get(s),r,n))}}function ia(e,t,r){if(t.has(e))throw new Error(`Circular IO gallery import detected: ${[...t,e].join(" -> ")}`);let o=fe.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(ra(e.import));for(let s of oa(e))o.add(s);let n={};for(let s of o)mn.merge(n,ia(s,t,r));return mn.merge(n,ta(e)),sa(n),ea(n,r)}function yn(e){return e.file.startsWith("/_requests/")&&e.sessionFull?e.sessionFull:e.fileFull}var Rt=(e,t,r={},o)=>{let n={},{paths:s}=e,{rootFull:i}=s,a=yn(s),u=[];t==="_prompts"&&u.push({dirPath:ye(),fs:{existsSync:Ot.existsSync,readdirSync:Ot.readdirSync,readFileSync:Ot.readFileSync,readJsonSync:c=>JSON.parse(Ot.readFileSync(c,"utf-8"))}}),u.push(...Nt(i,a).map(c=>({dirPath:Re.join(c,t),fs:o})));for(let{dirPath:c,fs:d}of u){if(!d.existsSync(c))continue;let f=d.readdirSync(c).filter(m=>m.endsWith(".md"));for(let m of f){let h=Re.basename(m),y=Re.parse(h).name;y.includes(".")&&(y=y.split(".").pop());let I="";I=d.readFileSync(Re.join(c,m),"utf-8"),I=I.trim().replace(`
7
- `,"");let A=t==="voices"?"voiceId":"promptTemplate";n[y]={[A]:aa(I,r)};let w=m.replace(".md",".schema.json"),C=Re.join(c,w);if(d.existsSync(C)){let v=d.readJsonSync(C);n[y].schema=v}}}return n},hn=(e,t)=>{let r={},o=new Set,{paths:n}=e,{rootFull:s}=n,i=yn(n),a=Nt(s,i).map(u=>Re.join(u,"config.json"));for(let u of a){if(!t.existsSync(u))continue;let c=Pe(t.readJsonSync(u),new Set,o);fn.merge(r,c)}return Pe(r,new Set,o)};function aa(e,t){return e.replace(/\$\{([^}]+)\}/g,(r,o)=>{let n=String(o).trim(),s=fn.get(t,n);return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s,null,2)})}var ne=e=>({resolveConfig:t=>hn(t,e),resolveLibrary:(t,r,o={})=>Rt(t,r,o,e),resolvePrompts:(t,r={})=>{let o=dn(t.config||{}),n=ye();if(o.length>0&&!ua.existsSync(n))throw new Error(`IO gallery prompts were not found at ${n}. Run "tim init" to install gallery prompts.`);return Rt(t,"_prompts",r,e)},resolveVoices:t=>Rt(t,"voices",{},e)});var Fe=()=>({prepareTextToTextRequest(e,t){let{promptId:r,inject:o,extra:n}=t,s=ne(re()),i=o??{...e.settings,...e.params,fileContent:e.fileContent?.text},a=s.resolvePrompts(e,i),u=X(e.settings,"llm",{provider:t.provider,model:t.model,providerOptions:t.providerOptions}),{provider:c,model:d,providerOptions:f}=u,m=Te.get(a,[r,"promptTemplate"],""),h=Te.get(a,[r,"schema"],{});if(!m)throw new Error(`No prompt template found for promptId: ${r}`);let y={provider:c,model:d,prompt:m,schema:h,providerOptions:f,...n||{}};return Te.pickBy(y,I=>I!=null&&I!=="")},prepareTtsRequest(e,t){let{text:r,prompt:o,promptId:n,inject:s}=t,i=ne(re()),a=s??{...e.settings,...e.params,fileContent:e.fileContent?.text};if(n&&!o&&!r){let m=i.resolvePrompts(e,a);o=Te.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=X(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,d=u.model||"eleven_v3",f=an(e,t.languageCode);return Te.pickBy({provider:u.provider,text:r,voiceId:c,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=X(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=ne(re()),u=s??{...e.settings,...e.params,fileContent:e.fileContent?.text};if(n&&!o){let d=a.resolvePrompts(e,u);o=Te.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 Te.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 ma}from"@ai-sdk/anthropic";import{createAzure as la}from"@ai-sdk/azure";import{createByteDance as da}from"@ai-sdk/bytedance";import{createElevenLabs as ga}from"@ai-sdk/elevenlabs";import{createGoogleGenerativeAI as fa}from"@ai-sdk/google";import{createHuggingFace as ya}from"@ai-sdk/huggingface";import{createOpenAI as ha}from"@ai-sdk/openai";import{createXai as ba}from"@ai-sdk/xai";import{Output as va,experimental_generateSpeech as Ia,experimental_generateVideo as Sa,experimental_transcribe as xa,generateImage as wa,generateText as $t,jsonSchema as Ca}from"ai";var ce={inputCost:0,cachedInputCost:0,outputCost:0,totalCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0}};var bn={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 ca(e,t){let r=bn.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 Rr(e,t,r){let o=ca(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{...ce,breakdown:{...ce.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,c=i*o.cachedInput/1e6,d=s*o.output/1e6;return{inputCost:u,cachedInputCost:c,outputCost:d,totalCost:u+c+d,breakdown:{inputTokens:n,cachedTokens:i,billedInputTokens:a,outputTokens:s,audioTokens:0}}}function $r(){return ha({apiKey:process.env.OPENAI_API_KEY})}function In(){return la({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 Dr(){return fa({apiKey:process.env.GOOGLE_API_KEY})}function Sn(){return ga({apiKey:process.env.ELEVENLABS_API_KEY||process.env.ELEVEN_LABS_API_KEY})}function Pa(){return ma({apiKey:process.env.ANTHROPIC_API_KEY})}function xn(){return ba({apiKey:process.env.XAI_API_KEY})}function Ta(){return ya({apiKey:process.env.HUGGINGFACE_API_KEY||process.env.HF_TOKEN})}function $e(e,t){try{e?.(t)}catch{}}function Fa(e){let t=0;return da({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))$e(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";$e(e,{phase:u==="succeeded"?"ready":"polling",status:u,taskId:typeof a.id=="string"?a.id:void 0,pollCount:t})}}catch{}return n}})}function De(e,t){if(!t)throw new Error(`AI provider "${e}" requires an explicit model in settings or request.`);return t}function jr(e,t){let r=ue(e)||pe(t,"llm");if(r==="azure"){let o=De("azure",t);return{provider:"azure",model:o,sdkModel:In()(o)}}if(r==="anthropic"){let o=De("anthropic",t);return{provider:"anthropic",model:o,sdkModel:Pa()(o)}}if(r==="xai"){let o=De("xai",t);return{provider:"xai",model:o,sdkModel:xn()(o)}}if(r==="huggingface"){let o=De("huggingface",t);return{provider:"huggingface",model:o,sdkModel:Ta()(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:Dr()(t||"gemini-2.5-pro")}:{provider:"openai",model:t||"gpt-5.2",sdkModel:$r()(t||"gpt-5.2")}}function Aa(e,t,r){let o=ue(e)||pe(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:Fa(r).video(n)}}function ka(e,t){let r=ue(e)||pe(t,"image");if(r==="xai"){let o=De("xai",t);return{provider:"xai",model:o,sdkModel:xn().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=_a(t);return{provider:"google",model:o,sdkModel:Dr().image(o)}}return{provider:"openai",model:t||"gpt-image-1",sdkModel:$r().image(t||"gpt-image-1")}}function _a(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 Ea(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 La(e){if(typeof e=="string")return e;let t=Buffer.from(e);return`data:${Ea(t)};base64,${t.toString("base64")}`}async function Na(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:c,outputFormat:d,output_format:f,...m}=o,h=e.referenceImages?.map(La),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||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 A=I?.data?.find(C=>C?.b64_json||C?.url);if(!A){let C=I?.data?.find(v=>v?.error)?.error?.message;throw new Error(`ByteDance image generation returned no image${C?`: ${C}`:"."}`)}let w;if(A.b64_json)w=Buffer.from(A.b64_json,"base64");else{let C=await globalThis.fetch(A.url);if(!C.ok)throw new Error(`ByteDance image download failed (${C.status}): ${C.statusText}`);w=Buffer.from(await C.arrayBuffer())}return Ke(e.outputPath,w),{provider:"bytedance",model:I.model||t,usage:I.usage||{},cost:Rr("bytedance",I.model||t,I.usage),outputFormat:e.outputFormat||d||f||"jpeg",providerMetadata:{bytedance:{created:I.created,size:A.size}},warnings:[]}}function Oa(e,t){return(ue(e)||pe(t,"tts"))==="openai"?{provider:"openai",model:t||"tts-1",sdkModel:$r().speech(t||"tts-1")}:{provider:"elevenlabs",model:t||"eleven_v3",sdkModel:Sn().speech(t||"eleven_v3")}}function Ra(e,t){let r=ue(e)||pe(t,"transcription");if(r==="elevenlabs"){let o=t||"scribe_v2";return{provider:"elevenlabs",model:o,sdkModel:Sn().transcription(o)}}if(r==="azure"){let o=De("azure",t);return{provider:"azure",model:o,sdkModel:In().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:Dr()(t||"gemini-2.5-flash")}}function je(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 $a(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 Da(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,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 d=s*a/1e6,f=n*u/1e6,m=i*c/1e6;return{inputCost:d,cachedInputCost:f,outputCost:m,totalCost:d+f+m,breakdown:{inputTokens:o,cachedTokens:n,billedInputTokens:s,outputTokens:i,audioTokens:0}}}function Dt(e,t,r){let o=je(r),n=o.input_tokens_details?.cached_tokens??0;return!o.input_tokens&&!o.output_tokens?ce:e==="google"?Da(o,t):e==="openai"?$a(o):{...ce,breakdown:{inputTokens:o.input_tokens,cachedTokens:n,billedInputTokens:Math.max(0,o.input_tokens-n),outputTokens:o.output_tokens,audioTokens:0}}}function vn(e){return!!(e&&typeof e=="object"&&Object.keys(e).length>0)}async function ja(e){let{provider:t,model:r,sdkModel:o}=jr(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkLlm: "prompt" is required.');let n=await $t({model:o,prompt:e.prompt,providerOptions:e.providerOptions,...vn(e.schema)?{output:va.object({schema:Ca(e.schema),name:"schema"})}:{}}),s=vn(e.schema)?n.output:n.text,i=je(n.usage);return{output:s,usage:i,model:n.response?.modelId||r,provider:t,cost:Dt(t,r,i),providerMetadata:n.providerMetadata,warnings:n.warnings}}async function Ma(e){let{provider:t,model:r,sdkModel:o}=jr(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkText: "prompt" is required.');let n=await $t({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=je(n.usage);return{output:s,usage:i,model:n.response?.modelId||r,provider:t,cost:Dt(t,r,i),providerMetadata:n.providerMetadata,warnings:n.warnings}}async function Mr(e){let{provider:t,model:r,sdkModel:o}=jr(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkVisionText: "prompt" is required.');let n=await $t({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=je(n.usage);return{output:s,usage:i,model:n.response?.modelId||r,provider:t,cost:Dt(t,r,i),providerMetadata:n.providerMetadata,warnings:n.warnings}}async function wn(e){if((ue(e.provider)||pe(e.model,"image"))==="bytedance"){if(!e.prompt)throw new Error('generateAiSdkImage: "prompt" is required.');return Na(e,e.model||"seedream-5-0-260128")}let{provider:r,model:o,sdkModel:n}=ka(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 wa({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}),c=u.image;if(!c)throw new Error("generateAiSdkImage: no image returned.");Ke(e.outputPath,Buffer.from(c.uint8Array));let d=u.providerMetadata?.openai?.images?.[0]?.revisedPrompt;return{provider:r,model:o,usage:u.usage||{},cost:Rr(r,o,u.usage),outputFormat:e.outputFormat,revisedPrompt:d,providerMetadata:u.providerMetadata,warnings:u.warnings}}async function Jr(e){if(!e.prompt)throw new Error('generateAiSdkVideo: "prompt" is required.');let{provider:t,model:r,sdkModel:o}=Aa(e.provider,e.model,e.onProgress);$e(e.onProgress,{phase:"preparing"});try{let n=await Sa({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 $e(e.onProgress,{phase:"downloaded",bytes:s.byteLength,mediaType:n.video.mediaType}),Ke(e.outputPath,s),$e(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 $e(e.onProgress,{phase:"failed",error:n instanceof Error?n.message:String(n)}),n}}async function Cn(e){let{provider:t,model:r,sdkModel:o}=Oa(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 Ia({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 Ja(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 Ba(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 Pn(e){let t=Ra(e.provider,e.model);if(t.provider!=="google"){let s=await xa({model:t.sdkModel,audio:e.audio,providerOptions:e.providerOptions}),i=je({});return{text:s.text,task:"transcribe",usage:i,model:t.model,provider:t.provider,cost:ce,providerMetadata:s.providerMetadata,warnings:s.warnings}}let r=await $t({model:t.sdkModel,messages:[{role:"user",content:[{type:"text",text:Ba(e)},{type:"file",data:e.audio,filename:e.fileName||"audio.m4a",mediaType:Ja(e.fileName)}]}],providerOptions:e.providerOptions}),o=r.text?.trim();if(!o)throw new Error("transcription: Empty text response from model.");let n=je(r.usage);return{text:o,task:"transcribe",usage:n,model:r.response?.modelId||t.model,provider:t.provider,cost:Dt(t.provider,t.model,n),providerMetadata:r.providerMetadata,warnings:r.warnings}}var Br=ja,zr=Ma;function qr(e,t){let r=e?.[`ai-${t}`];return!!(r&&typeof r=="object"&&!Array.isArray(r))}function jt(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function za(e){return Object.fromEntries(Object.entries(e||{}).filter(([,t])=>t!=null&&t!==""))}function Fn(e){return`ai-${e}`}function An(e){return String(e??"").trim().replace(/[\\/]/g,"-").replace(/\s+/g,"-").replace(/^\.+|\.+$/g,"")||void 0}function U(e,t){let r=An(t);return r?`${e}.${r}`:e}function qa(e,t){let r=Fn(t);if(!jt(e))throw new Error(`settings must be an object with a "${r}" section.`);let o=e[r];if(!jt(o))throw new Error(`settings.${r} must be an object.`);return o}function Tn(e,t){if(!jt(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=An(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:za(i),suffix:r}}function Ua(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(!jt(o))throw new Error(`AI output variant at index ${n} must be an object.`);if(o.disabled===!0||o.enabled===!1)return[];let s=Tn(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[Tn(t,{requireSuffix:!1})]}function D(e,t){let r=qa(e,t),o=Fn(t),{output:n,...s}=r;return Ua(r).map(a=>({commandSettings:s,output:a.output,settings:{...e,[o]:{...s,output:a.output},...s,...a.output},suffix:a.suffix}))}import Ur from"lodash";import Ga from"openai";import{toFile as kn}from"openai/uploads";var Va={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"},Mt;function Jt(){if(Mt)return Mt;let e=process.env.OPENAI_API_KEY;if(!e)throw new Error("OPENAI_API_KEY is not configured");return Mt=new Ga({apiKey:e}),Mt}var Wa=1.25/1e6,Ka=.125/1e6,Ya=10/1e6,Ha=e=>{let t=e.input_tokens_details?.cached_tokens??0,r=e.input_tokens-t,o=r*Wa,n=t*Ka,s=e.output_tokens*Ya,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 Xa=2.5/1e6,Za=10/1e6,_n=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=Ur.get(e,"usage.input_tokens",0),r.breakdown.outputTokens=Ur.get(e,"usage.output_tokens",0),r.breakdown.audioTokens=Ur.get(e,"usage.input_token_details.audio_tokens",0),r.inputCost=r.breakdown.inputTokens*Xa,r.outputCost=r.breakdown.outputTokens*Za,r.totalCost=r.inputCost+r.outputCost}catch{}return r};var En=async(e,t="audio.m4a",r={},o)=>{let{model:n="gpt-4o-transcribe",prompt:s,language:i}=r,u={file:await kn(e,t),model:n,stream:!0};s&&(u.prompt=s),i&&(u.language=i);let c=await Jt().audio.transcriptions.create(u),d="",f;for await(let y of c){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=_n(m);return{...m,cost:h}},Ln=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 kn(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 w of f){if(w.type==="transcript.text.segment"){m.push(w),s?.({type:"segment",segment:w,segments:[...m]});continue}if(w.type==="transcript.text.delta"){h+=w.delta||"",s?.({type:"delta",text:h,segments:[...m]});continue}w.type==="transcript.text.done"&&(h=w.text||h,y=w.usage,s?.({type:"done",text:h,usage:y,segments:[...m]}))}let I={text:h,task:"transcribe",duration:m.reduce((w,C)=>Math.max(w,Number(C.end)||0),0),segments:m,usage:y},A=_n(I);return{...I,cost:A}},Gr=async e=>{let{model:t=Va.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 c=u,d=a.usage,f=Ha(d)??{};return{output:c,cost:f,conversationId:s}};import Nn from"lodash";import Vr from"path";function On(e){return ue(e)}function Rn(e){return pe(e,"image")}function O(e,t){let r=t.replace(/^image/,""),o=r?r.charAt(0).toLowerCase()+r.slice(1):t;return Nn.get(e,t)??Nn.get(e,["image",o])}function Qa(e){let t=e?.toLowerCase();return!t||t==="jpeg"?"jpg":t==="jpg"||t==="png"||t==="webp"?t:"jpg"}function Ze(...e){let t=[];for(let r of e){if(Array.isArray(r)){t.push(...Ze(...r));continue}let o=typeof r=="string"?r.trim():"";o&&t.push(o)}return t}function $n(e){return/^https?:\/\//i.test(e)||/^data:/i.test(e)}function eu(e={},t={},r=process.cwd()){let o=Ze(e.referenceImagePath,e.referenceImagePaths,e.reference,e.references),n=Ze(O(t,"imageReferencePath"),O(t,"imageReferencePaths"),O(t,"reference"),O(t,"references")),s=o.length?o:n;return[...new Set(s)].map(i=>$n(i)||Vr.isAbsolute(i)?i:Vr.resolve(r,i))}function tu(e){return e.map(t=>{if($n(t))return t;if(!$(t))throw new Error(`genai.images: reference image not found: ${t}`);return M(t)})}function ru(e={},t={}){let r=Ze(e.referenceType,e.referenceTypes),o=Ze(O(t,"imageReferenceType"),O(t,"imageReferenceTypes"),O(t,"referenceType"),O(t,"referenceTypes"));return r.length?r:o}var ou={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 nu(e,t){if(!t.length)return e;let r=[...new Set(t)].map(o=>{let n=o.trim().toLowerCase();return ou[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 Qe(e={},t={}){return On(e.provider)||On(O(t,"imageProvider"))||Rn(e.model)||Rn(O(t,"imageModel"))||"google"}function Wr(e={},t={}){let r=Qe(e,t);return r==="openai"||r==="bytedance"?Qa(e.outputFormat||e.output_format||O(t,"imageOutputFormat")||"jpeg"):"jpg"}function et(e={},t={}){return{provider:Qe(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=et(e,r),n=eu(e,r,Vr.dirname(t)),s=tu(n),i=ru(e,r),a=nu(e.prompt||"",i);if(!a)throw new Error("genai.images: prompt is required.");return wn({...o,prompt:a,outputPath:t,referenceImages:s})}import Bt from"lodash";import he from"path";function zt(e){return/^https?:\/\//i.test(e)||/^data:/i.test(e)}function qt(e={},t={},r=process.cwd()){let o=X(t,"video",e),n=String(o.referenceImagePath||o.reference||"").trim(),s=!!e.referenceImagePaths?.length,i=n||(!s&&$(he.resolve(r,"ref.png"))?"ref.png":"");return!i||zt(i)||he.isAbsolute(i)?i||void 0:he.resolve(r,i)}function Ut(e=[],t=process.cwd()){return[...new Set(e.map(r=>r.trim()).filter(Boolean))].map(r=>zt(r)||he.isAbsolute(r)?r:he.resolve(t,r))}function su(e){if(!e||zt(e))return e;if(!$(e))throw new Error(`genai.videos: reference image not found: ${e}`);return M(e)}function iu(e){let t=he.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 au(e){if(zt(e))return e;if(!$(e))throw new Error(`genai.videos: reference image not found: ${e}`);return`data:${iu(e)};base64,${M(e).toString("base64")}`}async function Yr(e,t,r={}){let o=X(r,"video",e),n=String(o.prompt||e.prompt||"").trim();if(!n)throw new Error("genai.videos: prompt is required.");let s=qt(e,r,he.dirname(t)),i=Ut(e.referenceImagePaths,he.dirname(t));if(s&&i.length)throw new Error("genai.videos: first-frame referenceImagePath cannot be combined with body reference images.");let a=Bt.merge({},o.providerOptions,i.length?{bytedance:{referenceImages:i.map(au)}}:{});return Jr({provider:o.provider||"bytedance",model:o.model,prompt:n,outputPath:t,referenceImage:su(s),aspectRatio:o.aspectRatio,resolution:o.resolution,duration:Bt.isNumber(o.duration)?o.duration:void 0,fps:Bt.isNumber(o.fps)?o.fps:void 0,seed:Bt.isNumber(o.seed)?o.seed:void 0,providerOptions:a,onProgress:e.onProgress})}import{promises as uu}from"node:fs";import pu from"sharp";async function Hr(e){let[t,r]=await Promise.all([pu(e).metadata(),uu.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 cu}from"node:child_process";function Zr(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=cu(e,t,{stdio:["ignore",o?"pipe":"ignore","pipe"]}),a="",u="";i.stdout?.on("data",c=>{a+=c.toString()}),i.stderr?.on("data",c=>{u+=c.toString()}),i.on("error",s),i.on("close",c=>{if(c===0){n(a);return}s(new Error(`${e} exited with code ${c}: ${u||a}`))})})}async function Mn(e,t={}){let{hideBanner:r=!0,logLevel:o="error",overwrite:n=!0}=t,s=[...e];n&&(s=Zr(s,"-y")),o&&(s=Zr(s,"-loglevel",[o])),r&&(s=Zr(s,"-hide_banner")),await jn("ffmpeg",s,{collectStdout:!1})}async function Gt(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 Qr(e){await Mn(["-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 Jn(e){await Mn(["-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 Gt(e)}import{ElevenLabsClient as mu}from"@elevenlabs/elevenlabs-js";import lu from"path";var Vt;function du(){return Vt||(Vt=new mu({apiKey:process.env.ELEVENLABS_API_KEY||process.env.ELEVEN_LABS_API_KEY}),Vt)}async function gu(e,t,r={}){let{modelId:o="eleven_v3",languageCode:n,outputFormat:s="mp3_44100_128"}=r,a=(await du().textToSpeech.convert(t,{text:e,modelId:o,...n?{languageCode:n}:{},outputFormat:s})).getReader(),u=[],c,d;for(;{done:c,value:d}=await a.read(),!c;)u.push(d);return{buffer:Buffer.concat(u),provider:"elevenlabs-native",model:o,voiceId:t,outputFormat:s}}var to=async(e,t,r,o={})=>{if(r){let n=ie(),s=lu.join(n,"beep.mp3");return Ge("Debug speech mode returning beep audio",{kind:"diagnostic",level:"debug",data:{beepPath:s}}),{buffer:M(s),provider:"debug",model:o.modelId||"beep",voiceId:t,outputFormat:"mp3"}}return o.provider==="native-elevenlabs"||o.provider==="elevenlabs-native"?gu(e,t,o):Cn({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 fu from"p-limit";import tt from"node:fs";import yu from"node:os";import Ae from"node:path";var no=13,rt={extension:"m4a",codec:"aac",channels:1,sampleRate:16e3,bitrate:"48k"},qn=300,Un=2,hu=24,bu="gpt-4o-transcribe",vu="gpt-4o-transcribe-diarize",Iu="gemini-2.5-flash",Su=2e3,xu=1e4,Gn=/\.(m4a|mp3|mp4|mpeg|mpga|ogg|wav|webm)$/i;function Kt(e,t){let r=Number(e);return Number.isFinite(r)&&r>0?r:t}function Wt(e,t){return Math.max(1,Math.floor(Kt(e,t)))}function Bn(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 wu(e){return e.replace(Gn,"")}function Cu(e){return`_parts/${e.replace(/\.[^.]+$/,".transcript.json")}`}function ro(e){if(typeof e!="string")return;let t=e.toLowerCase();if(t==="diarized")return"diarized";if(t==="chunked")return"chunked"}function Pu(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=Pu(t),o=X(t,"transcription"),s=ro(r.mode)||ro(r.type)||ro(t.transcriptionMode)||(Bn(r.diarize??t.transcriptionDiarize,!1)?"diarized":void 0)||"chunked",i=Kt(r.maxUploadMb??t.maxTranscriptionUploadMb,hu),a=o.model||(s==="chunked"?t.model:void 0)||(o.provider==="google"?Iu:void 0)||(s==="diarized"?vu:bu),u=s==="diarized"?xu:Su;return{mode:s,provider:o.provider||"openai",model:a,providerOptions:o.providerOptions,prompt:r.prompt??t.transcriptionPrompt,language:r.language??t.transcriptionLanguage,partSeconds:Kt(r.partSeconds??t.transcriptionPartSeconds,qn),overlapSeconds:Kt(r.overlapSeconds??t.transcriptionOverlapSeconds,Un),parallelLimit:Wt(r.parallelLimit??t.transcriptionParallelLimit,no),maxUploadMb:i,maxUploadBytes:i*1024*1024,progressWriteIntervalMs:Wt(r.progressWriteIntervalMs??t.transcriptionProgressWriteIntervalMs,u),waitForStableFile:Bn(r.waitForStableFile??t.transcriptionWaitForStableFile,!0),stableFileSamples:Wt(r.stableFileSamples??t.transcriptionStableFileSamples,3),stableFileIntervalMs:Wt(r.stableFileIntervalMs??t.transcriptionStableFileIntervalMs,1e3)}}function Yt(e){let t=wu(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 io(e){let t=e.partSeconds??qn,r=e.overlapSeconds??Un,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),c=`${e.baseName}.part-${String(s).padStart(3,"0")}.${rt.extension}`;o.push({index:s,fileName:c,start:a,end:u,duration:u-a,nominalStart:n,nominalEnd:i,overlapBefore:n-a,overlapAfter:u-i})}return o}function Ht(e){return N().statSync(e).size}function Vn(e,t){return Er(e,Ae.join("_parts",t),{forWrite:!0})}function oo(e){return M(e).length}function Tu(e,t){let r=Er(e,t);if(!$(r))return null;let o=Ct(r),n=Array.isArray(o.parts)?o.parts:[];if(!n.length)return null;let s=n.map(a=>({...a,fullPath:Vn(e,a.fileName)}));return s.every(a=>a.fileName&&$(a.fullPath))?s:null}async function Fu(e,t){let r=_(e),o=await Gt(e.paths.fileFull),n=io({baseName:t.baseName,duration:o,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds}),s=[];r.session.ensureDir("_parts");for(let i of n){let a=Vn(e,i.fileName);await Qr({inputPath:e.paths.fileFull,outputPath:a,start:i.start,duration:i.duration,channels:rt.channels,sampleRate:rt.sampleRate,codec:rt.codec,bitrate:rt.bitrate});let u=oo(a);if(u>t.maxUploadBytes&&(await Qr({inputPath:e.paths.fileFull,outputPath:a,start:i.start,duration:i.duration,channels:1,sampleRate:16e3,codec:"aac",bitrate:"48k"}),u=oo(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 Au(e,t){_(e).session.ensureDir("_parts");let o=Tu(e,t.manifestFileName);return o?o.map(n=>({...n,sizeBytes:n.sizeBytes??oo(n.fullPath)})):Fu(e,t)}function zn(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 ku(e){return e.map(t=>t.text).filter(Boolean).join(`
15
- `)}function _u(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 Eu(e){return new Promise(t=>setTimeout(t,e))}async function Wn(e,t,r){let o=-1,n=0;for(;n<t;){let s=Ht(e);s>0&&s===o?n+=1:(n=0,o=s),n<t&&await Eu(r)}return o}function Lu(e){return $(e)?M(e):tt.readFileSync(e)}async function Nu(e,t,r){let o=Ht(e);if(o<=r)return{uploadPath:e,cleanup:()=>{},originalSizeBytes:o,uploadSizeBytes:o,compressed:!1};let n=tt.mkdtempSync(Ae.join(yu.tmpdir(),"tim-transcribe-audio-")),s=Ae.join(n,`${t}.transcribe.mp3`);await Jn({inputPath:e,outputPath:s,channels:1,sampleRate:16e3,bitrate:"24k"});let i=tt.statSync(s).size;if(i>r)throw tt.rmSync(n,{recursive:!0,force:!0}),new Error(`${t}.transcribe.mp3 is still larger than max upload size after compression.`);return{uploadPath:s,cleanup:()=>tt.rmSync(n,{recursive:!0,force:!0}),originalSizeBytes:o,uploadSizeBytes:i,compressed:!0}}async function Ou(e,t){let{fileName:r}=e,o=_(e),n=Yt(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,c={},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,...c}))};try{o.session.addToLog(`Starting ${t.mode} transcription`,{data:{mode:t.mode,model:t.model}}),a("preparing-parts",{},!0);let u=t.waitForStableFile?await Wn(e.paths.fileFull,t.stableFileSamples,t.stableFileIntervalMs):Ht(e.paths.fileFull),c=await Au(e,{baseName:n.baseName,manifestFileName:n.manifestFileName,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,maxUploadBytes:t.maxUploadBytes}),d=Array.from({length:c.length},()=>""),f=c.map(v=>({index:v.index,fileName:v.fileName,status:"pending"})),m=fu(t.parallelLimit),h=()=>{let v=zn(d);v&&o.session.write(n.partialTextFileName,`${v}
16
- `)};a("transcribing",{stableSizeBytes:u,totalParts:c.length,completedParts:0,parts:f},!0);let y=await Promise.all(c.map(v=>m(async()=>{let T=f[v.index];T.status="transcribing",a("transcribing",{totalParts:c.length,parts:f});let L=Cu(v.fileName);try{if(o.session.exists(L)){let Ie=o.session.read(L),mt=String(Ie.text||"");return d[v.index]=mt,T.status="done",h(),{...v,status:"skip",text:mt,usage:Ie.usage,cost:Ie.cost}}let R=M(v.fullPath),G=t.provider!=="openai"?await Pn({provider:t.provider,model:t.model,audio:R,fileName:v.fileName,prompt:t.prompt,language:t.language,providerOptions:t.providerOptions}):await En(R,v.fileName,{model:t.model,prompt:t.prompt,language:t.language},Ie=>{d[v.index]=Ie.text||d[v.index],h(),a("transcribing",{totalParts:c.length,parts:f,latestPartIndex:v.index,latestTextLength:d[v.index].length})});d[v.index]=G.text||d[v.index],T.status="done";let Ee={...v,status:"done",text:d[v.index],usage:G.usage,cost:G.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:Ee.text,usage:Ee.usage,cost:Ee.cost}),h(),Ee}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}/${c.length} audio part(s) for ${r}`);throw a("error",{totalParts:c.length,completedParts:y.length-I.length,failedParts:I,parts:f},!0),v}let A=zn(y.map(v=>v.text)),w=_u(y),C=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:C-s,usage:y.map(v=>v.usage),cost:w}),a("done",{totalParts:c.length,completedParts:y.length,textLength:A.length,cost:w,parts:f},!0),o.session.addToLog(`Wrote ${n.finalJsonFileName}`,{duration:C-s,data:{outputFileName:n.finalJsonFileName}})}catch(u){throw a("error",{error:u?.message||"Unknown error"},!0),u}}async function Ru(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),s=Yt(r),i=Date.now(),a=()=>{},u=0,c=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??c;return m||h-u>=t.progressWriteIntervalMs||y>=c+10?(u=h,c=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 Wn(o.fileFull,t.stableFileSamples,t.stableFileIntervalMs):Ht(o.fileFull),m=await Nu(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=Lu(m.uploadPath),y=await Ln(h,Ae.basename(m.uploadPath),{model:t.model,prompt:t.prompt,language:t.language},A=>{let w=A.segments.length,C=A.segments[w-1],v=A.text?.length||0;d({segmentCount:w,textLength:v,latestSegment:C,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||ku(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:Ae.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 $u(e){let{fileName:t,paths:r}=e;if(r.file.includes("/_parts/")||!Gn.test(t))return;let o=so(e);if(o.mode==="diarized"){await Ru(e,o);return}await Ou(e,o)}function Du(e){return qr(e.settings,"transcription")?D(e.settings,"transcription").map(t=>({...e,fileName:U(e.fileName.slice(0,e.fileName.length-Ae.extname(e.fileName).length),t.suffix)+Ae.extname(e.fileName),settings:t.settings})):[e]}async function ke(e){let t=Du(e),r=await Promise.allSettled(t.map(n=>$u(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 ju(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 Kn(e){return`${e.toFixed(e>=10?1:2)}s`}function Z(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 ${Kn(e.mediaDurationSeconds)}`),typeof e.durationMs=="number"&&t.push(`generated ${Kn(e.durationMs/1e3)}`);let o=ju(e.cost);return o!==void 0&&t.push(`$${o.toFixed(o<.01?4:2)}`),t.join(" \xB7 ")}var Yn=e=>({provider:"openai",model:e.fileContent?.model,outputFormat:"conversation JSON"});function Mu(e){return Buffer.byteLength(typeof e=="string"?e:JSON.stringify(e??""))}var Xt=async e=>{let{fileName:t,fileContent:r,isDebug:o}=e,n=_(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:c}=r,d=Date.now(),f=await Gr({prompt:a,model:c}),m=Date.now()-d,{conversationId:h=""}=f;n.session.write(s,f.output);let y={provider:"openai",model:c,cost:f.cost,duration:m/1e3,generationTimeMs:m,sourceFileName:t,outputFileName:s,conversationId:h,outputSizeBytes:Mu(f.output)};return n.session.write(i,y),n.session.addToLog(Z({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 ao={name:"ai-convo",run:Xt,lifecycle:{start:Yn}};var Hn=e=>{let t=et(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}},Zt=async e=>{let{fileName:t,fileContent:r,paths:o,settings:n}=e,s=_(e);try{s.session.addToLog("Generating image");let i=t.replace(/\.image\.json$/i,""),a=r,u=Wr(a,n),c=`${i}.${u}`,d=c.replace(/\.[^.]+$/,".meta.json"),f=`${o.sessionFull}/${c}`,m=Date.now(),h=await Kr(a,f,n),y=Date.now()-m,I=await Hr(f),A=M(f).byteLength,w=I.width||0,C=I.height||0,v=h.provider||Qe(a,n),T=h.model||a.model||n.imageModel,L=h.usage||{},R=uo(et(a,n)),G={provider:v,model:T,usage:L,tokenUsage:L,cost:h.cost||ce,duration:y/1e3,generationTimeMs:y,modelParams:{...R,provider:v,model:T,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:w,height:C,outputSizeBytes:A,ratio:w&&C?w/C:0};return s.session.write(d,G),s.session.addToLog(Z({outputFileName:c,provider:v,model:T,cost:G.cost,durationMs:y,width:w,height:C}),{type:"output",duration:y,data:G}),{logData:G}}catch(i){throw i}};function uo(e){return Array.isArray(e)?e.map(uo):!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]":uo(r)]))}var po={name:"ai-image",run:Zt,lifecycle:{start:Hn}};function Xn(e){return!!(e&&typeof e=="object"&&Object.keys(e).length>0)}function Ju(e){return Buffer.byteLength(typeof e=="string"?e:JSON.stringify(e??""))}var Zn=e=>{let t=e.fileContent||{};return{provider:t.provider,model:t.model,outputFormat:Xn(t.schema)?"structured JSON":"Markdown"}},Qt=async e=>{let{fileName:t,fileContent:r,isDebug:o}=e,n=_(e);try{n.session.addToLog("Generating text response");let{prompt:s,schema:i,provider:a,model:u,providerOptions:c}=r,d=t.replace(".llm.json",Xn(i)?".out.json":".out.md"),f=t.replace(".llm.json",".meta.json"),m=Date.now(),h=await Br({provider:a,prompt:s,schema:i,model:u,providerOptions:c}),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:Ju(h.output)};return n.session.write(f,I),n.session.addToLog(Z({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 co={name:"ai-llm",run:Qt,lifecycle:{start:Zn}};var Qn=e=>{let t=e.fileContent||{};return{provider:t.provider,model:t.model,voiceId:t.voiceId,languageCode:t.languageCode,outputFormat:t.outputFormat,speed:t.speed}},er=async e=>{let{fileName:t,fileContent:r,isDebug:o}=e,n=_(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:c,model:d,languageCode:f,outputFormat:m,providerOptions:h,speed:y,instructions:I}=r,A=Date.now(),w=await to(a,u,o,{provider:c,modelId:d,languageCode:f,outputFormat:m,providerOptions:h,speed:y,instructions:I}),C=Date.now()-A;n.session.write(s,w.buffer);let v=0;try{v=await eo(`${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:w.provider,model:w.model||d,voiceId:w.voiceId||u,outputFormat:w.outputFormat||m,mediaType:w.mediaType,duration:Number(v.toFixed(2)),mediaDurationSeconds:Number(v.toFixed(2)),cost:Number(Xr(v).toFixed(4)),sourceFileName:t,outputFileName:s,warnings:w.warnings||[],providerMetadata:w.providerMetadata||{},generationTimeMs:C,outputSizeBytes:w.buffer.byteLength};return n.session.write(i,T),n.session.addToLog(Z({outputFileName:s,provider:T.provider,model:T.model,cost:T.cost,durationMs:C,mediaDurationSeconds:T.duration}),{type:"output",duration:C,data:T}),{logData:T}}catch(s){throw s}};var mo={name:"ai-tts",run:er,lifecycle:{start:Qn}};import es from"path";import{parse as Bu}from"yaml";var ts=e=>{let t=rs(String(e.fileContent?.text||"")),o=D(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 zu(e){return e.replace(/\.video\.json$/i,"").replace(/\.prompt\.(?:md|txt)$/i,"")}var qu=["provider","model","aspectRatio","resolution","duration","fps","seed","reference","referenceImagePath","providerOptions"];function lo(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function rs(e){let t=e.match(/^\uFEFF?---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)([\s\S]*)$/),r=t?Bu(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:{},s=Object.fromEntries(qu.flatMap(i=>{let a=n[i]??o[i];return a==null||a===""?[]:[[i,a]]}));return{...Gu(t?t[2]:e),overrides:s}}var Uu=/!?\[[^\]]*\]\(([^)]+\.(?:jpe?g|png|webp|gif|bmp|tiff?|heic|heif))\)|@((?:\.{0,2}\/)?[^\s,;:!?()[\]{}]+\.(?:jpe?g|png|webp|gif|bmp|tiff?|heic|heif))/gi;function Gu(e){let t=[],r=new Map;return{prompt:e.replace(Uu,(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 tr=async e=>{let t=_(e),r=rs(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=D(e.settings,"video"),s=[];for(let i of n){let a=`${U(zu(e.fileName),i.suffix)}.mp4`,u=a.replace(/\.mp4$/i,".meta.json"),c=es.join(e.paths.sessionFull,a),d={...e.fileContent,prompt:o,...i.output,...r.overrides,referenceImagePaths:r.referenceImagePaths},f=Date.now(),m=C=>{let v=typeof C.phase=="string"?C.phase:"progress";t.session.addToLog(`Video ${v}`,{data:{...C,elapsedSeconds:Number(((Date.now()-f)/1e3).toFixed(1)),outputFileName:a}})},h=qt(d,i.settings,e.paths.sessionFull),y=Ut(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(C=>es.basename(C)),outputFileName:a}});let I=await Yr({...d,onProgress:m},c,i.settings),A=Date.now()-f,w={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:M(c).byteLength};t.session.write(u,w),t.session.addToLog(Z({outputFileName:a,provider:w.provider,model:w.model,durationMs:A}),{type:"output",duration:A,data:w}),s.push(w)}return{logData:s.length===1?s[0]:{outputCount:s.length,outputs:s}}};var go={name:"ai-video",run:tr,lifecycle:{start:ts}};import os from"path";function Vu(e){return e.replace(/\.vision\.json$/i,"")}var ns=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 Wu(e){return e==="~"?process.env.HOME||e:e.replace(/^~(?=\/|\\)/,process.env.HOME||"~")}function Ku(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=Wu(r.trim());return os.isAbsolute(o)?o:os.resolve(e.paths.sessionFull,o)}var rr=async e=>{let t=_(e),r=e.fileContent||{},o=Ku(e),n=M(o),s=D(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=Vu(e.fileName);t.session.addToLog(`Processing ${s.length} vision output${s.length===1?"":"s"}`,{data:{outputCount:s.length}});let c=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`,w=Date.now();try{let C=await Mr({provider:m.provider,model:m.model,prompt:a,image:n,providerOptions:m.providerOptions,imageProviderOptions:m.imageProviderOptions}),v=`${C.output.trim()}
18
- `;t.session.write(I,v);let T=Date.now()-w,L={provider:C.provider||m.provider,model:C.model||m.model,sourceFileName:e.fileName,sourceImagePath:o,outputFileName:I,prompt:a,elapsedMs:T,usage:C.usage||{},cost:C.cost,providerMetadata:C.providerMetadata||{},warnings:C.warnings||[],outputSizeBytes:Buffer.byteLength(v)};return t.session.write(A,L),t.session.addToLog(Z({outputFileName:I,provider:L.provider,model:L.model,cost:L.cost,durationMs:T}),{type:"output",duration:T,data:L}),L}catch(C){throw t.session.write(`${u}.${y}.error.json`,{provider:m.provider,model:m.model,sourceFileName:e.fileName,sourceImagePath:o,prompt:a,elapsedMs:Date.now()-w,error:C instanceof Error?C.message:String(C)}),C}})),d=c.filter(m=>m.status==="rejected");if(d.length)throw new Error(`${d.length}/${c.length} configured vision outputs failed`);let f=c.flatMap(m=>m.status==="fulfilled"?[m.value]:[]);return{logData:f.length===1?f[0]:{outputCount:f.length,outputs:f}}};var fo={name:"ai-vision",run:rr,lifecycle:{start:ns}};import W from"node:path";var ss="analyze-transcript";function is(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 Yu(e){return e.replace(/\.transcript\.(json|md|txt)$/i,"").replace(/\.(json|ya?ml|mp3|m4a|txt|md)$/i,"")}function Hu(e){let t=e.settings?.analysisOutputDir||e.settings?.lecturesDir;if(!t||t==="."||t==="./")return e.paths.sessionFull;let r=Xu(t);return W.isAbsolute(r)?r:W.resolve(e.paths.rootFull,r)}function Xu(e){return e==="~"?process.env.HOME||e:e.replace(/^~(?=\/|\\)/,process.env.HOME||"~")}function as(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 Zu(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=as(t);return r||JSON.stringify(t||{},null,2)}function Qu(e){let t=Yu(e.fileName),r={...ae(W.join(e.paths.sessionFull,`_youtube.${t}.json`)),...ae(W.join(e.paths.sessionFull,"_youtube",`${t}.json`)),...ae(W.join(e.paths.sessionFull,"_youtube",`_youtube.${t}.json`))},n={...{...ae(W.join(e.paths.sessionFull,`_captions.${t}.meta.json`)),...ae(W.join(e.paths.sessionFull,"_captions",`${t}.meta.json`)),...ae(W.join(e.paths.sessionFull,"_captions",`_captions.${t}.meta.json`)),...ae(W.join(e.paths.sessionFull,"_meta",`${t}.meta.json`)),...ae(W.join(e.paths.sessionFull,"_meta",`_captions.${t}.meta.json`))},...r};return{url:n.url||e.fileContent?.url||"",flavour:e.settings?.analysisPromptId||n.flavour||e.fileContent?.flavour||e.settings?.flavour||ss,title:n.title||e.fileContent?.title||t,descriptorFileName:n.sourceFileName,sourceFileName:e.fileName,audioFileName:e.fileContent?.sourceFileName||n.audioFileName}}function ep(e,t,r){let o=ne(re()),n=e.settings?.analysisPromptId||e.settings?.textAnalysisPromptId||r.flavour||ss,s={...e.settings,...e.params,analysisText:t,text:t,transcriptText:t,transcript:e.fileContent,transcriptSegments:as(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 tp(e,t){let r=is(e),o=String(t||"").replace(/^\.+|\.+$/g,"");return o?`${r}.${o}.md`:`${r}.md`}var or=async e=>{let t=_(e),r=Date.now(),o=is(e.fileName),n=W.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=Zu(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=Qu(e),{prompt:u,promptId:c}=ep(e,i,a),d=X(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:c,model:f,promptLength:u.length,textLength:i.length});let m=await zr({provider:d.provider,model:f,prompt:u,providerOptions:d.providerOptions}),h=Hu(e);Ve(h);let y=tp(e.fileName,e.settings?.analysisOutputSuffix),I=W.join(h,y),A=W.relative(h,e.paths.fileFull),w=[`# ${a.title||o}`,"",`- Source: ${a.url?`[${a.url}](${a.url})`:e.fileName}`,`- Input: [${e.fileName}](${A})`,`- Prompt: ${c}`,""].join(`
20
- `);Ar(I,`${w}${m.output.trim()}
21
- `);let C=y.replace(/\.md$/i,".meta.json");t.session.write(C,{source:a,inputFileName:e.fileName,inputPath:e.paths.fileFull,outputFileName:y,promptId:c,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:c,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 yo={name:"analyze-text",run:or};function de(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function be(e,t){let r=e.settings?.[t];return de(r)?r:{}}function Me(e,t,r){return be(e,t)[r]}function nr(e,t,r,o){let n=Me(e,t,r);return typeof n=="string"?n:o}function sr(e,t,r,o){let n=Number(Me(e,t,r)??o);return Number.isFinite(n)?n:o}function ot(e,t,r,o){let n=Me(e,t,r);return Array.isArray(n)?n.filter(s=>typeof s=="string"):o}function us(e,t,r,o){let n=Me(e,t,r);return typeof n=="boolean"?n:o}import ir from"node:path";var ps=["inputOutputPair","promptId","sameName"];function rp(e,t,r="promptId"){let o=Me(e,t,"outputNamingConvention");if(typeof o=="string"){if(ps.includes(o))return o;throw new Error(`${t}.outputNamingConvention must be one of: ${ps.join(", ")}.`)}return r}function ar(e,t){let r=nr(e,t,"promptId");if(r?.trim())return r.trim();throw new Error(`${t} requires settings.${t}.promptId.`)}function Q(e,t,r,o="promptId"){let n=rp(e,t,o);if(n==="sameName")return ir.basename(e.fileName,ir.extname(e.fileName));if(n==="inputOutputPair"){let s=op(e.fileName);return s?`${r}.${s}`:r}return r}function op(e){let r=ir.basename(e,ir.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 nt="req-edit-image";function np(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 ur=async e=>{let t=_(e),r=String(e.fileContent?.text||"").trim();if(t.session.addToLog("Preparing image edit request"),r.length<sr(e,nt,"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=nr(e,nt,"fixSourceExtension","jpg"),n=e.fileName.replace(/\.fix\.txt$/i,""),s=Q(e,nt,nt,"sameName"),i=D(e.settings,"image");for(let a of i){let u=U(s,a.suffix),c={...a.output,prompt:np(r),referenceImagePaths:[`./${n}.${o}`],referenceTypes:ot(e,nt,"fixReferenceTypes",["composition","scenario","style","character"])};t.session.writeImageRequest(u,c)}};var ho={name:"req-edit-image",run:ur};import sp from"node:path";var cs="req-image-to-text";function ip(e){return e.slice(0,e.length-sp.extname(e).length)}function ap(e){let t=be(e,cs);return de(t.request)?t.request:{}}var pr=async e=>{let t=_(e);t.session.addToLog("Prepared image-to-text request");let r=Q(e,cs,ip(e.fileName),"sameName"),o={...ap(e),imagePath:`./${e.fileName}`};t.session.writeVisionRequest(r,o)};var bo={name:"req-image-to-text",run:pr};var st="req-image-to-image";function up(e){if(!us(e,st,"sourceImageAsReference",!0))return{};let t=e.fileName.split(".").pop()?.toLowerCase()||"";return ot(e,st,"sourceImageExtensions",["jpg","jpeg","png","webp"]).map(o=>o.replace(/^\./,"").toLowerCase()).includes(t)?{referenceImagePaths:[`./${e.fileName}`],referenceTypes:ot(e,st,"sourceImageReferenceTypes",["general"])}:{}}function pp(e,t){let n=ne(re()).resolvePrompts(e,{...e.settings,...e.params,fileContent:e.fileContent?.text})[t]?.promptTemplate;return typeof n=="string"?n.trim():""}var cr=async e=>{let t=_(e),r=ar(e,st),o=pp(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=Q(e,st,r,"inputOutputPair"),s=D(e.settings,"image");for(let i of s){let a=U(n,i.suffix),u={...i.output,prompt:o,...up(e)};t.session.writeImageRequest(a,u)}};var vo={name:"req-image-to-image",run:cr};var mr="req-text-to-image";function cp(e){let t=be(e,mr);return de(t.request)?t.request:{}}var lr=async e=>{let t=_(e),r=String(e.fileContent?.text||"").trim();if(t.session.addToLog("Preparing text-to-image request"),r.length<sr(e,mr,"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=Q(e,mr,mr,"sameName"),n=D(e.settings,"image");for(let s of n){let i=U(o,s.suffix),a={...cp(e),...s.output,prompt:r};t.session.writeImageRequest(i,a)}};var Io={name:"req-text-to-image",run:lr};var it="req-text-to-speech";function mp(e){return String(e.fileContent?.text||"").trim()}function lp(e){return e.match(/^\s*([^:\n]{1,80}):\s+/)?.[1]?.trim()}function dp(e){let t=e.match(/line-[^.]*([A-Z])(?:\.[^.]+)?$/i);if(t?.[1])return t[1].toUpperCase().charCodeAt(0)-65}function gp(e,t){let r=be(e,it);if(typeof r.voiceId=="string"&&r.voiceId.trim())return r.voiceId.trim();let o=lp(t),n=de(r.characterVoices)?r.characterVoices:de(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 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 c=s.findIndex(f=>typeof f=="string"&&f.toLowerCase()===o.toLowerCase()),d=c>=0?i[c]:void 0;if(typeof d=="string"&&d.trim())return d.trim()}let a=dp(e.fileName),u=typeof a=="number"?i[a]:void 0;return typeof u=="string"&&u.trim()?u.trim():void 0}function fp(e){let t=be(e,it),r=de(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 dr=async e=>{let t=_(e),r=Fe(),o=mp(e);if(t.session.addToLog("Prepared text-to-speech request"),!o)throw new Error(`${it}: source text is required.`);let n=D(e.settings,"tts");for(let s of n){let i={...e,settings:s.settings},a=r.prepareTtsRequest(i,{...fp(i),text:o,voiceId:gp(i,o)}),u=Q(i,it,it,"sameName"),c=U(u,s.suffix);t.session.writeTtsRequest(c,a)}};var So={name:"req-text-to-speech",run:dr};var ms="req-text-to-text",gr=async e=>{let t=_(e),r=Fe(),o=ar(e,ms);t.session.addToLog(`Using prompt ${o}`,{data:{promptId:o}});let n=D(e.settings,"llm");for(let s of n){let i={...e,settings:s.settings},a=r.prepareTextToTextRequest(i,{promptId:o}),u=Q(i,ms,o),c=U(u,s.suffix);t.session.writeTextToTextRequest(c,a)}};var xo={name:"req-text-to-text",run:gr};import ve from"node:path";function yp(e){return e==="~"?process.env.HOME||e:e.replace(/^~(?=\/|\\)/,process.env.HOME||"~")}function hp(e){return e==="move"?"move":"copy"}function bp(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 vp(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 Ip(e){let t=vp(e),r=t.dir??t.outputDir??t.destinationDir??t.destination,o=typeof r=="string"&&r.trim()?r.trim():e.paths.sessionFull;return{dir:yp(o),mode:hp(t.mode),overwrite:bp(t.overwrite,!0)}}function Sp(e,t){let r=ve.isAbsolute(t.dir)?t.dir:ve.resolve(e.paths.rootFull,t.dir);return ve.join(r,e.fileName)}function xp(e){return`_placement.${e.replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase()||"output"}.json`}var fr=async e=>{let t=_(e),r=Ip(e),o=Sp(e,r),n=e.paths.fileFull,s=Date.now(),i=(a,u={})=>{kr(ve.join(e.paths.sessionFull,xp(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(ve.resolve(n)===ve.resolve(o)){i("skipped",{reason:"destination is source"}),t.session.addToLog("Destination is the source file",{type:"skip"});return}if($(o)&&!r.overwrite){i("skipped",{reason:"destination exists"}),t.session.addToLog("Destination already exists",{type:"skip",data:{destinationPath:o}});return}Ve(ve.dirname(o)),Fr(n,o),r.mode==="move"&&Tr(n),i("done"),t.session.addToLog(`Placed output at ${ve.basename(o)}`,{data:{destinationPath:o}})}catch(a){throw i("error",{error:a?.message||"Unknown error"}),a}};var wo={name:"place-output",run:fr};var Co={name:"transcribe-audio",run:ke};var ls=[ao,po,co,mo,go,fo,yo,wo,ho,vo,bo,Io,So,xo,Co];import rc from"node:fs";import{fileURLToPath as ks}from"node:url";import{homedir as Ps}from"os";import Eo from"path";import{homedir as xs}from"os";import wp from"node:path";function ds(e,t=[]){return He(e,"**/config.json",t).map(r=>wp.dirname(r)).filter((r,o,n)=>n.indexOf(r)===o).sort()}import Po from"lodash";import{minimatch as gs}from"minimatch";import me from"path";var Cp=!0;function Pp(e,t){if(!Cp)return t;let r=e.match(/request-(.*)\.json$/);if(r&&r[1])return r[1]}function Tp(e){let t=ie();return e.replace(t,"")}function Fp(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,c="none";if(a){let f=s?2:0;t[f+1]==="sessions"&&t[f+2]?(u=t[f+2],c="session"):c="machine"}let d=ie();if(n.test(e)&&d){let f=`${d}${e}`,m=To(f);m?.userId&&m?.machineId&&m?.id&&(s=m.userId,i=`/users/${s}`,a=m.machineId,u=Pp(e,m.id),c="session")}return{userId:s,userPath:i,machineId:a,sessionId:u,scope:c,isScoped:c!=="none"}}function To(e){try{return $(e)?Ct(e):{}}catch(t){return V(`Failed to read JSON from ${e}`,t,{filePath:e}),{}}}var fs=(e,t="create")=>{let r=ie(),o=Tp(e),n=Fp(o),s=me.basename(o),i=me.dirname(o),a={fileName:s,fileContent:{},fileVerb:t,...n,prompts:{},promptIds:[],paths:{},settings:{},params:{},session:{},isDebug:!1,global:Ye(void 0)},u={root:"/",rootFull:me.resolve(r),file:"",fileFull:"",user:"",userFull:"",machine:"",machineFull:"",state:"",stateFull:"",session:"",sessionFull:""};switch(u.file=o,u.fileFull=me.resolve(`${r}${o}`),u.session=i,u.sessionFull=me.resolve(`${r}${i}`),me.extname(o).toLowerCase()){case".json":a.fileContent=To(u.fileFull);break;case".md":case".txt":let h=$(u.fileFull)?We(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=me.resolve(`${r}${n.userPath}`)),u.machine=h,u.machineFull=me.resolve(`${r}${h}`),u.state=`${h}/state.json`,u.stateFull=me.resolve(`${r}${h}/state.json`),n.sessionId){a.sessionId=n.sessionId,u.session=`${h}/sessions/${n.sessionId}`,u.sessionFull=me.resolve(`${r}${h}/sessions/${n.sessionId}`);let y=`${u.sessionFull}/_session.json`,I=To(y);a.params=I.params||{},a.session=I||{},$(`${u.sessionFull}/_debug.md`)&&(a.isDebug=!0)}}a.paths=u;let f=ne(re()).resolveConfig(a);a.config=f,a.global=Ye(f.global);let m=(f.triggers??{})[t]||{};return a.settings=Ap(f.settings||{},s),a.params=Po.merge({},f.params||{},a.params||{}),a.ioBots=m,a.command=_p(m,o),a.promptIds=kp(a.settings),a.paths=u,a};function Ap(e,t){let r=Po.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,...c}=a;typeof u!="string"||!gs(t,u)||(i=Po.mergeWith({},i,c,(d,f)=>Array.isArray(f)?f:void 0))}r[o]=i}return r}function kp(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 _p(e,t){let r=[];for(let o in e){let n=o.includes("/")?o:`**/${o}`;gs(t,n)&&r.push(e[o])}return r}var Ep=[{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 Lp(e=process.env){return Ep.filter(({environmentVariables:t})=>t.some(r=>e[r]?.trim())).map(({provider:t})=>t)}function ys(e=process.env){return Lp(e).join(", ")||"none"}var Fo={};function Ao(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.");Fo[r]=o}}function hs(e){return Fo[e]?.run}function bs(e){return Fo[e]?.lifecycle}import vs from"path";function Np(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 Op(e,t,r){let{fileName:o}=r,n=vs.basename(o,vs.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 Is=async(e,t)=>{let{settings:r,fileContent:o}=t,{conversationId:n}=o??{};if(n)return;let s=Np(r),i=e.replace("convo-",""),a=_(t),u=Fe();a.session.addToLog(`Using conversation prompt ${i}`,{data:{promptId:i}});let c=u.prepareTextToTextRequest(t,{promptId:i}),d=Op(s,i,t);a.session.writeConvoRequest(d,c)};function Ss(e,t){let r=_(t),o=[...r.session.applyCleanupPolicy([e]),...r.session.applyCleanupManifests(t.fileName)];for(let n of o)H(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 Rp=e=>e.startsWith("convo-")?"convo":"main",$p=async(e,t)=>{let r=Rp(e),o=new Date().toISOString(),n=Date.now(),s=Dp(new Date(n)),i={...t,botName:e,operationId:s},a=bs(e),u={};try{u=a?.start?.(i)??{}}catch{}let c={botName:e,command:e,eventType:"operation",operationId:s,phase:"started",sourceFileName:t.fileName,sourceFilePath:t.paths?.file,startedAt:o,...u};H(i,{botName:e,kind:"bot-start",level:"info",message:`IO bot ${e} started`,operationId:s,data:c});let d=(m,h={})=>{let y=new Date().toISOString(),I=Date.now()-n;H(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:{...c,...h,durationMs:I,endedAt:y,phase:m}}),nn(i)},f=m=>{Ss(e,i),d("done",m?.logData?{result:m.logData}:{})};try{if(r==="convo"){await Is(e,i),f(void 0);return}if(r!=="main"){d("error",{error:`Command type not supported: ${r}`});return}let m=hs(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 Dp(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}-${gt()}`}var at=async(e,t)=>{let r=[];for(let o of e){let n;Array.isArray(o)?n=at(o,t):n=$p(o,t),r.push(n)}return Promise.all(r)};var ko=new Map,jp=new Set(["_analysis","_cleanup","_done","_meta","_parts","_partial","_prompts","_temp","_transcript"]),Mp=["_partial.","_transcribing.","_transcript."],Jp=(e,t)=>e.split(/[\\/]+/).some(r=>jp.has(r))||Mp.some(r=>t.startsWith(r));function Bp(e){return`${e.charAt(0).toUpperCase()}${e.slice(1)}`}function zp(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 qp(e,t){let r=e.config?.triggers;if(!r||typeof r!="object")return 0;let o=r[`delay${Bp(t)}`];return zp(o??r.delay)}function Je(e){return(Array.isArray(e.command)?e.command:[e.command]).filter(r=>typeof r=="string"&&r.length>0)}var Up=e=>e.some(t=>t.startsWith("ai-"));function Gp(e){return Jp(e.paths.file,e.fileName)||e.fileName.endsWith("log.txt")}function Vp(e,t){for(let r of Je(e))H(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 Wp(e){for(let t of Je(e))H(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(Gp(e))return Promise.resolve();H(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=Up(o)?0:qp(e,t);if(n<=0)return r(e);let s=`${e.paths.sessionFull}:${t}`,i=ko.get(s);return i&&(clearTimeout(i.timer),Wp(i.context),i.resolve()),new Promise((a,u)=>{Vp(e,n);let c=setTimeout(()=>{ko.delete(s),r(e).then(a,u)},n);ko.set(s,{context:e,timer:c,resolve:a})})}var Kp=async e=>{await at(Je(e),e)},Yp=async e=>{await at(Je(e),e)},Hp=async e=>{},Xp=async e=>{await at(Je(e),e)},Zp=e=>_o(e,"create",Kp),Qp=e=>_o(e,"update",Yp),ec=e=>_o(e,"delete",Xp),yr={bootstrap:Hp,create:Zp,update:Qp,delete:ec};var ws=["_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 Cs(e){let t=e.cwd,r=e.version||"unknown",o=t.startsWith(xs())?t.replace(xs(),"~"):t,n=ds(t,ws);if(!n.length)throw new Error(`No config.json files found recursively under ${o}. Add config.json to each directory TIM should watch.`);Jo(t);let s=Ho(),i=ys();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}}),Or({cwd:t,watchPaths:n,depth:0,target:"**/*",ignore:ws,createContext:fs,silent:!0,callbacks:{onAdd:yr.create,onChange:yr.update,onUnlink:yr.delete},ignoreLogs:!0})}function Lo(e,t=process.cwd()){if(!e)return Eo.resolve(t);let r=e==="~"?Ps():e.startsWith("~/")?Eo.join(Ps(),e.slice(2)):e;return Eo.resolve(t,r)}function Ts(e={}){return Ao(e.bots),Oe(e.galleries),Cs({cwd:Lo(e.cwd),version:e.version})}var Fs={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 As=ks(new URL("./prompts/character-sheets",import.meta.url)),oc=ks(new URL("../src/character-sheets/_prompts",import.meta.url)),nc=rc.existsSync(As)?As:oc,_s={name:"g-character-sheets",aliases:["character-sheets"],config:Fs},No=[_s],Es=[{gallery:_s.name,from:nc}];Oe(No);import{spawn as sc}from"node:child_process";import ee from"node:fs";import Ls from"node:os";import j from"node:path";function ic(e){return e.split(/\r?\n/).map(t=>t.trim()).filter(t=>t&&!t.startsWith("#")).reduce((t,r)=>{let o=r.indexOf(":");if(o===-1)return t;let n=r.slice(0,o).trim(),s=r.slice(o+1).trim().replace(/^['"]|['"]$/g,"");return t[n]=s,t},{})}function ac(e){return e.fileName.endsWith(".json")?e.fileContent:ic(We(e.paths.fileFull))}function Ns(e){return new Promise((t,r)=>{let o=sc("yt-dlp",e,{stdio:["ignore","pipe","pipe"]}),n="",s="";o.stdout.on("data",i=>{n+=i.toString()}),o.stderr.on("data",i=>{s+=i.toString()}),o.on("error",r),o.on("close",i=>{if(i===0){t({stdout:n,stderr:s});return}r(new Error(`yt-dlp exited with code ${i}: ${s||n}`))})})}function uc(e,t){return Ns(["--no-playlist","-x","--audio-format","mp3","--audio-quality","0","--print","after_move:filepath","-o",t,e])}function pc(e,t,r){return Ns(["--no-playlist","--skip-download","--write-subs","--write-auto-subs","--sub-langs",r,"--sub-format","vtt/srt/best","-o",t,e])}function cc(e){return e.split(/\r?\n/).map(t=>t.trim()).filter(Boolean).find(t=>t.endsWith(".mp3"))}function mc(e){return ee.readdirSync(e).find(r=>r.endsWith(".mp3"))}function lc(e){return e.split(j.sep).some(t=>t==="_captions"||t==="_youtube"||t==="_analysis")}function dc(e){let t=new Set,r=[];for(let o of e.split(/\r?\n/)){let n=o.trim();if(!n||n==="WEBVTT"||n.startsWith("Kind:")||n.startsWith("Language:")||/^\d+$/.test(n)||n.includes("-->"))continue;let s=n.replace(/<[^>]+>/g,"").replace(/\s+/g," ").trim();!s||t.has(s)||(t.add(s),r.push(s))}return`${r.join(`
23
- `)}
24
- `}async function gc(e,t,r){if(!t.url)return;let o=_(e),n=j.join(e.paths.sessionFull,"_captions"),s=ee.mkdtempSync(j.join(Ls.tmpdir(),"tim-youtube-captions-")),i=e.settings?.captionLanguages||"en.*,en";try{o.session.ensureDir("_captions");let a=await pc(t.url,j.join(s,`${r}.%(ext)s`),i),u=ee.readdirSync(s).filter(h=>/\.(vtt|srt)$/i.test(h)).sort();if(!u.length){o.session.write(j.join("_captions",`_captions.${r}.meta.json`),{...t,sourceFileName:e.fileName,url:t.url,subLanguages:i,captionFiles:[],stdout:a.stdout.trim(),stderr:a.stderr.trim(),updatedAt:Date.now()});return}for(let h of u)ee.copyFileSync(j.join(s,h),j.join(n,h));let c=u[0],d=dc(ee.readFileSync(j.join(s,c),"utf-8")),f=`${r}.transcript.md`;o.session.write(j.join("_captions",`_captions.${r}.meta.json`),{...t,sourceFileName:e.fileName,url:t.url,subLanguages:i,captionFiles:u,transcriptFileName:f,transcriptSourceFile:c,stdout:a.stdout.trim(),stderr:a.stderr.trim(),updatedAt:Date.now()});let m=j.join(e.paths.sessionFull,`_${f}.download`);ee.writeFileSync(m,d,{encoding:"utf-8"}),ee.renameSync(m,j.join(e.paths.sessionFull,f))}catch(a){o.session.ensureDir("_captions"),o.session.write(j.join("_captions",`_captions.${r}.error.json`),{sourceFileName:e.fileName,url:t.url,subLanguages:i,error:a?.message||"Unknown error",updatedAt:Date.now()})}finally{ee.rmSync(s,{recursive:!0,force:!0})}}var hr=async e=>{let{fileName:t,paths:r}=e,o=_(e);try{if(o.session.addToLog("Preparing YouTube audio download"),lc(r.fileFull)){o.session.addToLog("Source is an intermediate path",{type:"skip",data:{reason:"intermediate path"}});return}let n=ac(e);if(!n.url){o.session.addToLog("Descriptor has no URL",{type:"skip",data:{reason:"missing url"}});return}let s=t.replace(/\.(json|ya?ml)$/i,""),i=`${s}.mp3`,a=j.join(r.sessionFull,i);if(await gc(e,n,s),$(a)){o.session.addToLog(`${i} already exists`,{type:"skip"});return}let u=ee.mkdtempSync(j.join(Ls.tmpdir(),"tim-youtube-audio-")),c=Date.now();try{let d=await uc(n.url,j.join(u,`${s}.%(ext)s`)),f=cc(d.stdout),m=f?j.basename(f):mc(u);if(!m)throw new Error(`yt-dlp completed but no mp3 was found in ${u}`);let h=j.join(u,m),y=j.join(r.sessionFull,`_${i}.download`);ee.copyFileSync(h,y),ee.renameSync(y,a);let I=Date.now()-c;o.session.ensureDir("_youtube"),o.session.write(j.join("_youtube",`_youtube.${s}.json`),{...n,sourceFileName:t,audioFileName:i,downloader:"yt-dlp",durationMs:I,stdout:d.stdout.trim(),stderr:d.stderr.trim()}),o.session.addToLog(`Downloaded ${i}`,{duration:I,data:{durationMs:I,outputFileName:i}})}finally{ee.rmSync(u,{recursive:!0,force:!0})}}catch(n){throw n}};var Oo={name:"download-youtube-audio",run:hr};var Os=[Oo];var br={name:"@tim-fs/cli",publishConfig:{access:"public"},version:"0.1.2",type:"module",description:"A filesystem event bus for explicit, inspectable automation",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:^","@tim-fs/io-youtube":"workspace:^","@types/node":"^20.19.25",esbuild:"^0.27.2",nodemon:"^3.1.7",typescript:"^5.9.3"}};import{config as xc}from"dotenv";import Be from"node:fs";import yc from"node:os";import vr from"node:path";import{parse as hc}from"dotenv";var ut=[{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 bc(e=process.env){return e.TIM_HOME||vr.join(yc.homedir(),".tim")}function ze(e=process.env){return e.TIM_ENV_FILE||vr.join(bc(e),".env")}function vc(e){return Be.existsSync(e)?hc(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 Rs(e={}){let t=e.environment||process.env,r=e.destination||ze(t),o=vc(r);return Object.fromEntries(ut.map(n=>[n.name,Ic(n,o,t)]))}function $s(e,t=ze()){let r=["# TIM provider credentials","# Run `npx @tim-fs/cli init` again to update this file.","",...ut.map(o=>`${o.name}=${Sc(e[o.name]||"")}`),""];Be.mkdirSync(vr.dirname(t),{recursive:!0,mode:448}),Be.chmodSync(vr.dirname(t),448),Be.writeFileSync(t,r.join(`
25
- `),{encoding:"utf8",mode:384}),Be.chmodSync(t,384)}xc({path:ze(),quiet:!0});import{emitKeypressEvents as wc}from"node:readline";import K from"kleur";var Cc=["\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"],Pc=e=>K.enabled?`\x1B[38;5;208m${e}\x1B[39m`:e;function Ds(e){let t=Cc.map((r,o)=>o<3?K.cyan(r):Pc(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.3",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(`
26
24
  ${t.join(`
27
- `)}`),console.log(`${K.bold("TIM-FS")} ${K.dim(`v${e}`)} ${K.dim("\xB7")} Filesystem automation, made friendly.
28
- `),console.log(`${K.green("\u25CF")} Provider keys are saved locally in ${K.cyan("~/.tim/.env")}
29
- `)}async function js(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 c=[K.bold("Which providers would you like to configure?"),K.dim("Use \u2191/\u2193 to move, Space to select, and Enter to continue."),"",...e.map((d,f)=>{let m=f===s?K.cyan("\u276F"):" ",h=n.has(d.name)?K.green("\u25C9"):K.dim("\u25CB"),y=t.has(d.name)?K.dim(" (configured)"):"";return`${m} ${h} ${d.label}${y}`})];o.write(`${c.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(`
30
28
  `)}
31
- `),i=c.length};return new Promise((c,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(`
32
- `),c(e.filter(I=>n.has(I.name))))};wc(r),r.setRawMode(!0),r.resume(),r.on("keypress",m),o.write("\x1B[?25l"),u()})}import pt from"node:fs";import qe from"node:path";function Ms(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 Tc(e){let t=qe.parse(qe.basename(e)).name;return t.includes(".")&&(t=t.split(".").pop()),t}function Js(e,t,r){let o=pt.readdirSync(e).find(i=>i.endsWith(".md")&&Tc(i)===r);if(!o)throw new Error(`Prompt "${r}" was not found in ${e}. Run "tim init" first.`);pt.mkdirSync(t,{recursive:!0}),pt.copyFileSync(qe.join(e,o),qe.join(t,o));let n=o.replace(/\.md$/,".schema.json"),s=qe.join(e,n);pt.existsSync(s)&&pt.copyFileSync(s,qe.join(t,n))}var ct=new kc,Ir=process.cwd(),Ro=class extends Ac{muted=!1;_write(t,r,o){this.muted||process.stdout.write(t),o()}};async function _c(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
33
32
  `:`
34
- `),o.trim()}ct.name("tim").description("Run filesystem-driven IO bots from configured directories.").version(br.version);ct.command("init").description("Configure provider keys and install bundled prompts in ~/.tim.").option("--non-interactive","create the env file without prompting").action(async e=>{Ds(br.version);let t=ze(),r=Rs({destination:t});if(!e.nonInteractive&&process.stdin.isTTY&&process.stdout.isTTY){let s=new Set(ut.filter(c=>!!r[c.name]).map(c=>c.name)),i=await js(ut,s),a=new Ro,u=Fc.createInterface({input:process.stdin,output:a,terminal:!0});try{i.length===0&&console.log(`No providers selected. Skipping provider key setup.
35
- `);for(let c of i){let d=!!r[c.name],f=await _c(u,a,`${c.label}${d?" (press Enter to keep current key)":""}: `);f&&(r[c.name]=f)}}finally{a.muted=!1,u.close()}}$s(r,t);let o=Object.values(r).filter(Boolean).length;console.log(`Saved ${o} provider key(s) to ${t}`);let n=ye();_e.mkdirSync(n,{recursive:!0});for(let s of Es){if(!_e.existsSync(s.from))throw new Error(`Gallery prompt source not found: ${s.from}`);_e.cpSync(s.from,n,{recursive:!0,force:!0}),console.log(`Installed ${s.gallery} prompts to ${n}`)}});ct.command("eject").description("Expand gallery convenience config and copy referenced prompts into ./_prompts.").action(()=>{let e=Bs.join(Ir,"config.json");if(!_e.existsSync(e))throw new Error(`No config.json found in ${Ir}`);let t=JSON.parse(_e.readFileSync(e,"utf-8")),r=Pe(t),o=Ms(r.settings||{}),n=ye();if(o.length>0&&!_e.existsSync(n))throw new Error(`TIM prompts were not found at ${n}. Run "tim init" first.`);if(_e.writeFileSync(e,`${JSON.stringify(r,null,2)}
36
- `),o.length>0){let s=Bs.join(Ir,"_prompts");for(let i of o)Js(n,s,i);console.log(`Copied ${o.length} prompt(s) to ${s}`)}console.log(`Expanded gallery config at ${e}`)});ct.command("start [directory]").description("Watch configured directories in the foreground.").action(async e=>{await Ts({cwd:Lo(e,Ir),bots:[...ls,...Os],galleries:No,version:br.version})});ct.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
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@tim-fs/cli",
3
3
  "publishConfig": {
4
- "access": "public"
4
+ "access": "public",
5
+ "tag": "alpha"
5
6
  },
6
- "version": "0.1.2",
7
+ "version": "0.1.3",
7
8
  "type": "module",
8
- "description": "A filesystem event bus for explicit, inspectable automation",
9
+ "description": "Turn ordinary folders into explicit, inspectable AI and code workflows that any person, agent, or program can invoke by writing a file",
9
10
  "bin": {
10
11
  "tim": "dist/index.js"
11
12
  },
@@ -75,7 +76,6 @@
75
76
  "@tim-fs/core": "workspace:^",
76
77
  "@tim-fs/io-core": "workspace:^",
77
78
  "@tim-fs/io-gallery": "workspace:^",
78
- "@tim-fs/io-youtube": "workspace:^",
79
79
  "@types/node": "^20.19.25",
80
80
  "esbuild": "^0.27.2",
81
81
  "nodemon": "^3.1.7",