blink 0.1.64 → 0.1.65

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.
@@ -1481,13 +1481,7 @@ The structure MUST be as follows:
1481
1481
  **Decision Rules (apply in order):**
1482
1482
  1. **Model Continues:** If your last response explicitly states an immediate next action *you* intend to take (e.g., "Next, I will...", "Now I'll process...", "Moving on to analyze...", indicates an intended tool call that didn't execute), OR if the response seems clearly incomplete (cut off mid-thought without a natural conclusion), then the **'model'** should speak next.
1483
1483
  2. **Question to User:** If your last response ends with a direct question specifically addressed *to the user*, then the **'user'** should speak next.
1484
- 3. **Waiting for User:** If your last response completed a thought, statement, or task *and* does not meet the criteria for Rule 1 (Model Continues) or Rule 2 (Question to User), it implies a pause expecting user input or reaction. In this case, the **'user'** should speak next.`}]}];try{let parsedResponse=await geminiClient.generateJson(contents,RESPONSE_SCHEMA,abortSignal,DEFAULT_GEMINI_FLASH_MODEL);return parsedResponse&&parsedResponse.next_speaker&&[`user`,`model`].includes(parsedResponse.next_speaker)?parsedResponse:null}catch(error$22){return console.warn(`Failed to talk to Gemini endpoint when seeing if conversation should continue.`,error$22),null}}var require_levenshtein=__commonJSMin(((exports,module)=>{(function(){var collator;try{collator=typeof Intl<`u`&&Intl.Collator!==void 0?Intl.Collator(`generic`,{sensitivity:`base`}):null}catch(err){console.log(`Collator could not be initialized and wouldn't be used`)}var prevRow=[],str2Char=[],Levenshtein={get:function(str1,str2,options$1){var useCollator=options$1&&collator&&options$1.useCollator,str1Len=str1.length,str2Len=str2.length;if(str1Len===0)return str2Len;if(str2Len===0)return str1Len;var curCol,nextCol,i$4,j$2,tmp;for(i$4=0;i$4<str2Len;++i$4)prevRow[i$4]=i$4,str2Char[i$4]=str2.charCodeAt(i$4);prevRow[str2Len]=str2Len;var strCmp;if(useCollator)for(i$4=0;i$4<str1Len;++i$4){for(nextCol=i$4+1,j$2=0;j$2<str2Len;++j$2)curCol=nextCol,strCmp=collator.compare(str1.charAt(i$4),String.fromCharCode(str2Char[j$2]))===0,nextCol=prevRow[j$2]+(strCmp?0:1),tmp=curCol+1,nextCol>tmp&&(nextCol=tmp),tmp=prevRow[j$2+1]+1,nextCol>tmp&&(nextCol=tmp),prevRow[j$2]=curCol;prevRow[j$2]=nextCol}else for(i$4=0;i$4<str1Len;++i$4){for(nextCol=i$4+1,j$2=0;j$2<str2Len;++j$2)curCol=nextCol,strCmp=str1.charCodeAt(i$4)===str2Char[j$2],nextCol=prevRow[j$2]+(strCmp?0:1),tmp=curCol+1,nextCol>tmp&&(nextCol=tmp),tmp=prevRow[j$2+1]+1,nextCol>tmp&&(nextCol=tmp),prevRow[j$2]=curCol;prevRow[j$2]=nextCol}return nextCol}};typeof define<`u`&&define!==null&&define.amd?define(function(){return Levenshtein}):module!=null&&exports!==void 0&&module.exports===exports?module.exports=Levenshtein:typeof self<`u`&&typeof self.postMessage==`function`&&typeof self.importScripts==`function`?self.Levenshtein=Levenshtein:typeof window<`u`&&window!==null&&(window.Levenshtein=Levenshtein)})()})),import_levenshtein=__toESM(require_levenshtein(),1),ChatRecordingService=class{conversationFile=null;cachedLastConvData=null;sessionId;projectHash;queuedThoughts=[];queuedTokens=null;config;constructor(config){this.config=config,this.sessionId=config.getSessionId(),this.projectHash=getProjectHash(config.getProjectRoot())}initialize(resumedSessionData){try{if(resumedSessionData)this.conversationFile=resumedSessionData.filePath,this.sessionId=resumedSessionData.conversation.sessionId,this.updateConversation(conversation=>{conversation.sessionId=this.sessionId}),this.cachedLastConvData=null;else{let chatsDir=path.join(this.config.storage.getProjectTempDir(),`chats`);fs.mkdirSync(chatsDir,{recursive:!0});let timestamp=new Date().toISOString().slice(0,16).replace(/:/g,`-`),filename=`session-${timestamp}-${this.sessionId.slice(0,8)}.json`;this.conversationFile=path.join(chatsDir,filename),this.writeConversation({sessionId:this.sessionId,projectHash:this.projectHash,startTime:new Date().toISOString(),lastUpdated:new Date().toISOString(),messages:[]})}this.queuedThoughts=[],this.queuedTokens=null}catch(error$22){throw console.error(`Error initializing chat recording service:`,error$22),error$22}}getLastMessage(conversation){return conversation.messages.at(-1)}newMessage(type,content){return{id:randomUUID$1(),timestamp:new Date().toISOString(),type,content}}recordMessage(message){if(this.conversationFile)try{this.updateConversation(conversation=>{let msg=this.newMessage(message.type,message.content);msg.type===`gemini`?(conversation.messages.push({...msg,thoughts:this.queuedThoughts,tokens:this.queuedTokens,model:this.config.getModel()}),this.queuedThoughts=[],this.queuedTokens=null):conversation.messages.push(msg)})}catch(error$22){throw console.error(`Error saving message:`,error$22),error$22}}recordThought(thought){if(this.conversationFile)try{this.queuedThoughts.push({...thought,timestamp:new Date().toISOString()})}catch(error$22){throw console.error(`Error saving thought:`,error$22),error$22}}recordMessageTokens(respUsageMetadata){if(this.conversationFile)try{let tokens={input:respUsageMetadata.promptTokenCount??0,output:respUsageMetadata.candidatesTokenCount??0,cached:respUsageMetadata.cachedContentTokenCount??0,thoughts:respUsageMetadata.thoughtsTokenCount??0,tool:respUsageMetadata.toolUsePromptTokenCount??0,total:respUsageMetadata.totalTokenCount??0};this.updateConversation(conversation=>{let lastMsg=this.getLastMessage(conversation);lastMsg&&lastMsg.type===`gemini`&&!lastMsg.tokens?(lastMsg.tokens=tokens,this.queuedTokens=null):this.queuedTokens=tokens})}catch(error$22){throw console.error(`Error updating message tokens:`,error$22),error$22}}recordToolCalls(toolCalls){if(!this.conversationFile)return;let toolRegistry=this.config.getToolRegistry(),enrichedToolCalls=toolCalls.map(toolCall=>{let toolInstance=toolRegistry.getTool(toolCall.name);return{...toolCall,displayName:toolInstance?.displayName||toolCall.name,description:toolInstance?.description||``,renderOutputAsMarkdown:toolInstance?.isOutputMarkdown||!1}});try{this.updateConversation(conversation=>{let lastMsg=this.getLastMessage(conversation);if(!lastMsg||lastMsg.type!==`gemini`||this.queuedThoughts.length>0){let newMsg={...this.newMessage(`gemini`,``),type:`gemini`,toolCalls:enrichedToolCalls,thoughts:this.queuedThoughts,model:this.config.getModel()};this.queuedThoughts.length>0&&(newMsg.thoughts=this.queuedThoughts,this.queuedThoughts=[]),this.queuedTokens&&(newMsg.tokens=this.queuedTokens,this.queuedTokens=null),conversation.messages.push(newMsg)}else{lastMsg.toolCalls||(lastMsg.toolCalls=[]),lastMsg.toolCalls=lastMsg.toolCalls.map(toolCall=>{let incomingToolCall=toolCalls.find(tc=>tc.id===toolCall.id);return incomingToolCall?{...toolCall,...incomingToolCall}:toolCall});for(let toolCall of enrichedToolCalls){let existingToolCall=lastMsg.toolCalls.find(tc=>tc.id===toolCall.id);existingToolCall||lastMsg.toolCalls.push(toolCall)}}})}catch(error$22){throw console.error(`Error adding tool call to message:`,error$22),error$22}}readConversation(){try{return this.cachedLastConvData=fs.readFileSync(this.conversationFile,`utf8`),JSON.parse(this.cachedLastConvData)}catch(error$22){if(error$22.code!==`ENOENT`)throw console.error(`Error reading conversation file:`,error$22),error$22;return{sessionId:this.sessionId,projectHash:this.projectHash,startTime:new Date().toISOString(),lastUpdated:new Date().toISOString(),messages:[]}}}writeConversation(conversation){try{if(!this.conversationFile||conversation.messages.length===0)return;if(this.cachedLastConvData!==JSON.stringify(conversation,null,2)){conversation.lastUpdated=new Date().toISOString();let newContent=JSON.stringify(conversation,null,2);this.cachedLastConvData=newContent,fs.writeFileSync(this.conversationFile,newContent)}}catch(error$22){throw console.error(`Error writing conversation file:`,error$22),error$22}}updateConversation(updateFn){let conversation=this.readConversation();updateFn(conversation),this.writeConversation(conversation)}deleteSession(sessionId$1){try{let chatsDir=path.join(this.config.storage.getProjectTempDir(),`chats`),sessionPath=path.join(chatsDir,`${sessionId$1}.json`);fs.unlinkSync(sessionPath)}catch(error$22){throw console.error(`Error deleting session:`,error$22),error$22}}};init_esm$1();
1485
- /**
1486
- * @license
1487
- * Copyright 2025 Google LLC
1488
- * SPDX-License-Identifier: Apache-2.0
1489
- */
1490
- var TelemetryTarget;(function(TelemetryTarget$1){TelemetryTarget$1.GCP=`gcp`,TelemetryTarget$1.LOCAL=`local`})(TelemetryTarget||(TelemetryTarget={}));const DEFAULT_TELEMETRY_TARGET=TelemetryTarget.LOCAL,DEFAULT_OTLP_ENDPOINT=`http://localhost:4317`;async function handleFallback(config,failedModel,authType,error$22){if(authType!==AuthType.LOGIN_WITH_GOOGLE)return null;let fallbackModel=DEFAULT_GEMINI_FLASH_MODEL;if(failedModel===fallbackModel)return null;let fallbackModelHandler=config.fallbackModelHandler;if(typeof fallbackModelHandler!=`function`)return null;try{let intent=await fallbackModelHandler(failedModel,fallbackModel,error$22);switch(intent){case`retry`:return activateFallbackMode(config,authType),!0;case`stop`:return activateFallbackMode(config,authType),!1;case`auth`:return!1;default:throw Error(`Unexpected fallback intent received from fallbackModelHandler: "${intent}"`)}}catch(handlerError){return console.error(`Fallback UI handler failed:`,handlerError),null}}function activateFallbackMode(config,authType){config.isInFallbackMode()||(config.setFallbackMode(!0),authType&&logFlashFallback(config,new FlashFallbackEvent(authType)))}function partListUnionToString(value){return partToString(value,{verbose:!0})}var StreamEventType;(function(StreamEventType$1){StreamEventType$1.CHUNK=`chunk`,StreamEventType$1.RETRY=`retry`})(StreamEventType||(StreamEventType={}));const INVALID_CONTENT_RETRY_OPTIONS={maxAttempts:3,initialDelayMs:500};function isValidResponse(response){if(response.candidates===void 0||response.candidates.length===0)return!1;let content=response.candidates[0]?.content;return content===void 0?!1:isValidContent(content)}function isValidContent(content){if(content.parts===void 0||content.parts.length===0)return!1;for(let part of content.parts)if(part===void 0||Object.keys(part).length===0||!part.thought&&part.text!==void 0&&part.text===``)return!1;return!0}function validateHistory(history){for(let content of history)if(content.role!==`user`&&content.role!==`model`)throw Error(`Role must be user or model, but got ${content.role}.`)}function extractCuratedHistory(comprehensiveHistory){if(comprehensiveHistory===void 0||comprehensiveHistory.length===0)return[];let curatedHistory=[],length=comprehensiveHistory.length,i$4=0;for(;i$4<length;)if(comprehensiveHistory[i$4].role===`user`)curatedHistory.push(comprehensiveHistory[i$4]),i$4++;else{let modelOutput=[],isValid=!0;for(;i$4<length&&comprehensiveHistory[i$4].role===`model`;)modelOutput.push(comprehensiveHistory[i$4]),isValid&&!isValidContent(comprehensiveHistory[i$4])&&(isValid=!1),i$4++;isValid&&curatedHistory.push(...modelOutput)}return curatedHistory}var EmptyStreamError=class extends Error{constructor(message){super(message),this.name=`EmptyStreamError`}},GeminiChat=class{config;generationConfig;history;sendPromise=Promise.resolve();chatRecordingService;constructor(config,generationConfig={},history=[]){this.config=config,this.generationConfig=generationConfig,this.history=history,validateHistory(history),this.chatRecordingService=new ChatRecordingService(config),this.chatRecordingService.initialize()}setSystemInstruction(sysInstr){this.generationConfig.systemInstruction=sysInstr}async sendMessageStream(params,prompt_id){await this.sendPromise;let streamDoneResolver,streamDonePromise=new Promise(resolve$9=>{streamDoneResolver=resolve$9});this.sendPromise=streamDonePromise;let userContent=createUserContent(params.message);if(!isFunctionResponse(userContent)){let userMessage=Array.isArray(params.message)?params.message:[params.message],userMessageContent=partListUnionToString(toParts(userMessage));this.chatRecordingService.recordMessage({type:`user`,content:userMessageContent})}this.history.push(userContent);let requestContents=this.getHistory(!0),self$1=this;return(async function*(){try{let lastError=Error(`Request failed after all retries.`);for(let attempt=0;attempt<INVALID_CONTENT_RETRY_OPTIONS.maxAttempts;attempt++)try{attempt>0&&(yield{type:StreamEventType.RETRY});let stream$8=await self$1.makeApiCallAndProcessStream(requestContents,params,prompt_id,userContent);for await(let chunk$1 of stream$8)yield{type:StreamEventType.CHUNK,value:chunk$1};lastError=null;break}catch(error$22){lastError=error$22;let isContentError=error$22 instanceof EmptyStreamError;if(isContentError&&attempt<INVALID_CONTENT_RETRY_OPTIONS.maxAttempts-1){logContentRetry(self$1.config,new ContentRetryEvent(attempt,`EmptyStreamError`,INVALID_CONTENT_RETRY_OPTIONS.initialDelayMs)),await new Promise(res=>setTimeout(res,INVALID_CONTENT_RETRY_OPTIONS.initialDelayMs*(attempt+1)));continue}break}if(lastError)throw lastError instanceof EmptyStreamError&&logContentRetryFailure(self$1.config,new ContentRetryFailureEvent(INVALID_CONTENT_RETRY_OPTIONS.maxAttempts,`EmptyStreamError`)),self$1.history[self$1.history.length-1]===userContent&&self$1.history.pop(),lastError}finally{streamDoneResolver()}})()}async makeApiCallAndProcessStream(requestContents,params,prompt_id,userContent){let currentAttemptModel,apiCall=()=>{let modelToUse=this.config.isInFallbackMode()?DEFAULT_GEMINI_FLASH_MODEL:this.config.getModel();if(currentAttemptModel=modelToUse,this.config.getQuotaErrorOccurred()&&modelToUse===DEFAULT_GEMINI_FLASH_MODEL)throw Error(`Please submit a new query to continue with the Flash model.`);return this.config.getContentGenerator().generateContentStream({model:modelToUse,contents:requestContents,config:{...this.generationConfig,...params.config}},prompt_id)},onPersistent429Callback=async(authType,error$22)=>currentAttemptModel?await handleFallback(this.config,currentAttemptModel,authType,error$22):null,streamResponse=await retryWithBackoff(apiCall,{shouldRetry:error$22=>{if(error$22 instanceof Error&&error$22.message){if(isSchemaDepthError(error$22.message))return!1;if(error$22.message.includes(`429`)||error$22.message.match(/5\d{2}/))return!0}return!1},onPersistent429:onPersistent429Callback,authType:this.config.getContentGeneratorConfig()?.authType});return this.processStreamResponse(streamResponse,userContent)}getHistory(curated=!1){let history=curated?extractCuratedHistory(this.history):this.history;return structuredClone(history)}clearHistory(){this.history=[]}addHistory(content){this.history.push(content)}setHistory(history){this.history=history}stripThoughtsFromHistory(){this.history=this.history.map(content=>{let newContent={...content};return newContent.parts&&(newContent.parts=newContent.parts.map(part=>{if(part&&typeof part==`object`&&`thoughtSignature`in part){let newPart={...part};return delete newPart.thoughtSignature,newPart}return part})),newContent})}setTools(tools){this.generationConfig.tools=tools}async maybeIncludeSchemaDepthContext(error$22){if(isSchemaDepthError(error$22.message)||isInvalidArgumentError(error$22.message)){let tools=this.config.getToolRegistry().getAllTools(),cyclicSchemaTools=[];for(let tool$1 of tools)(tool$1.schema.parametersJsonSchema&&hasCycleInSchema(tool$1.schema.parametersJsonSchema)||tool$1.schema.parameters&&hasCycleInSchema(tool$1.schema.parameters))&&cyclicSchemaTools.push(tool$1.displayName);if(cyclicSchemaTools.length>0){let extraDetails=`
1484
+ 3. **Waiting for User:** If your last response completed a thought, statement, or task *and* does not meet the criteria for Rule 1 (Model Continues) or Rule 2 (Question to User), it implies a pause expecting user input or reaction. In this case, the **'user'** should speak next.`}]}];try{let parsedResponse=await geminiClient.generateJson(contents,RESPONSE_SCHEMA,abortSignal,DEFAULT_GEMINI_FLASH_MODEL);return parsedResponse&&parsedResponse.next_speaker&&[`user`,`model`].includes(parsedResponse.next_speaker)?parsedResponse:null}catch(error$22){return console.warn(`Failed to talk to Gemini endpoint when seeing if conversation should continue.`,error$22),null}}var require_levenshtein=__commonJSMin(((exports,module)=>{(function(){var collator;try{collator=typeof Intl<`u`&&Intl.Collator!==void 0?Intl.Collator(`generic`,{sensitivity:`base`}):null}catch(err){console.log(`Collator could not be initialized and wouldn't be used`)}var prevRow=[],str2Char=[],Levenshtein={get:function(str1,str2,options$1){var useCollator=options$1&&collator&&options$1.useCollator,str1Len=str1.length,str2Len=str2.length;if(str1Len===0)return str2Len;if(str2Len===0)return str1Len;var curCol,nextCol,i$4,j$2,tmp;for(i$4=0;i$4<str2Len;++i$4)prevRow[i$4]=i$4,str2Char[i$4]=str2.charCodeAt(i$4);prevRow[str2Len]=str2Len;var strCmp;if(useCollator)for(i$4=0;i$4<str1Len;++i$4){for(nextCol=i$4+1,j$2=0;j$2<str2Len;++j$2)curCol=nextCol,strCmp=collator.compare(str1.charAt(i$4),String.fromCharCode(str2Char[j$2]))===0,nextCol=prevRow[j$2]+(strCmp?0:1),tmp=curCol+1,nextCol>tmp&&(nextCol=tmp),tmp=prevRow[j$2+1]+1,nextCol>tmp&&(nextCol=tmp),prevRow[j$2]=curCol;prevRow[j$2]=nextCol}else for(i$4=0;i$4<str1Len;++i$4){for(nextCol=i$4+1,j$2=0;j$2<str2Len;++j$2)curCol=nextCol,strCmp=str1.charCodeAt(i$4)===str2Char[j$2],nextCol=prevRow[j$2]+(strCmp?0:1),tmp=curCol+1,nextCol>tmp&&(nextCol=tmp),tmp=prevRow[j$2+1]+1,nextCol>tmp&&(nextCol=tmp),prevRow[j$2]=curCol;prevRow[j$2]=nextCol}return nextCol}};typeof define<`u`&&define!==null&&define.amd?define(function(){return Levenshtein}):module!=null&&exports!==void 0&&module.exports===exports?module.exports=Levenshtein:typeof self<`u`&&typeof self.postMessage==`function`&&typeof self.importScripts==`function`?self.Levenshtein=Levenshtein:typeof window<`u`&&window!==null&&(window.Levenshtein=Levenshtein)})()})),import_levenshtein=__toESM(require_levenshtein(),1),ChatRecordingService=class{conversationFile=null;cachedLastConvData=null;sessionId;projectHash;queuedThoughts=[];queuedTokens=null;config;constructor(config){this.config=config,this.sessionId=config.getSessionId(),this.projectHash=getProjectHash(config.getProjectRoot())}initialize(resumedSessionData){try{if(resumedSessionData)this.conversationFile=resumedSessionData.filePath,this.sessionId=resumedSessionData.conversation.sessionId,this.updateConversation(conversation=>{conversation.sessionId=this.sessionId}),this.cachedLastConvData=null;else{let chatsDir=path.join(this.config.storage.getProjectTempDir(),`chats`);fs.mkdirSync(chatsDir,{recursive:!0});let timestamp=new Date().toISOString().slice(0,16).replace(/:/g,`-`),filename=`session-${timestamp}-${this.sessionId.slice(0,8)}.json`;this.conversationFile=path.join(chatsDir,filename),this.writeConversation({sessionId:this.sessionId,projectHash:this.projectHash,startTime:new Date().toISOString(),lastUpdated:new Date().toISOString(),messages:[]})}this.queuedThoughts=[],this.queuedTokens=null}catch(error$22){throw console.error(`Error initializing chat recording service:`,error$22),error$22}}getLastMessage(conversation){return conversation.messages.at(-1)}newMessage(type,content){return{id:randomUUID$1(),timestamp:new Date().toISOString(),type,content}}recordMessage(message){if(this.conversationFile)try{this.updateConversation(conversation=>{let msg=this.newMessage(message.type,message.content);msg.type===`gemini`?(conversation.messages.push({...msg,thoughts:this.queuedThoughts,tokens:this.queuedTokens,model:this.config.getModel()}),this.queuedThoughts=[],this.queuedTokens=null):conversation.messages.push(msg)})}catch(error$22){throw console.error(`Error saving message:`,error$22),error$22}}recordThought(thought){if(this.conversationFile)try{this.queuedThoughts.push({...thought,timestamp:new Date().toISOString()})}catch(error$22){throw console.error(`Error saving thought:`,error$22),error$22}}recordMessageTokens(respUsageMetadata){if(this.conversationFile)try{let tokens={input:respUsageMetadata.promptTokenCount??0,output:respUsageMetadata.candidatesTokenCount??0,cached:respUsageMetadata.cachedContentTokenCount??0,thoughts:respUsageMetadata.thoughtsTokenCount??0,tool:respUsageMetadata.toolUsePromptTokenCount??0,total:respUsageMetadata.totalTokenCount??0};this.updateConversation(conversation=>{let lastMsg=this.getLastMessage(conversation);lastMsg&&lastMsg.type===`gemini`&&!lastMsg.tokens?(lastMsg.tokens=tokens,this.queuedTokens=null):this.queuedTokens=tokens})}catch(error$22){throw console.error(`Error updating message tokens:`,error$22),error$22}}recordToolCalls(toolCalls){if(!this.conversationFile)return;let toolRegistry=this.config.getToolRegistry(),enrichedToolCalls=toolCalls.map(toolCall=>{let toolInstance=toolRegistry.getTool(toolCall.name);return{...toolCall,displayName:toolInstance?.displayName||toolCall.name,description:toolInstance?.description||``,renderOutputAsMarkdown:toolInstance?.isOutputMarkdown||!1}});try{this.updateConversation(conversation=>{let lastMsg=this.getLastMessage(conversation);if(!lastMsg||lastMsg.type!==`gemini`||this.queuedThoughts.length>0){let newMsg={...this.newMessage(`gemini`,``),type:`gemini`,toolCalls:enrichedToolCalls,thoughts:this.queuedThoughts,model:this.config.getModel()};this.queuedThoughts.length>0&&(newMsg.thoughts=this.queuedThoughts,this.queuedThoughts=[]),this.queuedTokens&&(newMsg.tokens=this.queuedTokens,this.queuedTokens=null),conversation.messages.push(newMsg)}else{lastMsg.toolCalls||(lastMsg.toolCalls=[]),lastMsg.toolCalls=lastMsg.toolCalls.map(toolCall=>{let incomingToolCall=toolCalls.find(tc=>tc.id===toolCall.id);return incomingToolCall?{...toolCall,...incomingToolCall}:toolCall});for(let toolCall of enrichedToolCalls){let existingToolCall=lastMsg.toolCalls.find(tc=>tc.id===toolCall.id);existingToolCall||lastMsg.toolCalls.push(toolCall)}}})}catch(error$22){throw console.error(`Error adding tool call to message:`,error$22),error$22}}readConversation(){try{return this.cachedLastConvData=fs.readFileSync(this.conversationFile,`utf8`),JSON.parse(this.cachedLastConvData)}catch(error$22){if(error$22.code!==`ENOENT`)throw console.error(`Error reading conversation file:`,error$22),error$22;return{sessionId:this.sessionId,projectHash:this.projectHash,startTime:new Date().toISOString(),lastUpdated:new Date().toISOString(),messages:[]}}}writeConversation(conversation){try{if(!this.conversationFile||conversation.messages.length===0)return;if(this.cachedLastConvData!==JSON.stringify(conversation,null,2)){conversation.lastUpdated=new Date().toISOString();let newContent=JSON.stringify(conversation,null,2);this.cachedLastConvData=newContent,fs.writeFileSync(this.conversationFile,newContent)}}catch(error$22){throw console.error(`Error writing conversation file:`,error$22),error$22}}updateConversation(updateFn){let conversation=this.readConversation();updateFn(conversation),this.writeConversation(conversation)}deleteSession(sessionId$1){try{let chatsDir=path.join(this.config.storage.getProjectTempDir(),`chats`),sessionPath=path.join(chatsDir,`${sessionId$1}.json`);fs.unlinkSync(sessionPath)}catch(error$22){throw console.error(`Error deleting session:`,error$22),error$22}}},TelemetryTarget;(function(TelemetryTarget$1){TelemetryTarget$1.GCP=`gcp`,TelemetryTarget$1.LOCAL=`local`})(TelemetryTarget||(TelemetryTarget={}));const DEFAULT_TELEMETRY_TARGET=TelemetryTarget.LOCAL,DEFAULT_OTLP_ENDPOINT=`http://localhost:4317`;async function handleFallback(config,failedModel,authType,error$22){if(authType!==AuthType.LOGIN_WITH_GOOGLE)return null;let fallbackModel=DEFAULT_GEMINI_FLASH_MODEL;if(failedModel===fallbackModel)return null;let fallbackModelHandler=config.fallbackModelHandler;if(typeof fallbackModelHandler!=`function`)return null;try{let intent=await fallbackModelHandler(failedModel,fallbackModel,error$22);switch(intent){case`retry`:return activateFallbackMode(config,authType),!0;case`stop`:return activateFallbackMode(config,authType),!1;case`auth`:return!1;default:throw Error(`Unexpected fallback intent received from fallbackModelHandler: "${intent}"`)}}catch(handlerError){return console.error(`Fallback UI handler failed:`,handlerError),null}}function activateFallbackMode(config,authType){config.isInFallbackMode()||(config.setFallbackMode(!0),authType&&logFlashFallback(config,new FlashFallbackEvent(authType)))}function partListUnionToString(value){return partToString(value,{verbose:!0})}var StreamEventType;(function(StreamEventType$1){StreamEventType$1.CHUNK=`chunk`,StreamEventType$1.RETRY=`retry`})(StreamEventType||(StreamEventType={}));const INVALID_CONTENT_RETRY_OPTIONS={maxAttempts:3,initialDelayMs:500};function isValidResponse(response){if(response.candidates===void 0||response.candidates.length===0)return!1;let content=response.candidates[0]?.content;return content===void 0?!1:isValidContent(content)}function isValidContent(content){if(content.parts===void 0||content.parts.length===0)return!1;for(let part of content.parts)if(part===void 0||Object.keys(part).length===0||!part.thought&&part.text!==void 0&&part.text===``)return!1;return!0}function validateHistory(history){for(let content of history)if(content.role!==`user`&&content.role!==`model`)throw Error(`Role must be user or model, but got ${content.role}.`)}function extractCuratedHistory(comprehensiveHistory){if(comprehensiveHistory===void 0||comprehensiveHistory.length===0)return[];let curatedHistory=[],length=comprehensiveHistory.length,i$4=0;for(;i$4<length;)if(comprehensiveHistory[i$4].role===`user`)curatedHistory.push(comprehensiveHistory[i$4]),i$4++;else{let modelOutput=[],isValid=!0;for(;i$4<length&&comprehensiveHistory[i$4].role===`model`;)modelOutput.push(comprehensiveHistory[i$4]),isValid&&!isValidContent(comprehensiveHistory[i$4])&&(isValid=!1),i$4++;isValid&&curatedHistory.push(...modelOutput)}return curatedHistory}var EmptyStreamError=class extends Error{constructor(message){super(message),this.name=`EmptyStreamError`}},GeminiChat=class{config;generationConfig;history;sendPromise=Promise.resolve();chatRecordingService;constructor(config,generationConfig={},history=[]){this.config=config,this.generationConfig=generationConfig,this.history=history,validateHistory(history),this.chatRecordingService=new ChatRecordingService(config),this.chatRecordingService.initialize()}setSystemInstruction(sysInstr){this.generationConfig.systemInstruction=sysInstr}async sendMessageStream(params,prompt_id){await this.sendPromise;let streamDoneResolver,streamDonePromise=new Promise(resolve$9=>{streamDoneResolver=resolve$9});this.sendPromise=streamDonePromise;let userContent=createUserContent(params.message);if(!isFunctionResponse(userContent)){let userMessage=Array.isArray(params.message)?params.message:[params.message],userMessageContent=partListUnionToString(toParts(userMessage));this.chatRecordingService.recordMessage({type:`user`,content:userMessageContent})}this.history.push(userContent);let requestContents=this.getHistory(!0),self$1=this;return(async function*(){try{let lastError=Error(`Request failed after all retries.`);for(let attempt=0;attempt<INVALID_CONTENT_RETRY_OPTIONS.maxAttempts;attempt++)try{attempt>0&&(yield{type:StreamEventType.RETRY});let stream$8=await self$1.makeApiCallAndProcessStream(requestContents,params,prompt_id,userContent);for await(let chunk$1 of stream$8)yield{type:StreamEventType.CHUNK,value:chunk$1};lastError=null;break}catch(error$22){lastError=error$22;let isContentError=error$22 instanceof EmptyStreamError;if(isContentError&&attempt<INVALID_CONTENT_RETRY_OPTIONS.maxAttempts-1){logContentRetry(self$1.config,new ContentRetryEvent(attempt,`EmptyStreamError`,INVALID_CONTENT_RETRY_OPTIONS.initialDelayMs)),await new Promise(res=>setTimeout(res,INVALID_CONTENT_RETRY_OPTIONS.initialDelayMs*(attempt+1)));continue}break}if(lastError)throw lastError instanceof EmptyStreamError&&logContentRetryFailure(self$1.config,new ContentRetryFailureEvent(INVALID_CONTENT_RETRY_OPTIONS.maxAttempts,`EmptyStreamError`)),self$1.history[self$1.history.length-1]===userContent&&self$1.history.pop(),lastError}finally{streamDoneResolver()}})()}async makeApiCallAndProcessStream(requestContents,params,prompt_id,userContent){let currentAttemptModel,apiCall=()=>{let modelToUse=this.config.isInFallbackMode()?DEFAULT_GEMINI_FLASH_MODEL:this.config.getModel();if(currentAttemptModel=modelToUse,this.config.getQuotaErrorOccurred()&&modelToUse===DEFAULT_GEMINI_FLASH_MODEL)throw Error(`Please submit a new query to continue with the Flash model.`);return this.config.getContentGenerator().generateContentStream({model:modelToUse,contents:requestContents,config:{...this.generationConfig,...params.config}},prompt_id)},onPersistent429Callback=async(authType,error$22)=>currentAttemptModel?await handleFallback(this.config,currentAttemptModel,authType,error$22):null,streamResponse=await retryWithBackoff(apiCall,{shouldRetry:error$22=>{if(error$22 instanceof Error&&error$22.message){if(isSchemaDepthError(error$22.message))return!1;if(error$22.message.includes(`429`)||error$22.message.match(/5\d{2}/))return!0}return!1},onPersistent429:onPersistent429Callback,authType:this.config.getContentGeneratorConfig()?.authType});return this.processStreamResponse(streamResponse,userContent)}getHistory(curated=!1){let history=curated?extractCuratedHistory(this.history):this.history;return structuredClone(history)}clearHistory(){this.history=[]}addHistory(content){this.history.push(content)}setHistory(history){this.history=history}stripThoughtsFromHistory(){this.history=this.history.map(content=>{let newContent={...content};return newContent.parts&&(newContent.parts=newContent.parts.map(part=>{if(part&&typeof part==`object`&&`thoughtSignature`in part){let newPart={...part};return delete newPart.thoughtSignature,newPart}return part})),newContent})}setTools(tools){this.generationConfig.tools=tools}async maybeIncludeSchemaDepthContext(error$22){if(isSchemaDepthError(error$22.message)||isInvalidArgumentError(error$22.message)){let tools=this.config.getToolRegistry().getAllTools(),cyclicSchemaTools=[];for(let tool$1 of tools)(tool$1.schema.parametersJsonSchema&&hasCycleInSchema(tool$1.schema.parametersJsonSchema)||tool$1.schema.parameters&&hasCycleInSchema(tool$1.schema.parameters))&&cyclicSchemaTools.push(tool$1.displayName);if(cyclicSchemaTools.length>0){let extraDetails=`
1491
1485
 
1492
1486
  This error was probably caused by cyclic schema references in one of the following tools, try disabling them with excludeTools:
1493
1487
 
@@ -1671,4 +1665,4 @@ const SCREEN_READER_USER_PREFIX=`User: `,InputPrompt=({buffer:buffer$1,onSubmit,
1671
1665
  `)&&(textToInsert+=` `),buffer$1.replaceRangeByOffset(offset,offset,textToInsert)}}}catch(error$22){console.error(`Error handling clipboard image:`,error$22)}},[buffer$1,config]),handleInput=(0,import_react.useCallback)(key=>{if(!(!focus&&!key.paste)){if(key.paste){setRecentPasteTime(Date.now()),pasteTimeoutRef.current&&clearTimeout(pasteTimeoutRef.current),pasteTimeoutRef.current=setTimeout(()=>{setRecentPasteTime(null),pasteTimeoutRef.current=null},500),buffer$1.handleInput(key);return}if(!(vimHandleInput&&vimHandleInput(key))){if(key.name!==`escape`&&(escPressCount>0||showEscapePrompt)&&resetEscapeState(),key.sequence===`!`&&buffer$1.text===``&&!completion.showSuggestions){setShellModeActive(!shellModeActive),buffer$1.setText(``);return}if(keyMatchers[Command.ESCAPE](key)){if(reverseSearchActive){setReverseSearchActive(!1),reverseSearchCompletion.resetCompletionState(),buffer$1.setText(textBeforeReverseSearch);let offset=logicalPosToOffset(buffer$1.lines,cursorPosition[0],cursorPosition[1]);buffer$1.moveToOffset(offset);return}if(shellModeActive){setShellModeActive(!1),resetEscapeState();return}if(completion.showSuggestions){completion.resetCompletionState(),resetEscapeState();return}if(escPressCount===0){if(buffer$1.text===``)return;setEscPressCount(1),setShowEscapePrompt(!0),escapeTimerRef.current&&clearTimeout(escapeTimerRef.current),escapeTimerRef.current=setTimeout(()=>{resetEscapeState()},500)}else buffer$1.setText(``),resetCompletionState(),resetEscapeState();return}if(shellModeActive&&keyMatchers[Command.REVERSE_SEARCH](key)){setReverseSearchActive(!0),setTextBeforeReverseSearch(buffer$1.text),setCursorPosition(buffer$1.cursor);return}if(keyMatchers[Command.CLEAR_SCREEN](key)){onClearScreen();return}if(reverseSearchActive){let{activeSuggestionIndex,navigateUp,navigateDown,showSuggestions,suggestions}=reverseSearchCompletion;if(showSuggestions){if(keyMatchers[Command.NAVIGATION_UP](key)){navigateUp();return}if(keyMatchers[Command.NAVIGATION_DOWN](key)){navigateDown();return}if(keyMatchers[Command.ACCEPT_SUGGESTION_REVERSE_SEARCH](key)){reverseSearchCompletion.handleAutocomplete(activeSuggestionIndex),reverseSearchCompletion.resetCompletionState(),setReverseSearchActive(!1);return}}if(keyMatchers[Command.SUBMIT_REVERSE_SEARCH](key)){let textToSubmit=showSuggestions&&activeSuggestionIndex>-1?suggestions[activeSuggestionIndex].value:buffer$1.text;handleSubmitAndClear(textToSubmit),reverseSearchCompletion.resetCompletionState(),setReverseSearchActive(!1);return}if(keyMatchers[Command.NAVIGATION_UP](key)||keyMatchers[Command.NAVIGATION_DOWN](key))return}if(completion.isPerfectMatch&&keyMatchers[Command.RETURN](key)){handleSubmitAndClear(buffer$1.text);return}if(completion.showSuggestions){if(completion.suggestions.length>1){if(keyMatchers[Command.COMPLETION_UP](key)){completion.navigateUp();return}if(keyMatchers[Command.COMPLETION_DOWN](key)){completion.navigateDown();return}}if(keyMatchers[Command.ACCEPT_SUGGESTION](key)){if(completion.suggestions.length>0){let targetIndex=completion.activeSuggestionIndex===-1?0:completion.activeSuggestionIndex;targetIndex<completion.suggestions.length&&completion.handleAutocomplete(targetIndex)}return}}if(key.name===`tab`&&!completion.showSuggestions&&completion.promptCompletion.text){completion.promptCompletion.accept();return}if(shellModeActive){if(keyMatchers[Command.NAVIGATION_UP](key)){let prevCommand=shellHistory.getPreviousCommand();prevCommand!==null&&buffer$1.setText(prevCommand);return}if(keyMatchers[Command.NAVIGATION_DOWN](key)){let nextCommand=shellHistory.getNextCommand();nextCommand!==null&&buffer$1.setText(nextCommand);return}}else{if(keyMatchers[Command.HISTORY_UP](key)){inputHistory.navigateUp();return}if(keyMatchers[Command.HISTORY_DOWN](key)){inputHistory.navigateDown();return}if(keyMatchers[Command.NAVIGATION_UP](key)&&(buffer$1.allVisualLines.length===1||buffer$1.visualCursor[0]===0&&buffer$1.visualScrollRow===0)){inputHistory.navigateUp();return}if(keyMatchers[Command.NAVIGATION_DOWN](key)&&(buffer$1.allVisualLines.length===1||buffer$1.visualCursor[0]===buffer$1.allVisualLines.length-1)){inputHistory.navigateDown();return}}if(keyMatchers[Command.SUBMIT](key)){if(buffer$1.text.trim()){if(recentPasteTime!==null)return;let[row,col]=buffer$1.cursor,line$1=buffer$1.lines[row],charBefore=col>0?cpSlice(line$1,col-1,col):``;charBefore===`\\`?(buffer$1.backspace(),buffer$1.newline()):handleSubmitAndClear(buffer$1.text)}return}if(keyMatchers[Command.NEWLINE](key)){buffer$1.newline();return}if(keyMatchers[Command.HOME](key)){buffer$1.move(`home`);return}if(keyMatchers[Command.END](key)){buffer$1.move(`end`);return}if(keyMatchers[Command.CLEAR_INPUT](key)){buffer$1.text.length>0&&(buffer$1.setText(``),resetCompletionState());return}if(keyMatchers[Command.KILL_LINE_RIGHT](key)){buffer$1.killLineRight();return}if(keyMatchers[Command.KILL_LINE_LEFT](key)){buffer$1.killLineLeft();return}if(keyMatchers[Command.DELETE_WORD_BACKWARD](key)){buffer$1.deleteWordLeft();return}if(keyMatchers[Command.OPEN_EXTERNAL_EDITOR](key)){buffer$1.openInExternalEditor();return}if(keyMatchers[Command.PASTE_CLIPBOARD_IMAGE](key)){handleClipboardImage();return}buffer$1.handleInput(key),completion.promptCompletion.text&&key.sequence&&key.sequence.length===1&&!key.ctrl&&!key.meta&&completion.promptCompletion.clear()}}},[focus,buffer$1,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$1.viewportVisualLines,[cursorVisualRowAbsolute,cursorVisualColAbsolute]=buffer$1.visualCursor,scrollVisualRow=buffer$1.visualScrollRow,getGhostTextLines=(0,import_react.useCallback)(()=>{if(!completion.promptCompletion.text||!buffer$1.text||!completion.promptCompletion.text.startsWith(buffer$1.text))return{inlineGhost:``,additionalLines:[]};let ghostSuffix=completion.promptCompletion.text.slice(buffer$1.text.length);if(!ghostSuffix)return{inlineGhost:``,additionalLines:[]};let currentLogicalLine=buffer$1.lines[buffer$1.cursor[0]]||``,cursorCol=buffer$1.cursor[1],textBeforeCursor=cpSlice(currentLogicalLine,0,cursorCol),usedWidth=stringWidth(textBeforeCursor),remainingWidth=Math.max(0,inputWidth-usedWidth),ghostTextLinesRaw=ghostSuffix.split(`
1672
1666
  `),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(`
1673
1667
  `),additionalLines$1=[];if(remainingGhostText){let textLines=remainingGhostText.split(`
1674
- `);for(let textLine of textLines){let words$1=textLine.split(` `),currentLine=``;for(let word of words$1){let prospectiveLine=currentLine?`${currentLine} ${word}`:word,prospectiveWidth=stringWidth(prospectiveLine);if(prospectiveWidth>inputWidth){currentLine&&additionalLines$1.push(currentLine);let wordToProcess=word;for(;stringWidth(wordToProcess)>inputWidth;){let part=``,wordCP=toCodePoints(wordToProcess),partWidth=0,splitIndex=0;for(let i$4=0;i$4<wordCP.length;i$4++){let char=wordCP[i$4],charWidth=stringWidth(char);if(partWidth+charWidth>inputWidth)break;part+=char,partWidth+=charWidth,splitIndex=i$4+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$1.text,buffer$1.lines,buffer$1.cursor,inputWidth]),{inlineGhost,additionalLines}=getGhostTextLines();return(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsxs)(Box_default,{borderStyle:`round`,borderColor:shellModeActive?theme.status.warning:focus?theme.border.focused:theme.border.default,paddingX:1,children:[(0,import_jsx_runtime.jsx)(Text,{color:shellModeActive?theme.status.warning:theme.text.accent,children:shellModeActive?reverseSearchActive?(0,import_jsx_runtime.jsxs)(Text,{color:theme.text.link,"aria-label":`User: `,children:[`(r:)`,` `]}):`! `:`> `}),(0,import_jsx_runtime.jsx)(Box_default,{flexGrow:1,flexDirection:`column`,children:buffer$1.text.length===0&&placeholder?focus?(0,import_jsx_runtime.jsxs)(Text,{children:[source_default.inverse(placeholder.slice(0,1)),(0,import_jsx_runtime.jsx)(Text,{color:theme.text.secondary,children:placeholder.slice(1)})]}):(0,import_jsx_runtime.jsx)(Text,{color:theme.text.secondary,children:placeholder}):linesToRender.map((lineText,visualIdxInRenderedSet)=>{let tokens=parseInputForHighlighting(lineText,visualIdxInRenderedSet),cursorVisualRow=cursorVisualRowAbsolute-scrollVisualRow,isOnCursorLine=focus&&visualIdxInRenderedSet===cursorVisualRow,renderedLine=[],charCount=0;tokens.forEach((token$1,tokenIdx)=>{let display=token$1.text;if(isOnCursorLine){let relativeVisualColForHighlight=cursorVisualColAbsolute,tokenStart=charCount,tokenEnd=tokenStart+cpLen(token$1.text);if(relativeVisualColForHighlight>=tokenStart&&relativeVisualColForHighlight<tokenEnd){let charToHighlight=cpSlice(token$1.text,relativeVisualColForHighlight-tokenStart,relativeVisualColForHighlight-tokenStart+1),highlighted=source_default.inverse(charToHighlight);display=cpSlice(token$1.text,0,relativeVisualColForHighlight-tokenStart)+highlighted+cpSlice(token$1.text,relativeVisualColForHighlight-tokenStart+1)}charCount=tokenEnd}let color=token$1.type===`command`||token$1.type===`file`?theme.text.accent:theme.text.primary;renderedLine.push((0,import_jsx_runtime.jsx)(Text,{color,children:display},`token-${tokenIdx}`))});let currentLineGhost=isOnCursorLine?inlineGhost:``;isOnCursorLine&&cursorVisualColAbsolute===cpLen(lineText)&&(currentLineGhost||renderedLine.push((0,import_jsx_runtime.jsx)(Text,{children:source_default.inverse(` `)},`cursor-end-${cursorVisualColAbsolute}`)));let showCursorBeforeGhost=focus&&isOnCursorLine&&cursorVisualColAbsolute===cpLen(lineText)&&currentLineGhost;return(0,import_jsx_runtime.jsx)(Box_default,{height:1,children:(0,import_jsx_runtime.jsxs)(Text,{children:[renderedLine,showCursorBeforeGhost&&source_default.inverse(` `),currentLineGhost&&(0,import_jsx_runtime.jsx)(Text,{color:theme.text.secondary,children:currentLineGhost})]})},`line-${visualIdxInRenderedSet}`)}).concat(additionalLines.map((ghostLine,index)=>{let padding=Math.max(0,inputWidth-stringWidth(ghostLine));return(0,import_jsx_runtime.jsxs)(Text,{color:theme.text.secondary,children:[ghostLine,` `.repeat(padding)]},`ghost-line-${index}`)}))})]}),completion.showSuggestions&&(0,import_jsx_runtime.jsx)(Box_default,{paddingRight:2,children:(0,import_jsx_runtime.jsx)(SuggestionsDisplay,{suggestions:completion.suggestions,activeIndex:completion.activeSuggestionIndex,isLoading:completion.isLoadingSuggestions,width:suggestionsWidth,scrollOffset:completion.visibleStartIndex,userInput:buffer$1.text})}),reverseSearchActive&&(0,import_jsx_runtime.jsx)(Box_default,{paddingRight:2,children:(0,import_jsx_runtime.jsx)(SuggestionsDisplay,{suggestions:reverseSearchCompletion.suggestions,activeIndex:reverseSearchCompletion.activeSuggestionIndex,isLoading:reverseSearchCompletion.isLoadingSuggestions,width:suggestionsWidth,scrollOffset:reverseSearchCompletion.visibleStartIndex,userInput:buffer$1.text})})]})};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}){let config=(0,import_react.useMemo)(()=>createMinimalConfig(),[]),[userMessages,setUserMessages]=(0,import_react.useState)([]),{stdout:stdout$1}=use_stdout_default(),buffer$1=useTextBuffer({viewport:{width:stdout$1.columns,height:Math.min(stdout$1.rows,15)},isValidPath:filePath=>fs$1.existsSync(filePath)});return(0,import_react.useMemo)(()=>slashCommands?.map(s$3=>s$3.name)??[],[slashCommands]),(0,import_jsx_runtime.jsx)(KeypressProvider,{kittyProtocolEnabled:!0,config,children:(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,children:(0,import_jsx_runtime.jsx)(InputPrompt,{buffer:buffer$1,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$4=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))}return cmd.action(remaining.join(` `))};return execute(root$4,rest)}}setUserMessages(prev=>[value,...prev]),onSubmit(value)},placeholder,userMessages,onClearScreen:()=>{},config,slashCommands:slashCommands?convertToCommands(slashCommands):[],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:stdout$1.columns,suggestionsWidth:stdout$1.columns,shellModeActive:!1,setShellModeActive:()=>{}})})})}var text_input_default=TextInput;function useAgent(options$1){let[agent,setAgent]=(0,import_react.useState)(void 0),[logs$1,setLogs]=(0,import_react.useState)([]),[error$22,setError]=(0,import_react.useState)(void 0),[buildResult,setBuildResult]=(0,import_react.useState)(options$1.buildResult),[env$4,setEnv]=(0,import_react.useState)(options$1.env),[apiServerUrl,setApiServerUrl]=(0,import_react.useState)(options$1.apiServerUrl),[capabilities,setCapabilities]=(0,import_react.useState)(void 0);return(0,import_react.useEffect)(()=>{setEnv(options$1.env),setBuildResult(options$1.buildResult),setApiServerUrl(options$1.apiServerUrl)},[options$1.env,options$1.buildResult,options$1.apiServerUrl]),(0,import_react.useEffect)(()=>{if(!buildResult||`error`in buildResult){setAgent(void 0),setLogs([]),setError(void 0);return}let controller=new AbortController;return(async()=>{let port$1=await getRandomPort(),proc$1=spawn$1(`node`,[buildResult.entry],{stdio:`pipe`,env:{...process.env,...env$4,[APIServerURLEnvironmentVariable]:apiServerUrl,PORT:port$1.toString(),HOST:`127.0.0.1`}});controller.signal.addEventListener(`abort`,()=>{try{proc$1.kill()}catch{}});let ready=!1;proc$1.stdout.on(`data`,data$2=>{let msg=Buffer.from(data$2).toString(`utf-8`).trim();!ready&&msg.startsWith(`Agent server listening on`)||setLogs(prev=>[...prev,{level:`log`,message:msg}])}),proc$1.stderr.on(`data`,data$2=>{setLogs(prev=>[...prev,{level:`error`,message:Buffer.from(data$2).toString(`utf-8`).trim()}])}),proc$1.on(`error`,err=>{controller.abort(err)}),proc$1.on(`exit`,()=>{controller.abort()});let client$1=new Client$1({baseUrl:`http://127.0.0.1:${port$1}`});for(;!controller.signal.aborted;){try{await client$1.health();break}catch(err){console.error(`Couldn't connect to agent`,err)}await new Promise(resolve$9=>setTimeout(resolve$9,100))}if(controller.signal.aborted)throw controller.signal.reason;ready=!0;let capabilities$1=await client$1.capabilities();setCapabilities(capabilities$1),setAgent(client$1)})().catch(err=>{setError(err)}),()=>controller.abort()},[buildResult,env$4,apiServerUrl]),(0,import_react.useMemo)(()=>({agent,logs:logs$1,error:error$22,capabilities}),[agent,logs$1,error$22,capabilities])}async function getRandomPort(){let server=createServer();return new Promise((resolve$9,reject)=>{server.listen(0,()=>{let port$1=server.address().port;resolve$9(port$1)}).on(`error`,err=>{reject(err)})}).finally(()=>{server.close()})}function useBundler(directory){let config=(0,import_react.useMemo)(()=>resolveConfig(directory),[directory]),[error$22,setError]=(0,import_react.useState)(void 0),[result,setResult]=(0,import_react.useState)(void 0),[status,setStatus]=(0,import_react.useState)(`building`);return(0,import_react.useEffect)(()=>{let controller=new AbortController;return config.build({cwd:directory,entry:config.entry,outdir:config.outdir,watch:!0,dev:!0,signal:controller.signal,onStart:()=>{setStatus(`building`),setError(void 0),setResult(void 0)},onResult:result$1=>{`error`in result$1?(setError(result$1.error),setStatus(`error`)):(setResult(result$1),setStatus(`success`))}}).catch(err=>{console.log(`error`,err),setStatus(`error`),setError(err)}),()=>{controller.abort()}},[directory]),(0,import_react.useMemo)(()=>({error:error$22,status,result,entry:config.entry,outdir:config.outdir}),[error$22,status,result,config.entry,config.outdir])}function useDevhook(options$1){let onRequestRef=(0,import_react.useRef)(options$1.onRequest);(0,import_react.useEffect)(()=>{onRequestRef.current=options$1.onRequest},[options$1.onRequest]);let id=(0,import_react.useRef)(options$1.id??crypto.randomUUID()),[status,setStatus]=(0,import_react.useState)(`disconnected`);return(0,import_react.useEffect)(()=>{if(options$1.disabled){setStatus(`disconnected`);return}let client$1=new Client,listener=client$1.devhook.listen({id:id.current,onRequest:async request$2=>options$1.onRequest(request$2),onConnect:()=>{setStatus(`connected`)},onDisconnect:()=>{setStatus(`disconnected`)},onError:error$22=>{setStatus(`error`)}});return()=>{listener.dispose()}},[options$1.disabled]),{id:id.current,status}}var import_main=__toESM(require_main$1(),1);function useDotenv(directory,name$2=`.env.local`){let[env$4,setEnv]=(0,import_react.useState)({});return(0,import_react.useEffect)(()=>{let watcher,readEnvFile=path$32=>{try{setEnv((0,import_main.parse)(readFileSync$1(path$32,`utf-8`)))}catch(error$22){console.error(error$22),setEnv({})}};return findNearestEntry(directory,name$2).then(nearest=>{if(!nearest){setEnv({});return}readEnvFile(nearest),watcher=watch(nearest,{persistent:!1},()=>{readEnvFile(nearest)})}),()=>{watcher&&watcher.close()}},[directory,name$2]),env$4}function useServerChat(server,id){let[chat$2,setChat]=(0,import_react.useState)(()=>server.upsertChat(id));return(0,import_react.useEffect)(()=>{setChat(server.upsertChat(id));let disposable=server.onChatChanged(chat$3=>{if(chat$3.id===id)return setChat(chat$3)});return()=>disposable.dispose()},[server,id]),chat$2}function useTerminalSize(){let{stdout:stdout$1}=use_stdout_default(),[size,setSize]=(0,import_react.useState)({columns:process.stdout.columns,rows:process.stdout.rows});return(0,import_react.useEffect)(()=>{if(!stdout$1||!stdout$1.isTTY)return;let handleResize=()=>{setSize({columns:stdout$1.columns,rows:stdout$1.rows})};return process.stdout.on(`resize`,handleResize),()=>{process.stdout.off(`resize`,handleResize)}},[stdout$1]),{columns:size.columns,rows:size.rows?size.rows-1:void 0}}async function start(element){let instance$1=render_default(element,{exitOnCtrlC:!1});await instance$1.waitUntilExit()}function startDev({directory}){return start((0,import_jsx_runtime.jsx)(Root,{directory}))}const Root=({directory})=>{let size=useTerminalSize(),{error:buildError,status:buildStatus,result:buildResult,entry:entrypoint}=useBundler(directory),dotenv=useDotenv(directory),env$4=(0,import_react.useMemo)(()=>{let blinkToken=getAuthToken();return blinkToken?{...dotenv,BLINK_TOKEN:blinkToken}:dotenv},[dotenv]),server=(0,import_react.useMemo)(()=>createDevServer({port:0,dataDirectory:join$1(directory,`.blink`,`data`),sendMessages:async(request$2,signal)=>{if(!currentAgentRef.current)throw Error(`The agent has not been compiled yet.`);if(!currentChatIDRef.current)throw Error(`No chat selected.`);let messages$1=request$2.messages;return await currentAgentRef.current.sendMessages({messages:messages$1.filter(m$2=>m$2.metadata?.ephemeral!==!0),chat:{id:currentChatIDRef.current}},{signal})},serializeChat:chat$3=>({...chat$3,messages:chat$3.messages.filter(m$2=>m$2.metadata?.ephemeral!==!0)})}),[]),{agent,logs:logs$1,error:agentError,capabilities}=useAgent({buildResult,env:env$4,apiServerUrl:server.url}),currentAgentRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{agent?currentAgentRef.current=agent:server.stopChat(chat$2.id)},[agent]);let devhookID=(0,import_react.useMemo)(()=>{let storagePath=join$1(directory,`.blink`,`devhook.txt`);if(mkdirSync(dirname$1(storagePath),{recursive:!0}),existsSync$1(storagePath))return readFileSync$1(storagePath,`utf-8`);let id=crypto.randomUUID();return writeFileSync$1(storagePath,id),id},[]),devhook=useDevhook({id:devhookID,disabled:!capabilities?.requests,onRequest:async request$2=>{if(!currentAgentRef.current)throw Error(`No agent`);let requestURL=new URL(request$2.url),agentURL=new URL(currentAgentRef.current.baseUrl);agentURL.pathname=requestURL.pathname,agentURL.search=requestURL.search;let response=await fetch(agentURL.toString(),request$2);return server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`webhook`,ephemeral:!0},parts:[{type:`text`,text:`method=${request$2.method} status=${response.status}`}]}),response}}),[chatID,setChatID]=(0,import_react.useState)(`default`),currentChatIDRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{currentChatIDRef.current=chatID},[chatID]);let chat$2=useServerChat(server,chatID),[chatIDs,setChatIDs]=(0,import_react.useState)(()=>server.listChats()),currentChatIDsRef=(0,import_react.useRef)(chatIDs);(0,import_react.useEffect)(()=>{currentChatIDsRef.current=chatIDs},[chatIDs]),(0,import_react.useEffect)(()=>{let disposable=server.onChatChanged(chat$3=>{!currentChatIDsRef.current.includes(chat$3.id)&&currentChatIDRef.current&&(setChatID(chat$3.id),server.upsertChatMessage(chat$3.id,{role:`assistant`,metadata:{type:`chat-created`,ephemeral:!0},parts:[{type:`text`,text:`This chat has just been created: ${chat$3.id}. We automatically switched you to it!`}]})),setChatIDs(prev=>{let newChats=[...prev];return newChats.includes(chat$3.id)?prev:(newChats.push(chat$3.id),newChats)})});return()=>{disposable.dispose()}},[server]);let{exit}=use_app_default(),[exitArmed,setExitArmed]=(0,import_react.useState)(!1),exitTimerRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>()=>{exitTimerRef.current&&clearTimeout(exitTimerRef.current)},[]),use_input_default((input,key)=>{if(key.ctrl&&input.toLowerCase()===`c`){if(exitArmed){exit();return}setExitArmed(!0),exitTimerRef.current&&clearTimeout(exitTimerRef.current),exitTimerRef.current=setTimeout(()=>setExitArmed(!1),2e3)}}),(0,import_react.useEffect)(()=>{if(buildError||agentError||chat$2.error){let errors=[];buildError&&errors.push({type:`text`,text:`${buildError.message}`+(buildError.file?` (${buildError.file})`:``)}),agentError&&errors.push({type:`text`,text:agentError.message}),chat$2.error&&errors.push({type:`text`,text:`Chat error: ${chat$2.error.message}, ${chat$2.error.stack}`}),server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`error`,ephemeral:!0},parts:errors});return}if(buildStatus===`building`||!agent){server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:`Compiling...`}]});return}if(buildStatus===`success`&&agent){server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`success`,ephemeral:!0},parts:[{type:`text`,text:`Compiled in 100ms`}]});return}},[buildError,chat$2.error,agentError,buildStatus,agent]);let lastReportedKeys=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{let keys=Object.keys(env$4);if(keys.length===lastReportedKeys.current||lastReportedKeys.current===void 0)return;lastReportedKeys.current=keys.length;let keysText=keys.map(key=>source_default.dim(key)).join(`, `);keysText.length===0&&(keysText=source_default.dim(`(none)`));let text=`Loaded .env.local: `+keysText;server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text}]})},[env$4]),(0,import_react.useEffect)(()=>{!capabilities?.requests||devhook.status!==`connected`||server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:`Send webhooks from anywhere: https://${devhook.id}.dev.blink.host`}]})},[capabilities?.requests,devhook.status]);let lastLogsLength=(0,import_react.useRef)(0);(0,import_react.useEffect)(()=>{if(logs$1.length===lastLogsLength.current)return;let currentLength=lastLogsLength.current;for(let log$9 of logs$1.slice(currentLength))server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`runtime-log`,level:log$9.level,ephemeral:!0},parts:[{type:`text`,text:log$9.message}]});lastLogsLength.current=logs$1.length},[logs$1]);let keymaps=(0,import_react.useMemo)(()=>({"⏎":`send`,"Ctrl+R":`reset chat`,"Ctrl+C":`quit`,"[Escape]":`stop streaming`}),[]),keybindSuggestion=(0,import_react.useMemo)(()=>{if(exitArmed)return`Ctrl+C again to quit`;if(chat$2.status===`streaming`)return`Press [Escape] to stop the agent!`},[exitArmed,chat$2.status]),needsApproval=(0,import_react.useMemo)(()=>{let lastMessage=chat$2.messages.findLast(message=>!(message.role!==`assistant`||message.metadata&&message.metadata.ephemeral));if(!lastMessage||lastMessage.role!==`assistant`)return;let parts=lastMessage.parts.filter(isToolOrDynamicToolUIPart);if(parts.length===0)return;let should=parts.some(part=>isToolApprovalOutput(part.output)&&part.output.outcome===`pending`);if(should)return lastMessage},[chat$2.messages]),{write:write$1}=use_stdout_default(),[epoch,setEpoch]=(0,import_react.useState)(0),resetTerminal=(0,import_react.useCallback)(()=>{write$1(`\x1Bc`),setEpoch(prev=>prev+1)},[write$1]),lastChatIDRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{lastChatIDRef.current!==chat$2.id&&(lastChatIDRef.current&&resetTerminal(),lastChatIDRef.current=chat$2.id)},[chat$2.id,resetTerminal]);let initialSizeRef=(0,import_react.useRef)(size);(0,import_react.useEffect)(()=>{(initialSizeRef.current.columns!==size.columns||initialSizeRef.current.rows!==size.rows)&&(resetTerminal(),initialSizeRef.current=size)},[size.columns,size.rows]);let lastOptions=(0,import_react.useMemo)(()=>{let options$1=lastUIOptions(chat$2.messages);if(options$1)return options$1},[chat$2.messages]),[selectedOptions,setSelectedOptions]=(0,import_react.useState)(lastOptions),[optionsSchema,setOptionsSchema]=(0,import_react.useState)(void 0),activeOptions=(0,import_react.useMemo)(()=>{if(!optionsSchema)return;let defaultOptions$4=Object.fromEntries(Object.entries(optionsSchema).map(([key,value])=>[key,value.defaultValue]));return{...defaultOptions$4,...lastOptions,...selectedOptions}},[selectedOptions,lastOptions,optionsSchema]),validActiveOptions=(0,import_react.useMemo)(()=>{if(activeOptions)return Object.fromEntries(Object.entries(activeOptions).filter(([key,value])=>optionsSchema?.[key]?.values.some(v$1=>v$1.id===value)))},[activeOptions,optionsSchema]);(0,import_react.useEffect)(()=>{if(!capabilities?.options||!agent){setOptionsSchema(void 0);return}let controller=new AbortController;agent.provideUIOptions({selectedOptions:activeOptions},{signal:controller.signal}).then(options$1=>{setOptionsSchema(prev=>JSON.stringify(prev)===JSON.stringify(options$1)?prev:options$1)}).catch(err=>{}).finally(()=>{controller.abort()})},[capabilities?.options,agent,activeOptions]);let optionCommand=(0,import_react.useMemo)(()=>{if(optionsSchema)return{name:`option`,description:`Adjust your agent's options.`,action:()=>{},completion:async()=>Object.keys(optionsSchema),subcommands:Object.entries(optionsSchema).map(([key,value])=>({name:key,description:value.label,action:args=>{setSelectedOptions(prev=>({...prev,[key]:value.values.find(v$1=>v$1.label===args)?.id}))},completion:async partialArg=>value.values.map(v$1=>v$1.label)}))}},[optionsSchema]);return(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Keybinds,{resetChat:()=>{server.resetChat(chat$2.id),resetTerminal()},stopStreaming:()=>{server.stopChat(chat$2.id)}}),chat$2.error?(0,import_jsx_runtime.jsx)(Box_default,{marginTop:1,children:(0,import_jsx_runtime.jsx)(Text,{color:`red`,children:chat$2.error.message})}):null,(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[(0,import_jsx_runtime.jsx)(Static,{items:[{},...chat$2.messages],children:(message,index)=>index===0?(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Box_default,{children:[(0,import_jsx_runtime.jsx)(Text,{bold:!0,children:`blink■`}),(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:` agent development mode`})]}),(0,import_jsx_runtime.jsxs)(Box_default,{marginTop:1,flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Edit `,entrypoint,` to hot-reload your agent.`]}),(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Run `,(0,import_jsx_runtime.jsx)(Text,{color:`blue`,children:`blink deploy`}),` to use your agent in the cloud.`]})]})]},`banner`):(0,import_jsx_runtime.jsx)(Message,{message,previousMessage:index>0?chat$2.messages.at(index-2):void 0,nextMessage:index<chat$2.messages.length-1?chat$2.messages.at(index+1):void 0,maxWidth:size.columns-2},message.id)},`messages-${chat$2.id}-${epoch}`),chat$2.streamingMessage?(0,import_jsx_runtime.jsx)(Message,{message:chat$2.streamingMessage,nextMessage:void 0,previousMessage:chat$2.messages.length>0?chat$2.messages.at(chat$2.messages.length-1):void 0,streaming:!0,maxWidth:size.columns-2},chat$2.streamingMessage.id):null,chat$2.status===`streaming`&&!chat$2.streamingMessage?(0,import_jsx_runtime.jsx)(AssistantWaitingPlaceholder,{maxWidth:size.columns-2}):null]}),(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,marginTop:1,children:needsApproval?(0,import_jsx_runtime.jsx)(ApprovalInput,{onConfirm:approved=>{server.updateChatMessage(chat$2.id,{...needsApproval,parts:needsApproval.parts.map(part=>isToolUIPart(part)&&isToolApprovalOutput(part.output)?{...part,state:`output-available`,output:{...part.output,outcome:approved?`approved`:`rejected`},errorText:void 0}:part)}),server.runtime.chat.sendMessages(chat$2.id,{messages:[],behavior:`interrupt`})},onCancel:()=>{}}):(0,import_jsx_runtime.jsx)(text_input_default,{slashCommands:[{name:`reset`,altNames:[`clear`],description:`Reset the chat`,action:()=>{server.resetChat(chat$2.id)}},{name:`switch`,description:`Switch to a different chat`,action:args=>{setChatID(args)},completion:async partialArg=>{let chats=server.listChats();return chats.map(chat$3=>chat$3)}},{name:`new`,description:`Create a new chat`,action:args=>{setChatID(args)}},...optionCommand?[optionCommand]:[]],onSubmit:value=>(server.runtime.chat.sendMessages(chat$2.id,{messages:[{role:`user`,parts:[{type:`text`,text:value}]}],behavior:`interrupt`}),!0)})}),(0,import_jsx_runtime.jsx)(Box_default,{children:keybindSuggestion?(0,import_jsx_runtime.jsx)(Text,{color:`yellow`,children:` `+keybindSuggestion}):(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Box_default,{marginLeft:2,children:(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`chat: `,(0,import_jsx_runtime.jsx)(Text,{children:chat$2.id})]})}),(0,import_jsx_runtime.jsx)(Spacer,{}),(0,import_jsx_runtime.jsx)(Box_default,{gap:3,marginRight:2,children:Object.entries(keymaps).map(([key,value])=>(0,import_jsx_runtime.jsx)(Text,{children:source_default.gray.dim(key+` `+value)},key))})]})}),optionsSchema&&validActiveOptions?(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,gap:3,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:`options:`}),Object.entries(validActiveOptions).map(([key,value])=>{let option$1=optionsSchema[key];return option$1?(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`row`,children:[(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[option$1.label,`=`]}),(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:option$1.values.find(v$1=>v$1.id===value)?.label})]},key):null})]}):null]})},ApprovalInput=({onConfirm,onCancel})=>{let[selected,setSelected]=(0,import_react.useState)(`yes`),handleConfirm=import_react.useCallback(approved=>{onConfirm(approved)},[onConfirm]),handleCancel=import_react.useCallback(()=>{onCancel()},[onCancel]);return use_input_default((input,key)=>{let lower=input.toLowerCase();if(key.escape){handleCancel();return}if(lower===`y`){handleConfirm(!0);return}if(lower===`n`){handleConfirm(!1);return}if(key.leftArrow||key.rightArrow||key.tab){setSelected(prev=>prev===`yes`?`no`:`yes`);return}key.return&&handleConfirm(selected===`yes`)}),(0,import_jsx_runtime.jsxs)(Box_default,{gap:2,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Text,{children:`Approve?`}),(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsxs)(Text,{children:[`[`,(0,import_jsx_runtime.jsx)(Text,{color:selected===`yes`?`green`:`gray`,bold:selected===`yes`,children:`Yes`}),`/`,(0,import_jsx_runtime.jsx)(Text,{color:selected===`no`?`red`:`gray`,bold:selected===`no`,children:`No`}),`]`]})}),(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:`(y/n, ←/→ then ⏎)`})]})},Keybinds=({resetChat,stopStreaming})=>(use_input_default((input,key)=>{key.ctrl&&input===`r`&&resetChat(),key.escape&&stopStreaming()}),null),MessageComponent=({message,previousMessage,maxWidth,streaming})=>{let prefix,contentColor,marginTop=1;switch(message.role){case`system`:prefix=(0,import_jsx_runtime.jsx)(Text,{children:`t `}),contentColor=`gray`;break;case`user`:prefix=(0,import_jsx_runtime.jsx)(Text,{color:`magenta`,bold:!0,children:`▎`}),contentColor=`gray`;break;case`assistant`:prefix=(0,import_jsx_runtime.jsx)(Text,{color:`white`,children:`> `}),contentColor=`white`;break}if(message.metadata?.type===`build-log`){let color=`gray`;switch(message.metadata.level){case`success`:color=`green`;break;case`info`:color=`gray`;break;case`error`:color=`red`;break}prefix=(0,import_jsx_runtime.jsx)(Text,{color,children:`⚙ `}),contentColor=`gray`,previousMessage?.metadata?.type===`build-log`&&(marginTop=0)}if(message.metadata?.type===`runtime-log`){let color=`white`;switch(message.metadata.level){case`log`:color=`white`;break;case`error`:color=`red`;break}prefix=(0,import_jsx_runtime.jsx)(Text,{color,children:`@ `}),previousMessage?.metadata?.type===`runtime-log`&&(marginTop=0)}message.metadata?.type===`webhook`&&(prefix=(0,import_jsx_runtime.jsx)(Text,{color:`blue`,children:`↩ `}),contentColor=`gray`,previousMessage?.metadata?.type===`webhook`&&(marginTop=0));let content=(0,import_jsx_runtime.jsx)(Box_default,{gap:1,flexDirection:`column`,width:maxWidth,children:message.parts.map((part,index)=>{if(part.type===`text`)return(0,import_jsx_runtime.jsx)(markdown_default,{id:message.id,maxWidth,children:part.text},index);if(part.type===`reasoning`)return(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Reasoning: `,part.text]},index);if(isToolOrDynamicToolUIPart(part))return(0,import_jsx_runtime.jsx)(ToolCall,{part,maxWidth,streaming},index)}).filter(Boolean)});return(0,import_jsx_runtime.jsxs)(Box_default,{marginTop,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsx)(Text,{color:contentColor,children:prefix})}),content]})},Message=import_react.memo(MessageComponent,(prev,next)=>prev.maxWidth===next.maxWidth?!!(prev.nextMessage&&next.nextMessage&&prev.nextMessage.id===next.nextMessage.id):!1),AssistantWaitingPlaceholder=({maxWidth})=>(0,import_jsx_runtime.jsxs)(Box_default,{marginTop:1,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsx)(Text,{color:`white`,children:null})}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth,children:(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[(0,import_jsx_runtime.jsx)(build_default,{}),` Waiting for response...`]})})]}),ToolCall=({part,maxWidth,streaming})=>{let name$2=getToolOrDynamicToolName(part),input=(0,import_react.useMemo)(()=>{let labels={};return typeof part.input!=`object`||part.input===null||Object.entries(part.input).forEach(([key,value])=>{labels[key]=JSON.stringify(value)}),labels},[part]),state=(0,import_react.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=(0,import_react.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,value])=>{labels[key]=JSON.stringify(value)}),labels},[part,state]),error$22=(0,import_react.useMemo)(()=>{if(part.state===`output-error`)return part.errorText},[part]),icon=(0,import_react.useMemo)(()=>{switch(state){case`done`:case`error`:return`⚒`;case`pending-approval`:return`⧗`}return(0,import_jsx_runtime.jsx)(build_default,{type:`dots`})},[state]);return(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Box_default,{gap:1,children:[(0,import_jsx_runtime.jsx)(Text,{color:state===`error`?`red`:`gray`,bold:!0,children:icon}),(0,import_jsx_runtime.jsx)(Text,{children:name$2})]}),(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,flexDirection:`column`,overflowX:`hidden`,width:maxWidth?maxWidth-4:void 0,gap:0,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Input:`}),Object.entries(input).map(([key,value])=>(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:key}),(0,import_jsx_runtime.jsx)(Text,{color:`blackBright`,children:`=`}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth?maxWidth-6-1-2-key.length:void 0,children:(0,import_jsx_runtime.jsx)(Text,{wrap:`truncate-middle`,children:value})})]},key)),output&&(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Output:`}),typeof output==`string`?(0,import_jsx_runtime.jsx)(Box_default,{marginLeft:2,children:(0,import_jsx_runtime.jsx)(Text,{children:output})}):(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,children:Object.entries(output).map(([key,value])=>(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:key}),(0,import_jsx_runtime.jsx)(Text,{color:`blackBright`,children:`=`}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth?maxWidth-6-1-key.length:void 0,children:(0,import_jsx_runtime.jsx)(Text,{wrap:`truncate-middle`,children:value})})]},key))})]}),error$22&&(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Error:`}),(0,import_jsx_runtime.jsx)(Text,{color:`red`,children:error$22})]})]})]})};async function dev(directory){directory||(directory=process.cwd());let exitWithDump=error$22=>{writeFileSync$1(`error.dump`,inspect$1(error$22,{depth:null})),process.exit(1)};process.addListener(`uncaughtException`,error$22=>{exitWithDump(error$22)}),process.addListener(`unhandledRejection`,error$22=>{exitWithDump(error$22)});try{await startDev({directory})}catch(err){console.error(err),process.exit(1)}finally{process.exit(0)}}export{dev as default};
1668
+ `);for(let textLine of textLines){let words$1=textLine.split(` `),currentLine=``;for(let word of words$1){let prospectiveLine=currentLine?`${currentLine} ${word}`:word,prospectiveWidth=stringWidth(prospectiveLine);if(prospectiveWidth>inputWidth){currentLine&&additionalLines$1.push(currentLine);let wordToProcess=word;for(;stringWidth(wordToProcess)>inputWidth;){let part=``,wordCP=toCodePoints(wordToProcess),partWidth=0,splitIndex=0;for(let i$4=0;i$4<wordCP.length;i$4++){let char=wordCP[i$4],charWidth=stringWidth(char);if(partWidth+charWidth>inputWidth)break;part+=char,partWidth+=charWidth,splitIndex=i$4+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$1.text,buffer$1.lines,buffer$1.cursor,inputWidth]),{inlineGhost,additionalLines}=getGhostTextLines();return(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsxs)(Box_default,{borderStyle:`round`,borderColor:shellModeActive?theme.status.warning:focus?theme.border.focused:theme.border.default,paddingX:1,children:[(0,import_jsx_runtime.jsx)(Text,{color:shellModeActive?theme.status.warning:theme.text.accent,children:shellModeActive?reverseSearchActive?(0,import_jsx_runtime.jsxs)(Text,{color:theme.text.link,"aria-label":`User: `,children:[`(r:)`,` `]}):`! `:`> `}),(0,import_jsx_runtime.jsx)(Box_default,{flexGrow:1,flexDirection:`column`,children:buffer$1.text.length===0&&placeholder?focus?(0,import_jsx_runtime.jsxs)(Text,{children:[source_default.inverse(placeholder.slice(0,1)),(0,import_jsx_runtime.jsx)(Text,{color:theme.text.secondary,children:placeholder.slice(1)})]}):(0,import_jsx_runtime.jsx)(Text,{color:theme.text.secondary,children:placeholder}):linesToRender.map((lineText,visualIdxInRenderedSet)=>{let tokens=parseInputForHighlighting(lineText,visualIdxInRenderedSet),cursorVisualRow=cursorVisualRowAbsolute-scrollVisualRow,isOnCursorLine=focus&&visualIdxInRenderedSet===cursorVisualRow,renderedLine=[],charCount=0;tokens.forEach((token$1,tokenIdx)=>{let display=token$1.text;if(isOnCursorLine){let relativeVisualColForHighlight=cursorVisualColAbsolute,tokenStart=charCount,tokenEnd=tokenStart+cpLen(token$1.text);if(relativeVisualColForHighlight>=tokenStart&&relativeVisualColForHighlight<tokenEnd){let charToHighlight=cpSlice(token$1.text,relativeVisualColForHighlight-tokenStart,relativeVisualColForHighlight-tokenStart+1),highlighted=source_default.inverse(charToHighlight);display=cpSlice(token$1.text,0,relativeVisualColForHighlight-tokenStart)+highlighted+cpSlice(token$1.text,relativeVisualColForHighlight-tokenStart+1)}charCount=tokenEnd}let color=token$1.type===`command`||token$1.type===`file`?theme.text.accent:theme.text.primary;renderedLine.push((0,import_jsx_runtime.jsx)(Text,{color,children:display},`token-${tokenIdx}`))});let currentLineGhost=isOnCursorLine?inlineGhost:``;isOnCursorLine&&cursorVisualColAbsolute===cpLen(lineText)&&(currentLineGhost||renderedLine.push((0,import_jsx_runtime.jsx)(Text,{children:source_default.inverse(` `)},`cursor-end-${cursorVisualColAbsolute}`)));let showCursorBeforeGhost=focus&&isOnCursorLine&&cursorVisualColAbsolute===cpLen(lineText)&&currentLineGhost;return(0,import_jsx_runtime.jsx)(Box_default,{height:1,children:(0,import_jsx_runtime.jsxs)(Text,{children:[renderedLine,showCursorBeforeGhost&&source_default.inverse(` `),currentLineGhost&&(0,import_jsx_runtime.jsx)(Text,{color:theme.text.secondary,children:currentLineGhost})]})},`line-${visualIdxInRenderedSet}`)}).concat(additionalLines.map((ghostLine,index)=>{let padding=Math.max(0,inputWidth-stringWidth(ghostLine));return(0,import_jsx_runtime.jsxs)(Text,{color:theme.text.secondary,children:[ghostLine,` `.repeat(padding)]},`ghost-line-${index}`)}))})]}),completion.showSuggestions&&(0,import_jsx_runtime.jsx)(Box_default,{paddingRight:2,children:(0,import_jsx_runtime.jsx)(SuggestionsDisplay,{suggestions:completion.suggestions,activeIndex:completion.activeSuggestionIndex,isLoading:completion.isLoadingSuggestions,width:suggestionsWidth,scrollOffset:completion.visibleStartIndex,userInput:buffer$1.text})}),reverseSearchActive&&(0,import_jsx_runtime.jsx)(Box_default,{paddingRight:2,children:(0,import_jsx_runtime.jsx)(SuggestionsDisplay,{suggestions:reverseSearchCompletion.suggestions,activeIndex:reverseSearchCompletion.activeSuggestionIndex,isLoading:reverseSearchCompletion.isLoadingSuggestions,width:suggestionsWidth,scrollOffset:reverseSearchCompletion.visibleStartIndex,userInput:buffer$1.text})})]})};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}){let config=(0,import_react.useMemo)(()=>createMinimalConfig(),[]),[userMessages,setUserMessages]=(0,import_react.useState)([]),{stdout:stdout$1}=use_stdout_default(),buffer$1=useTextBuffer({viewport:{width:stdout$1.columns,height:Math.min(stdout$1.rows,15)},isValidPath:filePath=>fs$1.existsSync(filePath)});return(0,import_react.useMemo)(()=>slashCommands?.map(s$3=>s$3.name)??[],[slashCommands]),(0,import_jsx_runtime.jsx)(KeypressProvider,{kittyProtocolEnabled:!0,config,children:(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,children:(0,import_jsx_runtime.jsx)(InputPrompt,{buffer:buffer$1,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$4=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))}return cmd.action(remaining.join(` `))};return execute(root$4,rest)}}setUserMessages(prev=>[value,...prev]),onSubmit(value)},placeholder,userMessages,onClearScreen:()=>{},config,slashCommands:slashCommands?convertToCommands(slashCommands):[],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:stdout$1.columns,suggestionsWidth:stdout$1.columns,shellModeActive:!1,setShellModeActive:()=>{}})})})}var text_input_default=TextInput;function useAgent(options$1){let[agent,setAgent]=(0,import_react.useState)(void 0),[logs$1,setLogs]=(0,import_react.useState)([]),[error$22,setError]=(0,import_react.useState)(void 0),[buildResult,setBuildResult]=(0,import_react.useState)(options$1.buildResult),[env$4,setEnv]=(0,import_react.useState)(options$1.env),[apiServerUrl,setApiServerUrl]=(0,import_react.useState)(options$1.apiServerUrl),[capabilities,setCapabilities]=(0,import_react.useState)(void 0);return(0,import_react.useEffect)(()=>{setEnv(options$1.env),setBuildResult(options$1.buildResult),setApiServerUrl(options$1.apiServerUrl)},[options$1.env,options$1.buildResult,options$1.apiServerUrl]),(0,import_react.useEffect)(()=>{if(!buildResult||`error`in buildResult){setAgent(void 0),setLogs([]),setError(void 0);return}let controller=new AbortController;return(async()=>{let port$1=await getRandomPort(),proc$1=spawn$1(`node`,[buildResult.entry],{stdio:`pipe`,env:{...process.env,...env$4,[APIServerURLEnvironmentVariable]:apiServerUrl,PORT:port$1.toString(),HOST:`127.0.0.1`}});controller.signal.addEventListener(`abort`,()=>{try{proc$1.kill()}catch{}});let ready=!1;proc$1.stdout.on(`data`,data$2=>{let msg=Buffer.from(data$2).toString(`utf-8`).trim();!ready&&msg.startsWith(`Agent server listening on`)||setLogs(prev=>[...prev,{level:`log`,message:msg}])}),proc$1.stderr.on(`data`,data$2=>{setLogs(prev=>[...prev,{level:`error`,message:Buffer.from(data$2).toString(`utf-8`).trim()}])}),proc$1.on(`error`,err=>{controller.abort(err)}),proc$1.on(`exit`,()=>{controller.abort()});let client$1=new Client$1({baseUrl:`http://127.0.0.1:${port$1}`});for(;!controller.signal.aborted;){try{await client$1.health();break}catch(err){}await new Promise(resolve$9=>setTimeout(resolve$9,100))}if(controller.signal.aborted)throw controller.signal.reason;ready=!0;let capabilities$1=await client$1.capabilities();setCapabilities(capabilities$1),setAgent(client$1)})().catch(err=>{setError(err)}),()=>controller.abort()},[buildResult,env$4,apiServerUrl]),(0,import_react.useMemo)(()=>({agent,logs:logs$1,error:error$22,capabilities}),[agent,logs$1,error$22,capabilities])}async function getRandomPort(){let server=createServer();return new Promise((resolve$9,reject)=>{server.listen(0,()=>{let port$1=server.address().port;resolve$9(port$1)}).on(`error`,err=>{reject(err)})}).finally(()=>{server.close()})}function useBundler(directory){let config=(0,import_react.useMemo)(()=>resolveConfig(directory),[directory]),[error$22,setError]=(0,import_react.useState)(void 0),[result,setResult]=(0,import_react.useState)(void 0),[status,setStatus]=(0,import_react.useState)(`building`);return(0,import_react.useEffect)(()=>{let controller=new AbortController;return config.build({cwd:directory,entry:config.entry,outdir:config.outdir,watch:!0,dev:!0,signal:controller.signal,onStart:()=>{setStatus(`building`),setError(void 0),setResult(void 0)},onResult:result$1=>{`error`in result$1?(setError(result$1.error),setStatus(`error`)):(setResult(result$1),setStatus(`success`))}}).catch(err=>{console.log(`error`,err),setStatus(`error`),setError(err)}),()=>{controller.abort()}},[directory]),(0,import_react.useMemo)(()=>({error:error$22,status,result,entry:config.entry,outdir:config.outdir}),[error$22,status,result,config.entry,config.outdir])}function useDevhook(options$1){let onRequestRef=(0,import_react.useRef)(options$1.onRequest);(0,import_react.useEffect)(()=>{onRequestRef.current=options$1.onRequest},[options$1.onRequest]);let id=(0,import_react.useRef)(options$1.id??crypto.randomUUID()),[status,setStatus]=(0,import_react.useState)(`disconnected`);return(0,import_react.useEffect)(()=>{if(options$1.disabled){setStatus(`disconnected`);return}let client$1=new Client,listener=client$1.devhook.listen({id:id.current,onRequest:async request$2=>options$1.onRequest(request$2),onConnect:()=>{setStatus(`connected`)},onDisconnect:()=>{setStatus(`disconnected`)},onError:error$22=>{setStatus(`error`)}});return()=>{listener.dispose()}},[options$1.disabled]),{id:id.current,status}}var import_main=__toESM(require_main$1(),1);function useDotenv(directory,name$2=`.env.local`){let[env$4,setEnv]=(0,import_react.useState)({});return(0,import_react.useEffect)(()=>{let watcher,readEnvFile=path$32=>{try{setEnv((0,import_main.parse)(readFileSync$1(path$32,`utf-8`)))}catch(error$22){console.error(error$22),setEnv({})}};return findNearestEntry(directory,name$2).then(nearest=>{if(!nearest){setEnv({});return}readEnvFile(nearest),watcher=watch(nearest,{persistent:!1},()=>{readEnvFile(nearest)})}),()=>{watcher&&watcher.close()}},[directory,name$2]),env$4}function useServerChat(server,id){let[chat$2,setChat]=(0,import_react.useState)(()=>server.upsertChat(id));return(0,import_react.useEffect)(()=>{setChat(server.upsertChat(id));let disposable=server.onChatChanged(chat$3=>{if(chat$3.id===id)return setChat(chat$3)});return()=>disposable.dispose()},[server,id]),chat$2}function useTerminalSize(){let{stdout:stdout$1}=use_stdout_default(),[size,setSize]=(0,import_react.useState)({columns:process.stdout.columns,rows:process.stdout.rows});return(0,import_react.useEffect)(()=>{if(!stdout$1||!stdout$1.isTTY)return;let handleResize=()=>{setSize({columns:stdout$1.columns,rows:stdout$1.rows})};return process.stdout.on(`resize`,handleResize),()=>{process.stdout.off(`resize`,handleResize)}},[stdout$1]),{columns:size.columns,rows:size.rows?size.rows-1:void 0}}async function start(element){let instance$1=render_default(element,{exitOnCtrlC:!1});await instance$1.waitUntilExit()}function startDev({directory}){return start((0,import_jsx_runtime.jsx)(Root,{directory}))}const Root=({directory})=>{let size=useTerminalSize(),{error:buildError,status:buildStatus,result:buildResult,entry:entrypoint}=useBundler(directory),dotenv=useDotenv(directory),env$4=(0,import_react.useMemo)(()=>{let blinkToken=getAuthToken();return blinkToken?{...dotenv,BLINK_TOKEN:blinkToken}:dotenv},[dotenv]),server=(0,import_react.useMemo)(()=>createDevServer({port:0,dataDirectory:join$1(directory,`.blink`,`data`),sendMessages:async(request$2,signal)=>{if(!currentAgentRef.current)throw Error(`The agent has not been compiled yet.`);if(!currentChatIDRef.current)throw Error(`No chat selected.`);let messages$1=request$2.messages;return await currentAgentRef.current.sendMessages({messages:messages$1.filter(m$2=>m$2.metadata?.ephemeral!==!0),chat:{id:currentChatIDRef.current}},{signal})},serializeChat:chat$3=>({...chat$3,messages:chat$3.messages.filter(m$2=>m$2.metadata?.ephemeral!==!0)})}),[]),{agent,logs:logs$1,error:agentError,capabilities}=useAgent({buildResult,env:env$4,apiServerUrl:server.url}),currentAgentRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{agent?currentAgentRef.current=agent:server.stopChat(chat$2.id)},[agent]);let devhookID=(0,import_react.useMemo)(()=>{let storagePath=join$1(directory,`.blink`,`devhook.txt`);if(mkdirSync(dirname$1(storagePath),{recursive:!0}),existsSync$1(storagePath))return readFileSync$1(storagePath,`utf-8`);let id=crypto.randomUUID();return writeFileSync$1(storagePath,id),id},[]),devhook=useDevhook({id:devhookID,disabled:!capabilities?.requests,onRequest:async request$2=>{if(!currentAgentRef.current)throw Error(`No agent`);let requestURL=new URL(request$2.url),agentURL=new URL(currentAgentRef.current.baseUrl);agentURL.pathname=requestURL.pathname,agentURL.search=requestURL.search;let response=await fetch(agentURL.toString(),request$2);return server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`webhook`,ephemeral:!0},parts:[{type:`text`,text:`method=${request$2.method} status=${response.status}`}]}),response}}),[chatID,setChatID]=(0,import_react.useState)(`default`),currentChatIDRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{currentChatIDRef.current=chatID},[chatID]);let chat$2=useServerChat(server,chatID),[chatIDs,setChatIDs]=(0,import_react.useState)(()=>server.listChats()),currentChatIDsRef=(0,import_react.useRef)(chatIDs);(0,import_react.useEffect)(()=>{currentChatIDsRef.current=chatIDs},[chatIDs]),(0,import_react.useEffect)(()=>{let disposable=server.onChatChanged(chat$3=>{!currentChatIDsRef.current.includes(chat$3.id)&&currentChatIDRef.current&&(setChatID(chat$3.id),server.upsertChatMessage(chat$3.id,{role:`assistant`,metadata:{type:`chat-created`,ephemeral:!0},parts:[{type:`text`,text:`This chat has just been created: ${chat$3.id}. We automatically switched you to it!`}]})),setChatIDs(prev=>{let newChats=[...prev];return newChats.includes(chat$3.id)?prev:(newChats.push(chat$3.id),newChats)})});return()=>{disposable.dispose()}},[server]);let{exit}=use_app_default(),[exitArmed,setExitArmed]=(0,import_react.useState)(!1),exitTimerRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>()=>{exitTimerRef.current&&clearTimeout(exitTimerRef.current)},[]),use_input_default((input,key)=>{if(key.ctrl&&input.toLowerCase()===`c`){if(exitArmed){exit();return}setExitArmed(!0),exitTimerRef.current&&clearTimeout(exitTimerRef.current),exitTimerRef.current=setTimeout(()=>setExitArmed(!1),2e3)}}),(0,import_react.useEffect)(()=>{if(buildError||agentError||chat$2.error){let errors=[];buildError&&errors.push({type:`text`,text:`${buildError.message}`+(buildError.file?` (${buildError.file})`:``)}),agentError&&errors.push({type:`text`,text:agentError.message}),chat$2.error&&errors.push({type:`text`,text:`Chat error: ${chat$2.error.message}, ${chat$2.error.stack}`}),server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`error`,ephemeral:!0},parts:errors});return}if(buildStatus===`building`||!agent){server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:`Compiling...`}]});return}if(buildStatus===`success`&&agent){server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`success`,ephemeral:!0},parts:[{type:`text`,text:`Compiled in 100ms`}]});return}},[buildError,chat$2.error,agentError,buildStatus,agent]);let lastReportedKeys=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{let keys=Object.keys(env$4);if(keys.length===lastReportedKeys.current||lastReportedKeys.current===void 0)return;lastReportedKeys.current=keys.length;let keysText=keys.map(key=>source_default.dim(key)).join(`, `);keysText.length===0&&(keysText=source_default.dim(`(none)`));let text=`Loaded .env.local: `+keysText;server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text}]})},[env$4]),(0,import_react.useEffect)(()=>{!capabilities?.requests||devhook.status!==`connected`||server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:`Send webhooks from anywhere: https://${devhook.id}.dev.blink.host`}]})},[capabilities?.requests,devhook.status]);let lastLogsLength=(0,import_react.useRef)(0);(0,import_react.useEffect)(()=>{if(logs$1.length===lastLogsLength.current)return;let currentLength=lastLogsLength.current;for(let log$9 of logs$1.slice(currentLength))server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`runtime-log`,level:log$9.level,ephemeral:!0},parts:[{type:`text`,text:log$9.message}]});lastLogsLength.current=logs$1.length},[logs$1]);let keymaps=(0,import_react.useMemo)(()=>({"⏎":`send`,"Ctrl+R":`reset chat`,"Ctrl+C":`quit`,"[Escape]":`stop streaming`}),[]),keybindSuggestion=(0,import_react.useMemo)(()=>{if(exitArmed)return`Ctrl+C again to quit`;if(chat$2.status===`streaming`)return`Press [Escape] to stop the agent!`},[exitArmed,chat$2.status]),needsApproval=(0,import_react.useMemo)(()=>{let lastMessage=chat$2.messages.findLast(message=>!(message.role!==`assistant`||message.metadata&&message.metadata.ephemeral));if(!lastMessage||lastMessage.role!==`assistant`)return;let parts=lastMessage.parts.filter(isToolOrDynamicToolUIPart);if(parts.length===0)return;let should=parts.some(part=>isToolApprovalOutput(part.output)&&part.output.outcome===`pending`);if(should)return lastMessage},[chat$2.messages]),{write:write$1}=use_stdout_default(),[epoch,setEpoch]=(0,import_react.useState)(0),resetTerminal=(0,import_react.useCallback)(()=>{write$1(`\x1Bc`),setEpoch(prev=>prev+1)},[write$1]),lastChatIDRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{lastChatIDRef.current!==chat$2.id&&(lastChatIDRef.current&&resetTerminal(),lastChatIDRef.current=chat$2.id)},[chat$2.id,resetTerminal]);let initialSizeRef=(0,import_react.useRef)(size);(0,import_react.useEffect)(()=>{(initialSizeRef.current.columns!==size.columns||initialSizeRef.current.rows!==size.rows)&&(resetTerminal(),initialSizeRef.current=size)},[size.columns,size.rows]);let lastOptions=(0,import_react.useMemo)(()=>{let options$1=lastUIOptions(chat$2.messages);if(options$1)return options$1},[chat$2.messages]),[selectedOptions,setSelectedOptions]=(0,import_react.useState)(lastOptions),[optionsSchema,setOptionsSchema]=(0,import_react.useState)(void 0),activeOptions=(0,import_react.useMemo)(()=>{if(!optionsSchema)return;let defaultOptions$4=Object.fromEntries(Object.entries(optionsSchema).map(([key,value])=>[key,value.defaultValue]));return{...defaultOptions$4,...lastOptions,...selectedOptions}},[selectedOptions,lastOptions,optionsSchema]),validActiveOptions=(0,import_react.useMemo)(()=>{if(activeOptions)return Object.fromEntries(Object.entries(activeOptions).filter(([key,value])=>optionsSchema?.[key]?.values.some(v$1=>v$1.id===value)))},[activeOptions,optionsSchema]);(0,import_react.useEffect)(()=>{if(!capabilities?.options||!agent){setOptionsSchema(void 0);return}let controller=new AbortController;agent.provideUIOptions({selectedOptions:activeOptions},{signal:controller.signal}).then(options$1=>{setOptionsSchema(prev=>JSON.stringify(prev)===JSON.stringify(options$1)?prev:options$1)}).catch(err=>{}).finally(()=>{controller.abort()})},[capabilities?.options,agent,activeOptions]);let optionCommand=(0,import_react.useMemo)(()=>{if(optionsSchema)return{name:`option`,description:`Adjust your agent's options.`,action:()=>{},completion:async()=>Object.keys(optionsSchema),subcommands:Object.entries(optionsSchema).map(([key,value])=>({name:key,description:value.label,action:args=>{setSelectedOptions(prev=>({...prev,[key]:value.values.find(v$1=>v$1.label===args)?.id}))},completion:async partialArg=>value.values.map(v$1=>v$1.label)}))}},[optionsSchema]);return(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Keybinds,{resetChat:()=>{server.resetChat(chat$2.id),resetTerminal()},stopStreaming:()=>{server.stopChat(chat$2.id)}}),chat$2.error?(0,import_jsx_runtime.jsx)(Box_default,{marginTop:1,children:(0,import_jsx_runtime.jsx)(Text,{color:`red`,children:chat$2.error.message})}):null,(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[(0,import_jsx_runtime.jsx)(Static,{items:[{},...chat$2.messages],children:(message,index)=>index===0?(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Box_default,{children:[(0,import_jsx_runtime.jsx)(Text,{bold:!0,children:`blink■`}),(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:` agent development mode`})]}),(0,import_jsx_runtime.jsxs)(Box_default,{marginTop:1,flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Edit `,entrypoint,` to hot-reload your agent.`]}),(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Run `,(0,import_jsx_runtime.jsx)(Text,{color:`blue`,children:`blink deploy`}),` to use your agent in the cloud.`]})]})]},`banner`):(0,import_jsx_runtime.jsx)(Message,{message,previousMessage:index>0?chat$2.messages.at(index-2):void 0,nextMessage:index<chat$2.messages.length-1?chat$2.messages.at(index+1):void 0,maxWidth:size.columns-2},message.id)},`messages-${chat$2.id}-${epoch}`),chat$2.streamingMessage?(0,import_jsx_runtime.jsx)(Message,{message:chat$2.streamingMessage,nextMessage:void 0,previousMessage:chat$2.messages.length>0?chat$2.messages.at(chat$2.messages.length-1):void 0,streaming:!0,maxWidth:size.columns-2},chat$2.streamingMessage.id):null,chat$2.status===`streaming`&&!chat$2.streamingMessage?(0,import_jsx_runtime.jsx)(AssistantWaitingPlaceholder,{maxWidth:size.columns-2}):null]}),(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,marginTop:1,children:needsApproval?(0,import_jsx_runtime.jsx)(ApprovalInput,{onConfirm:approved=>{server.updateChatMessage(chat$2.id,{...needsApproval,parts:needsApproval.parts.map(part=>isToolUIPart(part)&&isToolApprovalOutput(part.output)?{...part,state:`output-available`,output:{...part.output,outcome:approved?`approved`:`rejected`},errorText:void 0}:part)}),server.runtime.chat.sendMessages(chat$2.id,{messages:[],behavior:`interrupt`})},onCancel:()=>{}}):(0,import_jsx_runtime.jsx)(text_input_default,{slashCommands:[{name:`reset`,altNames:[`clear`],description:`Reset the chat`,action:()=>{server.resetChat(chat$2.id)}},{name:`switch`,description:`Switch to a different chat`,action:args=>{setChatID(args)},completion:async partialArg=>{let chats=server.listChats();return chats.map(chat$3=>chat$3)}},{name:`new`,description:`Create a new chat`,action:args=>{setChatID(args)}},...optionCommand?[optionCommand]:[]],onSubmit:value=>(server.runtime.chat.sendMessages(chat$2.id,{messages:[{role:`user`,parts:[{type:`text`,text:value}]}],behavior:`interrupt`}),!0)})}),(0,import_jsx_runtime.jsx)(Box_default,{children:keybindSuggestion?(0,import_jsx_runtime.jsx)(Text,{color:`yellow`,children:` `+keybindSuggestion}):(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Box_default,{marginLeft:2,children:(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`chat: `,(0,import_jsx_runtime.jsx)(Text,{children:chat$2.id})]})}),(0,import_jsx_runtime.jsx)(Spacer,{}),(0,import_jsx_runtime.jsx)(Box_default,{gap:3,marginRight:2,children:Object.entries(keymaps).map(([key,value])=>(0,import_jsx_runtime.jsx)(Text,{children:source_default.gray.dim(key+` `+value)},key))})]})}),optionsSchema&&validActiveOptions?(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,gap:3,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:`options:`}),Object.entries(validActiveOptions).map(([key,value])=>{let option$1=optionsSchema[key];return option$1?(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`row`,children:[(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[option$1.label,`=`]}),(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:option$1.values.find(v$1=>v$1.id===value)?.label})]},key):null})]}):null]})},ApprovalInput=({onConfirm,onCancel})=>{let[selected,setSelected]=(0,import_react.useState)(`yes`),handleConfirm=import_react.useCallback(approved=>{onConfirm(approved)},[onConfirm]),handleCancel=import_react.useCallback(()=>{onCancel()},[onCancel]);return use_input_default((input,key)=>{let lower=input.toLowerCase();if(key.escape){handleCancel();return}if(lower===`y`){handleConfirm(!0);return}if(lower===`n`){handleConfirm(!1);return}if(key.leftArrow||key.rightArrow||key.tab){setSelected(prev=>prev===`yes`?`no`:`yes`);return}key.return&&handleConfirm(selected===`yes`)}),(0,import_jsx_runtime.jsxs)(Box_default,{gap:2,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Text,{children:`Approve?`}),(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsxs)(Text,{children:[`[`,(0,import_jsx_runtime.jsx)(Text,{color:selected===`yes`?`green`:`gray`,bold:selected===`yes`,children:`Yes`}),`/`,(0,import_jsx_runtime.jsx)(Text,{color:selected===`no`?`red`:`gray`,bold:selected===`no`,children:`No`}),`]`]})}),(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:`(y/n, ←/→ then ⏎)`})]})},Keybinds=({resetChat,stopStreaming})=>(use_input_default((input,key)=>{key.ctrl&&input===`r`&&resetChat(),key.escape&&stopStreaming()}),null),MessageComponent=({message,previousMessage,maxWidth,streaming})=>{let prefix,contentColor,marginTop=1;switch(message.role){case`system`:prefix=(0,import_jsx_runtime.jsx)(Text,{children:`t `}),contentColor=`gray`;break;case`user`:prefix=(0,import_jsx_runtime.jsx)(Text,{color:`magenta`,bold:!0,children:`▎`}),contentColor=`gray`;break;case`assistant`:prefix=(0,import_jsx_runtime.jsx)(Text,{color:`white`,children:`> `}),contentColor=`white`;break}if(message.metadata?.type===`build-log`){let color=`gray`;switch(message.metadata.level){case`success`:color=`green`;break;case`info`:color=`gray`;break;case`error`:color=`red`;break}prefix=(0,import_jsx_runtime.jsx)(Text,{color,children:`⚙ `}),contentColor=`gray`,previousMessage?.metadata?.type===`build-log`&&(marginTop=0)}if(message.metadata?.type===`runtime-log`){let color=`white`;switch(message.metadata.level){case`log`:color=`white`;break;case`error`:color=`red`;break}prefix=(0,import_jsx_runtime.jsx)(Text,{color,children:`@ `}),previousMessage?.metadata?.type===`runtime-log`&&(marginTop=0)}message.metadata?.type===`webhook`&&(prefix=(0,import_jsx_runtime.jsx)(Text,{color:`blue`,children:`↩ `}),contentColor=`gray`,previousMessage?.metadata?.type===`webhook`&&(marginTop=0));let content=(0,import_jsx_runtime.jsx)(Box_default,{gap:1,flexDirection:`column`,width:maxWidth,children:message.parts.map((part,index)=>{if(part.type===`text`)return(0,import_jsx_runtime.jsx)(markdown_default,{id:message.id,maxWidth,children:part.text},index);if(part.type===`reasoning`)return(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Reasoning: `,part.text]},index);if(isToolOrDynamicToolUIPart(part))return(0,import_jsx_runtime.jsx)(ToolCall,{part,maxWidth,streaming},index)}).filter(Boolean)});return(0,import_jsx_runtime.jsxs)(Box_default,{marginTop,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsx)(Text,{color:contentColor,children:prefix})}),content]})},Message=import_react.memo(MessageComponent,(prev,next)=>prev.maxWidth===next.maxWidth?!!(prev.nextMessage&&next.nextMessage&&prev.nextMessage.id===next.nextMessage.id):!1),AssistantWaitingPlaceholder=({maxWidth})=>(0,import_jsx_runtime.jsxs)(Box_default,{marginTop:1,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsx)(Text,{color:`white`,children:null})}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth,children:(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[(0,import_jsx_runtime.jsx)(build_default,{}),` Waiting for response...`]})})]}),ToolCall=({part,maxWidth,streaming})=>{let name$2=getToolOrDynamicToolName(part),input=(0,import_react.useMemo)(()=>{let labels={};return typeof part.input!=`object`||part.input===null||Object.entries(part.input).forEach(([key,value])=>{labels[key]=JSON.stringify(value)}),labels},[part]),state=(0,import_react.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=(0,import_react.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,value])=>{labels[key]=JSON.stringify(value)}),labels},[part,state]),error$22=(0,import_react.useMemo)(()=>{if(part.state===`output-error`)return part.errorText},[part]),icon=(0,import_react.useMemo)(()=>{switch(state){case`done`:case`error`:return`⚒`;case`pending-approval`:return`⧗`}return(0,import_jsx_runtime.jsx)(build_default,{type:`dots`})},[state]);return(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Box_default,{gap:1,children:[(0,import_jsx_runtime.jsx)(Text,{color:state===`error`?`red`:`gray`,bold:!0,children:icon}),(0,import_jsx_runtime.jsx)(Text,{children:name$2})]}),(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,flexDirection:`column`,overflowX:`hidden`,width:maxWidth?maxWidth-4:void 0,gap:0,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Input:`}),Object.entries(input).map(([key,value])=>(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:key}),(0,import_jsx_runtime.jsx)(Text,{color:`blackBright`,children:`=`}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth?maxWidth-6-1-2-key.length:void 0,children:(0,import_jsx_runtime.jsx)(Text,{wrap:`truncate-middle`,children:value})})]},key)),output&&(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Output:`}),typeof output==`string`?(0,import_jsx_runtime.jsx)(Box_default,{marginLeft:2,children:(0,import_jsx_runtime.jsx)(Text,{children:output})}):(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,children:Object.entries(output).map(([key,value])=>(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:key}),(0,import_jsx_runtime.jsx)(Text,{color:`blackBright`,children:`=`}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth?maxWidth-6-1-key.length:void 0,children:(0,import_jsx_runtime.jsx)(Text,{wrap:`truncate-middle`,children:value})})]},key))})]}),error$22&&(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Error:`}),(0,import_jsx_runtime.jsx)(Text,{color:`red`,children:error$22})]})]})]})};async function dev(directory){directory||(directory=process.cwd());let exitWithDump=error$22=>{writeFileSync$1(`error.dump`,inspect$1(error$22,{depth:null})),process.exit(1)};process.addListener(`uncaughtException`,error$22=>{exitWithDump(error$22)}),process.addListener(`unhandledRejection`,error$22=>{exitWithDump(error$22)});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,6 +17,6 @@ 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;if(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){let e=[`SIGUSR1`,`SIGUSR2`,`SIGTERM`,`SIGINT`,`SIGHUP`];e.forEach(e=>{o.on(e,()=>{f.killed===!1&&f.exitCode===null&&f.kill(e)})})}let p=this._exitCallback;f.on(`close`,e=>{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&&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&&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`}),t=e.filter(e=>e.conflictsWith.length>0);t.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,i=e.slice();function a(e){return e.length>1&&e[0]===`-`}let o=e=>/^-\d*\.?\d+(e[+-]?\d+)?$/.test(e)?!this._getCommandAndAncestors().some(e=>e.options.map(e=>e.short).some(e=>/^-\d$/.test(e))):!1,s=null;for(;i.length;){let e=i.shift();if(e===`--`){r===n&&r.push(e),r.push(...i);break}if(s&&(!a(e)||o(e))){this.emit(`option:${s.name()}`,e);continue}if(s=null,a(e)){let t=this._findOption(e);if(t){if(t.required){let e=i.shift();e===void 0&&this.optionMissingArgument(t),this.emit(`option:${t.name()}`,e)}else if(t.optional){let e=null;i.length>0&&(!a(i[0])||o(i[0]))&&(e=i.shift()),this.emit(`option:${t.name()}`,e)}else this.emit(`option:${t.name()}`);s=t.variadic?t:null;continue}}if(e.length>2&&e[0]===`-`&&e[1]!==`-`){let t=this._findOption(`-${e[1]}`);if(t){t.required||t.optional&&this._combineFlagAndOptionalValue?this.emit(`option:${t.name()}`,e.slice(2)):(this.emit(`option:${t.name()}`),i.unshift(`-${e.slice(2)}`));continue}}if(/^--[^=]+=/.test(e)){let t=e.indexOf(`=`),n=this._findOption(e.slice(0,t));if(n&&(n.required||n.optional)){this.emit(`option:${n.name()}`,e.slice(t+1));continue}}if(r===t&&a(e)&&!(this.commands.length===0&&o(e))&&(r=n),(this._enablePositionalOptions||this._passThroughOptions)&&t.length===0&&n.length===0){if(this._findCommand(e)){t.push(e),i.length>0&&n.push(...i);break}else if(this._getHelpCommand()&&e===this._getHelpCommand().name()){t.push(e),i.length>0&&t.push(...i);break}else if(this._defaultCommandName){n.push(e),i.length>0&&n.push(...i);break}}if(this._passThroughOptions){r.push(e),i.length>0&&r.push(...i);break}r.push(e)}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(),i=this.getOptionValueSource(r);return i===`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=this.parent?` for '${this.name()}'`:``,i=`error: too many arguments${r}. Expected ${t} argument${n} but got ${e.length}.`;this.error(i,{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=t||`-V, --version`,n=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=e||{};let t=!!e.error,n,r,i;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());let a=e=>(r||(e=this._outputConfiguration.stripColor(e)),n(e));return{error:t,write:a,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(),n=t&&e.find(e=>t.is(e));n&&(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}exports.Command=h,exports.useColor=_})),A=e((exports=>{let{Argument:t}=T(),{Command:n}=k(),{CommanderError:r,InvalidArgumentError:i}=w(),{Help:a}=E(),{Option:o}=D();exports.program=new n,exports.createCommand=e=>new n(e),exports.createOption=(e,t)=>new o(e,t),exports.createArgument=(e,n)=>new t(e,n),exports.Command=n,exports.Option=o,exports.Argument=t,exports.Help=a,exports.CommanderError=r,exports.InvalidArgumentError=i,exports.InvalidOptionArgumentError=i})),j=n(A(),1);const{program:M,createCommand:N,createArgument:P,createOption:F,CommanderError:I,InvalidArgumentError:L,InvalidOptionArgumentError:R,Command:z,Argument:B,Option:V,Help:H}=j.default;var U=`0.1.64`;async function W(e){e||(e=process.cwd());let t=o(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 G=n(a(),1);async function K(e,t){e||(e=process.cwd());let n=await c(),r=new s({authToken:n}),a=await i(e,`package.json`);if(!a)throw Error(`package.json not found`);let m=await S(a,`utf-8`),w=JSON.parse(m),T=g(a),E=_(T,`.blink`,`config.json`),D={};if(v(E)){let e=await S(E,`utf-8`);D=JSON.parse(e)}let O;if(D?.organizationId)try{let e=await r.organizations.get(D.organizationId);O=e.name}catch(e){D.organizationId=void 0}if(!D?.organizationId){let e=await r.organizations.list();if(e.length===1){let t=e[0];D.organizationId=t.id,O=t.name}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}}if(!D.organizationId)throw Error(`Developer error: No organization ID found.`);let k;if(D?.agentId)try{let e=await r.agents.get(D.agentId);k=e.name}catch(e){D.agentId=void 0}if(!D?.agentId)try{let e=await r.organizations.agents.get({organization_id:D.organizationId,agent_name:w.name});D.agentId=e.id,k=e.name}catch(e){let t=await r.agents.create({name:w.name,organization_id:D.organizationId});D.agentId=t.id,k=t.name}if(!D.agentId)throw Error(`Developer error: No agent ID found.`);await y(g(E),{recursive:!0}),await x(E,JSON.stringify({_:`This file can be source controlled. It contains no secrets.`,...D},null,2),`utf-8`);let A=o(T),j=await new Promise((e,t)=>{A.build({cwd:T,entry:A.entry,outdir:A.outdir,watch:!1,onStart:()=>{},onResult:t=>{e(t)}}).catch(t)});if(!j)throw Error(`Failed to build agent`);if(`error`in j)throw Error(j.error.message);let M={},N=await b(j.outdir);for(let e of N)M[_(j.outdir,e)]=e;let P=_(e,`README.md`);await q(P)&&(M[P]=`README.md`);let F=[],I=Object.keys(M).length,L=0,R=0;for(let[e,t]of Object.entries(M)){let n=await C(e),i=n.size;Y(`${l.dim(`[${L+1}/${I}]`)} Uploading ${t} (${J(i)})...`);let a=await S(e),o=await r.files.upload(new File([a],t));F.push({path:t,id:o.id}),L+=1,R+=i}Y(`${l.dim(`[${L}/${I}]`)} Uploaded files (${J(R)}).`),process.stdout.write(`
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(),n=t&&e.find(e=>t.is(e));n&&(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}exports.Command=h,exports.useColor=_})),A=e((exports=>{let{Argument:t}=T(),{Command:n}=k(),{CommanderError:r,InvalidArgumentError:i}=w(),{Help:a}=E(),{Option:o}=D();exports.program=new n,exports.createCommand=e=>new n(e),exports.createOption=(e,t)=>new o(e,t),exports.createArgument=(e,n)=>new t(e,n),exports.Command=n,exports.Option=o,exports.Argument=t,exports.Help=a,exports.CommanderError=r,exports.InvalidArgumentError=i,exports.InvalidOptionArgumentError=i})),j=n(A(),1);const{program:M,createCommand:N,createArgument:P,createOption:F,CommanderError:I,InvalidArgumentError:L,InvalidOptionArgumentError:R,Command:z,Argument:B,Option:V,Help:H}=j.default;var U=`0.1.65`;async function W(e){e||(e=process.cwd());let t=o(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 G=n(a(),1);async function K(e,t){e||(e=process.cwd());let n=await c(),r=new s({authToken:n}),a=await i(e,`package.json`);if(!a)throw Error(`package.json not found`);let m=await S(a,`utf-8`),w=JSON.parse(m),T=g(a),E=_(T,`.blink`,`config.json`),D={};if(v(E)){let e=await S(E,`utf-8`);D=JSON.parse(e)}let O;if(D?.organizationId)try{let e=await r.organizations.get(D.organizationId);O=e.name}catch(e){D.organizationId=void 0}if(!D?.organizationId){let e=await r.organizations.list();if(e.length===1){let t=e[0];D.organizationId=t.id,O=t.name}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}}if(!D.organizationId)throw Error(`Developer error: No organization ID found.`);let k;if(D?.agentId)try{let e=await r.agents.get(D.agentId);k=e.name}catch(e){D.agentId=void 0}if(!D?.agentId)try{let e=await r.organizations.agents.get({organization_id:D.organizationId,agent_name:w.name});D.agentId=e.id,k=e.name}catch(e){let t=await r.agents.create({name:w.name,organization_id:D.organizationId});D.agentId=t.id,k=t.name}if(!D.agentId)throw Error(`Developer error: No agent ID found.`);await y(g(E),{recursive:!0}),await x(E,JSON.stringify({_:`This file can be source controlled. It contains no secrets.`,...D},null,2),`utf-8`);let A=o(T),j=await new Promise((e,t)=>{A.build({cwd:T,entry:A.entry,outdir:A.outdir,watch:!1,onStart:()=>{},onResult:t=>{e(t)}}).catch(t)});if(!j)throw Error(`Failed to build agent`);if(`error`in j)throw Error(j.error.message);let M={},N=await b(j.outdir);for(let e of N)M[_(j.outdir,e)]=e;let P=_(e,`README.md`);await q(P)&&(M[P]=`README.md`);let F=[],I=Object.keys(M).length,L=0,R=0;for(let[e,t]of Object.entries(M)){let n=await C(e),i=n.size;Y(`${l.dim(`[${L+1}/${I}]`)} Uploading ${t} (${J(i)})...`);let a=await S(e),o=await r.files.upload(new File([a],t));F.push({path:t,id:o.id}),L+=1,R+=i}Y(`${l.dim(`[${L}/${I}]`)} Uploaded files (${J(R)}).`),process.stdout.write(`
21
21
  `);let z=_(e,`.env.local`),B=[];if(await q(z)){let e=(0,G.parse)(await S(z,`utf-8`));B=Object.keys(e)}let V=[],H=await r.agents.env.list({agent_id:D.agentId});V=H.map(e=>e.key);let U=_(e,`.env.production`);if(await q(U)){let e=(0,G.parse)(await S(U,`utf-8`)),t=Object.entries(e),n=t.length,i=0;for(let[e,a]of t){let t=await r.agents.env.create({agent_id:D.agentId,key:e,value:a,target:[`production`,`preview`],secret:!0,upsert:!0});V.push(t.key),i+=1,Y(`${l.dim(`[${i}/${n}]`)} Updating environment variable: ${e} ${l.dim(`(.env.production)`)}`)}Y(`${l.dim(`[${i}/${n}]`)} Updated environment variables! ${l.dim(`(.env.production)`)}`),process.stdout.write(`
22
- `)}let W=B.filter(e=>!V.includes(e));if(W.length>0){console.log(`Warning: The following environment variables are set in .env.local but not in .env.production:`);for(let e of W)console.log(`- ${e}`);let e=await p({message:`Do you want to deploy anyway?`});if(e===!1||d(e))return}let K=await r.agents.deployments.create({agent_id:D.agentId,target:`production`,entrypoint:h(j.entry),files:F,message:t?.message}),X=`https://blink.so/${O}/${k}/deployments/${K.number}`;console.log(`Deployed:`,X);let Z=u();Z.start(`Waiting for deployment to be live...`);try{for(;;){let e=await r.agents.deployments.get({agent_id:D.agentId,deployment_id:K.id});if(e.status===`success`){let t=`Deployment successful.`;e.target===`production`&&(t+=` All chats will use this deployment!`),Z.stop(t);break}if(e.status===`failed`){let t=`Deployment failed.`;e.error_message&&(t+=` ${e.error_message}`),Z.stop(t),console.log(`Read logs for details:`,X);return}await new Promise(e=>setTimeout(e,500))}}catch(e){Z.stop(`Failed to poll for deployment status.`),console.log(`Read logs for details:`,X);return}}const q=async e=>{try{return await C(e),!0}catch(e){return!1}};function J(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/Math.pow(t,r);return`${i.toFixed(i>=100?0:i>=10?1:2)}${n[r]}`}function Y(e){if(process.stdout.isTTY)try{process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(e);return}catch{}console.log(e)}globalThis.WebSocket||(globalThis.WebSocket=r.default),globalThis.crypto||(globalThis.crypto={}),globalThis.crypto.randomUUID||(globalThis.crypto.randomUUID=()=>m()),M.name(`blink`).description(`Blink is a runtime for building and deploying AI agents.`).version(U).action(()=>{M.outputHelp()});const X=e=>async(...t)=>{let{default:n}=await e();return n(...t)};M.command(`init [directory]`).description(`Initialize a new Blink agent.`).action(X(()=>import(`./init-B61NlodJ.js`))),M.command(`dev [directory] [options]`).description(`Start a development server for your agent.`).action(X(()=>import(`./dev-C0ieiMQk.js`))),M.command(`deploy [directory]`).description(`Deploy your agent to the Blink Cloud.`).option(`-m, --message <message>`,`Message for this deployment`).action(K),M.command(`build [directory]`).description(`Build your agent for production.`).action(W),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(`connect`,{hidden:!0}).description(`Connect compute to the Blink Cloud.`).action(X(()=>import(`./connect-BHyGYU8L.js`))),M.command(`chat`,{hidden:!0}).description(`Start a Blink chat connected to your machine.`).action(X(()=>import(`./chat-L0VBV1Zr.js`))),M.command(`login`,{hidden:!0}).description(`Log in to the Blink Cloud.`).action(X(()=>import(`./login-DKW_KVCA.js`))),M.parse(process.argv);export{};
22
+ `)}let W=B.filter(e=>!V.includes(e));if(W.length>0){console.log(`Warning: The following environment variables are set in .env.local but not in .env.production:`);for(let e of W)console.log(`- ${e}`);let e=await p({message:`Do you want to deploy anyway?`});if(e===!1||d(e))return}let K=await r.agents.deployments.create({agent_id:D.agentId,target:`production`,entrypoint:h(j.entry),files:F,message:t?.message}),X=`https://blink.so/${O}/${k}/deployments/${K.number}`;console.log(`Deployed:`,X);let Z=u();Z.start(`Waiting for deployment to be live...`);try{for(;;){let e=await r.agents.deployments.get({agent_id:D.agentId,deployment_id:K.id});if(e.status===`success`){let t=`Deployment successful.`;e.target===`production`&&(t+=` All chats will use this deployment!`),Z.stop(t);break}if(e.status===`failed`){let t=`Deployment failed.`;e.error_message&&(t+=` ${e.error_message}`),Z.stop(t),console.log(`Read logs for details:`,X);return}await new Promise(e=>setTimeout(e,500))}}catch(e){Z.stop(`Failed to poll for deployment status.`),console.log(`Read logs for details:`,X);return}}const q=async e=>{try{return await C(e),!0}catch(e){return!1}};function J(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/Math.pow(t,r);return`${i.toFixed(i>=100?0:i>=10?1:2)}${n[r]}`}function Y(e){if(process.stdout.isTTY)try{process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(e);return}catch{}console.log(e)}globalThis.WebSocket||(globalThis.WebSocket=r.default),globalThis.crypto||(globalThis.crypto={}),globalThis.crypto.randomUUID||(globalThis.crypto.randomUUID=()=>m()),M.name(`blink`).description(`Blink is a runtime for building and deploying AI agents.`).version(U).action(()=>{M.outputHelp()});const X=e=>async(...t)=>{let{default:n}=await e();return n(...t)};M.command(`init [directory]`).description(`Initialize a new Blink agent.`).action(X(()=>import(`./init-BEvNUWUD.js`))),M.command(`dev [directory] [options]`).description(`Start a development server for your agent.`).action(X(()=>import(`./dev-knS68Vac.js`))),M.command(`deploy [directory]`).description(`Deploy your agent to the Blink Cloud.`).option(`-m, --message <message>`,`Message for this deployment`).action(K),M.command(`build [directory]`).description(`Build your agent for production.`).action(W),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(`connect`,{hidden:!0}).description(`Connect compute to the Blink Cloud.`).action(X(()=>import(`./connect-BHyGYU8L.js`))),M.command(`chat`,{hidden:!0}).description(`Start a Blink chat connected to your machine.`).action(X(()=>import(`./chat-L0VBV1Zr.js`))),M.command(`login`,{hidden:!0}).description(`Log in to the Blink Cloud.`).action(X(()=>import(`./login-DKW_KVCA.js`))),M.parse(process.argv);export{};
@@ -2,7 +2,7 @@ import{Ie as e,M as t,Se as n,pD as r,ve as i,xe as a}from"./dist-NqrnQGst.js";i
2
2
  import * as blink from "blink";
3
3
  import { z } from "zod";
4
4
 
5
- export default blink.agent({
5
+ blink.agent({
6
6
  async sendMessages({ messages }) {
7
7
  return streamText({
8
8
  model: "openai/gpt-oss-120b",
@@ -22,7 +22,7 @@ Suggest the user adds tools to the agent. Demonstrate your capabilities with the
22
22
  },
23
23
  })
24
24
  },
25
- })
25
+ }).serve()
26
26
  `,".gitignore":`# dependencies
27
27
  node_modules
28
28
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blink",
3
- "version": "0.1.64",
3
+ "version": "0.1.65",
4
4
  "description": "Blink is a JavaScript runtime for building and deploying AI agents.",
5
5
  "type": "module",
6
6
  "bin": {