blink 0.1.43 → 0.1.44

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.
@@ -1,3 +1,3 @@
1
- Object.defineProperty(exports,`__esModule`,{value:!0});const e=require(`../cookie-B3SvZDri.cjs`);let t=require(`util`);t=e.__toESM(t);const n=`x-blink-stream-response-format`,r=`BLINK_API_SERVER_URL`;var i=(e,t)=>(e=e.replace(/\/+$/,``),e+=`/`,t=t.replace(/^\/+/,``),e+t),a=(e,t)=>{for(let[n,r]of Object.entries(t)){let t=RegExp(`/:`+n+`(?:{[^/]+})?\\??`);e=e.replace(t,r?`/${r}`:``)}return e},o=e=>{let t=new URLSearchParams;for(let[n,r]of Object.entries(e)){if(r===void 0)continue;if(Array.isArray(r))for(let e of r)t.append(n,e);else t.set(n,r)}return t},s=(e,t)=>{switch(t){case`ws`:return e.replace(/^http/,`ws`);case`http`:return e.replace(/^ws/,`http`)}},c=e=>/^https?:\/\/[^\/]+?\/index(?=\?|$)/.test(e)?e.replace(/\/index(?=\?|$)/,`/`):e.replace(/\/index(?=\?|$)/,``);function l(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function u(e,t){if(!l(e)&&!l(t))return t;let n={...e};for(let e in t){let r=t[e];l(n[e])&&l(r)?n[e]=u(n[e],r):n[e]=r}return n}var d=(e,t)=>{let n=new Proxy(()=>{},{get(n,r){if(!(typeof r!=`string`||r===`then`))return d(e,[...t,r])},apply(n,r,i){return e({path:t,args:i})}});return n},f=class{url;method;queryParams=void 0;pathParams={};rBody;cType=void 0;constructor(e,t){this.url=e,this.method=t}fetch=async(t,n)=>{if(t){if(t.query&&(this.queryParams=o(t.query)),t.form){let e=new FormData;for(let[n,r]of Object.entries(t.form))if(Array.isArray(r))for(let t of r)e.append(n,t);else e.append(n,r);this.rBody=e}t.json&&(this.rBody=JSON.stringify(t.json),this.cType=`application/json`),t.param&&(this.pathParams=t.param)}let r=this.method.toUpperCase(),i={...t?.header,...typeof n?.headers==`function`?await n.headers():n?.headers};if(t?.cookie){let n=[];for(let[r,i]of Object.entries(t.cookie))n.push(e.serialize(r,i,{path:`/`}));i.Cookie=n.join(`,`)}this.cType&&(i[`Content-Type`]=this.cType);let s=new Headers(i??void 0),l=this.url;l=c(l),l=a(l,this.pathParams),this.queryParams&&(l=l+`?`+this.queryParams.toString()),r=this.method.toUpperCase();let u=!(r===`GET`||r===`HEAD`);return(n?.fetch||fetch)(l,{body:u?this.rBody:void 0,method:r,headers:s,...n?.init})}},p=(e,t)=>d(function n(r){let l=[...r.path],d=l.slice(-3).reverse();if(d[0]===`toString`)return d[1]===`name`?d[2]||``:n.toString();if(d[0]===`valueOf`)return d[1]===`name`?d[2]||``:n;let p=``;if(/^\$/.test(d[0])){let e=l.pop();e&&(p=e.replace(/^\$/,``))}let m=l.join(`/`),h=i(e,m);if(p===`url`){let e=h;return r.args[0]&&(r.args[0].param&&(e=a(h,r.args[0].param)),r.args[0].query&&(e=e+`?`+o(r.args[0].query).toString())),e=c(e),new URL(e)}if(p===`ws`){let e=s(r.args[0]&&r.args[0].param?a(h,r.args[0].param):h,`ws`),n=new URL(e),i=r.args[0]?.query;i&&Object.entries(i).forEach(([e,t])=>{Array.isArray(t)?t.forEach(t=>n.searchParams.append(e,t)):n.searchParams.set(e,t)});let o=(...e)=>t?.webSocket!==void 0&&typeof t.webSocket==`function`?t.webSocket(...e):new WebSocket(...e);return o(n.toString())}let g=new f(h,p);if(p){t??={};let e=u(t,{...r.args[1]});return g.fetch(r.args[0],e)}return g},[]);const m=process.env.BLINK_API_SERVER_URL,h=p(m??``,{fetch:m?void 0:async()=>{throw console.warn(`Your code is attempting to use the Blink API server, but no API server is configured for this Blink agent.`),Error(`No API server is configured for this Blink agent. External APIs are not available.`)}}),g=Object.freeze({upsert:async e=>{let t=await h.chat[`:id`].$post({param:{id:e}});if(t.status!==200){let e=await t.json();throw Error(e.error)}return{id:e}},message:async(e,t,n)=>{let r=await h.chat[`:id`].sendMessages.$post({param:{id:e},json:{messages:[t],behavior:n?.behavior??`enqueue`}});if(r.status!==204){let e=await r.json();throw Error(e.error)}}}),_=Object.freeze({get:async e=>{let t=await h.storage[`:key`].$get({param:{key:e}});if(t.status!==200){let e=await t.json();throw Error(e.error)}let n=await t.json();return n.value},set:async(e,t)=>{let n=await h.storage[`:key`].$post({param:{key:e},json:{value:t}});if(n.status!==204){let e=await n.json();throw Error(e.error)}}}),v={with(e,t){let n={};for(let[r,i]of Object.entries(e))n[r]=i.with(t);return n},prefix(e,t){let n={};for(let[r,i]of Object.entries(e))n[`${t}${r}`]=i;return n}};function y(e){return{version:`v0`,supportsWebhooks:e.webhook!==void 0,fetch:async t=>{let n=new URL(t.url);switch(n.pathname){case`/sendMessages`:return b(t,e);case`/webhook`:return x(t,e);default:return new Response(`Not found`,{status:404})}}}}async function b(e,n){if(e.method!==`POST`)return new Response(`Method not allowed`,{status:405});let r;try{r=await e.json()}catch{return new Response(`Invalid request`,{status:400})}let i;try{i=await n.sendMessages({messages:r.messages,request:e})}catch(e){return new Response(JSON.stringify({error:t.default.inspect(e)}),{status:500})}if(i instanceof Response)return i;let a;if(i instanceof ReadableStream)a=i;else{if(typeof i!=`object`||!(`toUIMessageStream`in i))throw Error(`The agent must return a "Response", "ReadableStream", or "toUIMessageStream" function.`);a=i.toUIMessageStream()}return new Response(a.pipeThrough(new TransformStream({transform(e,t){t.enqueue(`data: ${JSON.stringify(e)}\n\n`)},flush(e){e.enqueue(`data: [DONE]
1
+ Object.defineProperty(exports,`__esModule`,{value:!0});const e=require(`../cookie-B3SvZDri.cjs`);let t=require(`util`);t=e.__toESM(t);const n=`x-blink-stream-response-format`,r=`BLINK_API_SERVER_URL`;var i=(e,t)=>(e=e.replace(/\/+$/,``),e+=`/`,t=t.replace(/^\/+/,``),e+t),a=(e,t)=>{for(let[n,r]of Object.entries(t)){let t=RegExp(`/:`+n+`(?:{[^/]+})?\\??`);e=e.replace(t,r?`/${r}`:``)}return e},o=e=>{let t=new URLSearchParams;for(let[n,r]of Object.entries(e)){if(r===void 0)continue;if(Array.isArray(r))for(let e of r)t.append(n,e);else t.set(n,r)}return t},s=(e,t)=>{switch(t){case`ws`:return e.replace(/^http/,`ws`);case`http`:return e.replace(/^ws/,`http`)}},c=e=>/^https?:\/\/[^\/]+?\/index(?=\?|$)/.test(e)?e.replace(/\/index(?=\?|$)/,`/`):e.replace(/\/index(?=\?|$)/,``);function l(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function u(e,t){if(!l(e)&&!l(t))return t;let n={...e};for(let e in t){let r=t[e];l(n[e])&&l(r)?n[e]=u(n[e],r):n[e]=r}return n}var d=(e,t)=>{let n=new Proxy(()=>{},{get(n,r){if(!(typeof r!=`string`||r===`then`))return d(e,[...t,r])},apply(n,r,i){return e({path:t,args:i})}});return n},f=class{url;method;queryParams=void 0;pathParams={};rBody;cType=void 0;constructor(e,t){this.url=e,this.method=t}fetch=async(t,n)=>{if(t){if(t.query&&(this.queryParams=o(t.query)),t.form){let e=new FormData;for(let[n,r]of Object.entries(t.form))if(Array.isArray(r))for(let t of r)e.append(n,t);else e.append(n,r);this.rBody=e}t.json&&(this.rBody=JSON.stringify(t.json),this.cType=`application/json`),t.param&&(this.pathParams=t.param)}let r=this.method.toUpperCase(),i={...t?.header,...typeof n?.headers==`function`?await n.headers():n?.headers};if(t?.cookie){let n=[];for(let[r,i]of Object.entries(t.cookie))n.push(e.serialize(r,i,{path:`/`}));i.Cookie=n.join(`,`)}this.cType&&(i[`Content-Type`]=this.cType);let s=new Headers(i??void 0),l=this.url;l=c(l),l=a(l,this.pathParams),this.queryParams&&(l=l+`?`+this.queryParams.toString()),r=this.method.toUpperCase();let u=!(r===`GET`||r===`HEAD`);return(n?.fetch||fetch)(l,{body:u?this.rBody:void 0,method:r,headers:s,...n?.init})}},p=(e,t)=>d(function n(r){let l=[...r.path],d=l.slice(-3).reverse();if(d[0]===`toString`)return d[1]===`name`?d[2]||``:n.toString();if(d[0]===`valueOf`)return d[1]===`name`?d[2]||``:n;let p=``;if(/^\$/.test(d[0])){let e=l.pop();e&&(p=e.replace(/^\$/,``))}let m=l.join(`/`),h=i(e,m);if(p===`url`){let e=h;return r.args[0]&&(r.args[0].param&&(e=a(h,r.args[0].param)),r.args[0].query&&(e=e+`?`+o(r.args[0].query).toString())),e=c(e),new URL(e)}if(p===`ws`){let e=s(r.args[0]&&r.args[0].param?a(h,r.args[0].param):h,`ws`),n=new URL(e),i=r.args[0]?.query;i&&Object.entries(i).forEach(([e,t])=>{Array.isArray(t)?t.forEach(t=>n.searchParams.append(e,t)):n.searchParams.set(e,t)});let o=(...e)=>t?.webSocket!==void 0&&typeof t.webSocket==`function`?t.webSocket(...e):new WebSocket(...e);return o(n.toString())}let g=new f(h,p);if(p){t??={};let e=u(t,{...r.args[1]});return g.fetch(r.args[0],e)}return g},[]);const m=process.env.BLINK_API_SERVER_URL,h=p(m??``,{fetch:m?void 0:async()=>{throw console.warn(`Your code is attempting to use the Blink API server, but no API server is configured for this Blink agent.`),Error(`No API server is configured for this Blink agent. External APIs are not available.`)}}),g=Object.freeze({upsert:async e=>{let t=await h.chat[`:id`].$post({param:{id:e}});if(t.status!==200){let e=await t.json();throw Error(e.error)}return{id:e}},message:async(e,t,n)=>{let r=await h.chat[`:id`].sendMessages.$post({param:{id:e},json:{messages:[t],behavior:n?.behavior??`enqueue`}});if(r.status!==204){let e=await r.json();throw Error(e.error)}}}),_=Object.freeze({get:async e=>{let t=await h.storage[`:key`].$get({param:{key:e}});if(t.status!==200){let e=await t.json();throw Error(e.error)}let n=await t.json();return n.value},set:async(e,t)=>{let n=await h.storage[`:key`].$post({param:{key:e},json:{value:t}});if(n.status!==204){let e=await n.json();throw Error(e.error)}}}),v={with(e,t){let n={};for(let r in e){let i=e[r];if(!i)continue;n[r]=i.with(t)}return n},prefix(e,t){let n={};for(let[r,i]of Object.entries(e))n[`${t}${r}`]=i;return n}};function y(e){return{version:`v0`,supportsWebhooks:e.webhook!==void 0,fetch:async t=>{let n=new URL(t.url);switch(n.pathname){case`/sendMessages`:return b(t,e);case`/webhook`:return x(t,e);default:return new Response(`Not found`,{status:404})}}}}async function b(e,n){if(e.method!==`POST`)return new Response(`Method not allowed`,{status:405});let r;try{r=await e.json()}catch{return new Response(`Invalid request`,{status:400})}let i;try{i=await n.sendMessages({messages:r.messages,chat:r.chat,request:e})}catch(e){return new Response(JSON.stringify({error:t.default.inspect(e)}),{status:500})}if(i instanceof Response)return i;let a;if(i instanceof ReadableStream)a=i;else{if(typeof i!=`object`||!(`toUIMessageStream`in i))throw Error(`The agent must return a "Response", "ReadableStream", or "toUIMessageStream" function.`);a=i.toUIMessageStream()}return new Response(a.pipeThrough(new TransformStream({transform(e,t){t.enqueue(`data: ${JSON.stringify(e)}\n\n`)},flush(e){e.enqueue(`data: [DONE]
2
2
 
3
3
  `)}})).pipeThrough(new TextEncoderStream),{headers:{"content-type":`text/event-stream`,"cache-control":`no-cache, no-transform`,connection:`keep-alive`,"x-vercel-ai-ui-message-stream":`v1`,"x-accel-buffering":`no`}})}async function x(e,n){if(!n.webhook)return new Response(`No webhook function provided`,{status:501});try{let t=await n.webhook(e);return t||new Response(`OK`,{status:200})}catch(e){return new Response(JSON.stringify({error:t.default.inspect(e)}),{status:500})}}function S(e,t){return e.headers.set(`x-blink-stream-response-format`,t),e}var C={agent:y,chat:g,storage:_,tools:v};exports.agent=y,exports.chat=g,exports.default=C,exports.storage=_,exports.tools=v,exports.withResponseFormat=S;
@@ -47,7 +47,7 @@ declare const tools: {
47
47
  * @param tools
48
48
  * @returns
49
49
  */
50
- with<TOOLS extends Record<string, ToolWith<CONTEXT, Tool>>, CONTEXT>(tools: TOOLS, context: CONTEXT): Record<string, Tool>;
50
+ with<TOOLS extends Record<string, ToolWith<any, Tool>>>(tools: TOOLS, context: ContextFromTools<TOOLS>): Record<string, Tool>;
51
51
  /**
52
52
  * prefix adds a prefix to all the tools in a tool set.
53
53
  *
@@ -57,6 +57,8 @@ declare const tools: {
57
57
  */
58
58
  prefix(tools: ToolSet, prefix: string): ToolSet;
59
59
  };
60
+ type UnionToIntersection<U> = (U extends unknown ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
61
+ type ContextFromTools<TOOLS extends Record<string, ToolWith<any, Tool>>> = UnionToIntersection<TOOLS[keyof TOOLS] extends ToolWith<infer C, any> ? C : never>;
60
62
  //#endregion
61
63
  //#region src/api/storage.d.ts
62
64
  /**
@@ -80,6 +82,7 @@ type SendMessagesResponse = {
80
82
  */
81
83
  interface SendMessagesOptions<MESSAGE extends UIMessage = UIMessage> {
82
84
  readonly messages: MESSAGE[];
85
+ readonly chat: Chat;
83
86
  readonly abortSignal?: AbortSignal;
84
87
  readonly request: Request;
85
88
  }
@@ -119,9 +122,9 @@ declare const _default: {
119
122
  set: (key: string, value: string) => Promise<void>;
120
123
  }>;
121
124
  tools: {
122
- with<TOOLS extends Record<string, ToolWith<CONTEXT, ai0.Tool>>, CONTEXT>(tools: TOOLS, context: CONTEXT): Record<string, ai0.Tool>;
125
+ with<TOOLS extends Record<string, ToolWith<any, ai0.Tool>>>(tools: TOOLS, context: ContextFromTools<TOOLS>): Record<string, ai0.Tool>;
123
126
  prefix(tools: ai0.ToolSet, prefix: string): ai0.ToolSet;
124
127
  };
125
128
  };
126
129
  //#endregion
127
- export { Agent, AgentDefaultExport, Chat, Message, MessageOptions, SendMessagesOptions, SendMessagesResponse, StreamResponseFormat, ToolWith, agent, chat, _default as default, storage, tools, withResponseFormat };
130
+ export { Agent, AgentDefaultExport, Chat, ContextFromTools, Message, MessageOptions, SendMessagesOptions, SendMessagesResponse, StreamResponseFormat, ToolWith, agent, chat, _default as default, storage, tools, withResponseFormat };
@@ -47,7 +47,7 @@ declare const tools: {
47
47
  * @param tools
48
48
  * @returns
49
49
  */
50
- with<TOOLS extends Record<string, ToolWith<CONTEXT, Tool>>, CONTEXT>(tools: TOOLS, context: CONTEXT): Record<string, Tool>;
50
+ with<TOOLS extends Record<string, ToolWith<any, Tool>>>(tools: TOOLS, context: ContextFromTools<TOOLS>): Record<string, Tool>;
51
51
  /**
52
52
  * prefix adds a prefix to all the tools in a tool set.
53
53
  *
@@ -57,6 +57,8 @@ declare const tools: {
57
57
  */
58
58
  prefix(tools: ToolSet, prefix: string): ToolSet;
59
59
  };
60
+ type UnionToIntersection<U> = (U extends unknown ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
61
+ type ContextFromTools<TOOLS extends Record<string, ToolWith<any, Tool>>> = UnionToIntersection<TOOLS[keyof TOOLS] extends ToolWith<infer C, any> ? C : never>;
60
62
  //#endregion
61
63
  //#region src/api/storage.d.ts
62
64
  /**
@@ -80,6 +82,7 @@ type SendMessagesResponse = {
80
82
  */
81
83
  interface SendMessagesOptions<MESSAGE extends UIMessage = UIMessage> {
82
84
  readonly messages: MESSAGE[];
85
+ readonly chat: Chat;
83
86
  readonly abortSignal?: AbortSignal;
84
87
  readonly request: Request;
85
88
  }
@@ -119,9 +122,9 @@ declare const _default: {
119
122
  set: (key: string, value: string) => Promise<void>;
120
123
  }>;
121
124
  tools: {
122
- with<TOOLS extends Record<string, ToolWith<CONTEXT, ai0.Tool>>, CONTEXT>(tools: TOOLS, context: CONTEXT): Record<string, ai0.Tool>;
125
+ with<TOOLS extends Record<string, ToolWith<any, ai0.Tool>>>(tools: TOOLS, context: ContextFromTools<TOOLS>): Record<string, ai0.Tool>;
123
126
  prefix(tools: ai0.ToolSet, prefix: string): ai0.ToolSet;
124
127
  };
125
128
  };
126
129
  //#endregion
127
- export { Agent, AgentDefaultExport, Chat, Message, MessageOptions, SendMessagesOptions, SendMessagesResponse, StreamResponseFormat, ToolWith, agent, chat, _default as default, storage, tools, withResponseFormat };
130
+ export { Agent, AgentDefaultExport, Chat, ContextFromTools, Message, MessageOptions, SendMessagesOptions, SendMessagesResponse, StreamResponseFormat, ToolWith, agent, chat, _default as default, storage, tools, withResponseFormat };
package/dist/api/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import{serialize as e}from"../cookie-BiKY7-P1.js";import t from"util";var n=(e,t)=>(e=e.replace(/\/+$/,``),e+=`/`,t=t.replace(/^\/+/,``),e+t),r=(e,t)=>{for(let[n,r]of Object.entries(t)){let t=RegExp(`/:`+n+`(?:{[^/]+})?\\??`);e=e.replace(t,r?`/${r}`:``)}return e},i=e=>{let t=new URLSearchParams;for(let[n,r]of Object.entries(e)){if(r===void 0)continue;if(Array.isArray(r))for(let e of r)t.append(n,e);else t.set(n,r)}return t},a=(e,t)=>{switch(t){case`ws`:return e.replace(/^http/,`ws`);case`http`:return e.replace(/^ws/,`http`)}},o=e=>/^https?:\/\/[^\/]+?\/index(?=\?|$)/.test(e)?e.replace(/\/index(?=\?|$)/,`/`):e.replace(/\/index(?=\?|$)/,``);function s(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function c(e,t){if(!s(e)&&!s(t))return t;let n={...e};for(let e in t){let r=t[e];s(n[e])&&s(r)?n[e]=c(n[e],r):n[e]=r}return n}var l=(e,t)=>{let n=new Proxy(()=>{},{get(n,r){if(!(typeof r!=`string`||r===`then`))return l(e,[...t,r])},apply(n,r,i){return e({path:t,args:i})}});return n},u=class{url;method;queryParams=void 0;pathParams={};rBody;cType=void 0;constructor(e,t){this.url=e,this.method=t}fetch=async(t,n)=>{if(t){if(t.query&&(this.queryParams=i(t.query)),t.form){let e=new FormData;for(let[n,r]of Object.entries(t.form))if(Array.isArray(r))for(let t of r)e.append(n,t);else e.append(n,r);this.rBody=e}t.json&&(this.rBody=JSON.stringify(t.json),this.cType=`application/json`),t.param&&(this.pathParams=t.param)}let a=this.method.toUpperCase(),s={...t?.header,...typeof n?.headers==`function`?await n.headers():n?.headers};if(t?.cookie){let n=[];for(let[r,i]of Object.entries(t.cookie))n.push(e(r,i,{path:`/`}));s.Cookie=n.join(`,`)}this.cType&&(s[`Content-Type`]=this.cType);let c=new Headers(s??void 0),l=this.url;l=o(l),l=r(l,this.pathParams),this.queryParams&&(l=l+`?`+this.queryParams.toString()),a=this.method.toUpperCase();let u=!(a===`GET`||a===`HEAD`);return(n?.fetch||fetch)(l,{body:u?this.rBody:void 0,method:a,headers:c,...n?.init})}},d=(e,t)=>l(function s(l){let d=[...l.path],f=d.slice(-3).reverse();if(f[0]===`toString`)return f[1]===`name`?f[2]||``:s.toString();if(f[0]===`valueOf`)return f[1]===`name`?f[2]||``:s;let p=``;if(/^\$/.test(f[0])){let e=d.pop();e&&(p=e.replace(/^\$/,``))}let m=d.join(`/`),h=n(e,m);if(p===`url`){let e=h;return l.args[0]&&(l.args[0].param&&(e=r(h,l.args[0].param)),l.args[0].query&&(e=e+`?`+i(l.args[0].query).toString())),e=o(e),new URL(e)}if(p===`ws`){let e=a(l.args[0]&&l.args[0].param?r(h,l.args[0].param):h,`ws`),n=new URL(e),i=l.args[0]?.query;i&&Object.entries(i).forEach(([e,t])=>{Array.isArray(t)?t.forEach(t=>n.searchParams.append(e,t)):n.searchParams.set(e,t)});let o=(...e)=>t?.webSocket!==void 0&&typeof t.webSocket==`function`?t.webSocket(...e):new WebSocket(...e);return o(n.toString())}let g=new u(h,p);if(p){t??={};let e=c(t,{...l.args[1]});return g.fetch(l.args[0],e)}return g},[]);const f=process.env.BLINK_API_SERVER_URL,p=d(f??``,{fetch:f?void 0:async()=>{throw console.warn(`Your code is attempting to use the Blink API server, but no API server is configured for this Blink agent.`),Error(`No API server is configured for this Blink agent. External APIs are not available.`)}}),m=Object.freeze({upsert:async e=>{let t=await p.chat[`:id`].$post({param:{id:e}});if(t.status!==200){let e=await t.json();throw Error(e.error)}return{id:e}},message:async(e,t,n)=>{let r=await p.chat[`:id`].sendMessages.$post({param:{id:e},json:{messages:[t],behavior:n?.behavior??`enqueue`}});if(r.status!==204){let e=await r.json();throw Error(e.error)}}}),h=Object.freeze({get:async e=>{let t=await p.storage[`:key`].$get({param:{key:e}});if(t.status!==200){let e=await t.json();throw Error(e.error)}let n=await t.json();return n.value},set:async(e,t)=>{let n=await p.storage[`:key`].$post({param:{key:e},json:{value:t}});if(n.status!==204){let e=await n.json();throw Error(e.error)}}}),g={with(e,t){let n={};for(let[r,i]of Object.entries(e))n[r]=i.with(t);return n},prefix(e,t){let n={};for(let[r,i]of Object.entries(e))n[`${t}${r}`]=i;return n}};function _(e){return{version:`v0`,supportsWebhooks:e.webhook!==void 0,fetch:async t=>{let n=new URL(t.url);switch(n.pathname){case`/sendMessages`:return v(t,e);case`/webhook`:return y(t,e);default:return new Response(`Not found`,{status:404})}}}}async function v(e,n){if(e.method!==`POST`)return new Response(`Method not allowed`,{status:405});let r;try{r=await e.json()}catch{return new Response(`Invalid request`,{status:400})}let i;try{i=await n.sendMessages({messages:r.messages,request:e})}catch(e){return new Response(JSON.stringify({error:t.inspect(e)}),{status:500})}if(i instanceof Response)return i;let a;if(i instanceof ReadableStream)a=i;else{if(typeof i!=`object`||!(`toUIMessageStream`in i))throw Error(`The agent must return a "Response", "ReadableStream", or "toUIMessageStream" function.`);a=i.toUIMessageStream()}return new Response(a.pipeThrough(new TransformStream({transform(e,t){t.enqueue(`data: ${JSON.stringify(e)}\n\n`)},flush(e){e.enqueue(`data: [DONE]
1
+ import{serialize as e}from"../cookie-BiKY7-P1.js";import t from"util";var n=(e,t)=>(e=e.replace(/\/+$/,``),e+=`/`,t=t.replace(/^\/+/,``),e+t),r=(e,t)=>{for(let[n,r]of Object.entries(t)){let t=RegExp(`/:`+n+`(?:{[^/]+})?\\??`);e=e.replace(t,r?`/${r}`:``)}return e},i=e=>{let t=new URLSearchParams;for(let[n,r]of Object.entries(e)){if(r===void 0)continue;if(Array.isArray(r))for(let e of r)t.append(n,e);else t.set(n,r)}return t},a=(e,t)=>{switch(t){case`ws`:return e.replace(/^http/,`ws`);case`http`:return e.replace(/^ws/,`http`)}},o=e=>/^https?:\/\/[^\/]+?\/index(?=\?|$)/.test(e)?e.replace(/\/index(?=\?|$)/,`/`):e.replace(/\/index(?=\?|$)/,``);function s(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function c(e,t){if(!s(e)&&!s(t))return t;let n={...e};for(let e in t){let r=t[e];s(n[e])&&s(r)?n[e]=c(n[e],r):n[e]=r}return n}var l=(e,t)=>{let n=new Proxy(()=>{},{get(n,r){if(!(typeof r!=`string`||r===`then`))return l(e,[...t,r])},apply(n,r,i){return e({path:t,args:i})}});return n},u=class{url;method;queryParams=void 0;pathParams={};rBody;cType=void 0;constructor(e,t){this.url=e,this.method=t}fetch=async(t,n)=>{if(t){if(t.query&&(this.queryParams=i(t.query)),t.form){let e=new FormData;for(let[n,r]of Object.entries(t.form))if(Array.isArray(r))for(let t of r)e.append(n,t);else e.append(n,r);this.rBody=e}t.json&&(this.rBody=JSON.stringify(t.json),this.cType=`application/json`),t.param&&(this.pathParams=t.param)}let a=this.method.toUpperCase(),s={...t?.header,...typeof n?.headers==`function`?await n.headers():n?.headers};if(t?.cookie){let n=[];for(let[r,i]of Object.entries(t.cookie))n.push(e(r,i,{path:`/`}));s.Cookie=n.join(`,`)}this.cType&&(s[`Content-Type`]=this.cType);let c=new Headers(s??void 0),l=this.url;l=o(l),l=r(l,this.pathParams),this.queryParams&&(l=l+`?`+this.queryParams.toString()),a=this.method.toUpperCase();let u=!(a===`GET`||a===`HEAD`);return(n?.fetch||fetch)(l,{body:u?this.rBody:void 0,method:a,headers:c,...n?.init})}},d=(e,t)=>l(function s(l){let d=[...l.path],f=d.slice(-3).reverse();if(f[0]===`toString`)return f[1]===`name`?f[2]||``:s.toString();if(f[0]===`valueOf`)return f[1]===`name`?f[2]||``:s;let p=``;if(/^\$/.test(f[0])){let e=d.pop();e&&(p=e.replace(/^\$/,``))}let m=d.join(`/`),h=n(e,m);if(p===`url`){let e=h;return l.args[0]&&(l.args[0].param&&(e=r(h,l.args[0].param)),l.args[0].query&&(e=e+`?`+i(l.args[0].query).toString())),e=o(e),new URL(e)}if(p===`ws`){let e=a(l.args[0]&&l.args[0].param?r(h,l.args[0].param):h,`ws`),n=new URL(e),i=l.args[0]?.query;i&&Object.entries(i).forEach(([e,t])=>{Array.isArray(t)?t.forEach(t=>n.searchParams.append(e,t)):n.searchParams.set(e,t)});let o=(...e)=>t?.webSocket!==void 0&&typeof t.webSocket==`function`?t.webSocket(...e):new WebSocket(...e);return o(n.toString())}let g=new u(h,p);if(p){t??={};let e=c(t,{...l.args[1]});return g.fetch(l.args[0],e)}return g},[]);const f=process.env.BLINK_API_SERVER_URL,p=d(f??``,{fetch:f?void 0:async()=>{throw console.warn(`Your code is attempting to use the Blink API server, but no API server is configured for this Blink agent.`),Error(`No API server is configured for this Blink agent. External APIs are not available.`)}}),m=Object.freeze({upsert:async e=>{let t=await p.chat[`:id`].$post({param:{id:e}});if(t.status!==200){let e=await t.json();throw Error(e.error)}return{id:e}},message:async(e,t,n)=>{let r=await p.chat[`:id`].sendMessages.$post({param:{id:e},json:{messages:[t],behavior:n?.behavior??`enqueue`}});if(r.status!==204){let e=await r.json();throw Error(e.error)}}}),h=Object.freeze({get:async e=>{let t=await p.storage[`:key`].$get({param:{key:e}});if(t.status!==200){let e=await t.json();throw Error(e.error)}let n=await t.json();return n.value},set:async(e,t)=>{let n=await p.storage[`:key`].$post({param:{key:e},json:{value:t}});if(n.status!==204){let e=await n.json();throw Error(e.error)}}}),g={with(e,t){let n={};for(let r in e){let i=e[r];if(!i)continue;n[r]=i.with(t)}return n},prefix(e,t){let n={};for(let[r,i]of Object.entries(e))n[`${t}${r}`]=i;return n}};function _(e){return{version:`v0`,supportsWebhooks:e.webhook!==void 0,fetch:async t=>{let n=new URL(t.url);switch(n.pathname){case`/sendMessages`:return v(t,e);case`/webhook`:return y(t,e);default:return new Response(`Not found`,{status:404})}}}}async function v(e,n){if(e.method!==`POST`)return new Response(`Method not allowed`,{status:405});let r;try{r=await e.json()}catch{return new Response(`Invalid request`,{status:400})}let i;try{i=await n.sendMessages({messages:r.messages,chat:r.chat,request:e})}catch(e){return new Response(JSON.stringify({error:t.inspect(e)}),{status:500})}if(i instanceof Response)return i;let a;if(i instanceof ReadableStream)a=i;else{if(typeof i!=`object`||!(`toUIMessageStream`in i))throw Error(`The agent must return a "Response", "ReadableStream", or "toUIMessageStream" function.`);a=i.toUIMessageStream()}return new Response(a.pipeThrough(new TransformStream({transform(e,t){t.enqueue(`data: ${JSON.stringify(e)}\n\n`)},flush(e){e.enqueue(`data: [DONE]
2
2
 
3
3
  `)}})).pipeThrough(new TextEncoderStream),{headers:{"content-type":`text/event-stream`,"cache-control":`no-cache, no-transform`,connection:`keep-alive`,"x-vercel-ai-ui-message-stream":`v1`,"x-accel-buffering":`no`}})}async function y(e,n){if(!n.webhook)return new Response(`No webhook function provided`,{status:501});try{let t=await n.webhook(e);return t||new Response(`OK`,{status:200})}catch(e){return new Response(JSON.stringify({error:t.inspect(e)}),{status:500})}}function b(e,t){return e.headers.set(`x-blink-stream-response-format`,t),e}var x={agent:_,chat:m,storage:h,tools:g};export{_ as agent,m as chat,x as default,h as storage,g as tools,b as withResponseFormat};
package/dist/cli/index.js CHANGED
@@ -1747,7 +1747,13 @@ The structure MUST be as follows:
1747
1747
  **Decision Rules (apply in order):**
1748
1748
  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.
1749
1749
  2. **Question to User:** If your last response ends with a direct question specifically addressed *to the user*, then the **'user'** should speak next.
1750
- 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{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$7,j$2,tmp;for(i$7=0;i$7<str2Len;++i$7)prevRow[i$7]=i$7,str2Char[i$7]=str2.charCodeAt(i$7);prevRow[str2Len]=str2Len;var strCmp;if(useCollator)for(i$7=0;i$7<str1Len;++i$7){for(nextCol=i$7+1,j$2=0;j$2<str2Len;++j$2)curCol=nextCol,strCmp=collator.compare(str1.charAt(i$7),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$7=0;i$7<str1Len;++i$7){for(nextCol=i$7+1,j$2=0;j$2<str2Len;++j$2)curCol=nextCol,strCmp=str1.charCodeAt(i$7)===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$2(require_levenshtein(),1),ChatRecordingService=class{conversationFile=null;cachedLastConvData=null;sessionId;projectHash;queuedThoughts=[];queuedTokens=null;config;constructor(config$1){this.config=config$1,this.sessionId=config$1.getSessionId(),this.projectHash=getProjectHash(config$1.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,null),conversation.messages.push(newMsg)}else{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||={});const DEFAULT_TELEMETRY_TARGET=TelemetryTarget.LOCAL,DEFAULT_OTLP_ENDPOINT=`http://localhost:4317`;async function handleFallback(config$1,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$1.fallbackModelHandler;if(typeof fallbackModelHandler!=`function`)return null;try{let intent=await fallbackModelHandler(failedModel,fallbackModel,error$22);switch(intent){case`retry`:return activateFallbackMode(config$1,authType),!0;case`stop`:return activateFallbackMode(config$1,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$1,authType){config$1.isInFallbackMode()||(config$1.setFallbackMode(!0),authType&&logFlashFallback(config$1,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||={});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$7=0;for(;i$7<length;)if(comprehensiveHistory[i$7].role===`user`)curatedHistory.push(comprehensiveHistory[i$7]),i$7++;else{let modelOutput=[],isValid=!0;for(;i$7<length&&comprehensiveHistory[i$7].role===`model`;)modelOutput.push(comprehensiveHistory[i$7]),isValid&&!isValidContent(comprehensiveHistory[i$7])&&(isValid=!1),i$7++;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$1,generationConfig={},history=[]){this.config=config$1,this.generationConfig=generationConfig,this.history=history,validateHistory(history),this.chatRecordingService=new ChatRecordingService(config$1),this.chatRecordingService.initialize()}setSystemInstruction(sysInstr){this.generationConfig.systemInstruction=sysInstr}async sendMessageStream(params,prompt_id){await this.sendPromise;let streamDoneResolver,streamDonePromise=new Promise(resolve$10=>{streamDoneResolver=resolve$10});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$10=await self$1.makeApiCallAndProcessStream(requestContents,params,prompt_id,userContent);for await(let chunk$1 of stream$10)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.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=`
1750
+ 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{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$7,j$2,tmp;for(i$7=0;i$7<str2Len;++i$7)prevRow[i$7]=i$7,str2Char[i$7]=str2.charCodeAt(i$7);prevRow[str2Len]=str2Len;var strCmp;if(useCollator)for(i$7=0;i$7<str1Len;++i$7){for(nextCol=i$7+1,j$2=0;j$2<str2Len;++j$2)curCol=nextCol,strCmp=collator.compare(str1.charAt(i$7),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$7=0;i$7<str1Len;++i$7){for(nextCol=i$7+1,j$2=0;j$2<str2Len;++j$2)curCol=nextCol,strCmp=str1.charCodeAt(i$7)===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$2(require_levenshtein(),1),ChatRecordingService=class{conversationFile=null;cachedLastConvData=null;sessionId;projectHash;queuedThoughts=[];queuedTokens=null;config;constructor(config$1){this.config=config$1,this.sessionId=config$1.getSessionId(),this.projectHash=getProjectHash(config$1.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,null),conversation.messages.push(newMsg)}else{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();
1751
+ /**
1752
+ * @license
1753
+ * Copyright 2025 Google LLC
1754
+ * SPDX-License-Identifier: Apache-2.0
1755
+ */
1756
+ var TelemetryTarget;(function(TelemetryTarget$1){TelemetryTarget$1.GCP=`gcp`,TelemetryTarget$1.LOCAL=`local`})(TelemetryTarget||={});const DEFAULT_TELEMETRY_TARGET=TelemetryTarget.LOCAL,DEFAULT_OTLP_ENDPOINT=`http://localhost:4317`;async function handleFallback(config$1,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$1.fallbackModelHandler;if(typeof fallbackModelHandler!=`function`)return null;try{let intent=await fallbackModelHandler(failedModel,fallbackModel,error$22);switch(intent){case`retry`:return activateFallbackMode(config$1,authType),!0;case`stop`:return activateFallbackMode(config$1,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$1,authType){config$1.isInFallbackMode()||(config$1.setFallbackMode(!0),authType&&logFlashFallback(config$1,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||={});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$7=0;for(;i$7<length;)if(comprehensiveHistory[i$7].role===`user`)curatedHistory.push(comprehensiveHistory[i$7]),i$7++;else{let modelOutput=[],isValid=!0;for(;i$7<length&&comprehensiveHistory[i$7].role===`model`;)modelOutput.push(comprehensiveHistory[i$7]),isValid&&!isValidContent(comprehensiveHistory[i$7])&&(isValid=!1),i$7++;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$1,generationConfig={},history=[]){this.config=config$1,this.generationConfig=generationConfig,this.history=history,validateHistory(history),this.chatRecordingService=new ChatRecordingService(config$1),this.chatRecordingService.initialize()}setSystemInstruction(sysInstr){this.generationConfig.systemInstruction=sysInstr}async sendMessageStream(params,prompt_id){await this.sendPromise;let streamDoneResolver,streamDonePromise=new Promise(resolve$10=>{streamDoneResolver=resolve$10});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$10=await self$1.makeApiCallAndProcessStream(requestContents,params,prompt_id,userContent);for await(let chunk$1 of stream$10)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.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=`
1751
1757
 
1752
1758
  This error was probably caused by cyclic schema references in one of the following tools, try disabling them with excludeTools:
1753
1759
 
@@ -2048,7 +2054,7 @@ ${J}${i$7.trimStart()}`),r$3=3+stripVTControlCharacters(i$7.trimStart()).length)
2048
2054
  `);let h$4=0,w$4=0;j$2(),c$3=setInterval(()=>{if(i$7&&l$2===$$13)return;B$2(),$$13=l$2;let I$4=import_picocolors.default.magenta(n$2[h$4]);if(i$7)process.stdout.write(`${I$4} ${l$2}...`);else if(t$1===`timer`)process.stdout.write(`${I$4} ${l$2} ${O$3(g)}`);else{let z$6=`.`.repeat(Math.floor(w$4)).slice(0,3);process.stdout.write(`${I$4} ${l$2}${z$6}`)}h$4=h$4+1<n$2.length?h$4+1:0,w$4=w$4<n$2.length?w$4+.125:0},r$3)},N$2=(m$3=``,h$4=0)=>{a$4=!1,clearInterval(c$3),B$2();let w$4=h$4===0?import_picocolors.default.green(C):h$4===1?import_picocolors.default.red(L):import_picocolors.default.red(W);l$2=R$3(m$3??l$2),t$1===`timer`?process.stdout.write(`${w$4} ${l$2} ${O$3(g)}
2049
2055
  `):process.stdout.write(`${w$4} ${l$2}
2050
2056
  `),E$2(),s$3()};return{start:H$2,stop:N$2,message:(m$3=``)=>{l$2=R$3(m$3??l$2)}}},Ce=async(t$1,n$2)=>{let r$3={},i$7=Object.keys(t$1);for(let s$3 of i$7){let c$3=t$1[s$3],a$4=await c$3({results:r$3})?.catch(l$2=>{throw l$2});if(typeof n$2?.onCancel==`function`&&pD(a$4)){r$3[s$3]=`canceled`,n$2.onCancel({results:r$3});continue}r$3[s$3]=a$4}return r$3},Te=async t$1=>{for(let n$2 of t$1){if(n$2.enabled===!1)continue;let r$3=Y();r$3.start(n$2.title);let i$7=await n$2.task(r$3.message);r$3.stop(i$7||n$2.title)}};function getAuthToken(){let path$38=getAuthTokenConfigPath();if(existsSync$1(path$38)){let data$2=readFileSync$1(path$38,`utf8`);return JSON.parse(data$2).token}}function setAuthToken(token$1){let path$38=getAuthTokenConfigPath();existsSync$1(dirname$1(path$38))||mkdirSync(dirname$1(path$38),{recursive:!0}),writeFileSync$1(path$38,JSON.stringify({_:`This is your Blink credentials file. DO NOT SHARE THIS FILE WITH ANYONE!`,token:token$1}))}function getAuthTokenConfigPath(){let dirs=mod_esm_default(`blink`).dataDirs();if(dirs.length===0)throw Error(`No suitable data directory for Blink storage found!`);return join$1(dirs[0],`auth.json`)}async function loginIfNeeded(){let client=new Client,token$1=getAuthToken();if(token$1){client.authToken=token$1;try{await client.users.me()}catch{token$1=await login$1()}}else token$1=await login$1();return token$1}async function login$1(){let client=new Client,authUrl,tokenPromise,handleAuthCallback=(url$3,id)=>{authUrl=url$3,console.log(`Visit`,source_default.bold(url$3),`to authenticate with Blink.`),console.log(source_default.dim(`Press [ENTER] to open the browser`))};tokenPromise=client.auth.token(handleAuthCallback),await new Promise(resolve$10=>{process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.on(`data`,key=>{(key.toString()===`\r`||key.toString()===`
2051
- `)&&(process.stdin.setRawMode(!1),process.stdin.pause(),resolve$10()),key.toString()===``&&(process.stdin.setRawMode(!1),process.stdin.pause(),process.exit(1))})}),await open_default(authUrl);let s$3=Y();s$3.start(`Waiting for authentication...`);try{let receivedToken=await tokenPromise;client.authToken=receivedToken;let user=await client.users.me();return s$3.stop(`Congratulations, you are now signed in as ${user.email}!`),setAuthToken(receivedToken),receivedToken}catch(error$22){s$3.stop(`Authentication failed: `+error$22),process.exit(1)}}function startDev({entrypoint}){return start((0,import_jsx_runtime.jsx)(Root,{entrypoint}))}const Root=({entrypoint})=>{let size=useTerminalSize(),{errors:compileErrors,status:bundlerStatus,lastBuildDuration,bundle}=useBundler(entrypoint),dotenv=useDotenv(dirname$1(entrypoint)),env$8=(0,import_react.useMemo)(()=>{let blinkToken=getAuthToken();return blinkToken?{...dotenv,BLINK_TOKEN:blinkToken}:dotenv},[dotenv]),server=(0,import_react.useMemo)(()=>createServer$1({port:0,dataDirectory:join$1(dirname$1(entrypoint),`.blink`,`data`),sendMessages:async(request$3,signal)=>{if(!currentAgentRef.current)throw Error(`No agent`);return await currentAgentRef.current.sendMessages({messages:request$3.messages.filter(m$3=>m$3.metadata?.ephemeral!==!0)},{signal})},serializeChat:chat$3=>({...chat$3,messages:chat$3.messages.filter(m$3=>m$3.metadata?.ephemeral!==!0)}),shouldLoop:({messages:messages$1})=>{let lastMessage=messages$1.at(-1);if(!lastMessage||lastMessage.role!==`assistant`)return!1;let lastStepStartIndex=lastMessage.parts.reduce((lastIndex,part,index)=>part.type===`step-start`?index:lastIndex,-1),lastStepToolInvocations=lastMessage.parts.slice(lastStepStartIndex+1).filter(isToolOrDynamicToolUIPart);return lastStepToolInvocations.length>0&&lastStepToolInvocations.every(part=>part.state.startsWith(`output-`))}}),[]),{agent,logs:logs$1,error:agentError,supportsWebhooks}=useAgent({bundle,env:env$8,apiServerUrl:server.url}),currentAgentRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{agent?currentAgentRef.current=agent:server.stopChat(chat$2.id)},[agent]);let devhookID=(0,import_react.useMemo)(()=>{let storagePath=join$1(dirname$1(entrypoint),`.blink`,`devhook.txt`);if(mkdirSync(dirname$1(storagePath),{recursive:!0}),existsSync$1(storagePath))return readFileSync$1(storagePath,`utf-8`);let id=crypto.randomUUID();return writeFileSync$1(storagePath,id),id},[]),devhook=useDevhook({id:devhookID,disabled:!supportsWebhooks,onRequest:async request$3=>{if(!currentAgentRef.current)throw Error(`No agent`);let response=await currentAgentRef.current.sendWebhook(request$3);return server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`webhook`,ephemeral:!0},parts:[{type:`text`,text:`method=${request$3.method} status=${response.status}`}]}),response}}),[chatID,setChatID]=(0,import_react.useState)(`default`),currentChatIDRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{currentChatIDRef.current=chatID},[chatID]);let chat$2=useServerChat(server,chatID),[chatIDs,setChatIDs]=(0,import_react.useState)(()=>server.listChats()),currentChatIDsRef=(0,import_react.useRef)(chatIDs);(0,import_react.useEffect)(()=>{currentChatIDsRef.current=chatIDs},[chatIDs]),(0,import_react.useEffect)(()=>{let disposable=server.onChatChanged(chat$3=>{!currentChatIDsRef.current.includes(chat$3.id)&&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(compileErrors.length>0||agentError||chat$2.error){let errors$1=[];for(let error$22 of compileErrors)errors$1.push({type:`text`,text:`${error$22.text} (${error$22.location?.file})`});agentError&&errors$1.push({type:`text`,text:agentError.message}),chat$2.error&&errors$1.push({type:`text`,text:`Chat error: ${chat$2.error.message}, ${chat$2.error.stack}`}),server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`error`,ephemeral:!0},parts:errors$1});return}if(bundlerStatus===`building`||!agent){server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:`Compiling...`}]});return}if(bundlerStatus===`success`&&agent){server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`success`,ephemeral:!0},parts:[{type:`text`,text:`Compiled in 100ms`}]});return}},[compileErrors,chat$2.error,agentError,bundlerStatus,agent]);let lastReportedKeys=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{let keys=Object.keys(env$8);if(keys.length===lastReportedKeys.current||lastReportedKeys.current===void 0)return;lastReportedKeys.current=keys.length;let keysText=keys.map(key=>source_default.dim(key)).join(`, `);keysText.length===0&&(keysText=source_default.dim(`(none)`));let text$1=`Loaded .env.local: `+keysText;server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:text$1}]})},[env$8]),(0,import_react.useEffect)(()=>{!supportsWebhooks||devhook.status!==`connected`||server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:`Send webhooks from anywhere: https://blink.so/api/devhook/${devhook.id}`}]})},[supportsWebhooks,devhook.status]);let lastLogsLength=(0,import_react.useRef)(0);(0,import_react.useEffect)(()=>{if(logs$1.length===lastLogsLength.current)return;let currentLength=lastLogsLength.current;for(let log$5 of logs$1.slice(currentLength))server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`runtime-log`,level:log$5.level,ephemeral:!0},parts:[{type:`text`,text:log$5.message}]});lastLogsLength.current=logs$1.length},[logs$1]);let keymaps=(0,import_react.useMemo)(()=>({"⏎":`send`,"Ctrl+R":`reset chat`,"Ctrl+C":`quit`,"[Escape]":`stop streaming`}),[]),keybindSuggestion=(0,import_react.useMemo)(()=>{if(exitArmed)return`Ctrl+C again to quit`;if(chat$2.status===`streaming`)return`Press [Escape] to stop the agent!`},[exitArmed,chat$2.status]),newChatNames=(0,import_react.useMemo)(()=>{let names$1=[];for(;names$1.length<3;){let name$5=(0,import_dist.uniqueNamesGenerator)({dictionaries:[import_dist.adjectives,import_dist.animals],style:`lowerCase`});chatIDs.includes(name$5)||names$1.push(name$5)}return names$1},[chatID,chatIDs]);return(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Keybinds,{resetChat:()=>{server.resetChat(chat$2.id)},stopStreaming:()=>{server.stopChat(chat$2.id)}}),(0,import_jsx_runtime.jsxs)(Box_default,{children:[(0,import_jsx_runtime.jsx)(Text,{bold:!0,children:`blink■`}),(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:` agent development mode`})]}),(0,import_jsx_runtime.jsxs)(Box_default,{marginTop:1,flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Edit `,entrypoint,` to hot-reload your agent.`]}),(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Run `,(0,import_jsx_runtime.jsx)(Text,{color:`blue`,children:`blink deploy`}),` to use your agent in the cloud.`]})]}),chat$2.error?(0,import_jsx_runtime.jsx)(Box_default,{marginTop:1,children:(0,import_jsx_runtime.jsx)(Text,{color:`red`,children:chat$2.error.message})}):null,(0,import_jsx_runtime.jsx)(Messages,{messages:[...chat$2.messages],streamingMessage:chat$2.streamingMessage,maxWidth:size.columns-2,status:chat$2.status}),(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,marginTop:1,children:(0,import_jsx_runtime.jsx)(text_input_default,{slashCommands:[{name:`reset`,altNames:[`clear`],description:`Reset the chat`,action:()=>{server.resetChat(chat$2.id)}},{name:`switch`,description:`Switch to a different chat`,action:args=>{setChatID(args)},completion:async partialArg=>{let chats=server.listChats();return chats.map(chat$3=>chat$3)}},{name:`new`,description:`Create a new chat`,action:args=>{setChatID(args)},completion:async partialArg=>newChatNames}],onSubmit:value=>(server.runtime.chat.sendMessages(chat$2.id,{messages:[{role:`user`,parts:[{type:`text`,text:value}]}],behavior:`interrupt`}),!0)})}),(0,import_jsx_runtime.jsx)(Box_default,{children:keybindSuggestion?(0,import_jsx_runtime.jsx)(Text,{color:`yellow`,children:` `+keybindSuggestion}):(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Box_default,{marginLeft:2,children:(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`chat: `,(0,import_jsx_runtime.jsx)(Text,{children:chat$2.id})]})}),(0,import_jsx_runtime.jsx)(Spacer,{}),(0,import_jsx_runtime.jsx)(Box_default,{gap:3,marginRight:2,children:Object.entries(keymaps).map(([key,value])=>(0,import_jsx_runtime.jsx)(Text,{children:source_default.gray.dim(key+` `+value)},key))})]})})]})},Keybinds=({resetChat,stopStreaming})=>(use_input_default((input,key)=>{key.ctrl&&input===`r`&&resetChat(),key.escape&&stopStreaming()}),null),Messages=({messages:messages$1,maxWidth,streamingMessage,status})=>(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[messages$1.map((message,index)=>(0,import_jsx_runtime.jsx)(Message,{message,previousMessage:index>0?messages$1.at(index-1):void 0,nextMessage:index<messages$1.length-1?messages$1.at(index+1):void 0,maxWidth},message.id)),streamingMessage?(0,import_jsx_runtime.jsx)(Message,{message:streamingMessage,nextMessage:void 0,previousMessage:messages$1.length>0?messages$1.at(messages$1.length-1):void 0,streaming:!0,maxWidth},streamingMessage.id):null,status===`streaming`&&!streamingMessage?(0,import_jsx_runtime.jsx)(AssistantWaitingPlaceholder,{maxWidth}):null]}),MessageComponent=({message,previousMessage,maxWidth,streaming})=>{let prefix,contentColor,marginTop=1;switch(message.role){case`system`:prefix=(0,import_jsx_runtime.jsx)(Text,{children:`t `}),contentColor=`gray`;break;case`user`:prefix=(0,import_jsx_runtime.jsx)(Text,{color:`magenta`,bold:!0,children:`▎`}),contentColor=`gray`;break;case`assistant`:prefix=(0,import_jsx_runtime.jsx)(Text,{color:`white`,children:`> `}),contentColor=`white`;break}if(message.metadata?.type===`build-log`){let color=`gray`;switch(message.metadata.level){case`success`:color=`green`;break;case`info`:color=`gray`;break;case`error`:color=`red`;break}prefix=(0,import_jsx_runtime.jsx)(Text,{color,children:`⚙ `}),contentColor=`gray`,previousMessage?.metadata?.type===`build-log`&&(marginTop=0)}message.metadata?.type===`webhook`&&(prefix=(0,import_jsx_runtime.jsx)(Text,{color:`blue`,children:`↩ `}),contentColor=`gray`,previousMessage?.metadata?.type===`webhook`&&(marginTop=0));let content=(0,import_jsx_runtime.jsx)(Box_default,{gap:1,flexDirection:`column`,width:maxWidth,children:message.parts.map((part,index)=>{if(part.type===`text`)return(0,import_jsx_runtime.jsx)(markdown_default,{id:message.id,maxWidth,children:part.text},index);if(part.type===`reasoning`)return(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Reasoning: `,part.text]},index);if(isToolUIPart(part))return(0,import_jsx_runtime.jsx)(ToolCall,{part,maxWidth,streaming},index)}).filter(Boolean)});return(0,import_jsx_runtime.jsxs)(Box_default,{marginTop,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsx)(Text,{color:contentColor,children:prefix})}),content]})},Message=import_react.memo(MessageComponent,(prev,next)=>prev.maxWidth===next.maxWidth?!!(prev.nextMessage&&next.nextMessage&&prev.nextMessage.id===next.nextMessage.id):!1),AssistantWaitingPlaceholder=({maxWidth})=>(0,import_jsx_runtime.jsxs)(Box_default,{marginTop:1,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsx)(Text,{color:`white`,children:null})}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth,children:(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[(0,import_jsx_runtime.jsx)(build_default,{}),` Waiting for response...`]})})]}),ToolCall=({part,maxWidth,streaming})=>{let name$5=getToolOrDynamicToolName(part),input=(0,import_react.useMemo)(()=>{let labels={};return typeof part.input!=`object`||part.input===null||Object.entries(part.input).forEach(([key,value])=>{labels[key]=JSON.stringify(value)}),labels},[part]),output=(0,import_react.useMemo)(()=>{if(!part.output)return;if(typeof part.output==`string`)return part.output;let labels={};return Array.isArray(part.output)?part.output.forEach((item,index)=>{labels[`${index}`]=JSON.stringify(item)}):typeof part.output==`object`&&Object.entries(part.output).forEach(([key,value])=>{labels[key]=JSON.stringify(value)}),labels},[part]),state=(0,import_react.useMemo)(()=>{switch(part.state){case`input-available`:case`input-streaming`:return streaming?`streaming`:`error`;case`output-available`:return`done`;case`output-error`:return`error`}},[part,streaming]),error$22=(0,import_react.useMemo)(()=>{if(part.state===`output-error`)return part.errorText},[part]);return(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Box_default,{gap:1,children:[(0,import_jsx_runtime.jsx)(Text,{color:state===`error`?`red`:`gray`,bold:!0,children:state===`done`||state===`error`?`⚒`:(0,import_jsx_runtime.jsx)(build_default,{type:`dots`})}),(0,import_jsx_runtime.jsx)(Text,{children:name$5})]}),(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,flexDirection:`column`,overflowX:`hidden`,width:maxWidth?maxWidth-4:void 0,gap:0,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Input:`}),Object.entries(input).map(([key,value])=>(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:key}),(0,import_jsx_runtime.jsx)(Text,{color:`blackBright`,children:`=`}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth?maxWidth-6-1-2-key.length:void 0,children:(0,import_jsx_runtime.jsx)(Text,{wrap:`truncate-middle`,children:value})})]},key)),output&&(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Output:`}),typeof output==`string`?(0,import_jsx_runtime.jsx)(Box_default,{marginLeft:2,children:(0,import_jsx_runtime.jsx)(Text,{children:output})}):(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,children:Object.entries(output).map(([key,value])=>(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:key}),(0,import_jsx_runtime.jsx)(Text,{color:`blackBright`,children:`=`}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth?maxWidth-6-1-key.length:void 0,children:(0,import_jsx_runtime.jsx)(Text,{wrap:`truncate-middle`,children:value})})]},key))})]}),error$22&&(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Error:`}),(0,import_jsx_runtime.jsx)(Text,{color:`red`,children:error$22})]})]})]})};async function dev(directory){directory||=process.cwd();let entrypoint=await resolveEntrypoint(directory),exitWithDump=error$22=>{writeFileSync$1(`error.dump`,inspect$1(error$22,{depth:null})),process.exit(1)};process.addListener(`uncaughtException`,error$22=>{exitWithDump(error$22)}),process.addListener(`unhandledRejection`,error$22=>{exitWithDump(error$22)}),await startDev({entrypoint}),process.exit(0)}async function init(directory){directory||=process.cwd(),Ie(`Initializing a new Blink Agent`),(await readdir(directory)).length>0&&(xe("You must be in an empty directory to run `blink init`."),process.exit(1));let name$5=basename$1(directory).replace(/[^a-zA-Z0-9]/g,`-`),packageManager;if(process.env.npm_config_user_agent?.includes(`bun/`)?packageManager=`bun`:process.env.npm_config_user_agent?.includes(`pnpm/`)?packageManager=`pnpm`:process.env.npm_config_user_agent?.includes(`yarn/`)?packageManager=`yarn`:process.env.npm_config_user_agent?.includes(`npm/`)&&(packageManager=`npm`),!packageManager){let pm$1=await ve({options:[{label:`Bun`,value:`bun`},{label:`NPM`,value:`npm`},{label:`PNPM`,value:`pnpm`},{label:`Yarn`,value:`yarn`}],message:`What package manager do you want to use?`});pD(pm$1)&&process.exit(0),packageManager=pm$1}M.info(`Using ${packageManager} as the package manager.`);let files={"package.json":JSON.stringify({name:name$5,main:`agent.ts`,type:`module`,private:!0}),"agent.ts":`import { convertToModelMessages, streamText, tool } from "ai";
2057
+ `)&&(process.stdin.setRawMode(!1),process.stdin.pause(),resolve$10()),key.toString()===``&&(process.stdin.setRawMode(!1),process.stdin.pause(),process.exit(1))})}),await open_default(authUrl);let s$3=Y();s$3.start(`Waiting for authentication...`);try{let receivedToken=await tokenPromise;client.authToken=receivedToken;let user=await client.users.me();return s$3.stop(`Congratulations, you are now signed in as ${user.email}!`),setAuthToken(receivedToken),receivedToken}catch(error$22){s$3.stop(`Authentication failed: `+error$22),process.exit(1)}}function startDev({entrypoint}){return start((0,import_jsx_runtime.jsx)(Root,{entrypoint}))}const Root=({entrypoint})=>{let size=useTerminalSize(),{errors:compileErrors,status:bundlerStatus,lastBuildDuration,bundle}=useBundler(entrypoint),dotenv=useDotenv(dirname$1(entrypoint)),env$8=(0,import_react.useMemo)(()=>{let blinkToken=getAuthToken();return blinkToken?{...dotenv,BLINK_TOKEN:blinkToken}:dotenv},[dotenv]),server=(0,import_react.useMemo)(()=>createServer$1({port:0,dataDirectory:join$1(dirname$1(entrypoint),`.blink`,`data`),sendMessages:async(request$3,signal)=>{if(!currentAgentRef.current)throw Error(`No agent`);if(!currentChatIDRef.current)throw Error(`No chat`);return await currentAgentRef.current.sendMessages({messages:request$3.messages.filter(m$3=>m$3.metadata?.ephemeral!==!0),chat:{id:currentChatIDRef.current}},{signal})},serializeChat:chat$3=>({...chat$3,messages:chat$3.messages.filter(m$3=>m$3.metadata?.ephemeral!==!0)}),shouldLoop:({messages:messages$1})=>{let lastMessage=messages$1.at(-1);if(!lastMessage||lastMessage.role!==`assistant`)return!1;let lastStepStartIndex=lastMessage.parts.reduce((lastIndex,part,index)=>part.type===`step-start`?index:lastIndex,-1),lastStepToolInvocations=lastMessage.parts.slice(lastStepStartIndex+1).filter(isToolOrDynamicToolUIPart);return lastStepToolInvocations.length>0&&lastStepToolInvocations.every(part=>part.state.startsWith(`output-`))}}),[]),{agent,logs:logs$1,error:agentError,supportsWebhooks}=useAgent({bundle,env:env$8,apiServerUrl:server.url}),currentAgentRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{agent?currentAgentRef.current=agent:server.stopChat(chat$2.id)},[agent]);let devhookID=(0,import_react.useMemo)(()=>{let storagePath=join$1(dirname$1(entrypoint),`.blink`,`devhook.txt`);if(mkdirSync(dirname$1(storagePath),{recursive:!0}),existsSync$1(storagePath))return readFileSync$1(storagePath,`utf-8`);let id=crypto.randomUUID();return writeFileSync$1(storagePath,id),id},[]),devhook=useDevhook({id:devhookID,disabled:!supportsWebhooks,onRequest:async request$3=>{if(!currentAgentRef.current)throw Error(`No agent`);let response=await currentAgentRef.current.sendWebhook(request$3);return server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`webhook`,ephemeral:!0},parts:[{type:`text`,text:`method=${request$3.method} status=${response.status}`}]}),response}}),[chatID,setChatID]=(0,import_react.useState)(`default`),currentChatIDRef=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{currentChatIDRef.current=chatID},[chatID]);let chat$2=useServerChat(server,chatID),[chatIDs,setChatIDs]=(0,import_react.useState)(()=>server.listChats()),currentChatIDsRef=(0,import_react.useRef)(chatIDs);(0,import_react.useEffect)(()=>{currentChatIDsRef.current=chatIDs},[chatIDs]),(0,import_react.useEffect)(()=>{let disposable=server.onChatChanged(chat$3=>{!currentChatIDsRef.current.includes(chat$3.id)&&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(compileErrors.length>0||agentError||chat$2.error){let errors$1=[];for(let error$22 of compileErrors)errors$1.push({type:`text`,text:`${error$22.text} (${error$22.location?.file})`});agentError&&errors$1.push({type:`text`,text:agentError.message}),chat$2.error&&errors$1.push({type:`text`,text:`Chat error: ${chat$2.error.message}, ${chat$2.error.stack}`}),server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`error`,ephemeral:!0},parts:errors$1});return}if(bundlerStatus===`building`||!agent){server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:`Compiling...`}]});return}if(bundlerStatus===`success`&&agent){server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`success`,ephemeral:!0},parts:[{type:`text`,text:`Compiled in 100ms`}]});return}},[compileErrors,chat$2.error,agentError,bundlerStatus,agent]);let lastReportedKeys=(0,import_react.useRef)(void 0);(0,import_react.useEffect)(()=>{let keys=Object.keys(env$8);if(keys.length===lastReportedKeys.current||lastReportedKeys.current===void 0)return;lastReportedKeys.current=keys.length;let keysText=keys.map(key=>source_default.dim(key)).join(`, `);keysText.length===0&&(keysText=source_default.dim(`(none)`));let text$1=`Loaded .env.local: `+keysText;server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:text$1}]})},[env$8]),(0,import_react.useEffect)(()=>{!supportsWebhooks||devhook.status!==`connected`||server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`build-log`,level:`info`,ephemeral:!0},parts:[{type:`text`,text:`Send webhooks from anywhere: https://blink.so/api/devhook/${devhook.id}`}]})},[supportsWebhooks,devhook.status]);let lastLogsLength=(0,import_react.useRef)(0);(0,import_react.useEffect)(()=>{if(logs$1.length===lastLogsLength.current)return;let currentLength=lastLogsLength.current;for(let log$5 of logs$1.slice(currentLength))server.upsertChatMessage(chat$2.id,{role:`assistant`,metadata:{type:`runtime-log`,level:log$5.level,ephemeral:!0},parts:[{type:`text`,text:log$5.message}]});lastLogsLength.current=logs$1.length},[logs$1]);let keymaps=(0,import_react.useMemo)(()=>({"⏎":`send`,"Ctrl+R":`reset chat`,"Ctrl+C":`quit`,"[Escape]":`stop streaming`}),[]),keybindSuggestion=(0,import_react.useMemo)(()=>{if(exitArmed)return`Ctrl+C again to quit`;if(chat$2.status===`streaming`)return`Press [Escape] to stop the agent!`},[exitArmed,chat$2.status]),newChatNames=(0,import_react.useMemo)(()=>{let names$1=[];for(;names$1.length<3;){let name$5=(0,import_dist.uniqueNamesGenerator)({dictionaries:[import_dist.adjectives,import_dist.animals],style:`lowerCase`});chatIDs.includes(name$5)||names$1.push(name$5)}return names$1},[chatID,chatIDs]);return(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Keybinds,{resetChat:()=>{server.resetChat(chat$2.id)},stopStreaming:()=>{server.stopChat(chat$2.id)}}),(0,import_jsx_runtime.jsxs)(Box_default,{children:[(0,import_jsx_runtime.jsx)(Text,{bold:!0,children:`blink■`}),(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:` agent development mode`})]}),(0,import_jsx_runtime.jsxs)(Box_default,{marginTop:1,flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Edit `,entrypoint,` to hot-reload your agent.`]}),(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Run `,(0,import_jsx_runtime.jsx)(Text,{color:`blue`,children:`blink deploy`}),` to use your agent in the cloud.`]})]}),chat$2.error?(0,import_jsx_runtime.jsx)(Box_default,{marginTop:1,children:(0,import_jsx_runtime.jsx)(Text,{color:`red`,children:chat$2.error.message})}):null,(0,import_jsx_runtime.jsx)(Messages,{messages:[...chat$2.messages],streamingMessage:chat$2.streamingMessage,maxWidth:size.columns-2,status:chat$2.status}),(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,marginTop:1,children:(0,import_jsx_runtime.jsx)(text_input_default,{slashCommands:[{name:`reset`,altNames:[`clear`],description:`Reset the chat`,action:()=>{server.resetChat(chat$2.id)}},{name:`switch`,description:`Switch to a different chat`,action:args=>{setChatID(args)},completion:async partialArg=>{let chats=server.listChats();return chats.map(chat$3=>chat$3)}},{name:`new`,description:`Create a new chat`,action:args=>{setChatID(args)},completion:async partialArg=>newChatNames}],onSubmit:value=>(server.runtime.chat.sendMessages(chat$2.id,{messages:[{role:`user`,parts:[{type:`text`,text:value}]}],behavior:`interrupt`}),!0)})}),(0,import_jsx_runtime.jsx)(Box_default,{children:keybindSuggestion?(0,import_jsx_runtime.jsx)(Text,{color:`yellow`,children:` `+keybindSuggestion}):(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Box_default,{marginLeft:2,children:(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`chat: `,(0,import_jsx_runtime.jsx)(Text,{children:chat$2.id})]})}),(0,import_jsx_runtime.jsx)(Spacer,{}),(0,import_jsx_runtime.jsx)(Box_default,{gap:3,marginRight:2,children:Object.entries(keymaps).map(([key,value])=>(0,import_jsx_runtime.jsx)(Text,{children:source_default.gray.dim(key+` `+value)},key))})]})})]})},Keybinds=({resetChat,stopStreaming})=>(use_input_default((input,key)=>{key.ctrl&&input===`r`&&resetChat(),key.escape&&stopStreaming()}),null),Messages=({messages:messages$1,maxWidth,streamingMessage,status})=>(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[messages$1.map((message,index)=>(0,import_jsx_runtime.jsx)(Message,{message,previousMessage:index>0?messages$1.at(index-1):void 0,nextMessage:index<messages$1.length-1?messages$1.at(index+1):void 0,maxWidth},message.id)),streamingMessage?(0,import_jsx_runtime.jsx)(Message,{message:streamingMessage,nextMessage:void 0,previousMessage:messages$1.length>0?messages$1.at(messages$1.length-1):void 0,streaming:!0,maxWidth},streamingMessage.id):null,status===`streaming`&&!streamingMessage?(0,import_jsx_runtime.jsx)(AssistantWaitingPlaceholder,{maxWidth}):null]}),MessageComponent=({message,previousMessage,maxWidth,streaming})=>{let prefix,contentColor,marginTop=1;switch(message.role){case`system`:prefix=(0,import_jsx_runtime.jsx)(Text,{children:`t `}),contentColor=`gray`;break;case`user`:prefix=(0,import_jsx_runtime.jsx)(Text,{color:`magenta`,bold:!0,children:`▎`}),contentColor=`gray`;break;case`assistant`:prefix=(0,import_jsx_runtime.jsx)(Text,{color:`white`,children:`> `}),contentColor=`white`;break}if(message.metadata?.type===`build-log`){let color=`gray`;switch(message.metadata.level){case`success`:color=`green`;break;case`info`:color=`gray`;break;case`error`:color=`red`;break}prefix=(0,import_jsx_runtime.jsx)(Text,{color,children:`⚙ `}),contentColor=`gray`,previousMessage?.metadata?.type===`build-log`&&(marginTop=0)}message.metadata?.type===`webhook`&&(prefix=(0,import_jsx_runtime.jsx)(Text,{color:`blue`,children:`↩ `}),contentColor=`gray`,previousMessage?.metadata?.type===`webhook`&&(marginTop=0));let content=(0,import_jsx_runtime.jsx)(Box_default,{gap:1,flexDirection:`column`,width:maxWidth,children:message.parts.map((part,index)=>{if(part.type===`text`)return(0,import_jsx_runtime.jsx)(markdown_default,{id:message.id,maxWidth,children:part.text},index);if(part.type===`reasoning`)return(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[`Reasoning: `,part.text]},index);if(isToolOrDynamicToolUIPart(part))return(0,import_jsx_runtime.jsx)(ToolCall,{part,maxWidth,streaming},index)}).filter(Boolean)});return(0,import_jsx_runtime.jsxs)(Box_default,{marginTop,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsx)(Text,{color:contentColor,children:prefix})}),content]})},Message=import_react.memo(MessageComponent,(prev,next)=>prev.maxWidth===next.maxWidth?!!(prev.nextMessage&&next.nextMessage&&prev.nextMessage.id===next.nextMessage.id):!1),AssistantWaitingPlaceholder=({maxWidth})=>(0,import_jsx_runtime.jsxs)(Box_default,{marginTop:1,flexDirection:`row`,children:[(0,import_jsx_runtime.jsx)(Box_default,{children:(0,import_jsx_runtime.jsx)(Text,{color:`white`,children:null})}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth,children:(0,import_jsx_runtime.jsxs)(Text,{color:`gray`,children:[(0,import_jsx_runtime.jsx)(build_default,{}),` Waiting for response...`]})})]}),ToolCall=({part,maxWidth,streaming})=>{let name$5=getToolOrDynamicToolName(part),input=(0,import_react.useMemo)(()=>{let labels={};return typeof part.input!=`object`||part.input===null||Object.entries(part.input).forEach(([key,value])=>{labels[key]=JSON.stringify(value)}),labels},[part]),output=(0,import_react.useMemo)(()=>{if(!part.output)return;if(typeof part.output==`string`)return part.output;let labels={};return Array.isArray(part.output)?part.output.forEach((item,index)=>{labels[`${index}`]=JSON.stringify(item)}):typeof part.output==`object`&&Object.entries(part.output).forEach(([key,value])=>{labels[key]=JSON.stringify(value)}),labels},[part]),state=(0,import_react.useMemo)(()=>{switch(part.state){case`input-available`:case`input-streaming`:return streaming?`streaming`:`error`;case`output-available`:return`done`;case`output-error`:return`error`}},[part,streaming]),error$22=(0,import_react.useMemo)(()=>{if(part.state===`output-error`)return part.errorText},[part]);return(0,import_jsx_runtime.jsxs)(Box_default,{flexDirection:`column`,children:[(0,import_jsx_runtime.jsxs)(Box_default,{gap:1,children:[(0,import_jsx_runtime.jsx)(Text,{color:state===`error`?`red`:`gray`,bold:!0,children:state===`done`||state===`error`?`⚒`:(0,import_jsx_runtime.jsx)(build_default,{type:`dots`})}),(0,import_jsx_runtime.jsx)(Text,{children:name$5})]}),(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,flexDirection:`column`,overflowX:`hidden`,width:maxWidth?maxWidth-4:void 0,gap:0,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Input:`}),Object.entries(input).map(([key,value])=>(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:key}),(0,import_jsx_runtime.jsx)(Text,{color:`blackBright`,children:`=`}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth?maxWidth-6-1-2-key.length:void 0,children:(0,import_jsx_runtime.jsx)(Text,{wrap:`truncate-middle`,children:value})})]},key)),output&&(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Output:`}),typeof output==`string`?(0,import_jsx_runtime.jsx)(Box_default,{marginLeft:2,children:(0,import_jsx_runtime.jsx)(Text,{children:output})}):(0,import_jsx_runtime.jsx)(Box_default,{flexDirection:`column`,children:Object.entries(output).map(([key,value])=>(0,import_jsx_runtime.jsxs)(Box_default,{marginLeft:2,children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,children:key}),(0,import_jsx_runtime.jsx)(Text,{color:`blackBright`,children:`=`}),(0,import_jsx_runtime.jsx)(Box_default,{width:maxWidth?maxWidth-6-1-key.length:void 0,children:(0,import_jsx_runtime.jsx)(Text,{wrap:`truncate-middle`,children:value})})]},key))})]}),error$22&&(0,import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment,{children:[(0,import_jsx_runtime.jsx)(Text,{color:`gray`,bold:!0,children:`Error:`}),(0,import_jsx_runtime.jsx)(Text,{color:`red`,children:error$22})]})]})]})};async function dev(directory){directory||=process.cwd();let entrypoint=await resolveEntrypoint(directory),exitWithDump=error$22=>{writeFileSync$1(`error.dump`,inspect$1(error$22,{depth:null})),process.exit(1)};process.addListener(`uncaughtException`,error$22=>{exitWithDump(error$22)}),process.addListener(`unhandledRejection`,error$22=>{exitWithDump(error$22)}),await startDev({entrypoint}),process.exit(0)}async function init(directory){directory||=process.cwd(),Ie(`Initializing a new Blink Agent`),(await readdir(directory)).length>0&&(xe("You must be in an empty directory to run `blink init`."),process.exit(1));let name$5=basename$1(directory).replace(/[^a-zA-Z0-9]/g,`-`),packageManager;if(process.env.npm_config_user_agent?.includes(`bun/`)?packageManager=`bun`:process.env.npm_config_user_agent?.includes(`pnpm/`)?packageManager=`pnpm`:process.env.npm_config_user_agent?.includes(`yarn/`)?packageManager=`yarn`:process.env.npm_config_user_agent?.includes(`npm/`)&&(packageManager=`npm`),!packageManager){let pm$1=await ve({options:[{label:`Bun`,value:`bun`},{label:`NPM`,value:`npm`},{label:`PNPM`,value:`pnpm`},{label:`Yarn`,value:`yarn`}],message:`What package manager do you want to use?`});pD(pm$1)&&process.exit(0),packageManager=pm$1}M.info(`Using ${packageManager} as the package manager.`);let files={"package.json":JSON.stringify({name:name$5,main:`agent.ts`,type:`module`,private:!0}),"agent.ts":`import { convertToModelMessages, streamText, tool } from "ai";
2052
2058
  import * as blink from "blink";
2053
2059
  import { z } from "zod";
2054
2060
 
@@ -2128,5 +2134,5 @@ node_modules
2128
2134
  }`};await Promise.all(Object.entries(files).map(async([path$38,content])=>{await writeFile(join$1(directory,path$38),content)})),console.log(``);let child=spawn$1(packageManager,[`install`,`--save-dev`,`zod`,`ai`,`blink`,`esbuild`,`@types/node`],{stdio:`inherit`,cwd:directory});await new Promise((resolve$10,reject)=>{child.on(`close`,code$1=>{code$1===0&&resolve$10(void 0)}),child.on(`error`,error$22=>{reject(error$22)})}),console.log(``),M.success(`To get started, run:
2129
2135
 
2130
2136
  ${packageManager} blink dev`),Se(`Edit agent.ts to hot-reload your agent.`)}var import_main=__toESM$2(require_main(),1);async function deploy(directory,options$1){directory||=process.cwd();let token$1=await loginIfNeeded(),client=new Client({authToken:token$1}),packageJSON=await findNearestEntry(directory,`package.json`);if(!packageJSON)throw Error(`package.json not found`);let packageJSONContent=await readFile$1(packageJSON,`utf-8`),packageJSONData=JSON.parse(packageJSONContent),deployDirectory=dirname(packageJSON),deployConfigPath=join(deployDirectory,`.blink`,`config.json`),deployConfig={};if(existsSync(deployConfigPath)){let deployConfigContent=await readFile$1(deployConfigPath,`utf-8`);deployConfig=JSON.parse(deployConfigContent)}let organizationName;if(deployConfig?.organizationId)try{let org=await client.organizations.get(deployConfig.organizationId);organizationName=org.name}catch{deployConfig.organizationId=void 0}if(!deployConfig?.organizationId){let organizations=await client.organizations.list();if(organizations.length===1){let organization=organizations[0];deployConfig.organizationId=organization.id,organizationName=organization.name}else{let organization=await ve({message:`Which organization should contain this agent?`,options:organizations.map(organization$1=>({value:organization$1.id,label:organization$1.name}))});if(pD(organization))return;deployConfig.organizationId=organization,organizationName=organizations.find(org=>org.id===organization).name}}if(!deployConfig.organizationId)throw Error(`Developer error: No organization ID found.`);let agentName;if(deployConfig?.agentId)try{let agent=await client.agents.get(deployConfig.agentId);agentName=agent.name}catch{deployConfig.agentId=void 0}if(!deployConfig?.agentId)try{let agent=await client.organizations.agents.get({organization_id:deployConfig.organizationId,agent_name:packageJSONData.name});deployConfig.agentId=agent.id,agentName=agent.name}catch{let agent=await client.agents.create({name:packageJSONData.name,organization_id:deployConfig.organizationId});deployConfig.agentId=agent.id,agentName=agent.name}if(!deployConfig.agentId)throw Error(`Developer error: No agent ID found.`);await mkdir(dirname(deployConfigPath),{recursive:!0}),await writeFile(deployConfigPath,JSON.stringify({_:`This file can be source controlled. It contains no secrets.`,...deployConfig},null,2),`utf-8`);let entrypoint=await resolveEntrypoint(directory),{outfile}=await build$1(entrypoint),filesToUpload={},outputFiles=await readdir(dirname(outfile));for(let file of outputFiles)filesToUpload[join(dirname(outfile),file)]=file;let readmePath=join(directory,`README.md`);await exists(readmePath)&&(filesToUpload[readmePath]=`README.md`);let uploadedFiles=[],totalFiles=Object.keys(filesToUpload).length,uploadedCount=0,totalUploadedBytes=0;for(let[filePath,uploadPath]of Object.entries(filesToUpload)){let st=await stat$1(filePath),fileSize=st.size;writeInline(`${source_default.dim(`[${uploadedCount+1}/${totalFiles}]`)} Uploading ${uploadPath} (${formatBytes(fileSize)})...`);let fileContent=await readFile$1(filePath),uploadedFile=await client.files.upload(new File([fileContent],uploadPath));uploadedFiles.push({path:uploadPath,id:uploadedFile.id}),uploadedCount+=1,totalUploadedBytes+=fileSize}writeInline(`${source_default.dim(`[${uploadedCount}/${totalFiles}]`)} Uploaded files (${formatBytes(totalUploadedBytes)}).`),process.stdout.write(`
2131
- `);let localEnvFile=join(directory,`.env.local`),localEnvVarsSet=[];if(await exists(localEnvFile)){let localEnv=(0,import_main.parse)(await readFile$1(localEnvFile,`utf-8`));localEnvVarsSet=Object.keys(localEnv)}let cloudEnvVarsSet=[],cloudEnvVars=await client.agents.env.list({agent_id:deployConfig.agentId});cloudEnvVarsSet=cloudEnvVars.map(env$8=>env$8.key);let prodEnvFile=join(directory,`.env.production`);if(await exists(prodEnvFile)){let prodEnv=(0,import_main.parse)(await readFile$1(prodEnvFile,`utf-8`)),envEntries=Object.entries(prodEnv),totalEnvVars=envEntries.length,updatedEnvNames=[],updatedCount=0;for(let[key,value]of envEntries){let created=await client.agents.env.create({agent_id:deployConfig.agentId,key,value,target:[`production`,`preview`],secret:!0,upsert:!0});cloudEnvVarsSet.push(created.key),updatedEnvNames.push(key),updatedCount+=1,writeInline(`${source_default.dim(`[${updatedCount}/${totalEnvVars}]`)} Updating environment variables: ${updatedEnvNames.join(`, `)}`)}writeInline(`${source_default.dim(`[${updatedCount}/${totalEnvVars}]`)} Updated environment variables: ${updatedEnvNames.join(`, `)} ${source_default.dim(`(.env.production)`)}`),process.stdout.write(`
2132
- `)}let missingEnvVars=localEnvVarsSet.filter(v$2=>!cloudEnvVarsSet.includes(v$2));if(missingEnvVars.length>0){console.log(`Warning: The following environment variables are set in .env.local but not in .env.production:`);for(let v$2 of missingEnvVars)console.log(`- ${v$2}`);let confirmed=await ye({message:`Do you want to deploy anyway?`});if(confirmed===!1||pD(confirmed))return}let deployment=await client.agents.deployments.create({agent_id:deployConfig.agentId,target:`production`,entrypoint:basename(outfile),files:uploadedFiles,message:options$1?.message}),inspectUrl=`https://blink.so/${organizationName}/${agentName}/deployments/${deployment.number}`;console.log(`Deployed:`,inspectUrl);let s$3=Y();s$3.start(`Waiting for deployment to be live...`);try{let pollIntervalMs=500;for(;;){let current=await client.agents.deployments.get({agent_id:deployConfig.agentId,deployment_id:deployment.id});if(current.status===`success`){let msg=`Deployment successful.`;current.target===`production`&&(msg+=` All chats will use this deployment!`),s$3.stop(msg);break}if(current.status===`failed`){let msg=`Deployment failed.`;current.error_message&&(msg+=` ${current.error_message}`),s$3.stop(msg),console.log(`Read logs for details:`,inspectUrl);return}await new Promise(r$3=>setTimeout(r$3,500))}}catch{s$3.stop(`Failed to poll for deployment status.`),console.log(`Read logs for details:`,inspectUrl);return}}const exists=async path$38=>{try{return await stat$1(path$38),!0}catch{return!1}};function formatBytes(bytes){if(bytes===0)return`0B`;let k$2=1024,sizes=[`B`,`KB`,`MB`,`GB`,`TB`],i$7=Math.floor(Math.log(bytes)/Math.log(k$2)),value=bytes/k$2**+i$7;return`${value.toFixed(value>=100?0:value>=10?1:2)}${sizes[i$7]}`}function writeInline(message){if(process.stdout.isTTY)try{process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(message);return}catch{}console.log(message)}async function login(){await login$1()}var version=`0.1.43`;await init_wrapper(),globalThis.WebSocket||(globalThis.WebSocket=import_websocket$2.default),globalThis.crypto||(globalThis.crypto={}),globalThis.crypto.randomUUID||(globalThis.crypto.randomUUID=()=>randomUUID()),program.name(`blink`).description(`Blink is a runtime for building and deploying AI agents.`).version(version).action(()=>{program.outputHelp()}),program.command(`init [directory]`).description(`Initialize a new Blink agent.`).action(init),program.command(`dev [directory] [options]`).description(`Start a development server for your agent.`).action(dev),program.command(`deploy [directory]`).description(`Deploy your agent to the Blink Cloud.`).option(`-m, --message <message>`,`Message for this deployment`).action(deploy),program.command(`build [directory]`).description(`Build your agent for production.`).action(build),program.command(`telemetry [boolean]`).description(`Enable or disable telemetry.`),program.command(`start [directory]`).description("Starts the Blink runtime in production mode. The agent must be compiled with `blink build` first."),program.command(`serve [entrypoint]`).description(`Serve the Blink agent as an HTTP server.`).action(serve),program.command(`connect`,{hidden:!0}).description(`Connect compute to the Blink Cloud.`).action(connect),program.command(`chat`,{hidden:!0}).description(`Start a Blink chat connected to your machine.`).action(chat),program.command(`login`,{hidden:!0}).description(`Log in to the Blink Cloud.`).action(login),program.parse(process.argv);export{};
2137
+ `);let localEnvFile=join(directory,`.env.local`),localEnvVarsSet=[];if(await exists(localEnvFile)){let localEnv=(0,import_main.parse)(await readFile$1(localEnvFile,`utf-8`));localEnvVarsSet=Object.keys(localEnv)}let cloudEnvVarsSet=[],cloudEnvVars=await client.agents.env.list({agent_id:deployConfig.agentId});cloudEnvVarsSet=cloudEnvVars.map(env$8=>env$8.key);let prodEnvFile=join(directory,`.env.production`);if(await exists(prodEnvFile)){let prodEnv=(0,import_main.parse)(await readFile$1(prodEnvFile,`utf-8`)),envEntries=Object.entries(prodEnv),totalEnvVars=envEntries.length,updatedCount=0;for(let[key,value]of envEntries){let created=await client.agents.env.create({agent_id:deployConfig.agentId,key,value,target:[`production`,`preview`],secret:!0,upsert:!0});cloudEnvVarsSet.push(created.key),updatedCount+=1,writeInline(`${source_default.dim(`[${updatedCount}/${totalEnvVars}]`)} Updating environment variable: ${key} ${source_default.dim(`(.env.production)`)}`)}writeInline(`${source_default.dim(`[${updatedCount}/${totalEnvVars}]`)} Updated environment variables! ${source_default.dim(`(.env.production)`)}`),process.stdout.write(`
2138
+ `)}let missingEnvVars=localEnvVarsSet.filter(v$2=>!cloudEnvVarsSet.includes(v$2));if(missingEnvVars.length>0){console.log(`Warning: The following environment variables are set in .env.local but not in .env.production:`);for(let v$2 of missingEnvVars)console.log(`- ${v$2}`);let confirmed=await ye({message:`Do you want to deploy anyway?`});if(confirmed===!1||pD(confirmed))return}let deployment=await client.agents.deployments.create({agent_id:deployConfig.agentId,target:`production`,entrypoint:basename(outfile),files:uploadedFiles,message:options$1?.message}),inspectUrl=`https://blink.so/${organizationName}/${agentName}/deployments/${deployment.number}`;console.log(`Deployed:`,inspectUrl);let s$3=Y();s$3.start(`Waiting for deployment to be live...`);try{let pollIntervalMs=500;for(;;){let current=await client.agents.deployments.get({agent_id:deployConfig.agentId,deployment_id:deployment.id});if(current.status===`success`){let msg=`Deployment successful.`;current.target===`production`&&(msg+=` All chats will use this deployment!`),s$3.stop(msg);break}if(current.status===`failed`){let msg=`Deployment failed.`;current.error_message&&(msg+=` ${current.error_message}`),s$3.stop(msg),console.log(`Read logs for details:`,inspectUrl);return}await new Promise(r$3=>setTimeout(r$3,500))}}catch{s$3.stop(`Failed to poll for deployment status.`),console.log(`Read logs for details:`,inspectUrl);return}}const exists=async path$38=>{try{return await stat$1(path$38),!0}catch{return!1}};function formatBytes(bytes){if(bytes===0)return`0B`;let k$2=1024,sizes=[`B`,`KB`,`MB`,`GB`,`TB`],i$7=Math.floor(Math.log(bytes)/Math.log(k$2)),value=bytes/k$2**+i$7;return`${value.toFixed(value>=100?0:value>=10?1:2)}${sizes[i$7]}`}function writeInline(message){if(process.stdout.isTTY)try{process.stdout.clearLine(0),process.stdout.cursorTo(0),process.stdout.write(message);return}catch{}console.log(message)}async function login(){await login$1()}var version=`0.1.44`;await init_wrapper(),globalThis.WebSocket||(globalThis.WebSocket=import_websocket$2.default),globalThis.crypto||(globalThis.crypto={}),globalThis.crypto.randomUUID||(globalThis.crypto.randomUUID=()=>randomUUID()),program.name(`blink`).description(`Blink is a runtime for building and deploying AI agents.`).version(version).action(()=>{program.outputHelp()}),program.command(`init [directory]`).description(`Initialize a new Blink agent.`).action(init),program.command(`dev [directory] [options]`).description(`Start a development server for your agent.`).action(dev),program.command(`deploy [directory]`).description(`Deploy your agent to the Blink Cloud.`).option(`-m, --message <message>`,`Message for this deployment`).action(deploy),program.command(`build [directory]`).description(`Build your agent for production.`).action(build),program.command(`telemetry [boolean]`).description(`Enable or disable telemetry.`),program.command(`start [directory]`).description("Starts the Blink runtime in production mode. The agent must be compiled with `blink build` first."),program.command(`serve [entrypoint]`).description(`Serve the Blink agent as an HTTP server.`).action(serve),program.command(`connect`,{hidden:!0}).description(`Connect compute to the Blink Cloud.`).action(connect),program.command(`chat`,{hidden:!0}).description(`Start a Blink chat connected to your machine.`).action(chat),program.command(`login`,{hidden:!0}).description(`Log in to the Blink Cloud.`).action(login),program.parse(process.argv);export{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blink",
3
- "version": "0.1.43",
3
+ "version": "0.1.44",
4
4
  "description": "Blink is a JavaScript runtime for building and deploying AI agents.",
5
5
  "type": "module",
6
6
  "bin": {