blink 0.1.49 → 0.1.50
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/dist/cli/index.js +2 -2
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -2046,7 +2046,7 @@ const SCREEN_READER_USER_PREFIX=`User: `,InputPrompt=({buffer:buffer$2,onSubmit,
|
|
|
2046
2046
|
`),additionalLines$1=[];if(remainingGhostText){let textLines=remainingGhostText.split(`
|
|
2047
2047
|
`);for(let textLine of textLines){let words$1=textLine.split(` `),currentLine=``;for(let word of words$1){let prospectiveLine=currentLine?`${currentLine} ${word}`:word,prospectiveWidth=stringWidth(prospectiveLine);if(prospectiveWidth>inputWidth){currentLine&&additionalLines$1.push(currentLine);let wordToProcess=word;for(;stringWidth(wordToProcess)>inputWidth;){let part=``,wordCP=toCodePoints(wordToProcess),partWidth=0,splitIndex=0;for(let i$7=0;i$7<wordCP.length;i$7++){let char=wordCP[i$7],charWidth=stringWidth(char);if(partWidth+charWidth>inputWidth)break;part+=char,partWidth+=charWidth,splitIndex=i$7+1}additionalLines$1.push(part),wordToProcess=cpSlice(wordToProcess,splitIndex)}currentLine=wordToProcess}else currentLine=prospectiveLine}currentLine&&additionalLines$1.push(currentLine)}}return{inlineGhost:inlineGhost$1,additionalLines:additionalLines$1}},[completion.promptCompletion.text,buffer$2.text,buffer$2.lines,buffer$2.cursor,inputWidth]),{inlineGhost,additionalLines}=getGhostTextLines();return(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsxs)(Box_default,{borderStyle:`round`,borderColor:shellModeActive?theme.status.warning:focus?theme.border.focused:theme.border.default,paddingX:1,children:[(0,import_jsx_runtime.jsx)(Text,{color:shellModeActive?theme.status.warning:theme.text.accent,children:shellModeActive?reverseSearchActive?(0,import_jsx_runtime.jsxs)(Text,{color:theme.text.link,"aria-label":`User: `,children:[`(r:)`,` `]}):`! `:`> `}),(0,import_jsx_runtime.jsx)(Box_default,{flexGrow:1,flexDirection:`column`,children:buffer$2.text.length===0&&placeholder?focus?(0,import_jsx_runtime.jsxs)(Text,{children:[source_default.inverse(placeholder.slice(0,1)),(0,import_jsx_runtime.jsx)(Text,{color:theme.text.secondary,children:placeholder.slice(1)})]}):(0,import_jsx_runtime.jsx)(Text,{color:theme.text.secondary,children:placeholder}):linesToRender.map((lineText,visualIdxInRenderedSet)=>{let tokens=parseInputForHighlighting(lineText,visualIdxInRenderedSet),cursorVisualRow=cursorVisualRowAbsolute-scrollVisualRow,isOnCursorLine=focus&&visualIdxInRenderedSet===cursorVisualRow,renderedLine=[],charCount=0;tokens.forEach((token$1,tokenIdx)=>{let display=token$1.text;if(isOnCursorLine){let relativeVisualColForHighlight=cursorVisualColAbsolute,tokenStart=charCount,tokenEnd=tokenStart+cpLen(token$1.text);if(relativeVisualColForHighlight>=tokenStart&&relativeVisualColForHighlight<tokenEnd){let charToHighlight=cpSlice(token$1.text,relativeVisualColForHighlight-tokenStart,relativeVisualColForHighlight-tokenStart+1),highlighted=source_default.inverse(charToHighlight);display=cpSlice(token$1.text,0,relativeVisualColForHighlight-tokenStart)+highlighted+cpSlice(token$1.text,relativeVisualColForHighlight-tokenStart+1)}charCount=tokenEnd}let color=token$1.type===`command`||token$1.type===`file`?theme.text.accent:theme.text.primary;renderedLine.push((0,import_jsx_runtime.jsx)(Text,{color,children:display},`token-${tokenIdx}`))});let currentLineGhost=isOnCursorLine?inlineGhost:``;isOnCursorLine&&cursorVisualColAbsolute===cpLen(lineText)&&(currentLineGhost||renderedLine.push((0,import_jsx_runtime.jsx)(Text,{children:source_default.inverse(` `)},`cursor-end-${cursorVisualColAbsolute}`)));let showCursorBeforeGhost=focus&&isOnCursorLine&&cursorVisualColAbsolute===cpLen(lineText)&¤tLineGhost;return(0,import_jsx_runtime.jsx)(Box_default,{height:1,children:(0,import_jsx_runtime.jsxs)(Text,{children:[renderedLine,showCursorBeforeGhost&&source_default.inverse(` `),currentLineGhost&&(0,import_jsx_runtime.jsx)(Text,{color:theme.text.secondary,children:currentLineGhost})]})},`line-${visualIdxInRenderedSet}`)}).concat(additionalLines.map((ghostLine,index)=>{let padding=Math.max(0,inputWidth-stringWidth(ghostLine));return(0,import_jsx_runtime.jsxs)(Text,{color:theme.text.secondary,children:[ghostLine,` `.repeat(padding)]},`ghost-line-${index}`)}))})]}),completion.showSuggestions&&(0,import_jsx_runtime.jsx)(Box_default,{paddingRight:2,children:(0,import_jsx_runtime.jsx)(SuggestionsDisplay,{suggestions:completion.suggestions,activeIndex:completion.activeSuggestionIndex,isLoading:completion.isLoadingSuggestions,width:suggestionsWidth,scrollOffset:completion.visibleStartIndex,userInput:buffer$2.text})}),reverseSearchActive&&(0,import_jsx_runtime.jsx)(Box_default,{paddingRight:2,children:(0,import_jsx_runtime.jsx)(SuggestionsDisplay,{suggestions:reverseSearchCompletion.suggestions,activeIndex:reverseSearchCompletion.activeSuggestionIndex,isLoading:reverseSearchCompletion.isLoadingSuggestions,width:suggestionsWidth,scrollOffset:reverseSearchCompletion.visibleStartIndex,userInput:buffer$2.text})})]})};function createMinimalConfig(){return new Config({sessionId:`blink`,targetDir:process.cwd(),cwd:process.cwd(),debugMode:!1,model:`gemini-1.5-flash`,telemetry:{enabled:!1}})}function TextInput({onSubmit,placeholder,slashCommands}){let config$1=(0,import_react.useMemo)(()=>createMinimalConfig(),[]),[userMessages,setUserMessages]=(0,import_react.useState)([]),{stdout:stdout$1}=use_stdout_default(),buffer$2=useTextBuffer({viewport:{width:stdout$1.columns,height:Math.min(stdout$1.rows,15)},isValidPath:filePath=>fs$2.existsSync(filePath)}),commands=(0,import_react.useMemo)(()=>slashCommands?.map(s$3=>s$3.name)??[],[slashCommands]);return(0,import_jsx_runtime.jsx)(KeypressProvider,{kittyProtocolEnabled:!0,config:config$1,children:(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,children:(0,import_jsx_runtime.jsx)(InputPrompt,{buffer:buffer$2,onSubmit:value=>{let args=value.trim().split(` `),first$1=args[0];if(first$1&&first$1.startsWith(`/`)){let command=commands.findIndex(c$3=>c$3===first$1.slice(1));if(command!==-1)return slashCommands?.[command]?.action(args.slice(1).join(` `))}setUserMessages(prev=>[value,...prev]),onSubmit(value)},placeholder,userMessages,onClearScreen:()=>{},config:config$1,slashCommands:slashCommands?.map(cmd=>({name:cmd.name,altNames:cmd.altNames,description:cmd.description,kind:`built-in`,completion:async(context$1,partialArg)=>cmd.completion?.(partialArg)??[]}))??[],commandContext:{services:{config:config$1,settings:{},git:void 0,logger:console},ui:{addItem:()=>{},clear:()=>{},setDebugMessage:()=>{},pendingItem:null,setPendingItem:()=>{},loadHistory:()=>{},toggleCorgiMode:()=>{},toggleVimEnabled:async()=>!1,setGeminiMdFileCount:()=>{},reloadCommands:()=>{}},session:{stats:{},sessionShellAllowlist:new Set}},inputWidth:stdout$1.columns,suggestionsWidth:stdout$1.columns,shellModeActive:!1,setShellModeActive:()=>{}})})})}var text_input_default=TextInput;const schemaServeInfo=z.object({host:z.string(),port:z.number(),supportsRequests:z.boolean()});async function serve(entrypoint){let entrypointPath=resolve(entrypoint),agent=requireAsCommonJS(entrypointPath),handler=createHTTPHandler(agent),host=process.env.HOST||`127.0.0.1`,port$1=process.env.PORT?parseInt(process.env.PORT):3e3,server=createServer(handler);server.listen(port$1,host,()=>{let readyLog={host,port:port$1,supportsRequests:agent.supportsRequests??!1};console.log(JSON.stringify(readyLog))}).on(`error`,error$22=>{console.error(error$22),process.exit(1)})}async function createServeClient(options$1){let executable=process.argv[0];if(!executable)throw Error(`Executable not found`);let entrypoint=process.argv[1];if(!entrypoint)throw Error(`Entrypoint not found`);entrypoint.endsWith(`.ts`)&&(entrypoint=join$1(import.meta.dirname,`index.ts`));let port$1=options$1.port;port$1||=await getRandomPort();let host=options$1.host;host||=`127.0.0.1`;let result=spawn$1(executable,[entrypoint,`serve`,options$1.entrypoint],{stdio:`pipe`,env:{...process.env,...options$1.env,BLINK_API_SERVER_URL:options$1.apiServerUrl,PORT:port$1.toString(),HOST:host}}),resolveReady,rejectReady,readyPromise=new Promise((resolve$10,reject)=>{resolveReady=resolve$10,rejectReady=reject});result.stdout.on(`data`,data$2=>{let log$5=Buffer.from(data$2).toString().trim();try{let readyLog=schemaServeInfo.parse(JSON.parse(log$5));resolveReady(readyLog);return}catch{}options$1.onStdout?.(Buffer.from(data$2).toString())}),result.stderr.on(`data`,data$2=>{options$1.onStderr?.(Buffer.from(data$2).toString())}),result.on(`error`,error$22=>{onError$3.emit(error$22),rejectReady(error$22)}),result.on(`exit`,code$1=>{onExit$1.emit(code$1),rejectReady(Error(`Server exited with code ${code$1}`))}),result.on(`close`,code$1=>{onExit$1.emit(code$1)});let onExit$1=new Emitter,onError$3=new Emitter,serveInfo=await readyPromise;return{info:serveInfo,onError:onError$3.event,onExit:onExit$1.event,url:`http://${host}:${port$1}`,dispose:()=>{result.kill()},[Symbol.dispose](){result.kill()}}}async function getRandomPort(){let server=createServer();return new Promise((resolve$10,reject)=>{server.listen(0,()=>{let port$1=server.address().port;resolve$10(port$1)}).on(`error`,err$2=>{reject(err$2)})}).finally(()=>{server.close()})}function useBundler(entrypoint){let[errors$1,setErrors]=(0,import_react.useState)([]),[status,setStatus]=(0,import_react.useState)(`building`),[lastBuildDuration,setLastBuildDuration]=(0,import_react.useState)(void 0),[bundle,setBundle]=(0,import_react.useState)(void 0);return(0,import_react.useEffect)(()=>{let lastBuildStart=0;watch$1(entrypoint,{onErrors:errors$2=>{setErrors(errors$2)},onBuildStart:()=>{setBundle(void 0),setStatus(`building`),setErrors([]),lastBuildStart=Date.now()},onBuildEnd:({outfile})=>{setStatus(`success`);let duration=Date.now()-lastBuildStart;setLastBuildDuration(duration),setBundle({entrypoint,outfile})}}).then(d$5=>{}).catch(error$22=>{setStatus(`error`),setBundle(void 0),setErrors([{id:`error`,pluginName:`bundler`,text:error$22.message,location:null,notes:[],detail:error$22}])})},[entrypoint]),(0,import_react.useMemo)(()=>({errors:errors$1,status,lastBuildDuration,bundle}),[errors$1,status,lastBuildDuration,bundle])}function useAgent(options$1){let[agent,setAgent]=(0,import_react.useState)(void 0),[logs$1,setLogs]=(0,import_react.useState)([]),[error$22,setError]=(0,import_react.useState)(void 0),[bundle,setBundle]=(0,import_react.useState)(options$1.bundle),[env$8,setEnv]=(0,import_react.useState)(options$1.env),[apiServerUrl,setApiServerUrl]=(0,import_react.useState)(options$1.apiServerUrl),[supportsRequests,setSupportsRequests]=(0,import_react.useState)(!1);return(0,import_react.useEffect)(()=>{setEnv(options$1.env),setBundle(options$1.bundle),setApiServerUrl(options$1.apiServerUrl)},[options$1.env,options$1.bundle,options$1.apiServerUrl]),(0,import_react.useEffect)(()=>{if(!bundle){setAgent(void 0),setLogs([]),setError(void 0);return}let disposed=!1,serveClient;return createServeClient({entrypoint:bundle.outfile,apiServerUrl,env:env$8,onStdout:data$2=>{setLogs(prev=>[...prev,{level:`log`,message:data$2}])},onStderr:data$2=>{setLogs(prev=>[...prev,{level:`error`,message:data$2}])}}).then(client=>{if(disposed){client.dispose();return}serveClient=client,setSupportsRequests(client.info.supportsRequests),setAgent(createAgentClient(client.url))}).catch(error$23=>{setError(error$23)}),()=>{disposed=!0,serveClient&&serveClient.dispose()}},[bundle,env$8]),(0,import_react.useMemo)(()=>({agent,logs:logs$1,error:error$22,supportsRequests}),[agent,logs$1,error$22,supportsRequests])}function useDevhook(options$1){let onRequestRef=(0,import_react.useRef)(options$1.onRequest);(0,import_react.useEffect)(()=>{onRequestRef.current=options$1.onRequest},[options$1.onRequest]);let id=(0,import_react.useRef)(options$1.id??crypto.randomUUID()),[status,setStatus]=(0,import_react.useState)(`disconnected`);return(0,import_react.useEffect)(()=>{if(options$1.disabled){setStatus(`disconnected`);return}let client=new Client,listener=client.devhook.listen({id:id.current,onRequest:async request$3=>options$1.onRequest(request$3),onConnect:()=>{setStatus(`connected`)},onDisconnect:()=>{setStatus(`disconnected`)},onError:error$22=>{setStatus(`error`)}});return()=>{listener.dispose()}},[options$1.disabled]),{id:id.current,status}}var require_package=__commonJSMin(((exports,module)=>{module.exports={name:`dotenv`,version:`16.4.7`,description:`Loads environment variables from .env file`,main:`lib/main.js`,types:`lib/main.d.ts`,exports:{".":{types:`./lib/main.d.ts`,require:`./lib/main.js`,default:`./lib/main.js`},"./config":`./config.js`,"./config.js":`./config.js`,"./lib/env-options":`./lib/env-options.js`,"./lib/env-options.js":`./lib/env-options.js`,"./lib/cli-options":`./lib/cli-options.js`,"./lib/cli-options.js":`./lib/cli-options.js`,"./package.json":`./package.json`},scripts:{"dts-check":`tsc --project tests/types/tsconfig.json`,lint:`standard`,pretest:`npm run lint && npm run dts-check`,test:`tap run --allow-empty-coverage --disable-coverage --timeout=60000`,"test:coverage":`tap run --show-full-coverage --timeout=60000 --coverage-report=lcov`,prerelease:`npm test`,release:`standard-version`},repository:{type:`git`,url:`git://github.com/motdotla/dotenv.git`},funding:`https://dotenvx.com`,keywords:[`dotenv`,`env`,`.env`,`environment`,`variables`,`config`,`settings`],readmeFilename:`README.md`,license:`BSD-2-Clause`,devDependencies:{"@types/node":`^18.11.3`,decache:`^4.6.2`,sinon:`^14.0.1`,standard:`^17.0.0`,"standard-version":`^9.5.0`,tap:`^19.2.0`,typescript:`^4.8.4`},engines:{node:`>=12`},browser:{fs:!1}}})),require_main=__commonJSMin(((exports,module)=>{let fs$3=__require$3(`fs`),path$2=__require$3(`path`),os$2=__require$3(`os`),crypto$3=__require$3(`crypto`),packageJson=require_package(),version$1=packageJson.version,LINE=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/gm;function parse$2(src){let obj={},lines=src.toString();lines=lines.replace(/\r\n?/gm,`
|
|
2048
2048
|
`);let match$1;for(;(match$1=LINE.exec(lines))!=null;){let key=match$1[1],value=match$1[2]||``;value=value.trim();let maybeQuote=value[0];value=value.replace(/^(['"`])([\s\S]*)\1$/gm,`$2`),maybeQuote===`"`&&(value=value.replace(/\\n/g,`
|
|
2049
|
-
`),value=value.replace(/\\r/g,`\r`)),obj[key]=value}return obj}function _parseVault(options$1){let vaultPath=_vaultPath(options$1),result=DotenvModule.configDotenv({path:vaultPath});if(!result.parsed){let err$2=Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`);throw err$2.code=`MISSING_DATA`,err$2}let keys=_dotenvKey(options$1).split(`,`),length=keys.length,decrypted;for(let i$7=0;i$7<length;i$7++)try{let key=keys[i$7].trim(),attrs=_instructions(result,key);decrypted=DotenvModule.decrypt(attrs.ciphertext,attrs.key);break}catch(error$22){if(i$7+1>=length)throw error$22}return DotenvModule.parse(decrypted)}function _log(message){console.log(`[dotenv@${version$1}][INFO] ${message}`)}function _warn(message){console.log(`[dotenv@${version$1}][WARN] ${message}`)}function _debug(message){console.log(`[dotenv@${version$1}][DEBUG] ${message}`)}function _dotenvKey(options$1){return options$1&&options$1.DOTENV_KEY&&options$1.DOTENV_KEY.length>0?options$1.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:``}function _instructions(result,dotenvKey){let uri$3;try{uri$3=new URL(dotenvKey)}catch(error$22){if(error$22.code===`ERR_INVALID_URL`){let err$2=Error(`INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development`);throw err$2.code=`INVALID_DOTENV_KEY`,err$2}throw error$22}let key=uri$3.password;if(!key){let err$2=Error(`INVALID_DOTENV_KEY: Missing key part`);throw err$2.code=`INVALID_DOTENV_KEY`,err$2}let environment=uri$3.searchParams.get(`environment`);if(!environment){let err$2=Error(`INVALID_DOTENV_KEY: Missing environment part`);throw err$2.code=`INVALID_DOTENV_KEY`,err$2}let environmentKey=`DOTENV_VAULT_${environment.toUpperCase()}`,ciphertext=result.parsed[environmentKey];if(!ciphertext){let err$2=Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`);throw err$2.code=`NOT_FOUND_DOTENV_ENVIRONMENT`,err$2}return{ciphertext,key}}function _vaultPath(options$1){let possibleVaultPath=null;if(options$1&&options$1.path&&options$1.path.length>0)if(Array.isArray(options$1.path))for(let filepath of options$1.path)fs$3.existsSync(filepath)&&(possibleVaultPath=filepath.endsWith(`.vault`)?filepath:`${filepath}.vault`);else possibleVaultPath=options$1.path.endsWith(`.vault`)?options$1.path:`${options$1.path}.vault`;else possibleVaultPath=path$2.resolve(process.cwd(),`.env.vault`);return fs$3.existsSync(possibleVaultPath)?possibleVaultPath:null}function _resolveHome(envPath){return envPath[0]===`~`?path$2.join(os$2.homedir(),envPath.slice(1)):envPath}function _configVault(options$1){_log(`Loading env from encrypted .env.vault`);let parsed=DotenvModule._parseVault(options$1),processEnv=process.env;return options$1&&options$1.processEnv!=null&&(processEnv=options$1.processEnv),DotenvModule.populate(processEnv,parsed,options$1),{parsed}}function configDotenv(options$1){let dotenvPath=path$2.resolve(process.cwd(),`.env`),encoding=`utf8`,debug$12=!!(options$1&&options$1.debug);options$1&&options$1.encoding?encoding=options$1.encoding:debug$12&&_debug(`No encoding is specified. UTF-8 is used by default`);let optionPaths=[dotenvPath];if(options$1&&options$1.path)if(!Array.isArray(options$1.path))optionPaths=[_resolveHome(options$1.path)];else{optionPaths=[];for(let filepath of options$1.path)optionPaths.push(_resolveHome(filepath))}let lastError,parsedAll={};for(let path$38 of optionPaths)try{let parsed=DotenvModule.parse(fs$3.readFileSync(path$38,{encoding}));DotenvModule.populate(parsedAll,parsed,options$1)}catch(e$3){debug$12&&_debug(`Failed to load ${path$38} ${e$3.message}`),lastError=e$3}let processEnv=process.env;return options$1&&options$1.processEnv!=null&&(processEnv=options$1.processEnv),DotenvModule.populate(processEnv,parsedAll,options$1),lastError?{parsed:parsedAll,error:lastError}:{parsed:parsedAll}}function config(options$1){if(_dotenvKey(options$1).length===0)return DotenvModule.configDotenv(options$1);let vaultPath=_vaultPath(options$1);return vaultPath?DotenvModule._configVault(options$1):(_warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`),DotenvModule.configDotenv(options$1))}function decrypt(encrypted,keyStr){let key=Buffer.from(keyStr.slice(-64),`hex`),ciphertext=Buffer.from(encrypted,`base64`),nonce=ciphertext.subarray(0,12),authTag=ciphertext.subarray(-16);ciphertext=ciphertext.subarray(12,-16);try{let aesgcm=crypto$3.createDecipheriv(`aes-256-gcm`,key,nonce);return aesgcm.setAuthTag(authTag),`${aesgcm.update(ciphertext)}${aesgcm.final()}`}catch(error$22){let isRange=error$22 instanceof RangeError,invalidKeyLength=error$22.message===`Invalid key length`,decryptionFailed=error$22.message===`Unsupported state or unable to authenticate data`;if(isRange||invalidKeyLength){let err$2=Error(`INVALID_DOTENV_KEY: It must be 64 characters long (or more)`);throw err$2.code=`INVALID_DOTENV_KEY`,err$2}else if(decryptionFailed){let err$2=Error(`DECRYPTION_FAILED: Please check your DOTENV_KEY`);throw err$2.code=`DECRYPTION_FAILED`,err$2}else throw error$22}}function populate(processEnv,parsed,options$1={}){let debug$12=!!(options$1&&options$1.debug),override=!!(options$1&&options$1.override);if(typeof parsed!=`object`){let err$2=Error(`OBJECT_REQUIRED: Please check the processEnv argument being passed to populate`);throw err$2.code=`OBJECT_REQUIRED`,err$2}for(let key of Object.keys(parsed))Object.prototype.hasOwnProperty.call(processEnv,key)?(override===!0&&(processEnv[key]=parsed[key]),debug$12&&_debug(override===!0?`"${key}" is already defined and WAS overwritten`:`"${key}" is already defined and was NOT overwritten`)):processEnv[key]=parsed[key]}let DotenvModule={configDotenv,_configVault,_parseVault,config,decrypt,parse:parse$2,populate};module.exports.configDotenv=DotenvModule.configDotenv,module.exports._configVault=DotenvModule._configVault,module.exports._parseVault=DotenvModule._parseVault,module.exports.config=DotenvModule.config,module.exports.decrypt=DotenvModule.decrypt,module.exports.parse=DotenvModule.parse,module.exports.populate=DotenvModule.populate,module.exports=DotenvModule})),import_main$1=__toESM$2(require_main(),1);function useDotenv(directory,name$5=`.env.local`){let[env$8,setEnv]=(0,import_react.useState)({});return(0,import_react.useEffect)(()=>{let watcher,readEnvFile=path$38=>{try{setEnv((0,import_main$1.parse)(readFileSync$1(path$38,`utf-8`)))}catch(error$22){console.error(error$22),setEnv({})}};return findNearestEntry(directory,name$5).then(nearest=>{if(!nearest){setEnv({});return}readEnvFile(nearest),watcher=watch(nearest,{persistent:!1},()=>{readEnvFile(nearest)})}),()=>{watcher&&watcher.close()}},[directory,name$5]),env$8}function useServerChat(server,id){let[chat$2,setChat]=(0,import_react.useState)(()=>server.upsertChat(id));return(0,import_react.useEffect)(()=>{setChat(server.upsertChat(id));let disposable=server.onChatChanged(chat$3=>{if(chat$3.id===id)return setChat(chat$3)});return()=>disposable.dispose()},[server,id]),chat$2}function useTerminalSize(){let{stdout:stdout$1}=use_stdout_default(),[size,setSize]=(0,import_react.useState)({columns:process.stdout.columns,rows:process.stdout.rows});return(0,import_react.useEffect)(()=>{if(!stdout$1||!stdout$1.isTTY)return;let handleResize=()=>{setSize({columns:stdout$1.columns,rows:stdout$1.rows})};return process.stdout.on(`resize`,handleResize),()=>{process.stdout.off(`resize`,handleResize)}},[stdout$1]),{columns:size.columns,rows:size.rows?size.rows-1:void 0}}async function start(element){let instance$1=render_default(element,{exitOnCtrlC:!1});await instance$1.waitUntilExit().finally(()=>{})}function startDev({entrypoint}){return start((0,import_jsx_runtime.jsx)(Root,{entrypoint}))}const Root=({entrypoint})=>{let size=useTerminalSize(),{errors:compileErrors,status:bundlerStatus,lastBuildDuration,bundle}=useBundler(entrypoint),dotenv=useDotenv(dirname$1(entrypoint)),env$8=(0,import_react.useMemo)(()=>{let blinkToken=getAuthToken();return blinkToken?{...dotenv,BLINK_TOKEN:blinkToken}:dotenv},[dotenv]),server=(0,import_react.useMemo)(()=>createServer$1({port:0,dataDirectory:join$1(dirname$1(entrypoint),`.blink`,`data`),sendMessages:async(request$3,signal)=>{if(!currentAgentRef.current)throw Error(`No agent`);if(!currentChatIDRef.current)throw Error(`No chat`);return await currentAgentRef.current.sendMessages({messages:request$3.messages.filter(m$3=>m$3.metadata?.ephemeral!==!0),chat:{id:currentChatIDRef.current}},{signal})},serializeChat:chat$3=>({...chat$3,messages:chat$3.messages.filter(m$3=>m$3.metadata?.ephemeral!==!0)}),shouldLoop:({messages:messages$1})=>{let lastMessage=messages$1.at(-1);if(!lastMessage||lastMessage.role!==`assistant`)return!1;let lastStepStartIndex=lastMessage.parts.reduce((lastIndex,part,index)=>part.type===`step-start`?index:lastIndex,-1),lastStepToolInvocations=lastMessage.parts.slice(lastStepStartIndex+1).filter(isToolOrDynamicToolUIPart);return lastStepToolInvocations.length>0&&lastStepToolInvocations.every(part=>part.state.startsWith(`output-`))}}),[]),{agent,logs:logs$1,error:agentError,supportsRequests}=useAgent({bundle,env:env$8,apiServerUrl:server.url}),currentAgentRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{agent?currentAgentRef.current=agent:server.stopChat(chat$2.id)},[agent]);let devhookID=(0,import_react.useMemo)(()=>{let storagePath=join$1(dirname$1(entrypoint),`.blink`,`devhook.txt`);if(mkdirSync(dirname$1(storagePath),{recursive:!0}),existsSync$1(storagePath))return readFileSync$1(storagePath,`utf-8`);let id=crypto.randomUUID();return writeFileSync$1(storagePath,id),id},[]),devhook=useDevhook({id:devhookID,disabled:!supportsRequests,onRequest:async request$3=>{if(!currentAgentRef.current)throw Error(`No agent`);let response=await currentAgentRef.current.sendRequest(request$3);return server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`webhook`,ephemeral:!0},parts:[{type:`text`,text:`method=${request$3.method} status=${response.status}`}]}),response}}),[chatID,setChatID]=(0,import_react.useState)(`default`),currentChatIDRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{currentChatIDRef.current=chatID},[chatID]);let chat$2=useServerChat(server,chatID),[chatIDs,setChatIDs]=(0,import_react.useState)(()=>server.listChats()),currentChatIDsRef=(0,import_react.useRef)(chatIDs);(0,import_react.useEffect)(()=>{currentChatIDsRef.current=chatIDs},[chatIDs]),(0,import_react.useEffect)(()=>{let disposable=server.onChatChanged(chat$3=>{!currentChatIDsRef.current.includes(chat$3.id)&¤tChatIDRef.current&&(setChatID(chat$3.id),server.upsertChatMessage(chat$3.id,{role:`assistant`,metadata:{type:`chat-created`,ephemeral:!0},parts:[{type:`text`,text:`This chat has just been created: ${chat$3.id}. We automatically switched you to it!`}]})),setChatIDs(prev=>{let newChats=[...prev];return newChats.includes(chat$3.id)?prev:(newChats.push(chat$3.id),newChats)})});return()=>{disposable.dispose()}},[server]);let{exit}=use_app_default(),[exitArmed,setExitArmed]=(0,import_react.useState)(!1),exitTimerRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>()=>{exitTimerRef.current&&clearTimeout(exitTimerRef.current)},[]),use_input_default((input,key)=>{if(key.ctrl&&input.toLowerCase()===`c`){if(exitArmed){exit();return}setExitArmed(!0),exitTimerRef.current&&clearTimeout(exitTimerRef.current),exitTimerRef.current=setTimeout(()=>setExitArmed(!1),2e3)}}),(0,import_react.useEffect)(()=>{if(compileErrors.length>0||agentError||chat$2.error){let errors$1=[];for(let error$22 of compileErrors)errors$1.push({type:`text`,text:`${error$22.text} (${error$22.location?.file})`});agentError&&errors$1.push({type:`text`,text:agentError.message}),chat$2.error&&errors$1.push({type:`text`,text:`Chat error: ${chat$2.error.message}, ${chat$2.error.stack}`}),server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`error`,ephemeral:!0},parts:errors$1});return}if(bundlerStatus===`building`||!agent){server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:`Compiling...`}]});return}if(bundlerStatus===`success`&&agent){server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`success`,ephemeral:!0},parts:[{type:`text`,text:`Compiled in 100ms`}]});return}},[compileErrors,chat$2.error,agentError,bundlerStatus,agent]);let lastReportedKeys=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{let keys=Object.keys(env$8);if(keys.length===lastReportedKeys.current||lastReportedKeys.current===void 0)return;lastReportedKeys.current=keys.length;let keysText=keys.map(key=>source_default.dim(key)).join(`, `);keysText.length===0&&(keysText=source_default.dim(`(none)`));let text$1=`Loaded .env.local: `+keysText;server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:text$1}]})},[env$8]),(0,import_react.useEffect)(()=>{!supportsRequests||devhook.status!==`connected`||server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:`Send webhooks from anywhere: https://blink.so/api/devhook/${devhook.id}`}]})},[supportsRequests,devhook.status]);let lastLogsLength=(0,import_react.useRef)(0);(0,import_react.useEffect)(()=>{if(logs$1.length===lastLogsLength.current)return;let currentLength=lastLogsLength.current;for(let log$5 of logs$1.slice(currentLength))server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`runtime-log`,level:log$5.level,ephemeral:!0},parts:[{type:`text`,text:log$5.message}]});lastLogsLength.current=logs$1.length},[logs$1]);let keymaps=(0,import_react.useMemo)(()=>({"⏎":`send`,"Ctrl+R":`reset chat`,"Ctrl+C":`quit`,"[Escape]":`stop streaming`}),[]),keybindSuggestion=(0,import_react.useMemo)(()=>{if(exitArmed)return`Ctrl+C again to quit`;if(chat$2.status===`streaming`)return`Press [Escape] to stop the agent!`},[exitArmed,chat$2.status]),newChatNames=(0,import_react.useMemo)(()=>{let names$1=[];for(;names$1.length<3;){let name$5=(0,import_dist.uniqueNamesGenerator)({dictionaries:[import_dist.adjectives,import_dist.animals],style:`lowerCase`});chatIDs.includes(name$5)||names$1.push(name$5)}return names$1},[chatID,chatIDs]);return(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Keybinds,{resetChat:()=>{server.resetChat(chat$2.id)},stopStreaming:()=>{server.stopChat(chat$2.id)}}),(0,import_jsx_runtime.jsxs)(Box_default,{children:[(0,import_jsx_runtime.jsx)(Text,{bold:!0,children:`blink■`}),(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:` agent development mode`})]}),(0,import_jsx_runtime.jsxs)(Box_default,{marginTop:1,flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Edit `,entrypoint,` to hot-reload your agent.`]}),(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Run `,(0,import_jsx_runtime.jsx)(Text,{color:`blue`,children:`blink deploy`}),` to use your agent in the cloud.`]})]}),chat$2.error?(0,import_jsx_runtime.jsx)(Box_default,{marginTop:1,children:(0,import_jsx_runtime.jsx)(Text,{color:`red`,children:chat$2.error.message})}):null,(0,import_jsx_runtime.jsx)(Messages,{messages:[...chat$2.messages],streamingMessage:chat$2.streamingMessage,maxWidth:size.columns-2,status:chat$2.status}),(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,marginTop:1,children:(0,import_jsx_runtime.jsx)(text_input_default,{slashCommands:[{name:`reset`,altNames:[`clear`],description:`Reset the chat`,action:()=>{server.resetChat(chat$2.id)}},{name:`switch`,description:`Switch to a different chat`,action:args=>{setChatID(args)},completion:async partialArg=>{let chats=server.listChats();return chats.map(chat$3=>chat$3)}},{name:`new`,description:`Create a new chat`,action:args=>{setChatID(args)},completion:async partialArg=>newChatNames}],onSubmit:value=>(server.runtime.chat.sendMessages(chat$2.id,{messages:[{role:`user`,parts:[{type:`text`,text:value}]}],behavior:`interrupt`}),!0)})}),(0,import_jsx_runtime.jsx)(Box_default,{children:keybindSuggestion?(0,import_jsx_runtime.jsx)(Text,{color:`yellow`,children:` `+keybindSuggestion}):(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Box_default,{marginLeft:2,children:(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`chat: `,(0,import_jsx_runtime.jsx)(Text,{children:chat$2.id})]})}),(0,import_jsx_runtime.jsx)(Spacer,{}),(0,import_jsx_runtime.jsx)(Box_default,{gap:3,marginRight:2,children:Object.entries(keymaps).map(([key,value])=>(0,import_jsx_runtime.jsx)(Text,{children:source_default.gray.dim(key+` `+value)},key))})]})})]})},Keybinds=({resetChat,stopStreaming})=>(use_input_default((input,key)=>{key.ctrl&&input===`r`&&resetChat(),key.escape&&stopStreaming()}),null),Messages=({messages:messages$1,maxWidth,streamingMessage,status})=>(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[messages$1.map((message,index)=>(0,import_jsx_runtime.jsx)(Message,{message,previousMessage:index>0?messages$1.at(index-1):void 0,nextMessage:index<messages$1.length-1?messages$1.at(index+1):void 0,maxWidth},message.id)),streamingMessage?(0,import_jsx_runtime.jsx)(Message,{message:streamingMessage,nextMessage:void 0,previousMessage:messages$1.length>0?messages$1.at(messages$1.length-1):void 0,streaming:!0,maxWidth},streamingMessage.id):null,status===`streaming`&&!streamingMessage?(0,import_jsx_runtime.jsx)(AssistantWaitingPlaceholder,{maxWidth}):null]}),MessageComponent=({message,previousMessage,maxWidth,streaming})=>{let prefix,contentColor,marginTop=1;switch(message.role){case`system`:prefix=(0,import_jsx_runtime.jsx)(Text,{children:`t `}),contentColor=`gray`;break;case`user`:prefix=(0,import_jsx_runtime.jsx)(Text,{color:`magenta`,bold:!0,children:`▎`}),contentColor=`gray`;break;case`assistant`:prefix=(0,import_jsx_runtime.jsx)(Text,{color:`white`,children:`> `}),contentColor=`white`;break}if(message.metadata?.type===`build-log`){let color=`gray`;switch(message.metadata.level){case`success`:color=`green`;break;case`info`:color=`gray`;break;case`error`:color=`red`;break}prefix=(0,import_jsx_runtime.jsx)(Text,{color,children:`⚙ `}),contentColor=`gray`,previousMessage?.metadata?.type===`build-log`&&(marginTop=0)}message.metadata?.type===`webhook`&&(prefix=(0,import_jsx_runtime.jsx)(Text,{color:`blue`,children:`↩ `}),contentColor=`gray`,previousMessage?.metadata?.type===`webhook`&&(marginTop=0));let content=(0,import_jsx_runtime.jsx)(Box_default,{gap:1,flexDirection:`column`,width:maxWidth,children:message.parts.map((part,index)=>{if(part.type===`text`)return(0,import_jsx_runtime.jsx)(markdown_default,{id:message.id,maxWidth,children:part.text},index);if(part.type===`reasoning`)return(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Reasoning: `,part.text]},index);if(isToolOrDynamicToolUIPart(part))return(0,import_jsx_runtime.jsx)(ToolCall,{part,maxWidth,streaming},index)}).filter(Boolean)});return(0,import_jsx_runtime.jsxs)(Box_default,{marginTop,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsx)(Text,{color:contentColor,children:prefix})}),content]})},Message=import_react.memo(MessageComponent,(prev,next)=>prev.maxWidth===next.maxWidth?!!(prev.nextMessage&&next.nextMessage&&prev.nextMessage.id===next.nextMessage.id):!1),AssistantWaitingPlaceholder=({maxWidth})=>(0,import_jsx_runtime.jsxs)(Box_default,{marginTop:1,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsx)(Text,{color:`white`,children:null})}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth,children:(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[(0,import_jsx_runtime.jsx)(build_default,{}),` Waiting for response...`]})})]}),ToolCall=({part,maxWidth,streaming})=>{let name$5=getToolOrDynamicToolName(part),input=(0,import_react.useMemo)(()=>{let labels={};return typeof part.input!=`object`||part.input===null||Object.entries(part.input).forEach(([key,value])=>{labels[key]=JSON.stringify(value)}),labels},[part]),output=(0,import_react.useMemo)(()=>{if(!part.output)return;if(typeof part.output==`string`)return part.output;let labels={};return Array.isArray(part.output)?part.output.forEach((item,index)=>{labels[`${index}`]=JSON.stringify(item)}):typeof part.output==`object`&&Object.entries(part.output).forEach(([key,value])=>{labels[key]=JSON.stringify(value)}),labels},[part]),state=(0,import_react.useMemo)(()=>{switch(part.state){case`input-available`:case`input-streaming`:return streaming?`streaming`:`error`;case`output-available`:return`done`;case`output-error`:return`error`}},[part,streaming]),error$22=(0,import_react.useMemo)(()=>{if(part.state===`output-error`)return part.errorText},[part]);return(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Box_default,{gap:1,children:[(0,import_jsx_runtime.jsx)(Text,{color:state===`error`?`red`:`gray`,bold:!0,children:state===`done`||state===`error`?`⚒`:(0,import_jsx_runtime.jsx)(build_default,{type:`dots`})}),(0,import_jsx_runtime.jsx)(Text,{children:name$5})]}),(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,flexDirection:`column`,overflowX:`hidden`,width:maxWidth?maxWidth-4:void 0,gap:0,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Input:`}),Object.entries(input).map(([key,value])=>(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:key}),(0,import_jsx_runtime.jsx)(Text,{color:`blackBright`,children:`=`}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth?maxWidth-6-1-2-key.length:void 0,children:(0,import_jsx_runtime.jsx)(Text,{wrap:`truncate-middle`,children:value})})]},key)),output&&(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Output:`}),typeof output==`string`?(0,import_jsx_runtime.jsx)(Box_default,{marginLeft:2,children:(0,import_jsx_runtime.jsx)(Text,{children:output})}):(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,children:Object.entries(output).map(([key,value])=>(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:key}),(0,import_jsx_runtime.jsx)(Text,{color:`blackBright`,children:`=`}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth?maxWidth-6-1-key.length:void 0,children:(0,import_jsx_runtime.jsx)(Text,{wrap:`truncate-middle`,children:value})})]},key))})]}),error$22&&(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Error:`}),(0,import_jsx_runtime.jsx)(Text,{color:`red`,children:error$22})]})]})]})};async function dev(directory){directory||=process.cwd();let entrypoint=await resolveEntrypoint(directory),exitWithDump=error$22=>{writeFileSync$1(`error.dump`,inspect$1(error$22,{depth:null})),process.exit(1)};process.addListener(`uncaughtException`,error$22=>{exitWithDump(error$22)}),process.addListener(`unhandledRejection`,error$22=>{exitWithDump(error$22)}),await startDev({entrypoint}),process.exit(0)}async function init(directory){directory||=process.cwd(),Ie(`Initializing a new Blink Agent`),(await readdir(directory)).length>0&&(xe("You must be in an empty directory to run `blink init`."),process.exit(1));let name$5=basename$1(directory).replace(/[^a-zA-Z0-9]/g,`-`),packageManager;if(process.env.npm_config_user_agent?.includes(`bun/`)?packageManager=`bun`:process.env.npm_config_user_agent?.includes(`pnpm/`)?packageManager=`pnpm`:process.env.npm_config_user_agent?.includes(`yarn/`)?packageManager=`yarn`:process.env.npm_config_user_agent?.includes(`npm/`)&&(packageManager=`npm`),!packageManager){let pm$1=await ve({options:[{label:`Bun`,value:`bun`},{label:`NPM`,value:`npm`},{label:`PNPM`,value:`pnpm`},{label:`Yarn`,value:`yarn`}],message:`What package manager do you want to use?`});pD(pm$1)&&process.exit(0),packageManager=pm$1}M.info(`Using ${packageManager} as the package manager.`);let files={"package.json":JSON.stringify({name:name$5,main:`agent.ts`,type:`module`,private:!0}),"agent.ts":`import { convertToModelMessages, streamText, tool } from "ai";
|
|
2049
|
+
`),value=value.replace(/\\r/g,`\r`)),obj[key]=value}return obj}function _parseVault(options$1){let vaultPath=_vaultPath(options$1),result=DotenvModule.configDotenv({path:vaultPath});if(!result.parsed){let err$2=Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`);throw err$2.code=`MISSING_DATA`,err$2}let keys=_dotenvKey(options$1).split(`,`),length=keys.length,decrypted;for(let i$7=0;i$7<length;i$7++)try{let key=keys[i$7].trim(),attrs=_instructions(result,key);decrypted=DotenvModule.decrypt(attrs.ciphertext,attrs.key);break}catch(error$22){if(i$7+1>=length)throw error$22}return DotenvModule.parse(decrypted)}function _log(message){console.log(`[dotenv@${version$1}][INFO] ${message}`)}function _warn(message){console.log(`[dotenv@${version$1}][WARN] ${message}`)}function _debug(message){console.log(`[dotenv@${version$1}][DEBUG] ${message}`)}function _dotenvKey(options$1){return options$1&&options$1.DOTENV_KEY&&options$1.DOTENV_KEY.length>0?options$1.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:``}function _instructions(result,dotenvKey){let uri$3;try{uri$3=new URL(dotenvKey)}catch(error$22){if(error$22.code===`ERR_INVALID_URL`){let err$2=Error(`INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenvx.com/vault/.env.vault?environment=development`);throw err$2.code=`INVALID_DOTENV_KEY`,err$2}throw error$22}let key=uri$3.password;if(!key){let err$2=Error(`INVALID_DOTENV_KEY: Missing key part`);throw err$2.code=`INVALID_DOTENV_KEY`,err$2}let environment=uri$3.searchParams.get(`environment`);if(!environment){let err$2=Error(`INVALID_DOTENV_KEY: Missing environment part`);throw err$2.code=`INVALID_DOTENV_KEY`,err$2}let environmentKey=`DOTENV_VAULT_${environment.toUpperCase()}`,ciphertext=result.parsed[environmentKey];if(!ciphertext){let err$2=Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`);throw err$2.code=`NOT_FOUND_DOTENV_ENVIRONMENT`,err$2}return{ciphertext,key}}function _vaultPath(options$1){let possibleVaultPath=null;if(options$1&&options$1.path&&options$1.path.length>0)if(Array.isArray(options$1.path))for(let filepath of options$1.path)fs$3.existsSync(filepath)&&(possibleVaultPath=filepath.endsWith(`.vault`)?filepath:`${filepath}.vault`);else possibleVaultPath=options$1.path.endsWith(`.vault`)?options$1.path:`${options$1.path}.vault`;else possibleVaultPath=path$2.resolve(process.cwd(),`.env.vault`);return fs$3.existsSync(possibleVaultPath)?possibleVaultPath:null}function _resolveHome(envPath){return envPath[0]===`~`?path$2.join(os$2.homedir(),envPath.slice(1)):envPath}function _configVault(options$1){_log(`Loading env from encrypted .env.vault`);let parsed=DotenvModule._parseVault(options$1),processEnv=process.env;return options$1&&options$1.processEnv!=null&&(processEnv=options$1.processEnv),DotenvModule.populate(processEnv,parsed,options$1),{parsed}}function configDotenv(options$1){let dotenvPath=path$2.resolve(process.cwd(),`.env`),encoding=`utf8`,debug$12=!!(options$1&&options$1.debug);options$1&&options$1.encoding?encoding=options$1.encoding:debug$12&&_debug(`No encoding is specified. UTF-8 is used by default`);let optionPaths=[dotenvPath];if(options$1&&options$1.path)if(!Array.isArray(options$1.path))optionPaths=[_resolveHome(options$1.path)];else{optionPaths=[];for(let filepath of options$1.path)optionPaths.push(_resolveHome(filepath))}let lastError,parsedAll={};for(let path$38 of optionPaths)try{let parsed=DotenvModule.parse(fs$3.readFileSync(path$38,{encoding}));DotenvModule.populate(parsedAll,parsed,options$1)}catch(e$3){debug$12&&_debug(`Failed to load ${path$38} ${e$3.message}`),lastError=e$3}let processEnv=process.env;return options$1&&options$1.processEnv!=null&&(processEnv=options$1.processEnv),DotenvModule.populate(processEnv,parsedAll,options$1),lastError?{parsed:parsedAll,error:lastError}:{parsed:parsedAll}}function config(options$1){if(_dotenvKey(options$1).length===0)return DotenvModule.configDotenv(options$1);let vaultPath=_vaultPath(options$1);return vaultPath?DotenvModule._configVault(options$1):(_warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`),DotenvModule.configDotenv(options$1))}function decrypt(encrypted,keyStr){let key=Buffer.from(keyStr.slice(-64),`hex`),ciphertext=Buffer.from(encrypted,`base64`),nonce=ciphertext.subarray(0,12),authTag=ciphertext.subarray(-16);ciphertext=ciphertext.subarray(12,-16);try{let aesgcm=crypto$3.createDecipheriv(`aes-256-gcm`,key,nonce);return aesgcm.setAuthTag(authTag),`${aesgcm.update(ciphertext)}${aesgcm.final()}`}catch(error$22){let isRange=error$22 instanceof RangeError,invalidKeyLength=error$22.message===`Invalid key length`,decryptionFailed=error$22.message===`Unsupported state or unable to authenticate data`;if(isRange||invalidKeyLength){let err$2=Error(`INVALID_DOTENV_KEY: It must be 64 characters long (or more)`);throw err$2.code=`INVALID_DOTENV_KEY`,err$2}else if(decryptionFailed){let err$2=Error(`DECRYPTION_FAILED: Please check your DOTENV_KEY`);throw err$2.code=`DECRYPTION_FAILED`,err$2}else throw error$22}}function populate(processEnv,parsed,options$1={}){let debug$12=!!(options$1&&options$1.debug),override=!!(options$1&&options$1.override);if(typeof parsed!=`object`){let err$2=Error(`OBJECT_REQUIRED: Please check the processEnv argument being passed to populate`);throw err$2.code=`OBJECT_REQUIRED`,err$2}for(let key of Object.keys(parsed))Object.prototype.hasOwnProperty.call(processEnv,key)?(override===!0&&(processEnv[key]=parsed[key]),debug$12&&_debug(override===!0?`"${key}" is already defined and WAS overwritten`:`"${key}" is already defined and was NOT overwritten`)):processEnv[key]=parsed[key]}let DotenvModule={configDotenv,_configVault,_parseVault,config,decrypt,parse:parse$2,populate};module.exports.configDotenv=DotenvModule.configDotenv,module.exports._configVault=DotenvModule._configVault,module.exports._parseVault=DotenvModule._parseVault,module.exports.config=DotenvModule.config,module.exports.decrypt=DotenvModule.decrypt,module.exports.parse=DotenvModule.parse,module.exports.populate=DotenvModule.populate,module.exports=DotenvModule})),import_main$1=__toESM$2(require_main(),1);function useDotenv(directory,name$5=`.env.local`){let[env$8,setEnv]=(0,import_react.useState)({});return(0,import_react.useEffect)(()=>{let watcher,readEnvFile=path$38=>{try{setEnv((0,import_main$1.parse)(readFileSync$1(path$38,`utf-8`)))}catch(error$22){console.error(error$22),setEnv({})}};return findNearestEntry(directory,name$5).then(nearest=>{if(!nearest){setEnv({});return}readEnvFile(nearest),watcher=watch(nearest,{persistent:!1},()=>{readEnvFile(nearest)})}),()=>{watcher&&watcher.close()}},[directory,name$5]),env$8}function useServerChat(server,id){let[chat$2,setChat]=(0,import_react.useState)(()=>server.upsertChat(id));return(0,import_react.useEffect)(()=>{setChat(server.upsertChat(id));let disposable=server.onChatChanged(chat$3=>{if(chat$3.id===id)return setChat(chat$3)});return()=>disposable.dispose()},[server,id]),chat$2}function useTerminalSize(){let{stdout:stdout$1}=use_stdout_default(),[size,setSize]=(0,import_react.useState)({columns:process.stdout.columns,rows:process.stdout.rows});return(0,import_react.useEffect)(()=>{if(!stdout$1||!stdout$1.isTTY)return;let handleResize=()=>{setSize({columns:stdout$1.columns,rows:stdout$1.rows})};return process.stdout.on(`resize`,handleResize),()=>{process.stdout.off(`resize`,handleResize)}},[stdout$1]),{columns:size.columns,rows:size.rows?size.rows-1:void 0}}async function start(element){let instance$1=render_default(element,{exitOnCtrlC:!1});await instance$1.waitUntilExit().finally(()=>{})}function startDev({entrypoint}){return start((0,import_jsx_runtime.jsx)(Root,{entrypoint}))}const Root=({entrypoint})=>{let size=useTerminalSize(),{errors:compileErrors,status:bundlerStatus,lastBuildDuration,bundle}=useBundler(entrypoint),dotenv=useDotenv(dirname$1(entrypoint)),env$8=(0,import_react.useMemo)(()=>{let blinkToken=getAuthToken();return blinkToken?{...dotenv,BLINK_TOKEN:blinkToken}:dotenv},[dotenv]),server=(0,import_react.useMemo)(()=>createServer$1({port:0,dataDirectory:join$1(dirname$1(entrypoint),`.blink`,`data`),sendMessages:async(request$3,signal)=>{if(!currentAgentRef.current)throw Error(`No agent`);if(!currentChatIDRef.current)throw Error(`No chat`);return await currentAgentRef.current.sendMessages({messages:request$3.messages.filter(m$3=>m$3.metadata?.ephemeral!==!0),chat:{id:currentChatIDRef.current}},{signal})},serializeChat:chat$3=>({...chat$3,messages:chat$3.messages.filter(m$3=>m$3.metadata?.ephemeral!==!0)}),shouldLoop:({messages:messages$1})=>{let lastMessage=messages$1.at(-1);if(!lastMessage||lastMessage.role!==`assistant`)return!1;let lastStepStartIndex=lastMessage.parts.reduce((lastIndex,part,index)=>part.type===`step-start`?index:lastIndex,-1),lastStepToolInvocations=lastMessage.parts.slice(lastStepStartIndex+1).filter(isToolOrDynamicToolUIPart);return lastStepToolInvocations.length>0&&lastStepToolInvocations.every(part=>part.state.startsWith(`output-`))}}),[]),{agent,logs:logs$1,error:agentError,supportsRequests}=useAgent({bundle,env:env$8,apiServerUrl:server.url}),currentAgentRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{agent?currentAgentRef.current=agent:server.stopChat(chat$2.id)},[agent]);let devhookID=(0,import_react.useMemo)(()=>{let storagePath=join$1(dirname$1(entrypoint),`.blink`,`devhook.txt`);if(mkdirSync(dirname$1(storagePath),{recursive:!0}),existsSync$1(storagePath))return readFileSync$1(storagePath,`utf-8`);let id=crypto.randomUUID();return writeFileSync$1(storagePath,id),id},[]),devhook=useDevhook({id:devhookID,disabled:!supportsRequests,onRequest:async request$3=>{if(!currentAgentRef.current)throw Error(`No agent`);let response=await currentAgentRef.current.sendRequest(request$3);return server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`webhook`,ephemeral:!0},parts:[{type:`text`,text:`method=${request$3.method} status=${response.status}`}]}),response}}),[chatID,setChatID]=(0,import_react.useState)(`default`),currentChatIDRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{currentChatIDRef.current=chatID},[chatID]);let chat$2=useServerChat(server,chatID),[chatIDs,setChatIDs]=(0,import_react.useState)(()=>server.listChats()),currentChatIDsRef=(0,import_react.useRef)(chatIDs);(0,import_react.useEffect)(()=>{currentChatIDsRef.current=chatIDs},[chatIDs]),(0,import_react.useEffect)(()=>{let disposable=server.onChatChanged(chat$3=>{!currentChatIDsRef.current.includes(chat$3.id)&¤tChatIDRef.current&&(setChatID(chat$3.id),server.upsertChatMessage(chat$3.id,{role:`assistant`,metadata:{type:`chat-created`,ephemeral:!0},parts:[{type:`text`,text:`This chat has just been created: ${chat$3.id}. We automatically switched you to it!`}]})),setChatIDs(prev=>{let newChats=[...prev];return newChats.includes(chat$3.id)?prev:(newChats.push(chat$3.id),newChats)})});return()=>{disposable.dispose()}},[server]);let{exit}=use_app_default(),[exitArmed,setExitArmed]=(0,import_react.useState)(!1),exitTimerRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>()=>{exitTimerRef.current&&clearTimeout(exitTimerRef.current)},[]),use_input_default((input,key)=>{if(key.ctrl&&input.toLowerCase()===`c`){if(exitArmed){exit();return}setExitArmed(!0),exitTimerRef.current&&clearTimeout(exitTimerRef.current),exitTimerRef.current=setTimeout(()=>setExitArmed(!1),2e3)}}),(0,import_react.useEffect)(()=>{if(compileErrors.length>0||agentError||chat$2.error){let errors$1=[];for(let error$22 of compileErrors)errors$1.push({type:`text`,text:`${error$22.text} (${error$22.location?.file})`});agentError&&errors$1.push({type:`text`,text:agentError.message}),chat$2.error&&errors$1.push({type:`text`,text:`Chat error: ${chat$2.error.message}, ${chat$2.error.stack}`}),server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`error`,ephemeral:!0},parts:errors$1});return}if(bundlerStatus===`building`||!agent){server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:`Compiling...`}]});return}if(bundlerStatus===`success`&&agent){server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`success`,ephemeral:!0},parts:[{type:`text`,text:`Compiled in 100ms`}]});return}},[compileErrors,chat$2.error,agentError,bundlerStatus,agent]);let lastReportedKeys=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{let keys=Object.keys(env$8);if(keys.length===lastReportedKeys.current||lastReportedKeys.current===void 0)return;lastReportedKeys.current=keys.length;let keysText=keys.map(key=>source_default.dim(key)).join(`, `);keysText.length===0&&(keysText=source_default.dim(`(none)`));let text$1=`Loaded .env.local: `+keysText;server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:text$1}]})},[env$8]),(0,import_react.useEffect)(()=>{!supportsRequests||devhook.status!==`connected`||server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:`Send webhooks from anywhere: https://${devhook.id}.dev.blink.host`}]})},[supportsRequests,devhook.status]);let lastLogsLength=(0,import_react.useRef)(0);(0,import_react.useEffect)(()=>{if(logs$1.length===lastLogsLength.current)return;let currentLength=lastLogsLength.current;for(let log$5 of logs$1.slice(currentLength))server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`runtime-log`,level:log$5.level,ephemeral:!0},parts:[{type:`text`,text:log$5.message}]});lastLogsLength.current=logs$1.length},[logs$1]);let keymaps=(0,import_react.useMemo)(()=>({"⏎":`send`,"Ctrl+R":`reset chat`,"Ctrl+C":`quit`,"[Escape]":`stop streaming`}),[]),keybindSuggestion=(0,import_react.useMemo)(()=>{if(exitArmed)return`Ctrl+C again to quit`;if(chat$2.status===`streaming`)return`Press [Escape] to stop the agent!`},[exitArmed,chat$2.status]),newChatNames=(0,import_react.useMemo)(()=>{let names$1=[];for(;names$1.length<3;){let name$5=(0,import_dist.uniqueNamesGenerator)({dictionaries:[import_dist.adjectives,import_dist.animals],style:`lowerCase`});chatIDs.includes(name$5)||names$1.push(name$5)}return names$1},[chatID,chatIDs]);return(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Keybinds,{resetChat:()=>{server.resetChat(chat$2.id)},stopStreaming:()=>{server.stopChat(chat$2.id)}}),(0,import_jsx_runtime.jsxs)(Box_default,{children:[(0,import_jsx_runtime.jsx)(Text,{bold:!0,children:`blink■`}),(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:` agent development mode`})]}),(0,import_jsx_runtime.jsxs)(Box_default,{marginTop:1,flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Edit `,entrypoint,` to hot-reload your agent.`]}),(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Run `,(0,import_jsx_runtime.jsx)(Text,{color:`blue`,children:`blink deploy`}),` to use your agent in the cloud.`]})]}),chat$2.error?(0,import_jsx_runtime.jsx)(Box_default,{marginTop:1,children:(0,import_jsx_runtime.jsx)(Text,{color:`red`,children:chat$2.error.message})}):null,(0,import_jsx_runtime.jsx)(Messages,{messages:[...chat$2.messages],streamingMessage:chat$2.streamingMessage,maxWidth:size.columns-2,status:chat$2.status}),(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,marginTop:1,children:(0,import_jsx_runtime.jsx)(text_input_default,{slashCommands:[{name:`reset`,altNames:[`clear`],description:`Reset the chat`,action:()=>{server.resetChat(chat$2.id)}},{name:`switch`,description:`Switch to a different chat`,action:args=>{setChatID(args)},completion:async partialArg=>{let chats=server.listChats();return chats.map(chat$3=>chat$3)}},{name:`new`,description:`Create a new chat`,action:args=>{setChatID(args)},completion:async partialArg=>newChatNames}],onSubmit:value=>(server.runtime.chat.sendMessages(chat$2.id,{messages:[{role:`user`,parts:[{type:`text`,text:value}]}],behavior:`interrupt`}),!0)})}),(0,import_jsx_runtime.jsx)(Box_default,{children:keybindSuggestion?(0,import_jsx_runtime.jsx)(Text,{color:`yellow`,children:` `+keybindSuggestion}):(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Box_default,{marginLeft:2,children:(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`chat: `,(0,import_jsx_runtime.jsx)(Text,{children:chat$2.id})]})}),(0,import_jsx_runtime.jsx)(Spacer,{}),(0,import_jsx_runtime.jsx)(Box_default,{gap:3,marginRight:2,children:Object.entries(keymaps).map(([key,value])=>(0,import_jsx_runtime.jsx)(Text,{children:source_default.gray.dim(key+` `+value)},key))})]})})]})},Keybinds=({resetChat,stopStreaming})=>(use_input_default((input,key)=>{key.ctrl&&input===`r`&&resetChat(),key.escape&&stopStreaming()}),null),Messages=({messages:messages$1,maxWidth,streamingMessage,status})=>(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[messages$1.map((message,index)=>(0,import_jsx_runtime.jsx)(Message,{message,previousMessage:index>0?messages$1.at(index-1):void 0,nextMessage:index<messages$1.length-1?messages$1.at(index+1):void 0,maxWidth},message.id)),streamingMessage?(0,import_jsx_runtime.jsx)(Message,{message:streamingMessage,nextMessage:void 0,previousMessage:messages$1.length>0?messages$1.at(messages$1.length-1):void 0,streaming:!0,maxWidth},streamingMessage.id):null,status===`streaming`&&!streamingMessage?(0,import_jsx_runtime.jsx)(AssistantWaitingPlaceholder,{maxWidth}):null]}),MessageComponent=({message,previousMessage,maxWidth,streaming})=>{let prefix,contentColor,marginTop=1;switch(message.role){case`system`:prefix=(0,import_jsx_runtime.jsx)(Text,{children:`t `}),contentColor=`gray`;break;case`user`:prefix=(0,import_jsx_runtime.jsx)(Text,{color:`magenta`,bold:!0,children:`▎`}),contentColor=`gray`;break;case`assistant`:prefix=(0,import_jsx_runtime.jsx)(Text,{color:`white`,children:`> `}),contentColor=`white`;break}if(message.metadata?.type===`build-log`){let color=`gray`;switch(message.metadata.level){case`success`:color=`green`;break;case`info`:color=`gray`;break;case`error`:color=`red`;break}prefix=(0,import_jsx_runtime.jsx)(Text,{color,children:`⚙ `}),contentColor=`gray`,previousMessage?.metadata?.type===`build-log`&&(marginTop=0)}message.metadata?.type===`webhook`&&(prefix=(0,import_jsx_runtime.jsx)(Text,{color:`blue`,children:`↩ `}),contentColor=`gray`,previousMessage?.metadata?.type===`webhook`&&(marginTop=0));let content=(0,import_jsx_runtime.jsx)(Box_default,{gap:1,flexDirection:`column`,width:maxWidth,children:message.parts.map((part,index)=>{if(part.type===`text`)return(0,import_jsx_runtime.jsx)(markdown_default,{id:message.id,maxWidth,children:part.text},index);if(part.type===`reasoning`)return(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Reasoning: `,part.text]},index);if(isToolOrDynamicToolUIPart(part))return(0,import_jsx_runtime.jsx)(ToolCall,{part,maxWidth,streaming},index)}).filter(Boolean)});return(0,import_jsx_runtime.jsxs)(Box_default,{marginTop,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsx)(Text,{color:contentColor,children:prefix})}),content]})},Message=import_react.memo(MessageComponent,(prev,next)=>prev.maxWidth===next.maxWidth?!!(prev.nextMessage&&next.nextMessage&&prev.nextMessage.id===next.nextMessage.id):!1),AssistantWaitingPlaceholder=({maxWidth})=>(0,import_jsx_runtime.jsxs)(Box_default,{marginTop:1,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsx)(Text,{color:`white`,children:null})}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth,children:(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[(0,import_jsx_runtime.jsx)(build_default,{}),` Waiting for response...`]})})]}),ToolCall=({part,maxWidth,streaming})=>{let name$5=getToolOrDynamicToolName(part),input=(0,import_react.useMemo)(()=>{let labels={};return typeof part.input!=`object`||part.input===null||Object.entries(part.input).forEach(([key,value])=>{labels[key]=JSON.stringify(value)}),labels},[part]),output=(0,import_react.useMemo)(()=>{if(!part.output)return;if(typeof part.output==`string`)return part.output;let labels={};return Array.isArray(part.output)?part.output.forEach((item,index)=>{labels[`${index}`]=JSON.stringify(item)}):typeof part.output==`object`&&Object.entries(part.output).forEach(([key,value])=>{labels[key]=JSON.stringify(value)}),labels},[part]),state=(0,import_react.useMemo)(()=>{switch(part.state){case`input-available`:case`input-streaming`:return streaming?`streaming`:`error`;case`output-available`:return`done`;case`output-error`:return`error`}},[part,streaming]),error$22=(0,import_react.useMemo)(()=>{if(part.state===`output-error`)return part.errorText},[part]);return(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Box_default,{gap:1,children:[(0,import_jsx_runtime.jsx)(Text,{color:state===`error`?`red`:`gray`,bold:!0,children:state===`done`||state===`error`?`⚒`:(0,import_jsx_runtime.jsx)(build_default,{type:`dots`})}),(0,import_jsx_runtime.jsx)(Text,{children:name$5})]}),(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,flexDirection:`column`,overflowX:`hidden`,width:maxWidth?maxWidth-4:void 0,gap:0,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Input:`}),Object.entries(input).map(([key,value])=>(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:key}),(0,import_jsx_runtime.jsx)(Text,{color:`blackBright`,children:`=`}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth?maxWidth-6-1-2-key.length:void 0,children:(0,import_jsx_runtime.jsx)(Text,{wrap:`truncate-middle`,children:value})})]},key)),output&&(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Output:`}),typeof output==`string`?(0,import_jsx_runtime.jsx)(Box_default,{marginLeft:2,children:(0,import_jsx_runtime.jsx)(Text,{children:output})}):(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,children:Object.entries(output).map(([key,value])=>(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:key}),(0,import_jsx_runtime.jsx)(Text,{color:`blackBright`,children:`=`}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth?maxWidth-6-1-key.length:void 0,children:(0,import_jsx_runtime.jsx)(Text,{wrap:`truncate-middle`,children:value})})]},key))})]}),error$22&&(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Error:`}),(0,import_jsx_runtime.jsx)(Text,{color:`red`,children:error$22})]})]})]})};async function dev(directory){directory||=process.cwd();let entrypoint=await resolveEntrypoint(directory),exitWithDump=error$22=>{writeFileSync$1(`error.dump`,inspect$1(error$22,{depth:null})),process.exit(1)};process.addListener(`uncaughtException`,error$22=>{exitWithDump(error$22)}),process.addListener(`unhandledRejection`,error$22=>{exitWithDump(error$22)}),await startDev({entrypoint}),process.exit(0)}async function init(directory){directory||=process.cwd(),Ie(`Initializing a new Blink Agent`),(await readdir(directory)).length>0&&(xe("You must be in an empty directory to run `blink init`."),process.exit(1));let name$5=basename$1(directory).replace(/[^a-zA-Z0-9]/g,`-`),packageManager;if(process.env.npm_config_user_agent?.includes(`bun/`)?packageManager=`bun`:process.env.npm_config_user_agent?.includes(`pnpm/`)?packageManager=`pnpm`:process.env.npm_config_user_agent?.includes(`yarn/`)?packageManager=`yarn`:process.env.npm_config_user_agent?.includes(`npm/`)&&(packageManager=`npm`),!packageManager){let pm$1=await ve({options:[{label:`Bun`,value:`bun`},{label:`NPM`,value:`npm`},{label:`PNPM`,value:`pnpm`},{label:`Yarn`,value:`yarn`}],message:`What package manager do you want to use?`});pD(pm$1)&&process.exit(0),packageManager=pm$1}M.info(`Using ${packageManager} as the package manager.`);let files={"package.json":JSON.stringify({name:name$5,main:`agent.ts`,type:`module`,private:!0}),"agent.ts":`import { convertToModelMessages, streamText, tool } from "ai";
|
|
2050
2050
|
import * as blink from "blink";
|
|
2051
2051
|
import { z } from "zod";
|
|
2052
2052
|
|
|
@@ -2127,4 +2127,4 @@ node_modules
|
|
|
2127
2127
|
|
|
2128
2128
|
${packageManager} blink dev`),Se(`Edit agent.ts to hot-reload your agent.`)}var import_main=__toESM$2(require_main(),1);async function deploy(directory,options$1){directory||=process.cwd();let token$1=await loginIfNeeded(),client=new Client({authToken:token$1}),packageJSON=await findNearestEntry(directory,`package.json`);if(!packageJSON)throw Error(`package.json not found`);let packageJSONContent=await readFile$1(packageJSON,`utf-8`),packageJSONData=JSON.parse(packageJSONContent),deployDirectory=dirname(packageJSON),deployConfigPath=join(deployDirectory,`.blink`,`config.json`),deployConfig={};if(existsSync(deployConfigPath)){let deployConfigContent=await readFile$1(deployConfigPath,`utf-8`);deployConfig=JSON.parse(deployConfigContent)}let organizationName;if(deployConfig?.organizationId)try{let org=await client.organizations.get(deployConfig.organizationId);organizationName=org.name}catch{deployConfig.organizationId=void 0}if(!deployConfig?.organizationId){let organizations=await client.organizations.list();if(organizations.length===1){let organization=organizations[0];deployConfig.organizationId=organization.id,organizationName=organization.name}else{let organization=await ve({message:`Which organization should contain this agent?`,options:organizations.map(organization$1=>({value:organization$1.id,label:organization$1.name}))});if(pD(organization))return;deployConfig.organizationId=organization,organizationName=organizations.find(org=>org.id===organization).name}}if(!deployConfig.organizationId)throw Error(`Developer error: No organization ID found.`);let agentName;if(deployConfig?.agentId)try{let agent=await client.agents.get(deployConfig.agentId);agentName=agent.name}catch{deployConfig.agentId=void 0}if(!deployConfig?.agentId)try{let agent=await client.organizations.agents.get({organization_id:deployConfig.organizationId,agent_name:packageJSONData.name});deployConfig.agentId=agent.id,agentName=agent.name}catch{let agent=await client.agents.create({name:packageJSONData.name,organization_id:deployConfig.organizationId});deployConfig.agentId=agent.id,agentName=agent.name}if(!deployConfig.agentId)throw Error(`Developer error: No agent ID found.`);await mkdir(dirname(deployConfigPath),{recursive:!0}),await writeFile(deployConfigPath,JSON.stringify({_:`This file can be source controlled. It contains no secrets.`,...deployConfig},null,2),`utf-8`);let entrypoint=await resolveEntrypoint(directory),{outfile}=await build$1(entrypoint),filesToUpload={},outputFiles=await readdir(dirname(outfile));for(let file of outputFiles)filesToUpload[join(dirname(outfile),file)]=file;let readmePath=join(directory,`README.md`);await exists(readmePath)&&(filesToUpload[readmePath]=`README.md`);let uploadedFiles=[],totalFiles=Object.keys(filesToUpload).length,uploadedCount=0,totalUploadedBytes=0;for(let[filePath,uploadPath]of Object.entries(filesToUpload)){let st=await stat$1(filePath),fileSize=st.size;writeInline(`${source_default.dim(`[${uploadedCount+1}/${totalFiles}]`)} Uploading ${uploadPath} (${formatBytes(fileSize)})...`);let fileContent=await readFile$1(filePath),uploadedFile=await client.files.upload(new File([fileContent],uploadPath));uploadedFiles.push({path:uploadPath,id:uploadedFile.id}),uploadedCount+=1,totalUploadedBytes+=fileSize}writeInline(`${source_default.dim(`[${uploadedCount}/${totalFiles}]`)} Uploaded files (${formatBytes(totalUploadedBytes)}).`),process.stdout.write(`
|
|
2129
2129
|
`);let localEnvFile=join(directory,`.env.local`),localEnvVarsSet=[];if(await exists(localEnvFile)){let localEnv=(0,import_main.parse)(await readFile$1(localEnvFile,`utf-8`));localEnvVarsSet=Object.keys(localEnv)}let cloudEnvVarsSet=[],cloudEnvVars=await client.agents.env.list({agent_id:deployConfig.agentId});cloudEnvVarsSet=cloudEnvVars.map(env$8=>env$8.key);let prodEnvFile=join(directory,`.env.production`);if(await exists(prodEnvFile)){let prodEnv=(0,import_main.parse)(await readFile$1(prodEnvFile,`utf-8`)),envEntries=Object.entries(prodEnv),totalEnvVars=envEntries.length,updatedCount=0;for(let[key,value]of envEntries){let created=await client.agents.env.create({agent_id:deployConfig.agentId,key,value,target:[`production`,`preview`],secret:!0,upsert:!0});cloudEnvVarsSet.push(created.key),updatedCount+=1,writeInline(`${source_default.dim(`[${updatedCount}/${totalEnvVars}]`)} Updating environment variable: ${key} ${source_default.dim(`(.env.production)`)}`)}writeInline(`${source_default.dim(`[${updatedCount}/${totalEnvVars}]`)} Updated environment variables! ${source_default.dim(`(.env.production)`)}`),process.stdout.write(`
|
|
2130
|
-
`)}let missingEnvVars=localEnvVarsSet.filter(v$2=>!cloudEnvVarsSet.includes(v$2));if(missingEnvVars.length>0){console.log(`Warning: The following environment variables are set in .env.local but not in .env.production:`);for(let v$2 of missingEnvVars)console.log(`- ${v$2}`);let confirmed=await ye({message:`Do you want to deploy anyway?`});if(confirmed===!1||pD(confirmed))return}let deployment=await client.agents.deployments.create({agent_id:deployConfig.agentId,target:`production`,entrypoint:basename(outfile),files:uploadedFiles,message:options$1?.message}),inspectUrl=`https://blink.so/${organizationName}/${agentName}/deployments/${deployment.number}`;console.log(`Deployed:`,inspectUrl);let s$3=Y();s$3.start(`Waiting for deployment to be live...`);try{let pollIntervalMs=500;for(;;){let current=await client.agents.deployments.get({agent_id:deployConfig.agentId,deployment_id:deployment.id});if(current.status===`success`){let msg=`Deployment successful.`;current.target===`production`&&(msg+=` All chats will use this deployment!`),s$3.stop(msg);break}if(current.status===`failed`){let msg=`Deployment failed.`;current.error_message&&(msg+=` ${current.error_message}`),s$3.stop(msg),console.log(`Read logs for details:`,inspectUrl);return}await new Promise(r$3=>setTimeout(r$3,500))}}catch{s$3.stop(`Failed to poll for deployment status.`),console.log(`Read logs for details:`,inspectUrl);return}}const exists=async path$38=>{try{return await stat$1(path$38),!0}catch{return!1}};function formatBytes(bytes){if(bytes===0)return`0B`;let k$2=1024,sizes=[`B`,`KB`,`MB`,`GB`,`TB`],i$7=Math.floor(Math.log(bytes)/Math.log(k$2)),value=bytes/k$2**+i$7;return`${value.toFixed(value>=100?0:value>=10?1:2)}${sizes[i$7]}`}function writeInline(message){if(process.stdout.isTTY)try{process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(message);return}catch{}console.log(message)}async function login(){await login$1()}var version=`0.1.
|
|
2130
|
+
`)}let missingEnvVars=localEnvVarsSet.filter(v$2=>!cloudEnvVarsSet.includes(v$2));if(missingEnvVars.length>0){console.log(`Warning: The following environment variables are set in .env.local but not in .env.production:`);for(let v$2 of missingEnvVars)console.log(`- ${v$2}`);let confirmed=await ye({message:`Do you want to deploy anyway?`});if(confirmed===!1||pD(confirmed))return}let deployment=await client.agents.deployments.create({agent_id:deployConfig.agentId,target:`production`,entrypoint:basename(outfile),files:uploadedFiles,message:options$1?.message}),inspectUrl=`https://blink.so/${organizationName}/${agentName}/deployments/${deployment.number}`;console.log(`Deployed:`,inspectUrl);let s$3=Y();s$3.start(`Waiting for deployment to be live...`);try{let pollIntervalMs=500;for(;;){let current=await client.agents.deployments.get({agent_id:deployConfig.agentId,deployment_id:deployment.id});if(current.status===`success`){let msg=`Deployment successful.`;current.target===`production`&&(msg+=` All chats will use this deployment!`),s$3.stop(msg);break}if(current.status===`failed`){let msg=`Deployment failed.`;current.error_message&&(msg+=` ${current.error_message}`),s$3.stop(msg),console.log(`Read logs for details:`,inspectUrl);return}await new Promise(r$3=>setTimeout(r$3,500))}}catch{s$3.stop(`Failed to poll for deployment status.`),console.log(`Read logs for details:`,inspectUrl);return}}const exists=async path$38=>{try{return await stat$1(path$38),!0}catch{return!1}};function formatBytes(bytes){if(bytes===0)return`0B`;let k$2=1024,sizes=[`B`,`KB`,`MB`,`GB`,`TB`],i$7=Math.floor(Math.log(bytes)/Math.log(k$2)),value=bytes/k$2**+i$7;return`${value.toFixed(value>=100?0:value>=10?1:2)}${sizes[i$7]}`}function writeInline(message){if(process.stdout.isTTY)try{process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(message);return}catch{}console.log(message)}async function login(){await login$1()}var version=`0.1.50`;await init_wrapper(),globalThis.WebSocket||(globalThis.WebSocket=import_websocket$1.default),globalThis.crypto||(globalThis.crypto={}),globalThis.crypto.randomUUID||(globalThis.crypto.randomUUID=()=>randomUUID()),program.name(`blink`).description(`Blink is a runtime for building and deploying AI agents.`).version(version).action(()=>{program.outputHelp()}),program.command(`init [directory]`).description(`Initialize a new Blink agent.`).action(init),program.command(`dev [directory] [options]`).description(`Start a development server for your agent.`).action(dev),program.command(`deploy [directory]`).description(`Deploy your agent to the Blink Cloud.`).option(`-m, --message <message>`,`Message for this deployment`).action(deploy),program.command(`build [directory]`).description(`Build your agent for production.`).action(build),program.command(`telemetry [boolean]`).description(`Enable or disable telemetry.`),program.command(`start [directory]`).description("Starts the Blink runtime in production mode. The agent must be compiled with `blink build` first."),program.command(`serve [entrypoint]`).description(`Serve the Blink agent as an HTTP server.`).action(serve),program.command(`connect`,{hidden:!0}).description(`Connect compute to the Blink Cloud.`).action(connect),program.command(`chat`,{hidden:!0}).description(`Start a Blink chat connected to your machine.`).action(chat),program.command(`login`,{hidden:!0}).description(`Log in to the Blink Cloud.`).action(login),program.parse(process.argv);export{};
|