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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +19 -3
  2. package/dist/index.js +26 -27
  3. package/package.json +4 -4
package/README.md CHANGED
@@ -3,24 +3,40 @@
3
3
  The public command-line package for [TIM/FS](https://github.com/dht/tim-fs), a filesystem event bus
4
4
  for explicit, inspectable automation.
5
5
 
6
+ TIM/FS is currently alpha software. Its configuration, bot API, and filesystem contracts may
7
+ change before `1.0`; breaking changes will be documented in release notes. Alpha releases are
8
+ published under npm's `alpha` tag rather than `latest`.
9
+
6
10
  ## Run with npx
7
11
 
8
12
  ```sh
9
- npx @tim-fs/cli init
10
- npx @tim-fs/cli start [directory]
13
+ npx @tim-fs/cli@alpha init
14
+ npx @tim-fs/cli@alpha start [directory]
11
15
  ```
12
16
 
13
17
  `init` stores optional provider credentials in `~/.tim/.env` and installs bundled prompts in
14
18
  `~/.tim/prompts`. `start` defaults to the current directory and stays in the foreground until you
15
19
  press `Ctrl-C`.
16
20
 
21
+ The watcher, configuration, and artifacts are local. Bots configured with network AI providers
22
+ send their inputs to those providers; “local-first” does not mean offline or local inference. See
23
+ the repository README for the current reliability, privacy, and platform limitations.
24
+
17
25
  ## Install globally
18
26
 
19
27
  ```sh
20
- npm install --global @tim-fs/cli
28
+ npm install --global @tim-fs/cli@alpha
21
29
  tim init
22
30
  tim start ~/workspace
23
31
  ```
24
32
 
33
+ Or run the Bash installer, which checks for Node.js 20+ and wraps the same global npm install:
34
+
35
+ ```sh
36
+ curl -fsSL https://raw.githubusercontent.com/dht/tim-fs/main/cli/install.sh | bash
37
+ ```
38
+
39
+ See [brew.md](brew.md) for a suggested Homebrew tap and formula.
40
+
25
41
  See the [repository README](https://github.com/dht/tim-fs#readme) for configuration, included bots,
26
42
  and source development.
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 Tc from"node:readline/promises";import{Writable as Fc}from"node:stream";import{Command as Ac}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()=>{}}},Dc=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)}
2
+ import Ae from"node:fs";import js from"node:path";import yp from"node:readline/promises";import{Writable as hp}from"node:stream";import{Command as bp}from"commander";import{minimatch as vt}from"minimatch";import x from"path";import Vs from"fs-extra";var Ws=Vs;function N(){return Ws}var Bo=()=>({existsSync:e=>N().existsSync(e),readdirSync:e=>N().readdirSync(e),readFileSync:((e,t)=>N().readFileSync(e,t)),readJsonSync:e=>N().readJsonSync(e)});var Ks=Symbol.for("tim-core.runtime-state"),Ys=globalThis,mt=Ys[Ks]??={logger:null,root:""},zo=e=>{mt.root=e},oe=()=>mt.root;var qo=e=>{mt.logger=e},Sr=()=>mt.logger;var Hs=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)});var lt=()=>Hs().substring(0,4);var Xs=["console"],Zs=(e,t,r,o)=>typeof e=="string"?{message:e,level:t,source:r,data:o}:{...e,level:e.level??t,source:e.source??r,data:e.data??o},Uo=(e={})=>{let t=e.transports?.length?e.transports:Xs,r=!1,o=async(p,d)=>{let f=Zs(p,"info",e.source,d),m=f.level??"info",h={...f,level:m},y=[];t.includes("console")&&(m==="error"?console.error:m==="warn"?console.warn:console.log)(h),t.includes("custom")&&(e.addLog?y.push(Promise.resolve(e.addLog(h))):r||(r=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))),y.length&&await Promise.all(y)};return{log:o,debug:async(p,d)=>o({message:p,level:"debug",data:d,source:e.source}),info:async(p,d)=>o({message:p,level:"info",data:d,source:e.source}),warn:async(p,d)=>o({message:p,level:"warn",data:d,source:e.source}),error:async(p,d)=>o({message:p,level:"error",data:d,source:e.source}),clearLogs:async()=>{}}},Fp=Uo();import P from"kleur";import*as ce from"node:fs/promises";import*as ft from"node:path";import*as Cr from"node:util";import{createLogger as ei,transports as Vo,format as ve}from"winston";import ti from"winston-transport";var Go={aspectRatio:"gray",bot:"pink",configuredDirectoriesCount:"yellow",cost:"pink",dimensions:"gray",duration:"yellow",file:"gray",format:"gray",message:"white",model:"gray",operation:"gray",outputCount:"gray",outputSize:"gray",promptId:"pink",promptLabel:"white",quality:"gray",systemProviders:"cyan",systemVersion:"cyan",tokens:"gray",voice:"gray",workingDirectory:"cyan"};function gt(e){if(e===void 0)return e;if(Array.isArray(e))return e.filter(r=>r!==void 0).map(r=>gt(r));if(e&&typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))o!==void 0&&(t[r]=gt(o));return t}return e}var ri=Symbol.for("message"),oi=e=>{if(!e||typeof e!="object")return;let t=e.logPath;return typeof t=="string"&&t.length?t:void 0},xr=class extends ti{defaultLogPath;ensuredDirs=new Set;lineFormat;constructor({defaultLogPath:t,format:r}){super(),this.defaultLogPath=t,this.lineFormat=r}log(t,r){setImmediate(()=>this.emit("logged",t));let o=oi(t.logEvent?.data)??this.defaultLogPath;if(!o){r();return}(async()=>{let s=ft.dirname(o);this.ensuredDirs.has(s)||(this.ensuredDirs.add(s),await ce.mkdir(s,{recursive:!0}).catch(()=>{}));let i=this.lineFormat.transform({...t},this.lineFormat.options??{}),a=i[ri]??i.message??"";await ce.appendFile(o,`${a}
3
+ `,"utf8")})().catch(s=>{let i=s instanceof Error?s.message:Cr.format("%o",s);console.warn("[tim-logger] Failed to write log file",{logPath:o,error:i})}).finally(r)}},ni=ve.combine(ve.timestamp({format:()=>new Date().toISOString()}),ve.printf(e=>{let t=e.logEvent??{},r=e.timestamp??new Date().toISOString(),o=String(t.source??"LOG"),n=String(t.message??e.message??""),s=Wo(t.data),i=s&&typeof s=="object"&&Object.keys(s).length?` | ${JSON.stringify(s)}`:"";return`[${r}] ${o.padStart(12)}: ${n}${i}`})),si=["console"],ii=(e,t,r,o)=>typeof e=="string"?{message:e,level:t,source:r,data:o}:{...e,level:e.level??t,source:e.source??r,data:e.data??o},ai=e=>{if(!e)return"";try{return JSON.stringify(e)}catch{return"[unserializable data]"}},ui=e=>e==null?!1:typeof e!="object"||Array.isArray(e)?!0:Object.keys(e).length>0;function Wo(e){if(!e||typeof e!="object"||Array.isArray(e)||!("logPath"in e))return e;let{logPath:t,...r}=e;return r}function yt(e,t){return e==="verbose"?!0:e==="quiet"?t.level==="error"||t.level==="warn":t.level!=="debug"}var Ko=e=>typeof e!="number"?"":e>=1e3?`${(e/1e3).toFixed(e>=1e4?0:1)}s`:`${e}ms`;var k=(e,t,r=!1)=>{let o=String(t??""),n=Go[e],s=n==="blue"?P.blue:n==="cyan"?P.cyan:n==="green"?P.green:n==="red"?P.red:n==="yellow"?P.yellow:n==="pink"?P.magenta:n==="white"?P.white:n==="gray"?P.gray:P.white;return r?s().bold(o):s(o)},ci=e=>{if(!e.operationId)return"";let t=e.operationId;return e.operationLogPath?`\x1B]8;;${`file://${encodeURI(e.operationLogPath)}`}\x07${P.underline(k("operation",t))}\x1B]8;;\x07`:k("operation",t)},pi=e=>e.split(" \xB7 ").map((t,r)=>r===0&&t.startsWith("Created ")?`Created ${k("file",t.slice(8),!0)}`:t.startsWith("$")?k("cost",t,!0):/\btokens?\b/i.test(t)?k("tokens",t,!0):t.includes("\xD7")?k("dimensions",t,!0):/^(?:generated|media)\s+/i.test(t)||/\d(?:\.\d+)?s\b/.test(t)?k("duration",t,!0):/\b(?:B|KB|MB|GB)\b/.test(t)?k("outputSize",t,!0):t.includes("/")?k("model",t,!0):k("message",t,!0)).join(P.gray(" \xB7 ")),Ie=e=>e&&typeof e=="object"&&!Array.isArray(e)?e:{},mi=e=>typeof e!="number"||!Number.isFinite(e)||e<0?"":e<1024?`${e} B`:e<1024**2?`${(e/1024).toFixed(e>=100*1024?0:1)} KB`:`${(e/1024**2).toFixed(e>=100*1024**2?0:1)} MB`,Yo=e=>{if(typeof e=="number"&&Number.isFinite(e))return e;let t=Ie(e);for(let r of["totalCost","costUSD","total","usd"])if(typeof t[r]=="number"&&Number.isFinite(t[r]))return t[r]},li=e=>{let t=Yo(e);return t===void 0?"":`$${t.toFixed(t<.01?4:2)}`},di=e=>{let t=Ie(e);for(let n of["totalTokens","total_tokens","totalTokenCount"])if(typeof t[n]=="number"&&Number.isFinite(t[n]))return t[n];let r=t.inputTokens??t.input_tokens??t.promptTokens??t.prompt_tokens,o=t.outputTokens??t.output_tokens??t.completionTokens??t.completion_tokens;return typeof r=="number"||typeof o=="number"?(typeof r=="number"?r:0)+(typeof o=="number"?o:0):void 0},Ho=e=>{let t=Array.isArray(e.outputs)?e.outputs.map(Ie):[];return t.length?t:[e]},gi=e=>[e.provider,e.model].filter(t=>typeof t=="string"&&t.length>0).join("/"),fi=e=>{let t=Ie(e.data),r=Ho(t),o=[...new Set(r.map(gi).filter(Boolean))],n=r[0]??t,s=[];o.length===1?s.push(k("model",o[0],!0)):o.length>1&&s.push(k("model",`${o.length} models`,!0));let i=n.imageSize||n.size||n.resolution;return i&&s.push(k("dimensions",i,!0)),n.quality&&s.push(`${P.gray("quality")} ${k("quality",n.quality,!0)}`),n.aspectRatio&&s.push(k("aspectRatio",n.aspectRatio,!0)),n.voiceId&&s.push(`${P.gray("voice")} ${k("voice",n.voiceId,!0)}`),n.outputFormat&&s.push(k("format",n.outputFormat,!0)),typeof n.mediaDurationSeconds=="number"&&s.push(k("duration",`${n.mediaDurationSeconds}s media`,!0)),r.length>1&&s.push(k("outputCount",`${r.length} outputs`,!0)),s.join(P.gray(" \xB7 "))},yi=e=>{let t=Ie(Ie(e.data).result);if(!Object.keys(t).length)return{target:"",details:""};let r=Ho(t),o=r[0]??t,n=r.reduce((f,m)=>f+(typeof m.outputSizeBytes=="number"?m.outputSizeBytes:0),0),s=r.map(f=>Yo(f.cost)),i=s.some(f=>f!==void 0)?s.reduce((f,m)=>f+(m??0),0):void 0,a=r.reduce((f,m)=>f+(di(m.usage??m.tokenUsage)??0),0),u=r.length>1?k("outputCount",`${r.length} outputs`,!0):typeof o.outputFileName=="string"?k("file",o.outputFileName,!0):"",p=[];o.width&&o.height?p.push(k("dimensions",`${o.width}\xD7${o.height}`,!0)):o.resolution&&p.push(k("dimensions",o.resolution,!0)),n>0&&p.push(k("outputSize",mi(n),!0)),typeof o.mediaDurationSeconds=="number"&&p.push(k("duration",`${o.mediaDurationSeconds}s media`,!0));let d=li(i);return d&&p.push(k("cost",d,!0)),a>0&&p.push(k("tokens",`${a.toLocaleString()} tokens`,!0)),{target:u,details:p.join(P.gray(" \xB7 "))}},hi=e=>{let t=e.data&&typeof e.data=="object"&&!Array.isArray(e.data)?e.data:{};if(typeof t.version=="string")return`TIM version ${k("systemVersion",t.version,!0)}`;if(typeof t.root=="string"&&typeof t.configuredDirectories=="number"){let r=t.configuredDirectories;return`Listener started in ${k("workingDirectory",t.root,!0)} with ${k("configuredDirectoriesCount",r,!0)} configured director${r===1?"y":"ies"}`}return typeof t.providers=="string"?`Providers: ${k("systemProviders",t.providers,!0)}`:k("message",e.message??"")},bi=e=>{let t=e.message??"",r=Ie(e.data).promptId;if(typeof r=="string"&&r.length>0){let o=t.indexOf(r);return o>=0?`${k("promptLabel",t.slice(0,o))}${k("promptId",r,!0)}${k("promptLabel",t.slice(o+r.length))}`:`${k("promptLabel",t)} ${P.gray("\xB7 prompt")} ${k("promptId",r,!0)}`}return k("message",t)};function Xo(e,t=""){let r=e.source??"LOG",o=r==="tim-core"||r==="LOG",n=f=>`${P.gray(t)} ${f}`.trimStart(),s=k("bot",e.botName??"unknown-bot",!0),i=k("file",e.fileName??e.filePath??"unknown-file",!0),a=Ko(e.duration),u=ci(e),p=u?` ${P.gray("\xB7 op")} ${u}`:"",d=f=>f.padEnd(6);switch(e.kind){case"crud":return`${n(P.cyan().bold("\u25C6"))} ${P.cyan().bold(d("CRUD"))} ${P.cyan(String(e.crudVerb??e.verb??"").toUpperCase())} ${i}`;case"bot-delay":return`${n(P.yellow("\u25F7"))} ${P.yellow().bold(d("WAIT"))} ${s} ${k("duration",a||String(e.message??""),!0)} ${P.gray("\xB7")} ${i}`;case"bot-start":{let f=fi(e);return`${n(P.magenta("\u25B6"))} ${P.magenta().bold(d("START"))} ${s}${f?` ${P.gray("\xB7")} ${f}`:""} ${P.gray("\xB7")} ${i}${p}`}case"bot-step":{let f=e.level==="error"?"ERROR":e.level==="warn"?"WARN":"STEP",m=e.level==="error"?P.red:e.level==="warn"?P.yellow:P.cyan,h=e.level==="error"?P.red("\u2715"):e.level==="warn"?P.yellow("!"):P.cyan("\u2022");return`${n(h)} ${m().bold(f.padEnd(6))} ${s} ${P.gray("\xB7")} ${bi(e)}${a?` ${P.gray("(")}${k("duration",a)}${P.gray(")")}`:""}${p}`}case"bot-output":return`${n(P.green("\u25A3"))} ${P.green().bold(d("OUTPUT"))} ${pi(e.message??"")}`;case"bot-done":{let f=yi(e),m=f.target||i;return`${n(P.green("\u2713"))} ${P.green().bold(d("DONE"))} ${s}${a?` ${k("duration",a,!0)}`:""} ${P.gray("\xB7")} ${m}${f.details?` ${P.gray("\xB7")} ${f.details}`:""}${p}`}case"bot-skip":return`${n(P.gray("\u21B7"))} ${P.gray().bold(d("SKIP"))} ${k("bot",e.botName??"")} ${k("message",e.message??"")}`.trim();case"bot-error":return`${n(P.red("\u2715"))} ${P.red().bold(d("ERROR"))} ${s} ${P.gray("\xB7")} ${i}${p} ${k("message",e.message??"Bot failed")}`;case"system":return`${n(P.blue().bold("\u25C6"))} ${P.blue().bold(d("SYSTEM"))} ${hi(e)}`;default:{let f=String(e.level??"info").toUpperCase(),m=e.level==="error"?P.red:e.level==="warn"?P.yellow:P.cyan,h=ui(e.data)?k("message",` ${ai(e.data)}`):"",y=e.level==="error"?P.red("\u2715"):e.level==="warn"?P.yellow("!"):o?P.blue("\u25C6"):P.magenta("\u2022");return`${n(y)} ${m(d(f))} ${k("message",e.message??"")}${h}`}}}var vi=e=>({...e,at:new Date(e.timestamp??Date.now()).toISOString()});function Ii(e){let t=e.botName??e.source??"tim",r=e.fileName?` \xB7 ${e.fileName}`:"",o=Ko(e.duration),n=e.operationId?` \xB7 op ${e.operationId}`:"";switch(e.kind){case"bot-delay":return`WAIT ${o} ${t}${r}`;case"bot-start":return`START ${t}${r}${n}`;case"bot-step":return`${e.level==="error"?"ERROR":e.level==="warn"?"WARN":"STEP"} ${t} \xB7 ${e.message}${o?` \xB7 ${o}`:""}${n}`;case"bot-output":return`OUTPUT ${e.message}`;case"bot-skip":return`SKIP ${t}${r} \xB7 ${e.message}`;case"bot-done":return`DONE ${o} ${t}${r}${n}`;case"bot-error":return`ERROR ${t}${r} \xB7 ${e.message}${n}`;default:return`${String(e.level??"info").toUpperCase()} ${e.message}`}}function wr(e,t,r){for(let o of t){if(!yt(o.detail??"default",e))continue;let n=ft.dirname(o.path);r.ensureDirSync(n);let s=vi(e);if(o.format==="text"){r.appendFileSync(o.path,`${s.at} ${Ii(e)}
4
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)}}},Wc=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"],Jm=[...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 ol 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}
5
+ `,{encoding:"utf-8"});continue}let i=r.existsSync(o.path)?r.readJsonSync(o.path):{},a=Array.isArray(i.events)?i.events:[];r.writeJsonSync(o.path,{...i,id:e.operationId,botName:e.botName??i.botName,command:e.data?.command??i.command??e.botName,fileName:e.fileName??i.fileName,filePath:e.filePath??i.filePath,sourceFileName:e.data?.sourceFileName??i.sourceFileName??e.fileName,sourceFilePath:e.data?.sourceFilePath??i.sourceFilePath??e.filePath,startedAt:e.kind==="bot-start"?s.at:i.startedAt??s.at,endedAt:e.kind==="bot-done"||e.kind==="bot-error"?s.at:i.endedAt??null,durationMs:e.duration??i.durationMs??null,status:e.kind==="bot-error"?"error":e.kind==="bot-done"?"done":i.status??"started",phase:e.kind==="bot-error"?"error":e.kind==="bot-done"?"done":i.phase??"started",lastEventAt:s.at,lastMessage:e.message,events:[...a,s]},{spaces:2})}}var Si=ve.combine(ve.timestamp({format:"HH:mm:ss"}),ve.errors({stack:!0}),ve.printf(e=>{let{timestamp:t,level:r="info",message:o="",stack:n,logEvent:s}=e,i={...s??{},level:s?.level??r,message:s?.message??String(o),data:Wo(s?.data)},a=Xo(i,t);return n?`${a}
6
+ ${n}`:a})),ht=(e={})=>{let t=e.transports?.length?e.transports:si,r=!1,o=[];t.includes("console")&&o.push(new Vo.Console({format:Si}));let n=e.logPath??e.fsPath??"log.txt";t.includes("fs")&&o.push(new xr({defaultLogPath:n,format:ni}));let s=ei({level:"debug",transports:o.length?o:[new Vo.Console]}),i=async(m,h)=>{let y=ii(m,"info",e.source,h),I=y.level??"info",A={...y,level:I,timestamp:y.timestamp??Date.now()};if(s.log({level:I,message:A.message,logEvent:A}),t.includes("custom"))if(e.addLog){let C=gt({...A});await Promise.resolve(e.addLog(C))}else r||(r=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))},a=async(m,h)=>i({message:m,level:"debug",data:h,source:e.source}),u=async(m,h)=>i({message:m,level:"info",data:h,source:e.source}),p=async(m,h)=>i({message:m,level:"warn",data:h,source:e.source});return{log:i,debug:a,info:u,warn:p,error:async(m,h)=>i({message:m,level:"error",data:h,source:e.source}),clearLogs:async(m=()=>!0)=>{if(t.includes("fs"))try{await ce.mkdir(ft.dirname(n),{recursive:!0}).catch(()=>{}),await ce.writeFile(n,"",{flag:"a"}),await ce.truncate(n,0),await u("\u{1F9F9} Logs cleared",{logPath:n})}catch(h){let y=h instanceof Error?h.message:Cr.format("%o",h);await p("Failed to clear logs",{logPath:n,error:y})}t.includes("custom")&&e.clearLogs&&await e.clearLogs(m)}}},Dp=ht();import qe from"node:path";var Zo=()=>{let e=ht({source:"tim-core",transports:["console"]});return qo(e),e},Ue=(e,t={})=>{let r={...t,message:e,level:t.level??"info",timestamp:t.timestamp??Date.now()},o=Sr();return o&&o.log(r),r},G=(e,t,r={})=>Ue(e,{kind:"diagnostic",level:"error",data:{...r,error:t instanceof Error?t.message:String(t),...t instanceof Error&&t.stack?{stack:t.stack}:{}}});function K(e,t,r={}){let o=qe.resolve(oe()||e.paths.rootFull||process.cwd()),n=t.operationId??e.operationId,s=e.global.logs.operation,i=n&&s.enabled?qe.join(o,s.directory,`${n}.json`):void 0,a=t.botName??e.botName,u={...t,operationId:n,operationLogPath:i,botName:a,fileName:t.fileName??e.fileName,filePath:t.filePath??e.paths.file,machineId:t.machineId??e.machineId,sessionId:t.sessionId??e.sessionId,scope:t.scope??e.scope,userId:t.userId??e.userId,source:t.source??(t.kind?.startsWith("bot-")?a:e.botName)??"tim-core",level:t.level??"info",timestamp:t.timestamp??Date.now()},p=e.global.logs.console,d=p.silenceCrudDelete&&u.kind==="crud"&&u.crudVerb==="delete",f=p.silenceRequestBotStartDone&&u.botName?.startsWith("req-")&&(u.kind==="bot-start"||u.kind==="bot-done");if(r.console!==!1&&p.enabled&&!d&&!f&&yt(p.detail,u)){let h=Sr();h&&h.log(u)}let m=[];if(r.local!==!1&&e.global.logs.local.enabled){let h=r.localPath??qe.join(e.paths.sessionFull||qe.dirname(e.paths.fileFull),"log.txt");m.push({path:h,format:"text",detail:e.global.logs.local.detail})}return r.workspace!==!1&&e.global.logs.workspace.enabled&&m.push({path:qe.join(o,"_tim","logs","events.jsonl"),format:"jsonl",detail:e.global.logs.workspace.detail}),r.operation!==!1&&n&&s.enabled&&m.push({path:i,format:"operation",detail:s.detail}),m.length&&wr(u,m,N()),u}var Qo=e=>e.replace(/(\d+)(?=\.\w+$)/,t=>String(Number(t)+1).padStart(t.length,"0"));import xi from"node:crypto";import Ci from"node:os";import en from"node:path";function wi(e){return xi.createHash("sha1").update(en.resolve(e)).digest("hex").slice(0,12)}function bt(e){return en.join(Ci.tmpdir(),"tim-core",wi(e))}var Q=()=>Bo(),M=e=>N().existsSync(e);var Ge=e=>N().ensureDirSync(e);var Tr=e=>N().removeSync(e),Fr=(e,t)=>N().copySync(e,t);var xt=e=>N().readJsonSync(e),Ce=(e,t={})=>{try{return N().existsSync(e)?N().readJsonSync(e):t}catch(r){return G(`Failed to read JSON from ${e}`,r,{filePath:e}),t}},Ar=(e,t="utf-8")=>N().readFileSync(e,t),D=e=>N().readFileSync(e),kr=(e,t,r="utf-8")=>N().writeFileSync(e,t,{encoding:r}),Er=(e,t,r=2)=>N().writeJsonSync(e,t,{spaces:r}),Ve=(e,t)=>N().writeFileSync(e,t),Ct="_meta",Pi="_temp",tn="_done",It="_cleanup",rn=new Set(["_analysis",It,"_partial","_parts","_transcript"]),Ti=new Set(["_analysis",It,tn,Ct,"_parts","_prompts",Pi,"_transcript"]),Fi=["_partial.","_transcribing.","_transcript."];function Ai(e){return x.basename(e).endsWith(".meta.json")}function ki(e,t){return e.split(/[\\/]+/).includes(t)}function wt(e){return e.split(/[\\/]+/).filter(Boolean)}function xe(e){return e.replace(/^\/+|\/+$/g,"").replace(/[^a-z0-9._-]+/gi,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()}function Ei(e){return xe(e.paths.file||e.fileName||"source")||"source"}function _i(e){let t=x.dirname(e.paths.file||"");return xe(t==="."?e.paths.session||"session":t)||"session"}function _r(e){return(e.operationId||"manual").replace(/[^a-z0-9._-]+/gi,"-")}function Li(e){let[t]=wt(e);return rn.has(t)}function Ni(e,t){let r=wt(t),o=xe(r.shift()||"work").replace(/^_+/,"")||"work",n=xe(r.join("__")||x.basename(t)||"file");return`${_i(e)}__${o}__${n}`}function on(e,t){let r=x.basename(t),o=xe(r),n=xe(e.fileName.replace(/\.[^.]+$/,""));if(!n||o.startsWith(`${n}.`))return o;let i=o.replace(/^_+/,"").replace(/\.meta\.json$/i,""),[a,...u]=i.split("."),p=u.join(".");return a&&p&&xe(p)===n?`${p}.${a}.meta.json`:o}function Oi(e,t){let r=on(e,t);return`${_r(e)}__${r}`}function St(e){return sn(e,e.global.meta,"meta")}function nn(e){return sn(e,e.global.intermediates,"intermediates")}function sn(e,t,r){switch(t.location){case"source":return e.paths.sessionFull;case"source-subdirectory":return x.join(e.paths.sessionFull,t.directory);case"workspace":return x.join(e.paths.rootFull,t.directory);case"none":return x.join(bt(e.paths.rootFull),"_ephemeral",_r(e),r);default:return x.join(bt(e.paths.rootFull),t.directory)}}function Pr(e,t,r,o){return r.location==="source"||r.location==="source-subdirectory"?x.basename(t):o==="meta"?Oi(e,t):Ni(e,t)}function Se(e,t,r={}){let o=wt(t),n=o[0]===Ct?o.slice(1).join("/"):t;if(Ai(t)){let s=x.join(St(e),Pr(e,n,e.global.meta,"meta"));return r.forWrite?s:Ri(e,n)||s}return Li(t)?x.join(nn(e),Pr(e,t,e.global.intermediates,"intermediates")):x.join(e.paths.sessionFull,t)}function Lr(e,t,r={}){return Se(e,t,r)}function Ri(e,t){let r=N(),o=x.basename(t),n=on(e,t),s=Ei(e),i=St(e),a=x.join(i,Pr(e,t,e.global.meta,"meta"));if(r.existsSync(a))return a;if(r.existsSync(i)){let d=r.readdirSync(i).filter(f=>f.endsWith(`__${n}`)||f.endsWith(`__${o}`)&&f.includes(`__${s}__`)).sort();if(d.length)return x.join(i,d[d.length-1])}let u=x.join(e.paths.sessionFull,Ct,o);if(r.existsSync(u))return u;let p=x.join(e.paths.sessionFull,o);return r.existsSync(p)?p:null}function an(e){let t=N(),r=x.join(bt(e.paths.rootFull),"_ephemeral",_r(e));t.existsSync(r)&&t.removeSync(r)}function $i(e,t){if(!e.existsSync(t))return t;let r=x.dirname(t),o=x.extname(t),n=x.basename(t,o);for(let s=2;s<1e4;s+=1){let i=x.join(r,`${n}.${s}${o}`);if(!e.existsSync(i))return i}return x.join(r,`${n}.${Date.now()}${o}`)}var E=e=>{let t=N();function r(l,g){try{let{paths:b}=e,S=l==="sessionFull"?Se(e,g):x.join(b[l],g);return t.existsSync(S)?t.readJsonSync(S):{}}catch(b){G("File manager failed to read JSON",b,{filePath:g})}}function o(l,g,b){try{let{paths:S}=e,F=l==="sessionFull"?Se(e,g,{forWrite:!0}):x.join(S[l],g);t.ensureDirSync(x.dirname(F)),t.writeJsonSync(F,b,{spaces:2})}catch(S){G("File manager failed to write JSON",S,{filePath:g})}}function n(l,g,b,S){try{let{paths:F}=e,j=x.join(F[l],`${g}.${S}.json`);t.writeJsonSync(j,b,{spaces:2})}catch(F){G("File manager failed to write AI request",F,{id:g,suffix:S})}}function s(l,g,b){return n(l,g,b,"llm")}function i(l,g,b){return n(l,g,b,"convo")}function a(l,g,b){return n(l,g,b,"image")}function u(l,g,b){return n(l,g,b,"vision")}function p(l,g,b){return n(l,g,b,"tts")}function d(l,g={}){try{let{paths:b,machineId:S,sessionId:F,userId:j}=e,z={id:lt(),ts:Date.now(),userId:j,machineId:S,sessionId:F,orderType:l,...g},re=x.join(b.rootFull,"_orders",`${z.id}.json`);t.ensureDirSync(x.dirname(re)),t.writeJsonSync(re,z,{spaces:4})}catch(b){G("File manager failed to write bridge order",b,{orderType:l})}}function f(l,g,b){try{let{paths:S}=e,F=l==="sessionFull"?Se(e,g,{forWrite:!0}):x.join(S[l],g);t.ensureDirSync(x.dirname(F)),t.writeFileSync(F,b)}catch(S){G("File manager failed to write binary file",S,{filePath:g})}}function m(l,g,b){try{let{paths:S}=e,F=l==="sessionFull"?Se(e,g,{forWrite:!0}):x.join(S[l],g);t.ensureDirSync(x.dirname(F)),t.copySync(b,F)}catch(S){G("File manager failed to copy file",S,{filePath:g,sourcePath:b})}}function h(l,g){try{let{paths:b}=e,S=l==="sessionFull"?Se(e,g):x.join(b[l],g);return t.readFileSync(S,"utf-8")}catch(b){G("File manager failed to read binary file",b,{filePath:g})}}function y(l,g){try{let{paths:b}=e,S=x.join(b[l],g);return t.readdirSync(S)}catch(b){return G("File manager failed to read directory",b,{path:g}),[]}}function I(l,g,b){let S=b?x.join(e.paths[l],b):e.paths[l],F=(_,J=!0)=>t.existsSync(_)?t.readdirSync(_).filter(B=>B.endsWith(".json")&&(!J||!g||vt(B,g))).reduce((B,Z)=>(B[Z]=t.readJsonSync(x.join(_,Z)),B),{}):{},j=["workspace","os-temp","none"].includes(e.global.meta.location),z=l==="sessionFull"&&!b&&j?Object.entries(F(St(e),!1)).reduce((_,[J,B])=>{let Z=J.split("__").pop()||J;return(!g||vt(Z,g)||vt(J,g))&&(_[Z]=B),_},{}):{},re=!b&&e.global.meta.location==="source-subdirectory"?F(St(e)):{},W=b?{}:F(x.join(S,Ct));return{...F(S),...W,...re,...z}}function A(l){let{paths:g}=e;t.emptyDirSync(g[l])}function C(l,g){let{paths:b}=e,S=x.join(b[l],`${g}.md`);t.existsSync(S)&&t.unlinkSync(S),t.writeFileSync(S,Date.now().toString(),{encoding:"utf-8"})}function w(l,g){let{paths:b}=e,S=x.join(b[l],`${g}.md`);t.existsSync(S)&&t.removeSync(S)}async function v(l,g){C(l,g),w(l,g)}function T(l,g){let{paths:b}=e,S=l==="sessionFull"&&rn.has(wt(g)[0])?nn(e):x.join(b[l],g);t.ensureDirSync(S)}function L(l,g){let{paths:b}=e,S=l==="sessionFull"?Se(e,g):x.join(b[l],g);return t.existsSync(S)}function R(){return U(e.fileName)}function U(l){let g=x.join(e.paths.sessionFull,l);if(!g||!t.existsSync(g)||l.split(/[\\/]+/).some(F=>Ti.has(F))||Fi.some(F=>x.basename(l).startsWith(F))||l==="config.json"||l==="log.txt")return null;let b=x.join(e.paths.sessionFull,tn),S=$i(t,x.join(b,x.basename(l)));return t.ensureDirSync(b),t.copySync(g,S),t.removeSync(g),S}function ke(l,g){let b=g.startsWith(".")?g:`.${g}`,S=x.extname(l);return S?l.slice(0,-S.length)+b:`${l}${b}`}function be(l){let g=e.config||{};return(g.cleanUp||g.cleanup||{})?.[l]||null}function ct(l){let g=[],b=new Set;for(let S of l){let F=be(S);if(!F)continue;let j=[],z=(_,J)=>{let B=`move-to-done:${_}`;if(b.has(B))return;b.add(B);let Z=U(_);j.push({action:"move-to-done",reason:J,fileName:_,status:Z?"moved":"skipped",donePath:Z})},re=(_,J)=>{let B=`delete:${_}`;if(b.has(B))return;b.add(B);let Z=x.join(e.paths.sessionFull,_);if(!t.existsSync(Z)){j.push({action:"delete",reason:J,fileName:_,status:"missing"});return}t.removeSync(Z),j.push({action:"delete",reason:J,fileName:_,status:"deleted"})},W=(_,J)=>{if(F.verb==="done"){z(_,J);return}F.verb==="delete"&&re(_,J)};W(e.fileName,"trigger");for(let _ of Array.isArray(F.additionalExt)?F.additionalExt:[])W(ke(e.fileName,_),`additionalExt:${_}`);for(let _ of Array.isArray(F.additionalFiles)?F.additionalFiles:[])W(_,"additionalFiles");g.push({commandName:S,policy:F,actions:j})}return g}function Ms(l,g,b){if(!b.length)return null;let S=g.replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase(),F=x.join(It,`${l}.${S}.cleanup.json`);return o("sessionFull",F,{botName:l,sourceFileName:g,createdAt:Date.now(),actions:b}),F}function Js(l){let g=x.join(e.paths.sessionFull,It);if(!t.existsSync(g))return[];let b=[],S=t.readdirSync(g).filter(F=>F.endsWith(".cleanup.json")).sort();for(let F of S){let j=x.join(g,F),z=t.readJsonSync(j);if(z.sourceFileName&&z.sourceFileName!==l)continue;let re=Array.isArray(z.actions)?z.actions:[],W=[];for(let _ of re){if(!_?.fileName||ki(_.fileName,".."))continue;let J=x.join(e.paths.sessionFull,_.fileName);if(!t.existsSync(J)){W.push({..._,status:"missing"});continue}if(_.action==="move-to-done"){let B=U(_.fileName);W.push({..._,status:B?"moved":"skipped",donePath:B});continue}_.action==="delete"&&(t.removeSync(J),W.push({..._,status:"deleted"}))}t.removeSync(j),b.push({manifestFileName:F,botName:z.botName,sourceFileName:z.sourceFileName,actions:W})}return b}function Bs(l,g){for(let b in g)f(l,b,g[b])}function zs(l,g,b){let S=g.replace(/\.[^.]+$/,".meta.json"),F=g.replace(/\.[^.]+$/,".txt"),{usage:j,cost:z,model:re,duration:W}=b||{};return o(l,S,{model:re,usage:j,cost:z,duration:W,sourceFileName:g,outputFileName:F}),S}function jo(l){let{paths:g}=e,b=g[l];return t.existsSync(b)||(b=x.dirname(g.fileFull)),t.existsSync(b)?x.join(b,"log.txt"):null}function Mo(l,g={}){let b=g.type==="error"?"error":g.type==="warn"?"warn":"info";return{kind:g.type==="skip"?"bot-skip":g.type==="output"?"bot-output":"bot-step",level:b,message:l,data:g.data,duration:g.duration}}function qs(l,g,b={}){let S=jo(l);S&&K(e,Mo(g,b),{console:!1,local:!0,localPath:S,operation:!1,workspace:!1})}function Us(l,g,b={}){let S=jo(l);K(e,Mo(g,b),{local:!!S,localPath:S??void 0,operation:!0,workspace:!0})}function pt(l,g,b){let F={...r(l,g),...b};return o(l,g,F)}function Jo(l,g=""){let{paths:b}=e,S=b[l];return g&&(S=x.join(S,g)),t.readdirSync(S)}function Gs(l,g,b){let S=Jo(l,b).filter(j=>!g||vt(j,g));if(S.length===0)return null;S.sort();let F=S.pop();return F?Qo(F):null}return{sessionFull:e.paths.sessionFull,machineFull:e.paths.machineFull,readFile:l=>t.readJsonSync(`${oe()}${l}`),orders:{writeBridgeOrder:d},session:{read:l=>l.endsWith(".json")?r("sessionFull",l):h("sessionFull",l),write:(l,g)=>l.endsWith(".json")?o("sessionFull",l,g):typeof g=="string"&&x.isAbsolute(g)&&t.existsSync(g)?m("sessionFull",l,g):f("sessionFull",l,g),patch:(l,g)=>pt("sessionFull",l,g),writeTextToTextRequest:(l,g)=>s("sessionFull",l,g),writeConvoRequest:(l,g)=>i("sessionFull",l,g),writeImageRequest:(l,g)=>a("sessionFull",l,g),writeVisionRequest:(l,g)=>u("sessionFull",l,g),writeTtsRequest:(l,g)=>p("sessionFull",l,g),removeCheckpoint:l=>w("sessionFull",l),recycleCheckpoint:l=>v("sessionFull",l),readDir:l=>y("sessionFull",l),readDirJsons:(l,g)=>I("sessionFull",l,g),ensureDir:l=>T("sessionFull",l),emptyDir:()=>A("sessionFull"),copyFrom(l){let g=x.join(e.paths.machineFull,"sessions",l),b=e.paths.sessionFull;t.copySync(g,b)},exists:l=>L("sessionFull",l),writeByFile:l=>Bs("sessionFull",l),saveMeta:(l,g)=>zs("sessionFull",l,g),patchSessionJson:l=>{if(!(!e.machineId||!e.sessionId))return pt("sessionFull","_session.json",l)},saveTimeline:l=>{if(!(!e.machineId||!e.sessionId))return o("sessionFull","_timeline.json",l)},listFiles:()=>Jo("sessionFull"),addToLog:(l,g={})=>Us("sessionFull",l,g),addToLocalLog:(l,g={})=>qs("sessionFull",l,g),generateMd:l=>C("sessionFull",l),getNextFile:(l,g)=>Gs("sessionFull",l,g),moveInputFileToDone:R,applyCleanupPolicy:ct,writeCleanupManifest:Ms,applyCleanupManifests:Js},machine:{read:l=>r("machineFull",l),write:(l,g)=>o("machineFull",l,g),patch:(l,g)=>pt("machineFull",l,g),patchState:l=>pt("machineFull","state.json",l),readDir:l=>y("machineFull",l),readDirJsons:(l,g)=>I("machineFull",l,g),ensureDir:l=>T("machineFull",l),generateMd:l=>C("machineFull",l)},srcData:{read:l=>{let g=x.resolve("./src");return t.readJsonSync(x.join(g,"data",l))}}}};import Tt from"lodash";var le={logs:{console:{enabled:!0,detail:"default",silenceCrudDelete:!0,silenceRequestBotStartDone:!0},local:{enabled:!0,detail:"default"},operation:{enabled:!0,detail:"verbose",directory:"_tim/operations"},workspace:{enabled:!0,detail:"default"}},intermediates:{location:"os-temp",directory:"_temp"},meta:{location:"workspace",directory:"_meta"}},Di=new Set(["source","source-subdirectory","workspace","os-temp","none"]);function un(e,t){let r=Tt.merge({},t,e),o=typeof r.directory=="string"?r.directory.trim():"",n=o.length>0&&!o.startsWith("/")&&!o.startsWith("\\")&&!o.split(/[\\/]+/).includes("..");return{location:Di.has(r.location)?r.location:t.location,directory:n?o:t.directory}}function Pt(e,t){let r=Tt.merge({},t,e),o=r.detail==="quiet"||r.detail==="default"||r.detail==="verbose"?r.detail:t.detail;return{enabled:typeof r.enabled=="boolean"?r.enabled:t.enabled,detail:o}}function ji(e,t){let r=Pt(e,t),o=Tt.merge({},t,e),n=typeof o.directory=="string"?o.directory.trim():"",s=n.length>0&&!n.startsWith("/")&&!n.startsWith("\\")&&!n.split(/[\\/]+/).includes("..");return{...r,directory:s?n:t.directory}}function Mi(e,t){let r=Pt(e,t),o=Tt.merge({},t,e);return{...r,silenceCrudDelete:typeof o.silenceCrudDelete=="boolean"?o.silenceCrudDelete:t.silenceCrudDelete,silenceRequestBotStartDone:typeof o.silenceRequestBotStartDone=="boolean"?o.silenceRequestBotStartDone:t.silenceRequestBotStartDone}}function We(e){let t=e&&typeof e=="object"?e:{};return{logs:{console:Mi(t.logs?.console,le.logs.console),local:Pt(t.logs?.local,le.logs.local),operation:ji(t.logs?.operation,le.logs.operation),workspace:Pt(t.logs?.workspace,le.logs.workspace)},intermediates:un(t.intermediates,le.intermediates),meta:un(t.meta,le.meta)}}import we from"lodash";import c from"lodash";function ne(e){let t=e?.trim().toLowerCase();if(t)return t==="azure-openai"||t==="azure_openai"||t==="microsoft"?"azure":t==="gemini"||t==="google-generative-ai"?"google":t==="eleven"||t==="eleven-labs"?"elevenlabs":t==="gpt-image"?"openai":t==="claude"?"anthropic":t==="grok"?"xai":t==="byte-dance"||t==="byte_dance"||t==="seedream"?"bytedance":t==="hf"||t==="hugging-face"?"huggingface":t}function se(e,t="llm"){let r=e?.trim().toLowerCase();return t==="tts"||t==="speech"?r?.startsWith("tts-")||r?.startsWith("gpt-4o-mini-tts")?"openai":"elevenlabs":t==="image"?r?.startsWith("gpt-image")||r?.startsWith("dall-e")?"openai":r?.startsWith("grok")?"xai":r?.startsWith("gemini")||r?.startsWith("nano")?"google":r?.startsWith("seedream")?"bytedance":void 0:t==="video"?r?.startsWith("seedance")||r?.startsWith("dreamina")?"bytedance":void 0:r?.startsWith("gemini")||r?.startsWith("nano")?"google":r?.startsWith("azure/")?"azure":r?.startsWith("claude")?"anthropic":r?.startsWith("grok")?"xai":r?.startsWith("seedance")||r?.startsWith("dreamina")?"bytedance":"openai"}function ee(e={}){return c.pickBy(e,t=>t!=null&&t!=="")}function Ft(e={}){let t=c.get(e,"options");return!t||typeof t!="object"||Array.isArray(t)?e:{...t,...e}}function At(e){return typeof e=="string"&&/^\d+x\d+$/i.test(e.trim())}function Ji(e={},t){let r=t==="speech"?"tts":t,o=c.get(e,[`ai-${r}`,"output"]);if(!o||Array.isArray(o)||typeof o!="object")return{};if(r==="image"){let n=Ft(o),s=c.get(n,"imageSize");return ee({task:"image",provider:c.get(n,"provider")??c.get(n,"imageProvider"),model:c.get(n,"model")??c.get(n,"imageModel"),size:c.get(n,"size")??(At(s)?s:void 0),aspectRatio:c.get(n,"aspectRatio")??c.get(n,"imageAspectRatio"),imageSize:c.get(n,"googleImageSize")??c.get(n,"resolution")??c.get(n,"imageResolution")??(At(s)?void 0:s),quality:c.get(n,"quality")??c.get(n,"imageQuality"),outputFormat:c.get(n,"outputFormat")??c.get(n,"imageOutputFormat"),background:c.get(n,"background")??c.get(n,"imageBackground"),moderation:c.get(n,"moderation")??c.get(n,"imageModeration"),n:c.get(n,"n")??c.get(n,"imageN"),outputCompression:c.get(n,"outputCompression")??c.get(n,"imageOutputCompression"),providerOptions:c.get(n,"providerOptions")??c.get(n,"imageProviderOptions"),reference:c.get(n,"reference")??c.get(n,"imageReference"),references:c.get(n,"references")??c.get(n,"imageReferences"),referenceImagePath:c.get(n,"referenceImagePath")??c.get(n,"imageReferencePath"),referenceImagePaths:c.get(n,"referenceImagePaths")??c.get(n,"imageReferencePaths"),referenceType:c.get(n,"referenceType")??c.get(n,"imageReferenceType"),referenceTypes:c.get(n,"referenceTypes")??c.get(n,"imageReferenceTypes")})}if(r==="video"){let n=Ft(o);return ee({task:"video",provider:c.get(n,"provider")??c.get(n,"videoProvider"),model:c.get(n,"model")??c.get(n,"videoModel"),aspectRatio:c.get(n,"aspectRatio")??c.get(n,"videoAspectRatio"),resolution:c.get(n,"resolution")??c.get(n,"videoResolution"),duration:c.get(n,"duration")??c.get(n,"videoDuration"),fps:c.get(n,"fps")??c.get(n,"videoFps"),seed:c.get(n,"seed")??c.get(n,"videoSeed"),reference:c.get(n,"reference"),referenceImagePath:c.get(n,"referenceImagePath"),providerOptions:c.get(n,"providerOptions")??c.get(n,"videoProviderOptions")})}return ee(r==="tts"?{task:"tts",provider:c.get(o,"provider")??c.get(o,"ttsProvider"),model:c.get(o,"model")??c.get(o,"ttsModel"),voiceId:c.get(o,"voiceId"),outputFormat:c.get(o,"outputFormat")??c.get(o,"ttsOutputFormat"),languageCode:c.get(o,"languageCode"),speed:c.get(o,"speed"),instructions:c.get(o,"instructions"),providerOptions:c.get(o,"providerOptions")??c.get(o,"ttsProviderOptions")}:{task:r,provider:c.get(o,"provider")??c.get(o,"llmProvider"),model:c.get(o,"model")??c.get(o,"llmModel"),providerOptions:c.get(o,"providerOptions")??c.get(o,"llmProviderOptions")})}function Bi(e={},t){if(t==="image"){let r=Ft(c.get(e,"image",{})),o=c.get(e,"imageSize")??c.get(r,"imageSize");return ee({task:"image",provider:c.get(e,"imageProvider")??c.get(r,"provider"),model:c.get(e,"imageModel")??c.get(r,"model"),size:c.get(e,"size")??c.get(r,"size")??(At(o)?o:void 0),aspectRatio:c.get(e,"imageAspectRatio")??c.get(r,"aspectRatio"),imageSize:c.get(e,"googleImageSize")??c.get(r,"googleImageSize")??c.get(e,"imageResolution")??c.get(r,"resolution")??(At(o)?void 0:o),quality:c.get(e,"imageQuality")??c.get(r,"quality"),outputFormat:c.get(e,"imageOutputFormat")??c.get(r,"outputFormat"),background:c.get(e,"imageBackground")??c.get(r,"background"),moderation:c.get(e,"imageModeration")??c.get(r,"moderation"),n:c.get(e,"imageN")??c.get(r,"n"),outputCompression:c.get(e,"imageOutputCompression")??c.get(r,"outputCompression"),providerOptions:c.get(e,"imageProviderOptions")??c.get(r,"providerOptions"),reference:c.get(e,"reference")??c.get(e,"imageReference")??c.get(r,"reference")??c.get(r,"imageReference"),references:c.get(e,"references")??c.get(e,"imageReferences")??c.get(r,"references")??c.get(r,"imageReferences"),referenceImagePath:c.get(e,"referenceImagePath")??c.get(e,"imageReferencePath")??c.get(r,"referenceImagePath")??c.get(r,"imageReferencePath"),referenceImagePaths:c.get(e,"referenceImagePaths")??c.get(e,"imageReferencePaths")??c.get(r,"referenceImagePaths")??c.get(r,"imageReferencePaths"),referenceType:c.get(e,"referenceType")??c.get(e,"imageReferenceType")??c.get(r,"referenceType")??c.get(r,"imageReferenceType"),referenceTypes:c.get(e,"referenceTypes")??c.get(e,"imageReferenceTypes")??c.get(r,"referenceTypes")??c.get(r,"imageReferenceTypes")})}if(t==="video"){let r=Ft(c.get(e,"video",{}));return ee({task:"video",provider:c.get(e,"videoProvider")??c.get(r,"provider"),model:c.get(e,"videoModel")??c.get(r,"model"),aspectRatio:c.get(e,"videoAspectRatio")??c.get(r,"aspectRatio"),resolution:c.get(e,"videoResolution")??c.get(r,"resolution"),duration:c.get(e,"videoDuration")??c.get(r,"duration"),fps:c.get(e,"videoFps")??c.get(r,"fps"),seed:c.get(e,"videoSeed")??c.get(r,"seed"),reference:c.get(e,"videoReference")??c.get(r,"reference"),referenceImagePath:c.get(e,"videoReferenceImagePath")??c.get(r,"referenceImagePath"),providerOptions:c.get(e,"videoProviderOptions")??c.get(r,"providerOptions")})}if(t==="tts"||t==="speech"){let r=c.get(e,"tts",c.get(e,"speech",{}));return ee({task:"tts",provider:c.get(e,"ttsProvider")??c.get(e,"speechProvider")??c.get(r,"provider"),model:c.get(e,"ttsModel")??c.get(e,"speechModel")??c.get(r,"model"),voiceId:c.get(e,"voiceId")??c.get(r,"voiceId"),outputFormat:c.get(e,"ttsOutputFormat")??c.get(e,"speechOutputFormat")??c.get(r,"outputFormat"),languageCode:c.get(e,"languageCode")??c.get(r,"languageCode"),speed:c.get(e,"speed")??c.get(r,"speed"),instructions:c.get(e,"instructions")??c.get(r,"instructions"),providerOptions:c.get(e,"ttsProviderOptions")??c.get(e,"speechProviderOptions")??c.get(r,"providerOptions")})}if(t==="transcription"){let r=c.get(e,"transcription",{});return ee({task:"transcription",provider:c.get(e,"transcriptionProvider")??c.get(e,"aiProvider")??c.get(e,"provider")??c.get(r,"provider"),model:c.get(e,"transcriptionModel")??c.get(r,"model"),providerOptions:c.get(e,"transcriptionProviderOptions")??c.get(r,"providerOptions")})}return ee({task:"llm",provider:c.get(e,"llmProvider")??c.get(e,"aiProvider")??c.get(e,"provider"),model:c.get(e,"llmModel")??c.get(e,"model"),providerOptions:c.get(e,"llmProviderOptions")??c.get(e,"providerOptions")})}function Y(e={},t,r={}){let o=c.get(e,"ai",{}),n=t==="speech"?"tts":t,s=c.get(r,"profile")??c.get(e,[`${n}Profile`])??c.get(e,[n,"profile"])??c.get(o,["defaults",n]),i=s?c.get(o,["profiles",s],{}):{},a=c.get(o,n,{}),u=c.merge({},i,a,Bi(e,n),Ji(e,n),ee(r));return u.task=n,u.provider=ne(u.provider),u.provider||(u.provider=se(u.model,n)),ee(u)}var zi={ara:"ar",chi:"zh",deu:"de",dut:"nl",eng:"en",fre:"fr",fra:"fr",ger:"de",heb:"he",ita:"it",jpn:"ja",nld:"nl",por:"pt",rus:"ru",spa:"es",swe:"sv",zho:"zh"};function Nr(e){if(typeof e!="string")return;let t=e.trim().toLowerCase();if(!t)return;let r=t.split("-")[0];return/^[a-z]{2}$/.test(r)?r:zi[t]}function cn(e,t){return Nr(t)??Nr(e.params?.language)??Nr(e.params?.languageCode)}import sa from"node:fs";import Lt from"node:fs";import hn from"lodash";import Ne from"path";import Ui from"chokidar";import Gi from"fs-extra";import{globSync as Vi}from"glob";import pn from"kleur";import{minimatch as Or}from"minimatch";import{dirname as mn,isAbsolute as ln,join as _e}from"node:path";var Ee=["node_modules/**","**/node_modules/**","**/dist/**","**/build/**","**/out/**","**/coverage/**","**/.cache/**","**/.tmp/**","**/tmp/**","**/log.txt"],Em=[...Ee,/(^|[\/\\])\../];import{globSync as qi}from"glob";var Ke=(e,t,r=[])=>qi(t,{cwd:e,ignore:[...Ee,...r],nodir:!0,dot:!1}),kt=(e,t,r=[])=>Ke(e,t,r).length;function Et(e){return e.replace(/\\/g,"/").replace(/^\/+/,"")}function Wi(e,t){let r=Et(t).replace(/\/+$/,"");if(!r||r.startsWith("#")||r.startsWith("!"))return[];let o=Et(t.startsWith("/")?r:_e(e,r));if(!r.includes("/")){let n=Et(_e(e,"**",r));return[o,`${o}/**`,n,`${n}/**`]}return[o,`${o}/**`]}function Ki(e){return Vi("**/.timignore",{cwd:e,nodir:!0,dot:!0,ignore:Ee}).flatMap(r=>{let o=mn(r)==="."?"":mn(r);return Gi.readFileSync(_e(e,r),"utf-8").split(/\r?\n/).map(s=>s.trim()).flatMap(s=>Wi(o,s))})}function Rr(e){let{cwd:t,target:r,watchPaths:o,depth:n,callbacks:s={},createContext:i,ignore:a=[],ignoreLogs:u,silent:p=!1}=e,d=Ki(t),f=[...a,...d],m=d.map(v=>_e(t,v)),h=o?.length?o.map(v=>ln(v)?v:_e(t,v)):[t],y=o?.length?o.reduce((v,T)=>v+kt(ln(T)?T:_e(t,T),"*",f),0):kt(t,r,f),I=Ui.watch(h,{persistent:!0,depth:n,ignored:[...Ee,...f,...m,/(^|[\/\\])\../],ignoreInitial:!0}),A=(v,T)=>i?i(v,T):v,C=v=>Or(Et(v),r),w=v=>{let T=v.replace(/\\/g,"/"),L=T.replace(/^\/+/,"");return f.some(R=>Or(T,R)||Or(L,R))};return I.on("all",(v,T)=>{let L=T.replace(t,""),R=L.endsWith("log.txt");if(u&&R||w(L))return;let U=C(L);e.debug}).on("add",async v=>{let T=v.replace(t,""),L=T.endsWith("log.txt");if(u&&L||w(T))return;let R=C(T);!s.onAdd||!R||(p||console.log(pn.green("File added:"),T),s.onAdd(A(T,"create")))}).on("change",async v=>{let T=v.replace(t,""),L=T.endsWith("log.txt");if(u&&L||w(T))return;let R=C(T);!s.onChange||!R||s.onChange(A(T,"update"))}).on("unlink",async v=>{let T=v.replace(t,""),L=C(T),R=T.endsWith("log.txt");u&&R||w(T)||!s.onUnlink||!L||s.onUnlink(A(T,"delete"))}).on("ready",()=>{p||console.log(pn.magenta("watching:"),y,"files")}),I}import Ye from"node:path";function _t(e,t){let r=t?Ye.dirname(t):e,o=Ye.relative(e,r);if(!o||o==="."||o.startsWith("..")||Ye.isAbsolute(o))return[e];let n=o.split(Ye.sep).filter(Boolean),s=[e];for(let i=1;i<=n.length;i++)s.push(Ye.join(e,...n.slice(0,i)));return s}import Wm from"fs-extra";import{homedir as Yi}from"node:os";import Hi from"node:path";import dn from"lodash";var de=new Map,gn=Symbol.for("tim.resolvedGalleryImports");function Le(e=[]){for(let t of e){if(!t.name||!t.config||typeof t.config!="object")throw new TypeError("Each IO gallery must provide a non-empty name and config object.");de.set(t.name,t);for(let r of t.aliases||[])de.set(r,t)}}function fn(e){return e[gn]??[]}function ge(){return process.env.TIM_PROMPTS_HOME||Hi.join(Yi(),".tim","prompts")}function Xi(e,t){return Object.defineProperty(e,gn,{value:[...t],enumerable:!1,configurable:!0}),e}function Zi(e){let{import:t,...r}=e;return r}function Qi(e){return typeof e=="string"?e.trim()?[e.trim()]:[]:Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.trim()).filter(Boolean):[]}function yn(e,t){if(typeof e=="string"){t(e);return}if(Array.isArray(e))for(let r of e)yn(r,t)}function ea(e){let t=new Set,r=e.triggers;if(!r||typeof r!="object")return t;for(let o of Object.values(r))if(!(!o||typeof o!="object"))for(let n of Object.values(o))yn(n,s=>{de.has(s)&&t.add(s)});return t}function ta(e,t,r){let o=e.config?.triggers?.[t],n=o?.[r];if(typeof n=="string"&&!de.has(n))return n;if(o&&typeof o=="object"){for(let s of Object.values(o))if(typeof s=="string"&&!de.has(s))return s}throw new Error(`IO gallery "${e.name}" does not define an entry command for ${t}.`)}function ra(e){let t=e.triggers;if(!(!t||typeof t!="object")){for(let[r,o]of Object.entries(t))if(!(!o||typeof o!="object"))for(let[n,s]of Object.entries(o))typeof s=="string"&&de.has(s)&&(o[n]=ta(de.get(s),r,n))}}function oa(e,t,r){if(t.has(e))throw new Error(`Circular IO gallery import detected: ${[...t,e].join(" -> ")}`);let o=de.get(e);if(!o)throw new Error(`Unknown IO gallery import: ${e}`);r.add(o.name),t.add(e);let n=pe(o.config,t,r);return t.delete(e),n}function pe(e,t=new Set,r=new Set){if(!e||typeof e!="object")return e;let o=new Set(Qi(e.import));for(let s of ea(e))o.add(s);let n={};for(let s of o)dn.merge(n,oa(s,t,r));return dn.merge(n,Zi(e)),ra(n),Xi(n,r)}function bn(e){return e.file.startsWith("/_requests/")&&e.sessionFull?e.sessionFull:e.fileFull}var Nt=(e,t,r={},o)=>{let n={},{paths:s}=e,{rootFull:i}=s,a=bn(s),u=[];t==="_prompts"&&u.push({dirPath:ge(),fs:{existsSync:Lt.existsSync,readdirSync:Lt.readdirSync,readFileSync:Lt.readFileSync,readJsonSync:p=>JSON.parse(Lt.readFileSync(p,"utf-8"))}}),u.push(..._t(i,a).map(p=>({dirPath:Ne.join(p,t),fs:o})));for(let{dirPath:p,fs:d}of u){if(!d.existsSync(p))continue;let f=d.readdirSync(p).filter(m=>m.endsWith(".md"));for(let m of f){let h=Ne.basename(m),y=Ne.parse(h).name;y.includes(".")&&(y=y.split(".").pop());let I="";I=d.readFileSync(Ne.join(p,m),"utf-8"),I=I.trim().replace(`
7
+ `,"");let A=t==="voices"?"voiceId":"promptTemplate";n[y]={[A]:na(I,r)};let C=m.replace(".md",".schema.json"),w=Ne.join(p,C);if(d.existsSync(w)){let v=d.readJsonSync(w);n[y].schema=v}}}return n},vn=(e,t)=>{let r={},o=new Set,{paths:n}=e,{rootFull:s}=n,i=bn(n),a=_t(s,i).map(u=>Ne.join(u,"config.json"));for(let u of a){if(!t.existsSync(u))continue;let p=pe(t.readJsonSync(u),new Set,o);hn.merge(r,p)}return pe(r,new Set,o)};function na(e,t){return e.replace(/\$\{([^}]+)\}/g,(r,o)=>{let n=String(o).trim(),s=hn.get(t,n);return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s,null,2)})}var te=e=>({resolveConfig:t=>vn(t,e),resolveLibrary:(t,r,o={})=>Nt(t,r,o,e),resolvePrompts:(t,r={})=>{let o=fn(t.config||{}),n=ge();if(o.length>0&&!sa.existsSync(n))throw new Error(`IO gallery prompts were not found at ${n}. Run "tim init" to install gallery prompts.`);return Nt(t,"_prompts",r,e)},resolveVoices:t=>Nt(t,"voices",{},e)});var Pe=()=>({prepareTextToTextRequest(e,t){let{promptId:r,inject:o,extra:n}=t,s=te(Q()),i=o??{...e.settings,...e.params,fileContent:e.fileContent?.text},a=s.resolvePrompts(e,i),u=Y(e.settings,"llm",{provider:t.provider,model:t.model,providerOptions:t.providerOptions}),{provider:p,model:d,providerOptions:f}=u,m=we.get(a,[r,"promptTemplate"],""),h=we.get(a,[r,"schema"],{});if(!m)throw new Error(`No prompt template found for promptId: ${r}`);let y={provider:p,model:d,prompt:m,schema:h,providerOptions:f,...n||{}};return we.pickBy(y,I=>I!=null&&I!=="")},prepareTtsRequest(e,t){let{text:r,prompt:o,promptId:n,inject:s}=t,i=te(Q()),a=s??{...e.settings,...e.params,fileContent:e.fileContent?.text};if(n&&!o&&!r){let m=i.resolvePrompts(e,a);o=we.get(m,[n,"promptTemplate"],"")}if(r=(r||o||e.fileContent?.text||"").trim(),!r)throw new Error("No TTS text found in prompt template or source file content.");let u=Y(e.settings,"tts",{provider:t.provider,model:t.model,voiceId:t.voiceId,outputFormat:t.outputFormat,speed:t.speed,instructions:t.instructions,providerOptions:t.providerOptions}),p=u.voiceId||t.voiceId,d=u.model||"eleven_v3",f=cn(e,t.languageCode);return we.pickBy({provider:u.provider,text:r,voiceId:p,model:d,outputFormat:u.outputFormat,speed:u.speed,instructions:u.instructions,providerOptions:u.providerOptions,...t.extra||{},...f?{languageCode:f}:{}},m=>m!=null&&m!=="")},prepareImageRequest(e,t,r={}){let{prompt:o,promptId:n,inject:s}=t,i=Y(e.settings,"image",{provider:t.provider,model:t.model,size:t.size,aspectRatio:t.aspectRatio,imageSize:t.imageSize,quality:t.quality,outputFormat:t.outputFormat,background:t.background,moderation:t.moderation,n:t.n,outputCompression:t.outputCompression,reference:t.reference,references:t.references,referenceImagePath:t.referenceImagePath,referenceImagePaths:t.referenceImagePaths,referenceType:t.referenceType,referenceTypes:t.referenceTypes,providerOptions:t.providerOptions}),a=te(Q()),u=s??{...e.settings,...e.params,fileContent:e.fileContent?.text};if(n&&!o){let d=a.resolvePrompts(e,u);o=we.get(d,[n,"promptTemplate"],"")}if(o||(o=e.fileContent?.text??""),o=(o??"").trim(),!o)throw new Error("No image prompt found in prompt template or source file content.");return we.pickBy({provider:i.provider,model:i.model,prompt:o,size:i.size,aspectRatio:i.aspectRatio,imageSize:i.imageSize,quality:i.quality,outputFormat:i.outputFormat,background:i.background,moderation:i.moderation,n:i.n,outputCompression:i.outputCompression,reference:i.reference,references:i.references,referenceImagePath:i.referenceImagePath,referenceImagePaths:i.referenceImagePaths,referenceType:i.referenceType,referenceTypes:i.referenceTypes,providerOptions:i.providerOptions,...r||{}},d=>d!=null&&d!=="")}});import{createAnthropic as ua}from"@ai-sdk/anthropic";import{createAzure as ca}from"@ai-sdk/azure";import{createByteDance as pa}from"@ai-sdk/bytedance";import{createElevenLabs as ma}from"@ai-sdk/elevenlabs";import{createGoogleGenerativeAI as la}from"@ai-sdk/google";import{createHuggingFace as da}from"@ai-sdk/huggingface";import{createOpenAI as ga}from"@ai-sdk/openai";import{createXai as fa}from"@ai-sdk/xai";import{Output as ya,experimental_generateSpeech as ha,experimental_generateVideo as ba,experimental_transcribe as va,generateImage as Ia,generateText as Ot,jsonSchema as Sa}from"ai";var ie={inputCost:0,cachedInputCost:0,outputCost:0,totalCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0}};var In={currency:"USD",unit:"perMillionTokens",updatedAt:"2026-07-15",providers:{openai:{models:{"gpt-image-1.5":{aliases:["gpt-image-1.5-2025-12-16"],input:5,cachedInput:1.25,output:32},"gpt-image-2":{aliases:["gpt-image-2-2026-04-21"],input:5,cachedInput:1.25,output:30}}},google:{models:{"gemini-2.5-flash-image":{input:.3,cachedInput:0,output:30},"gemini-3-pro-image":{aliases:["gemini-3-pro-image-preview","nano-banana-pro-preview"],input:2,cachedInput:0,output:120}}},bytedance:{models:{}}}};function aa(e,t){let r=In.providers[e.toLowerCase()]?.models;if(!r)return;let o=t.replace(/^models\//,"").toLowerCase();return Object.entries(r).find(([n,s])=>n.toLowerCase()===o||s.aliases?.some(i=>i.toLowerCase()===o))?.[1]}function $r(e,t,r){let o=aa(e,t),n=Number(r?.inputTokens??r?.input_tokens??0),s=Number(r?.outputTokens??r?.output_tokens??0),i=Number(r?.cachedInputTokens??r?.input_tokens_details?.cached_tokens??0);if(!o||!n&&!s)return{...ie,breakdown:{...ie.breakdown,inputTokens:n,cachedTokens:i,billedInputTokens:Math.max(0,n-i),outputTokens:s}};let a=Math.max(0,n-i),u=a*o.input/1e6,p=i*o.cachedInput/1e6,d=s*o.output/1e6;return{inputCost:u,cachedInputCost:p,outputCost:d,totalCost:u+p+d,breakdown:{inputTokens:n,cachedTokens:i,billedInputTokens:a,outputTokens:s,audioTokens:0}}}function Dr(){return ga({apiKey:process.env.OPENAI_API_KEY})}function xn(){return ca({resourceName:process.env.AZURE_OPENAI_RESOURCE_NAME,baseURL:process.env.AZURE_OPENAI_BASE_URL,apiKey:process.env.AZURE_OPENAI_API_KEY||process.env.AZURE_API_KEY,apiVersion:process.env.AZURE_OPENAI_API_VERSION})}function jr(){return la({apiKey:process.env.GOOGLE_API_KEY})}function Cn(){return ma({apiKey:process.env.ELEVENLABS_API_KEY||process.env.ELEVEN_LABS_API_KEY})}function xa(){return ua({apiKey:process.env.ANTHROPIC_API_KEY})}function wn(){return fa({apiKey:process.env.XAI_API_KEY})}function Ca(){return da({apiKey:process.env.HUGGINGFACE_API_KEY||process.env.HF_TOKEN})}function Oe(e,t){try{e?.(t)}catch{}}function wa(e){let t=0;return pa({apiKey:process.env.ARK_API_KEY,fetch:async(r,o)=>{let n=await globalThis.fetch(r,o);if(!n.ok)return n;try{let s=(o?.method||(r instanceof Request?r.method:"GET")).toUpperCase(),i=r instanceof Request?r.url:String(r),a=await n.clone().json();if(s==="POST"&&/\/contents\/generations\/tasks\/?$/.test(i))Oe(e,{phase:"submitted",taskId:typeof a.id=="string"?a.id:void 0});else if(s==="GET"&&/\/contents\/generations\/tasks\//.test(i)){t+=1;let u=typeof a.status=="string"?a.status:"unknown";Oe(e,{phase:u==="succeeded"?"ready":"polling",status:u,taskId:typeof a.id=="string"?a.id:void 0,pollCount:t})}}catch{}return n}})}function Re(e,t){if(!t)throw new Error(`AI provider "${e}" requires an explicit model in settings or request.`);return t}function Mr(e,t){let r=ne(e)||se(t,"llm");if(r==="azure"){let o=Re("azure",t);return{provider:"azure",model:o,sdkModel:xn()(o)}}if(r==="anthropic"){let o=Re("anthropic",t);return{provider:"anthropic",model:o,sdkModel:xa()(o)}}if(r==="xai"){let o=Re("xai",t);return{provider:"xai",model:o,sdkModel:wn()(o)}}if(r==="huggingface"){let o=Re("huggingface",t);return{provider:"huggingface",model:o,sdkModel:Ca()(o)}}if(r==="bytedance")throw new Error("The @ai-sdk/bytedance provider is installed for video generation, but TIM does not have a ByteDance LLM executor yet.");return r==="google"?{provider:"google",model:t||"gemini-2.5-pro",sdkModel:jr()(t||"gemini-2.5-pro")}:{provider:"openai",model:t||"gpt-5.2",sdkModel:Dr()(t||"gpt-5.2")}}function Pa(e,t,r){let o=ne(e)||se(t,"video");if(o!=="bytedance")throw new Error(`AI provider "${o||"unknown"}" is not supported for TIM video generation.`);let n=t||"dreamina-seedance-2-0-260128";return{provider:"bytedance",model:n,sdkModel:wa(r).video(n)}}function Ta(e,t){let r=ne(e)||se(t,"image");if(r==="xai"){let o=Re("xai",t);return{provider:"xai",model:o,sdkModel:wn().image(o)}}if(r==="anthropic"||r==="huggingface"||r==="bytedance")throw new Error(`AI provider "${r}" is not supported for TIM image generation.`);if(r==="google"){let o=Fa(t);return{provider:"google",model:o,sdkModel:jr().image(o)}}return{provider:"openai",model:t||"gpt-image-1",sdkModel:Dr().image(t||"gpt-image-1")}}function Fa(e){let t={FLASH2_5:"gemini-2.5-flash-image",NANO_BANANA_PRO:"nano-banana-pro-preview",GEMINI_3_PRO:"gemini-3-pro-image-preview"};return e?t[e]||e:"gemini-2.5-flash-image"}function Aa(e){let t=Buffer.from(e);return t.subarray(0,3).equals(Buffer.from([255,216,255]))?"image/jpeg":t.subarray(0,8).equals(Buffer.from([137,80,78,71,13,10,26,10]))?"image/png":t.subarray(0,4).toString("ascii")==="GIF8"?"image/gif":t.subarray(0,4).toString("ascii")==="RIFF"&&t.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":"image/jpeg"}function ka(e){if(typeof e=="string")return e;let t=Buffer.from(e);return`data:${Aa(t)};base64,${t.toString("base64")}`}async function Ea(e,t){let o=e.providerOptions?.bytedance||e.providerOptions||{},n=o.apiKey||process.env.ARK_API_KEY,s=o.baseURL||process.env.ARK_BASE_URL||"https://ark.ap-southeast.bytepluses.com/api/v3";if(!n)throw new Error("ByteDance image generation requires ARK_API_KEY.");let{apiKey:i,baseURL:a,responseFormat:u,response_format:p,outputFormat:d,output_format:f,...m}=o,h=e.referenceImages?.map(ka),y=await globalThis.fetch(`${s.replace(/\/$/,"")}/images/generations`,{method:"POST",headers:{Authorization:`Bearer ${n}`,"Content-Type":"application/json"},body:JSON.stringify({...m,model:t,prompt:e.prompt,...h?.length?{image:h.length===1?h[0]:h}:{},...e.size||e.imageSize?{size:e.size||e.imageSize}:{},output_format:e.outputFormat||d||f||"jpeg",response_format:u||p||"b64_json"})}),I=await y.json();if(!y.ok)throw new Error(`ByteDance image generation failed (${y.status}): ${I?.error?.message||y.statusText}`);let A=I?.data?.find(w=>w?.b64_json||w?.url);if(!A){let w=I?.data?.find(v=>v?.error)?.error?.message;throw new Error(`ByteDance image generation returned no image${w?`: ${w}`:"."}`)}let C;if(A.b64_json)C=Buffer.from(A.b64_json,"base64");else{let w=await globalThis.fetch(A.url);if(!w.ok)throw new Error(`ByteDance image download failed (${w.status}): ${w.statusText}`);C=Buffer.from(await w.arrayBuffer())}return Ve(e.outputPath,C),{provider:"bytedance",model:I.model||t,usage:I.usage||{},cost:$r("bytedance",I.model||t,I.usage),outputFormat:e.outputFormat||d||f||"jpeg",providerMetadata:{bytedance:{created:I.created,size:A.size}},warnings:[]}}function _a(e,t){return(ne(e)||se(t,"tts"))==="openai"?{provider:"openai",model:t||"tts-1",sdkModel:Dr().speech(t||"tts-1")}:{provider:"elevenlabs",model:t||"eleven_v3",sdkModel:Cn().speech(t||"eleven_v3")}}function La(e,t){let r=ne(e)||se(t,"transcription");if(r==="elevenlabs"){let o=t||"scribe_v2";return{provider:"elevenlabs",model:o,sdkModel:Cn().transcription(o)}}if(r==="azure"){let o=Re("azure",t);return{provider:"azure",model:o,sdkModel:xn().transcription(o)}}if(r!=="google")throw new Error(`AI SDK transcription is only implemented for Google/Gemini, Azure, and ElevenLabs. Received provider "${r||"unknown"}".`);return{provider:"google",model:t||"gemini-2.5-flash",sdkModel:jr()(t||"gemini-2.5-flash")}}function $e(e){let t=Number(e?.inputTokens??e?.input_tokens??0),r=Number(e?.outputTokens??e?.output_tokens??0),o=Number(e?.totalTokens??e?.total_tokens??t+r),n=Number(e?.cachedInputTokens??e?.input_tokens_details?.cached_tokens??e?.cacheCreationInputTokens??0);return{input_tokens:t,input_tokens_details:{cached_tokens:n},output_tokens:r,total_tokens:o}}function Na(e){let n=e.input_tokens_details?.cached_tokens??0,s=Math.max(0,e.input_tokens-n),i=s*125e-8,a=n*125e-9,u=e.output_tokens*1e-5;return{inputCost:i,cachedInputCost:a,outputCost:u,totalCost:i+a+u,breakdown:{inputTokens:e.input_tokens,cachedTokens:n,billedInputTokens:s,outputTokens:e.output_tokens,audioTokens:0}}}function Oa(e,t){let r=t.replace(/^models\//,"").toLowerCase(),o=e.input_tokens,n=e.input_tokens_details?.cached_tokens??0,s=Math.max(0,o-n),i=e.output_tokens,a=.3,u=.03,p=2.5;(r.startsWith("gemini-2.5-pro")||r.startsWith("gemini-3-pro"))&&(a=o>2e5?2.5:1.25,u=o>2e5?.25:.125,p=o>2e5?15:10);let d=s*a/1e6,f=n*u/1e6,m=i*p/1e6;return{inputCost:d,cachedInputCost:f,outputCost:m,totalCost:d+f+m,breakdown:{inputTokens:o,cachedTokens:n,billedInputTokens:s,outputTokens:i,audioTokens:0}}}function Rt(e,t,r){let o=$e(r),n=o.input_tokens_details?.cached_tokens??0;return!o.input_tokens&&!o.output_tokens?ie:e==="google"?Oa(o,t):e==="openai"?Na(o):{...ie,breakdown:{inputTokens:o.input_tokens,cachedTokens:n,billedInputTokens:Math.max(0,o.input_tokens-n),outputTokens:o.output_tokens,audioTokens:0}}}function Sn(e){return!!(e&&typeof e=="object"&&Object.keys(e).length>0)}async function Ra(e){let{provider:t,model:r,sdkModel:o}=Mr(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkLlm: "prompt" is required.');let n=await Ot({model:o,prompt:e.prompt,providerOptions:e.providerOptions,...Sn(e.schema)?{output:ya.object({schema:Sa(e.schema),name:"schema"})}:{}}),s=Sn(e.schema)?n.output:n.text,i=$e(n.usage);return{output:s,usage:i,model:n.response?.modelId||r,provider:t,cost:Rt(t,r,i),providerMetadata:n.providerMetadata,warnings:n.warnings}}async function $a(e){let{provider:t,model:r,sdkModel:o}=Mr(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkText: "prompt" is required.');let n=await Ot({model:o,prompt:e.prompt,providerOptions:e.providerOptions}),s=n.text?.trim();if(!s)throw new Error("llm: Empty text response from model.");let i=$e(n.usage);return{output:s,usage:i,model:n.response?.modelId||r,provider:t,cost:Rt(t,r,i),providerMetadata:n.providerMetadata,warnings:n.warnings}}async function Jr(e){let{provider:t,model:r,sdkModel:o}=Mr(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkVisionText: "prompt" is required.');let n=await Ot({model:o,messages:[{role:"user",content:[{type:"text",text:e.prompt},{type:"image",image:e.image,...e.imageProviderOptions?{providerOptions:e.imageProviderOptions}:{}}]}],providerOptions:e.providerOptions}),s=n.text?.trim();if(!s)throw new Error("llm: Empty text response from model.");let i=$e(n.usage);return{output:s,usage:i,model:n.response?.modelId||r,provider:t,cost:Rt(t,r,i),providerMetadata:n.providerMetadata,warnings:n.warnings}}async function Pn(e){if((ne(e.provider)||se(e.model,"image"))==="bytedance"){if(!e.prompt)throw new Error('generateAiSdkImage: "prompt" is required.');return Ea(e,e.model||"seedream-5-0-260128")}let{provider:r,model:o,sdkModel:n}=Ta(e.provider,e.model);if(!e.prompt)throw new Error('generateAiSdkImage: "prompt" is required.');let s=e.imageSize,i=r==="google"&&!!(e.aspectRatio||s),a={...e.providerOptions||{},...r==="openai"?{openai:{...e.providerOptions?.openai||{},...e.quality?{quality:e.quality}:{},...e.background?{background:e.background}:{},...e.outputFormat?{outputFormat:e.outputFormat}:{},...typeof e.outputCompression=="number"?{outputCompression:e.outputCompression}:{},...e.moderation?{moderation:e.moderation}:{}}}:{},...i?{google:{...e.providerOptions?.google||{},responseFormat:e.providerOptions?.google?.responseFormat||[{type:"image",...e.aspectRatio?{aspectRatio:e.aspectRatio}:{},...s?{imageSize:s}:{}}]}}:{}},u=await Ia({model:n,prompt:e.referenceImages?.length?{text:e.prompt,images:e.referenceImages}:e.prompt,...e.n?{n:e.n}:{},...e.size&&r!=="google"?{size:e.size}:{},...e.aspectRatio&&!i?{aspectRatio:e.aspectRatio}:{},providerOptions:a}),p=u.image;if(!p)throw new Error("generateAiSdkImage: no image returned.");Ve(e.outputPath,Buffer.from(p.uint8Array));let d=u.providerMetadata?.openai?.images?.[0]?.revisedPrompt;return{provider:r,model:o,usage:u.usage||{},cost:$r(r,o,u.usage),outputFormat:e.outputFormat,revisedPrompt:d,providerMetadata:u.providerMetadata,warnings:u.warnings}}async function Br(e){if(!e.prompt)throw new Error('generateAiSdkVideo: "prompt" is required.');let{provider:t,model:r,sdkModel:o}=Pa(e.provider,e.model,e.onProgress);Oe(e.onProgress,{phase:"preparing"});try{let n=await ba({model:o,prompt:e.referenceImage?{text:e.prompt,image:e.referenceImage}:e.prompt,...e.aspectRatio?{aspectRatio:e.aspectRatio}:{},...e.resolution?{resolution:e.resolution}:{},...typeof e.duration=="number"?{duration:e.duration}:{},...typeof e.fps=="number"?{fps:e.fps}:{},...typeof e.seed=="number"?{seed:e.seed}:{},providerOptions:e.providerOptions}),s=Buffer.from(n.video.uint8Array);return Oe(e.onProgress,{phase:"downloaded",bytes:s.byteLength,mediaType:n.video.mediaType}),Ve(e.outputPath,s),Oe(e.onProgress,{phase:"written",bytes:s.byteLength,mediaType:n.video.mediaType}),{provider:t,model:r,mediaType:n.video.mediaType,providerMetadata:n.providerMetadata,warnings:n.warnings}}catch(n){throw Oe(e.onProgress,{phase:"failed",error:n instanceof Error?n.message:String(n)}),n}}async function Tn(e){let{provider:t,model:r,sdkModel:o}=_a(e.provider,e.model);if(!e.text)throw new Error('generateAiSdkSpeech: "text" is required.');if(!e.voiceId)throw new Error('generateAiSdkSpeech: "voiceId" is required.');let n=await ha({model:o,text:e.text,voice:e.voiceId,...e.outputFormat?{outputFormat:e.outputFormat}:{},...e.languageCode?{language:e.languageCode}:{},...typeof e.speed=="number"?{speed:e.speed}:{},...e.instructions?{instructions:e.instructions}:{},providerOptions:e.providerOptions});return{buffer:Buffer.from(n.audio.uint8Array),provider:t,model:r,voiceId:e.voiceId,outputFormat:n.audio.format||e.outputFormat||"mp3",mediaType:n.audio.mediaType,warnings:n.warnings,providerMetadata:n.providerMetadata}}function Da(e="audio.m4a"){let t=e.toLowerCase();return t.endsWith(".mp3")||t.endsWith(".mpeg")||t.endsWith(".mpga")?"audio/mpeg":t.endsWith(".wav")?"audio/wav":t.endsWith(".ogg")?"audio/ogg":t.endsWith(".webm")?"audio/webm":t.endsWith(".aac")?"audio/aac":t.endsWith(".mp4")||t.endsWith(".m4a")?"audio/mp4":t.endsWith(".flac")?"audio/flac":"audio/mp4"}function ja(e){let t=[e.prompt||"Transcribe the audio accurately. Do not summarize.","Return only the transcript text."];return e.language&&t.push(`The expected language hint is: ${e.language}.`),t.join(`
8
+ `)}async function Fn(e){let t=La(e.provider,e.model);if(t.provider!=="google"){let s=await va({model:t.sdkModel,audio:e.audio,providerOptions:e.providerOptions}),i=$e({});return{text:s.text,task:"transcribe",usage:i,model:t.model,provider:t.provider,cost:ie,providerMetadata:s.providerMetadata,warnings:s.warnings}}let r=await Ot({model:t.sdkModel,messages:[{role:"user",content:[{type:"text",text:ja(e)},{type:"file",data:e.audio,filename:e.fileName||"audio.m4a",mediaType:Da(e.fileName)}]}],providerOptions:e.providerOptions}),o=r.text?.trim();if(!o)throw new Error("transcription: Empty text response from model.");let n=$e(r.usage);return{text:o,task:"transcribe",usage:n,model:r.response?.modelId||t.model,provider:t.provider,cost:Rt(t.provider,t.model,n),providerMetadata:r.providerMetadata,warnings:r.warnings}}var zr=Ra,qr=$a;function Ur(e,t){let r=e?.[`ai-${t}`];return!!(r&&typeof r=="object"&&!Array.isArray(r))}function $t(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function Ma(e){return Object.fromEntries(Object.entries(e||{}).filter(([,t])=>t!=null&&t!==""))}function kn(e){return`ai-${e}`}function En(e){return String(e??"").trim().replace(/[\\/]/g,"-").replace(/\s+/g,"-").replace(/^\.+|\.+$/g,"")||void 0}function q(e,t){let r=En(t);return r?`${e}.${r}`:e}function Ja(e,t){let r=kn(t);if(!$t(e))throw new Error(`settings must be an object with a "${r}" section.`);let o=e[r];if(!$t(o))throw new Error(`settings.${r} must be an object.`);return o}function An(e,t){if(!$t(e)){let a=t.index===void 0?"output":`output variant at index ${t.index}`;throw new Error(`AI ${a} must be an object.`)}let r=En(e.suffix);if(t.requireSuffix&&!r)throw new Error(`AI output variant at index ${t.index} is missing a suffix.`);let{suffix:o,disabled:n,enabled:s,...i}=e;return{output:Ma(i),suffix:r}}function Ba(e){if(!("output"in e))throw new Error("AI command settings must include an output object or output array.");let{output:t}=e;if(Array.isArray(t)){if(!t.length)throw new Error("AI output array must include at least one variant.");let r=new Set;return t.flatMap((o,n)=>{if(!$t(o))throw new Error(`AI output variant at index ${n} must be an object.`);if(o.disabled===!0||o.enabled===!1)return[];let s=An(o,{index:n,requireSuffix:!0});if(s.suffix&&r.has(s.suffix))throw new Error(`Duplicate AI output suffix: ${s.suffix}`);return s.suffix&&r.add(s.suffix),[s]})}return[An(t,{requireSuffix:!1})]}function $(e,t){let r=Ja(e,t),o=kn(t),{output:n,...s}=r;return Ba(r).map(a=>({commandSettings:s,output:a.output,settings:{...e,[o]:{...s,output:a.output},...s,...a.output},suffix:a.suffix}))}import Gr from"lodash";import za from"openai";import{toFile as _n}from"openai/uploads";var qa={GPT_5_2:"gpt-5.2",GPT_5_1:"gpt-5.1",GPT_5:"gpt-5",GPT_5_MINI:"gpt-5-mini",GPT_5_NANO:"gpt-5-nano",GPT_5_PRO:"gpt-5-pro"},Dt;function jt(){if(Dt)return Dt;let e=process.env.OPENAI_API_KEY;if(!e)throw new Error("OPENAI_API_KEY is not configured");return Dt=new za({apiKey:e}),Dt}var Ua=1.25/1e6,Ga=.125/1e6,Va=10/1e6,Wa=e=>{let t=e.input_tokens_details?.cached_tokens??0,r=e.input_tokens-t,o=r*Ua,n=t*Ga,s=e.output_tokens*Va,i=o+n+s;return{inputCost:o,cachedInputCost:n,outputCost:s,totalCost:i,breakdown:{inputTokens:e.input_tokens,cachedTokens:t,billedInputTokens:r,outputTokens:e.output_tokens,audioTokens:0}}};var Ka=2.5/1e6,Ya=10/1e6,Ln=e=>{let t=e?.usage;if(t?.type==="duration")return{cachedInputCost:0,inputCost:0,totalCost:0,outputCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0,audioSeconds:t.seconds||0}};let r={cachedInputCost:0,inputCost:0,totalCost:0,outputCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0}};try{r.breakdown.inputTokens=Gr.get(e,"usage.input_tokens",0),r.breakdown.outputTokens=Gr.get(e,"usage.output_tokens",0),r.breakdown.audioTokens=Gr.get(e,"usage.input_token_details.audio_tokens",0),r.inputCost=r.breakdown.inputTokens*Ka,r.outputCost=r.breakdown.outputTokens*Ya,r.totalCost=r.inputCost+r.outputCost}catch{}return r};var Nn=async(e,t="audio.m4a",r={},o)=>{let{model:n="gpt-4o-transcribe",prompt:s,language:i}=r,u={file:await _n(e,t),model:n,stream:!0};s&&(u.prompt=s),i&&(u.language=i);let p=await jt().audio.transcriptions.create(u),d="",f;for await(let y of p){if(y.type==="transcript.text.delta"){d+=y.delta||"",o?.({type:"delta",text:d,usage:f});continue}y.type==="transcript.text.done"&&(d=y.text||d,f=y.usage,o?.({type:"done",text:d,usage:f}))}let m={text:d,task:"transcribe",usage:f},h=Ln(m);return{...m,cost:h}},On=async(e,t="audio.mp3",r={},o)=>{let n=typeof r=="function"?{}:r,s=typeof r=="function"?r:o,{model:i="gpt-4o-transcribe-diarize",prompt:a,language:u}=n,d={file:await _n(e,t),model:i,response_format:"diarized_json",chunking_strategy:"auto",stream:!0};a&&(d.prompt=a),u&&(d.language=u);let f=await jt().audio.transcriptions.create(d),m=[],h="",y;for await(let C of f){if(C.type==="transcript.text.segment"){m.push(C),s?.({type:"segment",segment:C,segments:[...m]});continue}if(C.type==="transcript.text.delta"){h+=C.delta||"",s?.({type:"delta",text:h,segments:[...m]});continue}C.type==="transcript.text.done"&&(h=C.text||h,y=C.usage,s?.({type:"done",text:h,usage:y,segments:[...m]}))}let I={text:h,task:"transcribe",duration:m.reduce((C,w)=>Math.max(C,Number(w.end)||0),0),segments:m,usage:y},A=Ln(I);return{...I,cost:A}},Vr=async e=>{let{model:t=qa.GPT_5_2,prompt:r,instructions:o}=e;if(!r)throw new Error('generateConvo: "prompt" is required in settings.');let s=(await jt().conversations.create()).id;if(!s)return{cost:{}};let i={model:t,conversation:s,instructions:r,input:[{role:"user",content:[{type:"input_text",text:r}]}]},a=await jt().responses.create(i),u=a.output_text??a.output?.[0]?.content?.[0]?.text;if(!u)throw new Error("llm: Empty text response from model.");let p=u,d=a.usage,f=Wa(d)??{};return{output:p,cost:f,conversationId:s}};import Rn from"lodash";import Wr from"path";function $n(e){return ne(e)}function Dn(e){return se(e,"image")}function O(e,t){let r=t.replace(/^image/,""),o=r?r.charAt(0).toLowerCase()+r.slice(1):t;return Rn.get(e,t)??Rn.get(e,["image",o])}function Ha(e){let t=e?.toLowerCase();return!t||t==="jpeg"?"jpg":t==="jpg"||t==="png"||t==="webp"?t:"jpg"}function He(...e){let t=[];for(let r of e){if(Array.isArray(r)){t.push(...He(...r));continue}let o=typeof r=="string"?r.trim():"";o&&t.push(o)}return t}function jn(e){return/^https?:\/\//i.test(e)||/^data:/i.test(e)}function Xa(e={},t={},r=process.cwd()){let o=He(e.referenceImagePath,e.referenceImagePaths,e.reference,e.references),n=He(O(t,"imageReferencePath"),O(t,"imageReferencePaths"),O(t,"reference"),O(t,"references")),s=o.length?o:n;return[...new Set(s)].map(i=>jn(i)||Wr.isAbsolute(i)?i:Wr.resolve(r,i))}function Za(e){return e.map(t=>{if(jn(t))return t;if(!M(t))throw new Error(`genai.images: reference image not found: ${t}`);return D(t)})}function Qa(e={},t={}){let r=He(e.referenceType,e.referenceTypes),o=He(O(t,"imageReferenceType"),O(t,"imageReferenceTypes"),O(t,"referenceType"),O(t,"referenceTypes"));return r.length?r:o}var eu={style:"Use the reference image for visual style: rendering language, palette, materials, lighting, texture, and mood. Do not copy its subject unless the prompt explicitly asks.",character:"Use the reference image for character identity and design: preserve recognizable features, proportions, clothing cues, and personality while following the prompt.",environment:"Use the reference image for the environment: preserve the location, spatial layout, architecture, background cues, materials, and atmosphere while following the prompt.",object:"Use the reference image for the object or product: preserve its shape, structure, material cues, scale, and distinctive details while following the prompt.",composition:"Use the reference image for composition: camera angle, framing, layout, depth, subject placement, and visual hierarchy.",palette:"Use the reference image for palette and material language: colors, contrast, surface qualities, and overall color temperature.",lighting:"Use the reference image for lighting: direction, softness, contrast, time of day, shadow character, and mood.",scenario:"Use the reference image for scenario: preserve the depicted situation, relationships between elements, activity, and environmental logic while following the prompt.",general:"Use the reference image as a general visual reference while following the prompt."};function tu(e,t){if(!t.length)return e;let r=[...new Set(t)].map(o=>{let n=o.trim().toLowerCase();return eu[n]||`Use the reference image as a ${o} reference.`});return`${e}
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 Xe(e={},t={}){return $n(e.provider)||$n(O(t,"imageProvider"))||Dn(e.model)||Dn(O(t,"imageModel"))||"google"}function Kr(e={},t={}){let r=Xe(e,t);return r==="openai"||r==="bytedance"?Ha(e.outputFormat||e.output_format||O(t,"imageOutputFormat")||"jpeg"):"jpg"}function Ze(e={},t={}){return{provider:Xe(e,t),model:e.model||O(t,"imageModel"),size:e.size||O(t,"imageSize"),aspectRatio:e.aspectRatio||O(t,"imageAspectRatio"),imageSize:e.imageSize||e.resolution||O(t,"googleImageSize")||O(t,"imageResolution"),quality:e.quality||O(t,"imageQuality"),outputFormat:e.outputFormat||e.output_format||O(t,"imageOutputFormat"),background:e.background||O(t,"imageBackground"),moderation:e.moderation||O(t,"imageModeration"),n:e.n||O(t,"imageN"),outputCompression:e.outputCompression||e.output_compression||O(t,"imageOutputCompression"),providerOptions:e.providerOptions||O(t,"imageProviderOptions")}}async function Yr(e,t,r={}){let o=Ze(e,r),n=Xa(e,r,Wr.dirname(t)),s=Za(n),i=Qa(e,r),a=tu(e.prompt||"",i);if(!a)throw new Error("genai.images: prompt is required.");return Pn({...o,prompt:a,outputPath:t,referenceImages:s})}import Mt from"lodash";import fe from"path";function Jt(e){return/^https?:\/\//i.test(e)||/^data:/i.test(e)}function Bt(e={},t={},r=process.cwd()){let o=Y(t,"video",e),n=String(o.referenceImagePath||o.reference||"").trim(),s=!!e.referenceImagePaths?.length,i=n||(!s&&M(fe.resolve(r,"ref.png"))?"ref.png":"");return!i||Jt(i)||fe.isAbsolute(i)?i||void 0:fe.resolve(r,i)}function zt(e=[],t=process.cwd()){return[...new Set(e.map(r=>r.trim()).filter(Boolean))].map(r=>Jt(r)||fe.isAbsolute(r)?r:fe.resolve(t,r))}function ru(e){if(!e||Jt(e))return e;if(!M(e))throw new Error(`genai.videos: reference image not found: ${e}`);return D(e)}function ou(e){let t=fe.extname(e).toLowerCase();return t===".jpg"||t===".jpeg"?"image/jpeg":t===".webp"?"image/webp":t===".gif"?"image/gif":t===".bmp"?"image/bmp":t===".tif"||t===".tiff"?"image/tiff":"image/png"}function nu(e){if(Jt(e))return e;if(!M(e))throw new Error(`genai.videos: reference image not found: ${e}`);return`data:${ou(e)};base64,${D(e).toString("base64")}`}async function Hr(e,t,r={}){let o=Y(r,"video",e),n=String(o.prompt||e.prompt||"").trim();if(!n)throw new Error("genai.videos: prompt is required.");let s=Bt(e,r,fe.dirname(t)),i=zt(e.referenceImagePaths,fe.dirname(t));if(s&&i.length)throw new Error("genai.videos: first-frame referenceImagePath cannot be combined with body reference images.");let a=Mt.merge({},o.providerOptions,i.length?{bytedance:{referenceImages:i.map(nu)}}:{});return Br({provider:o.provider||"bytedance",model:o.model,prompt:n,outputPath:t,referenceImage:ru(s),aspectRatio:o.aspectRatio,resolution:o.resolution,duration:Mt.isNumber(o.duration)?o.duration:void 0,fps:Mt.isNumber(o.fps)?o.fps:void 0,seed:Mt.isNumber(o.seed)?o.seed:void 0,providerOptions:a,onProgress:e.onProgress})}import{promises as su}from"node:fs";import iu from"sharp";async function Xr(e){let[t,r]=await Promise.all([iu(e).metadata(),su.stat(e)]);return{path:e,format:t.format,width:t.width,height:t.height,density:t.density,hasAlpha:t.hasAlpha,pages:t.pages,sizeBytes:r.size}}var Zr=(e,t=.22)=>e/60*t;import{spawn as au}from"node:child_process";function Qr(e,t,r=[]){return e.includes(t)?e:[t,...r,...e]}function Jn(e,t,r={}){let{collectStdout:o=!0}=r;return new Promise((n,s)=>{let i=au(e,t,{stdio:["ignore",o?"pipe":"ignore","pipe"]}),a="",u="";i.stdout?.on("data",p=>{a+=p.toString()}),i.stderr?.on("data",p=>{u+=p.toString()}),i.on("error",s),i.on("close",p=>{if(p===0){n(a);return}s(new Error(`${e} exited with code ${p}: ${u||a}`))})})}async function Bn(e,t={}){let{hideBanner:r=!0,logLevel:o="error",overwrite:n=!0}=t,s=[...e];n&&(s=Qr(s,"-y")),o&&(s=Qr(s,"-loglevel",[o])),r&&(s=Qr(s,"-hide_banner")),await Jn("ffmpeg",s,{collectStdout:!1})}async function qt(e){let t=await Jn("ffprobe",["-hide_banner","-v","error","-show_entries","format=duration","-of","default=noprint_wrappers=1:nokey=1",e]),r=Number(t.trim());if(!Number.isFinite(r)||r<=0)throw new Error(`Could not determine audio duration for ${e}`);return r}async function eo(e){await Bn(["-ss",String(e.start),"-t",String(e.duration),"-i",e.inputPath,"-map","0:a:0","-ac",String(e.channels??1),"-ar",String(e.sampleRate??16e3),"-c:a",e.codec??"aac","-b:a",e.bitrate??"48k",e.outputPath])}async function zn(e){await Bn(["-i",e.inputPath,"-vn","-ac",String(e.channels??1),"-ar",String(e.sampleRate??16e3),"-b:a",e.bitrate??"24k",e.outputPath])}async function to(e){return qt(e)}import{ElevenLabsClient as uu}from"@elevenlabs/elevenlabs-js";import cu from"path";var Ut;function pu(){return Ut||(Ut=new uu({apiKey:process.env.ELEVENLABS_API_KEY||process.env.ELEVEN_LABS_API_KEY}),Ut)}async function mu(e,t,r={}){let{modelId:o="eleven_v3",languageCode:n,outputFormat:s="mp3_44100_128"}=r,a=(await pu().textToSpeech.convert(t,{text:e,modelId:o,...n?{languageCode:n}:{},outputFormat:s})).getReader(),u=[],p,d;for(;{done:p,value:d}=await a.read(),!p;)u.push(d);return{buffer:Buffer.concat(u),provider:"elevenlabs-native",model:o,voiceId:t,outputFormat:s}}var ro=async(e,t,r,o={})=>{if(r){let n=oe(),s=cu.join(n,"beep.mp3");return Ue("Debug speech mode returning beep audio",{kind:"diagnostic",level:"debug",data:{beepPath:s}}),{buffer:D(s),provider:"debug",model:o.modelId||"beep",voiceId:t,outputFormat:"mp3"}}return o.provider==="native-elevenlabs"||o.provider==="elevenlabs-native"?mu(e,t,o):Tn({provider:o.provider||"elevenlabs",text:e,voiceId:t,model:o.modelId||"eleven_v3",languageCode:o.languageCode,outputFormat:o.outputFormat||"mp3_44100_128",speed:o.speed,instructions:o.instructions,providerOptions:o.providerOptions})};import lu from"p-limit";import Qe from"node:fs";import du from"node:os";import Te from"node:path";var so=13,et={extension:"m4a",codec:"aac",channels:1,sampleRate:16e3,bitrate:"48k"},Gn=300,Vn=2,gu=24,fu="gpt-4o-transcribe",yu="gpt-4o-transcribe-diarize",hu="gemini-2.5-flash",bu=2e3,vu=1e4,Wn=/\.(m4a|mp3|mp4|mpeg|mpga|ogg|wav|webm)$/i;function Vt(e,t){let r=Number(e);return Number.isFinite(r)&&r>0?r:t}function Gt(e,t){return Math.max(1,Math.floor(Vt(e,t)))}function qn(e,t){if(typeof e=="boolean")return e;if(typeof e=="string"){if(["true","1","yes"].includes(e.toLowerCase()))return!0;if(["false","0","no"].includes(e.toLowerCase()))return!1}return t}function Iu(e){return e.replace(Wn,"")}function Su(e){return`_parts/${e.replace(/\.[^.]+$/,".transcript.json")}`}function oo(e){if(typeof e!="string")return;let t=e.toLowerCase();if(t==="diarized")return"diarized";if(t==="chunked")return"chunked"}function xu(e){let t=e?.transcriptionDefinition??e?.transcription;return typeof t=="string"?{mode:t}:t&&typeof t=="object"?t:{}}function io(e){let t=e.settings||{},r=xu(t),o=Y(t,"transcription"),s=oo(r.mode)||oo(r.type)||oo(t.transcriptionMode)||(qn(r.diarize??t.transcriptionDiarize,!1)?"diarized":void 0)||"chunked",i=Vt(r.maxUploadMb??t.maxTranscriptionUploadMb,gu),a=o.model||(s==="chunked"?t.model:void 0)||(o.provider==="google"?hu:void 0)||(s==="diarized"?yu:fu),u=s==="diarized"?vu:bu;return{mode:s,provider:o.provider||"openai",model:a,providerOptions:o.providerOptions,prompt:r.prompt??t.transcriptionPrompt,language:r.language??t.transcriptionLanguage,partSeconds:Vt(r.partSeconds??t.transcriptionPartSeconds,Gn),overlapSeconds:Vt(r.overlapSeconds??t.transcriptionOverlapSeconds,Vn),parallelLimit:Gt(r.parallelLimit??t.transcriptionParallelLimit,so),maxUploadMb:i,maxUploadBytes:i*1024*1024,progressWriteIntervalMs:Gt(r.progressWriteIntervalMs??t.transcriptionProgressWriteIntervalMs,u),waitForStableFile:qn(r.waitForStableFile??t.transcriptionWaitForStableFile,!0),stableFileSamples:Gt(r.stableFileSamples??t.transcriptionStableFileSamples,3),stableFileIntervalMs:Gt(r.stableFileIntervalMs??t.transcriptionStableFileIntervalMs,1e3)}}function Wt(e){let t=Iu(e);return{baseName:t,progressFileName:`_transcript/_transcribing.${t}.json`,partialTextFileName:`_partial/_partial.${t}.transcript.txt`,partialJsonFileName:`_partial/_partial.${t}.transcript.json`,finalTextFileName:`${t}.transcript.txt`,finalJsonFileName:`${t}.transcript.json`,metaFileName:`_transcript.${t}.meta.json`,manifestFileName:`_parts/${t}.parts.json`}}function ao(e){let t=e.partSeconds??Gn,r=e.overlapSeconds??Vn,o=[];for(let n=0,s=0;n<e.duration;n+=t,s+=1){let i=Math.min(e.duration,n+t),a=Math.max(0,n-r),u=Math.min(e.duration,i+r),p=`${e.baseName}.part-${String(s).padStart(3,"0")}.${et.extension}`;o.push({index:s,fileName:p,start:a,end:u,duration:u-a,nominalStart:n,nominalEnd:i,overlapBefore:n-a,overlapAfter:u-i})}return o}function Kt(e){return N().statSync(e).size}function Kn(e,t){return Lr(e,Te.join("_parts",t),{forWrite:!0})}function no(e){return D(e).length}function Cu(e,t){let r=Lr(e,t);if(!M(r))return null;let o=xt(r),n=Array.isArray(o.parts)?o.parts:[];if(!n.length)return null;let s=n.map(a=>({...a,fullPath:Kn(e,a.fileName)}));return s.every(a=>a.fileName&&M(a.fullPath))?s:null}async function wu(e,t){let r=E(e),o=await qt(e.paths.fileFull),n=ao({baseName:t.baseName,duration:o,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds}),s=[];r.session.ensureDir("_parts");for(let i of n){let a=Kn(e,i.fileName);await eo({inputPath:e.paths.fileFull,outputPath:a,start:i.start,duration:i.duration,channels:et.channels,sampleRate:et.sampleRate,codec:et.codec,bitrate:et.bitrate});let u=no(a);if(u>t.maxUploadBytes&&(await eo({inputPath:e.paths.fileFull,outputPath:a,start:i.start,duration:i.duration,channels:1,sampleRate:16e3,codec:"aac",bitrate:"48k"}),u=no(a)),u>t.maxUploadBytes)throw new Error(`${i.fileName} is still larger than max upload size after compression.`);s.push({...i,sizeBytes:u,fullPath:a})}return r.session.write(t.manifestFileName,{sourceFileName:e.fileName,sourcePath:e.paths.file,duration:o,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,parts:s.map(({fullPath:i,...a})=>a)}),s}async function Pu(e,t){E(e).session.ensureDir("_parts");let o=Cu(e,t.manifestFileName);return o?o.map(n=>({...n,sizeBytes:n.sizeBytes??no(n.fullPath)})):wu(e,t)}function Un(e){return e.map(t=>t.trim()).filter(Boolean).join(`
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.1",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"];function Ds(e){let t=Cc.map((r,o)=>o<3?K.cyan(r):K.magenta(r));console.log(`
14
+ `)}function Tu(e){return e.map(t=>t.text).filter(Boolean).join(`
15
+ `)}function Fu(e){let t={cachedInputCost:0,inputCost:0,outputCost:0,totalCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0,audioSeconds:0}};for(let r of e){let o=r.cost||{};t.cachedInputCost+=Number(o.cachedInputCost||0),t.inputCost+=Number(o.inputCost||0),t.outputCost+=Number(o.outputCost||0),t.totalCost+=Number(o.totalCost||0);for(let n of Object.keys(t.breakdown))t.breakdown[n]+=Number(o.breakdown?.[n]||0)}return t}function Au(e){return new Promise(t=>setTimeout(t,e))}async function Yn(e,t,r){let o=-1,n=0;for(;n<t;){let s=Kt(e);s>0&&s===o?n+=1:(n=0,o=s),n<t&&await Au(r)}return o}function ku(e){return M(e)?D(e):Qe.readFileSync(e)}async function Eu(e,t,r){let o=Kt(e);if(o<=r)return{uploadPath:e,cleanup:()=>{},originalSizeBytes:o,uploadSizeBytes:o,compressed:!1};let n=Qe.mkdtempSync(Te.join(du.tmpdir(),"tim-transcribe-audio-")),s=Te.join(n,`${t}.transcribe.mp3`);await zn({inputPath:e,outputPath:s,channels:1,sampleRate:16e3,bitrate:"24k"});let i=Qe.statSync(s).size;if(i>r)throw Qe.rmSync(n,{recursive:!0,force:!0}),new Error(`${t}.transcribe.mp3 is still larger than max upload size after compression.`);return{uploadPath:s,cleanup:()=>Qe.rmSync(n,{recursive:!0,force:!0}),originalSizeBytes:o,uploadSizeBytes:i,compressed:!0}}async function _u(e,t){let{fileName:r}=e,o=E(e),n=Wt(r),s=Date.now(),i=0;if(o.session.exists(n.finalJsonFileName)||o.session.exists(n.finalTextFileName)){o.session.addToLog("Transcript already exists",{type:"skip"});return}let a=(u,p={},d=!1)=>{let f=Date.now();!d&&f-i<t.progressWriteIntervalMs||(i=f,o.session.write(n.progressFileName,{status:u,mode:t.mode,model:t.model,sourceFileName:r,outputFileName:n.finalJsonFileName,startedAt:s,updatedAt:f,elapsedMs:f-s,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,parallelLimit:t.parallelLimit,...p}))};try{o.session.addToLog(`Starting ${t.mode} transcription`,{data:{mode:t.mode,model:t.model}}),a("preparing-parts",{},!0);let u=t.waitForStableFile?await Yn(e.paths.fileFull,t.stableFileSamples,t.stableFileIntervalMs):Kt(e.paths.fileFull),p=await Pu(e,{baseName:n.baseName,manifestFileName:n.manifestFileName,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,maxUploadBytes:t.maxUploadBytes}),d=Array.from({length:p.length},()=>""),f=p.map(v=>({index:v.index,fileName:v.fileName,status:"pending"})),m=lu(t.parallelLimit),h=()=>{let v=Un(d);v&&o.session.write(n.partialTextFileName,`${v}
16
+ `)};a("transcribing",{stableSizeBytes:u,totalParts:p.length,completedParts:0,parts:f},!0);let y=await Promise.all(p.map(v=>m(async()=>{let T=f[v.index];T.status="transcribing",a("transcribing",{totalParts:p.length,parts:f});let L=Su(v.fileName);try{if(o.session.exists(L)){let be=o.session.read(L),ct=String(be.text||"");return d[v.index]=ct,T.status="done",h(),{...v,status:"skip",text:ct,usage:be.usage,cost:be.cost}}let R=D(v.fullPath),U=t.provider!=="openai"?await Fn({provider:t.provider,model:t.model,audio:R,fileName:v.fileName,prompt:t.prompt,language:t.language,providerOptions:t.providerOptions}):await Nn(R,v.fileName,{model:t.model,prompt:t.prompt,language:t.language},be=>{d[v.index]=be.text||d[v.index],h(),a("transcribing",{totalParts:p.length,parts:f,latestPartIndex:v.index,latestTextLength:d[v.index].length})});d[v.index]=U.text||d[v.index],T.status="done";let ke={...v,status:"done",text:d[v.index],usage:U.usage,cost:U.cost};return o.session.write(L,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,partFileName:v.fileName,index:v.index,start:v.start,end:v.end,duration:v.duration,nominalStart:v.nominalStart,nominalEnd:v.nominalEnd,overlapBefore:v.overlapBefore,overlapAfter:v.overlapAfter,text:ke.text,usage:ke.usage,cost:ke.cost}),h(),ke}catch(R){return T.status="error",{...v,status:"error",text:d[v.index],error:R?.message||"Unknown error"}}}))),I=y.filter(v=>v.status==="error");if(I.length){let v=new Error(`Failed to transcribe ${I.length}/${p.length} audio part(s) for ${r}`);throw a("error",{totalParts:p.length,completedParts:y.length-I.length,failedParts:I,parts:f},!0),v}let A=Un(y.map(v=>v.text)),C=Fu(y),w=Date.now();o.session.write(n.finalTextFileName,`${A.trim()}
17
+ `),o.session.write(n.finalJsonFileName,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,text:A,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,parallelLimit:t.parallelLimit,parts:y.map(({fullPath:v,...T})=>T)}),o.session.write(n.metaFileName,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,outputFileName:n.finalJsonFileName,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds,parallelLimit:t.parallelLimit,partCount:y.length,elapsedMs:w-s,usage:y.map(v=>v.usage),cost:C}),a("done",{totalParts:p.length,completedParts:y.length,textLength:A.length,cost:C,parts:f},!0),o.session.addToLog(`Wrote ${n.finalJsonFileName}`,{duration:w-s,data:{outputFileName:n.finalJsonFileName}})}catch(u){throw a("error",{error:u?.message||"Unknown error"},!0),u}}async function Lu(e,t){if(t.provider!=="openai")throw new Error(`${t.provider} transcription currently supports only mode "chunked", not "diarized".`);let{fileName:r,paths:o}=e,n=E(e),s=Wt(r),i=Date.now(),a=()=>{},u=0,p=0;if(n.session.exists(s.finalJsonFileName)){n.session.addToLog("Transcript already exists",{type:"skip"});return}let d=(f,m=!1)=>{let h=Date.now(),y=f.segmentCount??p;return m||h-u>=t.progressWriteIntervalMs||y>=p+10?(u=h,p=y,n.session.write(s.progressFileName,{status:"transcribing",mode:t.mode,model:t.model,sourceFileName:r,outputFileName:s.finalJsonFileName,startedAt:i,updatedAt:h,elapsedMs:h-i,...f}),!0):!1};try{n.session.addToLog(`Starting ${t.mode} transcription`,{data:{mode:t.mode,model:t.model}}),d({segmentCount:0,textLength:0},!0);let f=t.waitForStableFile?await Yn(o.fileFull,t.stableFileSamples,t.stableFileIntervalMs):Kt(o.fileFull),m=await Eu(o.fileFull,s.baseName,t.maxUploadBytes);a=m.cleanup,d({stage:m.compressed?"compressed-for-upload":"uploading-original",stableSizeBytes:f,originalSizeBytes:m.originalSizeBytes,uploadSizeBytes:m.uploadSizeBytes,maxUploadMb:t.maxUploadMb},!0);let h=ku(m.uploadPath),y=await On(h,Te.basename(m.uploadPath),{model:t.model,prompt:t.prompt,language:t.language},A=>{let C=A.segments.length,w=A.segments[C-1],v=A.text?.length||0;d({segmentCount:C,textLength:v,latestSegment:w,usage:A.usage},A.type==="done")&&(A.type==="segment"||A.type==="done")&&n.session.write(s.partialJsonFileName,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,text:A.text||Tu(A.segments),task:"transcribe",segments:A.segments,usage:A.usage,partial:A.type!=="done",updatedAt:Date.now()})});a(),a=()=>{};let I={mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,uploadFileName:Te.basename(m.uploadPath),originalSizeBytes:m.originalSizeBytes,uploadSizeBytes:m.uploadSizeBytes,compressedForUpload:m.compressed,text:y.text,duration:y.duration,task:y.task,segments:y.segments||[],usage:y.usage};n.session.write(s.finalJsonFileName,I),n.session.write(s.metaFileName,{mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,outputFileName:s.finalJsonFileName,duration:y.duration,originalSizeBytes:m.originalSizeBytes,uploadSizeBytes:m.uploadSizeBytes,compressedForUpload:m.compressed,usage:y.usage,cost:y.cost}),n.session.write(s.progressFileName,{status:"done",mode:t.mode,provider:t.provider,model:t.model,sourceFileName:r,outputFileName:s.finalJsonFileName,startedAt:i,updatedAt:Date.now(),elapsedMs:Date.now()-i,segmentCount:I.segments.length,textLength:I.text?.length||0,usage:y.usage}),n.session.addToLog(`Wrote ${s.finalJsonFileName}`,{duration:Date.now()-i,data:{outputFileName:s.finalJsonFileName}})}catch(f){throw a(),n.session.write(s.progressFileName,{status:"error",mode:t.mode,model:t.model,sourceFileName:r,updatedAt:Date.now(),error:f?.message||"Unknown error"}),f}}async function Nu(e){let{fileName:t,paths:r}=e;if(r.file.includes("/_parts/")||!Wn.test(t))return;let o=io(e);if(o.mode==="diarized"){await Lu(e,o);return}await _u(e,o)}function Ou(e){return Ur(e.settings,"transcription")?$(e.settings,"transcription").map(t=>({...e,fileName:q(e.fileName.slice(0,e.fileName.length-Te.extname(e.fileName).length),t.suffix)+Te.extname(e.fileName),settings:t.settings})):[e]}async function Fe(e){let t=Ou(e),r=await Promise.allSettled(t.map(n=>Nu(n))),o=r.filter(n=>n.status==="rejected");if(o.length){let n=`${o.length}/${r.length} configured transcription outputs failed`;throw new Error(n)}}function Ru(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(!e||typeof e!="object")return;let t=e;for(let r of["totalCost","costUSD","total","usd"]){let o=t[r];if(typeof o=="number"&&Number.isFinite(o))return o}}function Hn(e){return`${e.toFixed(e>=10?1:2)}s`}function H(e){let t=[`Created ${e.outputFileName}`],r=[e.provider,e.model].filter(n=>typeof n=="string"&&n.length>0).join("/");r&&t.push(r),e.width&&e.height&&t.push(`${e.width}\xD7${e.height}`),typeof e.mediaDurationSeconds=="number"&&t.push(`media ${Hn(e.mediaDurationSeconds)}`),typeof e.durationMs=="number"&&t.push(`generated ${Hn(e.durationMs/1e3)}`);let o=Ru(e.cost);return o!==void 0&&t.push(`$${o.toFixed(o<.01?4:2)}`),t.join(" \xB7 ")}var Xn=e=>({provider:"openai",model:e.fileContent?.model,outputFormat:"conversation JSON"});function $u(e){return Buffer.byteLength(typeof e=="string"?e:JSON.stringify(e??""))}var Yt=async e=>{let{fileName:t,fileContent:r,isDebug:o}=e,n=E(e);try{n.session.addToLog("Generating conversation response");let s=t.replace(".convo.json",".out.json"),i=t.replace(".convo.json",".meta.json"),{prompt:a,schema:u,model:p}=r,d=Date.now(),f=await Vr({prompt:a,model:p}),m=Date.now()-d,{conversationId:h=""}=f;n.session.write(s,f.output);let y={provider:"openai",model:p,cost:f.cost,duration:m/1e3,generationTimeMs:m,sourceFileName:t,outputFileName:s,conversationId:h,outputSizeBytes:$u(f.output)};return n.session.write(i,y),n.session.addToLog(H({outputFileName:s,provider:y.provider,model:y.model,cost:y.cost,durationMs:m}),{type:"output",duration:m,data:y}),n.session.patchSessionJson({conversationId:h}),{logData:y}}catch(s){throw s}};var uo={name:"ai-convo",run:Yt,lifecycle:{start:Xn}};var Zn=e=>{let t=Ze(e.fileContent,e.settings);return{provider:t.provider,model:t.model,quality:t.quality,size:t.size,imageSize:t.imageSize,aspectRatio:t.aspectRatio,outputFormat:t.outputFormat}},Ht=async e=>{let{fileName:t,fileContent:r,paths:o,settings:n}=e,s=E(e);try{s.session.addToLog("Generating image");let i=t.replace(/\.image\.json$/i,""),a=r,u=Kr(a,n),p=`${i}.${u}`,d=p.replace(/\.[^.]+$/,".meta.json"),f=`${o.sessionFull}/${p}`,m=Date.now(),h=await Yr(a,f,n),y=Date.now()-m,I=await Xr(f),A=D(f).byteLength,C=I.width||0,w=I.height||0,v=h.provider||Xe(a,n),T=h.model||a.model||n.imageModel,L=h.usage||{},R=co(Ze(a,n)),U={provider:v,model:T,usage:L,tokenUsage:L,cost:h.cost||ie,duration:y/1e3,generationTimeMs:y,modelParams:{...R,provider:v,model:T,outputFormat:h.outputFormat||u},sourceFileName:t,outputFileName:p,outputFormat:h.outputFormat||u,referenceImagePath:a.referenceImagePath,referenceImagePaths:a.referenceImagePaths,referenceType:a.referenceType,referenceTypes:a.referenceTypes,revisedPrompt:h.revisedPrompt,width:C,height:w,outputSizeBytes:A,ratio:C&&w?C/w:0};return s.session.write(d,U),s.session.addToLog(H({outputFileName:p,provider:v,model:T,cost:U.cost,durationMs:y,width:C,height:w}),{type:"output",duration:y,data:U}),{logData:U}}catch(i){throw i}};function co(e){return Array.isArray(e)?e.map(co):!e||typeof e!="object"?e:Object.fromEntries(Object.entries(e).map(([t,r])=>[t,/(api[-_]?key|access[-_]?token|secret|password|authorization)$/i.test(t)?"[redacted]":co(r)]))}var po={name:"ai-image",run:Ht,lifecycle:{start:Zn}};function Qn(e){return!!(e&&typeof e=="object"&&Object.keys(e).length>0)}function Du(e){return Buffer.byteLength(typeof e=="string"?e:JSON.stringify(e??""))}var es=e=>{let t=e.fileContent||{};return{provider:t.provider,model:t.model,outputFormat:Qn(t.schema)?"structured JSON":"Markdown"}},Xt=async e=>{let{fileName:t,fileContent:r,isDebug:o}=e,n=E(e);try{n.session.addToLog("Generating text response");let{prompt:s,schema:i,provider:a,model:u,providerOptions:p}=r,d=t.replace(".llm.json",Qn(i)?".out.json":".out.md"),f=t.replace(".llm.json",".meta.json"),m=Date.now(),h=await zr({provider:a,prompt:s,schema:i,model:u,providerOptions:p}),y=Date.now()-m;n.session.write(d,h.output);let I={provider:h.provider||a,model:h.model||u,usage:h.usage||{},cost:h.cost,duration:y/1e3,generationTimeMs:y,sourceFileName:t,outputFileName:d,providerMetadata:h.providerMetadata||{},warnings:h.warnings||[],outputSizeBytes:Du(h.output)};return n.session.write(f,I),n.session.addToLog(H({outputFileName:d,provider:I.provider,model:I.model,cost:I.cost,durationMs:y}),{type:"output",duration:y,data:I}),{logData:I}}catch(s){throw s}};var mo={name:"ai-llm",run:Xt,lifecycle:{start:es}};var ts=e=>{let t=e.fileContent||{};return{provider:t.provider,model:t.model,voiceId:t.voiceId,languageCode:t.languageCode,outputFormat:t.outputFormat,speed:t.speed}},Zt=async e=>{let{fileName:t,fileContent:r,isDebug:o}=e,n=E(e);try{n.session.addToLog("Generating speech");let s=t.replace(".tts.json",".mp3"),i=t.replace(".tts.json",".meta.json"),{text:a,voiceId:u,provider:p,model:d,languageCode:f,outputFormat:m,providerOptions:h,speed:y,instructions:I}=r,A=Date.now(),C=await ro(a,u,o,{provider:p,modelId:d,languageCode:f,outputFormat:m,providerOptions:h,speed:y,instructions:I}),w=Date.now()-A;n.session.write(s,C.buffer);let v=0;try{v=await to(`${e.paths.sessionFull}/${s}`)}catch(L){n.session.addToLog(`Could not measure ${s} duration`,{type:"warn",data:{error:L instanceof Error?L.message:String(L),outputFileName:s}})}let T={provider:C.provider,model:C.model||d,voiceId:C.voiceId||u,outputFormat:C.outputFormat||m,mediaType:C.mediaType,duration:Number(v.toFixed(2)),mediaDurationSeconds:Number(v.toFixed(2)),cost:Number(Zr(v).toFixed(4)),sourceFileName:t,outputFileName:s,warnings:C.warnings||[],providerMetadata:C.providerMetadata||{},generationTimeMs:w,outputSizeBytes:C.buffer.byteLength};return n.session.write(i,T),n.session.addToLog(H({outputFileName:s,provider:T.provider,model:T.model,cost:T.cost,durationMs:w,mediaDurationSeconds:T.duration}),{type:"output",duration:w,data:T}),{logData:T}}catch(s){throw s}};var lo={name:"ai-tts",run:Zt,lifecycle:{start:ts}};import rs from"path";import{parse as ju}from"yaml";var os=e=>{let t=ns(String(e.fileContent?.text||"")),o=$(e.settings,"video").map(({output:n})=>{let s={...e.fileContent,...n,...t.overrides};return{provider:s.provider,model:s.model,resolution:s.resolution,aspectRatio:s.aspectRatio,mediaDurationSeconds:s.duration,fps:s.fps}});return o.length===1?o[0]:{outputCount:o.length,outputs:o}};function Mu(e){return e.replace(/\.video\.json$/i,"").replace(/\.prompt\.(?:md|txt)$/i,"")}var Ju=["provider","model","aspectRatio","resolution","duration","fps","seed","reference","referenceImagePath","providerOptions"];function go(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function ns(e){let t=e.match(/^\uFEFF?---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)([\s\S]*)$/),r=t?ju(t[1]):void 0;if(r!=null&&!go(r))throw new Error("ai-video: Markdown frontmatter must be a YAML object.");let o=go(r)?r:{},n=go(o.video)?o.video:{},s=Object.fromEntries(Ju.flatMap(i=>{let a=n[i]??o[i];return a==null||a===""?[]:[[i,a]]}));return{...zu(t?t[2]:e),overrides:s}}var Bu=/!?\[[^\]]*\]\(([^)]+\.(?:jpe?g|png|webp|gif|bmp|tiff?|heic|heif))\)|@((?:\.{0,2}\/)?[^\s,;:!?()[\]{}]+\.(?:jpe?g|png|webp|gif|bmp|tiff?|heic|heif))/gi;function zu(e){let t=[],r=new Map;return{prompt:e.replace(Bu,(n,s,i)=>{let a=String(s||i).trim(),u=r.get(a);return u||(t.push(a),u=t.length,r.set(a,u)),`[Image ${u}]`}).trim(),referenceImagePaths:t}}var Qt=async e=>{let t=E(e),r=ns(String(e.fileContent?.text||"")),o=String(e.fileContent?.prompt||r.prompt).trim();if(!o)throw new Error("ai-video: prompt is required.");t.session.addToLog("Preparing video generation");let n=$(e.settings,"video"),s=[];for(let i of n){let a=`${q(Mu(e.fileName),i.suffix)}.mp4`,u=a.replace(/\.mp4$/i,".meta.json"),p=rs.join(e.paths.sessionFull,a),d={...e.fileContent,prompt:o,...i.output,...r.overrides,referenceImagePaths:r.referenceImagePaths},f=Date.now(),m=w=>{let v=typeof w.phase=="string"?w.phase:"progress";t.session.addToLog(`Video ${v}`,{data:{...w,elapsedSeconds:Number(((Date.now()-f)/1e3).toFixed(1)),outputFileName:a}})},h=Bt(d,i.settings,e.paths.sessionFull),y=zt(r.referenceImagePaths,e.paths.sessionFull);y.length&&t.session.addToLog(`Using ${y.length} reference image${y.length===1?"":"s"}`,{data:{count:y.length,files:y.map(w=>rs.basename(w)),outputFileName:a}});let I=await Hr({...d,onProgress:m},p,i.settings),A=Date.now()-f,C={provider:I.provider,model:I.model,mediaType:I.mediaType,duration:A/1e3,generationTimeMs:A,sourceFileName:e.fileName,outputFileName:a,referenceImagePath:h,referenceImagePaths:y,providerMetadata:I.providerMetadata,warnings:I.warnings,resolution:d.resolution,aspectRatio:d.aspectRatio,mediaDurationSeconds:d.duration,fps:d.fps,outputSizeBytes:D(p).byteLength};t.session.write(u,C),t.session.addToLog(H({outputFileName:a,provider:C.provider,model:C.model,durationMs:A}),{type:"output",duration:A,data:C}),s.push(C)}return{logData:s.length===1?s[0]:{outputCount:s.length,outputs:s}}};var fo={name:"ai-video",run:Qt,lifecycle:{start:os}};import ss from"path";function qu(e){return e.replace(/\.vision\.json$/i,"")}var is=e=>{let r=$(e.settings,"vision").map(({output:o})=>({provider:o.provider,model:o.model}));return r.length===1?r[0]:{outputCount:r.length,outputs:r}};function Uu(e){return e==="~"?process.env.HOME||e:e.replace(/^~(?=\/|\\)/,process.env.HOME||"~")}function Gu(e){let t=e.fileContent||{},r=t.imagePath||t.sourceImagePath||t.referenceImagePath||t.image||t.source;if(typeof r!="string"||!r.trim())throw new Error("ai-vision: imagePath is required.");let o=Uu(r.trim());return ss.isAbsolute(o)?o:ss.resolve(e.paths.sessionFull,o)}var er=async e=>{let t=E(e),r=e.fileContent||{},o=Gu(e),n=D(o),s=$(e.settings,"vision"),i=e.settings["ai-vision"]||{},a=String(r.prompt||i.prompt||"Describe this image accurately. Transcribe all visible text verbatim and distinguish observation from inference.").trim(),u=qu(e.fileName);t.session.addToLog(`Processing ${s.length} vision output${s.length===1?"":"s"}`,{data:{outputCount:s.length}});let p=await Promise.allSettled(s.map(async({output:m,suffix:h})=>{let y=h||m.provider||m.model||"output",I=`${u}.${y}.txt`,A=`${u}.${y}.meta.json`,C=Date.now();try{let w=await Jr({provider:m.provider,model:m.model,prompt:a,image:n,providerOptions:m.providerOptions,imageProviderOptions:m.imageProviderOptions}),v=`${w.output.trim()}
18
+ `;t.session.write(I,v);let T=Date.now()-C,L={provider:w.provider||m.provider,model:w.model||m.model,sourceFileName:e.fileName,sourceImagePath:o,outputFileName:I,prompt:a,elapsedMs:T,usage:w.usage||{},cost:w.cost,providerMetadata:w.providerMetadata||{},warnings:w.warnings||[],outputSizeBytes:Buffer.byteLength(v)};return t.session.write(A,L),t.session.addToLog(H({outputFileName:I,provider:L.provider,model:L.model,cost:L.cost,durationMs:T}),{type:"output",duration:T,data:L}),L}catch(w){throw t.session.write(`${u}.${y}.error.json`,{provider:m.provider,model:m.model,sourceFileName:e.fileName,sourceImagePath:o,prompt:a,elapsedMs:Date.now()-C,error:w instanceof Error?w.message:String(w)}),w}})),d=p.filter(m=>m.status==="rejected");if(d.length)throw new Error(`${d.length}/${p.length} configured vision outputs failed`);let f=p.flatMap(m=>m.status==="fulfilled"?[m.value]:[]);return{logData:f.length===1?f[0]:{outputCount:f.length,outputs:f}}};var yo={name:"ai-vision",run:er,lifecycle:{start:is}};import ae from"node:path";var as="analyze-transcript";function us(e){return e.replace(/\.transcript\.(json|md|txt)$/i,"").replace(/\.(json|ya?ml|mp3|m4a|txt|md)$/i,"").replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase()}function Vu(e){return e.replace(/\.transcript\.(json|md|txt)$/i,"").replace(/\.(json|ya?ml|mp3|m4a|txt|md)$/i,"")}function Wu(e){let t=e.settings?.analysisOutputDir||e.settings?.lecturesDir;if(!t||t==="."||t==="./")return e.paths.sessionFull;let r=Ku(t);return ae.isAbsolute(r)?r:ae.resolve(e.paths.rootFull,r)}function Ku(e){return e==="~"?process.env.HOME||e:e.replace(/^~(?=\/|\\)/,process.env.HOME||"~")}function cs(e){let t=Array.isArray(e.segments)?e.segments:[];return t.length?t.map(r=>{let o=r.speaker?`Speaker ${r.speaker}`:"Speaker",n=typeof r.start=="number"?r.start.toFixed(1):"?",s=typeof r.end=="number"?r.end.toFixed(1):"?";return`[${n}-${s}] ${o}: ${r.text}`}).join(`
19
+ `):""}function Yu(e){let t=e.fileContent;if(typeof t?.text=="string")return t.text;if(typeof t=="string")return t;if(t?.text)return String(t.text);let r=cs(t);return r||JSON.stringify(t||{},null,2)}function Hu(e){let t=Vu(e.fileName),r={...Ce(ae.join(e.paths.sessionFull,`_captions.${t}.meta.json`)),...Ce(ae.join(e.paths.sessionFull,"_captions",`${t}.meta.json`)),...Ce(ae.join(e.paths.sessionFull,"_captions",`_captions.${t}.meta.json`)),...Ce(ae.join(e.paths.sessionFull,"_meta",`${t}.meta.json`)),...Ce(ae.join(e.paths.sessionFull,"_meta",`_captions.${t}.meta.json`))};return{url:r.url||e.fileContent?.url||"",flavour:e.settings?.analysisPromptId||r.flavour||e.fileContent?.flavour||e.settings?.flavour||as,title:r.title||e.fileContent?.title||t,descriptorFileName:r.sourceFileName,sourceFileName:e.fileName,audioFileName:e.fileContent?.sourceFileName||r.audioFileName}}function Xu(e,t,r){let o=te(Q()),n=e.settings?.analysisPromptId||e.settings?.textAnalysisPromptId||r.flavour||as,s={...e.settings,...e.params,analysisText:t,text:t,transcriptText:t,transcript:e.fileContent,transcriptSegments:cs(e.fileContent),source:r,sourceTitle:r.title,sourceFileName:e.fileName,title:r.title,url:r.url,flavour:r.flavour},a=o.resolvePrompts(e,s)[n]?.promptTemplate;if(!a)throw new Error(`No prompt template found for promptId: ${n}`);return{prompt:a,promptId:n}}function Zu(e,t){let r=us(e),o=String(t||"").replace(/^\.+|\.+$/g,"");return o?`${r}.${o}.md`:`${r}.md`}var tr=async e=>{let t=E(e),r=Date.now(),o=us(e.fileName),n=ae.join("_analysis",`_analysis.${o}.json`),s=(i,a={})=>{t.session.ensureDir("_analysis"),t.session.write(n,{status:i,sourceFileName:e.fileName,startedAt:r,updatedAt:Date.now(),elapsedMs:Date.now()-r,...a})};try{let i=Yu(e).trim();if(!i||i==="{}"){s("skipped",{reason:"empty text"});return}t.session.addToLog("Building analysis prompt"),s("building-prompt",{textLength:i.length});let a=Hu(e),{prompt:u,promptId:p}=Xu(e,i,a),d=Y(e.settings,"llm",{model:e.settings?.analysisModel||e.settings?.model,provider:e.settings?.analysisProvider,providerOptions:e.settings?.analysisProviderOptions}),f=d.model;s("calling-llm",{source:a,promptId:p,model:f,promptLength:u.length,textLength:i.length});let m=await qr({provider:d.provider,model:f,prompt:u,providerOptions:d.providerOptions}),h=Wu(e);Ge(h);let y=Zu(e.fileName,e.settings?.analysisOutputSuffix),I=ae.join(h,y),A=ae.relative(h,e.paths.fileFull),C=[`# ${a.title||o}`,"",`- Source: ${a.url?`[${a.url}](${a.url})`:e.fileName}`,`- Input: [${e.fileName}](${A})`,`- Prompt: ${p}`,""].join(`
20
+ `);kr(I,`${C}${m.output.trim()}
21
+ `);let w=y.replace(/\.md$/i,".meta.json");t.session.write(w,{source:a,inputFileName:e.fileName,inputPath:e.paths.fileFull,outputFileName:y,promptId:p,provider:m.provider||d.provider,model:m.model||f,usage:m.usage,cost:m.cost,textLength:i.length,outputLength:m.output?.length||0}),s("done",{source:a,outputPath:I,outputFileName:y,promptId:p,provider:m.provider||d.provider,model:m.model||f,outputLength:m.output?.length||0,usage:m.usage,cost:m.cost}),t.session.addToLog(`Wrote ${y}`,{data:{outputFileName:y,outputPath:I}})}catch(i){throw s("error",{error:i?.message||"Unknown error"}),i}};var ho={name:"analyze-text",run:tr};function me(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function ye(e,t){let r=e.settings?.[t];return me(r)?r:{}}function De(e,t,r){return ye(e,t)[r]}function rr(e,t,r,o){let n=De(e,t,r);return typeof n=="string"?n:o}function or(e,t,r,o){let n=Number(De(e,t,r)??o);return Number.isFinite(n)?n:o}function tt(e,t,r,o){let n=De(e,t,r);return Array.isArray(n)?n.filter(s=>typeof s=="string"):o}function ps(e,t,r,o){let n=De(e,t,r);return typeof n=="boolean"?n:o}import nr from"node:path";var ms=["inputOutputPair","promptId","sameName"];function Qu(e,t,r="promptId"){let o=De(e,t,"outputNamingConvention");if(typeof o=="string"){if(ms.includes(o))return o;throw new Error(`${t}.outputNamingConvention must be one of: ${ms.join(", ")}.`)}return r}function sr(e,t){let r=rr(e,t,"promptId");if(r?.trim())return r.trim();throw new Error(`${t} requires settings.${t}.promptId.`)}function X(e,t,r,o="promptId"){let n=Qu(e,t,o);if(n==="sameName")return nr.basename(e.fileName,nr.extname(e.fileName));if(n==="inputOutputPair"){let s=ec(e.fileName);return s?`${r}.${s}`:r}return r}function ec(e){let r=nr.basename(e,nr.extname(e)).split(".").filter(Boolean);if(!(r.length<=1))return r[0]==="input"?r.slice(1).join("."):r[r.length-1]==="input"?r.slice(0,-1).join("."):r.slice(1).join(".")}var rt="req-edit-image";function tc(e){return["Edit the referenced source image according to this fix.","Preserve the original frame composition, character identity, cinematic style, aspect ratio, and story continuity unless the fix explicitly asks otherwise.","","Fix:",e].join(`
22
+ `)}var ir=async e=>{let t=E(e),r=String(e.fileContent?.text||"").trim();if(t.session.addToLog("Preparing image edit request"),r.length<or(e,rt,"minPromptLength",1)){t.session.addToLog("Prompt is too short",{type:"skip"});return}if(!r)throw new Error("req-edit-image: fix text is required.");let o=rr(e,rt,"fixSourceExtension","jpg"),n=e.fileName.replace(/\.fix\.txt$/i,""),s=X(e,rt,rt,"sameName"),i=$(e.settings,"image");for(let a of i){let u=q(s,a.suffix),p={...a.output,prompt:tc(r),referenceImagePaths:[`./${n}.${o}`],referenceTypes:tt(e,rt,"fixReferenceTypes",["composition","scenario","style","character"])};t.session.writeImageRequest(u,p)}};var bo={name:"req-edit-image",run:ir};import rc from"node:path";var ls="req-image-to-text";function oc(e){return e.slice(0,e.length-rc.extname(e).length)}function nc(e){let t=ye(e,ls);return me(t.request)?t.request:{}}var ar=async e=>{let t=E(e);t.session.addToLog("Prepared image-to-text request");let r=X(e,ls,oc(e.fileName),"sameName"),o={...nc(e),imagePath:`./${e.fileName}`};t.session.writeVisionRequest(r,o)};var vo={name:"req-image-to-text",run:ar};var ot="req-image-to-image";function sc(e){if(!ps(e,ot,"sourceImageAsReference",!0))return{};let t=e.fileName.split(".").pop()?.toLowerCase()||"";return tt(e,ot,"sourceImageExtensions",["jpg","jpeg","png","webp"]).map(o=>o.replace(/^\./,"").toLowerCase()).includes(t)?{referenceImagePaths:[`./${e.fileName}`],referenceTypes:tt(e,ot,"sourceImageReferenceTypes",["general"])}:{}}function ic(e,t){let n=te(Q()).resolvePrompts(e,{...e.settings,...e.params,fileContent:e.fileContent?.text})[t]?.promptTemplate;return typeof n=="string"?n.trim():""}var ur=async e=>{let t=E(e),r=sr(e,ot),o=ic(e,r);if(t.session.addToLog(`Using prompt ${r}`,{data:{promptId:r}}),!o)throw new Error(`req-image-to-image: no prompt template found for promptId: ${r}`);let n=X(e,ot,r,"inputOutputPair"),s=$(e.settings,"image");for(let i of s){let a=q(n,i.suffix),u={...i.output,prompt:o,...sc(e)};t.session.writeImageRequest(a,u)}};var Io={name:"req-image-to-image",run:ur};var cr="req-text-to-image";function ac(e){let t=ye(e,cr);return me(t.request)?t.request:{}}var pr=async e=>{let t=E(e),r=String(e.fileContent?.text||"").trim();if(t.session.addToLog("Preparing text-to-image request"),r.length<or(e,cr,"minPromptLength",1)){t.session.addToLog("Prompt is too short",{type:"skip"});return}if(!r)throw new Error("req-text-to-image: source prompt text is required.");let o=X(e,cr,cr,"sameName"),n=$(e.settings,"image");for(let s of n){let i=q(o,s.suffix),a={...ac(e),...s.output,prompt:r};t.session.writeImageRequest(i,a)}};var So={name:"req-text-to-image",run:pr};var nt="req-text-to-speech";function uc(e){return String(e.fileContent?.text||"").trim()}function cc(e){return e.match(/^\s*([^:\n]{1,80}):\s+/)?.[1]?.trim()}function pc(e){let t=e.match(/line-[^.]*([A-Z])(?:\.[^.]+)?$/i);if(t?.[1])return t[1].toUpperCase().charCodeAt(0)-65}function mc(e,t){let r=ye(e,nt);if(typeof r.voiceId=="string"&&r.voiceId.trim())return r.voiceId.trim();let o=cc(t),n=me(r.characterVoices)?r.characterVoices:me(e.settings?.characterVoices)?e.settings.characterVoices:void 0;if(o&&n){let p=n[o]||n[o.toLowerCase()];if(typeof p=="string"&&p.trim())return p.trim()}let s=Array.isArray(r.characterNames)?r.characterNames:Array.isArray(e.settings?.characterNames)?e.settings.characterNames:[],i=Array.isArray(r.characterVoiceIds)?r.characterVoiceIds:Array.isArray(e.settings?.characterVoiceIds)?e.settings.characterVoiceIds:[];if(o){let p=s.findIndex(f=>typeof f=="string"&&f.toLowerCase()===o.toLowerCase()),d=p>=0?i[p]:void 0;if(typeof d=="string"&&d.trim())return d.trim()}let a=pc(e.fileName),u=typeof a=="number"?i[a]:void 0;return typeof u=="string"&&u.trim()?u.trim():void 0}function lc(e){let t=ye(e,nt),r=me(t.request)?t.request:{};return{...r,provider:t.provider??r.provider,model:t.model??r.model,languageCode:t.languageCode??r.languageCode,outputFormat:t.outputFormat??r.outputFormat,speed:t.speed??r.speed,instructions:t.instructions??r.instructions,providerOptions:t.providerOptions??r.providerOptions}}var mr=async e=>{let t=E(e),r=Pe(),o=uc(e);if(t.session.addToLog("Prepared text-to-speech request"),!o)throw new Error(`${nt}: source text is required.`);let n=$(e.settings,"tts");for(let s of n){let i={...e,settings:s.settings},a=r.prepareTtsRequest(i,{...lc(i),text:o,voiceId:mc(i,o)}),u=X(i,nt,nt,"sameName"),p=q(u,s.suffix);t.session.writeTtsRequest(p,a)}};var xo={name:"req-text-to-speech",run:mr};var ds="req-text-to-text",lr=async e=>{let t=E(e),r=Pe(),o=sr(e,ds);t.session.addToLog(`Using prompt ${o}`,{data:{promptId:o}});let n=$(e.settings,"llm");for(let s of n){let i={...e,settings:s.settings},a=r.prepareTextToTextRequest(i,{promptId:o}),u=X(i,ds,o),p=q(u,s.suffix);t.session.writeTextToTextRequest(p,a)}};var Co={name:"req-text-to-text",run:lr};import he from"node:path";function dc(e){return e==="~"?process.env.HOME||e:e.replace(/^~(?=\/|\\)/,process.env.HOME||"~")}function gc(e){return e==="move"?"move":"copy"}function fc(e,t){if(typeof e=="boolean")return e;if(typeof e=="string"){if(["true","1","yes"].includes(e.toLowerCase()))return!0;if(["false","0","no"].includes(e.toLowerCase()))return!1}return t}function yc(e){let t=e.settings||{},r=t["place-output"];if(r&&typeof r=="object")return r;let o=t.outputPlacement;return o&&typeof o=="object"?o:{}}function hc(e){let t=yc(e),r=t.dir??t.outputDir??t.destinationDir??t.destination,o=typeof r=="string"&&r.trim()?r.trim():e.paths.sessionFull;return{dir:dc(o),mode:gc(t.mode),overwrite:fc(t.overwrite,!0)}}function bc(e,t){let r=he.isAbsolute(t.dir)?t.dir:he.resolve(e.paths.rootFull,t.dir);return he.join(r,e.fileName)}function vc(e){return`_placement.${e.replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase()||"output"}.json`}var dr=async e=>{let t=E(e),r=hc(e),o=bc(e,r),n=e.paths.fileFull,s=Date.now(),i=(a,u={})=>{Er(he.join(e.paths.sessionFull,vc(e.fileName)),{status:a,sourceFileName:e.fileName,sourcePath:n,destinationPath:o,mode:r.mode,startedAt:s,updatedAt:Date.now(),elapsedMs:Date.now()-s,...u})};try{if(he.resolve(n)===he.resolve(o)){i("skipped",{reason:"destination is source"}),t.session.addToLog("Destination is the source file",{type:"skip"});return}if(M(o)&&!r.overwrite){i("skipped",{reason:"destination exists"}),t.session.addToLog("Destination already exists",{type:"skip",data:{destinationPath:o}});return}Ge(he.dirname(o)),Fr(n,o),r.mode==="move"&&Tr(n),i("done"),t.session.addToLog(`Placed output at ${he.basename(o)}`,{data:{destinationPath:o}})}catch(a){throw i("error",{error:a?.message||"Unknown error"}),a}};var wo={name:"place-output",run:dr};var Po={name:"transcribe-audio",run:Fe};var gs=[uo,po,mo,lo,fo,yo,ho,wo,bo,Io,vo,So,xo,Co,Po];import Qc from"node:fs";import{fileURLToPath as _s}from"node:url";import{homedir as Fs}from"os";import Lo from"path";import{homedir as ws}from"os";import Ic from"node:path";function fs(e,t=[]){return Ke(e,"**/config.json",t).map(r=>Ic.dirname(r)).filter((r,o,n)=>n.indexOf(r)===o).sort()}import To from"lodash";import{minimatch as ys}from"minimatch";import ue from"path";var Sc=!0;function xc(e,t){if(!Sc)return t;let r=e.match(/request-(.*)\.json$/);if(r&&r[1])return r[1]}function Cc(e){let t=oe();return e.replace(t,"")}function wc(e){let t=e.replace(/^\/+|\/+$/g,"").split("/"),r=/^U-\d{4}$/i,o=/^[A-Z]-\d{3}$/i,n=/^\/_requests\/request-.*\.json$/i,s,i,a;t[0]==="users"&&t[1]&&r.test(t[1])&&(s=t[1],i=`/users/${s}`,a=t[2]&&o.test(t[2])?t[2]:void 0);let u,p="none";if(a){let f=s?2:0;t[f+1]==="sessions"&&t[f+2]?(u=t[f+2],p="session"):p="machine"}let d=oe();if(n.test(e)&&d){let f=`${d}${e}`,m=Fo(f);m?.userId&&m?.machineId&&m?.id&&(s=m.userId,i=`/users/${s}`,a=m.machineId,u=xc(e,m.id),p="session")}return{userId:s,userPath:i,machineId:a,sessionId:u,scope:p,isScoped:p!=="none"}}function Fo(e){try{return M(e)?xt(e):{}}catch(t){return G(`Failed to read JSON from ${e}`,t,{filePath:e}),{}}}var hs=(e,t="create")=>{let r=oe(),o=Cc(e),n=wc(o),s=ue.basename(o),i=ue.dirname(o),a={fileName:s,fileContent:{},fileVerb:t,...n,prompts:{},promptIds:[],paths:{},settings:{},params:{},session:{},isDebug:!1,global:We(void 0)},u={root:"/",rootFull:ue.resolve(r),file:"",fileFull:"",user:"",userFull:"",machine:"",machineFull:"",state:"",stateFull:"",session:"",sessionFull:""};switch(u.file=o,u.fileFull=ue.resolve(`${r}${o}`),u.session=i,u.sessionFull=ue.resolve(`${r}${i}`),ue.extname(o).toLowerCase()){case".json":a.fileContent=Fo(u.fileFull);break;case".md":case".txt":let h=M(u.fileFull)?Ar(u.fileFull):"";a.fileContent={text:h};break}if(n.isScoped){let h=n.userPath?`${n.userPath}/${n.machineId}`:`/${n.machineId}`;if(n.userPath&&(u.user=n.userPath,u.userFull=ue.resolve(`${r}${n.userPath}`)),u.machine=h,u.machineFull=ue.resolve(`${r}${h}`),u.state=`${h}/state.json`,u.stateFull=ue.resolve(`${r}${h}/state.json`),n.sessionId){a.sessionId=n.sessionId,u.session=`${h}/sessions/${n.sessionId}`,u.sessionFull=ue.resolve(`${r}${h}/sessions/${n.sessionId}`);let y=`${u.sessionFull}/_session.json`,I=Fo(y);a.params=I.params||{},a.session=I||{},M(`${u.sessionFull}/_debug.md`)&&(a.isDebug=!0)}}a.paths=u;let f=te(Q()).resolveConfig(a);a.config=f,a.global=We(f.global);let m=(f.triggers??{})[t]||{};return a.settings=Pc(f.settings||{},s),a.params=To.merge({},f.params||{},a.params||{}),a.ioBots=m,a.command=Fc(m,o),a.promptIds=Tc(a.settings),a.paths=u,a};function Pc(e,t){let r=To.cloneDeep(e);for(let[o,n]of Object.entries(r)){if(!n||typeof n!="object"||Array.isArray(n))continue;let s=n.fileOverrides;if(!Array.isArray(s))continue;let i=n;for(let a of s){if(!a||typeof a!="object"||Array.isArray(a))continue;let{glob:u,...p}=a;typeof u!="string"||!ys(t,u)||(i=To.mergeWith({},i,p,(d,f)=>Array.isArray(f)?f:void 0))}r[o]=i}return r}function Tc(e){let t=new Set;function r(o){if(!(!o||typeof o!="object")){if(Array.isArray(o)){for(let n of o)r(n);return}for(let[n,s]of Object.entries(o))typeof s=="string"&&s.trim()&&(n==="promptId"||n.endsWith("PromptId"))&&t.add(s.trim()),r(s)}}return r(e),[...t]}function Fc(e,t){let r=[];for(let o in e){let n=o.includes("/")?o:`**/${o}`;ys(t,n)&&r.push(e[o])}return r}var Ac=[{provider:"OpenAI",environmentVariables:["OPENAI_API_KEY"]},{provider:"Azure OpenAI",environmentVariables:["AZURE_OPENAI_API_KEY","AZURE_API_KEY"]},{provider:"Google",environmentVariables:["GOOGLE_API_KEY"]},{provider:"ElevenLabs",environmentVariables:["ELEVENLABS_API_KEY","ELEVEN_LABS_API_KEY"]},{provider:"Anthropic",environmentVariables:["ANTHROPIC_API_KEY"]},{provider:"xAI",environmentVariables:["XAI_API_KEY"]},{provider:"Hugging Face",environmentVariables:["HUGGINGFACE_API_KEY","HF_TOKEN"]},{provider:"ByteDance",environmentVariables:["ARK_API_KEY"]}];function kc(e=process.env){return Ac.filter(({environmentVariables:t})=>t.some(r=>e[r]?.trim())).map(({provider:t})=>t)}function bs(e=process.env){return kc(e).join(", ")||"none"}var Ao={};function ko(e={}){let t=Array.isArray(e)?e.map(({name:r,run:o,lifecycle:n})=>[r,{run:o,lifecycle:n}]):Object.entries(e).map(([r,o])=>[r,{run:o}]);for(let[r,o]of t){if(!r||typeof o.run!="function")throw new TypeError("Each IO bot must provide a non-empty name and a run(context) function.");Ao[r]=o}}function vs(e){return Ao[e]?.run}function Is(e){return Ao[e]?.lifecycle}import Ss from"path";function Ec(e){let t=e.outputNamingConvention;if(!t)return"promptId";if(t==="promptId"||t==="sameName"||t==="inputOutputPair")return t;throw new Error("outputNamingConvention must be one of: inputOutputPair, promptId, sameName.")}function _c(e,t,r){let{fileName:o}=r,n=Ss.basename(o,Ss.extname(o));switch(e){case"sameName":return n;case"inputOutputPair":{let s=n.split(".").filter(Boolean);return s.length<=1?t:s[0]==="input"?`${t}.${s.slice(1).join(".")}`:s[s.length-1]==="input"?`${t}.${s.slice(0,-1).join(".")}`:`${t}.${s.slice(1).join(".")}`}default:return t}}var xs=async(e,t)=>{let{settings:r,fileContent:o}=t,{conversationId:n}=o??{};if(n)return;let s=Ec(r),i=e.replace("convo-",""),a=E(t),u=Pe();a.session.addToLog(`Using conversation prompt ${i}`,{data:{promptId:i}});let p=u.prepareTextToTextRequest(t,{promptId:i}),d=_c(s,i,t);a.session.writeConvoRequest(d,p)};function Cs(e,t){let r=E(t),o=[...r.session.applyCleanupPolicy([e]),...r.session.applyCleanupManifests(t.fileName)];for(let n of o)K(t,{botName:e,kind:"diagnostic",level:"debug",message:`IO bot ${e} cleanup completed`,data:n},{console:!1,local:!0,operation:!0,workspace:!1});return o}var Lc=e=>e.startsWith("convo-")?"convo":"main",Nc=async(e,t)=>{let r=Lc(e),o=new Date().toISOString(),n=Date.now(),s=Oc(new Date(n)),i={...t,botName:e,operationId:s},a=Is(e),u={};try{u=a?.start?.(i)??{}}catch{}let p={botName:e,command:e,eventType:"operation",operationId:s,phase:"started",sourceFileName:t.fileName,sourceFilePath:t.paths?.file,startedAt:o,...u};K(i,{botName:e,kind:"bot-start",level:"info",message:`IO bot ${e} started`,operationId:s,data:p});let d=(m,h={})=>{let y=new Date().toISOString(),I=Date.now()-n;K(i,{botName:e,duration:I,kind:m==="done"?"bot-done":"bot-error",level:m==="done"?"info":"error",message:m==="done"?`IO bot ${e} completed`:String(h.error??`IO bot ${e} failed`),operationId:s,data:{...p,...h,durationMs:I,endedAt:y,phase:m}}),an(i)},f=m=>{Cs(e,i),d("done",m?.logData?{result:m.logData}:{})};try{if(r==="convo"){await xs(e,i),f(void 0);return}if(r!=="main"){d("error",{error:`Command type not supported: ${r}`});return}let m=vs(e);if(typeof m!="function"){d("error",{error:`No command found for: ${e}`});return}let h=await m(i);f(h)}catch(m){let h=m instanceof Error?m.message:String(m);d("error",{error:h,...m instanceof Error&&m.stack?{stack:m.stack}:{}})}};function Oc(e){let t=e.getFullYear(),r=Math.floor((Date.UTC(t,e.getMonth(),e.getDate())-Date.UTC(t,0,1))/864e5)+1,o=String(e.getHours()).padStart(2,"0"),n=String(e.getMinutes()).padStart(2,"0");return`${t}-${String(r).padStart(3,"0")}-${o}-${n}-${lt()}`}var st=async(e,t)=>{let r=[];for(let o of e){let n;Array.isArray(o)?n=st(o,t):n=Nc(o,t),r.push(n)}return Promise.all(r)};var Eo=new Map,Rc=new Set(["_analysis","_cleanup","_done","_meta","_parts","_partial","_prompts","_temp","_transcript"]),$c=["_partial.","_transcribing.","_transcript."],Dc=(e,t)=>e.split(/[\\/]+/).some(r=>Rc.has(r))||$c.some(r=>t.startsWith(r));function jc(e){return`${e.charAt(0).toUpperCase()}${e.slice(1)}`}function Mc(e){if(typeof e=="number")return Number.isFinite(e)&&e>0?e:0;if(typeof e!="string")return 0;let t=e.trim().match(/^(\d+(?:\.\d+)?)(ms|s|m|h)?$/i);if(!t)return 0;let r=Number(t[1]);if(!Number.isFinite(r)||r<=0)return 0;let o=(t[2]||"ms").toLowerCase(),n=o==="h"?3600*1e3:o==="m"?60*1e3:o==="s"?1e3:1;return Math.round(r*n)}function Jc(e,t){let r=e.config?.triggers;if(!r||typeof r!="object")return 0;let o=r[`delay${jc(t)}`];return Mc(o??r.delay)}function je(e){return(Array.isArray(e.command)?e.command:[e.command]).filter(r=>typeof r=="string"&&r.length>0)}var Bc=e=>e.some(t=>t.startsWith("ai-"));function zc(e){return Dc(e.paths.file,e.fileName)||e.fileName.endsWith("log.txt")}function qc(e,t){for(let r of je(e))K(e,{botName:r,duration:t,kind:"bot-delay",level:"info",message:`IO bot ${r} waiting ${t}ms`,crudVerb:e.fileVerb,data:{delayMs:t}},{operation:!1})}function Uc(e){for(let t of je(e))K(e,{botName:t,kind:"bot-skip",level:"info",message:"Delay superseded by a newer filesystem event",crudVerb:e.fileVerb},{operation:!1})}function _o(e,t,r){if(zc(e))return Promise.resolve();K(e,{crudVerb:t,kind:"crud",level:"info",message:`${t} ${e.fileName}`},{local:!1,operation:!1});let o=je(e);if(o.length===0)return Promise.resolve();let n=Bc(o)?0:Jc(e,t);if(n<=0)return r(e);let s=`${e.paths.sessionFull}:${t}`,i=Eo.get(s);return i&&(clearTimeout(i.timer),Uc(i.context),i.resolve()),new Promise((a,u)=>{qc(e,n);let p=setTimeout(()=>{Eo.delete(s),r(e).then(a,u)},n);Eo.set(s,{context:e,timer:p,resolve:a})})}var Gc=async e=>{await st(je(e),e)},Vc=async e=>{await st(je(e),e)},Wc=async e=>{},Kc=async e=>{await st(je(e),e)},Yc=e=>_o(e,"create",Gc),Hc=e=>_o(e,"update",Vc),Xc=e=>_o(e,"delete",Kc),gr={bootstrap:Wc,create:Yc,update:Hc,delete:Xc};var Ps=["_partial*","**/_partial*","_transcribing*","**/_transcribing*","_transcript.*","**/_transcript.*","_analysis/**","**/_analysis/**","_cleanup/**","**/_cleanup/**","_done/**","**/_done/**","_meta/**","**/_meta/**","_parts/**","**/_parts/**","_prompts/**","**/_prompts/**","_temp/**","**/_temp/**","_transcript/**","**/_transcript/**","**/node_modules/**","**/dist/**","**/__pycache__/**","**/*.egg-info/**","_tim/**","**/_tim/**"];async function Ts(e){let t=e.cwd,r=e.version||"unknown",o=t.startsWith(ws())?t.replace(ws(),"~"):t,n=fs(t,Ps);if(!n.length)throw new Error(`No config.json files found recursively under ${o}. Add config.json to each directory TIM should watch.`);zo(t);let s=Zo(),i=bs();return await s.log({kind:"system",level:"info",message:`TIM version ${r}`,data:{version:r}}),await s.log({kind:"system",level:"info",message:`Listener started in ${o} with ${n.length} configured director${n.length===1?"y":"ies"}`,data:{root:o,configuredDirectories:n.length}}),await s.log({kind:"system",level:"info",message:`Providers: ${i}`,data:{providers:i}}),Rr({cwd:t,watchPaths:n,depth:0,target:"**/*",ignore:Ps,createContext:hs,silent:!0,callbacks:{onAdd:gr.create,onChange:gr.update,onUnlink:gr.delete},ignoreLogs:!0})}function No(e,t=process.cwd()){if(!e)return Lo.resolve(t);let r=e==="~"?Fs():e.startsWith("~/")?Lo.join(Fs(),e.slice(2)):e;return Lo.resolve(t,r)}function As(e={}){return ko(e.bots),Le(e.galleries),Ts({cwd:No(e.cwd),version:e.version})}var ks={id:"character-sheets",title:"Character Sheets",description:"Reusable image-to-image workflow for generating polished character sheet outputs from input artwork.",triggers:{create:{"input.*.png":"req-image-to-image","*.image.json":"ai-image"},update:{"input.*.png":"req-image-to-image","*.image.json":"ai-image"}},settings:{"req-image-to-image":{outputNamingConvention:"inputOutputPair",promptId:"character-sheet",sourceImageAsReference:!0,sourceImageReferenceTypes:["character","style"]},"ai-image":{output:{provider:"google",model:"gemini-3-pro-image",aspectRatio:"3:2",imageSize:"4K"}}}};var Es=_s(new URL("./prompts/character-sheets",import.meta.url)),ep=_s(new URL("../src/character-sheets/_prompts",import.meta.url)),tp=Qc.existsSync(Es)?Es:ep,Ls={name:"g-character-sheets",aliases:["character-sheets","character-sheet"],config:ks},fr=[Ls],Oo=[{gallery:Ls.name,from:tp}];Le(fr);var yr={name:"@tim-fs/cli",publishConfig:{access:"public",tag:"alpha"},version:"0.1.3-alpha.0",type:"module",description:"Turn ordinary folders into durable, inspectable AI and code workflows that any person, agent, or program can invoke by writing a file",bin:{tim:"dist/index.js"},files:["dist"],scripts:{build:"npm run clean && npm run build:debug","build:release":"node build.mjs --release","build:debug":"node build.mjs",clean:"rm -rf dist",link:"npm run build && npm link",prepack:"npm run clean && npm run build:release",test:"npm run build && node --test test/*.test.mjs",typecheck:"tsc -p tsconfig.json",watch:'nodemon --watch src --ext ts --exec "npm run build"'},keywords:["automation","filesystem","file-watcher","ai","workflow"],license:"MIT",engines:{node:">=20"},repository:{type:"git",url:"git+https://github.com/dht/tim-fs.git",directory:"cli"},bugs:{url:"https://github.com/dht/tim-fs/issues"},homepage:"https://github.com/dht/tim-fs#readme",dependencies:{"@ai-sdk/anthropic":"^3.0.84","@ai-sdk/azure":"^3.0.87","@ai-sdk/bytedance":"^1.0.17","@ai-sdk/elevenlabs":"^2.0.35","@ai-sdk/google":"^3.0.82","@ai-sdk/huggingface":"^1.0.52","@ai-sdk/openai":"^3.0.71","@ai-sdk/xai":"^3.0.95","@elevenlabs/elevenlabs-js":"^2.58.0",ai:"^6.0.205",chokidar:"^5.0.0",commander:"^12.1.0",dotenv:"^17.2.3","fs-extra":"^11.3.2",glob:"13.0.0",kleur:"^4.1.5",lodash:"^4.18.1",logform:"^2.7.0",minimatch:"^10.2.5",openai:"^6.48.0","p-limit":"^7.2.0",sharp:"^0.34.5",winston:"^3.18.3","winston-transport":"^4.9.0",ws:"^8.21.1",yaml:"^2.9.0"},devDependencies:{"@tim-fs/core":"workspace:^","@tim-fs/io-core":"workspace:^","@tim-fs/io-gallery":"workspace:^","@types/node":"^20.19.25",esbuild:"^0.27.2",nodemon:"^3.1.7",typescript:"^5.9.3"}};import{config as cp}from"dotenv";import Me from"node:fs";import op from"node:os";import hr from"node:path";import{parse as np}from"dotenv";var it=[{name:"OPENAI_API_KEY",label:"OpenAI"},{name:"ANTHROPIC_API_KEY",label:"Anthropic"},{name:"GOOGLE_API_KEY",label:"Google Gemini"},{name:"ELEVENLABS_API_KEY",label:"ElevenLabs",aliases:["ELEVEN_LABS_API_KEY"]},{name:"XAI_API_KEY",label:"xAI"},{name:"HUGGINGFACE_API_KEY",label:"Hugging Face",aliases:["HF_TOKEN","HF_ACCESS_TOKEN"]},{name:"ARK_API_KEY",label:"ByteDance ModelArk"},{name:"AZURE_OPENAI_API_KEY",label:"Azure OpenAI",aliases:["AZURE_API_KEY"]}];function sp(e=process.env){return e.TIM_HOME||hr.join(op.homedir(),".tim")}function Je(e=process.env){return e.TIM_ENV_FILE||hr.join(sp(e),".env")}function ip(e){return Me.existsSync(e)?np(Me.readFileSync(e)):{}}function ap(e,...t){for(let r of t)for(let o of[e.name,...e.aliases||[]]){let n=r[o]?.trim();if(n)return n}return""}function up(e){return e?JSON.stringify(e):""}function Ns(e={}){let t=e.environment||process.env,r=e.destination||Je(t),o=ip(r);return Object.fromEntries(it.map(n=>[n.name,ap(n,o,t)]))}function Os(e,t=Je()){let r=["# TIM provider credentials","# Run `npx @tim-fs/cli@alpha init` again to update this file.","",...it.map(o=>`${o.name}=${up(e[o.name]||"")}`),""];Me.mkdirSync(hr.dirname(t),{recursive:!0,mode:448}),Me.chmodSync(hr.dirname(t),448),Me.writeFileSync(t,r.join(`
23
+ `),{encoding:"utf8",mode:384}),Me.chmodSync(t,384)}cp({path:Je(),quiet:!0});import{emitKeypressEvents as pp}from"node:readline";import V from"kleur";var mp=["\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557","\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D"," \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557"," \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u255A\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551"," \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551"," \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"],lp=e=>V.enabled?`\x1B[38;5;208m${e}\x1B[39m`:e;function Rs(e){let t=mp.map((r,o)=>o<3?V.cyan(r):lp(r));console.log(`
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(`${V.bold("TIM-FS")} ${V.dim(`v${e}`)} ${V.dim("\xB7")} Filesystem automation, made friendly.
26
+ `),console.log(`${V.green("\u25CF")} Provider keys are saved locally in ${V.cyan("~/.tim/.env")}
27
+ `)}async function $s(e,t,r=process.stdin,o=process.stdout){let n=new Set(t),s=0,i=0,a=r.isRaw,u=()=>{i>0&&o.write(`\x1B[${i}A\r\x1B[J`);let p=[V.bold("Which providers would you like to configure?"),V.dim("Use \u2191/\u2193 to move, Space to select, and Enter to continue."),"",...e.map((d,f)=>{let m=f===s?V.cyan("\u276F"):" ",h=n.has(d.name)?V.green("\u25C9"):V.dim("\u25CB"),y=t.has(d.name)?V.dim(" (configured)"):"";return`${m} ${h} ${d.label}${y}`})];o.write(`${p.join(`
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 Pc(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")&&Pc(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 Ac,Ir=process.cwd(),Ro=class extends Fc{muted=!1;_write(t,r,o){this.muted||process.stdout.write(t),o()}};async function kc(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
+ `),i=p.length};return new Promise((p,d)=>{let f=()=>{r.off("keypress",m),r.setRawMode(!!a),o.write("\x1B[?25h"),a||r.pause()},m=(h,y)=>{if(y.ctrl&&y.name==="c"){f(),d(new Error("Setup cancelled."));return}if(y.name==="up"||y.name==="k"){s=(s-1+e.length)%e.length,u();return}if(y.name==="down"||y.name==="j"){s=(s+1)%e.length,u();return}if(y.name==="space"||h===" "){let I=e[s].name;n.has(I)?n.delete(I):n.add(I),u();return}(y.name==="return"||y.name==="enter")&&(f(),o.write(`
30
+ `),p(e.filter(I=>n.has(I.name))))};pp(r),r.setRawMode(!0),r.resume(),r.on("keypress",m),o.write("\x1B[?25l"),u()})}import Ir from"node:fs";import Ro from"node:path";import at from"node:fs";import Be from"node:path";function br(e){let t=new Set;function r(o){if(!(!o||typeof o!="object")){if(Array.isArray(o)){for(let n of o)r(n);return}for(let[n,s]of Object.entries(o))typeof s=="string"&&s.trim()&&(n==="promptId"||n.endsWith("PromptId"))&&t.add(s.trim()),r(s)}}return r(e),[...t]}function dp(e){let t=Be.parse(Be.basename(e)).name;return t.includes(".")&&(t=t.split(".").pop()),t}function vr(e,t,r){let o=at.readdirSync(e).find(i=>i.endsWith(".md")&&dp(i)===r);if(!o)throw new Error(`Prompt "${r}" was not found in ${e}. Run "tim init" first.`);at.mkdirSync(t,{recursive:!0}),at.copyFileSync(Be.join(e,o),Be.join(t,o));let n=o.replace(/\.md$/,".schema.json"),s=Be.join(e,n);at.existsSync(s)&&at.copyFileSync(s,Be.join(t,n))}var $o=["eject","bot","preset"];function gp(e,t){return e.find(r=>r.name===t||r.aliases?.includes(t))}function fp(e){let t={};for(let[r,o]of Object.entries(e.config.triggers||{})){if(!o||typeof o!="object")continue;let n=Object.keys(o)[0];n&&(t[r]={[n]:e.name})}if(Object.keys(t).length===0)throw new Error(`IO gallery "${e.name}" does not define any triggers.`);return{triggers:t}}function Ds(e){let{cwd:t,directory:r,galleryName:o,flavour:n,galleries:s,promptSources:i}=e,a=gp(s,o);if(!a){let d=s.flatMap(f=>f.aliases||[f.name]).join(", ");throw new Error(`Unknown IO gallery preset: ${o}. Available presets: ${d}`)}let u=Ro.resolve(t,r);if(Ir.existsSync(u))throw new Error(`Cannot create TIM directory because the path already exists: ${u}`);let p;n==="eject"?p=pe(a.config):n==="bot"?p=fp(a):p={import:a.name},Ir.mkdirSync(u,{recursive:!0});try{if(Ir.writeFileSync(Ro.join(u,"config.json"),`${JSON.stringify(p,null,2)}
31
+ `),n==="eject"){let d=i.find(m=>m.gallery===a.name),f=br(p.settings||{});if(f.length>0&&!d)throw new Error(`No bundled prompt source is registered for ${a.name}.`);for(let m of f)vr(d.from,Ro.join(u,"_prompts"),m)}}catch(d){throw Ir.rmSync(u,{recursive:!0,force:!0}),d}return{target:u,gallery:a.name,flavour:n}}var ze=new bp,ut=process.cwd(),Do=class extends hp{muted=!1;_write(t,r,o){this.muted||process.stdout.write(t),o()}};async function vp(e,t,r){process.stdout.write(r),t.muted=!0;let o=await e.question("");return t.muted=!1,process.stdout.write(o?`\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022
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=Tc.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 kc(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()}ze.name("tim").description("Run filesystem-driven IO bots from configured directories.").version(yr.version);ze.command("init").description("Configure provider keys and install bundled prompts in ~/.tim.").option("--non-interactive","create the env file without prompting").action(async e=>{Rs(yr.version);let t=Je(),r=Ns({destination:t});if(!e.nonInteractive&&process.stdin.isTTY&&process.stdout.isTTY){let s=new Set(it.filter(p=>!!r[p.name]).map(p=>p.name)),i=await $s(it,s),a=new Do,u=yp.createInterface({input:process.stdin,output:a,terminal:!0});try{i.length===0&&console.log(`No providers selected. Skipping provider key setup.
34
+ `);for(let p of i){let d=!!r[p.name],f=await vp(u,a,`${p.label}${d?" (press Enter to keep current key)":""}: `);f&&(r[p.name]=f)}}finally{a.muted=!1,u.close()}}Os(r,t);let o=Object.values(r).filter(Boolean).length;console.log(`Saved ${o} provider key(s) to ${t}`);let n=ge();Ae.mkdirSync(n,{recursive:!0});for(let s of Oo){if(!Ae.existsSync(s.from))throw new Error(`Gallery prompt source not found: ${s.from}`);Ae.cpSync(s.from,n,{recursive:!0,force:!0}),console.log(`Installed ${s.gallery} prompts to ${n}`)}});ze.command("create <directory> <preset>").description("Bootstrap a TIM directory from an IO gallery preset.").option("--flavour <flavour>","output style: eject, bot, or preset","eject").action((e,t,r)=>{if(!$o.includes(r.flavour))throw new Error(`Unknown create flavour: ${r.flavour}. Expected one of: ${$o.join(", ")}`);let o=Ds({cwd:ut,directory:e,galleryName:t,flavour:r.flavour,galleries:fr,promptSources:Oo});console.log(`Created ${o.gallery} TIM directory at ${o.target} (${o.flavour} flavour)`)});ze.command("eject").description("Expand gallery convenience config and copy referenced prompts into ./_prompts.").action(()=>{let e=js.join(ut,"config.json");if(!Ae.existsSync(e))throw new Error(`No config.json found in ${ut}`);let t=JSON.parse(Ae.readFileSync(e,"utf-8")),r=pe(t),o=br(r.settings||{}),n=ge();if(o.length>0&&!Ae.existsSync(n))throw new Error(`TIM prompts were not found at ${n}. Run "tim init" first.`);if(Ae.writeFileSync(e,`${JSON.stringify(r,null,2)}
35
+ `),o.length>0){let s=js.join(ut,"_prompts");for(let i of o)vr(n,s,i);console.log(`Copied ${o.length} prompt(s) to ${s}`)}console.log(`Expanded gallery config at ${e}`)});ze.command("start [directory]").description("Watch configured directories in the foreground.").action(async e=>{await As({cwd:No(e,ut),bots:gs,galleries:fr,version:yr.version})});ze.parseAsync(process.argv).catch(e=>{console.error(e instanceof Error?e.message:e),process.exitCode=1});
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.1",
7
+ "version": "0.1.3-alpha.0",
7
8
  "type": "module",
8
- "description": "A filesystem event bus for explicit, inspectable automation",
9
+ "description": "Turn ordinary folders into durable, inspectable AI and code workflows that any person, agent, or program can invoke by writing a file",
9
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",