@tim-fs/cli 0.1.1 → 0.1.2
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 +8 -0
- package/dist/index.js +7 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -22,5 +22,13 @@ tim init
|
|
|
22
22
|
tim start ~/workspace
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
+
Or run the Bash installer, which checks for Node.js 20+ and wraps the same global npm install:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
curl -fsSL https://raw.githubusercontent.com/dht/tim-fs/main/cli/install.sh | bash
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
See [brew.md](brew.md) for a suggested Homebrew tap and formula.
|
|
32
|
+
|
|
25
33
|
See the [repository README](https://github.com/dht/tim-fs#readme) for configuration, included bots,
|
|
26
34
|
and source development.
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import _e from"node:fs";import Bs from"node:path";import
|
|
2
|
+
import _e from"node:fs";import Bs from"node:path";import Fc from"node:readline/promises";import{Writable as Ac}from"node:stream";import{Command as kc}from"commander";import{minimatch as St}from"minimatch";import x from"path";import Ys from"fs-extra";var Hs=Ys;function N(){return Hs}var Mo=()=>({existsSync:e=>N().existsSync(e),readdirSync:e=>N().readdirSync(e),readFileSync:((e,t)=>N().readFileSync(e,t)),readJsonSync:e=>N().readJsonSync(e)});var Xs=Symbol.for("tim-core.runtime-state"),Zs=globalThis,dt=Zs[Xs]??={logger:null,root:""},Jo=e=>{dt.root=e},ie=()=>dt.root;var Bo=e=>{dt.logger=e},Sr=()=>dt.logger;var Qs=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)});var gt=()=>Qs().substring(0,4);var ei=["console"],ti=(e,t,r,o)=>typeof e=="string"?{message:e,level:t,source:r,data:o}:{...e,level:e.level??t,source:e.source??r,data:e.data??o},zo=(e={})=>{let t=e.transports?.length?e.transports:ei,r=!1,o=async(c,d)=>{let f=ti(c,"info",e.source,d),m=f.level??"info",h={...f,level:m},y=[];t.includes("console")&&(m==="error"?console.error:m==="warn"?console.warn:console.log)(h),t.includes("custom")&&(e.addLog?y.push(Promise.resolve(e.addLog(h))):r||(r=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))),y.length&&await Promise.all(y)};return{log:o,debug:async(c,d)=>o({message:c,level:"debug",data:d,source:e.source}),info:async(c,d)=>o({message:c,level:"info",data:d,source:e.source}),warn:async(c,d)=>o({message:c,level:"warn",data:d,source:e.source}),error:async(c,d)=>o({message:c,level:"error",data:d,source:e.source}),clearLogs:async()=>{}}},jc=zo();import P from"kleur";import*as le from"node:fs/promises";import*as ht from"node:path";import*as wr from"node:util";import{createLogger as oi,transports as Uo,format as Se}from"winston";import ni from"winston-transport";var qo={aspectRatio:"gray",bot:"pink",configuredDirectoriesCount:"yellow",cost:"pink",dimensions:"gray",duration:"yellow",file:"gray",format:"gray",message:"white",model:"gray",operation:"gray",outputCount:"gray",outputSize:"gray",promptId:"pink",promptLabel:"white",quality:"gray",systemProviders:"cyan",systemVersion:"cyan",tokens:"gray",voice:"gray",workingDirectory:"cyan"};function yt(e){if(e===void 0)return e;if(Array.isArray(e))return e.filter(r=>r!==void 0).map(r=>yt(r));if(e&&typeof e=="object"){let t={};for(let[r,o]of Object.entries(e))o!==void 0&&(t[r]=yt(o));return t}return e}var si=Symbol.for("message"),ii=e=>{if(!e||typeof e!="object")return;let t=e.logPath;return typeof t=="string"&&t.length?t:void 0},xr=class extends ni{defaultLogPath;ensuredDirs=new Set;lineFormat;constructor({defaultLogPath:t,format:r}){super(),this.defaultLogPath=t,this.lineFormat=r}log(t,r){setImmediate(()=>this.emit("logged",t));let o=ii(t.logEvent?.data)??this.defaultLogPath;if(!o){r();return}(async()=>{let s=ht.dirname(o);this.ensuredDirs.has(s)||(this.ensuredDirs.add(s),await le.mkdir(s,{recursive:!0}).catch(()=>{}));let i=this.lineFormat.transform({...t},this.lineFormat.options??{}),a=i[si]??i.message??"";await le.appendFile(o,`${a}
|
|
3
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
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(`
|
|
6
|
+
${n}`:a})),vt=(e={})=>{let t=e.transports?.length?e.transports:ui,r=!1,o=[];t.includes("console")&&o.push(new Uo.Console({format:Ci}));let n=e.logPath??e.fsPath??"log.txt";t.includes("fs")&&o.push(new xr({defaultLogPath:n,format:ai}));let s=oi({level:"debug",transports:o.length?o:[new Uo.Console]}),i=async(m,h)=>{let y=pi(m,"info",e.source,h),I=y.level??"info",A={...y,level:I,timestamp:y.timestamp??Date.now()};if(s.log({level:I,message:A.message,logEvent:A}),t.includes("custom"))if(e.addLog){let w=yt({...A});await Promise.resolve(e.addLog(w))}else r||(r=!0,console.warn("[tim-logger] Custom transport requested without addLog handler."))},a=async(m,h)=>i({message:m,level:"debug",data:h,source:e.source}),u=async(m,h)=>i({message:m,level:"info",data:h,source:e.source}),c=async(m,h)=>i({message:m,level:"warn",data:h,source:e.source});return{log:i,debug:a,info:u,warn:c,error:async(m,h)=>i({message:m,level:"error",data:h,source:e.source}),clearLogs:async(m=()=>!0)=>{if(t.includes("fs"))try{await le.mkdir(ht.dirname(n),{recursive:!0}).catch(()=>{}),await le.writeFile(n,"",{flag:"a"}),await le.truncate(n,0),await u("\u{1F9F9} Logs cleared",{logPath:n})}catch(h){let y=h instanceof Error?h.message:wr.format("%o",h);await c("Failed to clear logs",{logPath:n,error:y})}t.includes("custom")&&e.clearLogs&&await e.clearLogs(m)}}},Kc=vt();import Ue from"node:path";var Ho=()=>{let e=vt({source:"tim-core",transports:["console"]});return Bo(e),e},Ge=(e,t={})=>{let r={...t,message:e,level:t.level??"info",timestamp:t.timestamp??Date.now()},o=Sr();return o&&o.log(r),r},V=(e,t,r={})=>Ge(e,{kind:"diagnostic",level:"error",data:{...r,error:t instanceof Error?t.message:String(t),...t instanceof Error&&t.stack?{stack:t.stack}:{}}});function H(e,t,r={}){let o=Ue.resolve(ie()||e.paths.rootFull||process.cwd()),n=t.operationId??e.operationId,s=e.global.logs.operation,i=n&&s.enabled?Ue.join(o,s.directory,`${n}.json`):void 0,a=t.botName??e.botName,u={...t,operationId:n,operationLogPath:i,botName:a,fileName:t.fileName??e.fileName,filePath:t.filePath??e.paths.file,machineId:t.machineId??e.machineId,sessionId:t.sessionId??e.sessionId,scope:t.scope??e.scope,userId:t.userId??e.userId,source:t.source??(t.kind?.startsWith("bot-")?a:e.botName)??"tim-core",level:t.level??"info",timestamp:t.timestamp??Date.now()},c=e.global.logs.console,d=c.silenceCrudDelete&&u.kind==="crud"&&u.crudVerb==="delete",f=c.silenceRequestBotStartDone&&u.botName?.startsWith("req-")&&(u.kind==="bot-start"||u.kind==="bot-done");if(r.console!==!1&&c.enabled&&!d&&!f&&bt(c.detail,u)){let h=Sr();h&&h.log(u)}let m=[];if(r.local!==!1&&e.global.logs.local.enabled){let h=r.localPath??Ue.join(e.paths.sessionFull||Ue.dirname(e.paths.fileFull),"log.txt");m.push({path:h,format:"text",detail:e.global.logs.local.detail})}return r.workspace!==!1&&e.global.logs.workspace.enabled&&m.push({path:Ue.join(o,"_tim","logs","events.jsonl"),format:"jsonl",detail:e.global.logs.workspace.detail}),r.operation!==!1&&n&&s.enabled&&m.push({path:i,format:"operation",detail:s.detail}),m.length&&Cr(u,m,N()),u}var Xo=e=>e.replace(/(\d+)(?=\.\w+$)/,t=>String(Number(t)+1).padStart(t.length,"0"));import Pi from"node:crypto";import Ti from"node:os";import Zo from"node:path";function Fi(e){return Pi.createHash("sha1").update(Zo.resolve(e)).digest("hex").slice(0,12)}function It(e){return Zo.join(Ti.tmpdir(),"tim-core",Fi(e))}var re=()=>Mo(),$=e=>N().existsSync(e);var Ve=e=>N().ensureDirSync(e);var Tr=e=>N().removeSync(e),Fr=(e,t)=>N().copySync(e,t);var Ct=e=>N().readJsonSync(e),ae=(e,t={})=>{try{return N().existsSync(e)?N().readJsonSync(e):t}catch(r){return V(`Failed to read JSON from ${e}`,r,{filePath:e}),t}},We=(e,t="utf-8")=>N().readFileSync(e,t),M=e=>N().readFileSync(e),Ar=(e,t,r="utf-8")=>N().writeFileSync(e,t,{encoding:r}),kr=(e,t,r=2)=>N().writeJsonSync(e,t,{spaces:r}),Ke=(e,t)=>N().writeFileSync(e,t),Pt="_meta",Ai="_temp",Qo="_done",xt="_cleanup",en=new Set(["_analysis",xt,"_partial","_parts","_transcript"]),ki=new Set(["_analysis",xt,Qo,Pt,"_parts","_prompts",Ai,"_transcript"]),_i=["_partial.","_transcribing.","_transcript."];function Ei(e){return x.basename(e).endsWith(".meta.json")}function Li(e,t){return e.split(/[\\/]+/).includes(t)}function Tt(e){return e.split(/[\\/]+/).filter(Boolean)}function Ce(e){return e.replace(/^\/+|\/+$/g,"").replace(/[^a-z0-9._-]+/gi,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").toLowerCase()}function Ni(e){return Ce(e.paths.file||e.fileName||"source")||"source"}function Oi(e){let t=x.dirname(e.paths.file||"");return Ce(t==="."?e.paths.session||"session":t)||"session"}function _r(e){return(e.operationId||"manual").replace(/[^a-z0-9._-]+/gi,"-")}function Ri(e){let[t]=Tt(e);return en.has(t)}function $i(e,t){let r=Tt(t),o=Ce(r.shift()||"work").replace(/^_+/,"")||"work",n=Ce(r.join("__")||x.basename(t)||"file");return`${Oi(e)}__${o}__${n}`}function tn(e,t){let r=x.basename(t),o=Ce(r),n=Ce(e.fileName.replace(/\.[^.]+$/,""));if(!n||o.startsWith(`${n}.`))return o;let i=o.replace(/^_+/,"").replace(/\.meta\.json$/i,""),[a,...u]=i.split("."),c=u.join(".");return a&&c&&Ce(c)===n?`${c}.${a}.meta.json`:o}function Di(e,t){let r=tn(e,t);return`${_r(e)}__${r}`}function wt(e){return on(e,e.global.meta,"meta")}function rn(e){return on(e,e.global.intermediates,"intermediates")}function on(e,t,r){switch(t.location){case"source":return e.paths.sessionFull;case"source-subdirectory":return x.join(e.paths.sessionFull,t.directory);case"workspace":return x.join(e.paths.rootFull,t.directory);case"none":return x.join(It(e.paths.rootFull),"_ephemeral",_r(e),r);default:return x.join(It(e.paths.rootFull),t.directory)}}function Pr(e,t,r,o){return r.location==="source"||r.location==="source-subdirectory"?x.basename(t):o==="meta"?Di(e,t):$i(e,t)}function we(e,t,r={}){let o=Tt(t),n=o[0]===Pt?o.slice(1).join("/"):t;if(Ei(t)){let s=x.join(wt(e),Pr(e,n,e.global.meta,"meta"));return r.forWrite?s:ji(e,n)||s}return Ri(t)?x.join(rn(e),Pr(e,t,e.global.intermediates,"intermediates")):x.join(e.paths.sessionFull,t)}function Er(e,t,r={}){return we(e,t,r)}function ji(e,t){let r=N(),o=x.basename(t),n=tn(e,t),s=Ni(e),i=wt(e),a=x.join(i,Pr(e,t,e.global.meta,"meta"));if(r.existsSync(a))return a;if(r.existsSync(i)){let d=r.readdirSync(i).filter(f=>f.endsWith(`__${n}`)||f.endsWith(`__${o}`)&&f.includes(`__${s}__`)).sort();if(d.length)return x.join(i,d[d.length-1])}let u=x.join(e.paths.sessionFull,Pt,o);if(r.existsSync(u))return u;let c=x.join(e.paths.sessionFull,o);return r.existsSync(c)?c:null}function nn(e){let t=N(),r=x.join(It(e.paths.rootFull),"_ephemeral",_r(e));t.existsSync(r)&&t.removeSync(r)}function Mi(e,t){if(!e.existsSync(t))return t;let r=x.dirname(t),o=x.extname(t),n=x.basename(t,o);for(let s=2;s<1e4;s+=1){let i=x.join(r,`${n}.${s}${o}`);if(!e.existsSync(i))return i}return x.join(r,`${n}.${Date.now()}${o}`)}var _=e=>{let t=N();function r(l,g){try{let{paths:b}=e,S=l==="sessionFull"?we(e,g):x.join(b[l],g);return t.existsSync(S)?t.readJsonSync(S):{}}catch(b){V("File manager failed to read JSON",b,{filePath:g})}}function o(l,g,b){try{let{paths:S}=e,F=l==="sessionFull"?we(e,g,{forWrite:!0}):x.join(S[l],g);t.ensureDirSync(x.dirname(F)),t.writeJsonSync(F,b,{spaces:2})}catch(S){V("File manager failed to write JSON",S,{filePath:g})}}function n(l,g,b,S){try{let{paths:F}=e,J=x.join(F[l],`${g}.${S}.json`);t.writeJsonSync(J,b,{spaces:2})}catch(F){V("File manager failed to write AI request",F,{id:g,suffix:S})}}function s(l,g,b){return n(l,g,b,"llm")}function i(l,g,b){return n(l,g,b,"convo")}function a(l,g,b){return n(l,g,b,"image")}function u(l,g,b){return n(l,g,b,"vision")}function c(l,g,b){return n(l,g,b,"tts")}function d(l,g={}){try{let{paths:b,machineId:S,sessionId:F,userId:J}=e,q={id:gt(),ts:Date.now(),userId:J,machineId:S,sessionId:F,orderType:l,...g},se=x.join(b.rootFull,"_orders",`${q.id}.json`);t.ensureDirSync(x.dirname(se)),t.writeJsonSync(se,q,{spaces:4})}catch(b){V("File manager failed to write bridge order",b,{orderType:l})}}function f(l,g,b){try{let{paths:S}=e,F=l==="sessionFull"?we(e,g,{forWrite:!0}):x.join(S[l],g);t.ensureDirSync(x.dirname(F)),t.writeFileSync(F,b)}catch(S){V("File manager failed to write binary file",S,{filePath:g})}}function m(l,g,b){try{let{paths:S}=e,F=l==="sessionFull"?we(e,g,{forWrite:!0}):x.join(S[l],g);t.ensureDirSync(x.dirname(F)),t.copySync(b,F)}catch(S){V("File manager failed to copy file",S,{filePath:g,sourcePath:b})}}function h(l,g){try{let{paths:b}=e,S=l==="sessionFull"?we(e,g):x.join(b[l],g);return t.readFileSync(S,"utf-8")}catch(b){V("File manager failed to read binary file",b,{filePath:g})}}function y(l,g){try{let{paths:b}=e,S=x.join(b[l],g);return t.readdirSync(S)}catch(b){return V("File manager failed to read directory",b,{path:g}),[]}}function I(l,g,b){let S=b?x.join(e.paths[l],b):e.paths[l],F=(E,B=!0)=>t.existsSync(E)?t.readdirSync(E).filter(z=>z.endsWith(".json")&&(!B||!g||St(z,g))).reduce((z,te)=>(z[te]=t.readJsonSync(x.join(E,te)),z),{}):{},J=["workspace","os-temp","none"].includes(e.global.meta.location),q=l==="sessionFull"&&!b&&J?Object.entries(F(wt(e),!1)).reduce((E,[B,z])=>{let te=B.split("__").pop()||B;return(!g||St(te,g)||St(B,g))&&(E[te]=z),E},{}):{},se=!b&&e.global.meta.location==="source-subdirectory"?F(wt(e)):{},Y=b?{}:F(x.join(S,Pt));return{...F(S),...Y,...se,...q}}function A(l){let{paths:g}=e;t.emptyDirSync(g[l])}function w(l,g){let{paths:b}=e,S=x.join(b[l],`${g}.md`);t.existsSync(S)&&t.unlinkSync(S),t.writeFileSync(S,Date.now().toString(),{encoding:"utf-8"})}function C(l,g){let{paths:b}=e,S=x.join(b[l],`${g}.md`);t.existsSync(S)&&t.removeSync(S)}async function v(l,g){w(l,g),C(l,g)}function T(l,g){let{paths:b}=e,S=l==="sessionFull"&&en.has(Tt(g)[0])?rn(e):x.join(b[l],g);t.ensureDirSync(S)}function L(l,g){let{paths:b}=e,S=l==="sessionFull"?we(e,g):x.join(b[l],g);return t.existsSync(S)}function R(){return G(e.fileName)}function G(l){let g=x.join(e.paths.sessionFull,l);if(!g||!t.existsSync(g)||l.split(/[\\/]+/).some(F=>ki.has(F))||_i.some(F=>x.basename(l).startsWith(F))||l==="config.json"||l==="log.txt")return null;let b=x.join(e.paths.sessionFull,Qo),S=Mi(t,x.join(b,x.basename(l)));return t.ensureDirSync(b),t.copySync(g,S),t.removeSync(g),S}function Ee(l,g){let b=g.startsWith(".")?g:`.${g}`,S=x.extname(l);return S?l.slice(0,-S.length)+b:`${l}${b}`}function Ie(l){let g=e.config||{};return(g.cleanUp||g.cleanup||{})?.[l]||null}function mt(l){let g=[],b=new Set;for(let S of l){let F=Ie(S);if(!F)continue;let J=[],q=(E,B)=>{let z=`move-to-done:${E}`;if(b.has(z))return;b.add(z);let te=G(E);J.push({action:"move-to-done",reason:B,fileName:E,status:te?"moved":"skipped",donePath:te})},se=(E,B)=>{let z=`delete:${E}`;if(b.has(z))return;b.add(z);let te=x.join(e.paths.sessionFull,E);if(!t.existsSync(te)){J.push({action:"delete",reason:B,fileName:E,status:"missing"});return}t.removeSync(te),J.push({action:"delete",reason:B,fileName:E,status:"deleted"})},Y=(E,B)=>{if(F.verb==="done"){q(E,B);return}F.verb==="delete"&&se(E,B)};Y(e.fileName,"trigger");for(let E of Array.isArray(F.additionalExt)?F.additionalExt:[])Y(Ee(e.fileName,E),`additionalExt:${E}`);for(let E of Array.isArray(F.additionalFiles)?F.additionalFiles:[])Y(E,"additionalFiles");g.push({commandName:S,policy:F,actions:J})}return g}function zs(l,g,b){if(!b.length)return null;let S=g.replace(/[^a-z0-9._-]+/gi,"-").replace(/^-+|-+$/g,"").toLowerCase(),F=x.join(xt,`${l}.${S}.cleanup.json`);return o("sessionFull",F,{botName:l,sourceFileName:g,createdAt:Date.now(),actions:b}),F}function qs(l){let g=x.join(e.paths.sessionFull,xt);if(!t.existsSync(g))return[];let b=[],S=t.readdirSync(g).filter(F=>F.endsWith(".cleanup.json")).sort();for(let F of S){let J=x.join(g,F),q=t.readJsonSync(J);if(q.sourceFileName&&q.sourceFileName!==l)continue;let se=Array.isArray(q.actions)?q.actions:[],Y=[];for(let E of se){if(!E?.fileName||Li(E.fileName,".."))continue;let B=x.join(e.paths.sessionFull,E.fileName);if(!t.existsSync(B)){Y.push({...E,status:"missing"});continue}if(E.action==="move-to-done"){let z=G(E.fileName);Y.push({...E,status:z?"moved":"skipped",donePath:z});continue}E.action==="delete"&&(t.removeSync(B),Y.push({...E,status:"deleted"}))}t.removeSync(J),b.push({manifestFileName:F,botName:q.botName,sourceFileName:q.sourceFileName,actions:Y})}return b}function Us(l,g){for(let b in g)f(l,b,g[b])}function Gs(l,g,b){let S=g.replace(/\.[^.]+$/,".meta.json"),F=g.replace(/\.[^.]+$/,".txt"),{usage:J,cost:q,model:se,duration:Y}=b||{};return o(l,S,{model:se,usage:J,cost:q,duration:Y,sourceFileName:g,outputFileName:F}),S}function $o(l){let{paths:g}=e,b=g[l];return t.existsSync(b)||(b=x.dirname(g.fileFull)),t.existsSync(b)?x.join(b,"log.txt"):null}function Do(l,g={}){let b=g.type==="error"?"error":g.type==="warn"?"warn":"info";return{kind:g.type==="skip"?"bot-skip":g.type==="output"?"bot-output":"bot-step",level:b,message:l,data:g.data,duration:g.duration}}function Vs(l,g,b={}){let S=$o(l);S&&H(e,Do(g,b),{console:!1,local:!0,localPath:S,operation:!1,workspace:!1})}function Ws(l,g,b={}){let S=$o(l);H(e,Do(g,b),{local:!!S,localPath:S??void 0,operation:!0,workspace:!0})}function lt(l,g,b){let F={...r(l,g),...b};return o(l,g,F)}function jo(l,g=""){let{paths:b}=e,S=b[l];return g&&(S=x.join(S,g)),t.readdirSync(S)}function Ks(l,g,b){let S=jo(l,b).filter(J=>!g||St(J,g));if(S.length===0)return null;S.sort();let F=S.pop();return F?Xo(F):null}return{sessionFull:e.paths.sessionFull,machineFull:e.paths.machineFull,readFile:l=>t.readJsonSync(`${ie()}${l}`),orders:{writeBridgeOrder:d},session:{read:l=>l.endsWith(".json")?r("sessionFull",l):h("sessionFull",l),write:(l,g)=>l.endsWith(".json")?o("sessionFull",l,g):typeof g=="string"&&x.isAbsolute(g)&&t.existsSync(g)?m("sessionFull",l,g):f("sessionFull",l,g),patch:(l,g)=>lt("sessionFull",l,g),writeTextToTextRequest:(l,g)=>s("sessionFull",l,g),writeConvoRequest:(l,g)=>i("sessionFull",l,g),writeImageRequest:(l,g)=>a("sessionFull",l,g),writeVisionRequest:(l,g)=>u("sessionFull",l,g),writeTtsRequest:(l,g)=>c("sessionFull",l,g),removeCheckpoint:l=>C("sessionFull",l),recycleCheckpoint:l=>v("sessionFull",l),readDir:l=>y("sessionFull",l),readDirJsons:(l,g)=>I("sessionFull",l,g),ensureDir:l=>T("sessionFull",l),emptyDir:()=>A("sessionFull"),copyFrom(l){let g=x.join(e.paths.machineFull,"sessions",l),b=e.paths.sessionFull;t.copySync(g,b)},exists:l=>L("sessionFull",l),writeByFile:l=>Us("sessionFull",l),saveMeta:(l,g)=>Gs("sessionFull",l,g),patchSessionJson:l=>{if(!(!e.machineId||!e.sessionId))return lt("sessionFull","_session.json",l)},saveTimeline:l=>{if(!(!e.machineId||!e.sessionId))return o("sessionFull","_timeline.json",l)},listFiles:()=>jo("sessionFull"),addToLog:(l,g={})=>Ws("sessionFull",l,g),addToLocalLog:(l,g={})=>Vs("sessionFull",l,g),generateMd:l=>w("sessionFull",l),getNextFile:(l,g)=>Ks("sessionFull",l,g),moveInputFileToDone:R,applyCleanupPolicy:mt,writeCleanupManifest:zs,applyCleanupManifests:qs},machine:{read:l=>r("machineFull",l),write:(l,g)=>o("machineFull",l,g),patch:(l,g)=>lt("machineFull",l,g),patchState:l=>lt("machineFull","state.json",l),readDir:l=>y("machineFull",l),readDirJsons:(l,g)=>I("machineFull",l,g),ensureDir:l=>T("machineFull",l),generateMd:l=>w("machineFull",l)},srcData:{read:l=>{let g=x.resolve("./src");return t.readJsonSync(x.join(g,"data",l))}}}};import At from"lodash";var ge={logs:{console:{enabled:!0,detail:"default",silenceCrudDelete:!0,silenceRequestBotStartDone:!0},local:{enabled:!0,detail:"default"},operation:{enabled:!0,detail:"verbose",directory:"_tim/operations"},workspace:{enabled:!0,detail:"default"}},intermediates:{location:"os-temp",directory:"_temp"},meta:{location:"workspace",directory:"_meta"}},Ji=new Set(["source","source-subdirectory","workspace","os-temp","none"]);function sn(e,t){let r=At.merge({},t,e),o=typeof r.directory=="string"?r.directory.trim():"",n=o.length>0&&!o.startsWith("/")&&!o.startsWith("\\")&&!o.split(/[\\/]+/).includes("..");return{location:Ji.has(r.location)?r.location:t.location,directory:n?o:t.directory}}function Ft(e,t){let r=At.merge({},t,e),o=r.detail==="quiet"||r.detail==="default"||r.detail==="verbose"?r.detail:t.detail;return{enabled:typeof r.enabled=="boolean"?r.enabled:t.enabled,detail:o}}function Bi(e,t){let r=Ft(e,t),o=At.merge({},t,e),n=typeof o.directory=="string"?o.directory.trim():"",s=n.length>0&&!n.startsWith("/")&&!n.startsWith("\\")&&!n.split(/[\\/]+/).includes("..");return{...r,directory:s?n:t.directory}}function zi(e,t){let r=Ft(e,t),o=At.merge({},t,e);return{...r,silenceCrudDelete:typeof o.silenceCrudDelete=="boolean"?o.silenceCrudDelete:t.silenceCrudDelete,silenceRequestBotStartDone:typeof o.silenceRequestBotStartDone=="boolean"?o.silenceRequestBotStartDone:t.silenceRequestBotStartDone}}function Ye(e){let t=e&&typeof e=="object"?e:{};return{logs:{console:zi(t.logs?.console,ge.logs.console),local:Ft(t.logs?.local,ge.logs.local),operation:Bi(t.logs?.operation,ge.logs.operation),workspace:Ft(t.logs?.workspace,ge.logs.workspace)},intermediates:sn(t.intermediates,ge.intermediates),meta:sn(t.meta,ge.meta)}}import Te from"lodash";import p from"lodash";function ue(e){let t=e?.trim().toLowerCase();if(t)return t==="azure-openai"||t==="azure_openai"||t==="microsoft"?"azure":t==="gemini"||t==="google-generative-ai"?"google":t==="eleven"||t==="eleven-labs"?"elevenlabs":t==="gpt-image"?"openai":t==="claude"?"anthropic":t==="grok"?"xai":t==="byte-dance"||t==="byte_dance"||t==="seedream"?"bytedance":t==="hf"||t==="hugging-face"?"huggingface":t}function pe(e,t="llm"){let r=e?.trim().toLowerCase();return t==="tts"||t==="speech"?r?.startsWith("tts-")||r?.startsWith("gpt-4o-mini-tts")?"openai":"elevenlabs":t==="image"?r?.startsWith("gpt-image")||r?.startsWith("dall-e")?"openai":r?.startsWith("grok")?"xai":r?.startsWith("gemini")||r?.startsWith("nano")?"google":r?.startsWith("seedream")?"bytedance":void 0:t==="video"?r?.startsWith("seedance")||r?.startsWith("dreamina")?"bytedance":void 0:r?.startsWith("gemini")||r?.startsWith("nano")?"google":r?.startsWith("azure/")?"azure":r?.startsWith("claude")?"anthropic":r?.startsWith("grok")?"xai":r?.startsWith("seedance")||r?.startsWith("dreamina")?"bytedance":"openai"}function oe(e={}){return p.pickBy(e,t=>t!=null&&t!=="")}function kt(e={}){let t=p.get(e,"options");return!t||typeof t!="object"||Array.isArray(t)?e:{...t,...e}}function _t(e){return typeof e=="string"&&/^\d+x\d+$/i.test(e.trim())}function qi(e={},t){let r=t==="speech"?"tts":t,o=p.get(e,[`ai-${r}`,"output"]);if(!o||Array.isArray(o)||typeof o!="object")return{};if(r==="image"){let n=kt(o),s=p.get(n,"imageSize");return oe({task:"image",provider:p.get(n,"provider")??p.get(n,"imageProvider"),model:p.get(n,"model")??p.get(n,"imageModel"),size:p.get(n,"size")??(_t(s)?s:void 0),aspectRatio:p.get(n,"aspectRatio")??p.get(n,"imageAspectRatio"),imageSize:p.get(n,"googleImageSize")??p.get(n,"resolution")??p.get(n,"imageResolution")??(_t(s)?void 0:s),quality:p.get(n,"quality")??p.get(n,"imageQuality"),outputFormat:p.get(n,"outputFormat")??p.get(n,"imageOutputFormat"),background:p.get(n,"background")??p.get(n,"imageBackground"),moderation:p.get(n,"moderation")??p.get(n,"imageModeration"),n:p.get(n,"n")??p.get(n,"imageN"),outputCompression:p.get(n,"outputCompression")??p.get(n,"imageOutputCompression"),providerOptions:p.get(n,"providerOptions")??p.get(n,"imageProviderOptions"),reference:p.get(n,"reference")??p.get(n,"imageReference"),references:p.get(n,"references")??p.get(n,"imageReferences"),referenceImagePath:p.get(n,"referenceImagePath")??p.get(n,"imageReferencePath"),referenceImagePaths:p.get(n,"referenceImagePaths")??p.get(n,"imageReferencePaths"),referenceType:p.get(n,"referenceType")??p.get(n,"imageReferenceType"),referenceTypes:p.get(n,"referenceTypes")??p.get(n,"imageReferenceTypes")})}if(r==="video"){let n=kt(o);return oe({task:"video",provider:p.get(n,"provider")??p.get(n,"videoProvider"),model:p.get(n,"model")??p.get(n,"videoModel"),aspectRatio:p.get(n,"aspectRatio")??p.get(n,"videoAspectRatio"),resolution:p.get(n,"resolution")??p.get(n,"videoResolution"),duration:p.get(n,"duration")??p.get(n,"videoDuration"),fps:p.get(n,"fps")??p.get(n,"videoFps"),seed:p.get(n,"seed")??p.get(n,"videoSeed"),reference:p.get(n,"reference"),referenceImagePath:p.get(n,"referenceImagePath"),providerOptions:p.get(n,"providerOptions")??p.get(n,"videoProviderOptions")})}return oe(r==="tts"?{task:"tts",provider:p.get(o,"provider")??p.get(o,"ttsProvider"),model:p.get(o,"model")??p.get(o,"ttsModel"),voiceId:p.get(o,"voiceId"),outputFormat:p.get(o,"outputFormat")??p.get(o,"ttsOutputFormat"),languageCode:p.get(o,"languageCode"),speed:p.get(o,"speed"),instructions:p.get(o,"instructions"),providerOptions:p.get(o,"providerOptions")??p.get(o,"ttsProviderOptions")}:{task:r,provider:p.get(o,"provider")??p.get(o,"llmProvider"),model:p.get(o,"model")??p.get(o,"llmModel"),providerOptions:p.get(o,"providerOptions")??p.get(o,"llmProviderOptions")})}function Ui(e={},t){if(t==="image"){let r=kt(p.get(e,"image",{})),o=p.get(e,"imageSize")??p.get(r,"imageSize");return oe({task:"image",provider:p.get(e,"imageProvider")??p.get(r,"provider"),model:p.get(e,"imageModel")??p.get(r,"model"),size:p.get(e,"size")??p.get(r,"size")??(_t(o)?o:void 0),aspectRatio:p.get(e,"imageAspectRatio")??p.get(r,"aspectRatio"),imageSize:p.get(e,"googleImageSize")??p.get(r,"googleImageSize")??p.get(e,"imageResolution")??p.get(r,"resolution")??(_t(o)?void 0:o),quality:p.get(e,"imageQuality")??p.get(r,"quality"),outputFormat:p.get(e,"imageOutputFormat")??p.get(r,"outputFormat"),background:p.get(e,"imageBackground")??p.get(r,"background"),moderation:p.get(e,"imageModeration")??p.get(r,"moderation"),n:p.get(e,"imageN")??p.get(r,"n"),outputCompression:p.get(e,"imageOutputCompression")??p.get(r,"outputCompression"),providerOptions:p.get(e,"imageProviderOptions")??p.get(r,"providerOptions"),reference:p.get(e,"reference")??p.get(e,"imageReference")??p.get(r,"reference")??p.get(r,"imageReference"),references:p.get(e,"references")??p.get(e,"imageReferences")??p.get(r,"references")??p.get(r,"imageReferences"),referenceImagePath:p.get(e,"referenceImagePath")??p.get(e,"imageReferencePath")??p.get(r,"referenceImagePath")??p.get(r,"imageReferencePath"),referenceImagePaths:p.get(e,"referenceImagePaths")??p.get(e,"imageReferencePaths")??p.get(r,"referenceImagePaths")??p.get(r,"imageReferencePaths"),referenceType:p.get(e,"referenceType")??p.get(e,"imageReferenceType")??p.get(r,"referenceType")??p.get(r,"imageReferenceType"),referenceTypes:p.get(e,"referenceTypes")??p.get(e,"imageReferenceTypes")??p.get(r,"referenceTypes")??p.get(r,"imageReferenceTypes")})}if(t==="video"){let r=kt(p.get(e,"video",{}));return oe({task:"video",provider:p.get(e,"videoProvider")??p.get(r,"provider"),model:p.get(e,"videoModel")??p.get(r,"model"),aspectRatio:p.get(e,"videoAspectRatio")??p.get(r,"aspectRatio"),resolution:p.get(e,"videoResolution")??p.get(r,"resolution"),duration:p.get(e,"videoDuration")??p.get(r,"duration"),fps:p.get(e,"videoFps")??p.get(r,"fps"),seed:p.get(e,"videoSeed")??p.get(r,"seed"),reference:p.get(e,"videoReference")??p.get(r,"reference"),referenceImagePath:p.get(e,"videoReferenceImagePath")??p.get(r,"referenceImagePath"),providerOptions:p.get(e,"videoProviderOptions")??p.get(r,"providerOptions")})}if(t==="tts"||t==="speech"){let r=p.get(e,"tts",p.get(e,"speech",{}));return oe({task:"tts",provider:p.get(e,"ttsProvider")??p.get(e,"speechProvider")??p.get(r,"provider"),model:p.get(e,"ttsModel")??p.get(e,"speechModel")??p.get(r,"model"),voiceId:p.get(e,"voiceId")??p.get(r,"voiceId"),outputFormat:p.get(e,"ttsOutputFormat")??p.get(e,"speechOutputFormat")??p.get(r,"outputFormat"),languageCode:p.get(e,"languageCode")??p.get(r,"languageCode"),speed:p.get(e,"speed")??p.get(r,"speed"),instructions:p.get(e,"instructions")??p.get(r,"instructions"),providerOptions:p.get(e,"ttsProviderOptions")??p.get(e,"speechProviderOptions")??p.get(r,"providerOptions")})}if(t==="transcription"){let r=p.get(e,"transcription",{});return oe({task:"transcription",provider:p.get(e,"transcriptionProvider")??p.get(e,"aiProvider")??p.get(e,"provider")??p.get(r,"provider"),model:p.get(e,"transcriptionModel")??p.get(r,"model"),providerOptions:p.get(e,"transcriptionProviderOptions")??p.get(r,"providerOptions")})}return oe({task:"llm",provider:p.get(e,"llmProvider")??p.get(e,"aiProvider")??p.get(e,"provider"),model:p.get(e,"llmModel")??p.get(e,"model"),providerOptions:p.get(e,"llmProviderOptions")??p.get(e,"providerOptions")})}function X(e={},t,r={}){let o=p.get(e,"ai",{}),n=t==="speech"?"tts":t,s=p.get(r,"profile")??p.get(e,[`${n}Profile`])??p.get(e,[n,"profile"])??p.get(o,["defaults",n]),i=s?p.get(o,["profiles",s],{}):{},a=p.get(o,n,{}),u=p.merge({},i,a,Ui(e,n),qi(e,n),oe(r));return u.task=n,u.provider=ue(u.provider),u.provider||(u.provider=pe(u.model,n)),oe(u)}var Gi={ara:"ar",chi:"zh",deu:"de",dut:"nl",eng:"en",fre:"fr",fra:"fr",ger:"de",heb:"he",ita:"it",jpn:"ja",nld:"nl",por:"pt",rus:"ru",spa:"es",swe:"sv",zho:"zh"};function Lr(e){if(typeof e!="string")return;let t=e.trim().toLowerCase();if(!t)return;let r=t.split("-")[0];return/^[a-z]{2}$/.test(r)?r:Gi[t]}function an(e,t){return Lr(t)??Lr(e.params?.language)??Lr(e.params?.languageCode)}import ua from"node:fs";import Ot from"node:fs";import fn from"lodash";import Re from"path";import Wi from"chokidar";import Ki from"fs-extra";import{globSync as Yi}from"glob";import un from"kleur";import{minimatch as Nr}from"minimatch";import{dirname as pn,isAbsolute as cn,join as Ne}from"node:path";var Le=["node_modules/**","**/node_modules/**","**/dist/**","**/build/**","**/out/**","**/coverage/**","**/.cache/**","**/.tmp/**","**/tmp/**","**/log.txt"],Bm=[...Le,/(^|[\/\\])\../];import{globSync as Vi}from"glob";var He=(e,t,r=[])=>Vi(t,{cwd:e,ignore:[...Le,...r],nodir:!0,dot:!1}),Et=(e,t,r=[])=>He(e,t,r).length;function Lt(e){return e.replace(/\\/g,"/").replace(/^\/+/,"")}function Hi(e,t){let r=Lt(t).replace(/\/+$/,"");if(!r||r.startsWith("#")||r.startsWith("!"))return[];let o=Lt(t.startsWith("/")?r:Ne(e,r));if(!r.includes("/")){let n=Lt(Ne(e,"**",r));return[o,`${o}/**`,n,`${n}/**`]}return[o,`${o}/**`]}function Xi(e){return Yi("**/.timignore",{cwd:e,nodir:!0,dot:!0,ignore:Le}).flatMap(r=>{let o=pn(r)==="."?"":pn(r);return Ki.readFileSync(Ne(e,r),"utf-8").split(/\r?\n/).map(s=>s.trim()).flatMap(s=>Hi(o,s))})}function Or(e){let{cwd:t,target:r,watchPaths:o,depth:n,callbacks:s={},createContext:i,ignore:a=[],ignoreLogs:u,silent:c=!1}=e,d=Xi(t),f=[...a,...d],m=d.map(v=>Ne(t,v)),h=o?.length?o.map(v=>cn(v)?v:Ne(t,v)):[t],y=o?.length?o.reduce((v,T)=>v+Et(cn(T)?T:Ne(t,T),"*",f),0):Et(t,r,f),I=Wi.watch(h,{persistent:!0,depth:n,ignored:[...Le,...f,...m,/(^|[\/\\])\../],ignoreInitial:!0}),A=(v,T)=>i?i(v,T):v,w=v=>Nr(Lt(v),r),C=v=>{let T=v.replace(/\\/g,"/"),L=T.replace(/^\/+/,"");return f.some(R=>Nr(T,R)||Nr(L,R))};return I.on("all",(v,T)=>{let L=T.replace(t,""),R=L.endsWith("log.txt");if(u&&R||C(L))return;let G=w(L);e.debug}).on("add",async v=>{let T=v.replace(t,""),L=T.endsWith("log.txt");if(u&&L||C(T))return;let R=w(T);!s.onAdd||!R||(c||console.log(un.green("File added:"),T),s.onAdd(A(T,"create")))}).on("change",async v=>{let T=v.replace(t,""),L=T.endsWith("log.txt");if(u&&L||C(T))return;let R=w(T);!s.onChange||!R||s.onChange(A(T,"update"))}).on("unlink",async v=>{let T=v.replace(t,""),L=w(T),R=T.endsWith("log.txt");u&&R||C(T)||!s.onUnlink||!L||s.onUnlink(A(T,"delete"))}).on("ready",()=>{c||console.log(un.magenta("watching:"),y,"files")}),I}import Xe from"node:path";function Nt(e,t){let r=t?Xe.dirname(t):e,o=Xe.relative(e,r);if(!o||o==="."||o.startsWith("..")||Xe.isAbsolute(o))return[e];let n=o.split(Xe.sep).filter(Boolean),s=[e];for(let i=1;i<=n.length;i++)s.push(Xe.join(e,...n.slice(0,i)));return s}import nl from"fs-extra";import{homedir as Zi}from"node:os";import Qi from"node:path";import mn from"lodash";var fe=new Map,ln=Symbol.for("tim.resolvedGalleryImports");function Oe(e=[]){for(let t of e){if(!t.name||!t.config||typeof t.config!="object")throw new TypeError("Each IO gallery must provide a non-empty name and config object.");fe.set(t.name,t);for(let r of t.aliases||[])fe.set(r,t)}}function dn(e){return e[ln]??[]}function ye(){return process.env.TIM_PROMPTS_HOME||Qi.join(Zi(),".tim","prompts")}function ea(e,t){return Object.defineProperty(e,ln,{value:[...t],enumerable:!1,configurable:!0}),e}function ta(e){let{import:t,...r}=e;return r}function ra(e){return typeof e=="string"?e.trim()?[e.trim()]:[]:Array.isArray(e)?e.filter(t=>typeof t=="string").map(t=>t.trim()).filter(Boolean):[]}function gn(e,t){if(typeof e=="string"){t(e);return}if(Array.isArray(e))for(let r of e)gn(r,t)}function oa(e){let t=new Set,r=e.triggers;if(!r||typeof r!="object")return t;for(let o of Object.values(r))if(!(!o||typeof o!="object"))for(let n of Object.values(o))gn(n,s=>{fe.has(s)&&t.add(s)});return t}function na(e,t,r){let o=e.config?.triggers?.[t],n=o?.[r];if(typeof n=="string"&&!fe.has(n))return n;if(o&&typeof o=="object"){for(let s of Object.values(o))if(typeof s=="string"&&!fe.has(s))return s}throw new Error(`IO gallery "${e.name}" does not define an entry command for ${t}.`)}function sa(e){let t=e.triggers;if(!(!t||typeof t!="object")){for(let[r,o]of Object.entries(t))if(!(!o||typeof o!="object"))for(let[n,s]of Object.entries(o))typeof s=="string"&&fe.has(s)&&(o[n]=na(fe.get(s),r,n))}}function ia(e,t,r){if(t.has(e))throw new Error(`Circular IO gallery import detected: ${[...t,e].join(" -> ")}`);let o=fe.get(e);if(!o)throw new Error(`Unknown IO gallery import: ${e}`);r.add(o.name),t.add(e);let n=Pe(o.config,t,r);return t.delete(e),n}function Pe(e,t=new Set,r=new Set){if(!e||typeof e!="object")return e;let o=new Set(ra(e.import));for(let s of oa(e))o.add(s);let n={};for(let s of o)mn.merge(n,ia(s,t,r));return mn.merge(n,ta(e)),sa(n),ea(n,r)}function yn(e){return e.file.startsWith("/_requests/")&&e.sessionFull?e.sessionFull:e.fileFull}var Rt=(e,t,r={},o)=>{let n={},{paths:s}=e,{rootFull:i}=s,a=yn(s),u=[];t==="_prompts"&&u.push({dirPath:ye(),fs:{existsSync:Ot.existsSync,readdirSync:Ot.readdirSync,readFileSync:Ot.readFileSync,readJsonSync:c=>JSON.parse(Ot.readFileSync(c,"utf-8"))}}),u.push(...Nt(i,a).map(c=>({dirPath:Re.join(c,t),fs:o})));for(let{dirPath:c,fs:d}of u){if(!d.existsSync(c))continue;let f=d.readdirSync(c).filter(m=>m.endsWith(".md"));for(let m of f){let h=Re.basename(m),y=Re.parse(h).name;y.includes(".")&&(y=y.split(".").pop());let I="";I=d.readFileSync(Re.join(c,m),"utf-8"),I=I.trim().replace(`
|
|
7
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
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
|
|
|
@@ -21,16 +21,16 @@ ${r.map(o=>`- ${o}`).join(`
|
|
|
21
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
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 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.
|
|
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):
|
|
24
|
+
`}async function gc(e,t,r){if(!t.url)return;let o=_(e),n=j.join(e.paths.sessionFull,"_captions"),s=ee.mkdtempSync(j.join(Ls.tmpdir(),"tim-youtube-captions-")),i=e.settings?.captionLanguages||"en.*,en";try{o.session.ensureDir("_captions");let a=await pc(t.url,j.join(s,`${r}.%(ext)s`),i),u=ee.readdirSync(s).filter(h=>/\.(vtt|srt)$/i.test(h)).sort();if(!u.length){o.session.write(j.join("_captions",`_captions.${r}.meta.json`),{...t,sourceFileName:e.fileName,url:t.url,subLanguages:i,captionFiles:[],stdout:a.stdout.trim(),stderr:a.stderr.trim(),updatedAt:Date.now()});return}for(let h of u)ee.copyFileSync(j.join(s,h),j.join(n,h));let c=u[0],d=dc(ee.readFileSync(j.join(s,c),"utf-8")),f=`${r}.transcript.md`;o.session.write(j.join("_captions",`_captions.${r}.meta.json`),{...t,sourceFileName:e.fileName,url:t.url,subLanguages:i,captionFiles:u,transcriptFileName:f,transcriptSourceFile:c,stdout:a.stdout.trim(),stderr:a.stderr.trim(),updatedAt:Date.now()});let m=j.join(e.paths.sessionFull,`_${f}.download`);ee.writeFileSync(m,d,{encoding:"utf-8"}),ee.renameSync(m,j.join(e.paths.sessionFull,f))}catch(a){o.session.ensureDir("_captions"),o.session.write(j.join("_captions",`_captions.${r}.error.json`),{sourceFileName:e.fileName,url:t.url,subLanguages:i,error:a?.message||"Unknown error",updatedAt:Date.now()})}finally{ee.rmSync(s,{recursive:!0,force:!0})}}var hr=async e=>{let{fileName:t,paths:r}=e,o=_(e);try{if(o.session.addToLog("Preparing YouTube audio download"),lc(r.fileFull)){o.session.addToLog("Source is an intermediate path",{type:"skip",data:{reason:"intermediate path"}});return}let n=ac(e);if(!n.url){o.session.addToLog("Descriptor has no URL",{type:"skip",data:{reason:"missing url"}});return}let s=t.replace(/\.(json|ya?ml)$/i,""),i=`${s}.mp3`,a=j.join(r.sessionFull,i);if(await gc(e,n,s),$(a)){o.session.addToLog(`${i} already exists`,{type:"skip"});return}let u=ee.mkdtempSync(j.join(Ls.tmpdir(),"tim-youtube-audio-")),c=Date.now();try{let d=await uc(n.url,j.join(u,`${s}.%(ext)s`)),f=cc(d.stdout),m=f?j.basename(f):mc(u);if(!m)throw new Error(`yt-dlp completed but no mp3 was found in ${u}`);let h=j.join(u,m),y=j.join(r.sessionFull,`_${i}.download`);ee.copyFileSync(h,y),ee.renameSync(y,a);let I=Date.now()-c;o.session.ensureDir("_youtube"),o.session.write(j.join("_youtube",`_youtube.${s}.json`),{...n,sourceFileName:t,audioFileName:i,downloader:"yt-dlp",durationMs:I,stdout:d.stdout.trim(),stderr:d.stderr.trim()}),o.session.addToLog(`Downloaded ${i}`,{duration:I,data:{durationMs:I,outputFileName:i}})}finally{ee.rmSync(u,{recursive:!0,force:!0})}}catch(n){throw n}};var Oo={name:"download-youtube-audio",run:hr};var Os=[Oo];var br={name:"@tim-fs/cli",publishConfig:{access:"public"},version:"0.1.2",type:"module",description:"A filesystem event bus for explicit, inspectable automation",bin:{tim:"dist/index.js"},files:["dist"],scripts:{build:"npm run clean && npm run build:debug","build:release":"node build.mjs --release","build:debug":"node build.mjs",clean:"rm -rf dist",link:"npm run build && npm link",prepack:"npm run clean && npm run build:release",test:"npm run build && node --test test/*.test.mjs",typecheck:"tsc -p tsconfig.json",watch:'nodemon --watch src --ext ts --exec "npm run build"'},keywords:["automation","filesystem","file-watcher","ai","workflow"],license:"MIT",engines:{node:">=20"},repository:{type:"git",url:"git+https://github.com/dht/tim-fs.git",directory:"cli"},bugs:{url:"https://github.com/dht/tim-fs/issues"},homepage:"https://github.com/dht/tim-fs#readme",dependencies:{"@ai-sdk/anthropic":"^3.0.84","@ai-sdk/azure":"^3.0.87","@ai-sdk/bytedance":"^1.0.17","@ai-sdk/elevenlabs":"^2.0.35","@ai-sdk/google":"^3.0.82","@ai-sdk/huggingface":"^1.0.52","@ai-sdk/openai":"^3.0.71","@ai-sdk/xai":"^3.0.95","@elevenlabs/elevenlabs-js":"^2.58.0",ai:"^6.0.205",chokidar:"^5.0.0",commander:"^12.1.0",dotenv:"^17.2.3","fs-extra":"^11.3.2",glob:"13.0.0",kleur:"^4.1.5",lodash:"^4.18.1",logform:"^2.7.0",minimatch:"^10.2.5",openai:"^6.48.0","p-limit":"^7.2.0",sharp:"^0.34.5",winston:"^3.18.3","winston-transport":"^4.9.0",ws:"^8.21.1",yaml:"^2.9.0"},devDependencies:{"@tim-fs/core":"workspace:^","@tim-fs/io-core":"workspace:^","@tim-fs/io-gallery":"workspace:^","@tim-fs/io-youtube":"workspace:^","@types/node":"^20.19.25",esbuild:"^0.27.2",nodemon:"^3.1.7",typescript:"^5.9.3"}};import{config as xc}from"dotenv";import Be from"node:fs";import yc from"node:os";import vr from"node:path";import{parse as hc}from"dotenv";var ut=[{name:"OPENAI_API_KEY",label:"OpenAI"},{name:"ANTHROPIC_API_KEY",label:"Anthropic"},{name:"GOOGLE_API_KEY",label:"Google Gemini"},{name:"ELEVENLABS_API_KEY",label:"ElevenLabs",aliases:["ELEVEN_LABS_API_KEY"]},{name:"XAI_API_KEY",label:"xAI"},{name:"HUGGINGFACE_API_KEY",label:"Hugging Face",aliases:["HF_TOKEN","HF_ACCESS_TOKEN"]},{name:"ARK_API_KEY",label:"ByteDance ModelArk"},{name:"AZURE_OPENAI_API_KEY",label:"Azure OpenAI",aliases:["AZURE_API_KEY"]}];function bc(e=process.env){return e.TIM_HOME||vr.join(yc.homedir(),".tim")}function ze(e=process.env){return e.TIM_ENV_FILE||vr.join(bc(e),".env")}function vc(e){return Be.existsSync(e)?hc(Be.readFileSync(e)):{}}function Ic(e,...t){for(let r of t)for(let o of[e.name,...e.aliases||[]]){let n=r[o]?.trim();if(n)return n}return""}function Sc(e){return e?JSON.stringify(e):""}function Rs(e={}){let t=e.environment||process.env,r=e.destination||ze(t),o=vc(r);return Object.fromEntries(ut.map(n=>[n.name,Ic(n,o,t)]))}function $s(e,t=ze()){let r=["# TIM provider credentials","# Run `npx @tim-fs/cli init` again to update this file.","",...ut.map(o=>`${o.name}=${Sc(e[o.name]||"")}`),""];Be.mkdirSync(vr.dirname(t),{recursive:!0,mode:448}),Be.chmodSync(vr.dirname(t),448),Be.writeFileSync(t,r.join(`
|
|
25
|
+
`),{encoding:"utf8",mode:384}),Be.chmodSync(t,384)}xc({path:ze(),quiet:!0});import{emitKeypressEvents as wc}from"node:readline";import K from"kleur";var Cc=["\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557","\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D"," \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557"," \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u255A\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u255A\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551"," \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u255A\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551"," \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D"],Pc=e=>K.enabled?`\x1B[38;5;208m${e}\x1B[39m`:e;function Ds(e){let t=Cc.map((r,o)=>o<3?K.cyan(r):Pc(r));console.log(`
|
|
26
26
|
${t.join(`
|
|
27
27
|
`)}`),console.log(`${K.bold("TIM-FS")} ${K.dim(`v${e}`)} ${K.dim("\xB7")} Filesystem automation, made friendly.
|
|
28
28
|
`),console.log(`${K.green("\u25CF")} Provider keys are saved locally in ${K.cyan("~/.tim/.env")}
|
|
29
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
30
|
`)}
|
|
31
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
|
|
32
|
+
`),c(e.filter(I=>n.has(I.name))))};wc(r),r.setRawMode(!0),r.resume(),r.on("keypress",m),o.write("\x1B[?25l"),u()})}import pt from"node:fs";import qe from"node:path";function Ms(e){let t=new Set;function r(o){if(!(!o||typeof o!="object")){if(Array.isArray(o)){for(let n of o)r(n);return}for(let[n,s]of Object.entries(o))typeof s=="string"&&s.trim()&&(n==="promptId"||n.endsWith("PromptId"))&&t.add(s.trim()),r(s)}}return r(e),[...t]}function Tc(e){let t=qe.parse(qe.basename(e)).name;return t.includes(".")&&(t=t.split(".").pop()),t}function Js(e,t,r){let o=pt.readdirSync(e).find(i=>i.endsWith(".md")&&Tc(i)===r);if(!o)throw new Error(`Prompt "${r}" was not found in ${e}. Run "tim init" first.`);pt.mkdirSync(t,{recursive:!0}),pt.copyFileSync(qe.join(e,o),qe.join(t,o));let n=o.replace(/\.md$/,".schema.json"),s=qe.join(e,n);pt.existsSync(s)&&pt.copyFileSync(s,qe.join(t,n))}var ct=new kc,Ir=process.cwd(),Ro=class extends Ac{muted=!1;_write(t,r,o){this.muted||process.stdout.write(t),o()}};async function _c(e,t,r){process.stdout.write(r),t.muted=!0;let o=await e.question("");return t.muted=!1,process.stdout.write(o?`\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022
|
|
33
33
|
`:`
|
|
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=
|
|
35
|
-
`);for(let c of i){let d=!!r[c.name],f=await
|
|
34
|
+
`),o.trim()}ct.name("tim").description("Run filesystem-driven IO bots from configured directories.").version(br.version);ct.command("init").description("Configure provider keys and install bundled prompts in ~/.tim.").option("--non-interactive","create the env file without prompting").action(async e=>{Ds(br.version);let t=ze(),r=Rs({destination:t});if(!e.nonInteractive&&process.stdin.isTTY&&process.stdout.isTTY){let s=new Set(ut.filter(c=>!!r[c.name]).map(c=>c.name)),i=await js(ut,s),a=new Ro,u=Fc.createInterface({input:process.stdin,output:a,terminal:!0});try{i.length===0&&console.log(`No providers selected. Skipping provider key setup.
|
|
35
|
+
`);for(let c of i){let d=!!r[c.name],f=await _c(u,a,`${c.label}${d?" (press Enter to keep current key)":""}: `);f&&(r[c.name]=f)}}finally{a.muted=!1,u.close()}}$s(r,t);let o=Object.values(r).filter(Boolean).length;console.log(`Saved ${o} provider key(s) to ${t}`);let n=ye();_e.mkdirSync(n,{recursive:!0});for(let s of Es){if(!_e.existsSync(s.from))throw new Error(`Gallery prompt source not found: ${s.from}`);_e.cpSync(s.from,n,{recursive:!0,force:!0}),console.log(`Installed ${s.gallery} prompts to ${n}`)}});ct.command("eject").description("Expand gallery convenience config and copy referenced prompts into ./_prompts.").action(()=>{let e=Bs.join(Ir,"config.json");if(!_e.existsSync(e))throw new Error(`No config.json found in ${Ir}`);let t=JSON.parse(_e.readFileSync(e,"utf-8")),r=Pe(t),o=Ms(r.settings||{}),n=ye();if(o.length>0&&!_e.existsSync(n))throw new Error(`TIM prompts were not found at ${n}. Run "tim init" first.`);if(_e.writeFileSync(e,`${JSON.stringify(r,null,2)}
|
|
36
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});
|