blink 1.1.24 → 1.1.25
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.
|
@@ -463,7 +463,7 @@ Slack:
|
|
|
463
463
|
1. *ALWAYS* use the \`typecheck_agent\` tool to check for type errors before making changes. NEVER invoke \`tsc\` directly.
|
|
464
464
|
2. Use the \`message_user_agent\` tool to test the agent after you make changes.
|
|
465
465
|
</agent_development>
|
|
466
|
-
`});let agentsMDContent=templates.scratch[`AGENTS.md`];try{agentsMDContent=await readFile(join$1(options$1.directory,`AGENTS.md`),`utf-8`)}catch{}return converted.unshift({role:`system`,content:agentsMDContent}),streamText({model:getEditModeModelOrThrow(options$1.env),messages:converted,maxOutputTokens:64e3,tools:tools$2,abortSignal,experimental_repairToolCall:({tools:tools$3,toolCall})=>{throw Object.keys(tools$3).includes(toolCall.toolName)?Error(`You have this tool, but you used an invalid input.`):Error(`Invalid tool call. Tool "${toolCall.toolName}" is not available to the EDIT AGENT.`)}})}),{agent,setUserAgentUrl:url$3=>{userAgentUrl=url$3},cleanup:()=>{tsserver&&=(tsserver.close(),void 0)}}}function getEditModeModel(env$8){if(env$8.ANTHROPIC_API_KEY)return createAnthropic({apiKey:env$8.ANTHROPIC_API_KEY}).chat(`claude-sonnet-4-5`);if(env$8.OPENAI_API_KEY)return createOpenAI({apiKey:env$8.OPENAI_API_KEY}).chat(`gpt-5`);if(env$8.AI_GATEWAY_API_KEY)return createGatewayProvider({apiKey:env$8.AI_GATEWAY_API_KEY})(`anthropic/claude-sonnet-4-5`)}function getEditModeModelOrThrow(env$8){let model=getEditModeModel(env$8);if(!model)throw Error(`No API key available for edit mode`);return model}function useEditAgent(options$1){let[client,setClient]=useState(void 0),[error$3,setError]=useState(void 0),[missingApiKey,setMissingApiKey]=useState(!1),editAgentRef=useRef(void 0);return useEffect(()=>{let controller=new AbortController,isCleanup=!1;if(setError(void 0),setClient(void 0),!getEditModeModel(options$1.env)){setMissingApiKey(!0);return}setMissingApiKey(!1);let lock$1;return(async()=>{editAgentRef.current=createEditAgent({directory:options$1.directory,env:options$1.env,getDevhookUrl:options$1.getDevhookUrl});let port$1=await getRandomPort(),server=editAgentRef.current.agent.serve({port:port$1,host:`127.0.0.1`,apiUrl:options$1.apiServerUrl});controller.signal.addEventListener(`abort`,()=>{try{server.close()}catch{}editAgentRef.current?.cleanup()});let editClient=new Client$3({baseUrl:`http://127.0.0.1:${port$1}`});for(lock$1=editClient.agentLock;!controller.signal.aborted;){try{await editClient.health();break}catch{}await new Promise(resolve$11=>setTimeout(resolve$11,100))}if(controller.signal.aborted)throw controller.signal.reason;setClient(editClient)})().catch(err=>{isCleanup||setError(err instanceof Error?err:Error(String(err)))}),()=>{isCleanup=!0,(async()=>{try{var _usingCtx$1=_usingCtx();let _writeLock=_usingCtx$1.u(await lock$1?.write());controller.abort()}catch(_$3){_usingCtx$1.e=_$3}finally{_usingCtx$1.d()}})()}},[options$1.directory,options$1.apiServerUrl,options$1.env,options$1.getDevhookUrl]),useMemo(()=>({client,error:error$3,missingApiKey,setUserAgentUrl:url$3=>{editAgentRef.current?.setUserAgentUrl(url$3)}}),[client,error$3,missingApiKey])}async function getRandomPort(){let server=createServer();return new Promise((resolve$11,reject)=>{server.listen(0,()=>{let port$1=server.address().port;resolve$11(port$1)}).on(`error`,err=>{reject(err)})}).finally(()=>{server.close()})}function useAuth(options$1={}){let{autoCheck=!0,onAuthChange,onLoginUrl,testAuthPath}=options$1,[user,setUser]=useState(),[token$1,setToken]=useState(()=>getAuthToken(testAuthPath)),[error$3,setError]=useState(),onAuthChangeRef=useRef(onAuthChange),onLoginUrlRef=useRef(onLoginUrl);useEffect(()=>{onAuthChangeRef.current=onAuthChange,onLoginUrlRef.current=onLoginUrl},[onAuthChange,onLoginUrl]);let checkAuth=useCallback(async()=>{setError(void 0);try{let currentToken=getAuthToken(testAuthPath);if(setToken(currentToken),!currentToken){setUser(void 0),onAuthChangeRef.current?.(void 0);return}let client=new Client$2({baseURL:`https://blink.so`});client.authToken=currentToken;let userInfo={email:(await client.users.me()).email};setUser(userInfo),onAuthChangeRef.current?.(userInfo)}catch(err){setUser(void 0),setError(err instanceof Error?err.message:String(err)),onAuthChangeRef.current?.(void 0)}},[testAuthPath]),login=useCallback(async()=>{setError(void 0);try{let client=new Client$2,newToken=await client.auth.token((url$3,id)=>{onLoginUrlRef.current?.(url$3,id)});client.authToken=newToken;let userData=await client.users.me();setAuthToken(newToken,testAuthPath),setToken(newToken);let userInfo={email:userData.email};return setUser(userInfo),onAuthChangeRef.current?.(userInfo),userInfo}catch(err){let errorMessage=err instanceof Error?err.message:String(err);throw setError(errorMessage),err}},[testAuthPath]),logout=useCallback(()=>{deleteAuthToken(testAuthPath),setToken(void 0),setUser(void 0),setError(void 0),onAuthChangeRef.current?.(void 0)},[testAuthPath]);return useEffect(()=>{autoCheck&&checkAuth()},[autoCheck,checkAuth]),{user,token:token$1,error:error$3,login,logout}}function useDevMode(options$1){let{directory}=options$1,[approvalHandled,setApprovalHandled]=useState(),[autoApprove,setAutoApprove]=useState(!1),[mode,setModeState]=useState(`run`),modeRef=useRef(`run`);useEffect(()=>{modeRef.current=mode},[mode]);let setMode=useCallback(newMode=>{setModeState(newMode),options$1.onModeChange?.(newMode),setApprovalHandled(void 0)},[options$1.onModeChange]),toggleMode=useCallback(()=>{setMode(mode===`run`?`edit`:`run`)},[mode,setMode]),{error:buildError,status:buildStatus,result:buildResult,entry:entrypoint}=useBundler({directory,logger:options$1.logger,onBuildStart:options$1.onBuildStart,onBuildSuccess:options$1.onBuildSuccess,onBuildError:options$1.onBuildError}),auth$2=useAuth({autoCheck:!0,onAuthChange:options$1.onAuthChange,onLoginUrl:options$1.onLoginUrl}),dotenv=useDotenv(directory,options$1.logger),env$8=useMemo(()=>{let blinkToken=auth$2.token;return blinkToken?{...dotenv,BLINK_TOKEN:blinkToken}:dotenv},[dotenv,auth$2.token]),lastReportedKeys=useRef(void 0);useEffect(()=>{let keys=Object.keys(env$8);if(keys.length===lastReportedKeys.current||lastReportedKeys.current===void 0){lastReportedKeys.current=keys.length;return}lastReportedKeys.current=keys.length,options$1.onEnvLoaded?.(keys)},[env$8,options$1.onEnvLoaded]);let runAgentRef=useRef(void 0),server=useMemo(()=>createLocalServer({port:0,dataDirectory:join$1(directory,`.blink`),getAgent:()=>runAgentRef.current}),[directory]),{agent,logs:logs$1,error:agentError,capabilities}=useAgent({buildResult,env:env$8,apiServerUrl:server.url}),{client:editAgent,error:editAgentError,missingApiKey:editModeMissingApiKey,setUserAgentUrl}=useEditAgent({directory,apiServerUrl:server.url,env:env$8,getDevhookUrl:useCallback(()=>{let id=getDevhookID(directory)??createDevhookID(directory);return setDevhookID(id),`https://${id}.blink.host`},[directory])}),[chatId,setChatId]=useState(`00000000-0000-0000-0000-000000000000`);useEffect(()=>{runAgentRef.current=agent},[agent]),useEffect(()=>{agent&&setUserAgentUrl(agent.baseUrl),(mode===`run`&&!agent||mode===`edit`&&!editAgent)&&server.getChatManager(chatId)?.stopStreaming()},[agent,editAgent,mode,chatId,server,setUserAgentUrl]);let selectedOptionsRef=useRef(void 0),chat$1=useChat({chatId,agent:mode===`run`?agent:editAgent,chatsDirectory:server.chatsDirectory,serializeMessage:msg=>{let metadata=msg.role===`user`&&selectedOptionsRef.current?{...typeof msg.metadata==`object`&&msg.metadata!==null?msg.metadata:{},options:selectedOptionsRef.current}:msg.metadata;return typeof metadata==`object`&&metadata&&(metadata.__blink_mode=modeRef.current),{id:msg.id??crypto.randomUUID(),created_at:new Date().toISOString(),role:msg.role,parts:msg.parts,mode:modeRef.current,metadata}},filterMessages:msg=>modeRef.current===`edit`?!0:!(isStoredMessageMetadata(msg.metadata)||isLogMessage(msg)||msg.mode===`edit`),onError:error$3=>{options$1.onError?.(`${source_default.red(`⚙ [Chat Error]`)} ${source_default.gray(error$3)}`)}}),lastLogsLength=useRef(0);useEffect(()=>{if(logs$1.length===lastLogsLength.current)return;let currentLength=lastLogsLength.current;for(let log$5 of logs$1.slice(currentLength))options$1.onAgentLog?.(log$5);lastLogsLength.current=logs$1.length},[logs$1,options$1.onAgentLog,chat$1.upsertMessage]);let[chatIds,setChatIds]=useState([]);useEffect(()=>{server.listChats().then(entries$1=>{setChatIds(entries$1.map(e$1=>e$1.key))})},[server]),useEffect(()=>{chatId&&!chatIds.includes(chatId)&&setChatIds(prev=>[...prev,chatId])},[chatId,chatIds]);let[devhookID,setDevhookID]=useState(()=>hasDevhook(directory)?getDevhookID(directory):createDevhookID(directory)),devhook=useDevhook({id:devhookID,directory,logger:options$1.logger,disabled:!capabilities?.request,onRequest:async request$2=>{if(!agent)throw Error(`No agent`);let requestURL=new URL(request$2.url),agentURL=new URL(agent.baseUrl);agentURL.pathname=requestURL.pathname,agentURL.search=requestURL.search;try{let response=await fetch(agentURL.toString(),{method:request$2.method,body:request$2.body,headers:request$2.headers,redirect:`manual`,signal:request$2.signal,duplex:`half`});return options$1.onDevhookRequest?.({method:request$2.method,path:requestURL.pathname,status:response.status}),response}catch(err){return options$1.logger.error(`system`,`Error sending request to user's agent:`,err),new Response(`Internal server error`,{status:500})}}});useEffect(()=>{devhook.status!==`connected`||!devhook.url||options$1.onDevhookConnected?.(devhook.url)},[devhook.status,devhook.url]);let{schema:optionsSchema,options:selectedOptions,error:optionsError,setOption:setOption$1}=useOptions({agent:mode===`run`?agent:editAgent,capabilities,messages:chat$1.messages});useEffect(()=>{selectedOptionsRef.current=selectedOptions},[selectedOptions]);let errors=useMemo(()=>{let errorMap=new Map;return agentError&&mode===`run`&&errorMap.set(`agent`,agentError.message),editAgentError&&mode===`edit`&&errorMap.set(`editAgent`,`Edit agent error: ${editAgentError.message}`),optionsError&&errorMap.set(`options`,`Options error: ${optionsError.message}`),errorMap},[agentError,editAgentError,optionsError,mode]),prevErrorsRef=useRef(new Map);useEffect(()=>{let prev=prevErrorsRef.current,current=errors;for(let[key$1,error$3]of current.entries())prev.get(key$1)!==error$3&&options$1.onError?.(error$3);for(let key$1 of prev.keys())current.has(key$1);prevErrorsRef.current=new Map(current)},[errors,options$1.onError]);let needsApproval=useMemo(()=>{let lastMessage=[...chat$1.messages].reverse().find(message=>!(message.role!==`assistant`||message.metadata&&message.metadata.ephemeral));if(!lastMessage||approvalHandled===lastMessage.id)return;let parts=lastMessage.parts.filter(isToolOrDynamicToolUIPart);if(parts.length!==0&&parts.some(part=>isToolApprovalOutput(part.output)&&part.output.outcome===`pending`))return lastMessage},[chat$1.messages,approvalHandled]),handleApproval=useCallback(async(approved,enableAutoApprove)=>{if(!needsApproval)return;enableAutoApprove&&approved&&setAutoApprove(!0),setApprovalHandled(needsApproval.id);let messages$1=chat$1.messages;if(messages$1.length===0)return;let lastMsg=messages$1[messages$1.length-1];if(!lastMsg||lastMsg.role!==`assistant`||!Array.isArray(lastMsg.parts))return;let updatedParts=lastMsg.parts.map(part=>part.output&&isToolApprovalOutput(part.output)&&part.output.outcome===`pending`?{...part,output:{...part.output,outcome:approved?`approved`:`rejected`}}:part);await chat$1.upsertMessage({...lastMsg,parts:updatedParts}),await chat$1.start()},[needsApproval,chat$1]);useEffect(()=>{autoApprove&&needsApproval&&handleApproval(!0)},[autoApprove,needsApproval,handleApproval]);let newChat=useCallback(()=>{let id=crypto.randomUUID();setChatId(id),setChatIds(prev=>[...prev,id]),setApprovalHandled(void 0)},[]),switchChat=useCallback(id=>{setChatId(id),setApprovalHandled(void 0)},[]),approval=useMemo(()=>{if(needsApproval)return{message:needsApproval,approve:enableAutoApprove=>handleApproval(!0,enableAutoApprove),reject:()=>handleApproval(!1),autoApproveEnabled:autoApprove}},[needsApproval,handleApproval,autoApprove]),tokenUsage=useMemo(()=>{let messages$1=chat$1.messages;if(messages$1.length!==0)for(let i$7=messages$1.length-1;i$7>=0;i$7--){let msg=messages$1[i$7];if(!msg||msg.role!==`assistant`||!msg.metadata||typeof msg.metadata!=`object`||!(`totalUsage`in msg.metadata))continue;let totalUsage=msg.metadata.totalUsage;if(!(!totalUsage||typeof totalUsage!=`object`)&&!(!(`inputTokens`in totalUsage)||!(`outputTokens`in totalUsage)||!(`totalTokens`in totalUsage)))return{inputTokens:totalUsage.inputTokens,outputTokens:totalUsage.outputTokens,totalTokens:totalUsage.totalTokens,cachedInputTokens:totalUsage.cachedInputTokens}}},[chat$1.messages]),showWaitingPlaceholder=useMemo(()=>{if(chat$1.status!==`streaming`)return!1;if(!chat$1.streamingMessage)return!0;let toolParts=chat$1.streamingMessage.parts.filter(isToolOrDynamicToolUIPart);return toolParts.length>0&&toolParts.every(part=>part.state.startsWith(`output-`))},[chat$1.status,chat$1.streamingMessage]);return{mode,setMode,toggleMode,chat:chat$1,chats:chatIds,switchChat,newChat,build:{status:buildStatus,error:buildError,entrypoint},devhook:{connected:devhook.status===`connected`,url:devhook.status===`connected`?devhook.url:void 0},capabilities,options:{schema:optionsSchema,selected:selectedOptions,error:optionsError,setOption:setOption$1},approval,tokenUsage,auth:auth$2,server,showWaitingPlaceholder,editModeMissingApiKey}}function L(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var O$1=L();function G(l$1){O$1=l$1}var E$1={exec:()=>null};function h$1(l$1,e$1=``){let t$1=typeof l$1==`string`?l$1:l$1.source,n$2={replace:(r$2,i$7)=>{let s$3=typeof i$7==`string`?i$7:i$7.source;return s$3=s$3.replace(m.caret,`$1`),t$1=t$1.replace(r$2,s$3),n$2},getRegex:()=>new RegExp(t$1,e$1)};return n$2}var m={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:l$1=>RegExp(`^( {0,3}${l$1})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:l$1=>RegExp(`^ {0,${Math.min(3,l$1-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:l$1=>RegExp(`^ {0,${Math.min(3,l$1-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:l$1=>RegExp(`^ {0,${Math.min(3,l$1-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:l$1=>RegExp(`^ {0,${Math.min(3,l$1-1)}}#`),htmlBeginRegex:l$1=>RegExp(`^ {0,${Math.min(3,l$1-1)}}<(?:[a-z].*>|!--)`,`i`)},xe=/^(?:[ \t]*(?:\n|$))+/,be=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Re=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,C=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Oe=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,j=/(?:[*+-]|\d{1,9}[.)])/,se=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,ie=h$1(se).replace(/bull/g,j).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,``).getRegex(),Te=h$1(se).replace(/bull/g,j).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),F=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,we=/^[^\n]+/,Q=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,ye=h$1(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,Q).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Pe=h$1(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,j).getRegex(),v=`address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul`,U=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Se=h$1(`^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))`,`i`).replace(`comment`,U).replace(`tag`,v).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),oe=h$1(F).replace(`hr`,C).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)]) `).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,v).getRegex(),K={blockquote:h$1(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,oe).getRegex(),code:be,def:ye,fences:Re,heading:Oe,hr:C,html:Se,lheading:ie,list:Pe,newline:xe,paragraph:oe,table:E$1,text:we},re=h$1(`^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)`).replace(`hr`,C).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`blockquote`,` {0,3}>`).replace(`code`,`(?: {4}| {0,3} )[^\\n]`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)]) `).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,v).getRegex(),_e={...K,lheading:Te,table:re,paragraph:h$1(F).replace(`hr`,C).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,re).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)]) `).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,v).getRegex()},Le={...K,html:h$1(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,U).replace(/tag/g,`(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b`).getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:E$1,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:h$1(F).replace(`hr`,C).replace(`heading`,` *#{1,6} *[^
|
|
466
|
+
`});let agentsMDContent=templates.scratch[`AGENTS.md`];try{agentsMDContent=await readFile(join$1(options$1.directory,`AGENTS.md`),`utf-8`)}catch{}return converted.unshift({role:`system`,content:agentsMDContent}),streamText({model:getEditModeModelOrThrow(options$1.env),messages:converted,maxOutputTokens:64e3,tools:tools$2,abortSignal,experimental_repairToolCall:({tools:tools$3,toolCall})=>{throw Object.keys(tools$3).includes(toolCall.toolName)?Error(`You have this tool, but you used an invalid input.`):Error(`Invalid tool call. Tool "${toolCall.toolName}" is not available to the EDIT AGENT.`)}})}),{agent,setUserAgentUrl:url$3=>{userAgentUrl=url$3},cleanup:()=>{tsserver&&=(tsserver.close(),void 0)}}}function getEditModeModel(env$8){if(env$8.ANTHROPIC_API_KEY)return createAnthropic({apiKey:env$8.ANTHROPIC_API_KEY}).chat(`claude-sonnet-4-5`);if(env$8.OPENAI_API_KEY)return createOpenAI({apiKey:env$8.OPENAI_API_KEY}).chat(`gpt-5`);if(env$8.AI_GATEWAY_API_KEY)return createGatewayProvider({apiKey:env$8.AI_GATEWAY_API_KEY})(`anthropic/claude-sonnet-4-5`)}function getEditModeModelOrThrow(env$8){let model=getEditModeModel(env$8);if(!model)throw Error(`No API key available for edit mode`);return model}function useEditAgent(options$1){let[client,setClient]=useState(void 0),[error$3,setError]=useState(void 0),[missingApiKey,setMissingApiKey]=useState(!1),editAgentRef=useRef(void 0);return useEffect(()=>{let controller=new AbortController,isCleanup=!1;if(setError(void 0),setClient(void 0),!getEditModeModel(options$1.env)){setMissingApiKey(!0);return}setMissingApiKey(!1);let lock$1;return(async()=>{editAgentRef.current=createEditAgent({directory:options$1.directory,env:options$1.env,getDevhookUrl:options$1.getDevhookUrl});let port$1=await getRandomPort(),server=editAgentRef.current.agent.serve({port:port$1,host:`127.0.0.1`,apiUrl:options$1.apiServerUrl});controller.signal.addEventListener(`abort`,()=>{try{server.close()}catch{}editAgentRef.current?.cleanup()});let editClient=new Client$3({baseUrl:`http://127.0.0.1:${port$1}`});for(lock$1=editClient.agentLock;!controller.signal.aborted;){try{await editClient.health();break}catch{}await new Promise(resolve$11=>setTimeout(resolve$11,100))}if(controller.signal.aborted)throw controller.signal.reason;setClient(editClient)})().catch(err=>{isCleanup||setError(err instanceof Error?err:Error(String(err)))}),()=>{isCleanup=!0,(async()=>{try{var _usingCtx$1=_usingCtx();let _writeLock=_usingCtx$1.u(await lock$1?.write());controller.abort()}catch(_$3){_usingCtx$1.e=_$3}finally{_usingCtx$1.d()}})()}},[options$1.directory,options$1.apiServerUrl,options$1.env,options$1.getDevhookUrl]),useMemo(()=>({client,error:error$3,missingApiKey,setUserAgentUrl:url$3=>{editAgentRef.current?.setUserAgentUrl(url$3)}}),[client,error$3,missingApiKey])}async function getRandomPort(){let server=createServer();return new Promise((resolve$11,reject)=>{server.listen(0,()=>{let port$1=server.address().port;resolve$11(port$1)}).on(`error`,err=>{reject(err)})}).finally(()=>{server.close()})}function useAuth(options$1={}){let{autoCheck=!0,onAuthChange,onLoginUrl,testAuthPath}=options$1,[user,setUser]=useState(),[token$1,setToken]=useState(()=>getAuthToken(testAuthPath)),[error$3,setError]=useState(),onAuthChangeRef=useRef(onAuthChange),onLoginUrlRef=useRef(onLoginUrl);useEffect(()=>{onAuthChangeRef.current=onAuthChange,onLoginUrlRef.current=onLoginUrl},[onAuthChange,onLoginUrl]);let checkAuth=useCallback(async()=>{setError(void 0);try{let currentToken=getAuthToken(testAuthPath);if(setToken(currentToken),!currentToken){setUser(void 0),onAuthChangeRef.current?.(void 0);return}let client=new Client$2({baseURL:`https://blink.so`});client.authToken=currentToken;let userInfo={email:(await client.users.me()).email};setUser(userInfo),onAuthChangeRef.current?.(userInfo)}catch(err){setUser(void 0),setError(err instanceof Error?err.message:String(err)),onAuthChangeRef.current?.(void 0)}},[testAuthPath]),login=useCallback(async()=>{setError(void 0);try{let client=new Client$2,newToken=await client.auth.token((url$3,id)=>{onLoginUrlRef.current?.(url$3,id)});client.authToken=newToken;let userData=await client.users.me();setAuthToken(newToken,testAuthPath),setToken(newToken);let userInfo={email:userData.email};return setUser(userInfo),onAuthChangeRef.current?.(userInfo),userInfo}catch(err){let errorMessage=err instanceof Error?err.message:String(err);throw setError(errorMessage),err}},[testAuthPath]),logout=useCallback(()=>{deleteAuthToken(testAuthPath),setToken(void 0),setUser(void 0),setError(void 0),onAuthChangeRef.current?.(void 0)},[testAuthPath]);return useEffect(()=>{autoCheck&&checkAuth()},[autoCheck,checkAuth]),{user,token:token$1,error:error$3,login,logout}}function useDevMode(options$1){let{directory}=options$1,[autoApprove,setAutoApprove]=useState(!1),[mode,setModeState]=useState(`run`),modeRef=useRef(`run`);useEffect(()=>{modeRef.current=mode},[mode]);let setMode=useCallback(newMode=>{setModeState(newMode),options$1.onModeChange?.(newMode)},[options$1.onModeChange]),toggleMode=useCallback(()=>{setMode(mode===`run`?`edit`:`run`)},[mode,setMode]),{error:buildError,status:buildStatus,result:buildResult,entry:entrypoint}=useBundler({directory,logger:options$1.logger,onBuildStart:options$1.onBuildStart,onBuildSuccess:options$1.onBuildSuccess,onBuildError:options$1.onBuildError}),auth$2=useAuth({autoCheck:!0,onAuthChange:options$1.onAuthChange,onLoginUrl:options$1.onLoginUrl}),dotenv=useDotenv(directory,options$1.logger),env$8=useMemo(()=>{let blinkToken=auth$2.token;return blinkToken?{...dotenv,BLINK_TOKEN:blinkToken}:dotenv},[dotenv,auth$2.token]),lastReportedKeys=useRef(void 0);useEffect(()=>{let keys=Object.keys(env$8);if(keys.length===lastReportedKeys.current||lastReportedKeys.current===void 0){lastReportedKeys.current=keys.length;return}lastReportedKeys.current=keys.length,options$1.onEnvLoaded?.(keys)},[env$8,options$1.onEnvLoaded]);let runAgentRef=useRef(void 0),server=useMemo(()=>createLocalServer({port:0,dataDirectory:join$1(directory,`.blink`),getAgent:()=>runAgentRef.current}),[directory]),{agent,logs:logs$1,error:agentError,capabilities}=useAgent({buildResult,env:env$8,apiServerUrl:server.url}),{client:editAgent,error:editAgentError,missingApiKey:editModeMissingApiKey,setUserAgentUrl}=useEditAgent({directory,apiServerUrl:server.url,env:env$8,getDevhookUrl:useCallback(()=>{let id=getDevhookID(directory)??createDevhookID(directory);return setDevhookID(id),`https://${id}.blink.host`},[directory])}),[chatId,setChatId]=useState(`00000000-0000-0000-0000-000000000000`);useEffect(()=>{runAgentRef.current=agent},[agent]),useEffect(()=>{agent&&setUserAgentUrl(agent.baseUrl),(mode===`run`&&!agent||mode===`edit`&&!editAgent)&&server.getChatManager(chatId)?.stopStreaming()},[agent,editAgent,mode,chatId,server,setUserAgentUrl]);let selectedOptionsRef=useRef(void 0),chat$1=useChat({chatId,agent:mode===`run`?agent:editAgent,chatsDirectory:server.chatsDirectory,serializeMessage:msg=>{let metadata=msg.role===`user`&&selectedOptionsRef.current?{...typeof msg.metadata==`object`&&msg.metadata!==null?msg.metadata:{},options:selectedOptionsRef.current}:msg.metadata;return typeof metadata==`object`&&metadata&&(metadata.__blink_mode=modeRef.current),{id:msg.id??crypto.randomUUID(),created_at:new Date().toISOString(),role:msg.role,parts:msg.parts,mode:modeRef.current,metadata}},filterMessages:msg=>modeRef.current===`edit`?!0:!(isStoredMessageMetadata(msg.metadata)||isLogMessage(msg)||msg.mode===`edit`),onError:error$3=>{options$1.onError?.(`${source_default.red(`⚙ [Chat Error]`)} ${source_default.gray(error$3)}`)}}),lastLogsLength=useRef(0);useEffect(()=>{if(logs$1.length===lastLogsLength.current)return;let currentLength=lastLogsLength.current;for(let log$5 of logs$1.slice(currentLength))options$1.onAgentLog?.(log$5);lastLogsLength.current=logs$1.length},[logs$1,options$1.onAgentLog,chat$1.upsertMessage]);let[chatIds,setChatIds]=useState([]);useEffect(()=>{server.listChats().then(entries$1=>{setChatIds(entries$1.map(e$1=>e$1.key))})},[server]),useEffect(()=>{chatId&&!chatIds.includes(chatId)&&setChatIds(prev=>[...prev,chatId])},[chatId,chatIds]);let[devhookID,setDevhookID]=useState(()=>hasDevhook(directory)?getDevhookID(directory):createDevhookID(directory)),devhook=useDevhook({id:devhookID,directory,logger:options$1.logger,disabled:!capabilities?.request,onRequest:async request$2=>{if(!agent)throw Error(`No agent`);let requestURL=new URL(request$2.url),agentURL=new URL(agent.baseUrl);agentURL.pathname=requestURL.pathname,agentURL.search=requestURL.search;try{let response=await fetch(agentURL.toString(),{method:request$2.method,body:request$2.body,headers:request$2.headers,redirect:`manual`,signal:request$2.signal,duplex:`half`});return options$1.onDevhookRequest?.({method:request$2.method,path:requestURL.pathname,status:response.status}),response}catch(err){return options$1.logger.error(`system`,`Error sending request to user's agent:`,err),new Response(`Internal server error`,{status:500})}}});useEffect(()=>{devhook.status!==`connected`||!devhook.url||options$1.onDevhookConnected?.(devhook.url)},[devhook.status,devhook.url]);let{schema:optionsSchema,options:selectedOptions,error:optionsError,setOption:setOption$1}=useOptions({agent:mode===`run`?agent:editAgent,capabilities,messages:chat$1.messages});useEffect(()=>{selectedOptionsRef.current=selectedOptions},[selectedOptions]);let errors=useMemo(()=>{let errorMap=new Map;return agentError&&mode===`run`&&errorMap.set(`agent`,agentError.message),editAgentError&&mode===`edit`&&errorMap.set(`editAgent`,`Edit agent error: ${editAgentError.message}`),optionsError&&errorMap.set(`options`,`Options error: ${optionsError.message}`),errorMap},[agentError,editAgentError,optionsError,mode]),prevErrorsRef=useRef(new Map);useEffect(()=>{let prev=prevErrorsRef.current,current=errors;for(let[key$1,error$3]of current.entries())prev.get(key$1)!==error$3&&options$1.onError?.(error$3);for(let key$1 of prev.keys())current.has(key$1);prevErrorsRef.current=new Map(current)},[errors,options$1.onError]);let needsApproval=useMemo(()=>{let lastMessage=[...chat$1.messages].reverse().find(message=>!(message.role!==`assistant`||message.metadata&&message.metadata.ephemeral));if(!lastMessage)return;let parts=lastMessage.parts.filter(isToolOrDynamicToolUIPart);if(parts.length!==0&&parts.some(part=>isToolApprovalOutput(part.output)&&part.output.outcome===`pending`))return lastMessage},[chat$1.messages]),approvalHandledRef=useRef(void 0),handleApproval=useCallback(async(approved,enableAutoApprove)=>{if(!needsApproval)return;enableAutoApprove&&approved&&setAutoApprove(!0);let messages$1=chat$1.messages;if(messages$1.length===0)return;let lastMsg=messages$1[messages$1.length-1];if(!lastMsg||lastMsg.role!==`assistant`||!Array.isArray(lastMsg.parts)||approvalHandledRef.current===lastMsg.id)return;approvalHandledRef.current=lastMsg.id;let updatedParts=lastMsg.parts.map(part=>part.output&&isToolApprovalOutput(part.output)&&part.output.outcome===`pending`?{...part,output:{...part.output,outcome:approved?`approved`:`rejected`}}:part);await chat$1.upsertMessage({...lastMsg,parts:updatedParts}),await chat$1.start()},[needsApproval,chat$1]);useEffect(()=>{autoApprove&&needsApproval&&handleApproval(!0)},[autoApprove,needsApproval,handleApproval]);let newChat=useCallback(()=>{let id=crypto.randomUUID();setChatId(id),setChatIds(prev=>[...prev,id])},[]),switchChat=useCallback(id=>{setChatId(id)},[]),approval=useMemo(()=>{if(needsApproval)return{message:needsApproval,approve:enableAutoApprove=>handleApproval(!0,enableAutoApprove),reject:()=>handleApproval(!1),autoApproveEnabled:autoApprove}},[needsApproval,handleApproval,autoApprove]),tokenUsage=useMemo(()=>{let messages$1=chat$1.messages;if(messages$1.length!==0)for(let i$7=messages$1.length-1;i$7>=0;i$7--){let msg=messages$1[i$7];if(!msg||msg.role!==`assistant`||!msg.metadata||typeof msg.metadata!=`object`||!(`totalUsage`in msg.metadata))continue;let totalUsage=msg.metadata.totalUsage;if(!(!totalUsage||typeof totalUsage!=`object`)&&!(!(`inputTokens`in totalUsage)||!(`outputTokens`in totalUsage)||!(`totalTokens`in totalUsage)))return{inputTokens:totalUsage.inputTokens,outputTokens:totalUsage.outputTokens,totalTokens:totalUsage.totalTokens,cachedInputTokens:totalUsage.cachedInputTokens}}},[chat$1.messages]),showWaitingPlaceholder=useMemo(()=>{if(chat$1.status!==`streaming`)return!1;if(!chat$1.streamingMessage)return!0;let toolParts=chat$1.streamingMessage.parts.filter(isToolOrDynamicToolUIPart);return toolParts.length>0&&toolParts.every(part=>part.state.startsWith(`output-`))},[chat$1.status,chat$1.streamingMessage]);return{mode,setMode,toggleMode,chat:chat$1,chats:chatIds,switchChat,newChat,build:{status:buildStatus,error:buildError,entrypoint},devhook:{connected:devhook.status===`connected`,url:devhook.status===`connected`?devhook.url:void 0},capabilities,options:{schema:optionsSchema,selected:selectedOptions,error:optionsError,setOption:setOption$1},approval,tokenUsage,auth:auth$2,server,showWaitingPlaceholder,editModeMissingApiKey}}function L(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var O$1=L();function G(l$1){O$1=l$1}var E$1={exec:()=>null};function h$1(l$1,e$1=``){let t$1=typeof l$1==`string`?l$1:l$1.source,n$2={replace:(r$2,i$7)=>{let s$3=typeof i$7==`string`?i$7:i$7.source;return s$3=s$3.replace(m.caret,`$1`),t$1=t$1.replace(r$2,s$3),n$2},getRegex:()=>new RegExp(t$1,e$1)};return n$2}var m={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:l$1=>RegExp(`^( {0,3}${l$1})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:l$1=>RegExp(`^ {0,${Math.min(3,l$1-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:l$1=>RegExp(`^ {0,${Math.min(3,l$1-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:l$1=>RegExp(`^ {0,${Math.min(3,l$1-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:l$1=>RegExp(`^ {0,${Math.min(3,l$1-1)}}#`),htmlBeginRegex:l$1=>RegExp(`^ {0,${Math.min(3,l$1-1)}}<(?:[a-z].*>|!--)`,`i`)},xe=/^(?:[ \t]*(?:\n|$))+/,be=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Re=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,C=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Oe=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,j=/(?:[*+-]|\d{1,9}[.)])/,se=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,ie=h$1(se).replace(/bull/g,j).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,``).getRegex(),Te=h$1(se).replace(/bull/g,j).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),F=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,we=/^[^\n]+/,Q=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,ye=h$1(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,Q).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Pe=h$1(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,j).getRegex(),v=`address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul`,U=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Se=h$1(`^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))`,`i`).replace(`comment`,U).replace(`tag`,v).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),oe=h$1(F).replace(`hr`,C).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)]) `).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,v).getRegex(),K={blockquote:h$1(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,oe).getRegex(),code:be,def:ye,fences:Re,heading:Oe,hr:C,html:Se,lheading:ie,list:Pe,newline:xe,paragraph:oe,table:E$1,text:we},re=h$1(`^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)`).replace(`hr`,C).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`blockquote`,` {0,3}>`).replace(`code`,`(?: {4}| {0,3} )[^\\n]`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)]) `).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,v).getRegex(),_e={...K,lheading:Te,table:re,paragraph:h$1(F).replace(`hr`,C).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,re).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace(`list`,` {0,3}(?:[*+-]|1[.)]) `).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,v).getRegex()},Le={...K,html:h$1(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,U).replace(/tag/g,`(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b`).getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:E$1,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:h$1(F).replace(`hr`,C).replace(`heading`,` *#{1,6} *[^
|
|
467
467
|
]`).replace(`lheading`,ie).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`|fences`,``).replace(`|list`,``).replace(`|html`,``).replace(`|tag`,``).getRegex()},Me=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,ze=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,ae=/^( {2,}|\\)\n(?!\s*$)/,Ae=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,D=/[\p{P}\p{S}]/u,W=/[\s\p{P}\p{S}]/u,le=/[^\s\p{P}\p{S}]/u,Ee=h$1(/^((?![*_])punctSpace)/,`u`).replace(/punctSpace/g,W).getRegex(),ue=/(?!~)[\p{P}\p{S}]/u,Ce=/(?!~)[\s\p{P}\p{S}]/u,Ie=/(?:[^\s\p{P}\p{S}]|~)/u,Be=/\[[^\[\]]*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)|`[^`]*?`|<(?! )[^<>]*?>/g,pe=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,qe=h$1(pe,`u`).replace(/punct/g,D).getRegex(),ve=h$1(pe,`u`).replace(/punct/g,ue).getRegex(),ce=`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)`,De=h$1(ce,`gu`).replace(/notPunctSpace/g,le).replace(/punctSpace/g,W).replace(/punct/g,D).getRegex(),He=h$1(ce,`gu`).replace(/notPunctSpace/g,Ie).replace(/punctSpace/g,Ce).replace(/punct/g,ue).getRegex(),Ze=h$1(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)`,`gu`).replace(/notPunctSpace/g,le).replace(/punctSpace/g,W).replace(/punct/g,D).getRegex(),Ge=h$1(/\\(punct)/,`gu`).replace(/punct/g,D).getRegex(),Ne=h$1(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace(`scheme`,/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(`email`,/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),je=h$1(U).replace(`(?:-->|$)`,`-->`).getRegex(),Fe=h$1(`^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>`).replace(`comment`,je).replace(`attribute`,/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),q$1=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`[^`]*`|[^\[\]\\`])*?/,Qe=h$1(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace(`label`,q$1).replace(`href`,/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace(`title`,/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),he=h$1(/^!?\[(label)\]\[(ref)\]/).replace(`label`,q$1).replace(`ref`,Q).getRegex(),de=h$1(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,Q).getRegex(),Ue=h$1(`reflink|nolink(?!\\()`,`g`).replace(`reflink`,he).replace(`nolink`,de).getRegex(),X={_backpedal:E$1,anyPunctuation:Ge,autolink:Ne,blockSkip:Be,br:ae,code:ze,del:E$1,emStrongLDelim:qe,emStrongRDelimAst:De,emStrongRDelimUnd:Ze,escape:Me,link:Qe,nolink:de,punctuation:Ee,reflink:he,reflinkSearch:Ue,tag:Fe,text:Ae,url:E$1},Ke={...X,link:h$1(/^!?\[(label)\]\((.*?)\)/).replace(`label`,q$1).getRegex(),reflink:h$1(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace(`label`,q$1).getRegex()},N={...X,emStrongRDelimAst:He,emStrongLDelim:ve,url:h$1(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,`i`).replace(`email`,/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/},We={...N,br:h$1(ae).replace(`{2,}`,`*`).getRegex(),text:h$1(N.text).replace(`\\b_`,`\\b_| {2,}\\n`).replace(/\{2,\}/g,`*`).getRegex()},I$1={normal:K,gfm:_e,pedantic:Le},M={normal:X,gfm:N,breaks:We,pedantic:Ke},Xe={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`},ke=l$1=>Xe[l$1];function w(l$1,e$1){if(e$1){if(m.escapeTest.test(l$1))return l$1.replace(m.escapeReplace,ke)}else if(m.escapeTestNoEncode.test(l$1))return l$1.replace(m.escapeReplaceNoEncode,ke);return l$1}function J(l$1){try{l$1=encodeURI(l$1).replace(m.percentDecode,`%`)}catch{return null}return l$1}function V$1(l$1,e$1){let n$2=l$1.replace(m.findPipe,(i$7,s$3,o$2)=>{let a$2=!1,u$17=s$3;for(;--u$17>=0&&o$2[u$17]===`\\`;)a$2=!a$2;return a$2?`|`:` |`}).split(m.splitPipe),r$2=0;if(n$2[0].trim()||n$2.shift(),n$2.length>0&&!n$2.at(-1)?.trim()&&n$2.pop(),e$1)if(n$2.length>e$1)n$2.splice(e$1);else for(;n$2.length<e$1;)n$2.push(``);for(;r$2<n$2.length;r$2++)n$2[r$2]=n$2[r$2].trim().replace(m.slashPipe,`|`);return n$2}function z$3(l$1,e$1,t$1){let n$2=l$1.length;if(n$2===0)return``;let r$2=0;for(;r$2<n$2;){let i$7=l$1.charAt(n$2-r$2-1);if(i$7===e$1&&!t$1)r$2++;else if(i$7!==e$1&&t$1)r$2++;else break}return l$1.slice(0,n$2-r$2)}function ge(l$1,e$1){if(l$1.indexOf(e$1[1])===-1)return-1;let t$1=0;for(let n$2=0;n$2<l$1.length;n$2++)if(l$1[n$2]===`\\`)n$2++;else if(l$1[n$2]===e$1[0])t$1++;else if(l$1[n$2]===e$1[1]&&(t$1--,t$1<0))return n$2;return t$1>0?-2:-1}function fe(l$1,e$1,t$1,n$2,r$2){let i$7=e$1.href,s$3=e$1.title||null,o$2=l$1[1].replace(r$2.other.outputLinkReplace,`$1`);n$2.state.inLink=!0;let a$2={type:l$1[0].charAt(0)===`!`?`image`:`link`,raw:t$1,href:i$7,title:s$3,text:o$2,tokens:n$2.inlineTokens(o$2)};return n$2.state.inLink=!1,a$2}function Je(l$1,e$1,t$1){let n$2=l$1.match(t$1.other.indentCodeCompensation);if(n$2===null)return e$1;let r$2=n$2[1];return e$1.split(`
|
|
468
468
|
`).map(i$7=>{let s$3=i$7.match(t$1.other.beginningSpace);if(s$3===null)return i$7;let[o$2]=s$3;return o$2.length>=r$2.length?i$7.slice(r$2.length):i$7}).join(`
|
|
469
469
|
`)}var y$1=class{options;rules;lexer;constructor(e$1){this.options=e$1||O$1}space(e$1){let t$1=this.rules.block.newline.exec(e$1);if(t$1&&t$1[0].length>0)return{type:`space`,raw:t$1[0]}}code(e$1){let t$1=this.rules.block.code.exec(e$1);if(t$1){let n$2=t$1[0].replace(this.rules.other.codeRemoveIndent,``);return{type:`code`,raw:t$1[0],codeBlockStyle:`indented`,text:this.options.pedantic?n$2:z$3(n$2,`
|
|
@@ -1911,6 +1911,6 @@ const SCREEN_READER_USER_PREFIX=`User: `,InputPrompt=({buffer:buffer$2,onSubmit,
|
|
|
1911
1911
|
`)&&(textToInsert+=` `),buffer$2.replaceRangeByOffset(offset,offset,textToInsert)}}}catch(error$3){console.error(`Error handling clipboard image:`,error$3)}},[buffer$2,config]),handleInput=useCallback(key$1=>{if(!(!focus&&!key$1.paste)){if(key$1.paste){setRecentPasteTime(Date.now()),pasteTimeoutRef.current&&clearTimeout(pasteTimeoutRef.current),pasteTimeoutRef.current=setTimeout(()=>{setRecentPasteTime(null),pasteTimeoutRef.current=null},500),buffer$2.handleInput(key$1);return}if(!(vimHandleInput&&vimHandleInput(key$1))){if(key$1.name!==`escape`&&(escPressCount>0||showEscapePrompt)&&resetEscapeState(),key$1.sequence===`!`&&buffer$2.text===``&&!completion.showSuggestions){setShellModeActive(!shellModeActive),buffer$2.setText(``);return}if(keyMatchers[Command.ESCAPE](key$1)){if(reverseSearchActive){setReverseSearchActive(!1),reverseSearchCompletion.resetCompletionState(),buffer$2.setText(textBeforeReverseSearch);let offset=logicalPosToOffset(buffer$2.lines,cursorPosition[0],cursorPosition[1]);buffer$2.moveToOffset(offset);return}if(shellModeActive){setShellModeActive(!1),resetEscapeState();return}if(completion.showSuggestions){completion.resetCompletionState(),resetEscapeState();return}if(escPressCount===0){if(buffer$2.text===``)return;setEscPressCount(1),setShowEscapePrompt(!0),escapeTimerRef.current&&clearTimeout(escapeTimerRef.current),escapeTimerRef.current=setTimeout(()=>{resetEscapeState()},500)}else buffer$2.setText(``),resetCompletionState(),resetEscapeState();return}if(shellModeActive&&keyMatchers[Command.REVERSE_SEARCH](key$1)){setReverseSearchActive(!0),setTextBeforeReverseSearch(buffer$2.text),setCursorPosition(buffer$2.cursor);return}if(keyMatchers[Command.CLEAR_SCREEN](key$1)){onClearScreen();return}if(reverseSearchActive){let{activeSuggestionIndex,navigateUp,navigateDown,showSuggestions,suggestions}=reverseSearchCompletion;if(showSuggestions){if(keyMatchers[Command.NAVIGATION_UP](key$1)){navigateUp();return}if(keyMatchers[Command.NAVIGATION_DOWN](key$1)){navigateDown();return}if(keyMatchers[Command.ACCEPT_SUGGESTION_REVERSE_SEARCH](key$1)){reverseSearchCompletion.handleAutocomplete(activeSuggestionIndex),reverseSearchCompletion.resetCompletionState(),setReverseSearchActive(!1);return}}if(keyMatchers[Command.SUBMIT_REVERSE_SEARCH](key$1)){let textToSubmit=showSuggestions&&activeSuggestionIndex>-1?suggestions[activeSuggestionIndex].value:buffer$2.text;handleSubmitAndClear(textToSubmit),reverseSearchCompletion.resetCompletionState(),setReverseSearchActive(!1);return}if(keyMatchers[Command.NAVIGATION_UP](key$1)||keyMatchers[Command.NAVIGATION_DOWN](key$1))return}if(completion.isPerfectMatch&&keyMatchers[Command.RETURN](key$1)){handleSubmitAndClear(buffer$2.text);return}if(completion.showSuggestions){if(completion.suggestions.length>1){if(keyMatchers[Command.COMPLETION_UP](key$1)){completion.navigateUp();return}if(keyMatchers[Command.COMPLETION_DOWN](key$1)){completion.navigateDown();return}}if(keyMatchers[Command.ACCEPT_SUGGESTION](key$1)){if(completion.suggestions.length>0){let targetIndex=completion.activeSuggestionIndex===-1?0:completion.activeSuggestionIndex;targetIndex<completion.suggestions.length&&completion.handleAutocomplete(targetIndex)}return}}if(key$1.name===`tab`&&!completion.showSuggestions&&completion.promptCompletion.text){completion.promptCompletion.accept();return}if(shellModeActive){if(keyMatchers[Command.NAVIGATION_UP](key$1)){let prevCommand=shellHistory.getPreviousCommand();prevCommand!==null&&buffer$2.setText(prevCommand);return}if(keyMatchers[Command.NAVIGATION_DOWN](key$1)){let nextCommand=shellHistory.getNextCommand();nextCommand!==null&&buffer$2.setText(nextCommand);return}}else{if(keyMatchers[Command.HISTORY_UP](key$1)){inputHistory.navigateUp();return}if(keyMatchers[Command.HISTORY_DOWN](key$1)){inputHistory.navigateDown();return}if(keyMatchers[Command.NAVIGATION_UP](key$1)&&(buffer$2.allVisualLines.length===1||buffer$2.visualCursor[0]===0&&buffer$2.visualScrollRow===0)){inputHistory.navigateUp();return}if(keyMatchers[Command.NAVIGATION_DOWN](key$1)&&(buffer$2.allVisualLines.length===1||buffer$2.visualCursor[0]===buffer$2.allVisualLines.length-1)){inputHistory.navigateDown();return}}if(keyMatchers[Command.SUBMIT](key$1)){if(buffer$2.text.trim()){if(recentPasteTime!==null)return;let[row,col]=buffer$2.cursor,line$1=buffer$2.lines[row];(col>0?cpSlice(line$1,col-1,col):``)===`\\`?(buffer$2.backspace(),buffer$2.newline()):handleSubmitAndClear(buffer$2.text)}return}if(keyMatchers[Command.NEWLINE](key$1)){buffer$2.newline();return}if(keyMatchers[Command.HOME](key$1)){buffer$2.move(`home`);return}if(keyMatchers[Command.END](key$1)){buffer$2.move(`end`);return}if(keyMatchers[Command.CLEAR_INPUT](key$1)){buffer$2.text.length>0&&(buffer$2.setText(``),resetCompletionState());return}if(keyMatchers[Command.KILL_LINE_RIGHT](key$1)){buffer$2.killLineRight();return}if(keyMatchers[Command.KILL_LINE_LEFT](key$1)){buffer$2.killLineLeft();return}if(keyMatchers[Command.DELETE_WORD_BACKWARD](key$1)){buffer$2.deleteWordLeft();return}if(keyMatchers[Command.OPEN_EXTERNAL_EDITOR](key$1)){buffer$2.openInExternalEditor();return}if(keyMatchers[Command.PASTE_CLIPBOARD_IMAGE](key$1)){handleClipboardImage();return}buffer$2.handleInput(key$1),completion.promptCompletion.text&&key$1.sequence&&key$1.sequence.length===1&&!key$1.ctrl&&!key$1.meta&&completion.promptCompletion.clear()}}},[focus,buffer$2,completion,shellModeActive,setShellModeActive,onClearScreen,inputHistory,handleSubmitAndClear,shellHistory,reverseSearchCompletion,handleClipboardImage,resetCompletionState,escPressCount,showEscapePrompt,resetEscapeState,vimHandleInput,reverseSearchActive,textBeforeReverseSearch,cursorPosition,recentPasteTime]);useKeypress(handleInput,{isActive:!0});let linesToRender=buffer$2.viewportVisualLines,[cursorVisualRowAbsolute,cursorVisualColAbsolute]=buffer$2.visualCursor,scrollVisualRow=buffer$2.visualScrollRow,{inlineGhost,additionalLines}=useCallback(()=>{if(!completion.promptCompletion.text||!buffer$2.text||!completion.promptCompletion.text.startsWith(buffer$2.text))return{inlineGhost:``,additionalLines:[]};let ghostSuffix=completion.promptCompletion.text.slice(buffer$2.text.length);if(!ghostSuffix)return{inlineGhost:``,additionalLines:[]};let currentLogicalLine=buffer$2.lines[buffer$2.cursor[0]]||``,cursorCol=buffer$2.cursor[1],textBeforeCursor=cpSlice(currentLogicalLine,0,cursorCol),usedWidth=stringWidth(textBeforeCursor),remainingWidth=Math.max(0,inputWidth-usedWidth),ghostTextLinesRaw=ghostSuffix.split(`
|
|
1912
1912
|
`),firstLineRaw=ghostTextLinesRaw.shift()||``,inlineGhost$1=``,remainingFirstLine=``;if(stringWidth(firstLineRaw)<=remainingWidth)inlineGhost$1=firstLineRaw;else{let words$1=firstLineRaw.split(` `),currentLine=``,wordIdx=0;for(let word of words$1){let prospectiveLine=currentLine?`${currentLine} ${word}`:word;if(stringWidth(prospectiveLine)>remainingWidth)break;currentLine=prospectiveLine,wordIdx++}inlineGhost$1=currentLine,words$1.length>wordIdx&&(remainingFirstLine=words$1.slice(wordIdx).join(` `))}let linesToWrap=[];remainingFirstLine&&linesToWrap.push(remainingFirstLine),linesToWrap.push(...ghostTextLinesRaw);let remainingGhostText=linesToWrap.join(`
|
|
1913
1913
|
`),additionalLines$1=[];if(remainingGhostText){let textLines=remainingGhostText.split(`
|
|
1914
|
-
`);for(let textLine of textLines){let words$1=textLine.split(` `),currentLine=``;for(let word of words$1){let prospectiveLine=currentLine?`${currentLine} ${word}`:word;if(stringWidth(prospectiveLine)>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])();return jsxs(Fragment,{children:[jsxs(Box_default,{borderStyle:`round`,borderColor:borderColor??(shellModeActive?theme.status.warning:focus?theme.border.focused:theme.border.default),paddingX:1,children:[jsx(Text,{color:shellModeActive?theme.status.warning:theme.text.accent,children:shellModeActive?reverseSearchActive?jsxs(Text,{color:theme.text.link,"aria-label":`User: `,children:[`(r:)`,` `]}):`! `:`> `}),jsx(Box_default,{flexGrow:1,flexDirection:`column`,children:buffer$2.text.length===0&&placeholder?focus?jsxs(Text,{children:[source_default.inverse(placeholder.slice(0,1)),jsx(Text,{color:theme.text.secondary,children:placeholder.slice(1)})]}):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(jsx(Text,{color,children:display},`token-${tokenIdx}`))});let currentLineGhost=isOnCursorLine?inlineGhost:``;isOnCursorLine&&cursorVisualColAbsolute===cpLen(lineText)&&(currentLineGhost||renderedLine.push(jsx(Text,{children:source_default.inverse(` `)},`cursor-end-${cursorVisualColAbsolute}`)));let showCursorBeforeGhost=focus&&isOnCursorLine&&cursorVisualColAbsolute===cpLen(lineText)&¤tLineGhost;return jsx(Box_default,{height:1,children:jsxs(Text,{children:[renderedLine,showCursorBeforeGhost&&source_default.inverse(` `),currentLineGhost&&jsx(Text,{color:theme.text.secondary,children:currentLineGhost})]})},`line-${visualIdxInRenderedSet}`)}).concat(additionalLines.map((ghostLine,index)=>{let padding=Math.max(0,inputWidth-stringWidth(ghostLine));return jsxs(Text,{color:theme.text.secondary,children:[ghostLine,` `.repeat(padding)]},`ghost-line-${index}`)}))})]}),completion.showSuggestions&&jsx(Box_default,{paddingRight:2,children:jsx(SuggestionsDisplay,{suggestions:completion.suggestions,activeIndex:completion.activeSuggestionIndex,isLoading:completion.isLoadingSuggestions,width:suggestionsWidth,scrollOffset:completion.visibleStartIndex,userInput:buffer$2.text})}),reverseSearchActive&&jsx(Box_default,{paddingRight:2,children:jsx(SuggestionsDisplay,{suggestions:reverseSearchCompletion.suggestions,activeIndex:reverseSearchCompletion.activeSuggestionIndex,isLoading:reverseSearchCompletion.isLoadingSuggestions,width:suggestionsWidth,scrollOffset:reverseSearchCompletion.visibleStartIndex,userInput:buffer$2.text})})]})},ENABLE_BRACKETED_PASTE=`\x1B[?2004h`,DISABLE_BRACKETED_PASTE=`\x1B[?2004l`,useBracketedPaste=()=>{let cleanup=()=>{process.stdout.write(`\x1B[?2004l`)};useEffect(()=>(process.stdout.write(`\x1B[?2004h`),process.on(`exit`,cleanup),process.on(`SIGINT`,cleanup),process.on(`SIGTERM`,cleanup),()=>{cleanup(),process.removeListener(`exit`,cleanup),process.removeListener(`SIGINT`,cleanup),process.removeListener(`SIGTERM`,cleanup)}),[])};function createMinimalConfig(){return new Config({sessionId:`blink`,targetDir:process.cwd(),cwd:process.cwd(),debugMode:!1,model:`gemini-1.5-flash`,telemetry:{enabled:!1}})}const convertToCommands=slashCommands=>slashCommands.map(cmd=>({name:cmd.name,altNames:cmd.altNames,description:cmd.description,kind:`built-in`,completion:async(context,partialArg)=>cmd.completion?.(partialArg)??[],subCommands:cmd.subcommands?convertToCommands(cmd.subcommands):void 0}));function TextInput({onSubmit,placeholder,slashCommands,onLayoutChange,borderColor}){let config=useMemo(()=>createMinimalConfig(),[]),[userMessages,setUserMessages]=useState([]),{stdout:stdout$1}=use_stdout_default(),[isSlashOpen,setIsSlashOpen]=useState(!1),inputWidth=stdout$1.columns,buffer$2=useTextBuffer({viewport:{width:inputWidth-6,height:stdout$1.rows-15},isValidPath:filePath=>fs$1.existsSync(filePath),onChange:value=>{value.startsWith(`/`)?setIsSlashOpen(!0):setIsSlashOpen(prev=>(prev&&onLayoutChange?.(),!1))}}),commands=useMemo(()=>convertToCommands(slashCommands??[]),[slashCommands]);return jsx(Box_default,{marginBottom:isSlashOpen?1:0,flexDirection:`column`,children:jsx(InputPrompt,{borderColor,buffer:buffer$2,onSubmit:value=>{let args=value.trim().split(` `),first$1=args[0];if(first$1&&first$1.startsWith(`/`)){let commandName=first$1.slice(1),commandIndex=slashCommands?.findIndex(c$3=>c$3.name===commandName||(c$3.altNames?c$3.altNames.includes(commandName):!1))??-1;if(commandIndex!==-1&&slashCommands){let root$31=slashCommands[commandIndex],rest=args.slice(1),execute=(cmd,remaining)=>{if(remaining.length>0&&cmd.subcommands&&cmd.subcommands.length>0){let subName=remaining[0],next=cmd.subcommands.find(sc=>sc.name===subName||(sc.altNames?sc.altNames.includes(subName):!1));if(next)return execute(next,remaining.slice(1))}cmd.action(remaining.join(` `))};execute(root$31,rest);return}}setUserMessages(prev=>[value,...prev]),onSubmit(value)},placeholder,userMessages,onClearScreen:()=>{},config,slashCommands:commands,commandContext:{services:{config,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:inputWidth-2,suggestionsWidth:inputWidth-2,shellModeActive:!1,setShellModeActive:()=>{}})})}function KeypressProvider({children}){let config=useMemo(()=>createMinimalConfig(),[]);return useBracketedPaste(),jsx(KeypressProvider$1,{kittyProtocolEnabled:!0,config,children})}var text_input_default=TextInput;function useTerminalSize(){let{stdout:stdout$1}=use_stdout_default(),[size,setSize]=useState({columns:process.stdout.columns,rows:process.stdout.rows});return 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}}function checkAndMarkFirstRun(directory){let storagePath=join$1(directory,`.blink`,`.first-run`);return mkdirSync$1(dirname$1(storagePath),{recursive:!0}),existsSync$1(storagePath)?!1:(writeFileSync$1(storagePath,new Date().toISOString()),!0)}const colors={run:`#1f86ed`,edit:`#e8900e`};async function startDev({directory}){await render_default(jsx(Root,{directory}),{exitOnCtrlC:!1}).waitUntilExit()}const Root=({directory})=>{let[logger$5,setLogger$3]=useState(new Logger(async(level$1,...message)=>{console[level$1](...message)}));return jsx(KeypressProvider,{children:jsx(LoggerContext.Provider,{value:logger$5,children:jsx(App,{directory})})})},App=({directory})=>{let size=useTerminalSize(),[isFirstRun]=useState(()=>checkAndMarkFirstRun(directory)),logger$5=useLogger(),dev$1=useDevMode({directory,logger:logger$5,onBuildStart:()=>{logger$5.log(`system`,source_default.gray(`⚙ Compiling...`))},onBuildSuccess:result=>{logger$5.log(`system`,source_default.green(`⚙ Compiled in ${Math.round(result.duration)}ms`))},onBuildError:error$3=>{logger$5.error(`system`,`${source_default.red(`⚙ [Build Error]`)} ${source_default.gray(error$3.message)}${error$3.file?source_default.bold(` (${error$3.file})`):``}`)},onEnvLoaded:keys=>{let keysText=keys.map(key$1=>source_default.dim(key$1)).join(`, `);keysText.length===0&&(keysText=source_default.dim(`(none)`)),logger$5.log(`system`,source_default.gray(`⚙ Loaded .env.local:`),keysText)},onDevhookConnected:url$3=>{logger$5.log(`system`,source_default.gray(`⚙ Send webhooks from anywhere: ${url$3}`))},onAgentLog:log$5=>{log$5.level===`error`?logger$5.error(`agent`,log$5.message):logger$5.log(`agent`,log$5.message)},onDevhookRequest:request$2=>{logger$5.log(`system`,source_default.blue(`↩ `)+source_default.gray(`method=${request$2.method} path=${request$2.path} status=${request$2.status}`))},onError:error$3=>{logger$5.error(`system`,error$3)},onModeChange:mode=>{switch(mode){case`edit`:logger$5.log(`system`,source_default.hex(colors.edit).bold(`✎ entering edit mode`)+`
|
|
1914
|
+
`);for(let textLine of textLines){let words$1=textLine.split(` `),currentLine=``;for(let word of words$1){let prospectiveLine=currentLine?`${currentLine} ${word}`:word;if(stringWidth(prospectiveLine)>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])();return jsxs(Fragment,{children:[jsxs(Box_default,{borderStyle:`round`,borderColor:borderColor??(shellModeActive?theme.status.warning:focus?theme.border.focused:theme.border.default),paddingX:1,children:[jsx(Text,{color:shellModeActive?theme.status.warning:theme.text.accent,children:shellModeActive?reverseSearchActive?jsxs(Text,{color:theme.text.link,"aria-label":`User: `,children:[`(r:)`,` `]}):`! `:`> `}),jsx(Box_default,{flexGrow:1,flexDirection:`column`,children:buffer$2.text.length===0&&placeholder?focus?jsxs(Text,{children:[source_default.inverse(placeholder.slice(0,1)),jsx(Text,{color:theme.text.secondary,children:placeholder.slice(1)})]}):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(jsx(Text,{color,children:display},`token-${tokenIdx}`))});let currentLineGhost=isOnCursorLine?inlineGhost:``;isOnCursorLine&&cursorVisualColAbsolute===cpLen(lineText)&&(currentLineGhost||renderedLine.push(jsx(Text,{children:source_default.inverse(` `)},`cursor-end-${cursorVisualColAbsolute}`)));let showCursorBeforeGhost=focus&&isOnCursorLine&&cursorVisualColAbsolute===cpLen(lineText)&¤tLineGhost;return jsx(Box_default,{height:1,children:jsxs(Text,{children:[renderedLine,showCursorBeforeGhost&&source_default.inverse(` `),currentLineGhost&&jsx(Text,{color:theme.text.secondary,children:currentLineGhost})]})},`line-${visualIdxInRenderedSet}`)}).concat(additionalLines.map((ghostLine,index)=>{let padding=Math.max(0,inputWidth-stringWidth(ghostLine));return jsxs(Text,{color:theme.text.secondary,children:[ghostLine,` `.repeat(padding)]},`ghost-line-${index}`)}))})]}),completion.showSuggestions&&jsx(Box_default,{paddingRight:2,children:jsx(SuggestionsDisplay,{suggestions:completion.suggestions,activeIndex:completion.activeSuggestionIndex,isLoading:completion.isLoadingSuggestions,width:suggestionsWidth,scrollOffset:completion.visibleStartIndex,userInput:buffer$2.text})}),reverseSearchActive&&jsx(Box_default,{paddingRight:2,children:jsx(SuggestionsDisplay,{suggestions:reverseSearchCompletion.suggestions,activeIndex:reverseSearchCompletion.activeSuggestionIndex,isLoading:reverseSearchCompletion.isLoadingSuggestions,width:suggestionsWidth,scrollOffset:reverseSearchCompletion.visibleStartIndex,userInput:buffer$2.text})})]})},ENABLE_BRACKETED_PASTE=`\x1B[?2004h`,DISABLE_BRACKETED_PASTE=`\x1B[?2004l`,useBracketedPaste=()=>{let cleanup=()=>{process.stdout.write(`\x1B[?2004l`)};useEffect(()=>(process.stdout.write(`\x1B[?2004h`),process.on(`exit`,cleanup),process.on(`SIGINT`,cleanup),process.on(`SIGTERM`,cleanup),()=>{cleanup(),process.removeListener(`exit`,cleanup),process.removeListener(`SIGINT`,cleanup),process.removeListener(`SIGTERM`,cleanup)}),[])};function createMinimalConfig(){return new Config({sessionId:`blink`,targetDir:process.cwd(),cwd:process.cwd(),debugMode:!1,model:`gemini-1.5-flash`,telemetry:{enabled:!1}})}const convertToCommands=slashCommands=>slashCommands.map(cmd=>({name:cmd.name,altNames:cmd.altNames,description:cmd.description,kind:`built-in`,completion:async(context,partialArg)=>cmd.completion?.(partialArg)??[],subCommands:cmd.subcommands?convertToCommands(cmd.subcommands):void 0}));function TextInput({onSubmit,placeholder,slashCommands,onLayoutChange,borderColor,visible}){let config=useMemo(()=>createMinimalConfig(),[]),[userMessages,setUserMessages]=useState([]),{stdout:stdout$1}=use_stdout_default(),[isSlashOpen,setIsSlashOpen]=useState(!1),inputWidth=stdout$1.columns,buffer$2=useTextBuffer({viewport:{width:inputWidth-6,height:stdout$1.rows-15},isValidPath:filePath=>fs$1.existsSync(filePath),onChange:value=>{value.startsWith(`/`)?setIsSlashOpen(!0):setIsSlashOpen(prev=>(prev&&onLayoutChange?.(),!1))}}),commands=useMemo(()=>convertToCommands(slashCommands??[]),[slashCommands]);return visible?jsx(Box_default,{marginBottom:isSlashOpen?1:0,flexDirection:`column`,children:jsx(InputPrompt,{borderColor,buffer:buffer$2,onSubmit:value=>{let args=value.trim().split(` `),first$1=args[0];if(first$1&&first$1.startsWith(`/`)){let commandName=first$1.slice(1),commandIndex=slashCommands?.findIndex(c$3=>c$3.name===commandName||(c$3.altNames?c$3.altNames.includes(commandName):!1))??-1;if(commandIndex!==-1&&slashCommands){let root$31=slashCommands[commandIndex],rest=args.slice(1),execute=(cmd,remaining)=>{if(remaining.length>0&&cmd.subcommands&&cmd.subcommands.length>0){let subName=remaining[0],next=cmd.subcommands.find(sc=>sc.name===subName||(sc.altNames?sc.altNames.includes(subName):!1));if(next)return execute(next,remaining.slice(1))}cmd.action(remaining.join(` `))};execute(root$31,rest);return}}setUserMessages(prev=>[value,...prev]),onSubmit(value)},placeholder,userMessages,onClearScreen:()=>{},config,slashCommands:commands,commandContext:{services:{config,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:inputWidth-2,suggestionsWidth:inputWidth-2,shellModeActive:!1,setShellModeActive:()=>{}})}):null}function KeypressProvider({children}){let config=useMemo(()=>createMinimalConfig(),[]);return useBracketedPaste(),jsx(KeypressProvider$1,{kittyProtocolEnabled:!0,config,children})}var text_input_default=TextInput;function useTerminalSize(){let{stdout:stdout$1}=use_stdout_default(),[size,setSize]=useState({columns:process.stdout.columns,rows:process.stdout.rows});return 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}}function checkAndMarkFirstRun(directory){let storagePath=join$1(directory,`.blink`,`.first-run`);return mkdirSync$1(dirname$1(storagePath),{recursive:!0}),existsSync$1(storagePath)?!1:(writeFileSync$1(storagePath,new Date().toISOString()),!0)}const colors={run:`#1f86ed`,edit:`#e8900e`};async function startDev({directory}){await render_default(jsx(Root,{directory}),{exitOnCtrlC:!1}).waitUntilExit()}const Root=({directory})=>{let[logger$5,setLogger$3]=useState(new Logger(async(level$1,...message)=>{console[level$1](...message)}));return jsx(KeypressProvider,{children:jsx(LoggerContext.Provider,{value:logger$5,children:jsx(App,{directory})})})},App=({directory})=>{let size=useTerminalSize(),[isFirstRun]=useState(()=>checkAndMarkFirstRun(directory)),logger$5=useLogger(),dev$1=useDevMode({directory,logger:logger$5,onBuildStart:()=>{logger$5.log(`system`,source_default.gray(`⚙ Compiling...`))},onBuildSuccess:result=>{logger$5.log(`system`,source_default.green(`⚙ Compiled in ${Math.round(result.duration)}ms`))},onBuildError:error$3=>{logger$5.error(`system`,`${source_default.red(`⚙ [Build Error]`)} ${source_default.gray(error$3.message)}${error$3.file?source_default.bold(` (${error$3.file})`):``}`)},onEnvLoaded:keys=>{let keysText=keys.map(key$1=>source_default.dim(key$1)).join(`, `);keysText.length===0&&(keysText=source_default.dim(`(none)`)),logger$5.log(`system`,source_default.gray(`⚙ Loaded .env.local:`),keysText)},onDevhookConnected:url$3=>{logger$5.log(`system`,source_default.gray(`⚙ Send webhooks from anywhere: ${url$3}`))},onAgentLog:log$5=>{log$5.level===`error`?logger$5.error(`agent`,log$5.message):logger$5.log(`agent`,log$5.message)},onDevhookRequest:request$2=>{logger$5.log(`system`,source_default.blue(`↩ `)+source_default.gray(`method=${request$2.method} path=${request$2.path} status=${request$2.status}`))},onError:error$3=>{logger$5.error(`system`,error$3)},onModeChange:mode=>{switch(mode){case`edit`:logger$5.log(`system`,source_default.hex(colors.edit).bold(`✎ entering edit mode`)+`
|
|
1915
1915
|
`);break;case`run`:logger$5.log(`system`,source_default.hex(colors.run).bold(`⟳ entering run mode`)+`
|
|
1916
|
-
`);break}}});useEffect(()=>{logger$5.setPrintLog((level$1,source$39,...message)=>dev$1.chat.queueLogMessage({message:util.format(...message),level:level$1,source:source$39}))},[dev$1.chat.queueLogMessage,logger$5]);let{exit}=use_app_default(),[exitArmed,setExitArmed]=useState(!1),exitTimerRef=useRef(void 0);useEffect(()=>()=>{exitTimerRef.current&&clearTimeout(exitTimerRef.current)},[]),use_input_default(async(input,key$1)=>{if(key$1.ctrl&&input.toLowerCase()===`c`){if(exitArmed){exit();return}setExitArmed(!0),exitTimerRef.current&&clearTimeout(exitTimerRef.current),exitTimerRef.current=setTimeout(()=>setExitArmed(!1),2e3)}key$1.ctrl&&input===`r`&&(await dev$1.chat.resetChat(),resetTerminal()),key$1.ctrl&&input===`t`&&dev$1.toggleMode(),key$1.ctrl&&input===`n`&&dev$1.newChat(),key$1.escape&&dev$1.chat.stopStreaming()});let keymaps=useMemo(()=>({"⏎":`send`,"Ctrl+T":`toggle mode`,"Ctrl+N":`new chat`,"Ctrl+C":`quit`}),[]),keybindSuggestion=useMemo(()=>{if(exitArmed)return`Ctrl+C again to quit`;if(dev$1.chat.queuedMessages.length>0)return`${dev$1.chat.queuedMessages.length} message(s) queued - Press [Escape] to stop and process queue`;if(dev$1.chat.status===`streaming`)return`Press [Escape] to stop the agent!`},[exitArmed,dev$1.chat.status,dev$1.chat.queuedMessages.length]),{write:write$1}=use_stdout_default(),[epoch,setEpoch]=useState(0),resetTerminal=useCallback(()=>{write$1(clearTerminal),setEpoch(prev=>prev+1)},[write$1]),initialSizeRef=useRef(size);useEffect(()=>{(initialSizeRef.current.columns!==size.columns||initialSizeRef.current.rows!==size.rows)&&(resetTerminal(),initialSizeRef.current=size)},[size.columns,size.rows,resetTerminal]),useEffect(()=>{resetTerminal()},[dev$1.chat.id,resetTerminal]);let optionCommand=useMemo(()=>{if(dev$1.options.schema)return{name:`option`,description:`Adjust your agent's options.`,action:()=>{},completion:async()=>Object.keys(dev$1.options.schema),subcommands:Object.entries(dev$1.options.schema).map(([key$1,value])=>({name:key$1,description:value.label??``,action:args=>{dev$1.options.setOption(key$1,args)},completion:async partialArg=>value.values.map(v$1=>v$1.id)}))}},[dev$1.options]),lastMessageWithApproval=useMemo(()=>{if(dev$1.chat.messages.length===0)return null;let lastMsg=dev$1.chat.messages[dev$1.chat.messages.length-1];return lastMsg.parts.some(part=>isToolOrDynamicToolUIPart(part)&&isToolApprovalOutput(part.output))?lastMsg:null},[dev$1.chat.messages]),staticMessages=useMemo(()=>lastMessageWithApproval?dev$1.chat.messages.slice(0,-1):dev$1.chat.messages,[dev$1.chat.messages,lastMessageWithApproval]);return dev$1.chat.loading?null:jsxs(Fragment,{children:[dev$1.mode===`edit`&&dev$1.editModeMissingApiKey?jsx(MissingApiKeyMessage,{}):null,jsxs(Box_default,{flexDirection:`column`,children:[jsx(Static,{items:[{},...staticMessages],children:(message,index)=>index===0?jsxs(Box_default,{flexDirection:`column`,marginBottom:1,children:[jsxs(Box_default,{children:[jsx(Text,{bold:!0,children:`blink■`}),jsx(Text,{color:`gray`,children:` agent development`})]}),isFirstRun&&jsx(OnboardingMessage,{}),jsxs(Box_default,{marginTop:1,flexDirection:`column`,children:[jsxs(Text,{color:`gray`,children:[`Edit `,dev$1.build.entrypoint,` to hot-reload your agent.`]}),jsxs(Text,{color:`gray`,children:[`Run `,jsx(Text,{color:`blue`,children:`blink deploy`}),` to use your agent in the cloud.`]}),jsxs(Text,{color:`gray`,children:[`Type`,` `,jsx(Text,{bold:!0,color:`cyan`,children:`/help`}),` `,`to see the full guide on how to build, test, and deploy your agent.`]})]})]},`banner`):jsx(Message,{message,previousMessage:index>1?staticMessages.at(index-2):void 0,nextMessage:index<staticMessages.length-2?staticMessages.at(index+2):void 0,maxWidth:size.columns-2},`${message.id}-${index}`)},`messages-${dev$1.chat.id}-${epoch}`),lastMessageWithApproval?jsx(Message,{message:lastMessageWithApproval,previousMessage:staticMessages.length>0?staticMessages[staticMessages.length-1]:void 0,nextMessage:void 0,maxWidth:size.columns-2},lastMessageWithApproval.id):null,dev$1.chat.streamingMessage?jsx(Message,{message:dev$1.chat.streamingMessage,nextMessage:void 0,previousMessage:dev$1.chat.messages.length>0?dev$1.chat.messages.at(dev$1.chat.messages.length-1):void 0,streaming:!0,maxWidth:size.columns-2},dev$1.chat.streamingMessage.id):null,dev$1.chat.queuedLogs.map(log$5=>jsx(Message,{message:log$5,nextMessage:void 0,previousMessage:dev$1.chat.streamingMessage||(dev$1.chat.messages.length>0?dev$1.chat.messages.at(dev$1.chat.messages.length-1):void 0),maxWidth:size.columns-2},log$5.id)),dev$1.showWaitingPlaceholder?jsx(AssistantWaitingPlaceholder,{maxWidth:size.columns-2}):null]}),jsx(Box_default,{flexDirection:`column`,marginTop:1,children:dev$1.approval?jsx(ApprovalInput,{onConfirm:async(approved,autoApprove)=>{approved?await dev$1.approval?.approve(autoApprove):await dev$1.approval?.reject()},onCancel:()=>{},autoApproveEnabled:dev$1.approval.autoApproveEnabled,logger:logger$5}):jsx(text_input_default,{borderColor:colors[dev$1.mode],slashCommands:[{name:`help`,description:`Show help information`,action:()=>{getHelpText(dev$1.build.entrypoint).forEach(line$1=>console.log(line$1))}},{name:`reset`,altNames:[`clear`],description:`Reset the chat`,action:async()=>{await dev$1.chat.resetChat(),resetTerminal()}},{name:`switch`,description:`Switch to a different chat`,action:args=>{dev$1.switchChat(args)},completion:async partialArg=>dev$1.chats.filter(id=>id.startsWith(partialArg))},{name:`new`,description:`Create a new chat`,action:args=>{dev$1.switchChat(args)}},{name:`edit`,description:`Switch to Edit mode (AI helps build your agent)`,action:()=>{dev$1.chat.stopStreaming(),dev$1.setMode(`edit`)}},{name:`run`,description:`Switch to Run mode (use your agent)`,action:()=>{dev$1.chat.stopStreaming(),dev$1.setMode(`run`)}},...optionCommand?[optionCommand]:[]],onSubmit:value=>(dev$1.chat.sendMessage({id:crypto.randomUUID(),role:`user`,parts:[{type:`text`,text:value}],created_at:new Date().toISOString(),metadata:void 0,mode:dev$1.mode}),!0),onLayoutChange:()=>{}})}),jsxs(Box_default,{children:[jsxs(Box_default,{marginLeft:2,gap:3,children:[jsxs(Text,{color:`gray`,children:[`mode: `,jsx(Text,{color:colors[dev$1.mode],children:dev$1.mode})]}),jsxs(Text,{color:`gray`,children:[`chat: `,jsx(Text,{children:dev$1.chat.id})]})]}),jsx(Spacer,{}),keybindSuggestion?jsx(Text,{color:`yellow`,children:keybindSuggestion+` `}):jsx(Box_default,{gap:3,marginRight:2,children:Object.entries(keymaps).map(([key$1,value])=>jsx(Text,{children:source_default.gray.dim(key$1+` `+value)},key$1))})]}),dev$1.tokenUsage||dev$1.options.schema&&dev$1.options.selected?jsxs(Box_default,{marginLeft:2,gap:3,children:[dev$1.tokenUsage?jsxs(Box_default,{gap:1,children:[jsx(Text,{color:`gray`,children:`tokens:`}),jsx(Text,{color:`cyan`,children:formatTokenCount(dev$1.tokenUsage.inputTokens)}),jsx(Text,{color:`gray`,children:`→`}),jsx(Text,{color:`green`,children:formatTokenCount(dev$1.tokenUsage.outputTokens)}),dev$1.tokenUsage.cachedInputTokens!==void 0&&dev$1.tokenUsage.cachedInputTokens>0?jsxs(Text,{children:[jsx(Text,{color:`gray`,children:`(`}),jsx(Text,{color:`blue`,children:formatTokenCount(dev$1.tokenUsage.cachedInputTokens)}),jsx(Text,{color:`gray`,children:` cached)`})]}):null]}):null,dev$1.options.schema&&dev$1.options.selected?jsxs(Box_default,{gap:1,children:[jsx(Text,{color:`gray`,children:`options:`}),Object.entries(dev$1.options.selected).map(([key$1,value])=>dev$1.options.schema[key$1]?jsxs(Box_default,{gap:0,children:[jsxs(Text,{color:`gray`,children:[key$1,`=`]}),jsx(Text,{color:`gray`,children:value})]},key$1):null)]}):null]}):null]})},ApprovalInput=({onConfirm,onCancel,autoApproveEnabled,logger:logger$5})=>{let[selected,setSelected]=useState(`yes`),[processing$2,setProcessing]=useState(!1),processingRef=useRef(!1),handleConfirm=React.useCallback(async(approved,autoApprove)=>{if(!processingRef.current){processingRef.current=!0,setProcessing(!0);try{await onConfirm(approved,autoApprove)}catch(err){logger$5.error(`system`,`Error processing approval:`,err)}finally{processingRef.current=!1,setProcessing(!1)}}},[onConfirm]),handleCancel=React.useCallback(()=>{processingRef.current||onCancel()},[onCancel]);return use_input_default((input,key$1)=>{let lower=input.toLowerCase();if(key$1.escape){handleCancel();return}if(lower===`y`){handleConfirm(!0);return}if(lower===`a`){handleConfirm(!0,!0);return}if(lower===`n`){handleConfirm(!1);return}if(key$1.leftArrow){setSelected(prev=>prev===`yes`?`no`:prev===`no`?`auto`:`yes`);return}if(key$1.rightArrow||key$1.tab){setSelected(prev=>prev===`yes`?`auto`:prev===`auto`?`no`:`yes`);return}key$1.return&&(selected===`yes`?handleConfirm(!0):selected===`auto`?handleConfirm(!0,!0):handleConfirm(!1))}),jsxs(Box_default,{gap:2,flexDirection:`row`,children:[jsx(Text,{children:processing$2?`Processing...`:autoApproveEnabled?`(auto-approved)`:`Approve?`}),!processing$2&&!autoApproveEnabled&&jsxs(Fragment,{children:[jsx(Box_default,{children:jsxs(Text,{children:[`[`,jsx(Text,{color:selected===`yes`?`green`:`gray`,bold:selected===`yes`,children:`Yes`}),`/`,jsx(Text,{color:selected===`auto`?`cyan`:`gray`,bold:selected===`auto`,children:`Auto`}),`/`,jsx(Text,{color:selected===`no`?`red`:`gray`,bold:selected===`no`,children:`No`}),`]`]})}),jsx(Text,{color:`gray`,children:`(y/a/n, ←/→ then ⏎)`})]})]})},Message=React.memo(({message,previousMessage,maxWidth,streaming})=>{let prefix,contentColor,marginTop=previousMessage?1:0;if(isLogMessage(message)){let logLevel=message.metadata.level,logSource=message.metadata.source,logMessage=message.metadata.message,isError$1=logLevel===`error`;return prefix=null,contentColor=isError$1?`red`:`gray`,jsxs(Box_default,{flexDirection:`row`,gap:1,children:[logSource===`agent`?jsxs(Text,{color:isError$1?`red`:void 0,bold:!0,children:[`[`,logSource,`]`]}):null,logSource===`system`&&isError$1?jsx(Text,{color:`red`,bold:!0,children:`[error]`}):null,jsx(Box_default,{gap:1,flexDirection:`column`,width:maxWidth,children:jsx(Text,{color:`gray`,children:logMessage})})]})}switch(message.role){case`system`:prefix=jsx(Text,{children:`t `}),contentColor=`gray`;break;case`user`:prefix=jsx(Text,{color:`magenta`,bold:!0,children:`▎`}),contentColor=`gray`;break;case`assistant`:let isEditMode=message.mode===`edit`;prefix=jsx(Text,{color:isEditMode?colors.edit:colors.run,children:`> `}),contentColor=`white`;break}let content=jsx(Box_default,{gap:1,flexDirection:`column`,width:maxWidth,children:message.parts.map((part,index)=>{if(part.type===`text`)return jsx(markdown_default,{id:message.id,maxWidth,streaming,children:part.text},index);if(part.type===`reasoning`)return jsxs(Text,{color:`gray`,children:[`Reasoning: `,part.text]},index);if(isToolOrDynamicToolUIPart(part))return jsx(ToolCall,{part,maxWidth,streaming},index)}).filter(Boolean)});return jsxs(Box_default,{marginTop,flexDirection:`row`,children:[jsx(Box_default,{children:jsx(Text,{color:contentColor,children:prefix})}),content]})},(prev,next)=>prev.maxWidth===next.maxWidth?!!(prev.nextMessage&&next.nextMessage&&prev.nextMessage.id===next.nextMessage.id):!1),AssistantWaitingPlaceholder=({maxWidth})=>jsxs(Box_default,{marginTop:1,flexDirection:`row`,children:[jsx(Box_default,{children:jsx(Text,{color:`white`,children:null})}),jsx(Box_default,{width:maxWidth,children:jsxs(Text,{color:`gray`,children:[jsx(build_default,{}),` Waiting for response...`]})})]}),ToolCall=({part,maxWidth,streaming})=>{let name$2=getToolOrDynamicToolName(part),input=useMemo(()=>{let labels={};return typeof part.input!=`object`||part.input===null||Object.entries(part.input).forEach(([key$1,value])=>{labels[key$1]=JSON.stringify(value)}),labels},[part]),state=useMemo(()=>{switch(part.state){case`input-available`:case`input-streaming`:return streaming?`streaming`:`error`;case`output-available`:return isToolApprovalOutput(part.output)&&part.output.outcome===`pending`?`pending-approval`:`done`;case`output-error`:return`error`}},[part,streaming]),output=useMemo(()=>{if(isToolApprovalOutput(part.output))return{state:part.output.outcome};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$1,value])=>{labels[key$1]=JSON.stringify(value)}),labels},[part,state]),error$3=useMemo(()=>{if(part.state===`output-error`)return part.errorText},[part]),icon=useMemo(()=>{switch(state){case`done`:case`error`:return`⚒`;case`pending-approval`:return`⧗`}return jsx(build_default,{type:`dots`})},[state]);return jsxs(Box_default,{flexDirection:`column`,children:[jsxs(Box_default,{gap:1,children:[jsx(Text,{color:state===`error`?`red`:`gray`,bold:!0,children:icon}),jsx(Text,{children:name$2})]}),jsxs(Box_default,{marginLeft:2,flexDirection:`column`,overflowX:`hidden`,width:maxWidth?maxWidth-4:void 0,gap:0,children:[jsx(Text,{color:`gray`,bold:!0,children:`Input:`}),Object.entries(input).map(([key$1,value])=>jsxs(Box_default,{marginLeft:2,children:[jsx(Text,{color:`gray`,children:key$1}),jsx(Text,{color:`blackBright`,children:`=`}),jsx(Box_default,{width:maxWidth?maxWidth-6-1-2-key$1.length:void 0,children:jsx(Text,{wrap:`truncate-middle`,children:value})})]},key$1)),output&&jsxs(Fragment,{children:[jsx(Text,{color:`gray`,bold:!0,children:`Output:`}),typeof output==`string`?jsx(Box_default,{marginLeft:2,children:jsx(Text,{children:output})}):isToolApprovalOutput(part.output)?jsx(Box_default,{marginLeft:2,children:jsx(Text,{color:part.output.outcome===`approved`?`green`:part.output.outcome===`rejected`?`red`:`yellow`,bold:!0,children:part.output.outcome===`approved`?`✓ Approved`:part.output.outcome===`rejected`?`✗ Rejected`:`⧗ Pending approval`})}):jsx(Box_default,{flexDirection:`column`,children:Object.entries(output).map(([key$1,value])=>jsxs(Box_default,{marginLeft:2,children:[jsx(Text,{color:`gray`,children:key$1}),jsx(Text,{color:`blackBright`,children:`=`}),jsx(Box_default,{width:maxWidth?maxWidth-6-1-key$1.length:void 0,children:jsx(Text,{wrap:`truncate-middle`,children:value})})]},key$1))})]}),error$3&&jsxs(Fragment,{children:[jsx(Text,{color:`gray`,bold:!0,children:`Error:`}),jsx(Text,{color:`red`,children:error$3})]})]})]})},OnboardingMessage=()=>jsxs(Box_default,{flexDirection:`column`,marginTop:1,marginBottom:1,borderStyle:`round`,borderColor:`gray`,paddingX:1,paddingY:0,children:[jsx(Box_default,{children:jsx(Text,{bold:!0,children:`Quick Start: Building Your Agent`})}),jsxs(Box_default,{marginTop:1,flexDirection:`column`,children:[jsx(Text,{children:`Blink has two modes:`}),jsxs(Box_default,{marginTop:1,flexDirection:`column`,marginLeft:2,children:[jsxs(Text,{children:[jsx(Text,{bold:!0,color:colors.edit,children:`• Edit`}),jsx(Text,{children:` mode helps you build your agent`})]}),jsxs(Text,{children:[jsx(Text,{bold:!0,color:colors.run,children:`• Run`}),jsx(Text,{children:` mode lets you interact with it`})]})]}),jsx(Box_default,{marginTop:1,children:jsxs(Text,{children:[`Switch between them with`,` `,jsx(Text,{bold:!0,color:`cyan`,children:`Ctrl+T`}),` `,`or`,` `,jsx(Text,{bold:!0,color:`cyan`,children:`/edit`}),` `,`and`,` `,jsx(Text,{bold:!0,color:`cyan`,children:`/run`}),`.`]})})]})]}),MissingApiKeyMessage=()=>jsxs(Box_default,{flexDirection:`column`,marginTop:1,marginBottom:1,borderStyle:`round`,borderColor:`yellow`,paddingX:1,paddingY:0,children:[jsx(Box_default,{children:jsx(Text,{bold:!0,color:`yellow`,children:`⚠ Edit Mode Requires API Key`})}),jsxs(Box_default,{marginTop:1,flexDirection:`column`,children:[jsxs(Text,{children:[`Add one of these to your `,jsx(Text,{bold:!0,children:`.env.local`}),` file:`]}),jsxs(Box_default,{marginTop:1,flexDirection:`column`,marginLeft:2,children:[jsxs(Text,{children:[`ANTHROPIC_API_KEY=`,jsx(Text,{color:`gray`,children:`your-key`})]}),jsxs(Text,{children:[`OPENAI_API_KEY=`,jsx(Text,{color:`gray`,children:`your-key`})]}),jsxs(Text,{children:[`AI_GATEWAY_API_KEY=`,jsx(Text,{color:`gray`,children:`your-key`})]})]}),jsx(Box_default,{marginTop:1,children:jsx(Text,{children:`The file will auto-reload when you add a key.`})})]})]});function getHelpText(entrypoint){return[``,source_default.bold(`How to Build Your Agent`),``,`Blink has two modes that work together to help you build and test agents:`,``,source_default.hex(colors.edit).bold(` Edit Mode`)+` - AI helps you build your agent`,` • Describe the agent you want to build`,` • The AI will modify your agent code based on your instructions`,` • Changes are written to ${relative$1(process.cwd(),entrypoint)} and auto-reload`,``,source_default.blue.bold(` Run Mode`)+` - Use your agent`,` • Chat with your agent to see how it behaves`,` • Discover what works and what needs improvement`,``,source_default.bold(`The Development Loop:`),` 1. Start in `+source_default.hex(colors.edit)(`Edit mode`)+` (Ctrl+T or /edit) and describe what your agent should do`,` Example: "Add a tool that can search the web"`,``,` 2. Switch to `+source_default.blue(`Run mode`)+` (Ctrl+T or /run) to use your agent`,` Try it out and see if it does what you expect`,``,` 3. Toggle back to `+source_default.hex(colors.edit)(`Edit mode`)+` to refine based on what you learned`,` The edit AI can see the entire chat history, including your conversations!`,` Example: "The search tool failed when I asked about X"`,``,` 4. Repeat until your agent works perfectly`,``,` 5. Deploy with `+source_default.bold(`blink deploy`)+` when ready`,``,source_default.dim(`Tip: Use /reset to start fresh, /new to create separate test chats`)]}function formatTokenCount(count$1){return count$1>=1e6?`${(count$1/1e6).toFixed(1)}M`:count$1>=1e3?`${(count$1/1e3).toFixed(1)}K`:count$1.toString()}async function dev(directory){if(!directory){let cwd$3=process.cwd();try{resolveConfig(cwd$3),directory=cwd$3}catch{let dotBlinkPath=await findNearestEntry(cwd$3,`.blink`);dotBlinkPath&&existsSync$1(join$1(dotBlinkPath,`build`))&&(dotBlinkPath=void 0),directory=dotBlinkPath||cwd$3}}await migrateDataToBlink(directory);let exitWithDump=error$3=>{writeFileSync$1(`error.dump`,inspect$1(error$3,{depth:null})),process.exit(1)};process.addListener(`uncaughtException`,error$3=>{exitWithDump(error$3)}),process.addListener(`unhandledRejection`,error$3=>{exitWithDump(error$3)});try{await startDev({directory})}catch(err){console.error(err),process.exit(1)}finally{process.exit(0)}}export{dev as default};
|
|
1916
|
+
`);break}}});useEffect(()=>{logger$5.setPrintLog((level$1,source$39,...message)=>dev$1.chat.queueLogMessage({message:util.format(...message),level:level$1,source:source$39}))},[dev$1.chat.queueLogMessage,logger$5]);let{exit}=use_app_default(),[exitArmed,setExitArmed]=useState(!1),exitTimerRef=useRef(void 0);useEffect(()=>()=>{exitTimerRef.current&&clearTimeout(exitTimerRef.current)},[]),use_input_default(async(input,key$1)=>{if(key$1.ctrl&&input.toLowerCase()===`c`){if(exitArmed){exit();return}setExitArmed(!0),exitTimerRef.current&&clearTimeout(exitTimerRef.current),exitTimerRef.current=setTimeout(()=>setExitArmed(!1),2e3)}key$1.ctrl&&input===`r`&&(await dev$1.chat.resetChat(),resetTerminal()),key$1.ctrl&&input===`t`&&dev$1.toggleMode(),key$1.ctrl&&input===`n`&&dev$1.newChat(),key$1.escape&&dev$1.chat.stopStreaming()});let keymaps=useMemo(()=>({"⏎":`send`,"Ctrl+T":`toggle mode`,"Ctrl+N":`new chat`,"Ctrl+C":`quit`}),[]),keybindSuggestion=useMemo(()=>{if(exitArmed)return`Ctrl+C again to quit`;if(dev$1.chat.queuedMessages.length>0)return`${dev$1.chat.queuedMessages.length} message(s) queued - Press [Escape] to stop and process queue`;if(dev$1.chat.status===`streaming`)return`Press [Escape] to stop the agent!`},[exitArmed,dev$1.chat.status,dev$1.chat.queuedMessages.length]),{write:write$1}=use_stdout_default(),[epoch,setEpoch]=useState(0),resetTerminal=useCallback(()=>{write$1(clearTerminal),setEpoch(prev=>prev+1)},[write$1]),initialSizeRef=useRef(size);useEffect(()=>{(initialSizeRef.current.columns!==size.columns||initialSizeRef.current.rows!==size.rows)&&(resetTerminal(),initialSizeRef.current=size)},[size.columns,size.rows,resetTerminal]),useEffect(()=>{resetTerminal()},[dev$1.chat.id,resetTerminal]);let optionCommand=useMemo(()=>{if(dev$1.options.schema)return{name:`option`,description:`Adjust your agent's options.`,action:()=>{},completion:async()=>Object.keys(dev$1.options.schema),subcommands:Object.entries(dev$1.options.schema).map(([key$1,value])=>({name:key$1,description:value.label??``,action:args=>{dev$1.options.setOption(key$1,args)},completion:async partialArg=>value.values.map(v$1=>v$1.id)}))}},[dev$1.options]),lastMessageWithApproval=useMemo(()=>{if(dev$1.chat.messages.length===0)return null;let lastMsg=dev$1.chat.messages[dev$1.chat.messages.length-1];return lastMsg.parts.some(part=>isToolOrDynamicToolUIPart(part)&&isToolApprovalOutput(part.output))?lastMsg:null},[dev$1.chat.messages]),staticMessages=useMemo(()=>lastMessageWithApproval?dev$1.chat.messages.slice(0,-1):dev$1.chat.messages,[dev$1.chat.messages,lastMessageWithApproval]);return dev$1.chat.loading?null:jsxs(Fragment,{children:[dev$1.mode===`edit`&&dev$1.editModeMissingApiKey?jsx(MissingApiKeyMessage,{}):null,jsxs(Box_default,{flexDirection:`column`,children:[jsx(Static,{items:[{},...staticMessages],children:(message,index)=>index===0?jsxs(Box_default,{flexDirection:`column`,marginBottom:1,children:[jsxs(Box_default,{children:[jsx(Text,{bold:!0,children:`blink■`}),jsx(Text,{color:`gray`,children:` agent development`})]}),isFirstRun&&jsx(OnboardingMessage,{}),jsxs(Box_default,{marginTop:1,flexDirection:`column`,children:[jsxs(Text,{color:`gray`,children:[`Edit `,dev$1.build.entrypoint,` to hot-reload your agent.`]}),jsxs(Text,{color:`gray`,children:[`Run `,jsx(Text,{color:`blue`,children:`blink deploy`}),` to use your agent in the cloud.`]}),jsxs(Text,{color:`gray`,children:[`Type`,` `,jsx(Text,{bold:!0,color:`cyan`,children:`/help`}),` `,`to see the full guide on how to build, test, and deploy your agent.`]})]})]},`banner`):jsx(Message,{message,previousMessage:index>1?staticMessages.at(index-2):void 0,nextMessage:index<staticMessages.length-2?staticMessages.at(index+2):void 0,maxWidth:size.columns-2},`${message.id}-${index}`)},`messages-${dev$1.chat.id}-${epoch}`),lastMessageWithApproval?jsx(Message,{message:lastMessageWithApproval,previousMessage:staticMessages.length>0?staticMessages[staticMessages.length-1]:void 0,nextMessage:void 0,maxWidth:size.columns-2},lastMessageWithApproval.id):null,dev$1.chat.streamingMessage?jsx(Message,{message:dev$1.chat.streamingMessage,nextMessage:void 0,previousMessage:dev$1.chat.messages.length>0?dev$1.chat.messages.at(dev$1.chat.messages.length-1):void 0,streaming:!0,maxWidth:size.columns-2},dev$1.chat.streamingMessage.id):null,dev$1.chat.queuedLogs.map(log$5=>jsx(Message,{message:log$5,nextMessage:void 0,previousMessage:dev$1.chat.streamingMessage||(dev$1.chat.messages.length>0?dev$1.chat.messages.at(dev$1.chat.messages.length-1):void 0),maxWidth:size.columns-2},log$5.id)),dev$1.showWaitingPlaceholder?jsx(AssistantWaitingPlaceholder,{maxWidth:size.columns-2}):null]}),jsxs(Box_default,{flexDirection:`column`,marginTop:1,children:[dev$1.approval&&jsx(ApprovalInput,{onConfirm:async(approved,autoApprove)=>{approved?await dev$1.approval?.approve(autoApprove):await dev$1.approval?.reject()},onCancel:()=>{},autoApproveEnabled:dev$1.approval.autoApproveEnabled,logger:logger$5}),jsx(text_input_default,{visible:!dev$1.approval,borderColor:colors[dev$1.mode],slashCommands:[{name:`help`,description:`Show help information`,action:()=>{getHelpText(dev$1.build.entrypoint).forEach(line$1=>console.log(line$1))}},{name:`reset`,altNames:[`clear`],description:`Reset the chat`,action:async()=>{await dev$1.chat.resetChat(),resetTerminal()}},{name:`switch`,description:`Switch to a different chat`,action:args=>{dev$1.switchChat(args)},completion:async partialArg=>dev$1.chats.filter(id=>id.startsWith(partialArg))},{name:`new`,description:`Create a new chat`,action:args=>{dev$1.switchChat(args)}},{name:`edit`,description:`Switch to Edit mode (AI helps build your agent)`,action:()=>{dev$1.chat.stopStreaming(),dev$1.setMode(`edit`)}},{name:`run`,description:`Switch to Run mode (use your agent)`,action:()=>{dev$1.chat.stopStreaming(),dev$1.setMode(`run`)}},...optionCommand?[optionCommand]:[]],onSubmit:value=>(dev$1.chat.sendMessage({id:crypto.randomUUID(),role:`user`,parts:[{type:`text`,text:value}],created_at:new Date().toISOString(),metadata:void 0,mode:dev$1.mode}),!0),onLayoutChange:()=>{}})]}),jsxs(Box_default,{children:[jsxs(Box_default,{marginLeft:2,gap:3,children:[jsxs(Text,{color:`gray`,children:[`mode: `,jsx(Text,{color:colors[dev$1.mode],children:dev$1.mode})]}),jsxs(Text,{color:`gray`,children:[`chat: `,jsx(Text,{children:dev$1.chat.id})]})]}),jsx(Spacer,{}),keybindSuggestion?jsx(Text,{color:`yellow`,children:keybindSuggestion+` `}):jsx(Box_default,{gap:3,marginRight:2,children:Object.entries(keymaps).map(([key$1,value])=>jsx(Text,{children:source_default.gray.dim(key$1+` `+value)},key$1))})]}),dev$1.tokenUsage||dev$1.options.schema&&dev$1.options.selected?jsxs(Box_default,{marginLeft:2,gap:3,children:[dev$1.tokenUsage?jsxs(Box_default,{gap:1,children:[jsx(Text,{color:`gray`,children:`tokens:`}),jsx(Text,{color:`cyan`,children:formatTokenCount(dev$1.tokenUsage.inputTokens)}),jsx(Text,{color:`gray`,children:`→`}),jsx(Text,{color:`green`,children:formatTokenCount(dev$1.tokenUsage.outputTokens)}),dev$1.tokenUsage.cachedInputTokens!==void 0&&dev$1.tokenUsage.cachedInputTokens>0?jsxs(Text,{children:[jsx(Text,{color:`gray`,children:`(`}),jsx(Text,{color:`blue`,children:formatTokenCount(dev$1.tokenUsage.cachedInputTokens)}),jsx(Text,{color:`gray`,children:` cached)`})]}):null]}):null,dev$1.options.schema&&dev$1.options.selected?jsxs(Box_default,{gap:1,children:[jsx(Text,{color:`gray`,children:`options:`}),Object.entries(dev$1.options.selected).map(([key$1,value])=>dev$1.options.schema[key$1]?jsxs(Box_default,{gap:0,children:[jsxs(Text,{color:`gray`,children:[key$1,`=`]}),jsx(Text,{color:`gray`,children:value})]},key$1):null)]}):null]}):null]})},ApprovalInput=({onConfirm,onCancel,autoApproveEnabled,logger:logger$5})=>{let[selected,setSelected]=useState(`yes`),[processing$2,setProcessing]=useState(!1),processingRef=useRef(!1),handleConfirm=React.useCallback(async(approved,autoApprove)=>{if(!processingRef.current){processingRef.current=!0,setProcessing(!0);try{await onConfirm(approved,autoApprove)}catch(err){logger$5.error(`system`,`Error processing approval:`,err)}finally{processingRef.current=!1,setProcessing(!1)}}},[onConfirm]),handleCancel=React.useCallback(()=>{processingRef.current||onCancel()},[onCancel]);return use_input_default((input,key$1)=>{let lower=input.toLowerCase();if(key$1.escape){handleCancel();return}if(lower===`y`){handleConfirm(!0);return}if(lower===`a`){handleConfirm(!0,!0);return}if(lower===`n`){handleConfirm(!1);return}if(key$1.leftArrow){setSelected(prev=>prev===`yes`?`no`:prev===`no`?`auto`:`yes`);return}if(key$1.rightArrow||key$1.tab){setSelected(prev=>prev===`yes`?`auto`:prev===`auto`?`no`:`yes`);return}key$1.return&&(selected===`yes`?handleConfirm(!0):selected===`auto`?handleConfirm(!0,!0):handleConfirm(!1))}),jsxs(Box_default,{gap:2,flexDirection:`row`,children:[jsx(Text,{children:processing$2?`Processing...`:autoApproveEnabled?`(auto-approved)`:`Approve?`}),!processing$2&&!autoApproveEnabled&&jsxs(Fragment,{children:[jsx(Box_default,{children:jsxs(Text,{children:[`[`,jsx(Text,{color:selected===`yes`?`green`:`gray`,bold:selected===`yes`,children:`Yes`}),`/`,jsx(Text,{color:selected===`auto`?`cyan`:`gray`,bold:selected===`auto`,children:`Auto`}),`/`,jsx(Text,{color:selected===`no`?`red`:`gray`,bold:selected===`no`,children:`No`}),`]`]})}),jsx(Text,{color:`gray`,children:`(y/a/n, ←/→ then ⏎)`})]})]})},Message=React.memo(({message,previousMessage,maxWidth,streaming})=>{let prefix,contentColor,marginTop=previousMessage?1:0;if(isLogMessage(message)){let logLevel=message.metadata.level,logSource=message.metadata.source,logMessage=message.metadata.message,isError$1=logLevel===`error`;return prefix=null,contentColor=isError$1?`red`:`gray`,jsxs(Box_default,{flexDirection:`row`,gap:1,children:[logSource===`agent`?jsxs(Text,{color:isError$1?`red`:void 0,bold:!0,children:[`[`,logSource,`]`]}):null,logSource===`system`&&isError$1?jsx(Text,{color:`red`,bold:!0,children:`[error]`}):null,jsx(Box_default,{gap:1,flexDirection:`column`,width:maxWidth,children:jsx(Text,{color:`gray`,children:logMessage})})]})}switch(message.role){case`system`:prefix=jsx(Text,{children:`t `}),contentColor=`gray`;break;case`user`:prefix=jsx(Text,{color:`magenta`,bold:!0,children:`▎`}),contentColor=`gray`;break;case`assistant`:let isEditMode=message.mode===`edit`;prefix=jsx(Text,{color:isEditMode?colors.edit:colors.run,children:`> `}),contentColor=`white`;break}let content=jsx(Box_default,{gap:1,flexDirection:`column`,width:maxWidth,children:message.parts.map((part,index)=>{if(part.type===`text`)return jsx(markdown_default,{id:message.id,maxWidth,streaming,children:part.text},index);if(part.type===`reasoning`)return jsxs(Text,{color:`gray`,children:[`Reasoning: `,part.text]},index);if(isToolOrDynamicToolUIPart(part))return jsx(ToolCall,{part,maxWidth,streaming},index)}).filter(Boolean)});return jsxs(Box_default,{marginTop,flexDirection:`row`,children:[jsx(Box_default,{children:jsx(Text,{color:contentColor,children:prefix})}),content]})},(prev,next)=>prev.maxWidth===next.maxWidth?!!(prev.nextMessage&&next.nextMessage&&prev.nextMessage.id===next.nextMessage.id):!1),AssistantWaitingPlaceholder=({maxWidth})=>jsxs(Box_default,{marginTop:1,flexDirection:`row`,children:[jsx(Box_default,{children:jsx(Text,{color:`white`,children:null})}),jsx(Box_default,{width:maxWidth,children:jsxs(Text,{color:`gray`,children:[jsx(build_default,{}),` Waiting for response...`]})})]}),ToolCall=({part,maxWidth,streaming})=>{let name$2=getToolOrDynamicToolName(part),input=useMemo(()=>{let labels={};return typeof part.input!=`object`||part.input===null||Object.entries(part.input).forEach(([key$1,value])=>{labels[key$1]=JSON.stringify(value)}),labels},[part]),state=useMemo(()=>{switch(part.state){case`input-available`:case`input-streaming`:return streaming?`streaming`:`error`;case`output-available`:return isToolApprovalOutput(part.output)&&part.output.outcome===`pending`?`pending-approval`:`done`;case`output-error`:return`error`}},[part,streaming]),output=useMemo(()=>{if(isToolApprovalOutput(part.output))return{state:part.output.outcome};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$1,value])=>{labels[key$1]=JSON.stringify(value)}),labels},[part,state]),error$3=useMemo(()=>{if(part.state===`output-error`)return part.errorText},[part]),icon=useMemo(()=>{switch(state){case`done`:case`error`:return`⚒`;case`pending-approval`:return`⧗`}return jsx(build_default,{type:`dots`})},[state]);return jsxs(Box_default,{flexDirection:`column`,children:[jsxs(Box_default,{gap:1,children:[jsx(Text,{color:state===`error`?`red`:`gray`,bold:!0,children:icon}),jsx(Text,{children:name$2})]}),jsxs(Box_default,{marginLeft:2,flexDirection:`column`,overflowX:`hidden`,width:maxWidth?maxWidth-4:void 0,gap:0,children:[jsx(Text,{color:`gray`,bold:!0,children:`Input:`}),Object.entries(input).map(([key$1,value])=>jsxs(Box_default,{marginLeft:2,children:[jsx(Text,{color:`gray`,children:key$1}),jsx(Text,{color:`blackBright`,children:`=`}),jsx(Box_default,{width:maxWidth?maxWidth-6-1-2-key$1.length:void 0,children:jsx(Text,{wrap:`truncate-middle`,children:value})})]},key$1)),output&&jsxs(Fragment,{children:[jsx(Text,{color:`gray`,bold:!0,children:`Output:`}),typeof output==`string`?jsx(Box_default,{marginLeft:2,children:jsx(Text,{children:output})}):isToolApprovalOutput(part.output)?jsx(Box_default,{marginLeft:2,children:jsx(Text,{color:part.output.outcome===`approved`?`green`:part.output.outcome===`rejected`?`red`:`yellow`,bold:!0,children:part.output.outcome===`approved`?`✓ Approved`:part.output.outcome===`rejected`?`✗ Rejected`:`⧗ Pending approval`})}):jsx(Box_default,{flexDirection:`column`,children:Object.entries(output).map(([key$1,value])=>jsxs(Box_default,{marginLeft:2,children:[jsx(Text,{color:`gray`,children:key$1}),jsx(Text,{color:`blackBright`,children:`=`}),jsx(Box_default,{width:maxWidth?maxWidth-6-1-key$1.length:void 0,children:jsx(Text,{wrap:`truncate-middle`,children:value})})]},key$1))})]}),error$3&&jsxs(Fragment,{children:[jsx(Text,{color:`gray`,bold:!0,children:`Error:`}),jsx(Text,{color:`red`,children:error$3})]})]})]})},OnboardingMessage=()=>jsxs(Box_default,{flexDirection:`column`,marginTop:1,marginBottom:1,borderStyle:`round`,borderColor:`gray`,paddingX:1,paddingY:0,children:[jsx(Box_default,{children:jsx(Text,{bold:!0,children:`Quick Start: Building Your Agent`})}),jsxs(Box_default,{marginTop:1,flexDirection:`column`,children:[jsx(Text,{children:`Blink has two modes:`}),jsxs(Box_default,{marginTop:1,flexDirection:`column`,marginLeft:2,children:[jsxs(Text,{children:[jsx(Text,{bold:!0,color:colors.edit,children:`• Edit`}),jsx(Text,{children:` mode helps you build your agent`})]}),jsxs(Text,{children:[jsx(Text,{bold:!0,color:colors.run,children:`• Run`}),jsx(Text,{children:` mode lets you interact with it`})]})]}),jsx(Box_default,{marginTop:1,children:jsxs(Text,{children:[`Switch between them with`,` `,jsx(Text,{bold:!0,color:`cyan`,children:`Ctrl+T`}),` `,`or`,` `,jsx(Text,{bold:!0,color:`cyan`,children:`/edit`}),` `,`and`,` `,jsx(Text,{bold:!0,color:`cyan`,children:`/run`}),`.`]})})]})]}),MissingApiKeyMessage=()=>jsxs(Box_default,{flexDirection:`column`,marginTop:1,marginBottom:1,borderStyle:`round`,borderColor:`yellow`,paddingX:1,paddingY:0,children:[jsx(Box_default,{children:jsx(Text,{bold:!0,color:`yellow`,children:`⚠ Edit Mode Requires API Key`})}),jsxs(Box_default,{marginTop:1,flexDirection:`column`,children:[jsxs(Text,{children:[`Add one of these to your `,jsx(Text,{bold:!0,children:`.env.local`}),` file:`]}),jsxs(Box_default,{marginTop:1,flexDirection:`column`,marginLeft:2,children:[jsxs(Text,{children:[`ANTHROPIC_API_KEY=`,jsx(Text,{color:`gray`,children:`your-key`})]}),jsxs(Text,{children:[`OPENAI_API_KEY=`,jsx(Text,{color:`gray`,children:`your-key`})]}),jsxs(Text,{children:[`AI_GATEWAY_API_KEY=`,jsx(Text,{color:`gray`,children:`your-key`})]})]}),jsx(Box_default,{marginTop:1,children:jsx(Text,{children:`The file will auto-reload when you add a key.`})})]})]});function getHelpText(entrypoint){return[``,source_default.bold(`How to Build Your Agent`),``,`Blink has two modes that work together to help you build and test agents:`,``,source_default.hex(colors.edit).bold(` Edit Mode`)+` - AI helps you build your agent`,` • Describe the agent you want to build`,` • The AI will modify your agent code based on your instructions`,` • Changes are written to ${relative$1(process.cwd(),entrypoint)} and auto-reload`,``,source_default.blue.bold(` Run Mode`)+` - Use your agent`,` • Chat with your agent to see how it behaves`,` • Discover what works and what needs improvement`,``,source_default.bold(`The Development Loop:`),` 1. Start in `+source_default.hex(colors.edit)(`Edit mode`)+` (Ctrl+T or /edit) and describe what your agent should do`,` Example: "Add a tool that can search the web"`,``,` 2. Switch to `+source_default.blue(`Run mode`)+` (Ctrl+T or /run) to use your agent`,` Try it out and see if it does what you expect`,``,` 3. Toggle back to `+source_default.hex(colors.edit)(`Edit mode`)+` to refine based on what you learned`,` The edit AI can see the entire chat history, including your conversations!`,` Example: "The search tool failed when I asked about X"`,``,` 4. Repeat until your agent works perfectly`,``,` 5. Deploy with `+source_default.bold(`blink deploy`)+` when ready`,``,source_default.dim(`Tip: Use /reset to start fresh, /new to create separate test chats`)]}function formatTokenCount(count$1){return count$1>=1e6?`${(count$1/1e6).toFixed(1)}M`:count$1>=1e3?`${(count$1/1e3).toFixed(1)}K`:count$1.toString()}async function dev(directory){if(!directory){let cwd$3=process.cwd();try{resolveConfig(cwd$3),directory=cwd$3}catch{let dotBlinkPath=await findNearestEntry(cwd$3,`.blink`);dotBlinkPath&&existsSync$1(join$1(dotBlinkPath,`build`))&&(dotBlinkPath=void 0),directory=dotBlinkPath||cwd$3}}await migrateDataToBlink(directory);let exitWithDump=error$3=>{writeFileSync$1(`error.dump`,inspect$1(error$3,{depth:null})),process.exit(1)};process.addListener(`uncaughtException`,error$3=>{exitWithDump(error$3)}),process.addListener(`unhandledRejection`,error$3=>{exitWithDump(error$3)});try{await startDev({directory})}catch(err){console.error(err),process.exit(1)}finally{process.exit(0)}}export{dev as default};
|
package/dist/cli/index.js
CHANGED
|
@@ -17,9 +17,9 @@ Expecting one of '${n.join(`', '`)}'`);return this._lifeCycleHooks[e]?this._life
|
|
|
17
17
|
- if the default executable name is not suitable, use the executableFile option to supply a custom name or path
|
|
18
18
|
- ${r}`;throw Error(i)}_executeSubCommand(e,t){t=t.slice();let n=!1,s=[`.js`,`.ts`,`.tsx`,`.mjs`,`.cjs`];function c(e,t){let n=i.resolve(e,t);if(a.existsSync(n))return n;if(s.includes(i.extname(t)))return;let r=s.find(e=>a.existsSync(`${n}${e}`));if(r)return`${n}${r}`}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let u=e._executableFile||`${this._name}-${e._name}`,d=this._executableDir||``;if(this._scriptPath){let e;try{e=a.realpathSync(this._scriptPath)}catch{e=this._scriptPath}d=i.resolve(i.dirname(e),d)}if(d){let t=c(d,u);if(!t&&!e._executableFile&&this._scriptPath){let n=i.basename(this._scriptPath,i.extname(this._scriptPath));n!==this._name&&(t=c(d,`${n}-${e._name}`))}u=t||u}n=s.includes(i.extname(u));let f;o.platform===`win32`?(this._checkForMissingExecutable(u,d,e._name),t.unshift(u),t=g(o.execArgv).concat(t),f=r.spawn(o.execPath,t,{stdio:`inherit`})):n?(t.unshift(u),t=g(o.execArgv).concat(t),f=r.spawn(o.argv[0],t,{stdio:`inherit`})):f=r.spawn(u,t,{stdio:`inherit`}),f.killed||[`SIGUSR1`,`SIGUSR2`,`SIGTERM`,`SIGINT`,`SIGHUP`].forEach(e=>{o.on(e,()=>{f.killed===!1&&f.exitCode===null&&f.kill(e)})});let p=this._exitCallback;f.on(`close`,e=>{e??=1,p?p(new l(e,`commander.executeSubCommandAsync`,`(close)`)):o.exit(e)}),f.on(`error`,t=>{if(t.code===`ENOENT`)this._checkForMissingExecutable(u,d,e._name);else if(t.code===`EACCES`)throw Error(`'${u}' not executable`);if(!p)o.exit(1);else{let e=new l(1,`commander.executeSubCommandAsync`,`(error)`);e.nestedError=t,p(e)}}),this.runningCommand=f}_dispatchSubcommand(e,t,n){let r=this._findCommand(e);r||this.help({error:!0}),r._prepareForParse();let i;return i=this._chainOrCallSubCommandHook(i,r,`preSubcommand`),i=this._chainOrCall(i,()=>{if(r._executableHandler)this._executeSubCommand(r,t.concat(n));else return r._parseCommand(t,n)}),i}_dispatchHelpCommand(e){e||this.help();let t=this._findCommand(e);return t&&!t._executableHandler&&t.help(),this._dispatchSubcommand(e,[],[this._getHelpOption()?.long??this._getHelpOption()?.short??`--help`])}_checkNumberOfArguments(){this.registeredArguments.forEach((e,t)=>{e.required&&this.args[t]==null&&this.missingArgument(e.name())}),!(this.registeredArguments.length>0&&this.registeredArguments[this.registeredArguments.length-1].variadic)&&this.args.length>this.registeredArguments.length&&this._excessArguments(this.args)}_processArguments(){let e=(e,t,n)=>{let r=t;if(t!==null&&e.parseArg){let i=`error: command-argument value '${t}' is invalid for argument '${e.name()}'.`;r=this._callParseArg(e,t,n,i)}return r};this._checkNumberOfArguments();let t=[];this.registeredArguments.forEach((n,r)=>{let i=n.defaultValue;n.variadic?r<this.args.length?(i=this.args.slice(r),n.parseArg&&(i=i.reduce((t,r)=>e(n,r,t),n.defaultValue))):i===void 0&&(i=[]):r<this.args.length&&(i=this.args[r],n.parseArg&&(i=e(n,i,n.defaultValue))),t[r]=i}),this.processedArgs=t}_chainOrCall(e,t){return e?.then&&typeof e.then==`function`?e.then(()=>t()):t()}_chainOrCallHooks(e,t){let n=e,r=[];return this._getCommandAndAncestors().reverse().filter(e=>e._lifeCycleHooks[t]!==void 0).forEach(e=>{e._lifeCycleHooks[t].forEach(t=>{r.push({hookedCommand:e,callback:t})})}),t===`postAction`&&r.reverse(),r.forEach(e=>{n=this._chainOrCall(n,()=>e.callback(e.hookedCommand,this))}),n}_chainOrCallSubCommandHook(e,t,n){let r=e;return this._lifeCycleHooks[n]!==void 0&&this._lifeCycleHooks[n].forEach(e=>{r=this._chainOrCall(r,()=>e(this,t))}),r}_parseCommand(e,t){let n=this.parseOptions(t);if(this._parseOptionsEnv(),this._parseOptionsImplied(),e=e.concat(n.operands),t=n.unknown,this.args=e.concat(t),e&&this._findCommand(e[0]))return this._dispatchSubcommand(e[0],e.slice(1),t);if(this._getHelpCommand()&&e[0]===this._getHelpCommand().name())return this._dispatchHelpCommand(e[1]);if(this._defaultCommandName)return this._outputHelpIfRequested(t),this._dispatchSubcommand(this._defaultCommandName,e,t);this.commands.length&&this.args.length===0&&!this._actionHandler&&!this._defaultCommandName&&this.help({error:!0}),this._outputHelpIfRequested(n.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let r=()=>{n.unknown.length>0&&this.unknownOption(n.unknown[0])},i=`command:${this.name()}`;if(this._actionHandler){r(),this._processArguments();let n;return n=this._chainOrCallHooks(n,`preAction`),n=this._chainOrCall(n,()=>this._actionHandler(this.processedArgs)),this.parent&&(n=this._chainOrCall(n,()=>{this.parent.emit(i,e,t)})),n=this._chainOrCallHooks(n,`postAction`),n}if(this.parent?.listenerCount(i))r(),this._processArguments(),this.parent.emit(i,e,t);else if(e.length){if(this._findCommand(`*`))return this._dispatchSubcommand(`*`,e,t);this.listenerCount(`command:*`)?this.emit(`command:*`,e,t):this.commands.length?this.unknownCommand():(r(),this._processArguments())}else this.commands.length?(r(),this.help({error:!0})):(r(),this._processArguments())}_findCommand(e){if(e)return this.commands.find(t=>t._name===e||t._aliases.includes(e))}_findOption(e){return this.options.find(t=>t.is(e))}_checkForMissingMandatoryOptions(){this._getCommandAndAncestors().forEach(e=>{e.options.forEach(t=>{t.mandatory&&e.getOptionValue(t.attributeName())===void 0&&e.missingMandatoryOptionValue(t)})})}_checkForConflictingLocalOptions(){let e=this.options.filter(e=>{let t=e.attributeName();return this.getOptionValue(t)===void 0?!1:this.getOptionValueSource(t)!==`default`});e.filter(e=>e.conflictsWith.length>0).forEach(t=>{let n=e.find(e=>t.conflictsWith.includes(e.attributeName()));n&&this._conflictingOption(t,n)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach(e=>{e._checkForConflictingLocalOptions()})}parseOptions(e){let t=[],n=[],r=t;function i(e){return e.length>1&&e[0]===`-`}let a=e=>/^-\d*\.?\d+(e[+-]?\d+)?$/.test(e)?!this._getCommandAndAncestors().some(e=>e.options.map(e=>e.short).some(e=>/^-\d$/.test(e))):!1,o=null,s=null,c=0;for(;c<e.length||s;){let l=s??e[c++];if(s=null,l===`--`){r===n&&r.push(l),r.push(...e.slice(c));break}if(o&&(!i(l)||a(l))){this.emit(`option:${o.name()}`,l);continue}if(o=null,i(l)){let t=this._findOption(l);if(t){if(t.required){let n=e[c++];n===void 0&&this.optionMissingArgument(t),this.emit(`option:${t.name()}`,n)}else if(t.optional){let n=null;c<e.length&&(!i(e[c])||a(e[c]))&&(n=e[c++]),this.emit(`option:${t.name()}`,n)}else this.emit(`option:${t.name()}`);o=t.variadic?t:null;continue}}if(l.length>2&&l[0]===`-`&&l[1]!==`-`){let e=this._findOption(`-${l[1]}`);if(e){e.required||e.optional&&this._combineFlagAndOptionalValue?this.emit(`option:${e.name()}`,l.slice(2)):(this.emit(`option:${e.name()}`),s=`-${l.slice(2)}`);continue}}if(/^--[^=]+=/.test(l)){let e=l.indexOf(`=`),t=this._findOption(l.slice(0,e));if(t&&(t.required||t.optional)){this.emit(`option:${t.name()}`,l.slice(e+1));continue}}if(r===t&&i(l)&&!(this.commands.length===0&&a(l))&&(r=n),(this._enablePositionalOptions||this._passThroughOptions)&&t.length===0&&n.length===0){if(this._findCommand(l)){t.push(l),n.push(...e.slice(c));break}else if(this._getHelpCommand()&&l===this._getHelpCommand().name()){t.push(l,...e.slice(c));break}else if(this._defaultCommandName){n.push(l,...e.slice(c));break}}if(this._passThroughOptions){r.push(l,...e.slice(c));break}r.push(l)}return{operands:t,unknown:n}}opts(){if(this._storeOptionsAsProperties){let e={},t=this.options.length;for(let n=0;n<t;n++){let t=this.options[n].attributeName();e[t]=t===this._versionOptionName?this._version:this[t]}return e}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((e,t)=>Object.assign(e,t.opts()),{})}error(e,t){this._outputConfiguration.outputError(`${e}\n`,this._outputConfiguration.writeErr),typeof this._showHelpAfterError==`string`?this._outputConfiguration.writeErr(`${this._showHelpAfterError}\n`):this._showHelpAfterError&&(this._outputConfiguration.writeErr(`
|
|
19
19
|
`),this.outputHelp({error:!0}));let n=t||{},r=n.exitCode||1,i=n.code||`commander.error`;this._exit(r,i,e)}_parseOptionsEnv(){this.options.forEach(e=>{if(e.envVar&&e.envVar in o.env){let t=e.attributeName();(this.getOptionValue(t)===void 0||[`default`,`config`,`env`].includes(this.getOptionValueSource(t)))&&(e.required||e.optional?this.emit(`optionEnv:${e.name()}`,o.env[e.envVar]):this.emit(`optionEnv:${e.name()}`))}})}_parseOptionsImplied(){let e=new p(this.options),t=e=>this.getOptionValue(e)!==void 0&&![`default`,`implied`].includes(this.getOptionValueSource(e));this.options.filter(n=>n.implied!==void 0&&t(n.attributeName())&&e.valueFromOption(this.getOptionValue(n.attributeName()),n)).forEach(e=>{Object.keys(e.implied).filter(e=>!t(e)).forEach(t=>{this.setOptionValueWithSource(t,e.implied[t],`implied`)})})}missingArgument(e){let t=`error: missing required argument '${e}'`;this.error(t,{code:`commander.missingArgument`})}optionMissingArgument(e){let t=`error: option '${e.flags}' argument missing`;this.error(t,{code:`commander.optionMissingArgument`})}missingMandatoryOptionValue(e){let t=`error: required option '${e.flags}' not specified`;this.error(t,{code:`commander.missingMandatoryOptionValue`})}_conflictingOption(e,t){let n=e=>{let t=e.attributeName(),n=this.getOptionValue(t),r=this.options.find(e=>e.negate&&t===e.attributeName()),i=this.options.find(e=>!e.negate&&t===e.attributeName());return r&&(r.presetArg===void 0&&n===!1||r.presetArg!==void 0&&n===r.presetArg)?r:i||e},r=e=>{let t=n(e),r=t.attributeName();return this.getOptionValueSource(r)===`env`?`environment variable '${t.envVar}'`:`option '${t.flags}'`},i=`error: ${r(e)} cannot be used with ${r(t)}`;this.error(i,{code:`commander.conflictingOption`})}unknownOption(e){if(this._allowUnknownOption)return;let t=``;if(e.startsWith(`--`)&&this._showSuggestionAfterError){let n=[],r=this;do{let e=r.createHelp().visibleOptions(r).filter(e=>e.long).map(e=>e.long);n=n.concat(e),r=r.parent}while(r&&!r._enablePositionalOptions);t=m(e,n)}let n=`error: unknown option '${e}'${t}`;this.error(n,{code:`commander.unknownOption`})}_excessArguments(e){if(this._allowExcessArguments)return;let t=this.registeredArguments.length,n=t===1?``:`s`,r=`error: too many arguments${this.parent?` for '${this.name()}'`:``}. Expected ${t} argument${n} but got ${e.length}.`;this.error(r,{code:`commander.excessArguments`})}unknownCommand(){let e=this.args[0],t=``;if(this._showSuggestionAfterError){let n=[];this.createHelp().visibleCommands(this).forEach(e=>{n.push(e.name()),e.alias()&&n.push(e.alias())}),t=m(e,n)}let n=`error: unknown command '${e}'${t}`;this.error(n,{code:`commander.unknownCommand`})}version(e,t,n){if(e===void 0)return this._version;this._version=e,t||=`-V, --version`,n||=`output the version number`;let r=this.createOption(t,n);return this._versionOptionName=r.attributeName(),this._registerOption(r),this.on(`option:`+r.name(),()=>{this._outputConfiguration.writeOut(`${e}\n`),this._exit(0,`commander.version`,e)}),this}description(e,t){return e===void 0&&t===void 0?this._description:(this._description=e,t&&(this._argsDescription=t),this)}summary(e){return e===void 0?this._summary:(this._summary=e,this)}alias(e){if(e===void 0)return this._aliases[0];let t=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler&&(t=this.commands[this.commands.length-1]),e===t._name)throw Error(`Command alias can't be the same as its name`);let n=this.parent?._findCommand(e);if(n){let t=[n.name()].concat(n.aliases()).join(`|`);throw Error(`cannot add alias '${e}' to command '${this.name()}' as already have command '${t}'`)}return t._aliases.push(e),this}aliases(e){return e===void 0?this._aliases:(e.forEach(e=>this.alias(e)),this)}usage(e){if(e===void 0){if(this._usage)return this._usage;let e=this.registeredArguments.map(e=>c(e));return[].concat(this.options.length||this._helpOption!==null?`[options]`:[],this.commands.length?`[command]`:[],this.registeredArguments.length?e:[]).join(` `)}return this._usage=e,this}name(e){return e===void 0?this._name:(this._name=e,this)}helpGroup(e){return e===void 0?this._helpGroupHeading??``:(this._helpGroupHeading=e,this)}commandsGroup(e){return e===void 0?this._defaultCommandGroup??``:(this._defaultCommandGroup=e,this)}optionsGroup(e){return e===void 0?this._defaultOptionGroup??``:(this._defaultOptionGroup=e,this)}_initOptionGroup(e){this._defaultOptionGroup&&!e.helpGroupHeading&&e.helpGroup(this._defaultOptionGroup)}_initCommandGroup(e){this._defaultCommandGroup&&!e.helpGroup()&&e.helpGroup(this._defaultCommandGroup)}nameFromFilename(e){return this._name=i.basename(e,i.extname(e)),this}executableDir(e){return e===void 0?this._executableDir:(this._executableDir=e,this)}helpInformation(e){let t=this.createHelp(),n=this._getOutputContext(e);t.prepareContext({error:n.error,helpWidth:n.helpWidth,outputHasColors:n.hasColors});let r=t.formatHelp(this,t);return n.hasColors?r:this._outputConfiguration.stripColor(r)}_getOutputContext(e){e||={};let t=!!e.error,n,r,i;return t?(n=e=>this._outputConfiguration.writeErr(e),r=this._outputConfiguration.getErrHasColors(),i=this._outputConfiguration.getErrHelpWidth()):(n=e=>this._outputConfiguration.writeOut(e),r=this._outputConfiguration.getOutHasColors(),i=this._outputConfiguration.getOutHelpWidth()),{error:t,write:e=>(r||(e=this._outputConfiguration.stripColor(e)),n(e)),hasColors:r,helpWidth:i}}outputHelp(e){let t;typeof e==`function`&&(t=e,e=void 0);let n=this._getOutputContext(e),r={error:n.error,write:n.write,command:this};this._getCommandAndAncestors().reverse().forEach(e=>e.emit(`beforeAllHelp`,r)),this.emit(`beforeHelp`,r);let i=this.helpInformation({error:n.error});if(t&&(i=t(i),typeof i!=`string`&&!Buffer.isBuffer(i)))throw Error(`outputHelp callback must return a string or a Buffer`);n.write(i),this._getHelpOption()?.long&&this.emit(this._getHelpOption().long),this.emit(`afterHelp`,r),this._getCommandAndAncestors().forEach(e=>e.emit(`afterAllHelp`,r))}helpOption(e,t){return typeof e==`boolean`?(e?(this._helpOption===null&&(this._helpOption=void 0),this._defaultOptionGroup&&this._initOptionGroup(this._getHelpOption())):this._helpOption=null,this):(this._helpOption=this.createOption(e??`-h, --help`,t??`display help for command`),(e||t)&&this._initOptionGroup(this._helpOption),this)}_getHelpOption(){return this._helpOption===void 0&&this.helpOption(void 0,void 0),this._helpOption}addHelpOption(e){return this._helpOption=e,this._initOptionGroup(e),this}help(e){this.outputHelp(e);let t=Number(o.exitCode??0);t===0&&e&&typeof e!=`function`&&e.error&&(t=1),this._exit(t,`commander.help`,`(outputHelp)`)}addHelpText(e,t){let n=[`beforeAll`,`before`,`after`,`afterAll`];if(!n.includes(e))throw Error(`Unexpected value for position to addHelpText.
|
|
20
|
-
Expecting one of '${n.join(`', '`)}'`);let r=`${e}Help`;return this.on(r,e=>{let n;n=typeof t==`function`?t({error:e.error,command:e.command}):t,n&&e.write(`${n}\n`)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();t&&e.find(e=>t.is(e))&&(this.outputHelp(),this._exit(0,`commander.helpDisplayed`,`(outputHelp)`))}};function g(e){return e.map(e=>{if(!e.startsWith(`--inspect`))return e;let t,n=`127.0.0.1`,r=`9229`,i;return(i=e.match(/^(--inspect(-brk)?)$/))===null?(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))===null?(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=i[1],n=i[3],r=i[4]):(t=i[1],/^\d+$/.test(i[3])?r=i[3]:n=i[3]):t=i[1],t&&r!==`0`?`${t}=${n}:${parseInt(r)+1}`:e})}function _(){if(o.env.NO_COLOR||o.env.FORCE_COLOR===`0`||o.env.FORCE_COLOR===`false`)return!1;if(o.env.FORCE_COLOR||o.env.CLICOLOR_FORCE!==void 0)return!0}e.Command=h,e.useColor=_}));const{program:M,createCommand:N,createArgument:oe,createOption:se,CommanderError:ce,InvalidArgumentError:P,InvalidOptionArgumentError:le,Command:ue,Argument:F,Option:de,Help:I}=n(e((e=>{let{Argument:t}=O(),{Command:n}=ae(),{CommanderError:r,InvalidArgumentError:i}=D(),{Help:a}=k(),{Option:o}=A();e.program=new n,e.createCommand=e=>new n(e),e.createOption=(e,t)=>new o(e,t),e.createArgument=(e,n)=>new t(e,n),e.Command=n,e.Option=o,e.Argument=t,e.Help=a,e.CommanderError=r,e.InvalidArgumentError=i,e.InvalidOptionArgumentError=i}))(),1).default;var L=`1.1.
|
|
20
|
+
Expecting one of '${n.join(`', '`)}'`);let r=`${e}Help`;return this.on(r,e=>{let n;n=typeof t==`function`?t({error:e.error,command:e.command}):t,n&&e.write(`${n}\n`)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();t&&e.find(e=>t.is(e))&&(this.outputHelp(),this._exit(0,`commander.helpDisplayed`,`(outputHelp)`))}};function g(e){return e.map(e=>{if(!e.startsWith(`--inspect`))return e;let t,n=`127.0.0.1`,r=`9229`,i;return(i=e.match(/^(--inspect(-brk)?)$/))===null?(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))===null?(i=e.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null&&(t=i[1],n=i[3],r=i[4]):(t=i[1],/^\d+$/.test(i[3])?r=i[3]:n=i[3]):t=i[1],t&&r!==`0`?`${t}=${n}:${parseInt(r)+1}`:e})}function _(){if(o.env.NO_COLOR||o.env.FORCE_COLOR===`0`||o.env.FORCE_COLOR===`false`)return!1;if(o.env.FORCE_COLOR||o.env.CLICOLOR_FORCE!==void 0)return!0}e.Command=h,e.useColor=_}));const{program:M,createCommand:N,createArgument:oe,createOption:se,CommanderError:ce,InvalidArgumentError:P,InvalidOptionArgumentError:le,Command:ue,Argument:F,Option:de,Help:I}=n(e((e=>{let{Argument:t}=O(),{Command:n}=ae(),{CommanderError:r,InvalidArgumentError:i}=D(),{Help:a}=k(),{Option:o}=A();e.program=new n,e.createCommand=e=>new n(e),e.createOption=(e,t)=>new o(e,t),e.createArgument=(e,n)=>new t(e,n),e.Command=n,e.Option=o,e.Argument=t,e.Help=a,e.CommanderError=r,e.InvalidArgumentError=i,e.InvalidOptionArgumentError=i}))(),1).default;var L=`1.1.25`;async function R(e){e||=process.cwd();let t=s(e);await t.build({cwd:e,entry:t.entry,outdir:t.outdir,watch:!1,onStart:()=>{console.log(`Building agent...`)},onResult:e=>{`error`in e&&(console.error(e.error),process.exit(1));for(let t of e.warnings)console.warn(t.message);console.log(`Built agent to ${e.entry}`)}})}var z=n(o(),1),B=n(g(),1);async function V(e,t){e||=process.cwd();let n=process.env.CI===`true`||!process.stdout.isTTY;await a(e);let r=await m(),o=new c({authToken:r,fetch:(e,t)=>{let n=new Headers(t?.headers);return n.set(`x-blink-cli-version`,L),fetch(e,{...t,headers:n})}}),l=await i(e,`package.json`);if(!l)throw Error(`package.json not found`);let g=await T(l,`utf-8`),v=JSON.parse(g),y=te(l),C=x(y,`.blink`,`config.json`),D={};if(ne(C)){let e=await T(C,`utf-8`);D=JSON.parse(e)}process.env.BLINK_ORGANIZATION_ID&&(D.organizationId=process.env.BLINK_ORGANIZATION_ID),process.env.BLINK_AGENT_ID&&(D.agentId=process.env.BLINK_AGENT_ID);let O;if(D?.organizationId)try{O=(await o.organizations.get(D.organizationId)).name}catch{D.organizationId=void 0}if(!D?.organizationId){let e=await o.organizations.list();if(e.length===1)D.organizationId=e[0].id,O=e[0].name;else if(n)throw Error(`Multiple organizations found. To use CI mode, please deploy in interactive mode first to select an organization and generate .blink/config.json`);else{let t=await f({message:`Which organization should contain this agent?`,options:e.map(e=>({value:e.id,label:e.name}))});if(d(t))return;D.organizationId=t,O=e.find(e=>e.id===t).name,console.log()}}let k,A=!1,j=!1;if(D?.agentId)try{k=(await o.agents.get(D.agentId)).name}catch{D.agentId=void 0}if(!D?.agentId)try{let e=await o.organizations.agents.get({organization_id:D.organizationId,agent_name:v.name});D.agentId=e.id,k=e.name}catch{A=!0,k=v.name}A?console.log(h.bold(`blink■`)+` creating agent `+O+`/`+k):console.log(h.bold(`blink■`)+` deploying agent `+O+`/`+k);let ae=Date.now(),M=s(y),N=await new Promise((e,t)=>{M.build({cwd:y,entry:M.entry,outdir:M.outdir,watch:!1,onStart:()=>{},onResult:t=>{e(t)}}).catch(t)});if(!N)throw Error(`Failed to build agent`);if(`error`in N)throw Error(N.error.message);let oe=Date.now()-ae;console.log(h.gray(`Built ${h.dim(`(${oe}ms)`)}`));let se=await w(N.outdir),ce=Object.fromEntries(se.map(e=>[x(N.outdir,e),e])),P=x(e,`README.md`);await H(P)&&(ce[P]=`README.md`);let le=await me(y),ue=Object.fromEntries(le.map(e=>[e,S(y,e)])),F=Object.entries(ce),de=Object.entries(ue),I=[...F,...de],R=I.length,z=0,B=0,V=0,K=Array(R);await pe(I,10,async([e,t],n)=>{let r=(await E(e)).size,i=++z;G(`${h.dim(`[${i}/${R}]`)} Uploading ${t} (${W(r)})...`);let a=await T(e),s=await o.files.upload(new File([Buffer.from(a)],t));K[n]={path:t,id:s.id},B+=1,V+=r}),G(h.gray(`Uploaded ${R} ${R===1?`file`:`files`} ${h.dim(`(${W(V)})`)}`)),process.stdout.write(`
|
|
21
21
|
`);let q=K.filter(Boolean),he=q.slice(0,F.length),ge=q.slice(F.length),J=await U(x(e,`.env.production`));if(A){let t=x(e,`.env.local`),r=x(e,`.env.production`),i=await U(t),a=Object.keys(i).filter(e=>!J[e]);if(a.length>0)if(n)console.log(h.yellow(`Warning:`)+` Missing ${a.length} var${a.length===1?``:`s`} in .env.production: ${a.join(`, `)}`),console.log(h.dim(` Skipping in CI mode. Set these in .env.production if needed.`));else{console.log(`
|
|
22
22
|
`+h.cyan(`Environment Variables`)),console.log(h.dim(` Missing ${a.length} var${a.length===1?``:`s`} in .env.production: ${a.join(`, `)}`));let e=await p({message:`Copy missing vars from .env.local to .env.production?`,initialValue:!0});if(d(e))return;if(console.log(),e){for(let e of a)J[e]=i[e];await re(r,`# Environment variables for production deployment\n${Object.entries(J).map(([e,t])=>`${e}=${t}`).join(`
|
|
23
23
|
`)}`,`utf-8`)}}let o=_(e);if(o)if(n)console.log(h.dim(` Skipping webhook tunnel migration in CI mode`));else{let e=`https://${o}.blink.host`;console.log(`
|
|
24
24
|
`+h.cyan(`Webhook Tunnel`)),console.log(h.dim(` Current: ${e} → local dev`)),console.log(h.dim(` After: ${e} → production`)),console.log(h.dim(` Migrating will keep your webhooks working in production`));let t=await p({message:`Migrate tunnel to production?`});if(d(t))return;console.log(),t&&(j=!0)}}let Y=Object.entries(J);if(A){let t=_(e),n=await o.agents.create({name:v.name,organization_id:D.organizationId,request_id:j?t:void 0,entrypoint:b(N.entry),output_files:he,source_files:ge,env:Y.map(([e,t])=>({key:e,value:t,target:[`production`,`preview`],secret:!0}))});D.agentId=n.id,k=n.name;let r=`https://blink.so/${O}/${k}`;console.log(h.gray(`Agent created ${h.dim(r)}`))}else if(Y.length>0){let e=0;for(let[t,n]of Y)await o.agents.env.create({agent_id:D.agentId,key:t,value:n,target:[`production`,`preview`],secret:!0,upsert:!0}),G(`${h.dim(`[${++e}/${Y.length}]`)} Updating environment variable: ${t} ${h.dim(`(.env.production)`)}`);G(h.gray(`Updated ${Y.length} environment ${Y.length===1?`variable`:`variables`} ${h.dim(`(.env.production)`)}`)),process.stdout.write(`
|
|
25
|
-
`)}let X=await U(x(e,`.env.local`)),Z=Object.keys(X).filter(e=>!Object.keys(J).includes(e));if(Z.length>0)if(n){console.log(h.yellow(`Warning:`)+` The following environment variables are set in .env.local but not in .env.production:`);for(let e of Z)console.log(`- ${e}`);console.log(h.dim(` Continuing deployment in CI mode`))}else{console.log(`Warning: The following environment variables are set in .env.local but not in .env.production:`);for(let e of Z)console.log(`- ${e}`);let e=await p({message:`Do you want to deploy anyway?`});if(e===!1||d(e))return}let _e=A?(await o.agents.deployments.list({agent_id:D.agentId})).items[0]:await o.agents.deployments.create({agent_id:D.agentId,target:`production`,entrypoint:b(N.entry),output_files:he,source_files:ge,message:t?.message}),Q=`https://blink.so/${O}/${k}/deployments/${_e.number}`;console.log(h.gray(`View Deployment ${h.dim(Q)}`)),n||await fe(C,D);let $=u();$.start(`Waiting for deployment to be live...`);try{for(;;){let t=await o.agents.deployments.get({agent_id:D.agentId,deployment_id:_e.id});if(t.status===`success`){$.stop(),A?(console.log(`Your agent is live.`),console.log(h.dim(Q))):(console.log(`Deployed. All new chats will use this version.`),console.log(h.dim(Q))),j&&(ee(e),console.log(h.yellow(`Note:`)+` To continue developing locally with webhooks, you'll need to reconfigure external services (Slack, GitHub, etc.)`),Object.keys(X).some(e=>e.toLowerCase().includes(`slack`))&&console.log(`Run ${h.cyan(`blink setup slack-app`)} to create a new Slack app for development.`));break}if(t.status===`failed`){$.stop(`Failed`+(t.error_message?`: ${t.error_message}`:``)),console.log(),console.log(`Logs: `+h.dim(Q));return}await new Promise(e=>setTimeout(e,500))}}catch(e){$.stop(`Failed to poll deployment status`),console.log(),console.log(`Error: `+ie(e)),console.log(`Logs: `+h.dim(Q))}}const H=async e=>{try{return await E(e),!0}catch{return!1}};async function U(e){return await H(e)?(0,z.parse)(await T(e,`utf-8`)):{}}async function fe(e,t){await C(te(e),{recursive:!0}),await re(e,JSON.stringify({_:`This file can be source controlled. It contains no secrets.`,...t},null,2),`utf-8`)}async function pe(e,t,n){let r=Array(e.length),i=0,a=Array(Math.min(t,e.length)).fill(0).map(async()=>{for(;;){let t=i++;if(t>=e.length)break;r[t]=await n(e[t],t)}});return await Promise.all(a),r}function W(e){if(e===0)return`0B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`,`TB`],r=Math.floor(Math.log(e)/Math.log(t)),i=e/t**+r;return`${i.toFixed(i>=100?0:i>=10?1:2)}${n[r]}`}function G(e){if(process.stdout.isTTY)try{process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(e);return}catch{}console.log(e)}async function me(e){let t=[],n=(0,B.default)().add([`.git`,`node_modules`,`.blink`,`.env`,`.env.*`]),r=x(e,`.gitignore`);if(await H(r)){let e=await T(r,`utf-8`);n.add(e)}async function i(r,a=e){let o=await w(r,{withFileTypes:!0});for(let e of o){let o=x(r,e.name),s=S(a,o);n.ignores(s)||(e.isDirectory()?await i(o,a):e.isFile()&&t.push(o))}}return await i(e),t}if(globalThis.WebSocket||(globalThis.WebSocket=r.default),globalThis.Bun!==void 0){let e=t(`perf_hooks`);e.monitorEventLoopDelay=()=>({enable:()=>{}})}globalThis.crypto||(globalThis.crypto={}),globalThis.crypto.randomUUID||(globalThis.crypto.randomUUID=()=>y()),M.name(`blink`).description(`Blink is a runtime for building and deploying AI agents.`).version(L).action(()=>{M.outputHelp()});const K=e=>async(...t)=>{let{default:n}=await e();return n(...t)};M.command(`init [directory]`).description(`Initialize a new Blink agent.`).action(K(()=>import(`./init-CAbtPm4f.js`))),M.command(`dev [directory] [options]`).description(`Start a development server for your agent.`).action(K(()=>import(`./dev-
|
|
25
|
+
`)}let X=await U(x(e,`.env.local`)),Z=Object.keys(X).filter(e=>!Object.keys(J).includes(e));if(Z.length>0)if(n){console.log(h.yellow(`Warning:`)+` The following environment variables are set in .env.local but not in .env.production:`);for(let e of Z)console.log(`- ${e}`);console.log(h.dim(` Continuing deployment in CI mode`))}else{console.log(`Warning: The following environment variables are set in .env.local but not in .env.production:`);for(let e of Z)console.log(`- ${e}`);let e=await p({message:`Do you want to deploy anyway?`});if(e===!1||d(e))return}let _e=A?(await o.agents.deployments.list({agent_id:D.agentId})).items[0]:await o.agents.deployments.create({agent_id:D.agentId,target:`production`,entrypoint:b(N.entry),output_files:he,source_files:ge,message:t?.message}),Q=`https://blink.so/${O}/${k}/deployments/${_e.number}`;console.log(h.gray(`View Deployment ${h.dim(Q)}`)),n||await fe(C,D);let $=u();$.start(`Waiting for deployment to be live...`);try{for(;;){let t=await o.agents.deployments.get({agent_id:D.agentId,deployment_id:_e.id});if(t.status===`success`){$.stop(),A?(console.log(`Your agent is live.`),console.log(h.dim(Q))):(console.log(`Deployed. All new chats will use this version.`),console.log(h.dim(Q))),j&&(ee(e),console.log(h.yellow(`Note:`)+` To continue developing locally with webhooks, you'll need to reconfigure external services (Slack, GitHub, etc.)`),Object.keys(X).some(e=>e.toLowerCase().includes(`slack`))&&console.log(`Run ${h.cyan(`blink setup slack-app`)} to create a new Slack app for development.`));break}if(t.status===`failed`){$.stop(`Failed`+(t.error_message?`: ${t.error_message}`:``)),console.log(),console.log(`Logs: `+h.dim(Q));return}await new Promise(e=>setTimeout(e,500))}}catch(e){$.stop(`Failed to poll deployment status`),console.log(),console.log(`Error: `+ie(e)),console.log(`Logs: `+h.dim(Q))}}const H=async e=>{try{return await E(e),!0}catch{return!1}};async function U(e){return await H(e)?(0,z.parse)(await T(e,`utf-8`)):{}}async function fe(e,t){await C(te(e),{recursive:!0}),await re(e,JSON.stringify({_:`This file can be source controlled. It contains no secrets.`,...t},null,2),`utf-8`)}async function pe(e,t,n){let r=Array(e.length),i=0,a=Array(Math.min(t,e.length)).fill(0).map(async()=>{for(;;){let t=i++;if(t>=e.length)break;r[t]=await n(e[t],t)}});return await Promise.all(a),r}function W(e){if(e===0)return`0B`;let t=1024,n=[`B`,`KB`,`MB`,`GB`,`TB`],r=Math.floor(Math.log(e)/Math.log(t)),i=e/t**+r;return`${i.toFixed(i>=100?0:i>=10?1:2)}${n[r]}`}function G(e){if(process.stdout.isTTY)try{process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(e);return}catch{}console.log(e)}async function me(e){let t=[],n=(0,B.default)().add([`.git`,`node_modules`,`.blink`,`.env`,`.env.*`]),r=x(e,`.gitignore`);if(await H(r)){let e=await T(r,`utf-8`);n.add(e)}async function i(r,a=e){let o=await w(r,{withFileTypes:!0});for(let e of o){let o=x(r,e.name),s=S(a,o);n.ignores(s)||(e.isDirectory()?await i(o,a):e.isFile()&&t.push(o))}}return await i(e),t}if(globalThis.WebSocket||(globalThis.WebSocket=r.default),globalThis.Bun!==void 0){let e=t(`perf_hooks`);e.monitorEventLoopDelay=()=>({enable:()=>{}})}globalThis.crypto||(globalThis.crypto={}),globalThis.crypto.randomUUID||(globalThis.crypto.randomUUID=()=>y()),M.name(`blink`).description(`Blink is a runtime for building and deploying AI agents.`).version(L).action(()=>{M.outputHelp()});const K=e=>async(...t)=>{let{default:n}=await e();return n(...t)};M.command(`init [directory]`).description(`Initialize a new Blink agent.`).action(K(()=>import(`./init-CAbtPm4f.js`))),M.command(`dev [directory] [options]`).description(`Start a development server for your agent.`).action(K(()=>import(`./dev-BYcnkDFn.js`))),M.command(`deploy [directory]`).description(`Deploy your agent to the Blink Cloud.`).option(`-m, --message <message>`,`Message for this deployment`).action(V),M.command(`build [directory]`).description(`Build your agent for production.`).action(R),M.command(`setup`).description(`Set up integrations for your agent.`).command(`slack-app [directory]`).description(`Set up Slack app integration`).action(v),M.command(`telemetry [boolean]`).description(`Enable or disable telemetry.`),M.command(`start [directory]`).description("Starts the Blink runtime in production mode. The agent must be compiled with `blink build` first."),M.command(`run <message...>`).description(`Run your agent programmatically and get the response.`).option(`-d, --directory <directory>`,`Directory to run the agent from (default: current directory)`).option(`-c, --chat <chat>`,`Chat key to use (default: 'default')`).action(K(()=>import(`./run-DYgfawiE.js`))),M.command(`connect`,{hidden:!0}).description(`Connect compute to the Blink Cloud.`).action(K(()=>import(`./connect-Bpv7PF3y.js`))),M.command(`chat`,{hidden:!0}).description(`Start a Blink chat connected to your machine.`).action(K(()=>import(`./chat-CYrdzv1d.js`))),M.command(`login`).description(`Log in to the Blink Cloud.`).action(K(()=>import(`./login-Bu2acoVp.js`))),M.configureOutput({writeErr:e=>{let t=e.replace(/\x1b\[[0-9;]*m/g,``);l.error(t.trim())}}),process.on(`unhandledRejection`,e=>{l.error(e?.message||String(e)),process.exit(1)}),M.parse(process.argv);export{};
|