@tim-fs/cli 0.1.0 → 0.1.1
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.
- package/README.md +4 -4
- package/dist/index.js +28 -20
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# tim-fs
|
|
1
|
+
# @tim-fs/cli
|
|
2
2
|
|
|
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.
|
|
@@ -6,8 +6,8 @@ for explicit, inspectable automation.
|
|
|
6
6
|
## Run with npx
|
|
7
7
|
|
|
8
8
|
```sh
|
|
9
|
-
npx tim-fs init
|
|
10
|
-
npx tim-fs start [directory]
|
|
9
|
+
npx @tim-fs/cli init
|
|
10
|
+
npx @tim-fs/cli start [directory]
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
`init` stores optional provider credentials in `~/.tim/.env` and installs bundled prompts in
|
|
@@ -17,7 +17,7 @@ press `Ctrl-C`.
|
|
|
17
17
|
## Install globally
|
|
18
18
|
|
|
19
19
|
```sh
|
|
20
|
-
npm install --global tim-fs
|
|
20
|
+
npm install --global @tim-fs/cli
|
|
21
21
|
tim init
|
|
22
22
|
tim start ~/workspace
|
|
23
23
|
```
|
package/dist/index.js
CHANGED
|
@@ -1,28 +1,36 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import
|
|
3
|
-
`,"utf8")})().catch(s=>{let i=s instanceof Error?s.message:
|
|
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)}
|
|
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
|
|
6
|
-
${n}`:a})),ht=(e={})=>{let t=e.transports?.length?e.transports:si,r=!1,o=[];t.includes("console")&&o.push(new qo.Console({format:Si}));let n=e.logPath??e.fsPath??"log.txt";t.includes("fs")&&o.push(new Ir({defaultLogPath:n,format:ni}));let s=ei({level:"debug",transports:o.length?o:[new qo.Console]}),i=async(m,y)=>{let h=ii(m,"info",e.source,y),I=h.level??"info",A={...h,level:I,timestamp:h.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,y)=>i({message:m,level:"debug",data:y,source:e.source}),u=async(m,y)=>i({message:m,level:"info",data:y,source:e.source}),c=async(m,y)=>i({message:m,level:"warn",data:y,source:e.source});return{log:i,debug:a,info:u,warn:c,error:async(m,y)=>i({message:m,level:"error",data:y,source:e.source}),clearLogs:async(m=()=>!0)=>{if(t.includes("fs"))try{await me.mkdir(ft.dirname(n),{recursive:!0}).catch(()=>{}),await me.writeFile(n,"",{flag:"a"}),await me.truncate(n,0),await u("\u{1F9F9} Logs cleared",{logPath:n})}catch(y){let h=y instanceof Error?y.message:Sr.format("%o",y);await c("Failed to clear logs",{logPath:n,error:h})}t.includes("custom")&&e.clearLogs&&await e.clearLogs(m)}}},zc=ht();import qe from"node:path";var Yo=()=>{let e=ht({source:"tim-core",transports:["console"]});return Jo(e),e},Ue=(e,t={})=>{let r={...t,message:e,level:t.level??"info",timestamp:t.timestamp??Date.now()},o=vr();return o&&o.log(r),r},V=(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 Y(e,t,r={}){let o=qe.resolve(se()||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()},c=e.global.logs.console,g=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&&!g&&!f&&yt(c.detail,u)){let y=vr();y&&y.log(u)}let m=[];if(r.local!==!1&&e.global.logs.local.enabled){let y=r.localPath??qe.join(e.paths.sessionFull||qe.dirname(e.paths.fileFull),"log.txt");m.push({path:y,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&&xr(u,m,N()),u}var Ho=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 Xo from"node:path";function wi(e){return xi.createHash("sha1").update(Xo.resolve(e)).digest("hex").slice(0,12)}function bt(e){return Xo.join(Ci.tmpdir(),"tim-core",wi(e))}var te=()=>jo(),$=e=>N().existsSync(e);var Ge=e=>N().ensureDirSync(e);var wr=e=>N().removeSync(e),Pr=(e,t)=>N().copySync(e,t);var xt=e=>N().readJsonSync(e),ie=(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}},Ve=(e,t="utf-8")=>N().readFileSync(e,t),M=e=>N().readFileSync(e),Tr=(e,t,r="utf-8")=>N().writeFileSync(e,t,{encoding:r}),Fr=(e,t,r=2)=>N().writeJsonSync(e,t,{spaces:r}),We=(e,t)=>N().writeFileSync(e,t),Ct="_meta",Pi="_temp",Zo="_done",It="_cleanup",Qo=new Set(["_analysis",It,"_partial","_parts","_transcript"]),Ti=new Set(["_analysis",It,Zo,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 Ce(e){return e.replace(/^\/+|\/+$/g,"").replace(/[^a-z0-9._-]+/gi,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()}function _i(e){return Ce(e.paths.file||e.fileName||"source")||"source"}function Ei(e){let t=x.dirname(e.paths.file||"");return Ce(t==="."?e.paths.session||"session":t)||"session"}function Ar(e){return(e.operationId||"manual").replace(/[^a-z0-9._-]+/gi,"-")}function Li(e){let[t]=wt(e);return Qo.has(t)}function Ni(e,t){let r=wt(t),o=Ce(r.shift()||"work").replace(/^_+/,"")||"work",n=Ce(r.join("__")||x.basename(t)||"file");return`${Ei(e)}__${o}__${n}`}function en(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 Oi(e,t){let r=en(e,t);return`${Ar(e)}__${r}`}function St(e){return rn(e,e.global.meta,"meta")}function tn(e){return rn(e,e.global.intermediates,"intermediates")}function rn(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",Ar(e),r);default:return x.join(bt(e.paths.rootFull),t.directory)}}function Cr(e,t,r,o){return r.location==="source"||r.location==="source-subdirectory"?x.basename(t):o==="meta"?Oi(e,t):Ni(e,t)}function xe(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),Cr(e,n,e.global.meta,"meta"));return r.forWrite?s:Ri(e,n)||s}return Li(t)?x.join(tn(e),Cr(e,t,e.global.intermediates,"intermediates")):x.join(e.paths.sessionFull,t)}function kr(e,t,r={}){return xe(e,t,r)}function Ri(e,t){let r=N(),o=x.basename(t),n=en(e,t),s=_i(e),i=St(e),a=x.join(i,Cr(e,t,e.global.meta,"meta"));if(r.existsSync(a))return a;if(r.existsSync(i)){let g=r.readdirSync(i).filter(f=>f.endsWith(`__${n}`)||f.endsWith(`__${o}`)&&f.includes(`__${s}__`)).sort();if(g.length)return x.join(i,g[g.length-1])}let u=x.join(e.paths.sessionFull,Ct,o);if(r.existsSync(u))return u;let c=x.join(e.paths.sessionFull,o);return r.existsSync(c)?c:null}function on(e){let t=N(),r=x.join(bt(e.paths.rootFull),"_ephemeral",Ar(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=>{let t=N();function r(l,d){try{let{paths:b}=e,S=l==="sessionFull"?xe(e,d):x.join(b[l],d);return t.existsSync(S)?t.readJsonSync(S):{}}catch(b){V("File manager failed to read JSON",b,{filePath:d})}}function o(l,d,b){try{let{paths:S}=e,F=l==="sessionFull"?xe(e,d,{forWrite:!0}):x.join(S[l],d);t.ensureDirSync(x.dirname(F)),t.writeJsonSync(F,b,{spaces:2})}catch(S){V("File manager failed to write JSON",S,{filePath:d})}}function n(l,d,b,S){try{let{paths:F}=e,J=x.join(F[l],`${d}.${S}.json`);t.writeJsonSync(J,b,{spaces:2})}catch(F){V("File manager failed to write AI request",F,{id:d,suffix:S})}}function s(l,d,b){return n(l,d,b,"llm")}function i(l,d,b){return n(l,d,b,"convo")}function a(l,d,b){return n(l,d,b,"image")}function u(l,d,b){return n(l,d,b,"vision")}function c(l,d,b){return n(l,d,b,"tts")}function g(l,d={}){try{let{paths:b,machineId:S,sessionId:F,userId:J}=e,q={id:lt(),ts:Date.now(),userId:J,machineId:S,sessionId:F,orderType:l,...d},ne=x.join(b.rootFull,"_orders",`${q.id}.json`);t.ensureDirSync(x.dirname(ne)),t.writeJsonSync(ne,q,{spaces:4})}catch(b){V("File manager failed to write bridge order",b,{orderType:l})}}function f(l,d,b){try{let{paths:S}=e,F=l==="sessionFull"?xe(e,d,{forWrite:!0}):x.join(S[l],d);t.ensureDirSync(x.dirname(F)),t.writeFileSync(F,b)}catch(S){V("File manager failed to write binary file",S,{filePath:d})}}function m(l,d,b){try{let{paths:S}=e,F=l==="sessionFull"?xe(e,d,{forWrite:!0}):x.join(S[l],d);t.ensureDirSync(x.dirname(F)),t.copySync(b,F)}catch(S){V("File manager failed to copy file",S,{filePath:d,sourcePath:b})}}function y(l,d){try{let{paths:b}=e,S=l==="sessionFull"?xe(e,d):x.join(b[l],d);return t.readFileSync(S,"utf-8")}catch(b){V("File manager failed to read binary file",b,{filePath:d})}}function h(l,d){try{let{paths:b}=e,S=x.join(b[l],d);return t.readdirSync(S)}catch(b){return V("File manager failed to read directory",b,{path:d}),[]}}function I(l,d,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||!d||vt(z,d))).reduce((z,ee)=>(z[ee]=t.readJsonSync(x.join(E,ee)),z),{}):{},J=["workspace","os-temp","none"].includes(e.global.meta.location),q=l==="sessionFull"&&!b&&J?Object.entries(F(St(e),!1)).reduce((E,[B,z])=>{let ee=B.split("__").pop()||B;return(!d||vt(ee,d)||vt(B,d))&&(E[ee]=z),E},{}):{},ne=!b&&e.global.meta.location==="source-subdirectory"?F(St(e)):{},K=b?{}:F(x.join(S,Ct));return{...F(S),...K,...ne,...q}}function A(l){let{paths:d}=e;t.emptyDirSync(d[l])}function C(l,d){let{paths:b}=e,S=x.join(b[l],`${d}.md`);t.existsSync(S)&&t.unlinkSync(S),t.writeFileSync(S,Date.now().toString(),{encoding:"utf-8"})}function w(l,d){let{paths:b}=e,S=x.join(b[l],`${d}.md`);t.existsSync(S)&&t.removeSync(S)}async function v(l,d){C(l,d),w(l,d)}function T(l,d){let{paths:b}=e,S=l==="sessionFull"&&Qo.has(wt(d)[0])?tn(e):x.join(b[l],d);t.ensureDirSync(S)}function L(l,d){let{paths:b}=e,S=l==="sessionFull"?xe(e,d):x.join(b[l],d);return t.existsSync(S)}function R(){return G(e.fileName)}function G(l){let d=x.join(e.paths.sessionFull,l);if(!d||!t.existsSync(d)||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,Zo),S=$i(t,x.join(b,x.basename(l)));return t.ensureDirSync(b),t.copySync(d,S),t.removeSync(d),S}function _e(l,d){let b=d.startsWith(".")?d:`.${d}`,S=x.extname(l);return S?l.slice(0,-S.length)+b:`${l}${b}`}function ve(l){let d=e.config||{};return(d.cleanUp||d.cleanup||{})?.[l]||null}function pt(l){let d=[],b=new Set;for(let S of l){let F=ve(S);if(!F)continue;let J=[],q=(E,B)=>{let z=`move-to-done:${E}`;if(b.has(z))return;b.add(z);let ee=G(E);J.push({action:"move-to-done",reason:B,fileName:E,status:ee?"moved":"skipped",donePath:ee})},ne=(E,B)=>{let z=`delete:${E}`;if(b.has(z))return;b.add(z);let ee=x.join(e.paths.sessionFull,E);if(!t.existsSync(ee)){J.push({action:"delete",reason:B,fileName:E,status:"missing"});return}t.removeSync(ee),J.push({action:"delete",reason:B,fileName:E,status:"deleted"})},K=(E,B)=>{if(F.verb==="done"){q(E,B);return}F.verb==="delete"&&ne(E,B)};K(e.fileName,"trigger");for(let E of Array.isArray(F.additionalExt)?F.additionalExt:[])K(_e(e.fileName,E),`additionalExt:${E}`);for(let E of Array.isArray(F.additionalFiles)?F.additionalFiles:[])K(E,"additionalFiles");d.push({commandName:S,policy:F,actions:J})}return d}function Ms(l,d,b){if(!b.length)return null;let S=d.replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase(),F=x.join(It,`${l}.${S}.cleanup.json`);return o("sessionFull",F,{botName:l,sourceFileName:d,createdAt:Date.now(),actions:b}),F}function Js(l){let d=x.join(e.paths.sessionFull,It);if(!t.existsSync(d))return[];let b=[],S=t.readdirSync(d).filter(F=>F.endsWith(".cleanup.json")).sort();for(let F of S){let J=x.join(d,F),q=t.readJsonSync(J);if(q.sourceFileName&&q.sourceFileName!==l)continue;let ne=Array.isArray(q.actions)?q.actions:[],K=[];for(let E of ne){if(!E?.fileName||ki(E.fileName,".."))continue;let B=x.join(e.paths.sessionFull,E.fileName);if(!t.existsSync(B)){K.push({...E,status:"missing"});continue}if(E.action==="move-to-done"){let z=G(E.fileName);K.push({...E,status:z?"moved":"skipped",donePath:z});continue}E.action==="delete"&&(t.removeSync(B),K.push({...E,status:"deleted"}))}t.removeSync(J),b.push({manifestFileName:F,botName:q.botName,sourceFileName:q.sourceFileName,actions:K})}return b}function Bs(l,d){for(let b in d)f(l,b,d[b])}function zs(l,d,b){let S=d.replace(/\.[^.]+$/,".meta.json"),F=d.replace(/\.[^.]+$/,".txt"),{usage:J,cost:q,model:ne,duration:K}=b||{};return o(l,S,{model:ne,usage:J,cost:q,duration:K,sourceFileName:d,outputFileName:F}),S}function Ro(l){let{paths:d}=e,b=d[l];return t.existsSync(b)||(b=x.dirname(d.fileFull)),t.existsSync(b)?x.join(b,"log.txt"):null}function $o(l,d={}){let b=d.type==="error"?"error":d.type==="warn"?"warn":"info";return{kind:d.type==="skip"?"bot-skip":d.type==="output"?"bot-output":"bot-step",level:b,message:l,data:d.data,duration:d.duration}}function qs(l,d,b={}){let S=Ro(l);S&&Y(e,$o(d,b),{console:!1,local:!0,localPath:S,operation:!1,workspace:!1})}function Us(l,d,b={}){let S=Ro(l);Y(e,$o(d,b),{local:!!S,localPath:S??void 0,operation:!0,workspace:!0})}function ct(l,d,b){let F={...r(l,d),...b};return o(l,d,F)}function Do(l,d=""){let{paths:b}=e,S=b[l];return d&&(S=x.join(S,d)),t.readdirSync(S)}function Gs(l,d,b){let S=Do(l,b).filter(J=>!d||vt(J,d));if(S.length===0)return null;S.sort();let F=S.pop();return F?Ho(F):null}return{sessionFull:e.paths.sessionFull,machineFull:e.paths.machineFull,readFile:l=>t.readJsonSync(`${se()}${l}`),orders:{writeBridgeOrder:g},session:{read:l=>l.endsWith(".json")?r("sessionFull",l):y("sessionFull",l),write:(l,d)=>l.endsWith(".json")?o("sessionFull",l,d):typeof d=="string"&&x.isAbsolute(d)&&t.existsSync(d)?m("sessionFull",l,d):f("sessionFull",l,d),patch:(l,d)=>ct("sessionFull",l,d),writeTextToTextRequest:(l,d)=>s("sessionFull",l,d),writeConvoRequest:(l,d)=>i("sessionFull",l,d),writeImageRequest:(l,d)=>a("sessionFull",l,d),writeVisionRequest:(l,d)=>u("sessionFull",l,d),writeTtsRequest:(l,d)=>c("sessionFull",l,d),removeCheckpoint:l=>w("sessionFull",l),recycleCheckpoint:l=>v("sessionFull",l),readDir:l=>h("sessionFull",l),readDirJsons:(l,d)=>I("sessionFull",l,d),ensureDir:l=>T("sessionFull",l),emptyDir:()=>A("sessionFull"),copyFrom(l){let d=x.join(e.paths.machineFull,"sessions",l),b=e.paths.sessionFull;t.copySync(d,b)},exists:l=>L("sessionFull",l),writeByFile:l=>Bs("sessionFull",l),saveMeta:(l,d)=>zs("sessionFull",l,d),patchSessionJson:l=>{if(!(!e.machineId||!e.sessionId))return ct("sessionFull","_session.json",l)},saveTimeline:l=>{if(!(!e.machineId||!e.sessionId))return o("sessionFull","_timeline.json",l)},listFiles:()=>Do("sessionFull"),addToLog:(l,d={})=>Us("sessionFull",l,d),addToLocalLog:(l,d={})=>qs("sessionFull",l,d),generateMd:l=>C("sessionFull",l),getNextFile:(l,d)=>Gs("sessionFull",l,d),moveInputFileToDone:R,applyCleanupPolicy:pt,writeCleanupManifest:Ms,applyCleanupManifests:Js},machine:{read:l=>r("machineFull",l),write:(l,d)=>o("machineFull",l,d),patch:(l,d)=>ct("machineFull",l,d),patchState:l=>ct("machineFull","state.json",l),readDir:l=>h("machineFull",l),readDirJsons:(l,d)=>I("machineFull",l,d),ensureDir:l=>T("machineFull",l),generateMd:l=>C("machineFull",l)},srcData:{read:l=>{let d=x.resolve("./src");return t.readJsonSync(x.join(d,"data",l))}}}};import Tt from"lodash";var de={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 nn(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 Ke(e){let t=e&&typeof e=="object"?e:{};return{logs:{console:Mi(t.logs?.console,de.logs.console),local:Pt(t.logs?.local,de.logs.local),operation:ji(t.logs?.operation,de.logs.operation),workspace:Pt(t.logs?.workspace,de.logs.workspace)},intermediates:nn(t.intermediates,de.intermediates),meta:nn(t.meta,de.meta)}}import Pe from"lodash";import p from"lodash";function ae(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 ue(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 re(e={}){return p.pickBy(e,t=>t!=null&&t!=="")}function Ft(e={}){let t=p.get(e,"options");return!t||typeof t!="object"||Array.isArray(t)?e:{...t,...e}}function At(e){return typeof e=="string"&&/^\d+x\d+$/i.test(e.trim())}function Ji(e={},t){let r=t==="speech"?"tts":t,o=p.get(e,[`ai-${r}`,"output"]);if(!o||Array.isArray(o)||typeof o!="object")return{};if(r==="image"){let n=Ft(o),s=p.get(n,"imageSize");return re({task:"image",provider:p.get(n,"provider")??p.get(n,"imageProvider"),model:p.get(n,"model")??p.get(n,"imageModel"),size:p.get(n,"size")??(At(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")??(At(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=Ft(o);return re({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 re(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 Bi(e={},t){if(t==="image"){let r=Ft(p.get(e,"image",{})),o=p.get(e,"imageSize")??p.get(r,"imageSize");return re({task:"image",provider:p.get(e,"imageProvider")??p.get(r,"provider"),model:p.get(e,"imageModel")??p.get(r,"model"),size:p.get(e,"size")??p.get(r,"size")??(At(o)?o:void 0),aspectRatio:p.get(e,"imageAspectRatio")??p.get(r,"aspectRatio"),imageSize:p.get(e,"googleImageSize")??p.get(r,"googleImageSize")??p.get(e,"imageResolution")??p.get(r,"resolution")??(At(o)?void 0:o),quality:p.get(e,"imageQuality")??p.get(r,"quality"),outputFormat:p.get(e,"imageOutputFormat")??p.get(r,"outputFormat"),background:p.get(e,"imageBackground")??p.get(r,"background"),moderation:p.get(e,"imageModeration")??p.get(r,"moderation"),n:p.get(e,"imageN")??p.get(r,"n"),outputCompression:p.get(e,"imageOutputCompression")??p.get(r,"outputCompression"),providerOptions:p.get(e,"imageProviderOptions")??p.get(r,"providerOptions"),reference:p.get(e,"reference")??p.get(e,"imageReference")??p.get(r,"reference")??p.get(r,"imageReference"),references:p.get(e,"references")??p.get(e,"imageReferences")??p.get(r,"references")??p.get(r,"imageReferences"),referenceImagePath:p.get(e,"referenceImagePath")??p.get(e,"imageReferencePath")??p.get(r,"referenceImagePath")??p.get(r,"imageReferencePath"),referenceImagePaths:p.get(e,"referenceImagePaths")??p.get(e,"imageReferencePaths")??p.get(r,"referenceImagePaths")??p.get(r,"imageReferencePaths"),referenceType:p.get(e,"referenceType")??p.get(e,"imageReferenceType")??p.get(r,"referenceType")??p.get(r,"imageReferenceType"),referenceTypes:p.get(e,"referenceTypes")??p.get(e,"imageReferenceTypes")??p.get(r,"referenceTypes")??p.get(r,"imageReferenceTypes")})}if(t==="video"){let r=Ft(p.get(e,"video",{}));return re({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 re({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 re({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 re({task:"llm",provider:p.get(e,"llmProvider")??p.get(e,"aiProvider")??p.get(e,"provider"),model:p.get(e,"llmModel")??p.get(e,"model"),providerOptions:p.get(e,"llmProviderOptions")??p.get(e,"providerOptions")})}function H(e={},t,r={}){let o=p.get(e,"ai",{}),n=t==="speech"?"tts":t,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,Bi(e,n),Ji(e,n),re(r));return u.task=n,u.provider=ae(u.provider),u.provider||(u.provider=ue(u.model,n)),re(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 _r(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 sn(e,t){return _r(t)??_r(e.params?.language)??_r(e.params?.languageCode)}import sa from"node:fs";import Lt from"node:fs";import gn from"lodash";import Oe from"path";import Ui from"chokidar";import Gi from"fs-extra";import{globSync as Vi}from"glob";import an from"kleur";import{minimatch as Er}from"minimatch";import{dirname as un,isAbsolute as pn,join as Le}from"node:path";var Ee=["node_modules/**","**/node_modules/**","**/dist/**","**/build/**","**/out/**","**/coverage/**","**/.cache/**","**/.tmp/**","**/tmp/**","**/log.txt"],Rm=[...Ee,/(^|[\/\\])\../];import{globSync as qi}from"glob";var Ye=(e,t,r=[])=>qi(t,{cwd:e,ignore:[...Ee,...r],nodir:!0,dot:!1}),kt=(e,t,r=[])=>Ye(e,t,r).length;function _t(e){return e.replace(/\\/g,"/").replace(/^\/+/,"")}function Wi(e,t){let r=_t(t).replace(/\/+$/,"");if(!r||r.startsWith("#")||r.startsWith("!"))return[];let o=_t(t.startsWith("/")?r:Le(e,r));if(!r.includes("/")){let n=_t(Le(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=un(r)==="."?"":un(r);return Gi.readFileSync(Le(e,r),"utf-8").split(/\r?\n/).map(s=>s.trim()).flatMap(s=>Wi(o,s))})}function Lr(e){let{cwd:t,target:r,watchPaths:o,depth:n,callbacks:s={},createContext:i,ignore:a=[],ignoreLogs:u,silent:c=!1}=e,g=Ki(t),f=[...a,...g],m=g.map(v=>Le(t,v)),y=o?.length?o.map(v=>pn(v)?v:Le(t,v)):[t],h=o?.length?o.reduce((v,T)=>v+kt(pn(T)?T:Le(t,T),"*",f),0):kt(t,r,f),I=Ui.watch(y,{persistent:!0,depth:n,ignored:[...Ee,...f,...m,/(^|[\/\\])\../],ignoreInitial:!0}),A=(v,T)=>i?i(v,T):v,C=v=>Er(_t(v),r),w=v=>{let T=v.replace(/\\/g,"/"),L=T.replace(/^\/+/,"");return f.some(R=>Er(T,R)||Er(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 G=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||(c||console.log(an.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",()=>{c||console.log(an.magenta("watching:"),h,"files")}),I}import He from"node:path";function Et(e,t){let r=t?He.dirname(t):e,o=He.relative(e,r);if(!o||o==="."||o.startsWith("..")||He.isAbsolute(o))return[e];let n=o.split(He.sep).filter(Boolean),s=[e];for(let i=1;i<=n.length;i++)s.push(He.join(e,...n.slice(0,i)));return s}import Zm from"fs-extra";import{homedir as Yi}from"node:os";import Hi from"node:path";import cn from"lodash";var ge=new Map,mn=Symbol.for("tim.resolvedGalleryImports");function Ne(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.");ge.set(t.name,t);for(let r of t.aliases||[])ge.set(r,t)}}function ln(e){return e[mn]??[]}function fe(){return process.env.TIM_PROMPTS_HOME||Hi.join(Yi(),".tim","prompts")}function Xi(e,t){return Object.defineProperty(e,mn,{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 dn(e,t){if(typeof e=="string"){t(e);return}if(Array.isArray(e))for(let r of e)dn(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))dn(n,s=>{ge.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"&&!ge.has(n))return n;if(o&&typeof o=="object"){for(let s of Object.values(o))if(typeof s=="string"&&!ge.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"&&ge.has(s)&&(o[n]=ta(ge.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=ge.get(e);if(!o)throw new Error(`Unknown IO gallery import: ${e}`);r.add(o.name),t.add(e);let n=we(o.config,t,r);return t.delete(e),n}function we(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)cn.merge(n,oa(s,t,r));return cn.merge(n,Zi(e)),ra(n),Xi(n,r)}function fn(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=fn(s),u=[];t==="_prompts"&&u.push({dirPath:fe(),fs:{existsSync:Lt.existsSync,readdirSync:Lt.readdirSync,readFileSync:Lt.readFileSync,readJsonSync:c=>JSON.parse(Lt.readFileSync(c,"utf-8"))}}),u.push(...Et(i,a).map(c=>({dirPath:Oe.join(c,t),fs:o})));for(let{dirPath:c,fs:g}of u){if(!g.existsSync(c))continue;let f=g.readdirSync(c).filter(m=>m.endsWith(".md"));for(let m of f){let y=Oe.basename(m),h=Oe.parse(y).name;h.includes(".")&&(h=h.split(".").pop());let I="";I=g.readFileSync(Oe.join(c,m),"utf-8"),I=I.trim().replace(`
|
|
7
|
-
`,"");let A=t==="voices"?"voiceId":"promptTemplate";n[h]={[A]:na(I,r)};let C=m.replace(".md",".schema.json"),w=Oe.join(c,C);if(g.existsSync(w)){let v=g.readJsonSync(w);n[h].schema=v}}}return n},yn=(e,t)=>{let r={},o=new Set,{paths:n}=e,{rootFull:s}=n,i=fn(n),a=Et(s,i).map(u=>Oe.join(u,"config.json"));for(let u of a){if(!t.existsSync(u))continue;let c=we(t.readJsonSync(u),new Set,o);gn.merge(r,c)}return we(r,new Set,o)};function na(e,t){return e.replace(/\$\{([^}]+)\}/g,(r,o)=>{let n=String(o).trim(),s=gn.get(t,n);return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s,null,2)})}var oe=e=>({resolveConfig:t=>yn(t,e),resolveLibrary:(t,r,o={})=>Nt(t,r,o,e),resolvePrompts:(t,r={})=>{let o=ln(t.config||{}),n=fe();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 Te=()=>({prepareTextToTextRequest(e,t){let{promptId:r,inject:o,extra:n}=t,s=oe(te()),i=o??{...e.settings,...e.params,fileContent:e.fileContent?.text},a=s.resolvePrompts(e,i),u=H(e.settings,"llm",{provider:t.provider,model:t.model,providerOptions:t.providerOptions}),{provider:c,model:g,providerOptions:f}=u,m=Pe.get(a,[r,"promptTemplate"],""),y=Pe.get(a,[r,"schema"],{});if(!m)throw new Error(`No prompt template found for promptId: ${r}`);let h={provider:c,model:g,prompt:m,schema:y,providerOptions:f,...n||{}};return Pe.pickBy(h,I=>I!=null&&I!=="")},prepareTtsRequest(e,t){let{text:r,prompt:o,promptId:n,inject:s}=t,i=oe(te()),a=s??{...e.settings,...e.params,fileContent:e.fileContent?.text};if(n&&!o&&!r){let m=i.resolvePrompts(e,a);o=Pe.get(m,[n,"promptTemplate"],"")}if(r=(r||o||e.fileContent?.text||"").trim(),!r)throw new Error("No TTS text found in prompt template or source file content.");let u=H(e.settings,"tts",{provider:t.provider,model:t.model,voiceId:t.voiceId,outputFormat:t.outputFormat,speed:t.speed,instructions:t.instructions,providerOptions:t.providerOptions}),c=u.voiceId||t.voiceId,g=u.model||"eleven_v3",f=sn(e,t.languageCode);return Pe.pickBy({provider:u.provider,text:r,voiceId:c,model:g,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=H(e.settings,"image",{provider:t.provider,model:t.model,size:t.size,aspectRatio:t.aspectRatio,imageSize:t.imageSize,quality:t.quality,outputFormat:t.outputFormat,background:t.background,moderation:t.moderation,n:t.n,outputCompression:t.outputCompression,reference:t.reference,references:t.references,referenceImagePath:t.referenceImagePath,referenceImagePaths:t.referenceImagePaths,referenceType:t.referenceType,referenceTypes:t.referenceTypes,providerOptions:t.providerOptions}),a=oe(te()),u=s??{...e.settings,...e.params,fileContent:e.fileContent?.text};if(n&&!o){let g=a.resolvePrompts(e,u);o=Pe.get(g,[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 Pe.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||{}},g=>g!=null&&g!=="")}});import{createAnthropic as ua}from"@ai-sdk/anthropic";import{createAzure as pa}from"@ai-sdk/azure";import{createByteDance as ca}from"@ai-sdk/bytedance";import{createElevenLabs as ma}from"@ai-sdk/elevenlabs";import{createGoogleGenerativeAI as la}from"@ai-sdk/google";import{createHuggingFace as da}from"@ai-sdk/huggingface";import{createOpenAI as ga}from"@ai-sdk/openai";import{createXai as fa}from"@ai-sdk/xai";import{Output as ya,experimental_generateSpeech as ha,experimental_generateVideo as ba,experimental_transcribe as va,generateImage as Ia,generateText as Ot,jsonSchema as Sa}from"ai";var pe={inputCost:0,cachedInputCost:0,outputCost:0,totalCost:0,breakdown:{inputTokens:0,cachedTokens:0,billedInputTokens:0,outputTokens:0,audioTokens:0}};var hn={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=hn.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 Nr(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{...pe,breakdown:{...pe.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,g=s*o.output/1e6;return{inputCost:u,cachedInputCost:c,outputCost:g,totalCost:u+c+g,breakdown:{inputTokens:n,cachedTokens:i,billedInputTokens:a,outputTokens:s,audioTokens:0}}}function Or(){return ga({apiKey:process.env.OPENAI_API_KEY})}function vn(){return pa({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 Rr(){return la({apiKey:process.env.GOOGLE_API_KEY})}function In(){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 Sn(){return fa({apiKey:process.env.XAI_API_KEY})}function Ca(){return da({apiKey:process.env.HUGGINGFACE_API_KEY||process.env.HF_TOKEN})}function Re(e,t){try{e?.(t)}catch{}}function wa(e){let t=0;return ca({apiKey:process.env.ARK_API_KEY,fetch:async(r,o)=>{let n=await globalThis.fetch(r,o);if(!n.ok)return n;try{let 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))Re(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";Re(e,{phase:u==="succeeded"?"ready":"polling",status:u,taskId:typeof a.id=="string"?a.id:void 0,pollCount:t})}}catch{}return n}})}function $e(e,t){if(!t)throw new Error(`AI provider "${e}" requires an explicit model in settings or request.`);return t}function $r(e,t){let r=ae(e)||ue(t,"llm");if(r==="azure"){let o=$e("azure",t);return{provider:"azure",model:o,sdkModel:vn()(o)}}if(r==="anthropic"){let o=$e("anthropic",t);return{provider:"anthropic",model:o,sdkModel:xa()(o)}}if(r==="xai"){let o=$e("xai",t);return{provider:"xai",model:o,sdkModel:Sn()(o)}}if(r==="huggingface"){let o=$e("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:Rr()(t||"gemini-2.5-pro")}:{provider:"openai",model:t||"gpt-5.2",sdkModel:Or()(t||"gpt-5.2")}}function Pa(e,t,r){let o=ae(e)||ue(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=ae(e)||ue(t,"image");if(r==="xai"){let o=$e("xai",t);return{provider:"xai",model:o,sdkModel:Sn().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:Rr().image(o)}}return{provider:"openai",model:t||"gpt-image-1",sdkModel:Or().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 _a(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:g,output_format:f,...m}=o,y=e.referenceImages?.map(ka),h=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,...y?.length?{image:y.length===1?y[0]:y}:{},...e.size||e.imageSize?{size:e.size||e.imageSize}:{},output_format:e.outputFormat||g||f||"jpeg",response_format:u||c||"b64_json"})}),I=await h.json();if(!h.ok)throw new Error(`ByteDance image generation failed (${h.status}): ${I?.error?.message||h.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 We(e.outputPath,C),{provider:"bytedance",model:I.model||t,usage:I.usage||{},cost:Nr("bytedance",I.model||t,I.usage),outputFormat:e.outputFormat||g||f||"jpeg",providerMetadata:{bytedance:{created:I.created,size:A.size}},warnings:[]}}function Ea(e,t){return(ae(e)||ue(t,"tts"))==="openai"?{provider:"openai",model:t||"tts-1",sdkModel:Or().speech(t||"tts-1")}:{provider:"elevenlabs",model:t||"eleven_v3",sdkModel:In().speech(t||"eleven_v3")}}function La(e,t){let r=ae(e)||ue(t,"transcription");if(r==="elevenlabs"){let o=t||"scribe_v2";return{provider:"elevenlabs",model:o,sdkModel:In().transcription(o)}}if(r==="azure"){let o=$e("azure",t);return{provider:"azure",model:o,sdkModel:vn().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:Rr()(t||"gemini-2.5-flash")}}function De(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,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 g=s*a/1e6,f=n*u/1e6,m=i*c/1e6;return{inputCost:g,cachedInputCost:f,outputCost:m,totalCost:g+f+m,breakdown:{inputTokens:o,cachedTokens:n,billedInputTokens:s,outputTokens:i,audioTokens:0}}}function Rt(e,t,r){let o=De(r),n=o.input_tokens_details?.cached_tokens??0;return!o.input_tokens&&!o.output_tokens?pe:e==="google"?Oa(o,t):e==="openai"?Na(o):{...pe,breakdown:{inputTokens:o.input_tokens,cachedTokens:n,billedInputTokens:Math.max(0,o.input_tokens-n),outputTokens:o.output_tokens,audioTokens:0}}}function bn(e){return!!(e&&typeof e=="object"&&Object.keys(e).length>0)}async function Ra(e){let{provider:t,model:r,sdkModel:o}=$r(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,...bn(e.schema)?{output:ya.object({schema:Sa(e.schema),name:"schema"})}:{}}),s=bn(e.schema)?n.output:n.text,i=De(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}=$r(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=De(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 Dr(e){let{provider:t,model:r,sdkModel:o}=$r(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=De(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 xn(e){if((ae(e.provider)||ue(e.model,"image"))==="bytedance"){if(!e.prompt)throw new Error('generateAiSdkImage: "prompt" is required.');return _a(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}),c=u.image;if(!c)throw new Error("generateAiSdkImage: no image returned.");We(e.outputPath,Buffer.from(c.uint8Array));let g=u.providerMetadata?.openai?.images?.[0]?.revisedPrompt;return{provider:r,model:o,usage:u.usage||{},cost:Nr(r,o,u.usage),outputFormat:e.outputFormat,revisedPrompt:g,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}=Pa(e.provider,e.model,e.onProgress);Re(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 Re(e.onProgress,{phase:"downloaded",bytes:s.byteLength,mediaType:n.video.mediaType}),We(e.outputPath,s),Re(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 Re(e.onProgress,{phase:"failed",error:n instanceof Error?n.message:String(n)}),n}}async function Cn(e){let{provider:t,model:r,sdkModel:o}=Ea(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
|
|
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}
|
|
9
9
|
|
|
10
10
|
Reference image guidance:
|
|
11
11
|
${r.map(o=>`- ${o}`).join(`
|
|
12
|
-
`)}`}function Ze(e={},t={}){return Nn(e.provider)||Nn(O(t,"imageProvider"))||On(e.model)||On(O(t,"imageModel"))||"google"}function Gr(e={},t={}){let r=Ze(e,t);return r==="openai"||r==="bytedance"?Ha(e.outputFormat||e.output_format||O(t,"imageOutputFormat")||"jpeg"):"jpg"}function Qe(e={},t={}){return{provider:Ze(e,t),model:e.model||O(t,"imageModel"),size:e.size||O(t,"imageSize"),aspectRatio:e.aspectRatio||O(t,"imageAspectRatio"),imageSize:e.imageSize||e.resolution||O(t,"googleImageSize")||O(t,"imageResolution"),quality:e.quality||O(t,"imageQuality"),outputFormat:e.outputFormat||e.output_format||O(t,"imageOutputFormat"),background:e.background||O(t,"imageBackground"),moderation:e.moderation||O(t,"imageModeration"),n:e.n||O(t,"imageN"),outputCompression:e.outputCompression||e.output_compression||O(t,"imageOutputCompression"),providerOptions:e.providerOptions||O(t,"imageProviderOptions")}}async function Vr(e,t,r={}){let o=Qe(e,r),n=Xa(e,r,Ur.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 xn({...o,prompt:a,outputPath:t,referenceImages:s})}import Mt from"lodash";import ye from"path";function Jt(e){return/^https?:\/\//i.test(e)||/^data:/i.test(e)}function Bt(e={},t={},r=process.cwd()){let o=H(t,"video",e),n=String(o.referenceImagePath||o.reference||"").trim(),s=!!e.referenceImagePaths?.length,i=n||(!s&&$(ye.resolve(r,"ref.png"))?"ref.png":"");return!i||Jt(i)||ye.isAbsolute(i)?i||void 0:ye.resolve(r,i)}function zt(e=[],t=process.cwd()){return[...new Set(e.map(r=>r.trim()).filter(Boolean))].map(r=>Jt(r)||ye.isAbsolute(r)?r:ye.resolve(t,r))}function ru(e){if(!e||Jt(e))return e;if(!$(e))throw new Error(`genai.videos: reference image not found: ${e}`);return M(e)}function ou(e){let t=ye.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(!$(e))throw new Error(`genai.videos: reference image not found: ${e}`);return`data:${ou(e)};base64,${M(e).toString("base64")}`}async function Wr(e,t,r={}){let o=H(r,"video",e),n=String(o.prompt||e.prompt||"").trim();if(!n)throw new Error("genai.videos: prompt is required.");let s=Bt(e,r,ye.dirname(t)),i=zt(e.referenceImagePaths,ye.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 jr({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 Kr(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 Yr=(e,t=.22)=>e/60*t;import{spawn as au}from"node:child_process";function Hr(e,t,r=[]){return e.includes(t)?e:[t,...r,...e]}function Dn(e,t,r={}){let{collectStdout:o=!0}=r;return new Promise((n,s)=>{let i=au(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 jn(e,t={}){let{hideBanner:r=!0,logLevel:o="error",overwrite:n=!0}=t,s=[...e];n&&(s=Hr(s,"-y")),o&&(s=Hr(s,"-loglevel",[o])),r&&(s=Hr(s,"-hide_banner")),await Dn("ffmpeg",s,{collectStdout:!1})}async function qt(e){let t=await Dn("ffprobe",["-hide_banner","-v","error","-show_entries","format=duration","-of","default=noprint_wrappers=1:nokey=1",e]),r=Number(t.trim());if(!Number.isFinite(r)||r<=0)throw new Error(`Could not determine audio duration for ${e}`);return r}async function Xr(e){await jn(["-ss",String(e.start),"-t",String(e.duration),"-i",e.inputPath,"-map","0:a:0","-ac",String(e.channels??1),"-ar",String(e.sampleRate??16e3),"-c:a",e.codec??"aac","-b:a",e.bitrate??"48k",e.outputPath])}async function Mn(e){await jn(["-i",e.inputPath,"-vn","-ac",String(e.channels??1),"-ar",String(e.sampleRate??16e3),"-b:a",e.bitrate??"24k",e.outputPath])}async function Zr(e){return qt(e)}import{ElevenLabsClient as uu}from"@elevenlabs/elevenlabs-js";import pu from"path";var Ut;function cu(){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 cu().textToSpeech.convert(t,{text:e,modelId:o,...n?{languageCode:n}:{},outputFormat:s})).getReader(),u=[],c,g;for(;{done:c,value:g}=await a.read(),!c;)u.push(g);return{buffer:Buffer.concat(u),provider:"elevenlabs-native",model:o,voiceId:t,outputFormat:s}}var Qr=async(e,t,r,o={})=>{if(r){let n=se(),s=pu.join(n,"beep.mp3");return Ue("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"?mu(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 lu from"p-limit";import et from"node:fs";import du from"node:os";import Fe from"node:path";var ro=13,tt={extension:"m4a",codec:"aac",channels:1,sampleRate:16e3,bitrate:"48k"},zn=300,qn=2,gu=24,fu="gpt-4o-transcribe",yu="gpt-4o-transcribe-diarize",hu="gemini-2.5-flash",bu=2e3,vu=1e4,Un=/\.(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 Jn(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(Un,"")}function Su(e){return`_parts/${e.replace(/\.[^.]+$/,".transcript.json")}`}function eo(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 oo(e){let t=e.settings||{},r=xu(t),o=H(t,"transcription"),s=eo(r.mode)||eo(r.type)||eo(t.transcriptionMode)||(Jn(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,zn),overlapSeconds:Vt(r.overlapSeconds??t.transcriptionOverlapSeconds,qn),parallelLimit:Gt(r.parallelLimit??t.transcriptionParallelLimit,ro),maxUploadMb:i,maxUploadBytes:i*1024*1024,progressWriteIntervalMs:Gt(r.progressWriteIntervalMs??t.transcriptionProgressWriteIntervalMs,u),waitForStableFile:Jn(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 no(e){let t=e.partSeconds??zn,r=e.overlapSeconds??qn,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")}.${tt.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 Kt(e){return N().statSync(e).size}function Gn(e,t){return kr(e,Fe.join("_parts",t),{forWrite:!0})}function to(e){return M(e).length}function Cu(e,t){let r=kr(e,t);if(!$(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:Gn(e,a.fileName)}));return s.every(a=>a.fileName&&$(a.fullPath))?s:null}async function wu(e,t){let r=_(e),o=await qt(e.paths.fileFull),n=no({baseName:t.baseName,duration:o,partSeconds:t.partSeconds,overlapSeconds:t.overlapSeconds}),s=[];r.session.ensureDir("_parts");for(let i of n){let a=Gn(e,i.fileName);await Xr({inputPath:e.paths.fileFull,outputPath:a,start:i.start,duration:i.duration,channels:tt.channels,sampleRate:tt.sampleRate,codec:tt.codec,bitrate:tt.bitrate});let u=to(a);if(u>t.maxUploadBytes&&(await Xr({inputPath:e.paths.fileFull,outputPath:a,start:i.start,duration:i.duration,channels:1,sampleRate:16e3,codec:"aac",bitrate:"48k"}),u=to(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).session.ensureDir("_parts");let o=Cu(e,t.manifestFileName);return o?o.map(n=>({...n,sizeBytes:n.sizeBytes??to(n.fullPath)})):wu(e,t)}function Bn(e){return e.map(t=>t.trim()).filter(Boolean).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(`
|
|
13
13
|
|
|
14
|
-
`)}function
|
|
15
|
-
`)}function
|
|
16
|
-
`)};a("transcribing",{stableSizeBytes:u,totalParts:c.length,completedParts:0,parts:f},!0);let
|
|
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:h.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:h.length,elapsedMs:w-s,usage:h.map(v=>v.usage),cost:C}),a("done",{totalParts:c.length,completedParts:h.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),s=Wt(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 g=(f,m=!1)=>{let y=Date.now(),h=f.segmentCount??c;return m||y-u>=t.progressWriteIntervalMs||h>=c+10?(u=y,c=h,n.session.write(s.progressFileName,{status:"transcribing",mode:t.mode,model:t.model,sourceFileName:r,outputFileName:s.finalJsonFileName,startedAt:i,updatedAt:y,elapsedMs:y-i,...f}),!0):!1};try{n.session.addToLog(`Starting ${t.mode} transcription`,{data:{mode:t.mode,model:t.model}}),g({segmentCount:0,textLength:0},!0);let f=t.waitForStableFile?await Vn(o.fileFull,t.stableFileSamples,t.stableFileIntervalMs):Kt(o.fileFull),m=await _u(o.fileFull,s.baseName,t.maxUploadBytes);a=m.cleanup,g({stage:m.compressed?"compressed-for-upload":"uploading-original",stableSizeBytes:f,originalSizeBytes:m.originalSizeBytes,uploadSizeBytes:m.uploadSizeBytes,maxUploadMb:t.maxUploadMb},!0);let y=ku(m.uploadPath),h=await En(y,Fe.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;g({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:Fe.basename(m.uploadPath),originalSizeBytes:m.originalSizeBytes,uploadSizeBytes:m.uploadSizeBytes,compressedForUpload:m.compressed,text:h.text,duration:h.duration,task:h.task,segments:h.segments||[],usage:h.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:h.duration,originalSizeBytes:m.originalSizeBytes,uploadSizeBytes:m.uploadSizeBytes,compressedForUpload:m.compressed,usage:h.usage,cost:h.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:h.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/")||!Un.test(t))return;let o=oo(e);if(o.mode==="diarized"){await Lu(e,o);return}await Eu(e,o)}function Ou(e){return Br(e.settings,"transcription")?D(e.settings,"transcription").map(t=>({...e,fileName:U(e.fileName.slice(0,e.fileName.length-Fe.extname(e.fileName).length),t.suffix)+Fe.extname(e.fileName),settings:t.settings})):[e]}async function Ae(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 Wn(e){return`${e.toFixed(e>=10?1:2)}s`}function X(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 ${Wn(e.mediaDurationSeconds)}`),typeof e.durationMs=="number"&&t.push(`generated ${Wn(e.durationMs/1e3)}`);let o=Ru(e.cost);return o!==void 0&&t.push(`$${o.toFixed(o<.01?4:2)}`),t.join(" \xB7 ")}var Kn=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);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,g=Date.now(),f=await qr({prompt:a,model:c}),m=Date.now()-g,{conversationId:y=""}=f;n.session.write(s,f.output);let h={provider:"openai",model:c,cost:f.cost,duration:m/1e3,generationTimeMs:m,sourceFileName:t,outputFileName:s,conversationId:y,outputSizeBytes:$u(f.output)};return n.session.write(i,h),n.session.addToLog(X({outputFileName:s,provider:h.provider,model:h.model,cost:h.cost,durationMs:m}),{type:"output",duration:m,data:h}),n.session.patchSessionJson({conversationId:y}),{logData:h}}catch(s){throw s}};var so={name:"ai-convo",run:Yt,lifecycle:{start:Kn}};var Yn=e=>{let t=Qe(e.fileContent,e.settings);return{provider:t.provider,model:t.model,quality:t.quality,size:t.size,imageSize:t.imageSize,aspectRatio:t.aspectRatio,outputFormat:t.outputFormat}},Ht=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=Gr(a,n),c=`${i}.${u}`,g=c.replace(/\.[^.]+$/,".meta.json"),f=`${o.sessionFull}/${c}`,m=Date.now(),y=await Vr(a,f,n),h=Date.now()-m,I=await Kr(f),A=M(f).byteLength,C=I.width||0,w=I.height||0,v=y.provider||Ze(a,n),T=y.model||a.model||n.imageModel,L=y.usage||{},R=io(Qe(a,n)),G={provider:v,model:T,usage:L,tokenUsage:L,cost:y.cost||pe,duration:h/1e3,generationTimeMs:h,modelParams:{...R,provider:v,model:T,outputFormat:y.outputFormat||u},sourceFileName:t,outputFileName:c,outputFormat:y.outputFormat||u,referenceImagePath:a.referenceImagePath,referenceImagePaths:a.referenceImagePaths,referenceType:a.referenceType,referenceTypes:a.referenceTypes,revisedPrompt:y.revisedPrompt,width:C,height:w,outputSizeBytes:A,ratio:C&&w?C/w:0};return s.session.write(g,G),s.session.addToLog(X({outputFileName:c,provider:v,model:T,cost:G.cost,durationMs:h,width:C,height:w}),{type:"output",duration:h,data:G}),{logData:G}}catch(i){throw i}};function io(e){return Array.isArray(e)?e.map(io):!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]":io(r)]))}var ao={name:"ai-image",run:Ht,lifecycle:{start:Yn}};function Hn(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 Xn=e=>{let t=e.fileContent||{};return{provider:t.provider,model:t.model,outputFormat:Hn(t.schema)?"structured JSON":"Markdown"}},Xt=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,g=t.replace(".llm.json",Hn(i)?".out.json":".out.md"),f=t.replace(".llm.json",".meta.json"),m=Date.now(),y=await Mr({provider:a,prompt:s,schema:i,model:u,providerOptions:c}),h=Date.now()-m;n.session.write(g,y.output);let I={provider:y.provider||a,model:y.model||u,usage:y.usage||{},cost:y.cost,duration:h/1e3,generationTimeMs:h,sourceFileName:t,outputFileName:g,providerMetadata:y.providerMetadata||{},warnings:y.warnings||[],outputSizeBytes:Du(y.output)};return n.session.write(f,I),n.session.addToLog(X({outputFileName:g,provider:I.provider,model:I.model,cost:I.cost,durationMs:h}),{type:"output",duration:h,data:I}),{logData:I}}catch(s){throw s}};var uo={name:"ai-llm",run:Xt,lifecycle:{start:Xn}};var Zn=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);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:g,languageCode:f,outputFormat:m,providerOptions:y,speed:h,instructions:I}=r,A=Date.now(),C=await Qr(a,u,o,{provider:c,modelId:g,languageCode:f,outputFormat:m,providerOptions:y,speed:h,instructions:I}),w=Date.now()-A;n.session.write(s,C.buffer);let v=0;try{v=await Zr(`${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||g,voiceId:C.voiceId||u,outputFormat:C.outputFormat||m,mediaType:C.mediaType,duration:Number(v.toFixed(2)),mediaDurationSeconds:Number(v.toFixed(2)),cost:Number(Yr(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(X({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 po={name:"ai-tts",run:Zt,lifecycle:{start:Zn}};import Qn from"path";import{parse as ju}from"yaml";var es=e=>{let t=ts(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 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 co(e){return!!e&&typeof e=="object"&&!Array.isArray(e)}function ts(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&&!co(r))throw new Error("ai-video: Markdown frontmatter must be a YAML object.");let o=co(r)?r:{},n=co(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),r=ts(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(Mu(e.fileName),i.suffix)}.mp4`,u=a.replace(/\.mp4$/i,".meta.json"),c=Qn.join(e.paths.sessionFull,a),g={...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}})},y=Bt(g,i.settings,e.paths.sessionFull),h=zt(r.referenceImagePaths,e.paths.sessionFull);h.length&&t.session.addToLog(`Using ${h.length} reference image${h.length===1?"":"s"}`,{data:{count:h.length,files:h.map(w=>Qn.basename(w)),outputFileName:a}});let I=await Wr({...g,onProgress:m},c,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:y,referenceImagePaths:h,providerMetadata:I.providerMetadata,warnings:I.warnings,resolution:g.resolution,aspectRatio:g.aspectRatio,mediaDurationSeconds:g.duration,fps:g.fps,outputSizeBytes:M(c).byteLength};t.session.write(u,C),t.session.addToLog(X({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 mo={name:"ai-video",run:Qt,lifecycle:{start:es}};import rs from"path";function qu(e){return e.replace(/\.vision\.json$/i,"")}var os=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 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 rs.isAbsolute(o)?o:rs.resolve(e.paths.sessionFull,o)}var er=async e=>{let t=_(e),r=e.fileContent||{},o=Gu(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=qu(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:y})=>{let h=y||m.provider||m.model||"output",I=`${u}.${h}.txt`,A=`${u}.${h}.meta.json`,C=Date.now();try{let w=await Dr({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()-
|
|
19
|
-
`):""}function
|
|
20
|
-
`);
|
|
21
|
-
`);let
|
|
22
|
-
`)}var ir=async e=>{let t=_(e),r=String(e.fileContent?.text||"").trim();if(t.session.addToLog("Preparing image edit request"),r.length<or(e,ot,"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,ot,"fixSourceExtension","jpg"),n=e.fileName.replace(/\.fix\.txt$/i,""),s=Z(e,ot,ot,"sameName"),i=D(e.settings,"image");for(let a of i){let u=U(s,a.suffix),c={...a.output,prompt:tp(r),referenceImagePaths:[`./${n}.${o}`],referenceTypes:rt(e,ot,"fixReferenceTypes",["composition","scenario","style","character"])};t.session.writeImageRequest(u,c)}};var fo={name:"req-edit-image",run:ir};import rp from"node:path";var ps="req-image-to-text";function op(e){return e.slice(0,e.length-rp.extname(e).length)}function np(e){let t=he(e,ps);return le(t.request)?t.request:{}}var ar=async e=>{let t=_(e);t.session.addToLog("Prepared image-to-text request");let r=Z(e,ps,op(e.fileName),"sameName"),o={...np(e),imagePath:`./${e.fileName}`};t.session.writeVisionRequest(r,o)};var yo={name:"req-image-to-text",run:ar};var nt="req-image-to-image";function sp(e){if(!as(e,nt,"sourceImageAsReference",!0))return{};let t=e.fileName.split(".").pop()?.toLowerCase()||"";return rt(e,nt,"sourceImageExtensions",["jpg","jpeg","png","webp"]).map(o=>o.replace(/^\./,"").toLowerCase()).includes(t)?{referenceImagePaths:[`./${e.fileName}`],referenceTypes:rt(e,nt,"sourceImageReferenceTypes",["general"])}:{}}function ip(e,t){let n=oe(te()).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),r=sr(e,nt),o=ip(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=Z(e,nt,r,"inputOutputPair"),s=D(e.settings,"image");for(let i of s){let a=U(n,i.suffix),u={...i.output,prompt:o,...sp(e)};t.session.writeImageRequest(a,u)}};var ho={name:"req-image-to-image",run:ur};var pr="req-text-to-image";function ap(e){let t=he(e,pr);return le(t.request)?t.request:{}}var cr=async e=>{let t=_(e),r=String(e.fileContent?.text||"").trim();if(t.session.addToLog("Preparing text-to-image request"),r.length<or(e,pr,"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=Z(e,pr,pr,"sameName"),n=D(e.settings,"image");for(let s of n){let i=U(o,s.suffix),a={...ap(e),...s.output,prompt:r};t.session.writeImageRequest(i,a)}};var bo={name:"req-text-to-image",run:cr};var st="req-text-to-speech";function up(e){return String(e.fileContent?.text||"").trim()}function pp(e){return e.match(/^\s*([^:\n]{1,80}):\s+/)?.[1]?.trim()}function cp(e){let t=e.match(/line-[^.]*([A-Z])(?:\.[^.]+)?$/i);if(t?.[1])return t[1].toUpperCase().charCodeAt(0)-65}function mp(e,t){let r=he(e,st);if(typeof r.voiceId=="string"&&r.voiceId.trim())return r.voiceId.trim();let o=pp(t),n=le(r.characterVoices)?r.characterVoices:le(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()),g=c>=0?i[c]:void 0;if(typeof g=="string"&&g.trim())return g.trim()}let a=cp(e.fileName),u=typeof a=="number"?i[a]:void 0;return typeof u=="string"&&u.trim()?u.trim():void 0}function lp(e){let t=he(e,st),r=le(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),r=Te(),o=up(e);if(t.session.addToLog("Prepared text-to-speech request"),!o)throw new Error(`${st}: 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,{...lp(i),text:o,voiceId:mp(i,o)}),u=Z(i,st,st,"sameName"),c=U(u,s.suffix);t.session.writeTtsRequest(c,a)}};var vo={name:"req-text-to-speech",run:mr};var cs="req-text-to-text",lr=async e=>{let t=_(e),r=Te(),o=sr(e,cs);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=Z(i,cs,o),c=U(u,s.suffix);t.session.writeTextToTextRequest(c,a)}};var Io={name:"req-text-to-text",run:lr};import be from"node:path";function dp(e){return e==="~"?process.env.HOME||e:e.replace(/^~(?=\/|\\)/,process.env.HOME||"~")}function gp(e){return e==="move"?"move":"copy"}function fp(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 yp(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 hp(e){let t=yp(e),r=t.dir??t.outputDir??t.destinationDir??t.destination,o=typeof r=="string"&&r.trim()?r.trim():e.paths.sessionFull;return{dir:dp(o),mode:gp(t.mode),overwrite:fp(t.overwrite,!0)}}function bp(e,t){let r=be.isAbsolute(t.dir)?t.dir:be.resolve(e.paths.rootFull,t.dir);return be.join(r,e.fileName)}function vp(e){return`_placement.${e.replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase()||"output"}.json`}var dr=async e=>{let t=_(e),r=hp(e),o=bp(e,r),n=e.paths.fileFull,s=Date.now(),i=(a,u={})=>{Fr(be.join(e.paths.sessionFull,vp(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(be.resolve(n)===be.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}Ge(be.dirname(o)),Pr(n,o),r.mode==="move"&&wr(n),i("done"),t.session.addToLog(`Placed output at ${be.basename(o)}`,{data:{destinationPath:o}})}catch(a){throw i("error",{error:a?.message||"Unknown error"}),a}};var So={name:"place-output",run:dr};var xo={name:"transcribe-audio",run:Ae};var ms=[so,ao,uo,po,mo,lo,go,So,fo,ho,yo,bo,vo,Io,xo];import Qp from"node:fs";import{fileURLToPath as As}from"node:url";import{homedir as ws}from"os";import ko from"path";import{homedir as Ss}from"os";import Ip from"node:path";function ls(e,t=[]){return Ye(e,"**/config.json",t).map(r=>Ip.dirname(r)).filter((r,o,n)=>n.indexOf(r)===o).sort()}import Co from"lodash";import{minimatch as ds}from"minimatch";import ce from"path";var Sp=!0;function xp(e,t){if(!Sp)return t;let r=e.match(/request-(.*)\.json$/);if(r&&r[1])return r[1]}function Cp(e){let t=se();return e.replace(t,"")}function wp(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 g=se();if(n.test(e)&&g){let f=`${g}${e}`,m=wo(f);m?.userId&&m?.machineId&&m?.id&&(s=m.userId,i=`/users/${s}`,a=m.machineId,u=xp(e,m.id),c="session")}return{userId:s,userPath:i,machineId:a,sessionId:u,scope:c,isScoped:c!=="none"}}function wo(e){try{return $(e)?xt(e):{}}catch(t){return V(`Failed to read JSON from ${e}`,t,{filePath:e}),{}}}var gs=(e,t="create")=>{let r=se(),o=Cp(e),n=wp(o),s=ce.basename(o),i=ce.dirname(o),a={fileName:s,fileContent:{},fileVerb:t,...n,prompts:{},promptIds:[],paths:{},settings:{},params:{},session:{},isDebug:!1,global:Ke(void 0)},u={root:"/",rootFull:ce.resolve(r),file:"",fileFull:"",user:"",userFull:"",machine:"",machineFull:"",state:"",stateFull:"",session:"",sessionFull:""};switch(u.file=o,u.fileFull=ce.resolve(`${r}${o}`),u.session=i,u.sessionFull=ce.resolve(`${r}${i}`),ce.extname(o).toLowerCase()){case".json":a.fileContent=wo(u.fileFull);break;case".md":case".txt":let y=$(u.fileFull)?Ve(u.fileFull):"";a.fileContent={text:y};break}if(n.isScoped){let y=n.userPath?`${n.userPath}/${n.machineId}`:`/${n.machineId}`;if(n.userPath&&(u.user=n.userPath,u.userFull=ce.resolve(`${r}${n.userPath}`)),u.machine=y,u.machineFull=ce.resolve(`${r}${y}`),u.state=`${y}/state.json`,u.stateFull=ce.resolve(`${r}${y}/state.json`),n.sessionId){a.sessionId=n.sessionId,u.session=`${y}/sessions/${n.sessionId}`,u.sessionFull=ce.resolve(`${r}${y}/sessions/${n.sessionId}`);let h=`${u.sessionFull}/_session.json`,I=wo(h);a.params=I.params||{},a.session=I||{},$(`${u.sessionFull}/_debug.md`)&&(a.isDebug=!0)}}a.paths=u;let f=oe(te()).resolveConfig(a);a.config=f,a.global=Ke(f.global);let m=(f.triggers??{})[t]||{};return a.settings=Pp(f.settings||{},s),a.params=Co.merge({},f.params||{},a.params||{}),a.ioBots=m,a.command=Fp(m,o),a.promptIds=Tp(a.settings),a.paths=u,a};function Pp(e,t){let r=Co.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"||!ds(t,u)||(i=Co.mergeWith({},i,c,(g,f)=>Array.isArray(f)?f:void 0))}r[o]=i}return r}function Tp(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 Fp(e,t){let r=[];for(let o in e){let n=o.includes("/")?o:`**/${o}`;ds(t,n)&&r.push(e[o])}return r}var Ap=[{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 kp(e=process.env){return Ap.filter(({environmentVariables:t})=>t.some(r=>e[r]?.trim())).map(({provider:t})=>t)}function fs(e=process.env){return kp(e).join(", ")||"none"}var Po={};function To(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.");Po[r]=o}}function ys(e){return Po[e]?.run}function hs(e){return Po[e]?.lifecycle}import bs from"path";function _p(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 Ep(e,t,r){let{fileName:o}=r,n=bs.basename(o,bs.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 vs=async(e,t)=>{let{settings:r,fileContent:o}=t,{conversationId:n}=o??{};if(n)return;let s=_p(r),i=e.replace("convo-",""),a=_(t),u=Te();a.session.addToLog(`Using conversation prompt ${i}`,{data:{promptId:i}});let c=u.prepareTextToTextRequest(t,{promptId:i}),g=Ep(s,i,t);a.session.writeConvoRequest(g,c)};function Is(e,t){let r=_(t),o=[...r.session.applyCleanupPolicy([e]),...r.session.applyCleanupManifests(t.fileName)];for(let n of o)Y(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 Lp=e=>e.startsWith("convo-")?"convo":"main",Np=async(e,t)=>{let r=Lp(e),o=new Date().toISOString(),n=Date.now(),s=Op(new Date(n)),i={...t,botName:e,operationId:s},a=hs(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};Y(i,{botName:e,kind:"bot-start",level:"info",message:`IO bot ${e} started`,operationId:s,data:c});let g=(m,y={})=>{let h=new Date().toISOString(),I=Date.now()-n;Y(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(y.error??`IO bot ${e} failed`),operationId:s,data:{...c,...y,durationMs:I,endedAt:h,phase:m}}),on(i)},f=m=>{Is(e,i),g("done",m?.logData?{result:m.logData}:{})};try{if(r==="convo"){await vs(e,i),f(void 0);return}if(r!=="main"){g("error",{error:`Command type not supported: ${r}`});return}let m=ys(e);if(typeof m!="function"){g("error",{error:`No command found for: ${e}`});return}let y=await m(i);f(y)}catch(m){let y=m instanceof Error?m.message:String(m);g("error",{error:y,...m instanceof Error&&m.stack?{stack:m.stack}:{}})}};function Op(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 it=async(e,t)=>{let r=[];for(let o of e){let n;Array.isArray(o)?n=it(o,t):n=Np(o,t),r.push(n)}return Promise.all(r)};var Fo=new Map,Rp=new Set(["_analysis","_cleanup","_done","_meta","_parts","_partial","_prompts","_temp","_transcript"]),$p=["_partial.","_transcribing.","_transcript."],Dp=(e,t)=>e.split(/[\\/]+/).some(r=>Rp.has(r))||$p.some(r=>t.startsWith(r));function jp(e){return`${e.charAt(0).toUpperCase()}${e.slice(1)}`}function Mp(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 Jp(e,t){let r=e.config?.triggers;if(!r||typeof r!="object")return 0;let o=r[`delay${jp(t)}`];return Mp(o??r.delay)}function Me(e){return(Array.isArray(e.command)?e.command:[e.command]).filter(r=>typeof r=="string"&&r.length>0)}var Bp=e=>e.some(t=>t.startsWith("ai-"));function zp(e){return Dp(e.paths.file,e.fileName)||e.fileName.endsWith("log.txt")}function qp(e,t){for(let r of Me(e))Y(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 Up(e){for(let t of Me(e))Y(e,{botName:t,kind:"bot-skip",level:"info",message:"Delay superseded by a newer filesystem event",crudVerb:e.fileVerb},{operation:!1})}function Ao(e,t,r){if(zp(e))return Promise.resolve();Y(e,{crudVerb:t,kind:"crud",level:"info",message:`${t} ${e.fileName}`},{local:!1,operation:!1});let o=Me(e);if(o.length===0)return Promise.resolve();let n=Bp(o)?0:Jp(e,t);if(n<=0)return r(e);let s=`${e.paths.sessionFull}:${t}`,i=Fo.get(s);return i&&(clearTimeout(i.timer),Up(i.context),i.resolve()),new Promise((a,u)=>{qp(e,n);let c=setTimeout(()=>{Fo.delete(s),r(e).then(a,u)},n);Fo.set(s,{context:e,timer:c,resolve:a})})}var Gp=async e=>{await it(Me(e),e)},Vp=async e=>{await it(Me(e),e)},Wp=async e=>{},Kp=async e=>{await it(Me(e),e)},Yp=e=>Ao(e,"create",Gp),Hp=e=>Ao(e,"update",Vp),Xp=e=>Ao(e,"delete",Kp),gr={bootstrap:Wp,create:Yp,update:Hp,delete:Xp};var xs=["_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(Ss())?t.replace(Ss(),"~"):t,n=ls(t,xs);if(!n.length)throw new Error(`No config.json files found recursively under ${o}. Add config.json to each directory TIM should watch.`);Mo(t);let s=Yo(),i=fs();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}}),Lr({cwd:t,watchPaths:n,depth:0,target:"**/*",ignore:xs,createContext:gs,silent:!0,callbacks:{onAdd:gr.create,onChange:gr.update,onUnlink:gr.delete},ignoreLogs:!0})}function _o(e,t=process.cwd()){if(!e)return ko.resolve(t);let r=e==="~"?ws():e.startsWith("~/")?ko.join(ws(),e.slice(2)):e;return ko.resolve(t,r)}function Ps(e={}){return To(e.bots),Ne(e.galleries),Cs({cwd:_o(e.cwd),version:e.version})}var Ts={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 Fs=As(new URL("./prompts/character-sheets",import.meta.url)),ec=As(new URL("../src/character-sheets/_prompts",import.meta.url)),tc=Qp.existsSync(Fs)?Fs:ec,ks={name:"g-character-sheets",aliases:["character-sheets"],config:Ts},Eo=[ks],_s=[{gallery:ks.name,from:tc}];Ne(Eo);import{spawn as rc}from"node:child_process";import Q from"node:fs";import Es from"node:os";import j from"node:path";function oc(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 nc(e){return e.fileName.endsWith(".json")?e.fileContent:oc(Ve(e.paths.fileFull))}function Ls(e){return new Promise((t,r)=>{let o=rc("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 sc(e,t){return Ls(["--no-playlist","-x","--audio-format","mp3","--audio-quality","0","--print","after_move:filepath","-o",t,e])}function ic(e,t,r){return Ls(["--no-playlist","--skip-download","--write-subs","--write-auto-subs","--sub-langs",r,"--sub-format","vtt/srt/best","-o",t,e])}function ac(e){return e.split(/\r?\n/).map(t=>t.trim()).filter(Boolean).find(t=>t.endsWith(".mp3"))}function uc(e){return Q.readdirSync(e).find(r=>r.endsWith(".mp3"))}function pc(e){return e.split(j.sep).some(t=>t==="_captions"||t==="_youtube"||t==="_analysis")}function cc(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(`
|
|
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
23
|
`)}
|
|
24
|
-
`}async function
|
|
25
|
-
`),{encoding:"utf8",mode:384}),
|
|
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(`
|
|
26
|
+
${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(`
|
|
30
|
+
`)}
|
|
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
|
|
26
33
|
`:`
|
|
27
|
-
`),o.trim()}
|
|
28
|
-
`)
|
|
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});
|