@opentiny/tiny-robot-kit 0.4.2-alpha.2 → 0.4.2-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- var G=class{constructor(t){this.config=t}updateConfig(t){this.config={...this.config,...t}}getConfig(){return{...this.config}}validateRequest(t){if(!t.messages||!Array.isArray(t.messages)||t.messages.length===0)throw new Error("\u8BF7\u6C42\u5FC5\u987B\u5305\u542B\u81F3\u5C11\u4E00\u6761\u6D88\u606F");for(let e of t.messages)if(!e.role||!e.content)throw new Error("\u6BCF\u6761\u6D88\u606F\u5FC5\u987B\u5305\u542B\u89D2\u8272\u548C\u5185\u5BB9")}};var Me=(c=>(c.NETWORK_ERROR="network_error",c.AUTHENTICATION_ERROR="authentication_error",c.RATE_LIMIT_ERROR="rate_limit_error",c.SERVER_ERROR="server_error",c.MODEL_ERROR="model_error",c.TIMEOUT_ERROR="timeout_error",c.UNKNOWN_ERROR="unknown_error",c))(Me||{}),be=(n=>(n.DATA="data",n.ERROR="error",n.DONE="done",n))(be||{});function F(o){return{type:o.type||"unknown_error",message:o.message||"\u672A\u77E5\u9519\u8BEF",statusCode:o.statusCode,originalError:o.originalError}}function te(o){if(!o.response)return F({type:"network_error",message:"\u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u60A8\u7684\u7F51\u7EDC\u8FDE\u63A5",originalError:o});if(o.response){let{status:t,data:e}=o.response;return t===401||t===403?F({type:"authentication_error",message:"\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u60A8\u7684API\u5BC6\u94A5",statusCode:t,originalError:o}):t===429?F({type:"rate_limit_error",message:"\u8D85\u51FAAPI\u8C03\u7528\u9650\u5236\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",statusCode:t,originalError:o}):t>=500?F({type:"server_error",message:"\u670D\u52A1\u5668\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",statusCode:t,originalError:o}):F({type:"unknown_error",message:e?.error?.message||`\u8BF7\u6C42\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${t}`,statusCode:t,originalError:o})}return o.code==="ECONNABORTED"?F({type:"timeout_error",message:"\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",originalError:o}):F({type:"unknown_error",message:o.message||"\u53D1\u751F\u672A\u77E5\u9519\u8BEF",originalError:o})}async function ne(o,t,e){let n=o.body?.getReader();if(!n)throw new Error("Response body is null");let s=new TextDecoder,r="",a,c;e&&e.addEventListener("abort",()=>{n.cancel().catch(d=>console.error("Error cancelling reader:",d))},{once:!0});try{for(;;){if(e?.aborted){await n.cancel();break}let{done:d,value:f}=await n.read();if(d)break;let v=s.decode(f,{stream:!0});r+=v;let R=r.split(`
1
+ import{b as H,c as L,f as W,g as $,h as G,j as J,k as z}from"./chunk-6JEZBNBO.mjs";var A=class{constructor(t){this.config=t}updateConfig(t){this.config={...this.config,...t}}getConfig(){return{...this.config}}validateRequest(t){if(!t.messages||!Array.isArray(t.messages)||t.messages.length===0)throw new Error("\u8BF7\u6C42\u5FC5\u987B\u5305\u542B\u81F3\u5C11\u4E00\u6761\u6D88\u606F");for(let e of t.messages)if(!e.role||!e.content)throw new Error("\u6BCF\u6761\u6D88\u606F\u5FC5\u987B\u5305\u542B\u89D2\u8272\u548C\u5185\u5BB9")}};var Z=(c=>(c.NETWORK_ERROR="network_error",c.AUTHENTICATION_ERROR="authentication_error",c.RATE_LIMIT_ERROR="rate_limit_error",c.SERVER_ERROR="server_error",c.MODEL_ERROR="model_error",c.TIMEOUT_ERROR="timeout_error",c.UNKNOWN_ERROR="unknown_error",c))(Z||{}),ee=(o=>(o.DATA="data",o.ERROR="error",o.DONE="done",o))(ee||{});function b(s){return{type:s.type||"unknown_error",message:s.message||"\u672A\u77E5\u9519\u8BEF",statusCode:s.statusCode,originalError:s.originalError}}function _(s){if(!s.response)return b({type:"network_error",message:"\u7F51\u7EDC\u8FDE\u63A5\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u60A8\u7684\u7F51\u7EDC\u8FDE\u63A5",originalError:s});if(s.response){let{status:t,data:e}=s.response;return t===401||t===403?b({type:"authentication_error",message:"\u8EAB\u4EFD\u9A8C\u8BC1\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u60A8\u7684API\u5BC6\u94A5",statusCode:t,originalError:s}):t===429?b({type:"rate_limit_error",message:"\u8D85\u51FAAPI\u8C03\u7528\u9650\u5236\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",statusCode:t,originalError:s}):t>=500?b({type:"server_error",message:"\u670D\u52A1\u5668\u9519\u8BEF\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",statusCode:t,originalError:s}):b({type:"unknown_error",message:e?.error?.message||`\u8BF7\u6C42\u5931\u8D25\uFF0C\u72B6\u6001\u7801: ${t}`,statusCode:t,originalError:s})}return s.code==="ECONNABORTED"?b({type:"timeout_error",message:"\u8BF7\u6C42\u8D85\u65F6\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5",originalError:s}):b({type:"unknown_error",message:s.message||"\u53D1\u751F\u672A\u77E5\u9519\u8BEF",originalError:s})}async function q(s,t,e){let o=s.body?.getReader();if(!o)throw new Error("Response body is null");let r=new TextDecoder,n="",i,c;e&&e.addEventListener("abort",()=>{o.cancel().catch(d=>console.error("Error cancelling reader:",d))},{once:!0});try{for(;;){if(e?.aborted){await o.cancel();break}let{done:d,value:f}=await o.read();if(d)break;let h=r.decode(f,{stream:!0});n+=h;let S=n.split(`
2
2
 
3
- `);r=R.pop()||"";for(let x of R)if(x.trim()!==""){if(x.trim()==="data: [DONE]"){c&&(a=c),t.onDone(a);continue}try{let A=x.match(/^data: (.+)$/m);if(!A)continue;let M=JSON.parse(A[1]);t.onData(M),c=M.choices?.[0]?.finish_reason||void 0}catch(A){console.error("Error parsing SSE message:",A)}}}(r.trim()==="data: [DONE]"||e?.aborted)&&(e?.aborted&&(a="aborted"),t.onDone(a))}catch(d){if(e?.aborted)return;throw d}}function Re(o){return o.map(t=>typeof t=="object"&&"role"in t&&"content"in t?{role:t.role,content:String(t.content),...t.name?{name:t.name}:{}}:typeof t=="string"?{role:"user",content:t}:{role:"user",content:String(t)})}function xe(o){return!o.choices||!o.choices.length?"":o.choices[0].message?.content||""}function oe(o="The operation was aborted"){let t=new Error(o);return t.name="AbortError",t}async function*Ae(o,t={}){let e=o.body?.getReader();if(!e)throw new Error("ReadableStream not supported");let{signal:n}=t,s=new TextDecoder,r="",a=()=>{e.cancel()};n?.addEventListener("abort",a);try{for(;;){if(n?.aborted)throw oe();let c;try{c=await e.read()}catch(x){throw n?.aborted?oe():x}let{done:d,value:f}=c;if(d){if(n?.aborted)throw oe();return}let v=s.decode(f,{stream:!0});r+=v;let R=r.split(`
4
- `);r=R.pop()||"";for(let x of R)if(x.trim()!==""&&x.startsWith("data: ")){let A=x.slice(6);if(A==="[DONE]")return;try{yield JSON.parse(A)}catch(M){console.warn("Failed to parse SSE data:",A,M)}}}}finally{n?.removeEventListener("abort",a),e.releaseLock()}}var j=class extends G{constructor(e){super(e);this.defaultModel="gpt-3.5-turbo";this.baseURL=e.apiUrl||"https://api.openai.com/v1",this.apiKey=e.apiKey||"",e.defaultModel&&(this.defaultModel=e.defaultModel),this.apiKey||console.warn("API key is not provided. Authentication will likely fail.")}async chat(e){try{this.validateRequest(e);let n={model:e.options?.model||this.config.defaultModel||this.defaultModel,messages:e.messages,...e.options,stream:!1},s={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)};this.apiKey&&Object.assign(s.headers,{Authorization:`Bearer ${this.apiKey}`});let r=await fetch(`${this.baseURL}/chat/completions`,s);if(!r.ok){let a=await r.text();throw new Error(`HTTP error! status: ${r.status}, details: ${a}`)}return await r.json()}catch(n){throw te(n)}}async chatStream(e,n){let{signal:s,...r}=e.options||{};try{this.validateRequest(e);let a={model:e.options?.model||this.config.defaultModel||this.defaultModel,messages:e.messages,...r,stream:!0},c={method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,Accept:"text/event-stream"},body:JSON.stringify(a),signal:s};this.apiKey&&Object.assign(c.headers,{Authorization:`Bearer ${this.apiKey}`});let d=await fetch(`${this.baseURL}/chat/completions`,c);if(!d.ok){let f=await d.text();throw new Error(`HTTP error! status: ${d.status}, details: ${f}`)}await ne(d,n,s)}catch(a){if(s?.aborted)return;n.onError(te(a))}}updateConfig(e){super.updateConfig(e),e.apiUrl&&(this.baseURL=e.apiUrl),e.apiKey&&(this.apiKey=e.apiKey),e.defaultModel&&(this.defaultModel=e.defaultModel)}};var se=class{constructor(t){this.config=t,this.provider=this.createProvider(t)}createProvider(t){if(t.provider==="custom"&&"providerImplementation"in t)return t.providerImplementation;if(t.provider==="deepseek"){let e={defaultModel:"deepseek-chat",apiUrl:"https://api.deepseek.com/v1"};return new j({...e,...t})}else return new j(t)}async chat(t){return this.provider.chat(t)}async chatStream(t,e){let n={...t,options:{...t.options,stream:!0}};return this.provider.chatStream(n,e)}getConfig(){return{...this.config}}updateConfig(t){this.config={...this.config,...t},t.provider&&t.provider!==this.config.provider?this.provider=this.createProvider(this.config):this.provider.updateConfig(this.config)}};import{toRaw as we}from"vue";function V(o,t=new WeakMap){if(o==null||typeof o!="object")return o;try{let e=we(o);if(t.has(e))return t.get(e);if(Array.isArray(e)){let s=[];return t.set(e,s),s.push(...e.map(r=>V(r,t))),s}if(e instanceof Date||e instanceof RegExp||e instanceof ArrayBuffer||e instanceof Blob)return e;let n={};t.set(e,n);for(let s of Object.keys(e)){let r=Object.getOwnPropertyDescriptor(e,s);if(!r||r.get||r.set)continue;let a=e[s];typeof a!="function"&&typeof a!="symbol"&&(n[s]=V(a,t))}return n}catch(e){return console.warn("unwrapProxy error:",e),Array.isArray(o)?[]:{}}}var X=o=>o.map(t=>{let{renderContent:e,...n}=t;if(!Array.isArray(e))return t;let s=e.filter(a=>a.type==="collapsible-text"),r=e.filter(a=>a.type==="markdown"||a.type==="text");return s.length>0&&(n.reasoning_content=s.map(a=>a.content).join("")),r.length>0&&(n.content=r.map(a=>a.content).join("")),n});var $=o=>{let t=localStorage.getItem(o);return t?JSON.parse(t):[]},J=class{constructor(t="tiny-robot-ai-conversations"){this.storageKey=t}saveConversation(t){try{let e=$(this.storageKey),n=e.findIndex(s=>s.id===t.id);n!==-1?Object.assign(e[n],t):e.unshift({...t,messages:[]}),localStorage.setItem(this.storageKey,JSON.stringify(e))}catch(e){console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",e)}}loadConversations(){try{return $(this.storageKey).map(e=>({id:e.id,title:e.title,createdAt:e.createdAt,updatedAt:e.updatedAt,metadata:e.metadata}))}catch(t){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",t),[]}}saveMessages(t,e){try{let n=$(this.storageKey),s=n.findIndex(r=>r.id===t);s!==-1&&(n[s].messages=e),localStorage.setItem(this.storageKey,JSON.stringify(n))}catch(n){console.error("\u4FDD\u5B58\u4F1A\u8BDD\u6D88\u606F\u5931\u8D25:",n)}}loadMessages(t){try{let n=$(this.storageKey).find(r=>r.id===t);return X(n?.messages||[])}catch(e){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u6D88\u606F\u5931\u8D25:",e),[]}}deleteConversation(t){let e=$(this.storageKey),n=e.findIndex(s=>s.id===t);n!==-1&&e.splice(n,1),localStorage.setItem(this.storageKey,JSON.stringify(e))}};import{openDB as Te}from"idb";var z=class{constructor(t="tiny-robot-ai-db",e=3){this.db=null;this.dbName=t,this.dbVersion=e}async getDB(){return this.db||(this.db=await Te(this.dbName,this.dbVersion,{upgrade(t){t.objectStoreNames.contains("conversations")||t.createObjectStore("conversations",{keyPath:"id"}).createIndex("by-updated","updatedAt"),t.objectStoreNames.contains("messages")||t.createObjectStore("messages",{keyPath:"conversationId"})}})),this.db}async loadConversations(){try{return(await(await this.getDB()).getAllFromIndex("conversations","by-updated")).reverse()}catch(t){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",t),[]}}async loadMessages(t){try{let n=await(await this.getDB()).get("messages",t);return n?X(n.messages):[]}catch(e){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u6D88\u606F\u5931\u8D25:",e),[]}}async saveConversation(t){try{let e=await this.getDB(),n=V(t);await e.put("conversations",n)}catch(e){throw console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",e),e}}async saveMessages(t,e){try{let n=await this.getDB(),s=V(e);await n.put("messages",{conversationId:t,messages:s})}catch(n){throw console.error("\u4FDD\u5B58\u4F1A\u8BDD\u6D88\u606F\u5931\u8D25:",n),n}}async deleteConversation(t){try{let e=await this.getDB();await e.delete("conversations",t),await e.delete("messages",t)}catch(e){throw console.error("\u5220\u9664\u4F1A\u8BDD\u5931\u8D25:",e),e}}};function re(o={}){return new J(o.key||"tiny-robot-ai-conversations")}function Se(o={}){return new z(o.dbName||"tiny-robot-ai-db",o.dbVersion||1)}import{computed as je,ref as Ce,watch as Le}from"vue";import{computed as _e,reactive as De,ref as Y,watch as Ue}from"vue";var le=(o={})=>{let{fallbackRole:t="assistant",...e}=o;return{name:"fallbackRole",...e,onBeforeRequest(n){let{requestBody:s}=n;return s.messages=s.messages.map(r=>({...r,role:r.role||t})),e.onBeforeRequest?.(n)}}};var ce=(o={})=>{let{continueContent:t="Please continue with your previous answer.",...e}=o;return{name:"length",...e,onAfterRequest:async n=>{let{lastChoice:s,appendMessage:r,requestNext:a}=n;return s?.finish_reason==="length"&&(r({role:"user",content:t}),a()),e.onAfterRequest?.(n)}}};var ue=(o={})=>({name:"thinking",...o,onCompletionChunk(t){let{choice:e,currentMessage:n}=t,r=typeof(e?.message?.reasoning_content||e?.delta?.reasoning_content)=="string";return n.state?(n.state.thinking=r,n.state.open=r):n.state={thinking:r,open:r},o.onCompletionChunk?.(t)},onTurnEnd(t){let e=t.currentTurn.slice(-1)[0];return e?.state?.thinking&&(e.state.thinking=!1,e.state.open=!1),o.onTurnEnd?.(t)}});import{reactive as Ee}from"vue";var L=class extends Error{constructor(t){super(t),this.name="AbortError"}};function Pe(o){if(o.aborted)return{promise:Promise.reject(new L(String(o.reason??"Aborted"))),cleanup:()=>{}};let t=null;return{promise:new Promise((s,r)=>{t=()=>{r(new L(String(o.reason??"Aborted")))},o.addEventListener("abort",t,{once:!0})}),cleanup:()=>{t&&(o.removeEventListener("abort",t),t=null)}}}function pe(o,t){let{promise:e,cleanup:n}=Pe(t);return Promise.race([o,e]).finally(n)}function fe(o,t){let e={};for(let n in o)t.includes(n)&&(e[n]=o[n]);return e}function me(o,t){let e={};for(let n in o)t.includes(n)||(e[n]=o[n]);return e}async function*Q(o){if(de(o)){yield*o;return}let t=await o;if(de(t)){yield*t;return}yield t}function de(o){return o&&typeof o=="object"&&typeof o[Symbol.asyncIterator]=="function"}var ae=o=>typeof o=="object"&&o!==null,ge=o=>ae(o)&&typeof o.index=="number",W=(o,t)=>{for(let[e,n]of Object.entries(t)){let s=o[e];if(s)if(typeof s=="string"&&typeof n=="string")e==="type"&&s||(o[e]=s+n);else if(Array.isArray(s)&&Array.isArray(n))if(s.every(r=>ge(r))&&n.every(r=>ge(r))){let r=new Map(s.map(f=>[f.index,f])),a=new Map(n.map(f=>[f.index,f]));for(let[f,v]of a)if(r.has(f)){let R=r.get(f);r.set(f,W(R,v))}else r.set(f,v);let c=Math.max(...Array.from(r.keys()),-1)+1,d=c>s.length?Array.from({length:c}):s;for(let[f,v]of r)d[f]=v;o[e]=d}else o[e]=[...s,...n];else ae(s)&&ae(n)&&(o[e]=W(s,n));else o[e]=n}return o};function Oe(o,t){let e=[];for(let n=0;n<o.length;n++){let s=o[n];if(s.role==="assistant"&&s.tool_calls&&s.tool_calls.length>0){let r=new Set(s.tool_calls.map(d=>d.id)),a=new Set;for(let d=n+1;d<o.length;d++){let f=o[d];f.role==="tool"&&f.tool_call_id&&r.has(f.tool_call_id)&&a.add(f.tool_call_id)}let c=s.tool_calls.map(d=>d.id).filter(d=>!a.has(d));c.length>0&&e.push({insertAfterIndex:n,missingToolCallIds:c})}}for(let n=e.length-1;n>=0;n--){let{insertAfterIndex:s,missingToolCallIds:r}=e[n],a=r.map(c=>({role:"tool",tool_call_id:c,content:t}));o.splice(s+1,0,...a)}}var Ie="remove";function ke(o,t,e,n){let s=o.filter(a=>a[e]),r=new Set(s.flatMap(a=>a.tool_calls?.map(c=>c.id)??[]));if(t===Ie)for(let a=o.length-1;a>=0;a--){let c=o[a];(c[e]||c[n]||c.tool_call_id&&r.has(c.tool_call_id))&&o.splice(a,1)}else if(t===!0)for(let a of o)(a[e]||a.tool_call_id&&r.has(a.tool_call_id))&&(a[n]=!0,delete a[e])}var vt=o=>{let{getTools:t,beforeCallTools:e,callTool:n,onToolCallStart:s,onToolCallEnd:r,toolCallCancelledContent:a="Tool call cancelled.",toolCallFailedContent:c="Tool call failed.",autoFillMissingToolMessages:d=!1,excludeToolMessagesNextTurn:f=!1,...v}=o,R=Symbol("doNotSendNextTurn"),x=Symbol("doNotSend"),A=(...m)=>{let[h,{primaryMessage:T}]=m;T.state.toolCall[h.id].status="running",s?.(...m)},M=(...m)=>{let[h,{status:T,primaryMessage:O}]=m;O.state.toolCall[h.id].status=T,r?.(...m)};return{name:"tool",...v,onTurnStart:m=>{let{messages:h}=m;return d&&Oe(h,a),f&&ke(h,f,R,x),v.onTurnStart?.(m)},onBeforeRequest:async m=>{let{messages:h,requestBody:T}=m;f===!0&&(T.messages=h.filter(E=>!E[x]));let O=await t?.();return O&&O.length>0&&(T.tools=O),v.onBeforeRequest?.(m)},onAfterRequest:async m=>{let{currentMessage:h,lastChoice:T,appendMessage:O,abortSignal:E,setRequestState:i,requestNext:l}=m;if(T?.finish_reason!=="tool_calls"||!h.tool_calls?.length)return;f&&(h[R]=!0),i("processing","calling-tools"),await e?.(h.tool_calls,{...m,currentMessage:h});let g=h.tool_calls.map(async y=>{let S=Math.floor(Date.now()/1e3),w=Ee({role:"tool",tool_call_id:y.id,content:"",metadata:{createdAt:S,updatedAt:S}});O(w);let U={...m,primaryMessage:h,toolMessage:w};A(y,U);try{let k=n(y,U),B=Q(k);for await(let u of B){if(typeof u=="string")w.content+=u;else{let p={};try{p=JSON.parse(w.content||"{}")}catch(b){console.warn(b)}w.content=JSON.stringify(W(p,u))}w.metadata.updatedAt=Math.floor(Date.now()/1e3)}M(y,{...U,status:"success"})}catch(k){let B=k instanceof Error?k:new Error(String(k));if(E.aborted){M(y,{...U,status:"cancelled",error:B});return}console.error(k),w.content.length===0&&(w.content=c),M(y,{...U,status:"failed",error:B})}});return await Promise.all(g),l(),v.onAfterRequest?.(m)},onCompletionChunk:m=>{var T,O,E;let{currentMessage:h}=m;if(Array.isArray(h.tool_calls))for(let i of h.tool_calls)h.state?.toolCall?.[i.id]?.status||(h.state??(h.state={}),(T=h.state).toolCall??(T.toolCall={}),(O=h.state.toolCall)[E=i.id]??(O[E]={}));return v.onCompletionChunk?.(m)}}};var qe=o=>{let t=[];for(let e of o){if(e.name){let n=t.findIndex(s=>s.name===e.name);n!==-1&&t.splice(n,1)}t.push(e)}return t},ie=o=>{let{initialMessages:t=[],requestMessageFields:e=[],requestMessageFieldsExclude:n=["state","metadata","loading"],plugins:s=[],onCompletionChunk:r}=o,a=Y("idle"),c=Y(void 0),d=Y(t),f=Y(o.responseProvider),v=null,R=[],x={},A=[le(),ue(),ce()],M=qe(A.concat(s)),m=_e(()=>a.value==="processing"),h=async u=>{if(!u||!u.trim()){console.warn("Cannot send empty message");return}if(m.value){console.warn("Cannot send message while processing is in progress");return}let p=Math.floor(Date.now()/1e3);d.value.push({role:"user",content:u.trim(),metadata:{createdAt:p,updatedAt:p}}),R.push(d.value[d.value.length-1]),await w()},T=async(...u)=>{if(m.value){console.warn("Cannot send message while processing is in progress");return}d.value.push(...u),R.push(...u),await w()},O=u=>{let p=u;return e.length&&(p=p.map(b=>fe(b,e))),n.length&&(p=p.map(b=>me(b,n))),p},E=(u,p)=>{a.value=u,u==="processing"?c.value=p||"requesting":c.value=void 0},i=u=>{Object.assign(x,u)},l=u=>({messages:d.value,currentTurn:R,requestState:a.value,processingState:c.value,plugins:M,abortSignal:u,setRequestState:E,customContext:x,setCustomContext:i}),g=(u,p)=>typeof u.disabled=="function"?u.disabled(p):!!u.disabled,y=u=>!u||Object.keys(u).length===0?!1:Object.values(u).some(p=>!!p),S=async(u,p)=>{E("processing","requesting");let b=new Proxy({messages:O(d.value)},{set(D,P,N){return P==="messages"?(D.messages=O(N),!0):(D[P]=N,!0)}}),I=l(p);for(let D of M.filter(P=>!g(P,I)))await D.onBeforeRequest?.({...I,requestBody:b});let C=De({role:"",content:"",loading:!0});B(C);let _,Z=u(b,p),q=Q(Z);for await(let D of q){E("processing","completing"),C.loading&&(C.loading=void 0);let P=D.choices?.find(K=>K.index===0);if(P){_=P;let K=()=>{C.metadata||(C.metadata={});let{created:H,...ve}=D;C.metadata.createdAt=H,C.metadata.updatedAt=Math.floor(Date.now()/1e3),Object.assign(C.metadata,ve);let ee=y(P.delta)?P.delta:P.message;ee||(ee=P.delta||P.message||{}),W(C,ee)};if(r){let H=l(p);r({...H,chunk:D,choice:P,currentMessage:C},K)}else K()}let N=l(p);for(let K of M.filter(H=>!g(H,N)))K.onCompletionChunk?.({...N,abortSignal:p,chunk:D,choice:P,currentMessage:C})}await k(C,u,p,_)},w=async()=>{let u=new AbortController;v=u,x={};try{E("processing","requesting");let p=l(u.signal);for(let C of M.filter(_=>!g(_,p)))await C.onTurnStart?.(p);let b=f.value;try{await S(b,u.signal),E("completed")}catch(C){if(u.signal.aborted||C instanceof L||C instanceof Error&&C.name==="AbortError")E("aborted");else throw C}let I=l(u.signal);for(let C of M.filter(_=>!g(_,I)))await C.onTurnEnd?.(I)}catch(p){E("error");let b=!1,I=l(u.signal);for(let C of M.filter(_=>!g(_,I)))C.onError&&(b=!0,C.onError({...I,error:p}));if(!b)throw p}finally{let p=l(u.signal);for(let b of M.filter(I=>!g(I,p)))try{b.onFinally?.(p)}catch(I){console.error(`Error in onFinally hook for plugin ${b.name||"Anonymous"}:`,I)}v=null,R.slice(-1)[0]&&(R.slice(-1)[0].loading=void 0),R=[]}},U=async()=>{v?.abort(),m.value&&await new Promise(u=>{let p=Ue(m,b=>{b||(p(),u())},{immediate:!0})})},k=async(u,p,b,I)=>{let C=!1,_=l(b),Z=M.filter(q=>!g(q,_)).map(q=>{if(!q.onAfterRequest)return null;let D=N=>{B(N)},P=()=>{C=!0};return q.onAfterRequest({..._,currentMessage:u,lastChoice:I,appendMessage:D,requestNext:P})}).filter(q=>q!==null);await pe(Promise.all(Z),b),C&&await S(p,b)},B=u=>{let p=Array.isArray(u)?u:[u];d.value.push(...p),R.push(...p)};return{requestState:a,processingState:c,messages:d,responseProvider:f,isProcessing:m,sendMessage:h,send:T,abortRequest:U}};import{isRef as Be,toValue as Ne}from"vue";function ye(o,t=200,e=!1,n=!0,s=!1){return Fe(Ke(t,e,n,s),o)}function Fe(o,t){function e(...n){return new Promise((s,r)=>{Promise.resolve(o(()=>t.apply(this,n),{fn:t,thisArg:this,args:n})).then(s).catch(r)})}return e}var he=()=>{};function Ke(...o){let t=0,e,n=!0,s=he,r,a,c,d,f;!Be(o[0])&&typeof o[0]=="object"?{delay:a,trailing:c=!0,leading:d=!0,rejectOnCancel:f=!1}=o[0]:[a,c=!0,d=!0,f=!1]=o;let v=()=>{e&&(clearTimeout(e),e=void 0,s(),s=he)};return x=>{let A=Ne(a),M=Date.now()-t,m=()=>r=x();return v(),A<=0?(t=Date.now(),m()):(M>A?(t=Date.now(),(d||!n)&&m()):c&&(r=new Promise((h,T)=>{s=f?T:h,e=setTimeout(()=>{t=Date.now(),n=!0,h(m()),v()},Math.max(0,A-M))})),!d&&!e&&(e=setTimeout(()=>n=!0,A)),n=!1,r)}}var _t=o=>{let t=o.storage||re(),e=Ce([]),n=new Map,s=new Map,r=Ce(null),a=je(()=>{let i=r.value;if(!i)return null;let l=e.value.find(y=>y.id===i);if(!l)return null;let g=n.get(i);return g?{...l,engine:g}:null}),c=i=>{if(!t?.saveMessages)return;let l=i||r.value,g=e.value.find(S=>S.id===l);if(!g)return;g.updatedAt=Date.now(),t?.saveConversation?.(g);let y=n.get(g.id);y&&t.saveMessages(g.id,y.messages.value)},d=(i,l)=>{if(!o.autoSaveMessages||!t?.saveMessages)return;let g=s.get(i);g&&g();let y=o.autoSaveThrottle??1e3,S=ye(()=>{c(i)},y,!0,!0),w=Le(l.messages,S,{deep:!0});s.set(i,w)},f=i=>{let l=s.get(i);l&&(l(),s.delete(i))};t?.loadConversations&&Promise.resolve(t.loadConversations()).then(i=>{if(!i?.length)return[];if(e.value.length===0)return e.value=i,e.value;let l=new Map(e.value.map(g=>[g.id,g]));return i.forEach(g=>{l.has(g.id)||l.set(g.id,g)}),e.value=Array.from(l.values()),e.value}).then(i=>{o.onLoad?.(i)}).catch(i=>{console.error("[useConversation] loadConversations failed:",i)});let v=async(i,l)=>{let g=n.get(i);if(g)return g;let y=l?.initialMessages??o.useMessageOptions.initialMessages??[];if(t?.loadMessages)try{y=await t.loadMessages(i)}catch(w){console.error("[useConversation] loadMessages failed:",w)}let S=ie({...o.useMessageOptions,...l,initialMessages:y});return n.set(i,S),d(i,S),S};function R(){return Date.now().toString(36)+Math.random().toString(36).substring(2,9)}let x=i=>{let{id:l=R(),title:g,metadata:y,useMessageOptions:S}=i||{},w=Date.now(),U={id:l,title:g,createdAt:w,updatedAt:w,metadata:y};e.value.unshift(U);let k=ie({...o.useMessageOptions,...S});return n.set(l,k),d(l,k),t?.saveConversation?.(U),t?.saveMessages?.(l,k.messages.value),r.value=l,a.value},A=i=>{let{excludeId:l}=i||{};n.forEach((g,y)=>{if(l&&y===l)return;g.isProcessing?.value||(f(y),n.delete(y))})};return{conversations:e,activeConversationId:r,activeConversation:a,createConversation:x,switchConversation:async i=>i?r.value===i?a.value:e.value.find(g=>g.id===i)?(await v(i),A({excludeId:i}),r.value=i,a.value):null:null,deleteConversation:async i=>{let l=e.value.findIndex(y=>y.id===i);if(l===-1)return;await n.get(i)?.abortRequest(),f(i),n.delete(i),e.value.splice(l,1),t?.deleteConversation?.(i),r.value===i&&(r.value=null,A())},clear:()=>{e.value.map(l=>l.id).forEach(l=>{t?.deleteConversation?.(l)}),n.forEach(l=>{l.abortRequest()}),s.forEach(l=>{l()}),e.value=[],n.clear(),s.clear(),r.value=null},updateConversationTitle:(i,l)=>{let g=e.value.find(y=>y.id===i);g&&(g.title=l,g.updatedAt=Date.now(),t?.saveConversation?.(g))},saveMessages:c,sendMessage:i=>{a.value?.engine.sendMessage(i)},abortActiveRequest:async()=>{await a.value?.engine.abortRequest()}}};export{se as AIClient,G as BaseModelProvider,Ie as EXCLUDE_MODE_REMOVE,Me as ErrorType,z as IndexedDBStrategy,J as LocalStorageStrategy,j as OpenAIProvider,be as StreamEventType,xe as extractTextFromResponse,le as fallbackRolePlugin,Re as formatMessages,ne as handleSSEStream,Se as indexedDBStorageStrategyFactory,ce as lengthPlugin,re as localStorageStrategyFactory,Ae as sseStreamToGenerator,ue as thinkingPlugin,vt as toolPlugin,_t as useConversation,ie as useMessage};
3
+ `);n=S.pop()||"";for(let m of S)if(m.trim()!==""){if(m.trim()==="data: [DONE]"){c&&(i=c),t.onDone(i);continue}try{let g=m.match(/^data: (.+)$/m);if(!g)continue;let l=JSON.parse(g[1]);t.onData(l),c=l.choices?.[0]?.finish_reason||void 0}catch(g){console.error("Error parsing SSE message:",g)}}}(n.trim()==="data: [DONE]"||e?.aborted)&&(e?.aborted&&(i="aborted"),t.onDone(i))}catch(d){if(e?.aborted)return;throw d}}function te(s){return s.map(t=>typeof t=="object"&&"role"in t&&"content"in t?{role:t.role,content:String(t.content),...t.name?{name:t.name}:{}}:typeof t=="string"?{role:"user",content:t}:{role:"user",content:String(t)})}function oe(s){return!s.choices||!s.choices.length?"":s.choices[0].message?.content||""}function F(s="The operation was aborted"){let t=new Error(s);return t.name="AbortError",t}async function*se(s,t={}){let e=s.body?.getReader();if(!e)throw new Error("ReadableStream not supported");let{signal:o}=t,r=new TextDecoder,n="",i=()=>{e.cancel()};o?.addEventListener("abort",i);try{for(;;){if(o?.aborted)throw F();let c;try{c=await e.read()}catch(m){throw o?.aborted?F():m}let{done:d,value:f}=c;if(d){if(o?.aborted)throw F();return}let h=r.decode(f,{stream:!0});n+=h;let S=n.split(`
4
+ `);n=S.pop()||"";for(let m of S)if(m.trim()!==""&&m.startsWith("data: ")){let g=m.slice(6);if(g==="[DONE]")return;try{yield JSON.parse(g)}catch(l){console.warn("Failed to parse SSE data:",g,l)}}}}finally{o?.removeEventListener("abort",i),e.releaseLock()}}var T=class extends A{constructor(e){super(e);this.defaultModel="gpt-3.5-turbo";this.baseURL=e.apiUrl||"https://api.openai.com/v1",this.apiKey=e.apiKey||"",e.defaultModel&&(this.defaultModel=e.defaultModel),this.apiKey||console.warn("API key is not provided. Authentication will likely fail.")}async chat(e){try{this.validateRequest(e);let o={model:e.options?.model||this.config.defaultModel||this.defaultModel,messages:e.messages,...e.options,stream:!1},r={method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)};this.apiKey&&Object.assign(r.headers,{Authorization:`Bearer ${this.apiKey}`});let n=await fetch(`${this.baseURL}/chat/completions`,r);if(!n.ok){let i=await n.text();throw new Error(`HTTP error! status: ${n.status}, details: ${i}`)}return await n.json()}catch(o){throw _(o)}}async chatStream(e,o){let{signal:r,...n}=e.options||{};try{this.validateRequest(e);let i={model:e.options?.model||this.config.defaultModel||this.defaultModel,messages:e.messages,...n,stream:!0},c={method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`,Accept:"text/event-stream"},body:JSON.stringify(i),signal:r};this.apiKey&&Object.assign(c.headers,{Authorization:`Bearer ${this.apiKey}`});let d=await fetch(`${this.baseURL}/chat/completions`,c);if(!d.ok){let f=await d.text();throw new Error(`HTTP error! status: ${d.status}, details: ${f}`)}await q(d,o,r)}catch(i){if(r?.aborted)return;o.onError(_(i))}}updateConfig(e){super.updateConfig(e),e.apiUrl&&(this.baseURL=e.apiUrl),e.apiKey&&(this.apiKey=e.apiKey),e.defaultModel&&(this.defaultModel=e.defaultModel)}};var V=class{constructor(t){this.config=t,this.provider=this.createProvider(t)}createProvider(t){if(t.provider==="custom"&&"providerImplementation"in t)return t.providerImplementation;if(t.provider==="deepseek"){let e={defaultModel:"deepseek-chat",apiUrl:"https://api.deepseek.com/v1"};return new T({...e,...t})}else return new T(t)}async chat(t){return this.provider.chat(t)}async chatStream(t,e){let o={...t,options:{...t.options,stream:!0}};return this.provider.chatStream(o,e)}getConfig(){return{...this.config}}updateConfig(t){this.config={...this.config,...t},t.provider&&t.provider!==this.config.provider?this.provider=this.createProvider(this.config):this.provider.updateConfig(this.config)}};import{toRaw as re}from"vue";function w(s,t=new WeakMap){if(s==null||typeof s!="object")return s;try{let e=re(s);if(t.has(e))return t.get(e);if(Array.isArray(e)){let r=[];return t.set(e,r),r.push(...e.map(n=>w(n,t))),r}if(e instanceof Date||e instanceof RegExp||e instanceof ArrayBuffer||e instanceof Blob)return e;let o={};t.set(e,o);for(let r of Object.keys(e)){let n=Object.getOwnPropertyDescriptor(e,r);if(!n||n.get||n.set)continue;let i=e[r];typeof i!="function"&&typeof i!="symbol"&&(o[r]=w(i,t))}return o}catch(e){return console.warn("unwrapProxy error:",e),Array.isArray(s)?[]:{}}}var I=s=>s.map(t=>{let{renderContent:e,...o}=t;if(!Array.isArray(e))return t;let r=e.filter(i=>i.type==="collapsible-text"),n=e.filter(i=>i.type==="markdown"||i.type==="text");return r.length>0&&(o.reasoning_content=r.map(i=>i.content).join("")),n.length>0&&(o.content=n.map(i=>i.content).join("")),o});var k=s=>{let t=localStorage.getItem(s);return t?JSON.parse(t):[]},E=class{constructor(t="tiny-robot-ai-conversations"){this.storageKey=t}saveConversation(t){try{let e=k(this.storageKey),o=e.findIndex(r=>r.id===t.id);o!==-1?Object.assign(e[o],t):e.unshift({...t,messages:[]}),localStorage.setItem(this.storageKey,JSON.stringify(e))}catch(e){console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",e)}}loadConversations(){try{return k(this.storageKey).map(e=>({id:e.id,title:e.title,createdAt:e.createdAt,updatedAt:e.updatedAt,metadata:e.metadata}))}catch(t){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",t),[]}}saveMessages(t,e){try{let o=k(this.storageKey),r=o.findIndex(n=>n.id===t);r!==-1&&(o[r].messages=e),localStorage.setItem(this.storageKey,JSON.stringify(o))}catch(o){console.error("\u4FDD\u5B58\u4F1A\u8BDD\u6D88\u606F\u5931\u8D25:",o)}}loadMessages(t){try{let o=k(this.storageKey).find(n=>n.id===t);return I(o?.messages||[])}catch(e){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u6D88\u606F\u5931\u8D25:",e),[]}}deleteConversation(t){let e=k(this.storageKey),o=e.findIndex(r=>r.id===t);o!==-1&&e.splice(o,1),localStorage.setItem(this.storageKey,JSON.stringify(e))}};import{openDB as ne}from"idb";var O=class{constructor(t="tiny-robot-ai-db",e=3){this.db=null;this.dbName=t,this.dbVersion=e}async getDB(){return this.db||(this.db=await ne(this.dbName,this.dbVersion,{upgrade(t){t.objectStoreNames.contains("conversations")||t.createObjectStore("conversations",{keyPath:"id"}).createIndex("by-updated","updatedAt"),t.objectStoreNames.contains("messages")||t.createObjectStore("messages",{keyPath:"conversationId"})}})),this.db}async loadConversations(){try{return(await(await this.getDB()).getAllFromIndex("conversations","by-updated")).reverse()}catch(t){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25:",t),[]}}async loadMessages(t){try{let o=await(await this.getDB()).get("messages",t);return o?I(o.messages):[]}catch(e){return console.error("\u52A0\u8F7D\u4F1A\u8BDD\u6D88\u606F\u5931\u8D25:",e),[]}}async saveConversation(t){try{let e=await this.getDB(),o=w(t);await e.put("conversations",o)}catch(e){throw console.error("\u4FDD\u5B58\u4F1A\u8BDD\u5931\u8D25:",e),e}}async saveMessages(t,e){try{let o=await this.getDB(),r=w(e);await o.put("messages",{conversationId:t,messages:r})}catch(o){throw console.error("\u4FDD\u5B58\u4F1A\u8BDD\u6D88\u606F\u5931\u8D25:",o),o}}async deleteConversation(t){try{let e=await this.getDB();await e.delete("conversations",t),await e.delete("messages",t)}catch(e){throw console.error("\u5220\u9664\u4F1A\u8BDD\u5931\u8D25:",e),e}}};function N(s={}){return new E(s.key||"tiny-robot-ai-conversations")}function ae(s={}){return new O(s.dbName||"tiny-robot-ai-db",s.dbVersion||1)}import{computed as de,ref as Y,watch as me}from"vue";import{ref as ie,toRaw as K,watch as le}from"vue";var j=s=>{let{initialMessages:t=[],requestMessageFields:e=[],requestMessageFieldsExclude:o=["state","metadata","loading"],plugins:r=[],responseProvider:n,onCompletionChunk:i}=s,c=H(),d=l=>c.messages.value.find(M=>M===l||K(M)===l||K(M)===K(l))??l,f=l=>({messages:c.messages.value,currentTurn:l.currentTurn.map(M=>d(M)),requestState:c.requestState.value,processingState:c.processingState.value,plugins:r,setRequestState:l.setRequestState,abortSignal:l.abortSignal,customContext:l.customContext,setCustomContext:l.setCustomContext}),h=l=>{let M=l;if(typeof M.__corePluginFactory=="function")return M.__corePluginFactory({createCorePlugin:h,createVueBaseContext:f,resolveReactiveMessage:d});let{name:P,disabled:x,onTurnStart:U,onTurnEnd:B,onBeforeRequest:a,onAfterRequest:u,onCompletionChunk:p,onError:y,onFinally:R}=l,v={};return P!==void 0&&(v.name=P),x!==void 0&&(v.disabled=typeof x=="function"?C=>x(f(C)):x),U&&(v.onTurnStart=C=>U(f(C))),B&&(v.onTurnEnd=C=>B(f(C))),a&&(v.onBeforeRequest=C=>a({...f(C),requestBody:C.requestBody})),u&&(v.onAfterRequest=C=>u({...f(C),currentMessage:d(C.currentMessage),lastChoice:C.lastChoice,appendMessage:C.appendMessage,requestNext:C.requestNext})),p&&(v.onCompletionChunk=C=>p({...f(C),currentMessage:d(C.currentMessage),choice:C.choice,chunk:C.chunk})),y&&(v.onError=C=>y({...f(C),error:C.error})),R&&(v.onFinally=C=>R(f(C))),v},m=z(c,{initialMessages:t,requestMessageFields:e,requestMessageFieldsExclude:o,responseProvider:n,onCompletionChunk:i?(l,M)=>{if(i)return i({...f(l),currentMessage:d(l.currentMessage),choice:l.choice,chunk:l.chunk},M)}:void 0,plugins:r.map(l=>h(l))}),g=ie(n);return le(g,l=>{m.setResponseProvider(l)},{flush:"sync"}),{requestState:c.requestState,processingState:c.processingState,messages:c.messages,responseProvider:g,isProcessing:c.isProcessing,sendMessage:m.sendMessage,send:m.send,abortRequest:m.abort}};import{isRef as ce,toValue as ue}from"vue";function X(s,t=200,e=!1,o=!0,r=!1){return ge(pe(t,e,o,r),s)}function ge(s,t){function e(...o){return new Promise((r,n)=>{Promise.resolve(s(()=>t.apply(this,o),{fn:t,thisArg:this,args:o})).then(r).catch(n)})}return e}var Q=()=>{};function pe(...s){let t=0,e,o=!0,r=Q,n,i,c,d,f;!ce(s[0])&&typeof s[0]=="object"?{delay:i,trailing:c=!0,leading:d=!0,rejectOnCancel:f=!1}=s[0]:[i,c=!0,d=!0,f=!1]=s;let h=()=>{e&&(clearTimeout(e),e=void 0,r(),r=Q)};return m=>{let g=ue(i),l=Date.now()-t,M=()=>n=m();return h(),g<=0?(t=Date.now(),M()):(l>g?(t=Date.now(),(d||!o)&&M()):c&&(n=new Promise((P,x)=>{r=f?x:P,e=setTimeout(()=>{t=Date.now(),o=!0,P(M()),h()},Math.max(0,g-l))})),!d&&!e&&(e=setTimeout(()=>o=!0,g)),o=!1,n)}}var et=s=>{let t=s.storage||N(),e=Y([]),o=new Map,r=new Map,n=Y(null),i=de(()=>{let a=n.value;if(!a)return null;let u=e.value.find(y=>y.id===a);if(!u)return null;let p=o.get(a);return p?{...u,engine:p}:null}),c=a=>{if(!t?.saveMessages)return;let u=a||n.value,p=e.value.find(R=>R.id===u);if(!p)return;p.updatedAt=Date.now(),t?.saveConversation?.(p);let y=o.get(p.id);y&&t.saveMessages(p.id,y.messages.value)},d=(a,u)=>{if(!s.autoSaveMessages||!t?.saveMessages)return;let p=r.get(a);p&&p();let y=s.autoSaveThrottle??1e3,R=X(()=>{c(a)},y,!0,!0),v=me(u.messages,R,{deep:!0});r.set(a,v)},f=a=>{let u=r.get(a);u&&(u(),r.delete(a))};t?.loadConversations&&Promise.resolve(t.loadConversations()).then(a=>{if(!a?.length)return[];if(e.value.length===0)return e.value=a,e.value;let u=new Map(e.value.map(p=>[p.id,p]));return a.forEach(p=>{u.has(p.id)||u.set(p.id,p)}),e.value=Array.from(u.values()),e.value}).then(a=>{s.onLoad?.(a)}).catch(a=>{console.error("[useConversation] loadConversations failed:",a)});let h=async(a,u)=>{let p=o.get(a);if(p)return p;let y=u?.initialMessages??s.useMessageOptions.initialMessages??[];if(t?.loadMessages)try{y=await t.loadMessages(a)}catch(v){console.error("[useConversation] loadMessages failed:",v)}let R=j({...s.useMessageOptions,...u,initialMessages:y});return o.set(a,R),d(a,R),R};function S(){return Date.now().toString(36)+Math.random().toString(36).substring(2,9)}let m=a=>{let{id:u=S(),title:p,metadata:y,useMessageOptions:R}=a||{},v=Date.now(),C={id:u,title:p,createdAt:v,updatedAt:v,metadata:y};e.value.unshift(C);let D=j({...s.useMessageOptions,...R});return o.set(u,D),d(u,D),t?.saveConversation?.(C),t?.saveMessages?.(u,D.messages.value),n.value=u,i.value},g=a=>{let{excludeId:u}=a||{};o.forEach((p,y)=>{if(u&&y===u)return;p.isProcessing?.value||(f(y),o.delete(y))})};return{conversations:e,activeConversationId:n,activeConversation:i,createConversation:m,switchConversation:async a=>a?n.value===a?i.value:e.value.find(p=>p.id===a)?(await h(a),g({excludeId:a}),n.value=a,i.value):null:null,deleteConversation:async a=>{let u=e.value.findIndex(y=>y.id===a);if(u===-1)return;await o.get(a)?.abortRequest(),f(a),o.delete(a),e.value.splice(u,1),t?.deleteConversation?.(a),n.value===a&&(n.value=null,g())},clear:()=>{e.value.map(u=>u.id).forEach(u=>{t?.deleteConversation?.(u)}),o.forEach(u=>{u.abortRequest()}),r.forEach(u=>{u()}),e.value=[],o.clear(),r.clear(),n.value=null},updateConversationTitle:(a,u)=>{let p=e.value.find(y=>y.id===a);p&&(p.title=u,p.updatedAt=Date.now(),t?.saveConversation?.(p))},saveMessages:c,sendMessage:a=>{i.value?.engine.sendMessage(a)},abortActiveRequest:async()=>{await i.value?.engine.abortRequest()}}};var st=(s={})=>{let{continueContent:t="Please continue with your previous answer.",...e}=s;return{name:"length",__corePluginFactory(o){return L({...o.createCorePlugin(e),continueContent:t})}}};import{isRef as fe,unref as Ce}from"vue";var he=s=>fe(s)?Ce(s):s,it=s=>{let{skills:t,getSkills:e,executeSkillCommand:o,onSkillsResolved:r,...n}=s;return{name:"skill",__corePluginFactory(i){return W({...i.createCorePlugin(n),getSkills:async c=>{let d=i.createVueBaseContext(c),f=e?await e(d):t;return he(f)},executeSkillCommand:o?(c,d)=>o(c,i.createVueBaseContext(d)):void 0,onSkillsResolved:r?(c,d)=>r(c,i.createVueBaseContext(d)):void 0})}}};var ut=(s={})=>({name:"thinking",__corePluginFactory(t){return $(t.createCorePlugin(s))}});var mt=s=>{let{getTools:t,beforeCallTools:e,callTool:o,onToolCallStart:r,onToolCallEnd:n,toolCallCancelledContent:i="Tool call cancelled.",toolCallFailedContent:c="Tool call failed.",autoFillMissingToolMessages:d=!1,...f}=s;return{name:"tool",__corePluginFactory(h){let S=h.createCorePlugin(f);return J({...S,getTools:async m=>t(h.createVueBaseContext(m)),beforeCallTools:e?async(m,g)=>{let l=h.resolveReactiveMessage(g.assistantMessage);await e(m,{...h.createVueBaseContext(g),assistantMessage:l,currentMessage:l})}:void 0,callTool:async function*(m,g){let l=h.resolveReactiveMessage(g.assistantMessage),M=h.resolveReactiveMessage(g.toolMessage),P=o(m,{...h.createVueBaseContext(g),assistantMessage:l,currentMessage:l,toolMessage:M,toolSource:g.toolSource});for await(let x of G(P))yield x},onToolCallStart:r?(m,g)=>{let l=h.resolveReactiveMessage(g.assistantMessage),M=h.resolveReactiveMessage(g.toolMessage);r(m,{...h.createVueBaseContext(g),assistantMessage:l,primaryMessage:l,toolMessage:M,toolSource:g.toolSource})}:void 0,onToolCallEnd:n?(m,g)=>{let l=h.resolveReactiveMessage(g.assistantMessage),M=h.resolveReactiveMessage(g.toolMessage);n(m,{...h.createVueBaseContext(g),assistantMessage:l,primaryMessage:l,toolMessage:M,toolSource:g.toolSource,status:g.status,error:g.error})}:void 0,toolCallCancelledContent:i,toolCallFailedContent:c,autoFillMissingToolMessages:d})}}};export{V as AIClient,A as BaseModelProvider,Z as ErrorType,O as IndexedDBStrategy,E as LocalStorageStrategy,T as OpenAIProvider,ee as StreamEventType,oe as extractTextFromResponse,te as formatMessages,q as handleSSEStream,ae as indexedDBStorageStrategyFactory,st as lengthPlugin,N as localStorageStrategyFactory,it as skillPlugin,se as sseStreamToGenerator,ut as thinkingPlugin,mt as toolPlugin,et as useConversation,j as useMessage};
@@ -0,0 +1,14 @@
1
+ import { b as SkillFile } from './types-ChCZ8jKB.mjs';
2
+
3
+ interface FsSkillFilesOptions {
4
+ /**
5
+ * 遍历时排除的目录名。
6
+ */
7
+ ignoredDirectories?: string[];
8
+ }
9
+ /**
10
+ * Node.js 目录适配器,将本地 skill 目录读取为 SkillFile 记录。
11
+ */
12
+ declare const loadSkillFilesFromFs: (root: string, options?: FsSkillFilesOptions) => Promise<SkillFile[]>;
13
+
14
+ export { type FsSkillFilesOptions, loadSkillFilesFromFs };
package/dist/node.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { b as SkillFile } from './types-ChCZ8jKB.js';
2
+
3
+ interface FsSkillFilesOptions {
4
+ /**
5
+ * 遍历时排除的目录名。
6
+ */
7
+ ignoredDirectories?: string[];
8
+ }
9
+ /**
10
+ * Node.js 目录适配器,将本地 skill 目录读取为 SkillFile 记录。
11
+ */
12
+ declare const loadSkillFilesFromFs: (root: string, options?: FsSkillFilesOptions) => Promise<SkillFile[]>;
13
+
14
+ export { type FsSkillFilesOptions, loadSkillFilesFromFs };
package/dist/node.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";var F=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var g=(t,i)=>{for(var e in i)F(t,e,{get:i[e],enumerable:!0})},w=(t,i,e,n)=>{if(i&&typeof i=="object"||typeof i=="function")for(let s of x(i))!h.call(t,s)&&s!==e&&F(t,s,{get:()=>i[s],enumerable:!(n=S(i,s))||n.enumerable});return t};var y=t=>w(F({},"__esModule",{value:!0}),t);var P={};g(P,{loadSkillFilesFromFs:()=>k});module.exports=y(P);var l=require("fs/promises"),p=require("path");var d=t=>{let i=t.split("\\").join("/").replace(/^\.\/+/,"");return!i||i.startsWith("/")||i.includes("\0")||i.split("/").some(e=>e===".."||e==="")?null:i},u=t=>[".md",".txt",".json"].includes(z(t)),z=t=>{let i=t.split("/").at(-1)||t,e=i.lastIndexOf(".");return e===-1?"":i.slice(e).toLowerCase()};var k=async(t,i={})=>{let e=new Set(i.ignoredDirectories??[".git","node_modules"]),n=[],s=async a=>{let f=await(0,l.readdir)(a,{withFileTypes:!0});for(let c of f){let o=(0,p.join)(a,c.name);if(c.isDirectory()){e.has(c.name)||await s(o);continue}if(!c.isFile())continue;let r=await(0,l.stat)(o);if(!r.isFile())continue;let m=d((0,p.relative)(t,o));m&&(u(m)?n.push({path:m,kind:"text",content:await(0,l.readFile)(o,"utf-8"),size:r.size,lastModified:r.mtimeMs}):n.push({path:m,kind:"binary",content:await(0,l.readFile)(o),size:r.size,lastModified:r.mtimeMs}))}};return await s(t),n.sort((a,f)=>a.path.localeCompare(f.path))};0&&(module.exports={loadSkillFilesFromFs});
package/dist/node.mjs ADDED
@@ -0,0 +1 @@
1
+ import{a as c,b as m}from"./chunk-ZO2ZONVX.mjs";import{readdir as d,readFile as f,stat as k}from"fs/promises";import{join as S,relative as u}from"path";var h=async(r,p={})=>{let F=new Set(p.ignoredDirectories??[".git","node_modules"]),o=[],a=async t=>{let n=await d(t,{withFileTypes:!0});for(let s of n){let i=S(t,s.name);if(s.isDirectory()){F.has(s.name)||await a(i);continue}if(!s.isFile())continue;let e=await k(i);if(!e.isFile())continue;let l=c(u(r,i));l&&(m(l)?o.push({path:l,kind:"text",content:await f(i,"utf-8"),size:e.size,lastModified:e.mtimeMs}):o.push({path:l,kind:"binary",content:await f(i),size:e.size,lastModified:e.mtimeMs}))}};return await a(r),o.sort((t,n)=>t.path.localeCompare(n.path))};export{h as loadSkillFilesFromFs};