UNPKG

baseai

Version:

The Web AI Framework Dev - BaseAI.dev

97 lines (83 loc) 150 kB
#!/usr/bin/env node import _l from"dotenv";import kl from"path";import Zs from"figures";import y from"picocolors";var Nl={info:y.cyan,success:y.green,warning:y.yellow,error:y.red,green:y.green,red:y.red,yellow:y.yellow,cyan:y.cyan,blue:y.blue,magenta:y.magenta,white:y.white,gray:y.gray,dim:y.dim,bold:y.bold},te=e=>y.italic(y.dim(e)),xe=y.dim,Fl=y.bold,jl=y.underline,Gl=y.italic,Bl=y.inverse,ql=y.hidden,Ul=y.strikethrough,Hl=y.reset,Jl=y.black,Kl=y.red,xo=y.green,Vl=y.yellow,zl=y.blue,Xl=y.magenta,X=y.cyan,Yl=y.white,Wl=y.gray;var jt=y.dim(`${Zs.lineUpDownRight} `);import Gt from"fs";import ei from"path";async function Bt(){let e=ei.join(process.cwd(),"baseai","pipes");return Gt.existsSync(e)?(await Gt.promises.readdir(e)).map(r=>r.replace(".ts","")):[]}import qt from"fs";import oi from"path";async function Le(){let e=oi.join(process.cwd(),"baseai","tools");return qt.existsSync(e)?(await qt.promises.readdir(e)).map(r=>r.replace(".ts","")):[]}import Me from"picocolors";function h({text:e,sub:o,dim:t,green:r}){return r?`${Me.bgGreen(Me.black(` ${e} `))} ${o&&o}`:t?`${Me.bgBlack(Me.white(` ${e} `))} ${o&&o}`:`${Me.bold(Me.bgCyan(Me.black(` ${e} `)))} ${o&&o}`}import et from"figures";var ti={pipe:et.lineDownDoubleRightDouble,tool:et.lineDownLeftBoldRightBold,memory:et.nodejs},Ee=ti;import Ut from"@sindresorhus/slugify";function wo({name:e,allTools:o}){return o.some(t=>Ut(t)===Ut(e))}import*as ot from"@clack/prompts";import{cosmiconfig as ri}from"cosmiconfig";import{TypeScriptLoader as ni}from"cosmiconfig-typescript-loader";var We={log:{isEnabled:!0,logSensitiveData:!1,pipe:!0,"pipe.completion":!0,"pipe.request":!0,"pipe.response":!0,tool:!0,memory:!0},memory:{useLocalEmbeddings:!1},envFilePath:".env"};async function W(){let e=ri("baseai",{searchPlaces:["baseai/baseai.config.ts"],loaders:{".ts":ni()}});try{let o=await e.search();o||(ot.cancel("Failed to create config file"),process.exit(1));let t=o.config.config;if(t)return{...We,...t,log:{...We.log,...t.log}}}catch{ot.cancel("Error: Unable to load config file"),process.exit(1)}return We}import si from"fs/promises";import*as Po from"@clack/prompts";import ii from"picocolors";function ai({spinner:e}){e.stop("No account found"),Po.log.warn("No account found. Please authenticate first."),Po.log.info(`Run: ${ii.green("npx baseai auth")}`)}function pi({spinner:e,error:o}){e.stop("Failed to retrieve authentication"),Po.log.error(`Error retrieving stored auth: ${o.message}`)}async function Ae({spinner:e}){var o;e.start("Retrieving stored authentication");try{let r=(await W()).envFilePath||".env",s=(o=(await si.readFile(r,"utf-8")).split(` `).reverse().find(i=>i.includes("LANGBASE_API_KEY=")))==null?void 0:o.split("=")[1];return s?(e.stop("Retrieved stored authentication"),{apiKey:s}):(ai({spinner:e}),null)}catch(t){return pi({spinner:e,error:t}),null}}import*as Ht from"prettier";async function we(e){return await Ht.format(e,{parser:"typescript",singleQuote:!0,trailingComma:"none",arrowParens:"avoid",printWidth:80,useTabs:!0,semi:!0,tabWidth:4})}import*as v from"@clack/prompts";import tt from"@sindresorhus/slugify";import rt from"camelcase";import li from"figures";import vo from"fs";import mi from"p-map";import Eo from"path";import So from"picocolors";function ci(e){if(!e)return{login:"",name:""};let o=e.split("/"),t=o.length;return t<2?{login:"",name:""}:{login:o[t-2],name:o[t-1]}}async function di({login:e,name:o,spinner:t}){var r;try{let n=await Ae({spinner:t});if(!n){v.log.error('Authentication failed. Please run "npx baseai auth" to authenticate.');return}t.start("Fetching pipe from Langbase");let s=`https://api.langbase.com/v1/pipes/${e}/${o}`,i=await fetch(s,{method:"GET",headers:{"Content-Type":"application/json",...n&&{Authorization:`Bearer ${n.apiKey}`}}});if(i.ok)return t.stop("Fetched pipe from Langbase"),await i.json();let a=await i.json();a&&(t.stop(`Failed to fetch pipe from Langbase: ${(r=a.error)==null?void 0:r.message}`),process.exit(1))}catch(n){return t.stop(n),null}}async function ui(e){if(!e.tools.length)return;let o=await Le();try{await mi(e.tools,async t=>{if(wo({name:t.function.name,allTools:o})&&!(await v.group({overwrite:()=>v.confirm({message:`${So.dim(Ee.tool)} Tool: ${So.cyan(t.function.name)} already exists. Do you want to overwrite it?`,initialValue:!1})},{onCancel:()=>{v.cancel("Operation cancelled."),process.exit(0)}})).overwrite){v.outro("Skipped \u2026");return}let n=t.function.name,s=rt(n),i=tt(n),a=`import { ToolI } from '@baseai/core'; export async function ${n}() { // Your tool logic here } const ${s}Tool = (): ToolI => ({ run: ${n}, // Name of the function to run type: 'function' as const, function: { name: \`${n}\`, description: \`${t.function.description}\`, parameters: ${JSON.stringify(t.function.parameters||{},null,6)} } }); export default ${s}Tool;`,p=await we(a),l=Eo.join(process.cwd(),"baseai","tools"),m=Eo.join(l,`${i}.ts`);await vo.promises.mkdir(l,{recursive:!0}),await vo.promises.writeFile(m,p),v.outro(`Tool created successfully at ${m}`)},{concurrency:1})}catch(t){v.cancel(`Error creating tool: ${t.message}`)}}function fi(e){return e.map(o=>{let t=tt(o.function.name),r=`${rt(o.function.name)}Tool`,n=`import ${r} from '../tools/${t}';`;return{toolCall:`${r}()`,importPath:n,toolFileName:t}})}async function gi(e){try{let o=await Bt(),t=tt(e.name);if(o.some(d=>d===t)&&!(await v.group({overwrite:()=>v.confirm({message:`PIPE: ${So.cyan(e.name)} already exists. Do you want to overwrite it?`,initialValue:!1})},{onCancel:()=>{v.cancel("Operation cancelled."),process.exit(0)}})).overwrite){v.outro("Skipped \u2026");return}let n=await fi(e.tools),s=n.map(d=>d.toolCall),i=rt("pipe-"+e.name),a=e.messages.map(d=>({...d.name&&{name:d.name},role:d.role,content:d.content})),p=`import { PipeI } from '@baseai/core'; ${n.map(d=>d.importPath).join(` `)} const ${i} = (): PipeI => ({ // Replace with your API key https://langbase.com/docs/api-reference/api-keys apiKey: process.env.LANGBASE_API_KEY!, name: \`${e.name}\`, description: \`${e.description}\`, status: \`${e.status}\`, model: \`${e.model}\`, stream: ${e.stream}, json: ${e.json}, store: ${e.store}, moderate: ${e.moderate||!0}, top_p: ${e.top_p}, max_tokens: ${e.max_tokens}, temperature: ${e.temperature}, presence_penalty: ${e.presence_penalty}, frequency_penalty: ${e.frequency_penalty}, stop: ${JSON.stringify(e.stop)}, tool_choice: ${JSON.stringify(e.tool_choice)}, parallel_tool_calls: ${e.parallel_tool_calls}, messages: ${JSON.stringify(a||[])}, variables: ${JSON.stringify(e.variables)}, tools: [${s}], memory: [], }); export default ${i};`,l=await we(p),m=Eo.join(process.cwd(),"baseai","pipes"),c=Eo.join(m,`${t}.ts`);await vo.promises.mkdir(m,{recursive:!0}),await vo.promises.writeFile(c,l),v.outro(`Pipe created successfully at ${c}`),v.outro(h({text:t,sub:`pipe added ${xe(li.pointer)} ${te(` ${c}`)}`,green:!0})),process.exit(0)}catch(o){v.cancel(`Error creating pipe: ${o.message}`)}}async function Jt({loginAndPipe:e}){v.intro(h({text:"PIPE",sub:`Adding ${So.cyan(e)}`}));let{login:o,name:t}=ci(e);if(!o||!t){v.log.error("Invalid pipe information provided");return}let r=v.spinner();try{let n=await di({login:o,name:t,spinner:r});if(!n)return;await ui(n),await gi(n)}catch(n){r.stop("An unexpected error occurred"),v.log.error(`'An unexpected error occurred': ${n.message}`)}}import*as zt from"@clack/prompts";import{cancel as nt,confirm as Kt,isCancel as st,note as hi,outro as it,password as yi}from"@clack/prompts";import at from"fs/promises";import Ci from"open";import Vt from"path";import Qe from"picocolors";async function Xt(){var m;zt.intro(h({text:"Langbase Authentication",sub:"Auth by logging in to Langbase and getting your API key"}));let e=await Kt({message:`Open the authentication page? ${Qe.dim("\u2014 copy your API key from there and paste it here.")}`});st(e)&&(nt("Operation cancelled."),process.exit(0)),e&&(await Ci("https://langbase.com/settings/api"),hi(Qe.yellow("Please copy your API key from the opened page and paste it here.")));let o=await yi({message:"Paste your API key string:",mask:"*"});st(o)&&(nt("Operation cancelled."),process.exit(0));let[t,r]=o.split(":");(!t||!r)&&(it(Qe.red("Invalid API key string. It should be in the format login:apiKey, when copied from https://langbase.com/settings/api it should be in the correct format.")),process.exit(1));let s=` # Langbase API key for https://langbase.com/${t} LANGBASE_API_KEY=${r} `,a=(await W()).envFilePath||".env",p=await at.readFile(a,"utf-8"),l=(m=p.split(` `).reverse().find(c=>c.includes("LANGBASE_API_KEY")))==null?void 0:m.split("=")[1];if(l){let c=await Kt({message:`API key found in ${a}. Overwrite?`});st(c)&&(nt("Operation cancelled."),process.exit(0)),c||(it(Qe.yellow("API key is not overwritten.")),process.exit(0));let d=p.replace(new RegExp(`LANGBASE_API_KEY=${l}`),s.trim());await at.writeFile(Vt.join(process.cwd(),a),d)}else await at.appendFile(Vt.join(process.cwd(),a),s);it(Qe.green(`Authentication successful. API key is stored in ${a}`)),process.exit(0)}import*as N from"@clack/prompts";import{exec as bi}from"child_process";import re from"fs/promises";import L from"path";import{promisify as xi}from"util";var Yt=xi(bi);async function wi({calledAsCommand:e}){try{e&&N.intro(h({text:"BUILDING",sub:"baseai..."})),await Pi(),await vi(),await Ze(),console.log(""),N.outro(h({text:"BUILD",sub:"complete",green:!0}))}catch(o){throw N.log.error("Build failed"),o}}var Mo=wi,Pi=async()=>{console.log(""),N.intro(h({text:"PIPES",sub:"",dim:!0}));let e=L.join(process.cwd(),"baseai","pipes"),o=L.join(process.cwd(),".baseai","pipes"),t=await Wt(e,o,"pipes");pt("Pipes",t,Ee.pipe)},vi=async()=>{console.log(""),N.intro(h({text:"TOOLS",sub:"",dim:!0}));let e=L.join(process.cwd(),"baseai","tools"),o=L.join(process.cwd(),".baseai","tools"),t=await Wt(e,o,"tools");pt("Tools",t,Ee.tool)},Ze=async({memoryName:e}={})=>{console.log(""),N.intro(h({text:"MEMORY",sub:"",dim:!0}));let o=L.join(process.cwd(),"baseai","memory"),t=L.join(process.cwd(),".baseai","memory");try{await re.access(o)}catch{N.log.info("No memory directory found. Skipping memory build.");return}try{await re.access(t)}catch{await re.mkdir(t,{recursive:!0})}let r=[],n=N.spinner(),s=[];if(e&&(s=await Ei({sourcePath:o,memoryName:e})),!e&&(s=await Si(o),s.length===0)){N.log.info("MEMORY: No index.ts file found. Skipping memory build.");return}n.start("Building memory");for(let i of s){let a=L.join(o,i),p=L.join(t,`${L.dirname(i)}.json`),l=L.dirname(i);try{let{stdout:m}=await Yt(`npx tsx -e "import memoryConfig from '${JSON.stringify(a)}'; console.log(JSON.stringify(memoryConfig()))"`);await re.writeFile(p,m),n.message(`Compiled ${l}`),r.push(l)}catch(m){n.stop(`Error compiling ${l}: ${m}`)}}n.stop("Build complete"),pt("Memories",r,Ee.memory)},Wt=async(e,o,t)=>{try{await re.access(e)}catch{return N.log.info(`No ${t} directory found. Skipping ${t} build.`),[]}await re.mkdir(o,{recursive:!0});let n=(await re.readdir(e)).filter(a=>a.endsWith(".ts"));if(n.length===0)return N.log.info(`No .ts files found in the ${t} directory. Skipping ${t} build.`),[];let s=N.spinner();s.start(`Building ${t}`);let i=[];for(let a of n){let p=L.join(e,a),l=L.join(o,a.replace(".ts",".json")),m=L.parse(a).name;try{let{stdout:c}=await Yt(`npx tsx -e "import config from '${JSON.stringify(p)}'; console.log(JSON.stringify(config()))"`),d=JSON.parse(c);"apiKey"in d&&delete d.apiKey;let f=JSON.stringify(d,null,2);await re.writeFile(l,f),s.message(`Compiled ${m}`),i.push(m)}catch(c){s.stop(`Error compiling ${m}: ${c}`)}}return s.stop("Build complete"),i},pt=(e,o,t)=>{o.length>0&&o.forEach(r=>{console.log(`${t} ${r}`)})};async function Ei({sourcePath:e,memoryName:o}){let t=[],r=L.join(e,o),s=(await re.readdir(r)).find(i=>i==="index.ts");return s||(N.log.info("MEMORY: No index.ts file found. Skipping memory build."),process.exit(1)),t.push(L.join(o,s)),t}async function Si(e){let o=[],r=(await re.readdir(e)).map(async i=>{let a=L.join(e,i);return(await re.stat(a)).isDirectory()?i:""}),n=await Promise.all(r);if(n=n.filter(i=>i!==""),n.length===0)return N.log.info("MEMORY: No memory found. Skipping memory build."),[];let s=n.map(async i=>{let a=L.join(e,i),l=(await re.readdir(a)).find(m=>m==="index.ts");return l?L.join(i,l):""});return o=await Promise.all(s),o=o.filter(i=>i!==""),o}var T="OpenAI",q="Anthropic",I="Together",_="Google",F="Groq",j="Cohere",E="Fireworks AI",R="Perplexity",pe="Mistral AI",Qt="deepinfra",Zt="bedrock",er="azure-openai",K="ollama",Ne="xAI",Ym={[T]:[{id:"gpt-4o",provider:T,promptCost:5,completionCost:15,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gpt-4o-2024-08-06",provider:T,promptCost:2.5,completionCost:10,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gpt-4o-mini",provider:T,promptCost:.15,completionCost:.6,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gpt-4-turbo",provider:T,promptCost:10,completionCost:30,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gpt-4-turbo-preview",provider:T,promptCost:10,completionCost:30,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gpt-4-0125-preview",provider:T,promptCost:10,completionCost:30,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gpt-4-1106-preview",provider:T,promptCost:10,completionCost:30,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gpt-4",provider:T,promptCost:30,completionCost:60,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gpt-4-0613",provider:T,promptCost:30,completionCost:60,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gpt-4-32k",provider:T,promptCost:60,completionCost:120,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gpt-3.5-turbo",provider:T,promptCost:.5,completionCost:1.5,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gpt-3.5-turbo-0125",provider:T,promptCost:.5,completionCost:1.5,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gpt-3.5-turbo-1106",provider:T,promptCost:1,completionCost:2,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gpt-3.5-turbo-16k",provider:T,promptCost:3,completionCost:4,toolSupport:{toolChoice:!0,parallelToolCalls:!0}}],[I]:[{id:"meta-llama/Llama-3.3-70B-Instruct-Turbo",provider:I,promptCost:.88,completionCost:.88},{id:"meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo",provider:I,promptCost:5,completionCost:5,toolSupport:{toolChoice:!0,parallelToolCalls:!1}},{id:"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",provider:I,promptCost:.88,completionCost:.88,toolSupport:{toolChoice:!0,parallelToolCalls:!1}},{id:"meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",provider:I,promptCost:.18,completionCost:.18,toolSupport:{toolChoice:!0,parallelToolCalls:!1}},{id:"meta-llama/Llama-3-70b-chat-hf",provider:I,promptCost:.9,completionCost:.9},{id:"meta-llama/Llama-3-8b-chat-hf",provider:I,promptCost:.2,completionCost:.2},{id:"togethercomputer/Llama-2-7B-32K-Instruct",provider:I,promptCost:.2,completionCost:.2},{id:"meta-llama/Llama-2-13b-chat-hf",provider:I,promptCost:.225,completionCost:.225},{id:"meta-llama/Llama-2-70b-chat-hf",provider:I,promptCost:.9,completionCost:.9},{id:"google/gemma-7b-it",provider:I,promptCost:.2,completionCost:.2},{id:"google/gemma-2b-it",provider:I,promptCost:.1,completionCost:.1},{id:"mistralai/Mistral-7B-Instruct-v0.1",provider:I,promptCost:.2,completionCost:.2,toolSupport:{toolChoice:!0,parallelToolCalls:!1}},{id:"mistralai/Mistral-7B-Instruct-v0.2",provider:I,promptCost:.2,completionCost:.2},{id:"mistralai/Mixtral-8x7B-Instruct-v0.1",provider:I,promptCost:.6,completionCost:.6,toolSupport:{toolChoice:!0,parallelToolCalls:!1}},{id:"mistralai/Mixtral-8x22B-Instruct-v0.1",provider:I,promptCost:1.2,completionCost:1.2},{id:"databricks/dbrx-instruct",provider:I,promptCost:1.2,completionCost:1.2}],[q]:[{id:"claude-3-5-sonnet-latest",provider:q,promptCost:3,completionCost:15,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"claude-3-5-sonnet-20240620",provider:q,promptCost:3,completionCost:15,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"claude-3-opus-20240229",provider:q,promptCost:15,completionCost:75,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"claude-3-sonnet-20240229",provider:q,promptCost:3,completionCost:15,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"claude-3-haiku-20240307",provider:q,promptCost:.25,completionCost:1.25,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"claude-3-5-haiku-20241022",provider:q,promptCost:1,completionCost:5,toolSupport:{toolChoice:!0,parallelToolCalls:!0}}],[F]:[{id:"llama-3.3-70b-versatile",provider:F,promptCost:.59,completionCost:.79},{id:"llama-3.1-70b-versatile",provider:F,promptCost:.59,completionCost:.79},{id:"llama-3.1-8b-instant",provider:F,promptCost:.59,completionCost:.79},{id:"llama3-70b-8192",provider:F,promptCost:.59,completionCost:.79},{id:"llama3-8b-8192",provider:F,promptCost:.05,completionCost:.1},{id:"mixtral-8x7b-32768",provider:F,promptCost:.27,completionCost:.27},{id:"gemma2-9b-it",provider:F,promptCost:.2,completionCost:.2},{id:"gemma-7b-it",provider:F,promptCost:.07,completionCost:.07}],[_]:[{id:"gemini-1.5-pro-latest",provider:_,promptCost:3.5,completionCost:10.5,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gemini-1.5-flash-latest",provider:_,promptCost:.075,completionCost:.3,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gemini-1.5-flash-8b-latest",provider:_,promptCost:.0375,completionCost:.15,toolSupport:{toolChoice:!0,parallelToolCalls:!0}},{id:"gemini-pro",provider:_,promptCost:.5,completionCost:1.5,toolSupport:{toolChoice:!1,parallelToolCalls:!1}}],[j]:[{id:"command-r",provider:j,promptCost:.5,completionCost:1.5},{id:"command-r-plus",provider:j,promptCost:3,completionCost:15}],[E]:[{id:"llama-v3p3-70b-instruct",provider:E,promptCost:.88,completionCost:.88},{id:"llama-v3p1-405b-instruct",provider:E,promptCost:3,completionCost:3},{id:"llama-v3p1-70b-instruct",provider:E,promptCost:.9,completionCost:.9},{id:"llama-v3p1-8b-instruct",provider:E,promptCost:.2,completionCost:.2},{id:"yi-large",provider:E,promptCost:3,completionCost:3},{id:"llama-v3-70b-instruct",provider:E,promptCost:.9,completionCost:.9}],[R]:[{id:"llama-3.1-sonar-huge-128k-online",provider:R,promptCost:5,completionCost:5,requestCost:.005},{id:"llama-3.1-sonar-large-128k-online",provider:R,promptCost:1,completionCost:1,requestCost:.005},{id:"llama-3.1-sonar-small-128k-online",provider:R,promptCost:.2,completionCost:.2,requestCost:.005},{id:"llama-3.1-sonar-large-128k-chat",provider:R,promptCost:1,completionCost:1},{id:"llama-3.1-sonar-small-128k-chat",provider:R,promptCost:.2,completionCost:.2}],[pe]:[{id:"mistral-large-latest",provider:pe,promptCost:3,completionCost:9},{id:"open-mistral-nemo",provider:pe,promptCost:.3,completionCost:.3},{id:"codestral-latest",provider:pe,promptCost:1,completionCost:3}],[Ne]:[{id:"grok-beta",provider:Ne,promptCost:5,completionCost:15}]},or=["gpt-4o","gpt-4o-mini-2024-07-18-free","gpt-4o-2024-08-06","gpt-4o-mini","gpt-4-turbo","gpt-4-turbo-preview","gpt-4-0125-preview","gpt-3.5-turbo","gpt-3.5-turbo-0125","gpt-3.5-turbo-1106","gpt-4-1106-preview","mistralai/Mistral-7B-Instruct-v0.1","mistralai/Mixtral-8x7B-Instruct-v0.1","gemini-1.5-pro-latest","gemini-1.5-flash-latest"];import Ie from"chalk";import Mi from"util";var Ai=!1,Ii=!1,Ti=["sensitive","secret","hide","private","password","token","key","auth","authorization","redact"],_i=e=>typeof e=="object"&&e!==null?Mi.inspect(e,{colors:!0,depth:null}):typeof e=="string"?Ie.green(`"${e}"`):typeof e=="number"?Ie.yellow(e.toString()):typeof e=="boolean"?Ie.cyan(e.toString()):String(e),ki=e=>Ti.some(o=>e.toLowerCase().includes(o)),Ri=(e,o)=>o&&!Ii?Ie.red("======REDACTED======"):_i(e),tr=(e,o,t)=>{let r=Ri(o,!!t&&ki(t||e));console.log(` ${Ie.blue("======")} \u{1F440} ${Ie.bold(e)} \u{1F440} ${Ie.blue("======")}`),console.log(r)},u=(e,o,t)=>{Ai&&(typeof e=="object"&&e!==null&&o===void 0?Object.entries(e).forEach(([r,n])=>tr(r,n,t||r)):tr(String(e),o,t))};function Ao({localDocs:e,prodDocs:o}){let t=new Set(e),r=new Set(o),n=t.size===r.size&&e.every(l=>r.has(l)),s=o.every(l=>t.has(l)),i=e.every(l=>r.has(l)),a=!e.some(l=>r.has(l))&&!o.some(l=>t.has(l)),p=e.some(l=>r.has(l));return{areListsSame:n,isProdSubsetOfLocal:s,isProdSupersetOfLocal:i,areMutuallyExclusive:a,areOverlapping:p}}var rr=[".md",".txt",".pdf",".csv",".xlsx",".xls"],Oi={".json":"JSON",".yaml":"YAML",".yml":"YAML",".xml":"XML",".html":"HTML",".htm":"HTML",".abap":"ABAP",".asc":"AGS Script",".ash":"AGS Script",".ampl":"AMPL",".mod":"Modula-2",".g4":"ANTLR",".apl":"APL",".dyalog":"APL",".asp":"ASP",".asax":"ASP",".ascx":"ASP",".ashx":"ASP",".asmx":"ASP",".aspx":"ASP",".axd":"ASP",".dats":"ATS",".hats":"ATS",".sats":"ATS",".as":"ActionScript",".adb":"Ada",".ada":"Ada",".ads":"Ada",".agda":"Agda",".als":"Alloy",".cls":"Visual Basic",".applescript":"AppleScript",".scpt":"AppleScript",".arc":"Arc",".ino":"Arduino",".aj":"AspectJ",".asm":"Assembly",".a51":"Assembly",".inc":"SourcePawn",".nasm":"Assembly",".aug":"Augeas",".ahk":"AutoHotkey",".ahkl":"AutoHotkey",".au3":"AutoIt",".awk":"Awk",".auk":"Awk",".gawk":"Awk",".mawk":"Awk",".nawk":"Awk",".bat":"Batchfile",".cmd":"Batchfile",".befunge":"Befunge",".bison":"Bison",".bb":"BlitzBasic",".decls":"BlitzBasic",".bmx":"BlitzMax",".bsv":"Bluespec",".boo":"Boo",".b":"Limbo",".bf":"HyPhy",".brs":"Brightscript",".bro":"Bro",".c":"C",".cats":"C",".h":"Objective-C",".idc":"C",".w":"C",".cs":"Smalltalk",".cake":"CoffeeScript",".cshtml":"C#",".csx":"C#",".cpp":"C++",".c++":"C++",".cc":"C++",".cp":"Component Pascal",".cxx":"C++",".h++":"C++",".hh":"Hack",".hpp":"C++",".hxx":"C++",".inl":"C++",".ipp":"C++",".tcc":"C++",".tpp":"C++",".chs":"C2hs Haskell",".clp":"CLIPS",".cmake":"CMake",".cmake.in":"CMake",".cob":"COBOL",".cbl":"COBOL",".ccp":"COBOL",".cobol":"COBOL",".cpy":"COBOL",".capnp":"Cap'n Proto",".mss":"CartoCSS",".ceylon":"Ceylon",".chpl":"Chapel",".ch":"xBase",".ck":"ChucK",".cirru":"Cirru",".clw":"Clarion",".icl":"Clean",".dcl":"Clean",".click":"Click",".clj":"Clojure",".boot":"Clojure",".cl2":"Clojure",".cljc":"Clojure",".cljs":"Clojure",".cljs.hl":"Clojure",".cljscm":"Clojure",".cljx":"Clojure",".hic":"Clojure",".coffee":"CoffeeScript","._coffee":"CoffeeScript",".cjsx":"CoffeeScript",".cson":"CoffeeScript",".iced":"CoffeeScript",".cfm":"ColdFusion",".cfml":"ColdFusion",".cfc":"ColdFusion CFC",".lisp":"NewLisp",".asd":"Common Lisp",".cl":"OpenCL",".l":"PicoLisp",".lsp":"NewLisp",".ny":"Common Lisp",".podsl":"Common Lisp",".sexp":"Common Lisp",".cps":"Component Pascal",".coq":"Coq",".v":"Verilog",".cr":"Crystal",".feature":"Cucumber",".cu":"Cuda",".cuh":"Cuda",".cy":"Cycript",".pyx":"Cython",".pxd":"Cython",".pxi":"Cython",".d":"Makefile",".di":"D",".com":"DIGITAL Command Language",".dm":"DM",".dart":"Dart",".djs":"Dogescript",".dylan":"Dylan",".dyl":"Dylan",".intr":"Dylan",".lid":"Dylan",".E":"E",".ecl":"ECLiPSe",".eclxml":"ECL",".e":"Eiffel",".ex":"Elixir",".exs":"Elixir",".elm":"Elm",".el":"Emacs Lisp",".emacs":"Emacs Lisp",".emacs.desktop":"Emacs Lisp",".em":"EmberScript",".emberscript":"EmberScript",".erl":"Erlang",".es":"JavaScript",".escript":"Erlang",".hrl":"Erlang",".xrl":"Erlang",".yrl":"Erlang",".fs":"GLSL",".fsi":"F#",".fsx":"F#",".fx":"HLSL",".flux":"FLUX",".f90":"FORTRAN",".f":"Forth",".f03":"FORTRAN",".f08":"FORTRAN",".f77":"FORTRAN",".f95":"FORTRAN",".for":"Forth",".fpp":"FORTRAN",".factor":"Factor",".fy":"Fancy",".fancypack":"Fancy",".fan":"Fantom",".fth":"Forth",".4th":"Forth",".forth":"Forth",".fr":"Frege",".frt":"Forth",".ftl":"FreeMarker",".gms":"GAMS",".g":"GAP",".gap":"GAP",".gd":"GDScript",".gi":"GAP",".tst":"Scilab",".s":"GAS",".ms":"MAXScript",".glsl":"GLSL",".fp":"GLSL",".frag":"JavaScript",".frg":"GLSL",".fsh":"GLSL",".fshader":"GLSL",".geo":"GLSL",".geom":"GLSL",".glslv":"GLSL",".gshader":"GLSL",".shader":"GLSL",".vert":"GLSL",".vrx":"GLSL",".vsh":"GLSL",".vshader":"GLSL",".gml":"Game Maker Language",".kid":"Genshi",".ebuild":"Gentoo Ebuild",".eclass":"Gentoo Eclass",".glf":"Glyph",".gp":"Gnuplot",".gnu":"Gnuplot",".gnuplot":"Gnuplot",".plot":"Gnuplot",".plt":"Gnuplot",".go":"Go",".golo":"Golo",".gs":"JavaScript",".gst":"Gosu",".gsx":"Gosu",".vark":"Gosu",".grace":"Grace",".gf":"Grammatical Framework",".groovy":"Groovy",".grt":"Groovy",".gtpl":"Groovy",".gvy":"Groovy",".gsp":"Groovy Server Pages",".hcl":"HCL",".tf":"HCL",".hlsl":"HLSL",".fxh":"HLSL",".hlsli":"HLSL",".php":"PHP",".hb":"Harbour",".hs":"Haskell",".hsc":"Haskell",".hx":"Haxe",".hxsl":"Haxe",".hy":"Hy",".pro":"QMake",".dlm":"IDL",".ipf":"IGOR Pro",".idr":"Idris",".lidr":"Idris",".ni":"Inform 7",".i7x":"Inform 7",".iss":"Inno Setup",".io":"Io",".ik":"Ioke",".thy":"Isabelle",".ijs":"J",".flex":"JFlex",".jflex":"JFlex",".jq":"JSONiq",".jsx":"JSX",".mdx":"MDX",".j":"Objective-J",".java":"Java",".jsp":"Java Server Pages",".js":"JavaScript","._js":"JavaScript",".bones":"JavaScript",".es6":"JavaScript",".jake":"JavaScript",".jsb":"JavaScript",".jscad":"JavaScript",".jsfl":"JavaScript",".jsm":"JavaScript",".jss":"JavaScript",".njs":"JavaScript",".pac":"JavaScript",".sjs":"JavaScript",".ssjs":"JavaScript",".sublime-build":"JavaScript",".sublime-commands":"JavaScript",".sublime-completions":"JavaScript",".sublime-keymap":"JavaScript",".sublime-macro":"JavaScript",".sublime-menu":"JavaScript",".sublime-mousemap":"JavaScript",".sublime-project":"JavaScript",".sublime-settings":"JavaScript",".sublime-theme":"JavaScript",".sublime-workspace":"JavaScript",".sublime_metrics":"JavaScript",".sublime_session":"JavaScript",".xsjs":"JavaScript",".xsjslib":"JavaScript",".jl":"Julia",".krl":"KRL",".sch":"KiCad",".brd":"KiCad",".kicad_pcb":"KiCad",".kt":"Kotlin",".ktm":"Kotlin",".kts":"Kotlin",".lfe":"LFE",".ll":"LLVM",".lol":"LOLCODE",".lsl":"LSL",".lslp":"LSL",".lvproj":"LabVIEW",".lasso":"Lasso",".las":"Lasso",".lasso8":"Lasso",".lasso9":"Lasso",".ldml":"Lasso",".lean":"Lean",".hlean":"Lean",".lex":"Lex",".ly":"LilyPond",".ily":"LilyPond",".m":"Objective-C",".lagda":"Literate Agda",".litcoffee":"Literate CoffeeScript",".lhs":"Literate Haskell",".ls":"LoomScript","._ls":"LiveScript",".xm":"Logos",".x":"Logos",".xi":"Logos",".lgt":"Logtalk",".logtalk":"Logtalk",".lookml":"LookML",".lua":"Lua",".fcgi":"Shell",".nse":"Lua",".pd_lua":"Lua",".rbxs":"Lua",".wlua":"Lua",".mumps":"M",".m4":"M4Sugar",".mcr":"MAXScript",".muf":"MUF",".mak":"Makefile",".mk":"Makefile",".mkfile":"Makefile",".mako":"Mako",".mao":"Mako",".mathematica":"Mathematica",".cdf":"Mathematica",".ma":"Mathematica",".mt":"Mathematica",".nb":"Mathematica",".nbp":"Mathematica",".wl":"Mathematica",".wlt":"Mathematica",".matlab":"Matlab",".maxpat":"Max",".maxhelp":"Max",".maxproj":"Max",".mxt":"Max",".pat":"Max",".moo":"Moocode",".metal":"Metal",".minid":"MiniD",".druby":"Mirah",".duby":"Mirah",".mir":"Mirah",".mirah":"Mirah",".mo":"Modelica",".mms":"Module Management System",".mmk":"Module Management System",".monkey":"Monkey",".moon":"MoonScript",".myt":"Myghty",".ncl":"NCL",".nsi":"NSIS",".nsh":"NSIS",".n":"Nemerle",".axs":"NetLinx",".axi":"NetLinx",".axs.erb":"NetLinx+ERB",".axi.erb":"NetLinx+ERB",".nlogo":"NetLogo",".nl":"NewLisp",".nim":"Nimrod",".nimrod":"Nimrod",".nit":"Nit",".nix":"Nix",".nu":"Nu",".numpy":"NumPy",".numpyw":"NumPy",".numsc":"NumPy",".ml":"OCaml",".eliom":"OCaml",".eliomi":"OCaml",".ml4":"OCaml",".mli":"OCaml",".mll":"OCaml",".mly":"OCaml",".mm":"Objective-C++",".sj":"Objective-J",".omgrofl":"Omgrofl",".opa":"Opa",".opal":"Opal",".opencl":"OpenCL",".p":"OpenEdge ABL",".scad":"OpenSCAD",".ox":"Ox",".oxh":"Ox",".oxo":"Ox",".oxygene":"Oxygene",".oz":"Oz",".pwn":"PAWN",".aw":"PHP",".ctp":"PHP",".php3":"PHP",".php4":"PHP",".php5":"PHP",".phps":"PHP",".phpt":"PHP",".pls":"PLSQL",".pck":"PLSQL",".pkb":"PLSQL",".pks":"PLSQL",".plb":"PLSQL",".plsql":"PLSQL",".sql":"SQLPL",".pov":"POV-Ray SDL",".pan":"Pan",".psc":"Papyrus",".parrot":"Parrot",".pasm":"Parrot Assembly",".pir":"Parrot Internal Representation",".pas":"Pascal",".dfm":"Pascal",".dpr":"Pascal",".lpr":"Pascal",".pp":"Puppet",".pl":"Prolog",".al":"Perl",".cgi":"Shell",".perl":"Perl",".ph":"Perl",".plx":"Perl",".pm":"Perl6",".pod":"Perl",".psgi":"Perl",".t":"Turing",".6pl":"Perl6",".6pm":"Perl6",".nqp":"Perl6",".p6":"Perl6",".p6l":"Perl6",".p6m":"Perl6",".pl6":"Perl6",".pm6":"Perl6",".pig":"PigLatin",".pike":"Pike",".pmod":"Pike",".pogo":"PogoScript",".pony":"Pony",".ps1":"PowerShell",".psd1":"PowerShell",".psm1":"PowerShell",".pde":"Processing",".prolog":"Prolog",".yap":"Prolog",".spin":"Propeller Spin",".pd":"Pure Data",".pb":"PureBasic",".pbi":"PureBasic",".purs":"PureScript",".py":"Python",".bzl":"Python",".gyp":"Python",".lmi":"Python",".pyde":"Python",".pyp":"Python",".pyt":"Python",".pyw":"Python",".rpy":"Ren'Py",".tac":"Python",".wsgi":"Python",".xpy":"Python",".qml":"QML",".qbs":"QML",".pri":"QMake",".r":"Rebol",".rd":"R",".rsx":"R",".rbbas":"REALbasic",".rbfrm":"REALbasic",".rbmnu":"REALbasic",".rbres":"REALbasic",".rbtbar":"REALbasic",".rbuistate":"REALbasic",".rkt":"Racket",".rktd":"Racket",".rktl":"Racket",".scrbl":"Racket",".rl":"Ragel in Ruby Host",".reb":"Rebol",".r2":"Rebol",".r3":"Rebol",".rebol":"Rebol",".red":"Red",".reds":"Red",".cw":"Redcode",".rs":"Rust",".rsh":"RenderScript",".robot":"RobotFramework",".rg":"Rouge",".rb":"Ruby",".builder":"Ruby",".gemspec":"Ruby",".god":"Ruby",".irbrc":"Ruby",".jbuilder":"Ruby",".mspec":"Ruby",".pluginspec":"Ruby",".podspec":"Ruby",".rabl":"Ruby",".rake":"Ruby",".rbuild":"Ruby",".rbw":"Ruby",".rbx":"Ruby",".ru":"Ruby",".ruby":"Ruby",".thor":"Ruby",".watchr":"Ruby",".rs.in":"Rust",".sas":"SAS",".smt2":"SMT",".smt":"SMT",".sqf":"SQF",".hqf":"SQF",".db2":"SQLPL",".sage":"Sage",".sagews":"Sage",".sls":"Scheme",".scala":"Scala",".sbt":"Scala",".sc":"SuperCollider",".scm":"Scheme",".sld":"Scheme",".sps":"Scheme",".ss":"Scheme",".sci":"Scilab",".sce":"Scilab",".self":"Self",".sh":"Shell",".bash":"Shell",".bats":"Shell",".command":"Shell",".ksh":"Shell",".sh.in":"Shell",".tmux":"Shell",".tool":"Shell",".zsh":"Shell",".sh-session":"ShellSession",".shen":"Shen",".sl":"Slash",".smali":"Smali",".st":"Smalltalk",".tpl":"Smarty",".sp":"SourcePawn",".sma":"SourcePawn",".nut":"Squirrel",".stan":"Stan",".ML":"Standard ML",".fun":"Standard ML",".sig":"Standard ML",".sml":"Standard ML",".do":"Stata",".ado":"Stata",".doh":"Stata",".ihlp":"Stata",".mata":"Stata",".matah":"Stata",".sthlp":"Stata",".scd":"SuperCollider",".swift":"Swift",".sv":"SystemVerilog",".svh":"SystemVerilog",".vh":"SystemVerilog",".txl":"TXL",".tcl":"Tcl",".adp":"Tcl",".tm":"Tcl",".tcsh":"Tcsh",".csh":"Tcsh",".thrift":"Thrift",".tu":"Turing",".ts":"TypeScript",".tsx":"TypeScript",".upc":"Unified Parallel C",".uno":"Uno",".uc":"UnrealScript",".ur":"UrWeb",".urs":"UrWeb",".vcl":"VCL",".vhdl":"VHDL",".vhd":"VHDL",".vhf":"VHDL",".vhi":"VHDL",".vho":"VHDL",".vhs":"VHDL",".vht":"VHDL",".vhw":"VHDL",".vala":"Vala",".vapi":"Vala",".veo":"Verilog",".vim":"VimL",".vb":"Visual Basic",".bas":"Visual Basic",".frm":"Visual Basic",".frx":"Visual Basic",".vba":"Visual Basic",".vbhtml":"Visual Basic",".vbs":"Visual Basic",".volt":"Volt",".webidl":"WebIDL",".x10":"X10",".xc":"XC",".xsp-config":"XPages",".xsp.metadata":"XPages",".xpl":"XProc",".xproc":"XProc",".xquery":"XQuery",".xq":"XQuery",".xql":"XQuery",".xqm":"XQuery",".xqy":"XQuery",".xs":"XS",".xslt":"XSLT",".xsl":"XSLT",".xojo_code":"Xojo",".xojo_menu":"Xojo",".xojo_report":"Xojo",".xojo_script":"Xojo",".xojo_toolbar":"Xojo",".xojo_window":"Xojo",".xtend":"Xtend",".y":"Yacc",".yacc":"Yacc",".yy":"Yacc",".zep":"Zephir",".zimpl":"Zimpl",".zmpl":"Zimpl",".zpl":"Zimpl",".ec":"eC",".eh":"eC",".fish":"fish",".mu":"mupad",".nc":"nesC",".ooc":"ooc",".wisp":"wisp",".prg":"xBase",".prw":"xBase"},Io=[...rr,...Object.keys(Oi)],P={MAX_DOC_SIZE:10*1024*1024,ACCEPTED_MIME_TYPES:["text/plain","application/pdf","text/markdown","text/csv","application/vnd.ms-excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],DOC_TYPES:rr,EMBEDDING_MODEL:"text-embedding-3-large",EMBEDDING_DIMENSIONS:256,MIN_CHUNK_LENGTH:1024,MAX_CHUNK_LENGTH:3e4,MIN_CHUNK_OVERLAP:256,EMBEDDING_MODEL_TOKENS_LIMIT:8191,EMBEDDING_MAX_BATCH_SIZE:2048,EMBEDDING_ENCODING_FORMAT:"float",TOP_K:3,MAX_CHUNKS_ATTACHED_TO_LLM:20,OLLAMA_EMBEDDINGS_ENDPOINT:"http://localhost:11434/api/embeddings",OLLAMA_EMBEDDINGS_MODEL:"mxbai-embed-large"},eo=`Below is some CONTEXT for you to answer the questions. ONLY answer from the CONTEXT. CONTEXT consists of multiple information chunks. Each chunk has a source mentioned at the end. For each piece of response you provide, cite the source in brackets like so: [1]. At the end of the answer, always list each source with its corresponding number and provide the document name. like so [1] Filename.doc. If you don't know the answer, just say that you don't know. Ask for more context and better questions if needed.`;import*as Q from"@clack/prompts";import Te from"fs/promises";import _e from"path";import{getDocumentProxy as $i,extractText as Di}from"unpdf";import*as To from"xlsx";async function lt(e){let o=e.type;o.includes("charset")&&(o="text/plain");let t="";return o==="text/plain"?t=await Li(e):o==="application/pdf"?t=await Ni(e):o==="text/csv"?t=await Fi(e):o.includes("application/vnd")?t=await ji(e):t=await Gi(e),t=Bi(t),t}async function Li(e){return await e.text()}async function Ni(e){let o=await $i(await e.arrayBuffer()),{text:t}=await Di(o,{mergePages:!0});return typeof t=="string"?t:t.join(` `)}async function Fi(e){let o=await e.text();return nr(o)}async function ji(e){let o=await e.arrayBuffer(),t=To.read(new Uint8Array(o),{type:"array"}),r="";for(let n of t.SheetNames){let s=t.Sheets[n],i=To.utils.sheet_to_csv(s),a=nr(i);r+=a+` `}return r}async function Gi(e){return await e.text()}function Bi(e){return e.replace(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g,"")}function nr(e){let o=e.split(` `),t=o[0].replace("\r","");return o.slice(1).map(n=>n.trim()===""||/^[,]+$/.test(n.trim())?"":t+` `+n).join(` `)}import*as gt from"@clack/prompts";import{fromZodError as Cr}from"zod-validation-error";import*as sr from"@clack/prompts";import qi from"compute-cosine-similarity";import _o from"fs/promises";import{Low as ir}from"lowdb";import{JSONFile as ar}from"lowdb/node";import mt from"path";import Ui from"picocolors";import{z as oo}from"zod";var Hi=oo.object({id:oo.string().uuid(),text:oo.string().trim().min(1),embedding:oo.array(oo.number())}),ko={documents:{},chunks:{}};async function ct(e){let o=mt.join(process.cwd(),".baseai","db"),t=mt.join(o,`${e}.json`);await _o.mkdir(o,{recursive:!0});try{await _o.access(t)}catch{await _o.writeFile(t,JSON.stringify(ko,null,2))}let r=new ar(t),n=new ir(r,ko);return await n.read(),n.data===null&&(n.data=ko,await n.write()),n}async function Ji(e){let o=new ar(e),t=new ir(o,ko);return await t.read(),t}async function Fe(e){try{let o=Ki(e);return await _o.access(o),await Ji(o)}catch(o){if(o.code==="ENOENT")return await ct(e);throw o}}async function pr({db:e,docName:o}){if(e.data.documents[o]){sr.log.info(`[SKIPPED] DOC: ${Ui.cyan(o)} already exists.`);return}e.data.documents[o]={name:o,chunkIds:[]},await e.write()}function lr(e,o){return e.data.documents[o]}async function Ro({db:e,docName:o}){if(!e.data.documents[o])throw new Error(`Document with name "${o}" does not exist`);for(let t of e.data.documents[o].chunkIds)delete e.data.chunks[t];delete e.data.documents[o],await e.write()}async function mr({db:e,docName:o,chunks:t}){if(!e.data.documents[o])throw new Error(`Document with name "${o}" does not exist`);for(let r of t){let n=crypto.randomUUID(),s=Hi.parse({...r,id:n});e.data.chunks[n]=s,e.data.documents[o].chunkIds.push(n)}await e.write()}async function Oo(e){let o=[];for(let t of e){let r=await Fe(t);for(let[n,s]of Object.entries(r.data.documents)){let i=s.chunkIds.map(a=>{let p=r.data.chunks[a];return{text:p.text,embedding:p.embedding,attributes:{memoryName:t,docName:n}}});o.push(...i)}}return o}function $o({chunks:e,queryEmbedding:o,topK:t}){if(t<=0||e.length===0)return[];let r=e.map(n=>({text:n.text,attributes:n.attributes,similarity:qi(n.embedding,o)||0}));return r.sort((n,s)=>s.similarity-n.similarity),r.slice(0,t)}function Ki(e){let o=process.cwd();return mt.join(o,".baseai","db",`${e}.json`)}import{z as M}from"zod";var to=M.string().min(3,"Memory name must be at least 3 characters long").max(50,"Memory name must not exceed 50 characters").regex(/^[a-zA-Z0-9.-]+$/,"Memory name can only contain letters, numbers, dots, and hyphens"),Vi=M.string().trim().min(1),cr=M.object({memoryName:to,documentName:Vi}),zi=M.object({enabled:M.boolean(),include:M.array(M.string().trim().min(1,"Include pattern must not be empty")).min(1,"At least one include pattern must be specified").describe("Glob patterns to include files in the memory"),gitignore:M.boolean().optional().default(!0),deployedAt:M.string().trim().optional().default(""),embeddedAt:M.string().trim().optional().default("")}),Xi=M.object({meta:M.function().args(M.object({name:M.string(),size:M.string(),content:M.string(),blob:M.instanceof(Blob),path:M.string()})).returns(M.record(M.string())).optional()}),Do=M.object({name:M.string(),description:M.string().optional(),git:zi,documents:Xi.optional()});import*as ur from"@clack/prompts";import je from"chalk";import Yi from"util";import Wi from"log-symbols";var Qi=je.blue.inverse,Zi=["sensitive","secret","hide","private","password","token","key","auth","authorization","redact"],dt=class e{constructor(o){this.config=o}static async initialize(){if(!e.instance){let o=await W();e.instance=new e(o.log)}return e.instance}formatValue(o){return typeof o=="object"&&o!==null?Yi.inspect(o,{colors:!0,depth:null}):typeof o=="string"?je.green(`"${o}"`):typeof o=="number"?je.yellow(o.toString()):typeof o=="boolean"?je.cyan(o.toString()):String(o)}isSensitiveData(o){return Zi.some(t=>o.toLowerCase().includes(t))}formatAndRedactSensitiveData(o,t){return t&&!this.config.logSensitiveData?je.red("======REDACTED======"):this.formatValue(o)}isCategoryEnabled(o){let t=o.split("."),r="";for(let n of t)if(r+=(r?".":"")+n,r in this.config){let s=this.config[r];if(typeof s=="boolean"&&s===!1)return!1}return!0}logValue(o,t,r){let n=this.formatAndRedactSensitiveData(t,this.isSensitiveData(r||o)),s=r?`${je.blue.bold(r)}`:"";console.log(` ${Wi.info} ${Qi(` ${o} `)} ${s} ${n}`)}log(o,t,r){!this.config.isEnabled||!this.isCategoryEnabled(o)||this.logValue(o,t,r)}},dr=dt;var ft=null,ut=null,fr=async()=>{ut||(ut=dr.initialize()),ft=await ut},ea=()=>(ft||(ur.cancel("Logger has not been initialized. Call initLogger() first."),process.exit(1)),ft),ge=(e,o,t)=>{ea().log(e,o,t)};import*as hr from"@clack/prompts";async function Ge(e){try{return await gr("test"),(await Promise.all(e.map(n=>gr(n)))).map(n=>n.embedding).map(n=>({embedding:n}))}catch(o){throw console.error("Error generating embeddings:",o),o}}async function gr(e){let o=P.OLLAMA_EMBEDDINGS_ENDPOINT,t=JSON.stringify({model:P.OLLAMA_EMBEDDINGS_MODEL,prompt:e});try{let r=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:t});if(!r.ok)throw new Error(`Error: ${r.statusText}`);return await r.json()}catch(r){throw console.error(),hr.cancel(`Error generating embeddings with Ollama. Please ensure that Ollama is running and the embeddings '${P.OLLAMA_EMBEDDINGS_MODEL}' model is enabled.`),process.exit(1),r}}import*as yr from"@clack/prompts";import{getEncoding as oa}from"js-tiktoken";import ta from"openai";var Be=async e=>{let o=process.env.OPENAI_API_KEY;o||(yr.cancel("OpenAI key not found. Please set the OPENAI_API_KEY environment variable. Only required locally, in production, add it to your keysets https://langbase.com/docs/features/keysets"),process.exit(1));try{let t=new ta({apiKey:o}),r=oa("cl100k_base"),n=0;for(let a of e){let p=r.encode(a).length;if(n+=p,p>P.EMBEDDING_MODEL_TOKENS_LIMIT)throw new Error(`Input exceeds the maximum token limit of ${P.EMBEDDING_MODEL_TOKENS_LIMIT}.`)}let s=[],i=P.EMBEDDING_MAX_BATCH_SIZE;for(let a=0;a<e.length;a+=i){let p=e.slice(a,a+i),{data:l}=await t.embeddings.create({model:P.EMBEDDING_MODEL,dimensions:P.EMBEDDING_DIMENSIONS,input:p,encoding_format:P.EMBEDDING_ENCODING_FORMAT});s.push(...l)}return s}catch(t){throw console.error("Error:",t),new Error("Error getting OpenAI embeddings")}};function ro(e){return e===0?"0 bytes":e<1024?e.toFixed(2)+" bytes":e<1024*1024?(e/1024).toFixed(2)+" KB":(e/1048576).toFixed(2)+" MB"}var Lo=e=>{let o=to.safeParse(e);if(!o.success){let t=Cr(o.error).message;gt.cancel(`Invalid memory name: ${t}`),process.exit(1)}return o.data},br=({memoryName:e,documentName:o})=>{let t=cr.safeParse({memoryName:e,documentName:o});if(!t.success){let r=Cr(t.error).message;gt.cancel(`Invalid input: ${r}`),process.exit(1)}return t.data};var xr=async({messages:e,memoryNames:o})=>{var t;try{let r=o.length>0;ge("memory",r,"Memory attached");let n=e.length>0;if(!r||!n)return;let s=[...e].reverse().find(d=>d.role==="user"),i=s==null?void 0:s.content;if(!i)return;let p=((t=(await W()).memory)==null?void 0:t.useLocalEmbeddings)||!1,l=[];p?(u("Generating local embeddings"),l=await Ge([i])):(u("Generating OpenAI embeddings"),l=await Be([i]));let m=await Oo(o);if(m.length===0)return;let c=$o({chunks:m,queryEmbedding:l[0].embedding,topK:P.MAX_CHUNKS_ATTACHED_TO_LLM});return c.length===0?void 0:(ge("memory.similarChunks",c),c)}catch(r){u("utils/memory/lib.ts: addContextFromMemory: error:",r)}};import wr from"fs/promises";import Pr from"path";import*as qe from"@clack/prompts";function ra(e){return typeof e=="object"&&e!==null&&"useGitRepo"in e&&typeof e.useGitRepo=="boolean"&&"dirToTrack"in e&&typeof e.dirToTrack=="string"&&"extToTrack"in e&&Array.isArray(e.extToTrack)}function No(e){if(typeof e!="object"||e===null||!("name"in e)||!("config"in e))return!1;let o=e;return typeof o.name=="string"&&(o.config===void 0||ra(o.config))}function Fo(e){if(!e.config)return"Invalid memory config.";let o={name:e.name,description:e.description||"Your memory description",git:{enabled:e.config.useGitRepo,include:e.config.extToTrack[0]==="*"?[`${e.config.dirToTrack}/**/*`]:e.config.extToTrack.map(t=>{var r;return`${(r=e.config)==null?void 0:r.dirToTrack}/**/*${t}`}),gitignore:!0,deployedAt:e.config.deployedCommitHash||"",embeddedAt:e.config.embeddedCommitHash||""}};return` Your memory config is using an outdated format in baseai/memory/${e.name}/index.ts. Please update the file to this new format: ${JSON.stringify(o,null,2)} Key changes: - Removed nested 'config' object structure - Git-related fields are now grouped under a 'git' object - 'useGitRepo' is now 'git.enabled' - 'dirToTrack' and 'extToTrack' are combined into 'git.include' glob patterns - 'deployedCommitHash' is now 'git.deployedAt' - 'embeddedCommitHash' is now 'git.embeddedAt' - Added new 'git.gitignore' field (defaults to true) For more information, refer to the documentation: https://baseai.dev/docs/guides/memory-from-git `}function na(e){try{let o=e.replace(/import\s+.*?['"];?\s*/g,"").replace(/export\s+default\s+/,""),t=o.match(/(?:const\s+)?(\w+)\s*=\s*\(\s*\)\s*(?::\s*\w+)?\s*=>\s*\(({[\s\S]*?})\)/);if(t||(t=o.match(/(?:const\s+)?(\w+)\s*=\s*\(\s*\)\s*(?::\s*\w+)?\s*=>\s*\{[\s\S]*?return\s+({[\s\S]*?})\s*;\s*\}/)),t||(t=o.match(/(?:const\s+)?(?:memory|\w+)\s*=\s*({[\s\S]*?});?$/m)),!t)throw new Error("Unable to find memory object definition");let r=t[t.length-1];return new Function(`return ${r}`)()}catch(o){throw console.error("Parsing error:",o),console.error("File contents:",e),new Error(`Failed to extract config: ${o instanceof Error?o.message:"Unknown error"}`)}}async function no(e){try{let o=Pr.join(process.cwd(),"baseai","memory",e),t=Pr.join(o,"index.ts");await wr.access(t);let r=await wr.readFile(t,"utf-8"),n=na(r);try{return Do.parse(n)}catch(s){throw n&&No(n)&&(qe.note(Fo(n)),qe.cancel("Deployment cancelled. Please update your memory config file to the new format."),process.exit(1)),s}}catch(o){o instanceof Error?qe.cancel(`Failed to load memory '${e}': ${o.message}`):qe.cancel(`Failed to load memory '${e}': Unknown error`),process.exit(1)}}import{execSync as ht}from"child_process";import sa from"fast-glob";var Pe=async e=>{let o=await aa(e),t=!o||!o.git.enabled,r=o==null?void 0:o.documents;return t?await ia({memoryName:e,documentConfig:r}):await yt({memoryName:e,memoryConfig:o})},yt=async({memoryName:e,memoryConfig:o})=>{let t=o.git.include;(!Array.isArray(t)||t.length===0)&&(Q.cancel(`No include patterns specified for memory '${e}'`),process.exit(1)),console.log("Reading documents in memory...");let r;try{let i=new Set([...ht("git ls-files",{encoding:"utf-8"}).split(` `).filter(Boolean),...ht("git ls-files --others --exclude-standard",{encoding:"utf-8"}).split(` `).filter(Boolean),...ht("git diff --name-only",{encoding:"utf-8"}).split(` `).filter(Boolean)]);r=(await sa(t,{ignore:["node_modules/**"],dot:!0,gitignore:o.git.gitignore||!0})).filter(p=>i.has(p))}catch{Q.cancel(`Failed to read documents in memory '${e}'.`),process.exit(1)}let s=(await Promise.all(r.map(async i=>{var f;if(!Io.some(b=>i.endsWith(b)))return null;let p;try{p=await Te.readFile(i)}catch{return Q.log.warn(`Failed to read file: ${i}. Skipping.`),null}let l=new Blob([p]);if(l.size>P.MAX_DOC_SIZE)return Q.log.warn(`Skipping ${i}; File exceeds the maximum size of ${ro(P.MAX_DOC_SIZE)}.`),null;let c={path:i,name:_e.basename(i.replace(/\//g,"-")),size:ro(l.size),content:await lt(l),blob:l},d={};return(f=o==null?void 0:o.documents)!=null&&f.meta&&(d=o.documents.meta(c)||{}),{...c,meta:d}}))).filter(i=>i!==null);return s.length===0?[]:s},ia=async({memoryName:e,documentConfig:o})=>{let t=_e.join(process.cwd(),"baseai","memory",e),r=_e.join(t,"documents");try{await Te.access(r)}catch{Q.cancel(`Documents directory for memory '${e}' does not exist.`),process.exit(1)}let n;try{n=await Te.readdir(r)}catch{Q.cancel(`Failed to read documents in memory '${e}'.`),process.exit(1)}let i=(await Promise.all(n.map(async a=>{if(!Io.some(x=>a.endsWith(x)))return Q.log.warn(`Skipping ${a}; Unsupported file extension.`),null;let l=_e.join(r,a),m;try{m=await Te.readFile(l)}catch{return Q.log.warn(`Failed to read file: ${a}. Skipping.`),null}let c=new Blob([m]);if(c.size>P.MAX_DOC_SIZE)return Q.log.warn(`Skipping ${a}; File exceeds the maximum size of ${ro(P.MAX_DOC_SIZE)}.`),null;let f={name:a,path:l,size:ro(c.size),content:await lt(c),blob:c},b={};return o!=null&&o.meta&&(b=o.meta(f)||{}),{...f,meta:b}}))).filter(a=>a!==null);return i.length===0?[]:i};async function aa(e){let o=await no(e);return o!==null?(Do.safeParse(o).success||(Q.cancel(`Memory '${e}' has an invalid config.`),process.exit(1)),{...o}):null}var jo=async e=>{let o=_e.join(process.cwd(),"baseai","memory",e),t=_e.join(o,"documents");try{await Te.access(t)}catch{Q.cancel(`Documents directory for memory '${e}' does not exist.`),process.exit(1)}try{let r=await Te.readdir(t);return(await Promise.all(r.map(async s=>{let i=_e.join(t,s),a=await Te.stat(i),p=Io.some(m=>s.endsWith(m)),l=a.size<=P.MAX_DOC_SIZE;return p&&l?s:null}))).filter(s=>s!==null)}catch{Q.cancel(`Failed to read documents in memory '${e}'.`),process.exit(1)}};import vr from"chalk";import pa from"cli-table3";import*as Ct from"@clack/prompts";function Er(e,o){let t=new Set([...e,...o]),r=Array.from(t).map(s=>[e.includes(s)?s:"",o.includes(s)?s:""]),n=new pa({head:[vr.cyan("Local"),vr.cyan("Prod")],chars:{top:"\u2550","top-mid":"\u2564","top-left":"\u2554","top-right":"\u2557",bottom:"\u2550","bottom-mid":"\u2567","bottom-left":"\u255A","bottom-right":"\u255D",left:"\u2551","left-mid":"\u255F",mid:"\u2500","mid-mid":"\u253C",right:"\u2551","right-mid":"\u2562",middle:"\u2502"}});r.forEach(s=>n.push(s)),Ct.log.message("Prod and local are out of sync."),Ct.log.message(` ${n.toString()}`)}import*as g from"@clack/prompts";import mo from"fs/promises";import ke from"node-fetch";import me from"path";import fa from"picocolors";import{execSync as xt}from"child_process";import*as le from"@clack/prompts";import Sr from"fs/promises";import*as so from"@clack/prompts";import Mr from"path";async function Ar({memoryName:e,deployedCommitHash:o}){try{let t=Mr.join(process.cwd(),"baseai","memory",e),r=Mr.join(t,"index.ts"),n=await Sr.readFile(r,"utf-8");if(n.includes("git:")){let s=n.match(/(\t*)git:\s*{[^}]*?}/);if(s){let[i,a]=s,p=a+" ",l=i.match(/{\s*\n?\s*(.*?)\s*\n?\s*}/s),m=l?l[1]:"",c=m.split(` `).map(f=>f.trim().replace(/,\s*$/,"")).filter(Boolean),d;m.includes("deployedAt:")?c=c.map(f=>f.includes("deployedAt:")?`deployedAt: '${o}'`:f):c.push(`deployedAt: '${o}'`),d=c.map((f,b)=>{let x=b===c.length-1;return`${p}${f}${x?"":","}`}).join(` `),n=n.replace(/(\t*)git:\s*{[^}]*?}/,`${a}git: { ${d} ${a}}`)}}else{let s=n.match(/(?:const\s+\w+\s*=\s*\(\s*\)\s*(?::\s*\w+)?\s*=>\s*\({[\s\S]*?)(}\))/);if(s){let i=s.index+s[0].length-s[1].length,a=n.slice(0,i),p=n.slice(i),l=a.match(/\n(\t+)[^\n]+\n\s*$/),m=l?l[1]:" ",c=m+" ",d=["enabled: false","include: ['**/*']","gitignore: false",`deployedAt: '${o}'`],f=d.map((b,x)=>{let fe=x===d.length-1;return`${c}${b}${fe?"":","}`}).join(` `);n=`${a}, ${m}git: { ${f} ${m}}${p}`}else throw new Error("Could not find appropriate location to insert git config")}await Sr.writeFile(r,n,"utf-8"),so.log.success(`Updated deployedAt hash for memory '${e}'.`)}catch(t){throw t instanceof Error?so.cancel(`Failed to save deployedAt hash for memory '${e}': ${t.message}`):so.cancel(`Failed to save deployedAt hash for memory '${e}': Unknown error`),t}}import{execSync as Ir}from"child_process";async function _r({oldCommit:e,latestCommit:o="HEAD",include:t}){try{if(e==="")throw new Error("Invalid commit references");if(!Array.isArray(t)||t.length===0)throw new Error("Include patterns must be a non-empty array");let r=process.cwd(),n=Ir(Tr({include:t,oldCommit:e,diffFilter:"ACMRT",latestCommit:o}),{encoding:"utf-8",cwd:r}).trim(),s=Ir(Tr({include:t,oldCommit:e,diffFilter:"D",latestCo