@amaster.ai/copilot-client 1.1.15 → 1.1.16

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.cjs CHANGED
@@ -1,3 +1,3 @@
1
- 'use strict';var httpClient=require('@amaster.ai/http-client'),eventsourceParser=require('eventsource-parser'),je=require('miniprogram-text-decoder');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var je__default=/*#__PURE__*/_interopDefault(je);var me=class{constructor(){this.aborted=false;this.listeners=[];this.signal={aborted:false,addEventListener:(t,r)=>{this.listeners.push(r);}};}abort(){this.aborted||(this.aborted=true,this.signal.aborted=true,this.listeners.forEach(t=>t()));}};function ve(){return typeof AbortController<"u"?new AbortController:new me}function f(){return new Date().toISOString()}function Q(){return `msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function De(e){return {...e}}function pe(e){return {...e,system:e.system?{...e.system}:void 0,runtimeError:e.runtimeError?{...e.runtimeError}:void 0,messages:e.messages.map(t=>De(t))}}function fe(e){return {starting:e.starting,isLoading:e.isLoading,isLoadingHistory:e.isLoadingHistory,historyState:{...e.historyState},conversations:e.order.map(t=>e.byId[t]).filter(t=>!!t).map(t=>pe(t))}}var oe={"text-content":(e,t,r,a,i)=>{if(!r)return e;let c=e.messages.find(n=>n.messageId===r),d=t.text||"";return c&&"content"in c?{...e,messages:e.messages.map(n=>n.messageId===r?{...n,content:n.content+d}:n),lastUpdated:f()}:{...e,messages:[...e.messages,{messageId:r,role:a,kind:"text-content",content:d,timestamp:i?.timestamp||f()}],lastUpdated:f()}},thought:(e,t,r,a,i)=>{if(!r)return e;let c=t?.data?.description||"",d=e.messages.find(n=>n.messageId===r);return d&&"thought"in d?{...e,messages:e.messages.map(n=>n.messageId===r?{...n,thought:n.thought+c}:n),lastUpdated:f()}:{...e,messages:[...e.messages,{messageId:r,role:a,kind:"thought",thought:c,timestamp:i?.timestamp||f()}],lastUpdated:f()}},tool:(e,t,r,a,i)=>{let c=t?.data||{},d=c?.tool,n=d?.displayName||d?.name||"",m=c?.request,y=m?.callId;if(!y||!n)return e;let x=c?.status,S=e.messages.find(b=>b.messageId===y);return S&&"toolStatus"in S?{...e,messages:e.messages.map(b=>b.messageId===y?{...b,toolStatus:x||b.toolStatus}:b),lastUpdated:f()}:{...e,messages:[...e.messages,{messageId:y,role:a,kind:"tool",toolName:n,toolDescription:m?.args?.query||"",toolStatus:x||"pending",timestamp:i?.timestamp||f()}],lastUpdated:f()}},error:(e,t,r,a)=>{let i=t?.text||t?.data?.error||"\u53D1\u751F\u9519\u8BEF";return {...e,messages:[...e.messages,{messageId:r||`error-${Date.now()}`,role:a,kind:"error",content:i,timestamp:f()}],status:"error",lastUpdated:f()}},"ui-render":(e,t,r,a,i)=>{if(!r)return e;let c=e.messages.find(m=>m.messageId===r),n=(t?.data||{}).spec||{root:"",elements:{}};return c&&c.kind==="ui-render"?{...e,messages:e.messages.map(m=>m.messageId===r?{...m,spec:n}:m),lastUpdated:f()}:{...e,messages:[...e.messages,{messageId:r,role:a,kind:"ui-render",spec:n,timestamp:i?.timestamp||f()}],lastUpdated:f()}}};function ye(e,t){return e?.data?.tool?"tool":e?.data?.type==="ui"?"ui-render":e?.kind==="text"?"text-content":e?.data?.type==="though"||t?.coderAgent?.kind==="thought"?"thought":t?.error?"error":"unknown"}function Fe(e,t){if(typeof e=="string"){let r=e.trim().toUpperCase();if(r==="TT"||r==="DOUYIN"||r==="WEAPP"||r==="WECHAT")return true}return t?typeof t.TT<"u"&&e===t.TT||typeof t.WEAPP<"u"&&e===t.WEAPP:false}function ae(){let e=httpClient.resolveMiniProgramGlobals();return Fe(e?.Taro?.getEnv?.(),e?.Taro?.ENV_TYPE)?true:typeof e?.wx?.request=="function"||typeof e?.tt?.request=="function"||typeof e?.my?.request=="function"||typeof e?.swan?.request=="function"||typeof e?.qq?.request=="function"||typeof e?.jd?.request=="function"}function be(){let e=httpClient.resolveMiniProgramGlobals();return !(typeof e?.tt?.request=="function"||typeof e?.tt?.createEventSource=="function")}function Me(){return typeof httpClient.resolveMiniProgramGlobals()?.tt?.createEventSource=="function"}function Re(e,t){let a=(t.mode||"conversation")==="single-turn",i=!a,c=!a,d=()=>t.getContextId?.()??e.createContextId(a?"single-turn":"conversation"),n={byId:{},order:[],starting:true,isLoading:false,isLoadingHistory:false,historyState:{next:null,hasMore:false}},m=new Set,y=null,S=null,b="unknown",M="",P=null,R=false,D=d(),q=e.createScopedRuntime(D),h=null,g=()=>{if(R)return;let s=fe(n);m.forEach(o=>o(s));},H=s=>{n.order=n.order.filter(o=>o!==s);},k=(s,o=true)=>{H(s),n.order=o?[...n.order,s]:[s,...n.order];},I=()=>{b="unknown",M="";},z=s=>{let o=s&&typeof s=="object"?s:{},u=String(o.message||o.errMsg||"").toLowerCase(),p=String(o.errorCode||""),A=String(o.errNo||"");return o.name==="TypeError"||/failed to fetch|fetch failed|timed out|disconnected|offline|断网/.test(u)||["600009","21101","21102","21103"].includes(p)||["600009","21101","21102","21103"].includes(A)},_=(s,o="stream")=>{let u=s&&typeof s=="object"?s:{},p=String(u.message||u.errMsg||"").toLowerCase();return {code:z(s)?"network":"unknown",message:p,retryable:true,source:o,timestamp:f()}},L=(s,o)=>{if(!s)return;let u=n.byId[s];u&&(n.byId[s]={...u,requestState:o.requestState??u.requestState,runtimeError:o.runtimeError===void 0?u.runtimeError:o.runtimeError,status:o.status??u.status,lastUpdated:f()});},j=s=>{L(s,{requestState:"idle",runtimeError:null});},X=()=>{n.byId={},n.order=[],n.historyState={next:null,hasMore:false};},K=s=>{n.isLoading=s,!s&&ne();},G=()=>(D=d(),q=e.createScopedRuntime(D),D),Z=()=>{y?.abort(),y=null,j(h),K(false),g();},se=()=>{I(),j(h),h&&L(h,{status:"completed"}),h=null,S=null,y=null,K(false),g();},J=s=>{n.byId[s.taskId]=s,k(s.taskId,true),g();},re=s=>{n.byId[s]&&(delete n.byId[s],H(s),g());},ue=()=>{J({taskId:"loading-placeholder",status:"working",messages:[{messageId:"loading-placeholder",role:"assistant",kind:"text-content",content:t.strings.thinking,timestamp:f()}],lastUpdated:f()});},ne=()=>{re("loading-placeholder");},Y=({kind:s,taskId:o,part:u,status:p,handler:A,isHistory:C,historyId:E,messageId:T})=>{let w=T||M,O=p?.message?.role==="agent"?"assistant":"user";!T&&(s==="ui-render"||s!=="unknown"&&s!==b)&&(b=s,w=Q(),M=w);let $=n.byId[o]??{taskId:o,status:C?"completed":"submitted",messages:[],role:O,historyId:E,lastUpdated:f()},U=A($,u,w,O,p);n.byId[o]={...U,status:p?.state||$.status,lastUpdated:f()},C||k(o,true),g();},l=(s,o="stream",u=h)=>{L(u,{requestState:"error",runtimeError:_(s,o),status:"error"}),u&&h===u&&(h=null),K(false),g();},v=s=>{if(!s?.result)return;let o=s.result,{taskId:u,status:p,metadata:A,final:C}=o;if(C){se();return}if(!u)return;S=u;let E=p?.message?.parts?.[0],T=ye(E,A),w=oe[T];w&&(ne(),Y({kind:T,taskId:u,part:E,status:p,handler:w}));},F=(s,o)=>{let{messageId:u,historyId:p}=s||{};if(!u)return;let A=s.parts?.[0],C=ye(A);if(C==="text-content"){let T=A.text||"";if(T=T.trim(),T.startsWith("<ui>")){let w=T.slice(4).trim();try{let O=JSON.parse(w);O.root&&O.elements&&Y({kind:"ui-render",taskId:o,part:{kind:"data",data:{type:"ui",spec:O}},handler:oe["ui-render"],isHistory:!0,historyId:p,messageId:u,status:{message:s}});}catch{}return}}let E=oe[C];E&&Y({kind:C,taskId:o,part:A,handler:E,isHistory:true,historyId:p,messageId:u,status:{message:s}});},V=async(s,o,u=false,p=0,A=false,C=h)=>{h=C,Z(),I(),L(C,{requestState:"submitting",runtimeError:null,status:"submitted"});let E=ve();y=E,u&&(ue(),K(true),g());let T=false,w=false,O=false,$=false,U=o?.taskId||null,ee=q.sendMessage(s,{taskId:o?.taskId,signal:E.signal,preferMiniProgramRequest:A,onMessage:W=>{let ge=W?.result?.taskId,N=!!W?.result?.final;ge&&(U=ge),N&&($=true),T=true,L(C,{requestState:N?"idle":"streaming",runtimeError:null,status:N?"completed":"working"}),v(W);},onClose:()=>{}});let ce=async()=>{if(Me()&&!!httpClient.getMiniProgramRequest()&&!O&&!$&&p<2){console.log("[recovering]"),L(C,{requestState:"recovering",runtimeError:null,status:"working"}),g();try{let N=await q.getChatStatus(U||void 0);if(N.working&&N.taskId)return S=N.taskId,await V([],{taskId:N.taskId},!0,p+1,!0,C),!0;if(!T&&!U&&!N.taskId&&p<1)return await V(s,o,!0,p+1,!0,C),!0}catch(N){return console.error("[ConversationController] recovery failed:",N),l(N,"recovery",C),true}}return false},de,Ce=false;try{await ee;}catch(W){W?.name==="AbortError"||E.signal.aborted?O=true:(w=true,de=W,console.error("[ConversationController] Stream error:",W));}finally{y===E&&(y=null),Ce=await ce();}Ce||(w?l(de,"stream",C):!T&&u&&!O?l(de,"send",C):O?(j(C),C&&h===C&&(h=null),K(false),g()):$&&n.isLoading?se():!$&&n.isLoading&&l(void 0,"stream",C));};return {getSnapshot(){return fe(n)},subscribe(s){return m.add(s),()=>{m.delete(s);}},async init(){if(!R)return P||(n.starting=true,g(),P=(async()=>{try{if(i&&await this.loadHistory(),c){let s=await q.getChatStatus();s.taskId&&s.working&&(S=s.taskId,await V([],{taskId:s.taskId},!1));}}catch(s){console.error("[ConversationController] init failed:",s);}finally{n.starting=false,g(),P=null;}})(),P)},destroy(){R=true,Z(),m.clear();},async sendMessage(s){if(n.isLoading||!s.trim())return;a&&(this.abort(),X(),I(),S=null,G());let o=Q();h=o,J({taskId:o,status:"submitted",requestState:"submitting",runtimeError:null,messages:[{messageId:Q(),role:"user",kind:"text-content",content:s,timestamp:f()}],lastUpdated:f()});try{await V([{role:"user",content:s}],void 0,!0,0,!1,o);}catch(u){if(u.name==="AbortError")return;l(u,"send",o);}},abort(){let s=y?.signal.aborted;Z(),I(),j(h),h=null,S=null,ne(),s||Promise.resolve();},async cancelChat(s){let o=s||S;if(this.abort(),J({taskId:Q(),status:"error",messages:[{messageId:`cancel-${Date.now()}`,role:"assistant",kind:"text-content",content:t.strings.cancelled,timestamp:f()}],lastUpdated:f()}),!!o)try{await q.cancelChat(o),S=null;}catch(u){console.error("[ConversationController] cancel failed:",u);}},resetConversation(s){if(this.abort(),X(),h=null,S=null,I(),a&&G(),s){let o=`conv-${Date.now()}`;n.byId[o]={taskId:o,status:"submitted",messages:[{messageId:`greeting-${Date.now()}`,role:"assistant",kind:"text-content",content:s,timestamp:f()}],lastUpdated:f()},n.order=[o];}g();},async startNewConversation(){J({taskId:Q(),status:"submitted",messages:[],lastUpdated:f(),system:{level:"newConversation"}});try{await q.newConversation();}catch(s){console.error("[ConversationController] newConversation failed:",s);}},async loadHistory(s=20,o){n.isLoadingHistory=true,g();try{let u=await q.getHistory(s,o),p=u?.messages||[],A="",C="",E=[];p.forEach(T=>{let w=T.role==="agent"?"assistant":"user";w!==C&&(A=`history-conv-${Q()}`,E.push(A),C=w),F(T,A);}),n.order=[...E,...n.order.filter(T=>!E.includes(T))],n.historyState={next:u?.next||null,hasMore:u?.hasMore||!1};}catch(u){console.error("[ConversationController] loadHistory failed:",u);}finally{n.isLoadingHistory=false,g();}},async loadMoreHistory(){!n.historyState.hasMore||n.isLoadingHistory||!n.historyState.next||await this.loadHistory(20,n.historyState.next);},getConversation(s){let o=n.byId[s];return o?pe(o):void 0},clearConversation(s){re(s);},removeMessage(s,o){let u=n.byId[s];u&&(n.byId[s]={...u,messages:u.messages.filter(p=>p.messageId!==o),lastUpdated:f()},k(s,true),g());},updateMessage(s){let{taskId:o,messageId:u,content:p,partial:A=false,status:C,response:E,metadata:T={}}=s,w=n.byId[o];if(!w)return;let O=w.messages.findIndex(ce=>ce.messageId===u);if(O===-1)return;let $=w.messages[O];if(!$)return;let U={...$,...T};p!==void 0&&("content"in U?U.content=A?`${U.content||""}${p}`:p:"thought"in U?U.thought=A?`${U.thought||""}${p}`:p:$.kind==="text-content"&&(U.content=A?`${$.content||""}${p}`:p)),("toolStatus"in U||C)&&(U.toolStatus=C||U.toolStatus),E!==void 0&&(U.response=E);let ee=[...w.messages];ee[O]=U,n.byId[o]={...w,messages:ee,lastUpdated:f()},k(o,true),g();}}}function B(){let e=typeof globalThis<"u"?globalThis.crypto:void 0;return e&&typeof e.randomUUID=="function"?e.randomUUID():e&&typeof e.getRandomValues=="function"?"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let a=(e.getRandomValues(new Uint8Array(1))[0]??0)%16;return (t==="x"?a:a&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let r=Math.random()*16|0;return (t==="x"?r:r&3|8).toString(16)})}function ke(e){let t=/^www\.([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(e);if(t?.[1])return t[1];let r=/^([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(e);return r?.[1]?r[1]:null}function $e(){if(typeof window>"u")return null;try{let e=window.location.href,t=/\/app\/([\da-z-]+)(?:\/|$)/.exec(e);return t?.[1]?t[1]:ke(window.location.hostname)}catch{return null}}var Se=null,Ne=null;function Ie(e){let t=e?ke(e):$e();return t||(Se||(Se=B()),Se)}function Te(e,t){return (r="conversation")=>{let a=ae(),i=Ie();if(a){let n=e?e.replace(/^https?:\/\//,"").split("/")[0]:"";i=Ie(n);}let c=t?.()??Ne??(Ne=`anonymous-${B()}`),d=`${i}:${c}`;return r==="single-turn"?`${d}:${B()}`:d}}function we(e){return typeof e=="string"?[{kind:"text",text:e}]:e.map(t=>{switch(t.type){case "text":return {kind:"text",text:t.text};case "image":return t.data?{kind:"file",file:{bytes:t.data,mimeType:t.mimeType||"image/png"}}:t.url?{kind:"file",file:{uri:t.url,mimeType:t.mimeType||"image/png"}}:null;case "file":return t.data?{kind:"file",file:{bytes:t.data,...t.mimeType&&{mimeType:t.mimeType},...t.name&&{name:t.name}}}:t.url?{kind:"file",file:{uri:t.url,...t.mimeType&&{mimeType:t.mimeType},...t.name&&{name:t.name}}}:null;default:return null}}).filter(t=>t!==null)}function Ae(e){return typeof e=="string"?e:e.filter(t=>t.type==="text").map(t=>t.text).join(`
2
- `)}function Ee(e){return {createContextId(t){return e.createContextId(t)},createScopedRuntime(t){return e.createRuntime(t)}}}function Pe({createContextId:e,postRpc:t,sendMessageStream:r}){return Ee({createContextId:e,createRuntime(a){return {async sendMessage(i,c){let{taskId:d,signal:n,onOpen:m,onMessage:y,onClose:x,preferMiniProgramRequest:S}=c,b=i.find(h=>h.role==="system"),M=i.filter(h=>h.role!=="system"),P=M[M.length-1],R=P?we(P.content):[{kind:"text",text:""}],D=b?Ae(b.content):void 0,q={jsonrpc:"2.0",id:B(),method:"message/stream",params:{message:{contextId:a,kind:"message",messageId:B(),role:"user",parts:R,...d?{taskId:d}:{},...D?{metadata:{systemPrompt:D}}:{}}}};await r(q,{onOpen:m,onMessage:y,onClose:x},n,S);},cancelChat(i){let c={jsonrpc:"2.0",id:B(),method:"tasks/cancel",params:{id:i}};return t(c)},async getHistory(i=50,c){try{let n=(await t({jsonrpc:"2.0",method:"messages/list",id:B(),params:{filter:{contextId:a},limit:i,...c?{next:c}:{}}}))?.data?.result||{},m=n?.messages||[],y=n?.next||"";return {messages:m,next:y,hasMore:!!y}}catch{return}},async newConversation(){try{await t({jsonrpc:"2.0",method:"messages/clear",id:B(),params:{contextId:a}});}catch{}},async getChatStatus(i){try{let c={jsonrpc:"2.0",id:B(),method:"tasks/get",params:i?{id:i}:{contextId:a}},n=(await t(c))?.data?.result;return {working:n?.status?.state==="working",taskId:n?.id,error:n?.error?.message||""}}catch(c){return {working:false,error:c?.message||""}}}}}})}function Ve(e){if(e instanceof Error)return e;if(e&&typeof e=="object"){let t=e,r=typeof t.errMsg=="string"&&t.errMsg||typeof t.message=="string"&&t.message||JSON.stringify(t),a=new Error(r);return (typeof t.errorCode=="number"||typeof t.errorCode=="string")&&(a.errorCode=t.errorCode),(typeof t.errNo=="number"||typeof t.errNo=="string")&&(a.errNo=t.errNo),a.raw=e,a}return new Error(String(e))}function ie(){if(typeof DOMException<"u")return new DOMException("Aborted","AbortError");let e=new Error("Aborted");return e.name="AbortError",e}function le(e){return eventsourceParser.createParser({onEvent:t=>{try{e.onMessage(JSON.parse(t.data));}catch(r){console.error("[copilot stream] failed to parse SSE event:",r,t.data);}}})}function Ue(e,t){if(e){if(e.aborted){t();return}e.addEventListener("abort",t);}}async function Le(e,t,r,a,i){let c={"Content-Type":"application/json",...r},d=await fetch(e,{method:"POST",headers:c,credentials:"include",body:JSON.stringify(t),signal:i});if(!d.ok)throw new Error(`Stream request failed: ${d.statusText||d.status}`);if(a.onOpen?.(),!d.body){a.onClose?.();return}let n=d.body.getReader(),m=new TextDecoder,y=le(a);try{for(;;){if(i?.aborted)throw ie();let{done:x,value:S}=await n.read();if(x)break;y.feed(m.decode(S,{stream:!0}));}}finally{a.onClose?.();}}function Be(e,t){if(!e)return "";let r=e instanceof Uint8Array?e:new Uint8Array(e);return r.length===0?"":t.decode(r,{stream:false})}async function he(e,t,r={},a,i){return new Promise((c,d)=>{let n=new Uint8Array(0),m=new je__default.default("utf-8",{fatal:false}),y=false,x=false,S=false,b=le(a),M=g=>{if(!x){if(x=true,g){d(Ve(g));return}a.onClose?.(),c();}},P=()=>{S||(S=true,a.onOpen?.());},R=g=>{g&&(P(),b.feed(g));},D=g=>{if(!(x||!g.data))try{y=!0;let H=new Uint8Array(g.data),k=new Uint8Array(n.length+H.length);k.set(n),k.set(H,n.length),n=k;let I=0;for(;I<n.length;){let z=n.subarray(I),_=m.decode(z,{stream:!1});if(_.length===0)break;if(_.includes("\uFFFD")){let L=_.lastIndexOf("\uFFFD")===0?0:_.indexOf("\uFFFD");if(L<=0)break;let j=_.slice(0,L);j&&R(j);let X=new TextEncoder().encode(j);I+=X.length;break}R(_),I+=z.length;}n=n.subarray(I);}catch(H){console.error("[mini stream] chunk process error:",H);}},q=g=>{P(),g.header?.["content-type"]?.includes("text/event-stream")===false&&console.warn("Warning: server did not return event-stream");},h=httpClient.getMiniProgramRequest();if(!h){d(new Error("Mini-program request API not found"));return}try{let g=h({url:e,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...r},data:typeof t=="string"?t:JSON.stringify(t),responseType:"arraybuffer",...be()?{enableChunked:!0}:{},success:H=>{if(!y&&H?.data){let k=Be(H.data,m);R(k);}if(n.length>0){let k=m.decode(n,{stream:!0});R(k);}M();},fail:H=>{M(H);}});Ue(i,()=>{g.abort?.(),M(ie());}),g.onChunkReceived?.(D),g.onHeadersReceived?.(q);}catch(g){M(g);}})}async function He(e,t,r,a,i,c=false){let d=r?.(),n=d?{Authorization:`Bearer ${d}`}:{},m=httpClient.getMiniProgramRequest(),y=ae()&&!!m;if(c&&y){await he(e,t,n,a,i);return}if(y){await he(e,t,n,a,i);return}await Le(e,t,n,a,i);}function ze(e,t,r,a){let i="";try{i=process.env.TARO_APP_API_BASE_URL||process.env.VITE_API_BASE_URL||process.env.API_BASE_URL||"";}catch{}i=String(i||"").trim();let c=`${t||i}/api/proxy/builtin/platform/copilot`,d=x=>e.request({url:c,method:"POST",data:x}),n=Te(c,a);async function m(x,S,b,M){try{await He(c,x,r,S,b,M);}catch(P){if(b?.aborted)return;throw P}}let y=Pe({createContextId:n,postRpc:d,sendMessageStream:m});return {createConversationController(x){return Re(y,x)}}}var Ke=/[\n。!?.!?;;]/,We=/[,、,::]\s*$/;var qe=e=>{if(!e)return null;for(let t=e.messages.length-1;t>=0;t-=1){let r=e.messages[t];if(r&&r.role==="assistant"&&(r.kind==="text-content"||r.kind==="message")&&r.content?.trim())return r}return null},Ge=e=>{if(!e)return null;for(let t=e.messages.length-1;t>=0;t-=1){let r=e.messages[t];if(r&&r.role==="user"&&r.messageId)return r.messageId}return null},Oe=(e,t)=>{if(!e)return null;if(!t)return qe(e);let r=e.messages.findIndex(a=>a.messageId===t);if(r<0)return qe(e);for(let a=e.messages.length-1;a>r;a-=1){let i=e.messages[a];if(i&&i.role==="assistant"&&(i.kind==="text-content"||i.kind==="message")&&i.content?.trim())return i}return null},Je=e=>{for(let t=e.length-1;t>=0;t-=1){let r=e[t];if(r&&(r.requestState==="submitting"||r.requestState==="streaming"||r.requestState==="recovering"||r.status==="submitted"||r.status==="working"))return r}return null},Ye=(e,t)=>t&&e.find(r=>r.taskId===t)||null,Qe=(e,t)=>{let r=e.trimStart();if(!r)return {segments:[],remainder:""};if(t)return {segments:[r].filter(Boolean),remainder:""};let a=[],i=0;for(let d=0;d<r.length;d+=1){let n=r[d];if(!n||!Ke.test(n))continue;let m=r.slice(i,d+1).trim();m&&a.push(m),i=d+1;}let c=r.slice(i).trimStart();return c.length>=24&&We.test(c)&&(a.push(c.trim()),c=""),{segments:a,remainder:c}};function Xe(e){let{source:t,speech:r,storage:a,enabledStorageKey:i,defaultVoice:c=null,id:d="auto-voice-reply",audioFormat:n="pcm",sampleRate:m=24e3,preprocessText:y}=e,x=false,S=i?a?.getItem(i)==="true":false,b=t.getSnapshot().isLoading,M=null,P=null,R=null,D=false,q=null,h="",g="",H=Promise.resolve(),k=r.getVoice?.()??c,I={enabled:S,status:r.getSnapshot().status,connecting:r.getSnapshot().status==="connecting",speaking:r.getSnapshot().status==="speaking",voice:k,activeTaskId:M,suppressedTaskId:R,error:r.getSnapshot().error||null},z=new Set,_=()=>{let l=r.getSnapshot(),v={enabled:S,status:l.status,connecting:l.status==="connecting",speaking:l.status==="speaking",voice:k,activeTaskId:M,suppressedTaskId:R,error:l.error||null},F=I.enabled!==v.enabled||I.status!==v.status||I.connecting!==v.connecting||I.speaking!==v.speaking||I.voice!==v.voice||I.activeTaskId!==v.activeTaskId||I.suppressedTaskId!==v.suppressedTaskId||I.error!==v.error;return F&&(I=v),F},L=()=>{x||(_(),z.forEach(l=>l()));},j=()=>{i&&a?.setItem(i,S?"true":"false");},X=(l=null)=>{q=l,h="",g="",D=false;},K=()=>{M=null,P=null;},G=l=>{let v=l?.preserveRoundContext??false;h="",g="",q=null,D=false,v||K(),r.stop();},Z=l=>(H=H.then(()=>l(),()=>l()),H),se=async l=>{if(!(!l.length||x)){D||(await r.startStream({id:d,voice:k,audioFormat:n,sampleRate:m}),D=true);for(let v of l){if(x)return;let F=y?y(v):v;F.trim()&&(await r.appendText({id:d,text:F}),r.commit());}}},J=async(l,v)=>{let F=l.messageId||null,V=l.content||"";if(!V.trim())return;q!==F&&X(F);let s=h;if(s&&!V.startsWith(s)){h=V;return}let o=V.slice(s.length);if(h=V,!o&&!v)return;g+=o;let{segments:u,remainder:p}=Qe(g,v);g=p,u.length&&await se(u),v&&r.finish();},re=()=>{if(x)return;let l=t.getSnapshot();if(!S){b=l.isLoading;return}let v=Je(l.conversations),F=b;if(l.isLoading&&v){if(v.taskId!==M&&(M=v.taskId,P=Ge(v),R=null),R===v.taskId){b=l.isLoading,L();return}let V=Oe(v,P);V&&Z(()=>J(V,false));}else if(F&&!l.isLoading){let V=Ye(l.conversations,M);if(V&&R!==V.taskId){let s=Oe(V,P);s&&Z(()=>J(s,true));}V?.taskId===R&&(R=null),K();}b=l.isLoading,L();},ue=t.subscribe(re),ne=r.subscribe(()=>{if(x)return;let l=r.getVoice?.()??k??c;l!==k&&(k=l),L();}),Y={subscribe(l){return z.add(l),()=>{z.delete(l);}},getSnapshot(){return _(),I},setEnabled(l){S!==l&&(S=l,j(),S?(b=t.getSnapshot().isLoading,re()):(G(),R=null),L());},toggleEnabled(){Y.setEnabled(!S);},toggleEnabledOrStop(){let l=r.getSnapshot().status;if(l==="connecting"||l==="speaking"){R=M,G({preserveRoundContext:true}),L();return}Y.toggleEnabled();},stop(){R=M,G({preserveRoundContext:true}),L();},setVoice(l){k=l,r.setVoice?.(l),L();},getVoice(){return k},destroy(){x||(x=true,G(),R=null,ue(),ne(),z.clear());}};return Y}exports.createAutoVoiceReplyController=Xe;exports.createCopilotClient=ze;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var httpClient=require('@amaster.ai/http-client'),eventsourceParser=require('eventsource-parser'),et=require('miniprogram-text-decoder');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var et__default=/*#__PURE__*/_interopDefault(et);var Se=class{constructor(){this.aborted=false;this.listeners=[];this.signal={aborted:false,addEventListener:(t,n)=>{this.listeners.push(n);}};}abort(){this.aborted||(this.aborted=true,this.signal.aborted=true,this.listeners.forEach(t=>t()));}};function we(){return typeof AbortController<"u"?new AbortController:new Se}function C(){return new Date().toISOString()}function Y(){return `msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function We(e){return {...e}}function Me(e){return {...e,system:e.system?{...e.system}:void 0,runtimeError:e.runtimeError?{...e.runtimeError}:void 0,messages:e.messages.map(t=>We(t))}}function be(e){return {starting:e.starting,isLoading:e.isLoading,isLoadingHistory:e.isLoadingHistory,historyState:{...e.historyState},conversations:e.order.map(t=>e.byId[t]).filter(t=>!!t).map(t=>Me(t))}}function oe(e,t){for(let n=e.messages.length-1;n>=0;n-=1){let o=e.messages[n];if(o&&t(o))return n}return -1}function Ke(e){return e.kind==="text-content"||e.kind==="message"}function Ge(e){let t=e?.file;return t?{name:t.name||"\u672A\u547D\u540D\u6587\u4EF6",mimeType:t.mimeType,url:t.uri,size:typeof e?.metadata?.size=="number"?e.metadata.size:typeof t?.size=="number"?t.size:void 0}:null}var de={"text-content":(e,t,n,o,l)=>{if(!n)return e;let a=oe(e,s=>s.messageId===n&&Ke(s)),d=t.text||"";if(a>=0){let s=e.messages[a];return {...e,messages:e.messages.map(u=>u===e.messages[a]?{...u,content:s.content+d}:u),lastUpdated:C()}}return {...e,messages:[...e.messages,{messageId:n,role:o,kind:"text-content",content:d,timestamp:l?.timestamp||C()}],lastUpdated:C()}},"file-content":(e,t,n,o,l)=>{if(!n)return e;let a=Ge(t);return !a||oe(e,s=>s.messageId===n&&s.kind==="file-content")>=0?e:{...e,messages:[...e.messages,{messageId:n,role:o,kind:"file-content",files:[a],timestamp:l?.timestamp||C()}],lastUpdated:C()}},thought:(e,t,n,o,l)=>{if(!n)return e;let a=t?.data?.description||"",d=oe(e,s=>s.messageId===n&&s.kind==="thought");if(d>=0){let s=e.messages[d];return {...e,messages:e.messages.map(u=>u===e.messages[d]?{...u,thought:s.thought+a}:u),lastUpdated:C()}}return {...e,messages:[...e.messages,{messageId:n,role:o,kind:"thought",thought:a,timestamp:l?.timestamp||C()}],lastUpdated:C()}},tool:(e,t,n,o,l)=>{let a=t?.data||{},d=a?.tool,s=d?.displayName||d?.name||"",u=a?.request,h=u?.callId;if(!h||!s)return e;let y=a?.status,x=oe(e,b=>b.messageId===h&&b.kind==="tool");if(x>=0){let b=e.messages[x];return {...e,messages:e.messages.map(v=>v===e.messages[x]?{...v,toolStatus:y||b.toolStatus}:v),lastUpdated:C()}}return {...e,messages:[...e.messages,{messageId:h,role:o,kind:"tool",toolName:s,toolDescription:u?.args?.query||"",toolStatus:y||"pending",timestamp:l?.timestamp||C()}],lastUpdated:C()}},error:(e,t,n,o)=>{let l=t?.text||t?.data?.error||"\u53D1\u751F\u9519\u8BEF";return {...e,messages:[...e.messages,{messageId:n||`error-${Date.now()}`,role:o,kind:"error",content:l,timestamp:C()}],status:"error",lastUpdated:C()}},"ui-render":(e,t,n,o,l)=>{if(!n)return e;let a=oe(e,u=>u.messageId===n&&u.kind==="ui-render"),s=(t?.data||{}).spec||{root:"",elements:{}};return a>=0?{...e,messages:e.messages.map(u=>u===e.messages[a]?{...u,spec:s}:u),lastUpdated:C()}:{...e,messages:[...e.messages,{messageId:n,role:o,kind:"ui-render",spec:s,timestamp:l?.timestamp||C()}],lastUpdated:C()}}};function ve(e,t){return e?.data?.tool?"tool":e?.data?.type==="ui"?"ui-render":e?.kind==="text"?"text-content":e?.kind==="file"?"file-content":e?.data?.type==="though"||t?.coderAgent?.kind==="thought"?"thought":t?.error?"error":"unknown"}function Je(e,t){if(typeof e=="string"){let n=e.trim().toUpperCase();if(n==="TT"||n==="DOUYIN"||n==="WEAPP"||n==="WECHAT")return true}return t?typeof t.TT<"u"&&e===t.TT||typeof t.WEAPP<"u"&&e===t.WEAPP:false}function ge(){let e=httpClient.resolveMiniProgramGlobals();return Je(e?.Taro?.getEnv?.(),e?.Taro?.ENV_TYPE)?true:typeof e?.wx?.request=="function"||typeof e?.tt?.request=="function"||typeof e?.my?.request=="function"||typeof e?.swan?.request=="function"||typeof e?.qq?.request=="function"||typeof e?.jd?.request=="function"}function Ae(){let e=httpClient.resolveMiniProgramGlobals();return !(typeof e?.tt?.request=="function"||typeof e?.tt?.createEventSource=="function")}function Ee(){return typeof httpClient.resolveMiniProgramGlobals()?.tt?.createEventSource=="function"}function Fe(e,t){let o=(t.mode||"conversation")==="single-turn",l=!o,a=!o,d=()=>t.getContextId?.()??e.createContextId(o?"single-turn":"conversation"),s={byId:{},order:[],starting:true,isLoading:false,isLoadingHistory:false,historyState:{next:null,hasMore:false}},u=new Set,h=null,x=null,b="unknown",v="",L=null,k=false,$=d(),O=e.createScopedRuntime($),S=null,m=()=>{if(k)return;let r=be(s);u.forEach(i=>i(r));},V=r=>{s.order=s.order.filter(i=>i!==r);},w=(r,i=true)=>{V(r),s.order=i?[...s.order,r]:[r,...s.order];},T=()=>{b="unknown",v="";},B=(r,i)=>{let c=r?.file||{};return [c.uri,c.name,c.mimeType,r?.metadata?.size,c.size].filter(Boolean).join("::")||`part-${i??0}`},_=({messageId:r,kind:i,part:c,partIndex:p})=>r?i==="file-content"?`${r}::file::${B(c,p)}`:i==="text-content"?`${r}::text`:`${r}::${i}`:"",z=r=>{let i=r&&typeof r=="object"?r:{},c=String(i.message||i.errMsg||"").toLowerCase(),p=String(i.errorCode||""),A=String(i.errNo||"");return i.name==="TypeError"||/failed to fetch|fetch failed|timed out|disconnected|offline|断网/.test(c)||["600009","21101","21102","21103"].includes(p)||["600009","21101","21102","21103"].includes(A)},Q=(r,i="stream")=>{let c=r&&typeof r=="object"?r:{},p=String(c.message||c.errMsg||"").toLowerCase();return {code:z(r)?"network":"unknown",message:p,retryable:true,source:i,timestamp:C()}},N=(r,i)=>{if(!r)return;let c=s.byId[r];c&&(s.byId[r]={...c,requestState:i.requestState??c.requestState,runtimeError:i.runtimeError===void 0?c.runtimeError:i.runtimeError,status:i.status??c.status,lastUpdated:C()});},X=r=>{N(r,{requestState:"idle",runtimeError:null});},Z=()=>{s.byId={},s.order=[],s.historyState={next:null,hasMore:false};},W=r=>{s.isLoading=r,!r&&g();},ae=()=>($=d(),O=e.createScopedRuntime($),$),ee=()=>{h?.abort(),h=null,X(S),W(false),m();},re=()=>{T(),X(S),S&&N(S,{status:"completed"}),S=null,x=null,h=null,W(false),m();},te=r=>{s.byId[r.taskId]=r,w(r.taskId,true),m();},ie=r=>{s.byId[r]&&(delete s.byId[r],V(r),m());},se=()=>{te({taskId:"loading-placeholder",status:"working",messages:[{messageId:"loading-placeholder",role:"assistant",kind:"text-content",content:t.strings.thinking,timestamp:C()}],lastUpdated:C()});},g=()=>{ie("loading-placeholder");},M=({kind:r,taskId:i,part:c,status:p,handler:A,isHistory:f,historyId:I,messageId:E,partIndex:F})=>{let P=E?_({messageId:E,kind:r,part:c,partIndex:F}):v,U=p?.message?.role==="agent"?"assistant":"user";!E&&(r==="ui-render"||r==="file-content"||r!=="unknown"&&r!==b)&&(b=r,P=Y(),v=P);let R=s.byId[i]??{taskId:i,status:f?"completed":"submitted",messages:[],role:U,historyId:I,lastUpdated:C()},G=A(R,c,P,U,p);s.byId[i]={...G,status:p?.state||R.status,lastUpdated:C()},f||w(i,true),m();},H=(r,i="stream",c=S)=>{N(c,{requestState:"error",runtimeError:Q(r,i),status:"error"}),c&&S===c&&(S=null),W(false),m();},q=r=>{if(!r?.result)return;let i=r.result,{taskId:c,status:p,metadata:A,final:f}=i;if(f){re();return}if(!c)return;x=c;let I=p?.message?.parts||[],E=false;I.forEach((F,P)=>{let U=ve(F,A),R=de[U];R&&(U!=="unknown"&&(E=true),M({kind:U,taskId:c,part:F,status:p,handler:R,partIndex:P}));}),E&&g();},K=(r,i)=>{let{messageId:c,historyId:p}=r||{};if(!c)return;(r.parts||[]).forEach((f,I)=>{let E=ve(f);if(E==="text-content"){let P=f.text||"";if(P=P.trim(),P.startsWith("<ui>")){let U=P.slice(4).trim();try{let R=JSON.parse(U);R.root&&R.elements&&M({kind:"ui-render",taskId:i,part:{kind:"data",data:{type:"ui",spec:R}},handler:de["ui-render"],isHistory:!0,historyId:p,messageId:c,status:{message:r},partIndex:I});}catch{}return}}let F=de[E];F&&M({kind:E,taskId:i,part:f,handler:F,isHistory:true,historyId:p,messageId:c,status:{message:r},partIndex:I});});},le=(r,i)=>{let c=r.trim();return i?.length?[...c?[{type:"text",text:c}]:[],...i]:c},ue=r=>{if(r?.length)return r.map(i=>({name:i.name||"\u672A\u547D\u540D\u6587\u4EF6",size:i.size,mimeType:i.mimeType,url:i.url}))},ye=(r,i)=>{let c=[],p=r.trim(),A=ue(i)||[];return p&&c.push({messageId:Y(),role:"user",kind:"text-content",content:p,timestamp:C()}),A.length&&c.push({messageId:Y(),role:"user",kind:"file-content",files:A.map((f,I)=>({...f,id:f.id||`local-file-${I}`})),timestamp:C()}),c},ce=async(r,i,c=false,p=0,A=false,f=S)=>{S=f,ee(),T(),N(f,{requestState:"submitting",runtimeError:null,status:"submitted"});let I=we();h=I,c&&(se(),W(true),m());let E=false,F=false,P=false,U=false,R=i?.taskId||null,G=O.sendMessage(r,{taskId:i?.taskId,signal:I.signal,preferMiniProgramRequest:A,onMessage:J=>{let he=J?.result?.taskId,D=!!J?.result?.final;he&&(R=he),D&&(U=true),E=true,N(f,{requestState:D?"idle":"streaming",runtimeError:null,status:D?"completed":"working"}),q(J);},onClose:()=>{}});let xe=async()=>{if(Ee()&&!!httpClient.getMiniProgramRequest()&&!P&&!U&&p<2){console.log("[recovering]"),N(f,{requestState:"recovering",runtimeError:null,status:"working"}),m();try{let D=await O.getChatStatus(R||void 0);if(D.working&&D.taskId)return x=D.taskId,await ce([],{taskId:D.taskId},!0,p+1,!0,f),!0;if(!E&&!R&&!D.taskId&&p<1)return await ce(r,i,!0,p+1,!0,f),!0}catch(D){return console.error("[ConversationController] recovery failed:",D),H(D,"recovery",f),true}}return false},Ce,Te=false;try{await G;}catch(J){J?.name==="AbortError"||I.signal.aborted?P=true:(F=true,Ce=J,console.error("[ConversationController] Stream error:",J));}finally{h===I&&(h=null),Te=await xe();}Te||(F?H(Ce,"stream",f):!E&&c&&!P?H(Ce,"send",f):P?(X(f),f&&S===f&&(S=null),W(false),m()):U&&s.isLoading?re():!U&&s.isLoading&&H(void 0,"stream",f));};return {getSnapshot(){return be(s)},subscribe(r){return u.add(r),()=>{u.delete(r);}},async init(){if(!k)return L||(s.starting=true,m(),L=(async()=>{try{if(l&&await this.loadHistory(),a){let r=await O.getChatStatus();r.taskId&&r.working&&(x=r.taskId,await ce([],{taskId:r.taskId},!1));}}catch(r){console.error("[ConversationController] init failed:",r);}finally{s.starting=false,m(),L=null;}})(),L)},destroy(){k=true,ee(),u.clear();},async sendMessage(r,i){let c=i?.files?.filter(I=>I.data||I.url)||[],p=!!r.trim(),A=c.length>0;if(s.isLoading||!p&&!A)return;o&&(this.abort(),Z(),T(),x=null,ae());let f=Y();S=f,te({taskId:f,status:"submitted",requestState:"submitting",runtimeError:null,messages:ye(r,c),lastUpdated:C()});try{await ce([{role:"user",content:le(r,c)}],void 0,!0,0,!1,f);}catch(I){if(I.name==="AbortError")return;H(I,"send",f);}},abort(){let r=h?.signal.aborted;ee(),T(),X(S),S=null,x=null,g(),r||Promise.resolve();},async cancelChat(r){let i=r||x;if(this.abort(),te({taskId:Y(),status:"error",messages:[{messageId:`cancel-${Date.now()}`,role:"assistant",kind:"text-content",content:t.strings.cancelled,timestamp:C()}],lastUpdated:C()}),!!i)try{await O.cancelChat(i),x=null;}catch(c){console.error("[ConversationController] cancel failed:",c);}},resetConversation(r){if(this.abort(),Z(),S=null,x=null,T(),o&&ae(),r){let i=`conv-${Date.now()}`;s.byId[i]={taskId:i,status:"submitted",messages:[{messageId:`greeting-${Date.now()}`,role:"assistant",kind:"text-content",content:r,timestamp:C()}],lastUpdated:C()},s.order=[i];}m();},async startNewConversation(){te({taskId:Y(),status:"submitted",messages:[],lastUpdated:C(),system:{level:"newConversation"}});try{await O.newConversation();}catch(r){console.error("[ConversationController] newConversation failed:",r);}},async loadHistory(r=20,i){s.isLoadingHistory=true,m();try{let c=await O.getHistory(r,i),p=c?.messages||[],A="",f="",I=[];p.forEach(E=>{let F=E.role==="agent"?"assistant":"user";F!==f&&(A=`history-conv-${Y()}`,I.push(A),f=F),K(E,A);}),s.order=[...I,...s.order.filter(E=>!I.includes(E))],s.historyState={next:c?.next||null,hasMore:c?.hasMore||!1};}catch(c){console.error("[ConversationController] loadHistory failed:",c);}finally{s.isLoadingHistory=false,m();}},async loadMoreHistory(){!s.historyState.hasMore||s.isLoadingHistory||!s.historyState.next||await this.loadHistory(20,s.historyState.next);},getConversation(r){let i=s.byId[r];return i?Me(i):void 0},clearConversation(r){ie(r);},removeMessage(r,i){let c=s.byId[r];c&&(s.byId[r]={...c,messages:c.messages.filter(p=>p.messageId!==i),lastUpdated:C()},w(r,true),m());},updateMessage(r){let{taskId:i,messageId:c,content:p,partial:A=false,status:f,response:I,metadata:E={}}=r,F=s.byId[i];if(!F)return;let P=F.messages.findIndex(xe=>xe.messageId===c);if(P===-1)return;let U=F.messages[P];if(!U)return;let R={...U,...E};p!==void 0&&("content"in R?R.content=A?`${R.content||""}${p}`:p:"thought"in R?R.thought=A?`${R.thought||""}${p}`:p:U.kind==="text-content"&&(R.content=A?`${U.content||""}${p}`:p)),("toolStatus"in R||f)&&(R.toolStatus=f||R.toolStatus),I!==void 0&&(R.response=I);let G=[...F.messages];G[P]=R,s.byId[i]={...F,messages:G,lastUpdated:C()},w(i,true),m();}}}function j(){let e=typeof globalThis<"u"?globalThis.crypto:void 0;return e&&typeof e.randomUUID=="function"?e.randomUUID():e&&typeof e.getRandomValues=="function"?"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let o=(e.getRandomValues(new Uint8Array(1))[0]??0)%16;return (t==="x"?o:o&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let n=Math.random()*16|0;return (t==="x"?n:n&3|8).toString(16)})}function Le(e){let t=/^www\.([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(e);if(t?.[1])return t[1];let n=/^([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(e);return n?.[1]?n[1]:null}function Ye(){if(typeof window>"u")return null;try{let e=window.location.href,t=/\/app\/([\da-z-]+)(?:\/|$)/.exec(e);return t?.[1]?t[1]:Le(window.location.hostname)}catch{return null}}var Re=null,Qe=null;function Pe(e){let t=e?Le(e):Ye();return t||(Re||(Re=j()),Re)}function Ue(e,t){return (n="conversation")=>{let o=ge(),l=Pe();if(o){let s=e?e.replace(/^https?:\/\//,"").split("/")[0]:"";l=Pe(s);}let a=t?.()??Qe??(Qe=`anonymous-${j()}`),d=`${l}:${a}`;return n==="single-turn"?`${d}:${j()}`:d}}function Xe(e){let t={...e.size!==void 0?{size:e.size}:{}};return e.data?{kind:"file",file:{bytes:e.data,...e.mimeType&&{mimeType:e.mimeType},...e.name&&{name:e.name}},...Object.keys(t).length>0?{metadata:t}:{}}:e.url?{kind:"file",file:{uri:e.url,...e.mimeType&&{mimeType:e.mimeType},...e.name&&{name:e.name}},...Object.keys(t).length>0?{metadata:t}:{}}:null}function Ve(e){return typeof e=="string"?[{kind:"text",text:e}]:e.map(t=>{switch(t.type){case "text":return {kind:"text",text:t.text};case "image":return t.data?{kind:"file",file:{bytes:t.data,mimeType:t.mimeType||"image/png"}}:t.url?{kind:"file",file:{uri:t.url,mimeType:t.mimeType||"image/png"}}:null;case "file":return Xe(t);default:return null}}).filter(t=>t!==null)}function He(e){return typeof e=="string"?e:e.filter(t=>t.type==="text").map(t=>t.text).join(`
2
+ `)}function Oe(e){return {createContextId(t){return e.createContextId(t)},createScopedRuntime(t){return e.createRuntime(t)}}}function qe({createContextId:e,postRpc:t,sendMessageStream:n}){return Oe({createContextId:e,createRuntime(o){return {async sendMessage(l,a){let{taskId:d,signal:s,onOpen:u,onMessage:h,onClose:y,preferMiniProgramRequest:x}=a,b=l.find(S=>S.role==="system"),v=l.filter(S=>S.role!=="system"),L=v[v.length-1],k=L?Ve(L.content):[{kind:"text",text:""}],$=b?He(b.content):void 0,O={jsonrpc:"2.0",id:j(),method:"message/stream",params:{message:{contextId:o,kind:"message",messageId:j(),role:"user",parts:k,...d?{taskId:d}:{},...$?{metadata:{systemPrompt:$}}:{}}}};await n(O,{onOpen:u,onMessage:h,onClose:y},s,x);},cancelChat(l){let a={jsonrpc:"2.0",id:j(),method:"tasks/cancel",params:{id:l}};return t(a)},async getHistory(l=50,a){try{let s=(await t({jsonrpc:"2.0",method:"messages/list",id:j(),params:{filter:{contextId:o},limit:l,...a?{next:a}:{}}}))?.data?.result||{},u=s?.messages||[],h=s?.next||"";return {messages:u,next:h,hasMore:!!h}}catch{return}},async newConversation(){try{await t({jsonrpc:"2.0",method:"messages/clear",id:j(),params:{contextId:o}});}catch{}},async getChatStatus(l){try{let a={jsonrpc:"2.0",id:j(),method:"tasks/get",params:l?{id:l}:{contextId:o}},s=(await t(a))?.data?.result;return {working:s?.status?.state==="working",taskId:s?.id,error:s?.error?.message||""}}catch(a){return {working:false,error:a?.message||""}}}}}})}function $e(e){if(e instanceof Error)return e;if(e&&typeof e=="object"){let t=e,n=typeof t.errMsg=="string"&&t.errMsg||typeof t.message=="string"&&t.message||JSON.stringify(t),o=new Error(n);return (typeof t.errorCode=="number"||typeof t.errorCode=="string")&&(o.errorCode=t.errorCode),(typeof t.errNo=="number"||typeof t.errNo=="string")&&(o.errNo=t.errNo),o.raw=e,o}return new Error(String(e))}function me(){if(typeof DOMException<"u")return new DOMException("Aborted","AbortError");let e=new Error("Aborted");return e.name="AbortError",e}function pe(e){return eventsourceParser.createParser({onEvent:t=>{try{e.onMessage(JSON.parse(t.data));}catch(n){console.error("[copilot stream] failed to parse SSE event:",n,t.data);}}})}function ze(e,t){if(e){if(e.aborted){t();return}e.addEventListener("abort",t);}}async function De(e,t,n,o,l){let a={"Content-Type":"application/json",...n},d=await fetch(e,{method:"POST",headers:a,credentials:"include",body:JSON.stringify(t),signal:l});if(!d.ok)throw new Error(`Stream request failed: ${d.statusText||d.status}`);if(o.onOpen?.(),!d.body){o.onClose?.();return}let s=d.body.getReader(),u=new TextDecoder,h=pe(o);try{for(;;){if(l?.aborted)throw me();let{done:y,value:x}=await s.read();if(y)break;h.feed(u.decode(x,{stream:!0}));}}finally{o.onClose?.();}}function tt(e,t){if(!e)return "";let n=e instanceof Uint8Array?e:new Uint8Array(e);return n.length===0?"":t.decode(n,{stream:false})}async function ke(e,t,n={},o,l){return new Promise((a,d)=>{let s=new Uint8Array(0),u=new et__default.default("utf-8",{fatal:false}),h=false,y=false,x=false,b=pe(o),v=m=>{if(!y){if(y=true,m){d($e(m));return}o.onClose?.(),a();}},L=()=>{x||(x=true,o.onOpen?.());},k=m=>{m&&(L(),b.feed(m));},$=m=>{if(!(y||!m.data))try{h=!0;let V=new Uint8Array(m.data),w=new Uint8Array(s.length+V.length);w.set(s),w.set(V,s.length),s=w;let T=0;for(;T<s.length;){let B=s.subarray(T),_=u.decode(B,{stream:!1});if(_.length===0)break;if(_.includes("\uFFFD")){let z=_.lastIndexOf("\uFFFD")===0?0:_.indexOf("\uFFFD");if(z<=0)break;let Q=_.slice(0,z);Q&&k(Q);let N=new TextEncoder().encode(Q);T+=N.length;break}k(_),T+=B.length;}s=s.subarray(T);}catch(V){console.error("[mini stream] chunk process error:",V);}},O=m=>{L(),m.header?.["content-type"]?.includes("text/event-stream")===false&&console.warn("Warning: server did not return event-stream");},S=httpClient.getMiniProgramRequest();if(!S){d(new Error("Mini-program request API not found"));return}try{let m=S({url:e,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...n},data:typeof t=="string"?t:JSON.stringify(t),responseType:"arraybuffer",...Ae()?{enableChunked:!0}:{},success:V=>{if(!h&&V?.data){let w=tt(V.data,u);k(w);}if(s.length>0){let w=u.decode(s,{stream:!0});k(w);}v();},fail:V=>{v(V);}});ze(l,()=>{m.abort?.(),v(me());}),m.onChunkReceived?.($),m.onHeadersReceived?.(O);}catch(m){v(m);}})}async function _e(e,t,n,o,l,a=false){let d=n?.(),s=d?{Authorization:`Bearer ${d}`}:{},u=httpClient.getMiniProgramRequest(),h=ge()&&!!u;if(a&&h){await ke(e,t,s,o,l);return}if(h){await ke(e,t,s,o,l);return}await De(e,t,s,o,l);}function nt(e,t,n,o){let l="";try{l=process.env.TARO_APP_API_BASE_URL||process.env.VITE_API_BASE_URL||process.env.API_BASE_URL||"";}catch{}l=String(l||"").trim();let a=`${t||l}/api/proxy/builtin/platform/copilot`,d=y=>e.request({url:a,method:"POST",data:y}),s=Ue(a,o);async function u(y,x,b,v){try{await _e(a,y,n,x,b,v);}catch(L){if(b?.aborted)return;throw L}}let h=qe({createContextId:s,postRpc:d,sendMessageStream:u});return {createConversationController(y){return Fe(h,y)}}}var rt=/[\n。!?.!?;;]/,st=/[,、,::]\s*$/;var Ne=e=>{if(!e)return null;for(let t=e.messages.length-1;t>=0;t-=1){let n=e.messages[t];if(n&&n.role==="assistant"&&(n.kind==="text-content"||n.kind==="message")&&n.content?.trim())return n}return null},ot=e=>{if(!e)return null;for(let t=e.messages.length-1;t>=0;t-=1){let n=e.messages[t];if(n&&n.role==="user"&&n.messageId)return n.messageId}return null},je=(e,t)=>{if(!e)return null;if(!t)return Ne(e);let n=e.messages.findIndex(o=>o.messageId===t);if(n<0)return Ne(e);for(let o=e.messages.length-1;o>n;o-=1){let l=e.messages[o];if(l&&l.role==="assistant"&&(l.kind==="text-content"||l.kind==="message")&&l.content?.trim())return l}return null},at=e=>{for(let t=e.length-1;t>=0;t-=1){let n=e[t];if(n&&(n.requestState==="submitting"||n.requestState==="streaming"||n.requestState==="recovering"||n.status==="submitted"||n.status==="working"))return n}return null},it=(e,t)=>t&&e.find(n=>n.taskId===t)||null,lt=(e,t)=>{let n=e.trimStart();if(!n)return {segments:[],remainder:""};if(t)return {segments:[n].filter(Boolean),remainder:""};let o=[],l=0;for(let d=0;d<n.length;d+=1){let s=n[d];if(!s||!rt.test(s))continue;let u=n.slice(l,d+1).trim();u&&o.push(u),l=d+1;}let a=n.slice(l).trimStart();return a.length>=24&&st.test(a)&&(o.push(a.trim()),a=""),{segments:o,remainder:a}};function ut(e){let{source:t,speech:n,storage:o,enabledStorageKey:l,defaultVoice:a=null,id:d="auto-voice-reply",audioFormat:s="pcm",sampleRate:u=24e3,preprocessText:h}=e,y=false,x=l?o?.getItem(l)==="true":false,b=t.getSnapshot().isLoading,v=null,L=null,k=null,$=false,O=null,S="",m="",V=Promise.resolve(),w=n.getVoice?.()??a,T={enabled:x,status:n.getSnapshot().status,connecting:n.getSnapshot().status==="connecting",speaking:n.getSnapshot().status==="speaking",voice:w,activeTaskId:v,suppressedTaskId:k,error:n.getSnapshot().error||null},B=new Set,_=()=>{let g=n.getSnapshot(),M={enabled:x,status:g.status,connecting:g.status==="connecting",speaking:g.status==="speaking",voice:w,activeTaskId:v,suppressedTaskId:k,error:g.error||null},H=T.enabled!==M.enabled||T.status!==M.status||T.connecting!==M.connecting||T.speaking!==M.speaking||T.voice!==M.voice||T.activeTaskId!==M.activeTaskId||T.suppressedTaskId!==M.suppressedTaskId||T.error!==M.error;return H&&(T=M),H},z=()=>{y||(_(),B.forEach(g=>g()));},Q=()=>{l&&o?.setItem(l,x?"true":"false");},N=(g=null)=>{O=g,S="",m="",$=false;},X=()=>{v=null,L=null;},Z=g=>{let M=g?.preserveRoundContext??false;S="",m="",O=null,$=false,M||X(),n.stop();},W=g=>(V=V.then(()=>g(),()=>g()),V),ae=async g=>{if(!(!g.length||y)){$||(await n.startStream({id:d,voice:w,audioFormat:s,sampleRate:u}),$=true);for(let M of g){if(y)return;let H=h?h(M):M;H.trim()&&(await n.appendText({id:d,text:H}),n.commit());}}},ee=async(g,M)=>{let H=g.messageId||null,q=g.content||"";if(!q.trim())return;O!==H&&N(H);let K=S;if(K&&!q.startsWith(K)){S=q;return}let le=q.slice(K.length);if(S=q,!le&&!M)return;m+=le;let{segments:ue,remainder:ye}=lt(m,M);m=ye,ue.length&&await ae(ue),M&&n.finish();},re=()=>{if(y)return;let g=t.getSnapshot();if(!x){b=g.isLoading;return}let M=at(g.conversations),H=b;if(g.isLoading&&M){if(M.taskId!==v&&(v=M.taskId,L=ot(M),k=null),k===M.taskId){b=g.isLoading,z();return}let q=je(M,L);q&&W(()=>ee(q,false));}else if(H&&!g.isLoading){let q=it(g.conversations,v);if(q&&k!==q.taskId){let K=je(q,L);K&&W(()=>ee(K,true));}q?.taskId===k&&(k=null),X();}b=g.isLoading,z();},te=t.subscribe(re),ie=n.subscribe(()=>{if(y)return;let g=n.getVoice?.()??w??a;g!==w&&(w=g),z();}),se={subscribe(g){return B.add(g),()=>{B.delete(g);}},getSnapshot(){return _(),T},setEnabled(g){x!==g&&(x=g,Q(),x?(b=t.getSnapshot().isLoading,re()):(Z(),k=null),z());},toggleEnabled(){se.setEnabled(!x);},toggleEnabledOrStop(){let g=n.getSnapshot().status;if(g==="connecting"||g==="speaking"){k=v,Z({preserveRoundContext:true}),z();return}se.toggleEnabled();},stop(){k=v,Z({preserveRoundContext:true}),z();},setVoice(g){w=g,n.setVoice?.(g),z();},getVoice(){return w},destroy(){y||(y=true,Z(),k=null,te(),ie(),B.clear());}};return se}var Be={maxCount:5};function ct(){return `file-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function fe(e){let t=e.lastIndexOf(".");return t<=-1?"":e.slice(t).toLowerCase()}function dt(e){return new Promise((t,n)=>{let o=new FileReader;o.onerror=()=>n(o.error||new Error("Failed to read file")),o.onload=()=>{let l=typeof o.result=="string"?o.result:"",a=l.includes(",")?l.split(",")[1]||"":l;if(!a){n(new Error("Failed to encode file"));return}t(a);},o.readAsDataURL(e);})}function gt(e,t){if(!t.length)return true;let n=e.type||"",o=fe(e.name);return t.some(l=>{if(!l)return false;let a=l.trim().toLowerCase();if(!a)return false;if(a.startsWith("."))return o===a;if(a.endsWith("/*")){let d=a.slice(0,-1);return n.toLowerCase().startsWith(d)}return n.toLowerCase()===a})}function mt(e,t,n){let o=t.maxCount??Be.maxCount;return typeof o=="number"&&n>=o?`\u6700\u591A\u53EA\u80FD\u4E0A\u4F20 ${o} \u4E2A\u6587\u4EF6`:typeof t.maxSize=="number"&&e.size>t.maxSize?`\u6587\u4EF6 ${e.name} \u8D85\u8FC7\u5927\u5C0F\u9650\u5236`:t.accept&&!gt(e,t.accept)?`\u6587\u4EF6 ${e.name} \u7C7B\u578B\u4E0D\u652F\u6301`:null}function pt(e={}){let t=new Set,n=[],o={...Be,...e},l=()=>{let a={files:[...n],constraints:o};t.forEach(d=>d(a));};return {getSnapshot(){return {files:[...n],constraints:o}},subscribe(a){return t.add(a),()=>{t.delete(a);}},async addFiles(a){let d=Array.from(a),s=await Promise.all(d.map(async(u,h)=>{let y=ct(),x=mt(u,o,n.length+h);if(x)return {id:y,name:u.name,size:u.size,mimeType:u.type||"application/octet-stream",extension:fe(u.name),status:"error",error:x,file:u};try{let b=await dt(u);return {id:y,name:u.name,size:u.size,mimeType:u.type||"application/octet-stream",extension:fe(u.name),status:"ready",file:u,content:{type:"file",data:b,name:u.name,mimeType:u.type||"application/octet-stream",size:u.size}}}catch(b){return {id:y,name:u.name,size:u.size,mimeType:u.type||"application/octet-stream",extension:fe(u.name),status:"error",error:b.message||`\u6587\u4EF6 ${u.name} \u8BFB\u53D6\u5931\u8D25`,file:u}}}));return n=[...n,...s],l(),s},removeFile(a){n=n.filter(d=>d.id!==a),l();},clearFiles(){n=[],l();},getReadyFiles(){return n.filter(a=>a.status==="ready")},getMessageFiles(){return n.filter(a=>a.status==="ready"&&a.content).map(a=>a.content)}}}exports.createAutoVoiceReplyController=ut;exports.createCopilotClient=nt;exports.createCopilotFileManager=pt;//# sourceMappingURL=index.cjs.map
3
3
  //# sourceMappingURL=index.cjs.map