@amaster.ai/copilot-client 1.1.2 → 1.1.3

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'),Ee=require('miniprogram-text-decoder');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Ee__default=/*#__PURE__*/_interopDefault(Ee);var te=class{constructor(){this.aborted=false;this.listeners=[];this.signal={aborted:false,addEventListener:(t,s)=>{this.listeners.push(s);}};}abort(){this.aborted||(this.aborted=true,this.signal.aborted=true,this.listeners.forEach(t=>t()));}};function le(){return typeof AbortController<"u"?new AbortController:new te}function u(){return new Date().toISOString()}function B(){return `msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Re(e){return {...e}}function re(e){return {...e,system:e.system?{...e.system}:void 0,messages:e.messages.map(t=>Re(t))}}function ne(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=>re(t))}}var W={"text-content":(e,t,s,o,a)=>{if(!s)return e;let l=e.messages.find(r=>r.messageId===s),d=t.text||"";return l&&"content"in l?{...e,messages:e.messages.map(r=>r.messageId===s?{...r,content:r.content+d}:r),lastUpdated:u()}:{...e,messages:[...e.messages,{messageId:s,role:o,kind:"text-content",content:d,timestamp:a?.timestamp||u()}],lastUpdated:u()}},thought:(e,t,s,o,a)=>{if(!s)return e;let l=t?.data?.description||"",d=e.messages.find(r=>r.messageId===s);return d&&"thought"in d?{...e,messages:e.messages.map(r=>r.messageId===s?{...r,thought:r.thought+l}:r),lastUpdated:u()}:{...e,messages:[...e.messages,{messageId:s,role:o,kind:"thought",thought:l,timestamp:a?.timestamp||u()}],lastUpdated:u()}},tool:(e,t,s,o,a)=>{let l=t?.data||{},d=l?.tool,r=d?.displayName||d?.name||"",c=l?.request,f=c?.callId;if(!f||!r)return e;let p=l?.status,C=e.messages.find(I=>I.messageId===f);return C&&"toolStatus"in C?{...e,messages:e.messages.map(I=>I.messageId===f?{...I,toolStatus:p||I.toolStatus}:I),lastUpdated:u()}:{...e,messages:[...e.messages,{messageId:f,role:o,kind:"tool",toolName:r,toolDescription:c?.args?.query||"",toolStatus:p||"pending",timestamp:a?.timestamp||u()}],lastUpdated:u()}},error:(e,t,s,o)=>{let a=t?.text||t?.data?.error||"\u53D1\u751F\u9519\u8BEF";return {...e,messages:[...e.messages,{messageId:s||`error-${Date.now()}`,role:o,kind:"error",content:a,timestamp:u()}],status:"error",lastUpdated:u()}},"ui-render":(e,t,s,o,a)=>{if(!s)return e;let l=e.messages.find(c=>c.messageId===s),r=(t?.data||{}).spec||{root:"",elements:{}};return l&&l.kind==="ui-render"?{...e,messages:e.messages.map(c=>c.messageId===s?{...c,spec:r}:c),lastUpdated:u()}:{...e,messages:[...e.messages,{messageId:s,role:o,kind:"ui-render",spec:r,timestamp:a?.timestamp||u()}],lastUpdated:u()}}};function se(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 ue(){let e=httpClient.resolveMiniProgramGlobals();return typeof e?.wx?.request=="function"||typeof e?.qq?.request=="function"}function ce(){return typeof httpClient.resolveMiniProgramGlobals()?.tt?.createEventSource=="function"}function me(e,t){let o=(t.mode||"conversation")==="single-turn",a=!o,l=!o,d=()=>t.getContextId?.()??e.createContextId(o?"single-turn":"conversation"),r={byId:{},order:[],starting:true,isLoading:false,isLoadingHistory:false,historyState:{next:null,hasMore:false}},c=new Set,f=null,C=null,I="unknown",T="",A=null,H=false,q=d(),U=e.createScopedRuntime(q),y=()=>{if(H)return;let n=ne(r);c.forEach(i=>i(n));},S=n=>{r.order=r.order.filter(i=>i!==n);},R=(n,i=true)=>{S(n),r.order=i?[...r.order,n]:[n,...r.order];},P=()=>{I="unknown",T="";},j=()=>{r.byId={},r.order=[],r.historyState={next:null,hasMore:false};},D=n=>{r.isLoading=n,!n&&Y();},O=()=>(q=d(),U=e.createScopedRuntime(q),q),_=()=>{f?.abort(),f=null,D(false),y();},z=()=>{P(),C=null,f=null,D(false),y();},N=n=>{r.byId[n.taskId]=n,R(n.taskId,true),y();},ie=n=>{r.byId[n]&&(delete r.byId[n],S(n),y());},be=()=>{N({taskId:"loading-placeholder",status:"working",messages:[{messageId:"loading-placeholder",role:"assistant",kind:"text-content",content:t.strings.thinking,timestamp:u()}],lastUpdated:u()});},Y=()=>{ie("loading-placeholder");},Z=({kind:n,taskId:i,part:m,status:g,handler:k,isHistory:M,historyId:v,messageId:h})=>{let x=h||T,w=g?.message?.role==="agent"?"assistant":"user";!h&&(n==="ui-render"||n!=="unknown"&&n!==I)&&(I=n,x=B(),T=x);let E=r.byId[i]??{taskId:i,status:M?"completed":"submitted",messages:[],role:w,historyId:v,lastUpdated:u()},b=k(E,m,x,w,g);r.byId[i]={...b,status:g?.state||E.status,lastUpdated:u()},M||R(i,true),y();},V=()=>{N({taskId:B(),status:"error",messages:[{messageId:`error-${Date.now()}`,role:"assistant",kind:"error",content:t.strings.errorMessage,timestamp:u()}],lastUpdated:u()}),D(false),y();},ke=n=>{if(!n?.result)return;let i=n.result,{taskId:m,status:g,metadata:k,final:M}=i;if(M){z();return}if(!m)return;C=m;let v=g?.message?.parts?.[0],h=se(v,k),x=W[h];x&&(Y(),Z({kind:h,taskId:m,part:v,status:g,handler:x}));},we=(n,i)=>{let{messageId:m,historyId:g}=n||{};if(!m)return;let k=n.parts?.[0],M=se(k);if(M==="text-content"){let h=k.text||"";if(h=h.trim(),h.startsWith("<ui>")){let x=h.slice(4).trim();try{let w=JSON.parse(x);w.root&&w.elements&&Z({kind:"ui-render",taskId:i,part:{kind:"data",data:{type:"ui",spec:w}},handler:W["ui-render"],isHistory:!0,historyId:g,messageId:m,status:{message:n}});}catch{}return}}let v=W[M];v&&Z({kind:M,taskId:i,part:k,handler:v,isHistory:true,historyId:g,messageId:m,status:{message:n}});},G=async(n,i,m=false,g=0,k=false)=>{_(),P();let M=le();f=M,m&&(be(),D(true),y());let v=false,h=false,x=false,w=false,E=i?.taskId||null,b=U.sendMessage(n,{taskId:i?.taskId,signal:M.signal,preferMiniProgramRequest:k,onMessage:F=>{let ee=F?.result?.taskId,$=!!F?.result?.final;ee&&(E=ee),$&&(w=true),v=true,ke(F);},onClose:()=>{}});let K=async()=>{if(ce()&&!!httpClient.getMiniProgramRequest()&&!x&&!w&&g<2){console.log("[recovering]");try{let $=await U.getChatStatus(E||void 0);if($.working&&$.taskId){C=$.taskId,await G([],{taskId:$.taskId},!0,g+1,!0);return}if(!v&&!E&&!$.taskId&&g<1){await G(n,i,!0,g+1,!0);return}}catch($){console.error("[ConversationController] recovery failed:",$);}}};try{await b;}catch(F){F?.name==="AbortError"||M.signal.aborted?x=true:(h=true,console.error("[ConversationController] Stream error:",F));}finally{f===M&&(f=null),K(),h||!v&&m&&!x?V():x?(D(false),y()):w&&r.isLoading?z():!w&&r.isLoading&&V();}};return {getSnapshot(){return ne(r)},subscribe(n){return c.add(n),()=>{c.delete(n);}},async init(){if(!H)return A||(r.starting=true,y(),A=(async()=>{try{if(a&&await this.loadHistory(),l){let n=await U.getChatStatus();n.taskId&&n.working&&(C=n.taskId,await G([],{taskId:n.taskId},!1));}}catch(n){console.error("[ConversationController] init failed:",n);}finally{r.starting=false,y(),A=null;}})(),A)},destroy(){H=true,_(),c.clear();},async sendMessage(n){if(!(r.isLoading||!n.trim())){o&&(this.abort(),j(),P(),C=null,O()),N({taskId:B(),status:"submitted",messages:[{messageId:B(),role:"user",kind:"text-content",content:n,timestamp:u()}],lastUpdated:u()});try{await G([{role:"user",content:n}],void 0,!0);}catch(i){if(i.name==="AbortError")return;V();}}},abort(){let n=f?.signal.aborted;_(),P(),C=null,Y(),n||Promise.resolve();},async cancelChat(n){let i=n||C;if(this.abort(),N({taskId:B(),status:"error",messages:[{messageId:`cancel-${Date.now()}`,role:"assistant",kind:"text-content",content:t.strings.cancelled,timestamp:u()}],lastUpdated:u()}),!!i)try{await U.cancelChat(i),C=null;}catch(m){console.error("[ConversationController] cancel failed:",m);}},resetConversation(n){if(this.abort(),j(),C=null,P(),o&&O(),n){let i=`conv-${Date.now()}`;r.byId[i]={taskId:i,status:"submitted",messages:[{messageId:`greeting-${Date.now()}`,role:"assistant",kind:"text-content",content:n,timestamp:u()}],lastUpdated:u()},r.order=[i];}y();},async startNewConversation(){N({taskId:B(),status:"submitted",messages:[],lastUpdated:u(),system:{level:"newConversation"}});try{await U.newConversation();}catch(n){console.error("[ConversationController] newConversation failed:",n);}},async loadHistory(n=20,i){D(true),y();try{let m=await U.getHistory(n,i),g=m?.messages||[],k="",M="",v=[];g.forEach(h=>{let x=h.role==="agent"?"assistant":"user";x!==M&&(k=`history-conv-${B()}`,v.push(k),M=x),we(h,k);}),r.order=[...v,...r.order.filter(h=>!v.includes(h))],r.historyState={next:m?.next||null,hasMore:m?.hasMore||!1};}catch(m){console.error("[ConversationController] loadHistory failed:",m);}finally{r.isLoadingHistory=false,y();}},async loadMoreHistory(){!r.historyState.hasMore||r.isLoadingHistory||!r.historyState.next||await this.loadHistory(20,r.historyState.next);},getConversation(n){let i=r.byId[n];return i?re(i):void 0},clearConversation(n){ie(n);},removeMessage(n,i){let m=r.byId[n];m&&(r.byId[n]={...m,messages:m.messages.filter(g=>g.messageId!==i),lastUpdated:u()},R(n,true),y());},updateMessage(n){let{taskId:i,messageId:m,content:g,partial:k=false,status:M,response:v,metadata:h={}}=n,x=r.byId[i];if(!x)return;let w=x.messages.findIndex(F=>F.messageId===m);if(w===-1)return;let E=x.messages[w];if(!E)return;let b={...E,...h};g!==void 0&&("content"in b?b.content=k?`${b.content||""}${g}`:g:"thought"in b?b.thought=k?`${b.thought||""}${g}`:g:E.kind==="text-content"&&(b.content=k?`${E.content||""}${g}`:g)),("toolStatus"in b||M)&&(b.toolStatus=M||b.toolStatus),v!==void 0&&(b.response=v);let K=[...x.messages];K[w]=b,r.byId[i]={...x,messages:K,lastUpdated:u()},R(i,true),y();}}}function L(){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 s=Math.random()*16|0;return (t==="x"?s:s&3|8).toString(16)})}function fe(e){let t=/^www\.([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(e);if(t?.[1])return t[1];let s=/^([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(e);return s?.[1]?s[1]:null}function Ae(){if(typeof window>"u")return null;try{let e=window.location.href,t=/\/app\/([\da-z-]+)(?:\/|$)/.exec(e);return t?.[1]?t[1]:fe(window.location.hostname)}catch{return null}}var oe=null,Pe=null;function ge(e){let t=e?fe(e):Ae();return t||(oe||(oe=L()),oe)}function pe(e,t){return (s="conversation")=>{let o=httpClient.getMiniProgramRequest(),a=ge();if(o){let r=e?e.replace(/^https?:\/\//,"").split("/")[0]:"";a=ge(r);}let l=t?.()??Pe??(Pe=`anonymous-${L()}`),d=`${a}:${l}`;return s==="single-turn"?`${d}:${L()}`:d}}function ye(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 xe(e){return typeof e=="string"?e:e.filter(t=>t.type==="text").map(t=>t.text).join(`
2
- `)}function Ce(e){return {createContextId(t){return e.createContextId(t)},createScopedRuntime(t){return e.createRuntime(t)}}}function he({createContextId:e,postRpc:t,sendMessageStream:s}){return Ce({createContextId:e,createRuntime(o){return {async sendMessage(a,l){let{taskId:d,signal:r,onOpen:c,onMessage:f,onClose:p,preferMiniProgramRequest:C}=l,I=a.find(y=>y.role==="system"),T=a.filter(y=>y.role!=="system"),A=T[T.length-1],H=A?ye(A.content):[{kind:"text",text:""}],q=I?xe(I.content):void 0,U={jsonrpc:"2.0",id:L(),method:"message/stream",params:{message:{contextId:o,kind:"message",messageId:L(),role:"user",parts:H,...d?{taskId:d}:{},...q?{metadata:{systemPrompt:q}}:{}}}};await s(U,{onOpen:c,onMessage:f,onClose:p},r,C);},cancelChat(a){let l={jsonrpc:"2.0",id:L(),method:"tasks/cancel",params:{id:a}};return t(l)},async getHistory(a=50,l){try{let r=(await t({jsonrpc:"2.0",method:"messages/list",id:L(),params:{filter:{contextId:o},limit:a,...l?{next:l}:{}}}))?.data?.result||{},c=r?.messages||[],f=r?.next||"";return {messages:c,next:f,hasMore:!!f}}catch{return}},async newConversation(){try{await t({jsonrpc:"2.0",method:"messages/clear",id:L(),params:{contextId:o}});}catch{}},async getChatStatus(a){try{let l={jsonrpc:"2.0",id:L(),method:"tasks/get",params:a?{id:a}:{contextId:o}},r=(await t(l))?.data?.result;return {working:r?.status?.state==="working",taskId:r?.id,error:r?.error?.message||""}}catch(l){return {working:false,error:l?.message||""}}}}}})}function Se(e){if(e instanceof Error)return e;if(e&&typeof e=="object"){let t=e,s=typeof t.errMsg=="string"&&t.errMsg||typeof t.message=="string"&&t.message||JSON.stringify(t),o=new Error(s);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 Q(){if(typeof DOMException<"u")return new DOMException("Aborted","AbortError");let e=new Error("Aborted");return e.name="AbortError",e}function X(e){return eventsourceParser.createParser({onEvent:t=>{try{e.onMessage(JSON.parse(t.data));}catch(s){console.error("[copilot stream] failed to parse SSE event:",s,t.data);}}})}function Me(e,t){if(e){if(e.aborted){t();return}e.addEventListener("abort",t);}}async function Ie(e,t,s,o,a){let l={"Content-Type":"application/json",...s},d=await fetch(e,{method:"POST",headers:l,credentials:"include",body:JSON.stringify(t),signal:a});if(!d.ok)throw new Error(`Stream request failed: ${d.statusText||d.status}`);if(o.onOpen?.(),!d.body){o.onClose?.();return}let r=d.body.getReader(),c=new TextDecoder,f=X(o);try{for(;;){if(a?.aborted)throw Q();let{done:p,value:C}=await r.read();if(p)break;f.feed(c.decode(C,{stream:!0}));}}finally{o.onClose?.();}}function He(e,t){if(!e)return "";let s=e instanceof Uint8Array?e:new Uint8Array(e);return s.length===0?"":t.decode(s,{stream:false})}async function ae(e,t,s={},o,a){return new Promise((l,d)=>{let r=new Uint8Array(0),c=new Ee__default.default("utf-8",{fatal:false}),f=false,p=false,C=false,I=X(o),T=S=>{if(!p){if(p=true,S){d(Se(S));return}o.onClose?.(),l();}},A=()=>{C||(C=true,o.onOpen?.());},H=S=>{S&&(A(),I.feed(S));},q=S=>{if(!(p||!S.data))try{f=!0;let R=new Uint8Array(S.data),P=new Uint8Array(r.length+R.length);P.set(r),P.set(R,r.length),r=P;let j=0;for(;j<r.length;){let D=r.subarray(j),O=c.decode(D,{stream:!1});if(O.length===0)break;if(O.includes("\uFFFD")){let _=O.lastIndexOf("\uFFFD")===0?0:O.indexOf("\uFFFD");if(_<=0)break;let z=O.slice(0,_);z&&H(z);let N=new TextEncoder().encode(z);j+=N.length;break}H(O),j+=D.length;}r=r.subarray(j);}catch(R){console.error("[mini stream] chunk process error:",R);}},U=S=>{A(),S.header?.["content-type"]?.includes("text/event-stream")===false&&console.warn("Warning: server did not return event-stream");},y=httpClient.getMiniProgramRequest();if(!y){d(new Error("Mini-program request API not found"));return}try{let S=y({url:e,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...s},data:typeof t=="string"?t:JSON.stringify(t),responseType:"arraybuffer",...ue()?{enableChunked:!0}:{},success:R=>{if(!f&&R?.data){let P=He(R.data,c);H(P);}if(r.length>0){let P=c.decode(r,{stream:!0});H(P);}T();},fail:R=>{T(R);}});Me(a,()=>{S.abort?.(),T(Q());}),S.onChunkReceived?.(q),S.onHeadersReceived?.(U);}catch(S){T(S);}})}async function ve(e,t,s,o,a,l=false){let d=s?.(),r=d?{Authorization:`Bearer ${d}`}:{},c=httpClient.getMiniProgramRequest();if(l&&c){await ae(e,t,r,o,a);return}if(c){await ae(e,t,r,o,a);return}await Ie(e,t,r,o,a);}function Le(e,t,s,o){let a="";try{a=process.env.TARO_APP_API_BASE_URL||process.env.VITE_API_BASE_URL||process.env.API_BASE_URL||"";}catch{}a=String(a||"").trim();let l=`${t||a}/api/proxy/builtin/platform/copilot`,d=p=>e.request({url:l,method:"POST",data:p}),r=pe(l,o);async function c(p,C,I,T){try{await ve(l,p,s,C,I,T);}catch(A){if(I?.aborted)return;throw A}}let f=he({createContextId:r,postRpc:d,sendMessageStream:c});return {createConversationController(p){return me(f,p)}}}exports.createCopilotClient=Le;//# sourceMappingURL=index.cjs.map
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 ae=class{constructor(){this.aborted=false;this.listeners=[];this.signal={aborted:false,addEventListener:(t,o)=>{this.listeners.push(o);}};}abort(){this.aborted||(this.aborted=true,this.signal.aborted=true,this.listeners.forEach(t=>t()));}};function ye(){return typeof AbortController<"u"?new AbortController:new ae}function m(){return new Date().toISOString()}function B(){return `msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function qe(e){return {...e}}function ie(e){return {...e,system:e.system?{...e.system}:void 0,runtimeError:e.runtimeError?{...e.runtimeError}:void 0,messages:e.messages.map(t=>qe(t))}}function le(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=>ie(t))}}var X={"text-content":(e,t,o,a,l)=>{if(!o)return e;let u=e.messages.find(r=>r.messageId===o),d=t.text||"";return u&&"content"in u?{...e,messages:e.messages.map(r=>r.messageId===o?{...r,content:r.content+d}:r),lastUpdated:m()}:{...e,messages:[...e.messages,{messageId:o,role:a,kind:"text-content",content:d,timestamp:l?.timestamp||m()}],lastUpdated:m()}},thought:(e,t,o,a,l)=>{if(!o)return e;let u=t?.data?.description||"",d=e.messages.find(r=>r.messageId===o);return d&&"thought"in d?{...e,messages:e.messages.map(r=>r.messageId===o?{...r,thought:r.thought+u}:r),lastUpdated:m()}:{...e,messages:[...e.messages,{messageId:o,role:a,kind:"thought",thought:u,timestamp:l?.timestamp||m()}],lastUpdated:m()}},tool:(e,t,o,a,l)=>{let u=t?.data||{},d=u?.tool,r=d?.displayName||d?.name||"",g=u?.request,y=g?.callId;if(!y||!r)return e;let C=u?.status,h=e.messages.find(w=>w.messageId===y);return h&&"toolStatus"in h?{...e,messages:e.messages.map(w=>w.messageId===y?{...w,toolStatus:C||w.toolStatus}:w),lastUpdated:m()}:{...e,messages:[...e.messages,{messageId:y,role:a,kind:"tool",toolName:r,toolDescription:g?.args?.query||"",toolStatus:C||"pending",timestamp:l?.timestamp||m()}],lastUpdated:m()}},error:(e,t,o,a)=>{let l=t?.text||t?.data?.error||"\u53D1\u751F\u9519\u8BEF";return {...e,messages:[...e.messages,{messageId:o||`error-${Date.now()}`,role:a,kind:"error",content:l,timestamp:m()}],status:"error",lastUpdated:m()}},"ui-render":(e,t,o,a,l)=>{if(!o)return e;let u=e.messages.find(g=>g.messageId===o),r=(t?.data||{}).spec||{root:"",elements:{}};return u&&u.kind==="ui-render"?{...e,messages:e.messages.map(g=>g.messageId===o?{...g,spec:r}:g),lastUpdated:m()}:{...e,messages:[...e.messages,{messageId:o,role:a,kind:"ui-render",spec:r,timestamp:l?.timestamp||m()}],lastUpdated:m()}}};function ue(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 Ce(){let e=httpClient.resolveMiniProgramGlobals();return typeof e?.wx?.request=="function"||typeof e?.qq?.request=="function"}function he(){return typeof httpClient.resolveMiniProgramGlobals()?.tt?.createEventSource=="function"}function Se(e,t){let a=(t.mode||"conversation")==="single-turn",l=!a,u=!a,d=()=>t.getContextId?.()??e.createContextId(a?"single-turn":"conversation"),r={byId:{},order:[],starting:true,isLoading:false,isLoadingHistory:false,historyState:{next:null,hasMore:false}},g=new Set,y=null,h=null,w="unknown",R="",T=null,q=false,D=d(),H=e.createScopedRuntime(D),x=null,c=()=>{if(q)return;let n=le(r);g.forEach(s=>s(n));},E=n=>{r.order=r.order.filter(s=>s!==n);},A=(n,s=true)=>{E(n),r.order=s?[...r.order,n]:[n,...r.order];},L=()=>{w="unknown",R="";},J=n=>{let s=n&&typeof n=="object"?n:{},i=String(s.message||s.errMsg||"").toLowerCase(),f=String(s.errorCode||""),I=String(s.errNo||"");return s.name==="TypeError"||/network|failed to fetch|fetch failed|request failed|timeout|timed out|connection|disconnected|offline|断网|网络/.test(i)||["600009","21101","21102","21103"].includes(f)||["600009","21101","21102","21103"].includes(I)},$=(n,s="stream")=>({code:J(n)?"network":"unknown",message:J(n)?"\u7F51\u7EDC\u9519\u8BEF\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u540E\u91CD\u8BD5":t.strings.errorMessage,retryable:true,source:s,timestamp:m()}),F=(n,s)=>{if(!n)return;let i=r.byId[n];i&&(r.byId[n]={...i,requestState:s.requestState??i.requestState,runtimeError:s.runtimeError===void 0?i.runtimeError:s.runtimeError,status:s.status??i.status,lastUpdated:m()});},j=n=>{F(n,{requestState:"idle",runtimeError:null});},K=()=>{r.byId={},r.order=[],r.historyState={next:null,hasMore:false};},V=n=>{r.isLoading=n,!n&&te();},me=()=>(D=d(),H=e.createScopedRuntime(D),D),ee=()=>{y?.abort(),y=null,j(x),V(false),c();},ge=()=>{L(),j(x),x&&F(x,{status:"completed"}),x=null,h=null,y=null,V(false),c();},W=n=>{r.byId[n.taskId]=n,A(n.taskId,true),c();},fe=n=>{r.byId[n]&&(delete r.byId[n],E(n),c());},Ue=()=>{W({taskId:"loading-placeholder",status:"working",messages:[{messageId:"loading-placeholder",role:"assistant",kind:"text-content",content:t.strings.thinking,timestamp:m()}],lastUpdated:m()});},te=()=>{fe("loading-placeholder");},re=({kind:n,taskId:s,part:i,status:f,handler:I,isHistory:p,historyId:b,messageId:S})=>{let M=S||R,k=f?.message?.role==="agent"?"assistant":"user";!S&&(n==="ui-render"||n!=="unknown"&&n!==w)&&(w=n,M=B(),R=M);let P=r.byId[s]??{taskId:s,status:p?"completed":"submitted",messages:[],role:k,historyId:b,lastUpdated:m()},v=I(P,i,M,k,f);r.byId[s]={...v,status:f?.state||P.status,lastUpdated:m()},p||A(s,true),c();},G=(n,s="stream",i=x)=>{F(i,{requestState:"error",runtimeError:$(n,s),status:"error"}),i&&x===i&&(x=null),V(false),c();},He=n=>{if(!n?.result)return;let s=n.result,{taskId:i,status:f,metadata:I,final:p}=s;if(p){ge();return}if(!i)return;h=i;let b=f?.message?.parts?.[0],S=ue(b,I),M=X[S];M&&(te(),re({kind:S,taskId:i,part:b,status:f,handler:M}));},Le=(n,s)=>{let{messageId:i,historyId:f}=n||{};if(!i)return;let I=n.parts?.[0],p=ue(I);if(p==="text-content"){let S=I.text||"";if(S=S.trim(),S.startsWith("<ui>")){let M=S.slice(4).trim();try{let k=JSON.parse(M);k.root&&k.elements&&re({kind:"ui-render",taskId:s,part:{kind:"data",data:{type:"ui",spec:k}},handler:X["ui-render"],isHistory:!0,historyId:f,messageId:i,status:{message:n}});}catch{}return}}let b=X[p];b&&re({kind:p,taskId:s,part:I,handler:b,isHistory:true,historyId:f,messageId:i,status:{message:n}});},Q=async(n,s,i=false,f=0,I=false,p=x)=>{x=p,ee(),L(),F(p,{requestState:"submitting",runtimeError:null,status:"submitted"});let b=ye();y=b,i&&(Ue(),V(true),c());let S=false,M=false,k=false,P=false,v=s?.taskId||null,_=H.sendMessage(n,{taskId:s?.taskId,signal:b.signal,preferMiniProgramRequest:I,onMessage:N=>{let oe=N?.result?.taskId,U=!!N?.result?.final;oe&&(v=oe),U&&(P=true),S=true,F(p,{requestState:U?"idle":"streaming",runtimeError:null,status:U?"completed":"working"}),He(N);},onClose:()=>{}});let ne=async()=>{if(he()&&!!httpClient.getMiniProgramRequest()&&!k&&!P&&f<2){console.log("[recovering]"),F(p,{requestState:"recovering",runtimeError:null,status:"working"}),c();try{let U=await H.getChatStatus(v||void 0);if(U.working&&U.taskId)return h=U.taskId,await Q([],{taskId:U.taskId},!0,f+1,!0,p),!0;if(!S&&!v&&!U.taskId&&f<1)return await Q(n,s,!0,f+1,!0,p),!0}catch(U){return console.error("[ConversationController] recovery failed:",U),G(U,"recovery",p),true}}return false},se,pe=false;try{await _;}catch(N){N?.name==="AbortError"||b.signal.aborted?k=true:(M=true,se=N,console.error("[ConversationController] Stream error:",N));}finally{y===b&&(y=null),pe=await ne();}pe||(M?G(se,"stream",p):!S&&i&&!k?G(se,"send",p):k?(j(p),p&&x===p&&(x=null),V(false),c()):P&&r.isLoading?ge():!P&&r.isLoading&&G(void 0,"stream",p));};return {getSnapshot(){return le(r)},subscribe(n){return g.add(n),()=>{g.delete(n);}},async init(){if(!q)return T||(r.starting=true,c(),T=(async()=>{try{if(l&&await this.loadHistory(),u){let n=await H.getChatStatus();n.taskId&&n.working&&(h=n.taskId,await Q([],{taskId:n.taskId},!1));}}catch(n){console.error("[ConversationController] init failed:",n);}finally{r.starting=false,c(),T=null;}})(),T)},destroy(){q=true,ee(),g.clear();},async sendMessage(n){if(r.isLoading||!n.trim())return;a&&(this.abort(),K(),L(),h=null,me());let s=B();x=s,W({taskId:s,status:"submitted",requestState:"submitting",runtimeError:null,messages:[{messageId:B(),role:"user",kind:"text-content",content:n,timestamp:m()}],lastUpdated:m()});try{await Q([{role:"user",content:n}],void 0,!0,0,!1,s);}catch(i){if(i.name==="AbortError")return;G(i,"send",s);}},abort(){let n=y?.signal.aborted;ee(),L(),j(x),x=null,h=null,te(),n||Promise.resolve();},async cancelChat(n){let s=n||h;if(this.abort(),W({taskId:B(),status:"error",messages:[{messageId:`cancel-${Date.now()}`,role:"assistant",kind:"text-content",content:t.strings.cancelled,timestamp:m()}],lastUpdated:m()}),!!s)try{await H.cancelChat(s),h=null;}catch(i){console.error("[ConversationController] cancel failed:",i);}},resetConversation(n){if(this.abort(),K(),x=null,h=null,L(),a&&me(),n){let s=`conv-${Date.now()}`;r.byId[s]={taskId:s,status:"submitted",messages:[{messageId:`greeting-${Date.now()}`,role:"assistant",kind:"text-content",content:n,timestamp:m()}],lastUpdated:m()},r.order=[s];}c();},async startNewConversation(){W({taskId:B(),status:"submitted",messages:[],lastUpdated:m(),system:{level:"newConversation"}});try{await H.newConversation();}catch(n){console.error("[ConversationController] newConversation failed:",n);}},async loadHistory(n=20,s){r.isLoadingHistory=true,c();try{let i=await H.getHistory(n,s),f=i?.messages||[],I="",p="",b=[];f.forEach(S=>{let M=S.role==="agent"?"assistant":"user";M!==p&&(I=`history-conv-${B()}`,b.push(I),p=M),Le(S,I);}),r.order=[...b,...r.order.filter(S=>!b.includes(S))],r.historyState={next:i?.next||null,hasMore:i?.hasMore||!1};}catch(i){console.error("[ConversationController] loadHistory failed:",i);}finally{r.isLoadingHistory=false,c();}},async loadMoreHistory(){!r.historyState.hasMore||r.isLoadingHistory||!r.historyState.next||await this.loadHistory(20,r.historyState.next);},getConversation(n){let s=r.byId[n];return s?ie(s):void 0},clearConversation(n){fe(n);},removeMessage(n,s){let i=r.byId[n];i&&(r.byId[n]={...i,messages:i.messages.filter(f=>f.messageId!==s),lastUpdated:m()},A(n,true),c());},updateMessage(n){let{taskId:s,messageId:i,content:f,partial:I=false,status:p,response:b,metadata:S={}}=n,M=r.byId[s];if(!M)return;let k=M.messages.findIndex(ne=>ne.messageId===i);if(k===-1)return;let P=M.messages[k];if(!P)return;let v={...P,...S};f!==void 0&&("content"in v?v.content=I?`${v.content||""}${f}`:f:"thought"in v?v.thought=I?`${v.thought||""}${f}`:f:P.kind==="text-content"&&(v.content=I?`${P.content||""}${f}`:f)),("toolStatus"in v||p)&&(v.toolStatus=p||v.toolStatus),b!==void 0&&(v.response=b);let _=[...M.messages];_[k]=v,r.byId[s]={...M,messages:_,lastUpdated:m()},A(s,true),c();}}}function O(){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 o=Math.random()*16|0;return (t==="x"?o:o&3|8).toString(16)})}function Ie(e){let t=/^www\.([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(e);if(t?.[1])return t[1];let o=/^([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(e);return o?.[1]?o[1]:null}function De(){if(typeof window>"u")return null;try{let e=window.location.href,t=/\/app\/([\da-z-]+)(?:\/|$)/.exec(e);return t?.[1]?t[1]:Ie(window.location.hostname)}catch{return null}}var de=null,Fe=null;function Me(e){let t=e?Ie(e):De();return t||(de||(de=O()),de)}function be(e,t){return (o="conversation")=>{let a=httpClient.getMiniProgramRequest(),l=Me();if(a){let r=e?e.replace(/^https?:\/\//,"").split("/")[0]:"";l=Me(r);}let u=t?.()??Fe??(Fe=`anonymous-${O()}`),d=`${l}:${u}`;return o==="single-turn"?`${d}:${O()}`: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 ve(e){return typeof e=="string"?e:e.filter(t=>t.type==="text").map(t=>t.text).join(`
2
+ `)}function ke(e){return {createContextId(t){return e.createContextId(t)},createScopedRuntime(t){return e.createRuntime(t)}}}function Re({createContextId:e,postRpc:t,sendMessageStream:o}){return ke({createContextId:e,createRuntime(a){return {async sendMessage(l,u){let{taskId:d,signal:r,onOpen:g,onMessage:y,onClose:C,preferMiniProgramRequest:h}=u,w=l.find(x=>x.role==="system"),R=l.filter(x=>x.role!=="system"),T=R[R.length-1],q=T?we(T.content):[{kind:"text",text:""}],D=w?ve(w.content):void 0,H={jsonrpc:"2.0",id:O(),method:"message/stream",params:{message:{contextId:a,kind:"message",messageId:O(),role:"user",parts:q,...d?{taskId:d}:{},...D?{metadata:{systemPrompt:D}}:{}}}};await o(H,{onOpen:g,onMessage:y,onClose:C},r,h);},cancelChat(l){let u={jsonrpc:"2.0",id:O(),method:"tasks/cancel",params:{id:l}};return t(u)},async getHistory(l=50,u){try{let r=(await t({jsonrpc:"2.0",method:"messages/list",id:O(),params:{filter:{contextId:a},limit:l,...u?{next:u}:{}}}))?.data?.result||{},g=r?.messages||[],y=r?.next||"";return {messages:g,next:y,hasMore:!!y}}catch{return}},async newConversation(){try{await t({jsonrpc:"2.0",method:"messages/clear",id:O(),params:{contextId:a}});}catch{}},async getChatStatus(l){try{let u={jsonrpc:"2.0",id:O(),method:"tasks/get",params:l?{id:l}:{contextId:a}},r=(await t(u))?.data?.result;return {working:r?.status?.state==="working",taskId:r?.id,error:r?.error?.message||""}}catch(u){return {working:false,error:u?.message||""}}}}}})}function Te(e){if(e instanceof Error)return e;if(e&&typeof e=="object"){let t=e,o=typeof t.errMsg=="string"&&t.errMsg||typeof t.message=="string"&&t.message||JSON.stringify(t),a=new Error(o);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 Y(){if(typeof DOMException<"u")return new DOMException("Aborted","AbortError");let e=new Error("Aborted");return e.name="AbortError",e}function Z(e){return eventsourceParser.createParser({onEvent:t=>{try{e.onMessage(JSON.parse(t.data));}catch(o){console.error("[copilot stream] failed to parse SSE event:",o,t.data);}}})}function Ee(e,t){if(e){if(e.aborted){t();return}e.addEventListener("abort",t);}}async function Ae(e,t,o,a,l){let u={"Content-Type":"application/json",...o},d=await fetch(e,{method:"POST",headers:u,credentials:"include",body:JSON.stringify(t),signal:l});if(!d.ok)throw new Error(`Stream request failed: ${d.statusText||d.status}`);if(a.onOpen?.(),!d.body){a.onClose?.();return}let r=d.body.getReader(),g=new TextDecoder,y=Z(a);try{for(;;){if(l?.aborted)throw Y();let{done:C,value:h}=await r.read();if(C)break;y.feed(g.decode(h,{stream:!0}));}}finally{a.onClose?.();}}function Ne(e,t){if(!e)return "";let o=e instanceof Uint8Array?e:new Uint8Array(e);return o.length===0?"":t.decode(o,{stream:false})}async function ce(e,t,o={},a,l){return new Promise((u,d)=>{let r=new Uint8Array(0),g=new je__default.default("utf-8",{fatal:false}),y=false,C=false,h=false,w=Z(a),R=c=>{if(!C){if(C=true,c){d(Te(c));return}a.onClose?.(),u();}},T=()=>{h||(h=true,a.onOpen?.());},q=c=>{c&&(T(),w.feed(c));},D=c=>{if(!(C||!c.data))try{y=!0;let E=new Uint8Array(c.data),A=new Uint8Array(r.length+E.length);A.set(r),A.set(E,r.length),r=A;let L=0;for(;L<r.length;){let J=r.subarray(L),$=g.decode(J,{stream:!1});if($.length===0)break;if($.includes("\uFFFD")){let F=$.lastIndexOf("\uFFFD")===0?0:$.indexOf("\uFFFD");if(F<=0)break;let j=$.slice(0,F);j&&q(j);let K=new TextEncoder().encode(j);L+=K.length;break}q($),L+=J.length;}r=r.subarray(L);}catch(E){console.error("[mini stream] chunk process error:",E);}},H=c=>{T(),c.header?.["content-type"]?.includes("text/event-stream")===false&&console.warn("Warning: server did not return event-stream");},x=httpClient.getMiniProgramRequest();if(!x){d(new Error("Mini-program request API not found"));return}try{let c=x({url:e,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...o},data:typeof t=="string"?t:JSON.stringify(t),responseType:"arraybuffer",...Ce()?{enableChunked:!0}:{},success:E=>{if(!y&&E?.data){let A=Ne(E.data,g);q(A);}if(r.length>0){let A=g.decode(r,{stream:!0});q(A);}R();},fail:E=>{R(E);}});Ee(l,()=>{c.abort?.(),R(Y());}),c.onChunkReceived?.(D),c.onHeadersReceived?.(H);}catch(c){R(c);}})}async function Pe(e,t,o,a,l,u=false){let d=o?.(),r=d?{Authorization:`Bearer ${d}`}:{},g=httpClient.getMiniProgramRequest();if(u&&g){await ce(e,t,r,a,l);return}if(g){await ce(e,t,r,a,l);return}await Ae(e,t,r,a,l);}function Be(e,t,o,a){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 u=`${t||l}/api/proxy/builtin/platform/copilot`,d=C=>e.request({url:u,method:"POST",data:C}),r=be(u,a);async function g(C,h,w,R){try{await Pe(u,C,o,h,w,R);}catch(T){if(w?.aborted)return;throw T}}let y=Re({createContextId:r,postRpc:d,sendMessageStream:g});return {createConversationController(C){return Se(y,C)}}}exports.createCopilotClient=Be;//# sourceMappingURL=index.cjs.map
3
3
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/controller/utils.ts","../src/controller/message-handlers.ts","../src/runtime/platform.ts","../src/conversation-controller.ts","../src/runtime/context.ts","../src/runtime/message-content.ts","../src/runtime/session-runtime.ts","../src/runtime/copilot-runtime.ts","../src/runtime/stream/shared.ts","../src/runtime/stream/browser.ts","../src/runtime/stream/mini-program.ts","../src/runtime/stream/index.ts","../src/copilot-client.ts"],"names":["SimpleAbortController","_event","listener","createAbortController","nowIso","generateId","cloneMessage","message","cloneConversation","conversation","createSnapshot","state","id","handlers","conv","part","role","status","existing","newText","newChunk","_id","partData","tool","name","request","toolStatus","errorMsg","spec","getKind","metadata","supportsChunkedRequest","runtime","resolveMiniProgramGlobals","supportsDouyinEventSource","createConversationController","copilot","options","isSingleTurnMode","shouldLoadHistoryOnInit","shouldResumeOnInit","resolveContextId","listeners","activeAbortController","currentStreamingTaskId","lastMessageType","lastMessageId","initPromise","destroyed","currentContextId","sessionRuntime","emit","snapshot","removeTaskFromOrder","taskId","pushTaskToOrder","append","clearRuntimeMessageState","resetState","setLoading","removeLoadingPlaceholder","refreshContextId","abortActiveSession","handleEnd","addConversation","clearConversation","addLoadingPlaceholder","fillData","kind","handler","isHistory","historyId","messageId","prevConversation","nextConversation","onSendError","processLiveData","data","result","final","firstPart","processHistoryData","text","json","runSession","messages","chatOptions","showLoadingPlaceholder","recoveryAttempt","preferMiniProgramRequest","abortController","hasResponse","streamFailed","streamAborted","finalReceived","lastTaskId","runPromise","responseTaskId","responseFinal","recovery","getMiniProgramRequest","recoveryError","error","userContent","wasAborted","targetTaskId","greeting","limit","next","lastRole","taskIds","input","content","partial","response","messageIndex","oldMessage","updatedMessage","nextMessages","generateUUID","cryptoObj","char","random","getAppIdFromHostname","hostname","wwwMatch","domainMatch","extractAppIdFromUrl","url","pathMatch","cachedAppId","cachedAnonymousUid","getAppId","urlAppId","createContextIdFactory","getUserUid","mode","isMiniProgram","appId","userUid","baseContextId","convertToA2AParts","extractTextFromContent","createSessionRuntimeFactory","args","contextId","createCopilotRuntimeFactory","createContextId","postRpc","sendMessageStream","signal","onOpen","onMessage","onClose","systemMsg","nonSystemMsgs","lastUserMsg","parts","systemPrompt","cursor","normalizeStreamError","payload","normalized","createAbortError","createSSEConsumer","createParser","event","bindAbortSignal","onAbort","startBrowserStream","authHeader","headers","reader","decoder","parser","done","value","decodeMiniProgramArrayBuffer","textDecoder","buffer","startMiniProgramStream","resolve","reject","chunkBuffer","MiniProgramTextDecoder","sawChunk","settled","opened","finish","emitOpen","feedText","chunkListener","merged","decodeOffset","remaining","decoded","lastGoodIndex","goodPart","encodedGood","headersListener","miniReq","requestTask","wholeResponse","finalText","startStream","getAccessToken","token","createCopilotClient","http","baseUrl","envBaseUrl"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n Conversation,\n ConversationControllerSnapshot,\n HistoryState,\n MessagesItem,\n} from \"../types\";\n\nexport type InternalState = {\n byId: Record<string, Conversation>;\n order: string[];\n starting: boolean;\n isLoading: boolean;\n isLoadingHistory: boolean;\n historyState: HistoryState;\n};\n\nexport class SimpleAbortController {\n aborted = false;\n private listeners: Array<() => void> = [];\n\n signal = {\n aborted: false,\n addEventListener: (_event: \"abort\", listener: () => void) => {\n this.listeners.push(listener);\n },\n };\n\n abort() {\n if (this.aborted) return;\n this.aborted = true;\n this.signal.aborted = true;\n this.listeners.forEach((listener) => listener());\n }\n}\n\nexport function createAbortController(): AbortController | SimpleAbortController {\n if (typeof AbortController !== \"undefined\") {\n return new AbortController();\n }\n return new SimpleAbortController();\n}\n\nexport function nowIso() {\n return new Date().toISOString();\n}\n\nexport function generateId() {\n return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function cloneMessage<T extends MessagesItem>(message: T): T {\n return { ...message } as T;\n}\n\nexport function cloneConversation(conversation: Conversation): Conversation {\n return {\n ...conversation,\n system: conversation.system ? { ...conversation.system } : undefined,\n messages: conversation.messages.map((message) => cloneMessage(message)),\n };\n}\n\nexport function createSnapshot(state: InternalState): ConversationControllerSnapshot {\n return {\n starting: state.starting,\n isLoading: state.isLoading,\n isLoadingHistory: state.isLoadingHistory,\n historyState: { ...state.historyState },\n conversations: state.order\n .map((id) => state.byId[id])\n .filter((conversation): conversation is Conversation => Boolean(conversation))\n .map((conversation) => cloneConversation(conversation)),\n };\n}\n","import type { Conversation, ErrorMessage, MessagesItem, Role, TextMessage, ThoughtMessage, ToolMessage, UIRenderMessage } from \"../types\";\nimport { nowIso } from \"./utils\";\n\nexport type MessageHandler = (\n conv: Conversation,\n part: any,\n id: string,\n role: Role,\n status?: any\n) => Conversation;\n\nexport const handlers: Record<string, MessageHandler> = {\n \"text-content\": (conv, part, id, role, status) => {\n if (!id) return conv;\n const existing = conv.messages.find((message) => message.messageId === id);\n const newText = part.text || \"\";\n\n if (existing && \"content\" in existing) {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id\n ? ({ ...message, content: (message as TextMessage).content + newText } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"text-content\",\n content: newText,\n timestamp: status?.timestamp || nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n thought: (conv, part, id, role, status) => {\n if (!id) return conv;\n const newChunk = part?.data?.description || \"\";\n const existing = conv.messages.find((message) => message.messageId === id);\n\n if (existing && \"thought\" in existing) {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id\n ? ({ ...message, thought: (message as ThoughtMessage).thought + newChunk } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"thought\",\n thought: newChunk,\n timestamp: status?.timestamp || nowIso(),\n } as ThoughtMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n tool: (conv, part, _id, role, status) => {\n const partData = part?.data || {};\n const tool = partData?.tool;\n const name = tool?.displayName || tool?.name || \"\";\n const request = partData?.request;\n const id = request?.callId;\n if (!id || !name) return conv;\n\n const toolStatus = partData?.status;\n const existing = conv.messages.find((message) => message.messageId === id);\n\n if (existing && \"toolStatus\" in existing) {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id\n ? ({\n ...message,\n toolStatus: toolStatus || (message as ToolMessage).toolStatus,\n } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"tool\",\n toolName: name,\n toolDescription: request?.args?.query || \"\",\n toolStatus: toolStatus || \"pending\",\n timestamp: status?.timestamp || nowIso(),\n } as ToolMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n error: (conv, part, id, role) => {\n const errorMsg = part?.text || part?.data?.error || \"发生错误\";\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id || `error-${Date.now()}`,\n role,\n kind: \"error\",\n content: errorMsg,\n timestamp: nowIso(),\n } as ErrorMessage,\n ],\n status: \"error\",\n lastUpdated: nowIso(),\n };\n },\n\n \"ui-render\": (conv, part, id, role, status) => {\n if (!id) return conv;\n const existing = conv.messages.find((message) => message.messageId === id);\n const partData = part?.data || {};\n const spec = partData.spec || { root: \"\", elements: {} };\n\n if (existing && existing.kind === \"ui-render\") {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id ? ({ ...(message as UIRenderMessage), spec } as MessagesItem) : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"ui-render\",\n spec,\n timestamp: status?.timestamp || nowIso(),\n } as UIRenderMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n};\n\nexport function getKind(part: any, metadata?: any) {\n if (part?.data?.tool) return \"tool\";\n if (part?.data?.type === \"ui\") return \"ui-render\";\n if (part?.kind === \"text\") return \"text-content\";\n if (part?.data?.type === \"though\" || metadata?.coderAgent?.kind === \"thought\") return \"thought\";\n if (metadata?.error) return \"error\";\n return \"unknown\";\n}\n","export { getMiniProgramRequest, resolveMiniProgramGlobals } from \"@amaster.ai/http-client\";\nimport { resolveMiniProgramGlobals } from \"@amaster.ai/http-client\";\n\nexport function supportsChunkedRequest(): boolean {\n const runtime = resolveMiniProgramGlobals();\n return typeof runtime?.wx?.request === \"function\" || typeof runtime?.qq?.request === \"function\";\n}\n\nexport function supportsDouyinEventSource(): boolean {\n const runtime = resolveMiniProgramGlobals();\n return typeof runtime?.tt?.createEventSource === \"function\";\n}\n","import type {\n Message1,\n SendStreamingMessageResponse,\n SendStreamingMessageSuccessResponse,\n TextPart,\n} from \"@a2a-js/sdk\";\nimport { handlers, type MessageHandler, getKind } from \"./controller/message-handlers\";\nimport {\n cloneConversation,\n createAbortController,\n createSnapshot,\n generateId,\n nowIso,\n type InternalState,\n type SimpleAbortController,\n} from \"./controller/utils\";\nimport { getMiniProgramRequest, supportsDouyinEventSource } from \"./runtime/platform\";\nimport type {\n Conversation,\n ConversationController,\n ConversationControllerOptions,\n ConversationRuntimeFactory,\n ErrorMessage,\n MessagesItem,\n TextMessage,\n ThoughtMessage,\n ToolMessage,\n} from \"./types\";\n\nexport type {\n Role,\n TextMessage,\n ErrorMessage,\n ThoughtMessage,\n ToolMessage,\n UIRenderMessage,\n MessagesItem,\n Conversation,\n HistoryState,\n UpdateMessageInput,\n ConversationControllerSnapshot,\n ConversationStrings,\n ConversationControllerOptions,\n ConversationController,\n} from \"./types\";\n\nexport function createConversationController(\n copilot: ConversationRuntimeFactory,\n options: ConversationControllerOptions\n): ConversationController {\n const mode = options.mode || \"conversation\";\n const isSingleTurnMode = mode === \"single-turn\";\n const shouldLoadHistoryOnInit = !isSingleTurnMode;\n const shouldResumeOnInit = !isSingleTurnMode;\n const resolveContextId = () =>\n options.getContextId?.() ??\n copilot.createContextId(isSingleTurnMode ? \"single-turn\" : \"conversation\");\n\n const state: InternalState = {\n byId: {},\n order: [],\n starting: true,\n isLoading: false,\n isLoadingHistory: false,\n historyState: {\n next: null,\n hasMore: false,\n },\n };\n\n const listeners = new Set<(snapshot: ReturnType<typeof createSnapshot>) => void>();\n let activeAbortController: AbortController | SimpleAbortController | null = null;\n let activeRunPromise: Promise<void> | null = null;\n let currentStreamingTaskId: string | null = null;\n let lastMessageType = \"unknown\";\n let lastMessageId = \"\";\n let initPromise: Promise<void> | null = null;\n let destroyed = false;\n let currentContextId = resolveContextId();\n let sessionRuntime = copilot.createScopedRuntime(currentContextId);\n\n const emit = () => {\n if (destroyed) return;\n const snapshot = createSnapshot(state);\n listeners.forEach((listener) => listener(snapshot));\n };\n\n const removeTaskFromOrder = (taskId: string) => {\n state.order = state.order.filter((id) => id !== taskId);\n };\n\n const pushTaskToOrder = (taskId: string, append = true) => {\n removeTaskFromOrder(taskId);\n state.order = append ? [...state.order, taskId] : [taskId, ...state.order];\n };\n\n const clearRuntimeMessageState = () => {\n lastMessageType = \"unknown\";\n lastMessageId = \"\";\n };\n\n const resetState = () => {\n state.byId = {};\n state.order = [];\n state.historyState = {\n next: null,\n hasMore: false,\n };\n };\n\n const setLoading = (status: boolean) => {\n state.isLoading = status;\n !status && removeLoadingPlaceholder();\n };\n\n const refreshContextId = () => {\n currentContextId = resolveContextId();\n sessionRuntime = copilot.createScopedRuntime(currentContextId);\n return currentContextId;\n };\n\n const abortActiveSession = () => {\n activeAbortController?.abort();\n activeAbortController = null;\n activeRunPromise = null;\n setLoading(false);\n emit();\n };\n\n const handleEnd = () => {\n clearRuntimeMessageState();\n currentStreamingTaskId = null;\n activeAbortController = null;\n activeRunPromise = null;\n setLoading(false);\n emit();\n };\n\n const addConversation = (conversation: Conversation) => {\n state.byId[conversation.taskId] = conversation;\n pushTaskToOrder(conversation.taskId, true);\n emit();\n };\n\n const clearConversation = (taskId: string) => {\n if (!state.byId[taskId]) return;\n delete state.byId[taskId];\n removeTaskFromOrder(taskId);\n emit();\n };\n\n const addLoadingPlaceholder = () => {\n addConversation({\n taskId: \"loading-placeholder\",\n status: \"working\",\n messages: [\n {\n messageId: \"loading-placeholder\",\n role: \"assistant\",\n kind: \"text-content\",\n content: options.strings.thinking,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n });\n };\n\n const removeLoadingPlaceholder = () => {\n clearConversation(\"loading-placeholder\");\n };\n\n const fillData = ({\n kind,\n taskId,\n part,\n status,\n handler,\n isHistory,\n historyId,\n messageId,\n }: {\n kind: string;\n taskId: string;\n part: any;\n status: any;\n handler: MessageHandler;\n isHistory?: boolean;\n historyId?: string;\n messageId?: string;\n }) => {\n let id = messageId || lastMessageId;\n const role = status?.message?.role === \"agent\" ? \"assistant\" : \"user\";\n\n if (!messageId && (kind === \"ui-render\" || (kind !== \"unknown\" && kind !== lastMessageType))) {\n lastMessageType = kind;\n id = generateId();\n lastMessageId = id;\n }\n\n const prevConversation =\n state.byId[taskId] ??\n ({\n taskId,\n status: isHistory ? \"completed\" : \"submitted\",\n messages: [],\n role,\n historyId,\n lastUpdated: nowIso(),\n } as Conversation);\n\n const nextConversation = handler(prevConversation, part, id, role, status);\n state.byId[taskId] = {\n ...nextConversation,\n status: status?.state || prevConversation.status,\n lastUpdated: nowIso(),\n };\n\n if (!isHistory) {\n pushTaskToOrder(taskId, true);\n }\n\n emit();\n };\n\n const onSendError = () => {\n addConversation({\n taskId: generateId(),\n status: \"error\",\n messages: [\n {\n messageId: `error-${Date.now()}`,\n role: \"assistant\",\n kind: \"error\",\n content: options.strings.errorMessage,\n timestamp: nowIso(),\n } as ErrorMessage,\n ],\n lastUpdated: nowIso(),\n });\n setLoading(false);\n emit();\n };\n\n const processLiveData = (data: SendStreamingMessageResponse) => {\n if (!(data as any)?.result) return;\n const result = (data as SendStreamingMessageSuccessResponse).result as any;\n const { taskId, status, metadata, final } = result;\n\n if (final) {\n handleEnd();\n return;\n }\n\n if (!taskId) return;\n\n currentStreamingTaskId = taskId;\n const firstPart = status?.message?.parts?.[0];\n const kind = getKind(firstPart, metadata);\n const handler = handlers[kind];\n if (!handler) return;\n\n removeLoadingPlaceholder();\n fillData({\n kind,\n taskId,\n part: firstPart,\n status,\n handler,\n });\n };\n\n const processHistoryData = (data: Message1, taskId: string) => {\n const { messageId, historyId } = (data || {}) as any;\n if (!messageId) return;\n\n const firstPart = data.parts?.[0];\n const kind = getKind(firstPart);\n\n if (kind === \"text-content\") {\n let text = (firstPart as TextPart).text || \"\";\n text = text.trim();\n if (text.startsWith(\"<ui>\")) {\n const json = text.slice(4).trim();\n try {\n const partData = JSON.parse(json);\n if (partData.root && partData.elements) {\n fillData({\n kind: \"ui-render\",\n taskId,\n part: { kind: \"data\", data: { type: \"ui\", spec: partData } },\n handler: handlers[\"ui-render\"]!,\n isHistory: true,\n historyId,\n messageId,\n status: { message: data },\n });\n }\n } catch {\n // ignore invalid history ui payload\n }\n return;\n }\n }\n\n const handler = handlers[kind];\n if (!handler) return;\n\n fillData({\n kind,\n taskId,\n part: firstPart,\n handler,\n isHistory: true,\n historyId,\n messageId,\n status: { message: data },\n });\n };\n\n const runSession = async (\n messages: Array<{ role: \"system\" | \"user\" | \"assistant\"; content: string }>,\n chatOptions?: { taskId?: string },\n showLoadingPlaceholder = false,\n recoveryAttempt = 0,\n preferMiniProgramRequest = false\n ) => {\n abortActiveSession();\n clearRuntimeMessageState();\n\n const abortController = createAbortController() as AbortController | SimpleAbortController;\n activeAbortController = abortController;\n\n if (showLoadingPlaceholder) {\n addLoadingPlaceholder();\n setLoading(true);\n emit();\n }\n\n let hasResponse = false;\n let streamFailed = false;\n let streamAborted = false;\n let finalReceived = false;\n let lastTaskId = chatOptions?.taskId || null;\n\n const runPromise = sessionRuntime.sendMessage(messages, {\n taskId: chatOptions?.taskId,\n signal: abortController.signal,\n preferMiniProgramRequest,\n onMessage: (message) => {\n const responseTaskId = (message as any)?.result?.taskId;\n const responseFinal = Boolean((message as any)?.result?.final);\n if (responseTaskId) {\n lastTaskId = responseTaskId;\n }\n if (responseFinal) {\n finalReceived = true;\n }\n hasResponse = true;\n processLiveData(message);\n },\n onClose: () => {},\n });\n activeRunPromise = runPromise;\n\n const recovery = async () => {\n const isDouyinMiniProgram = supportsDouyinEventSource() && !!getMiniProgramRequest();\n const canRecover =\n isDouyinMiniProgram && !streamAborted && !finalReceived && recoveryAttempt < 2;\n if (canRecover) {\n console.log(\"[recovering]\");\n try {\n const status = await sessionRuntime.getChatStatus(lastTaskId || undefined);\n\n if (status.working && status.taskId) {\n currentStreamingTaskId = status.taskId;\n await runSession([], { taskId: status.taskId }, true, recoveryAttempt + 1, true);\n return;\n }\n\n if (!hasResponse && !lastTaskId && !status.taskId && recoveryAttempt < 1) {\n await runSession(messages, chatOptions, true, recoveryAttempt + 1, true);\n return;\n }\n } catch (recoveryError) {\n console.error(\"[ConversationController] recovery failed:\", recoveryError);\n }\n }\n };\n\n try {\n await runPromise;\n } catch (error) {\n if ((error as Error)?.name === \"AbortError\" || abortController.signal.aborted) {\n streamAborted = true;\n } else {\n streamFailed = true;\n console.error(\"[ConversationController] Stream error:\", error);\n }\n } finally {\n if (activeRunPromise === runPromise) {\n activeRunPromise = null;\n }\n if (activeAbortController === abortController) {\n activeAbortController = null;\n }\n\n recovery();\n\n if (streamFailed) {\n onSendError();\n } else if (!hasResponse && showLoadingPlaceholder && !streamAborted) {\n onSendError();\n } else if (streamAborted) {\n setLoading(false);\n emit();\n } else if (finalReceived && state.isLoading) {\n handleEnd();\n } else if (!finalReceived && state.isLoading) {\n onSendError();\n }\n }\n };\n\n return {\n getSnapshot() {\n return createSnapshot(state);\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n\n async init() {\n if (destroyed) return;\n if (initPromise) return initPromise;\n\n state.starting = true;\n emit();\n\n initPromise = (async () => {\n try {\n if (shouldLoadHistoryOnInit) {\n await this.loadHistory();\n }\n if (shouldResumeOnInit) {\n const result = await sessionRuntime.getChatStatus();\n if (result.taskId && result.working) {\n currentStreamingTaskId = result.taskId;\n await runSession([], { taskId: result.taskId }, false);\n }\n }\n } catch (error) {\n console.error(\"[ConversationController] init failed:\", error);\n } finally {\n state.starting = false;\n emit();\n initPromise = null;\n }\n })();\n\n return initPromise;\n },\n\n destroy() {\n destroyed = true;\n abortActiveSession();\n listeners.clear();\n },\n\n async sendMessage(userContent: string) {\n if (state.isLoading || !userContent.trim()) return;\n\n if (isSingleTurnMode) {\n this.abort();\n resetState();\n clearRuntimeMessageState();\n currentStreamingTaskId = null;\n refreshContextId();\n }\n\n addConversation({\n taskId: generateId(),\n status: \"submitted\",\n messages: [\n {\n messageId: generateId(),\n role: \"user\",\n kind: \"text-content\",\n content: userContent,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n });\n\n try {\n await runSession([{ role: \"user\", content: userContent }], undefined, true);\n } catch (error) {\n if ((error as Error).name === \"AbortError\") return;\n onSendError();\n }\n },\n\n abort() {\n const wasAborted = activeAbortController?.signal.aborted;\n abortActiveSession();\n clearRuntimeMessageState();\n currentStreamingTaskId = null;\n removeLoadingPlaceholder();\n if (!wasAborted) {\n void Promise.resolve();\n }\n },\n\n async cancelChat(taskId?: string) {\n const targetTaskId = taskId || currentStreamingTaskId;\n this.abort();\n\n addConversation({\n taskId: generateId(),\n status: \"error\",\n messages: [\n {\n messageId: `cancel-${Date.now()}`,\n role: \"assistant\",\n kind: \"text-content\",\n content: options.strings.cancelled,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n });\n\n if (!targetTaskId) return;\n\n try {\n await sessionRuntime.cancelChat(targetTaskId);\n currentStreamingTaskId = null;\n } catch (error) {\n console.error(\"[ConversationController] cancel failed:\", error);\n }\n },\n\n resetConversation(greeting?: string) {\n this.abort();\n resetState();\n currentStreamingTaskId = null;\n clearRuntimeMessageState();\n if (isSingleTurnMode) {\n refreshContextId();\n }\n\n if (greeting) {\n const taskId = `conv-${Date.now()}`;\n state.byId[taskId] = {\n taskId,\n status: \"submitted\",\n messages: [\n {\n messageId: `greeting-${Date.now()}`,\n role: \"assistant\",\n kind: \"text-content\",\n content: greeting,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n };\n state.order = [taskId];\n }\n\n emit();\n },\n\n async startNewConversation() {\n addConversation({\n taskId: generateId(),\n status: \"submitted\",\n messages: [],\n lastUpdated: nowIso(),\n system: { level: \"newConversation\" },\n });\n\n try {\n await sessionRuntime.newConversation();\n } catch (error) {\n console.error(\"[ConversationController] newConversation failed:\", error);\n }\n },\n\n async loadHistory(limit = 20, next?: string) {\n setLoading(true);\n emit();\n\n try {\n const result = await sessionRuntime.getHistory(limit, next);\n const messages = result?.messages || [];\n\n let taskId = \"\";\n let lastRole = \"\";\n const taskIds: string[] = [];\n\n messages.forEach((message: any) => {\n const role = message.role === \"agent\" ? \"assistant\" : \"user\";\n if (role !== lastRole) {\n taskId = `history-conv-${generateId()}`;\n taskIds.push(taskId);\n lastRole = role;\n }\n processHistoryData(message, taskId);\n });\n\n state.order = [...taskIds, ...state.order.filter((id) => !taskIds.includes(id))];\n state.historyState = {\n next: result?.next || null,\n hasMore: result?.hasMore || false,\n };\n } catch (error) {\n console.error(\"[ConversationController] loadHistory failed:\", error);\n } finally {\n state.isLoadingHistory = false;\n emit();\n }\n },\n\n async loadMoreHistory() {\n if (!state.historyState.hasMore || state.isLoadingHistory || !state.historyState.next) return;\n await this.loadHistory(20, state.historyState.next);\n },\n\n getConversation(taskId: string) {\n const conversation = state.byId[taskId];\n return conversation ? cloneConversation(conversation) : undefined;\n },\n\n clearConversation(taskId: string) {\n clearConversation(taskId);\n },\n\n removeMessage(taskId: string, messageId: string) {\n const conversation = state.byId[taskId];\n if (!conversation) return;\n\n state.byId[taskId] = {\n ...conversation,\n messages: conversation.messages.filter((message) => message.messageId !== messageId),\n lastUpdated: nowIso(),\n };\n pushTaskToOrder(taskId, true);\n emit();\n },\n\n updateMessage(input) {\n const {\n taskId,\n messageId,\n content,\n partial = false,\n status,\n response,\n metadata = {},\n } = input;\n const conversation = state.byId[taskId];\n if (!conversation) return;\n\n const messageIndex = conversation.messages.findIndex(\n (message) => message.messageId === messageId\n );\n if (messageIndex === -1) return;\n\n const oldMessage = conversation.messages[messageIndex];\n if (!oldMessage) return;\n\n const updatedMessage: MessagesItem = { ...oldMessage, ...metadata } as MessagesItem;\n\n if (content !== undefined) {\n if (\"content\" in updatedMessage) {\n updatedMessage.content = partial\n ? `${(updatedMessage as TextMessage).content || \"\"}${content}`\n : content;\n } else if (\"thought\" in updatedMessage) {\n updatedMessage.thought = partial\n ? `${(updatedMessage as ThoughtMessage).thought || \"\"}${content}`\n : content;\n } else if (oldMessage.kind === \"text-content\") {\n (updatedMessage as TextMessage).content = partial\n ? `${(oldMessage as TextMessage).content || \"\"}${content}`\n : content;\n }\n }\n\n if (\"toolStatus\" in updatedMessage || status) {\n (updatedMessage as ToolMessage).toolStatus =\n status || (updatedMessage as ToolMessage).toolStatus;\n }\n if (response !== undefined) {\n (updatedMessage as ToolMessage).response = response;\n }\n\n const nextMessages = [...conversation.messages];\n nextMessages[messageIndex] = updatedMessage;\n\n state.byId[taskId] = {\n ...conversation,\n messages: nextMessages,\n lastUpdated: nowIso(),\n };\n pushTaskToOrder(taskId, true);\n emit();\n },\n };\n}\n","import { getMiniProgramRequest } from \"@amaster.ai/http-client\";\n\nexport type ContextIdMode = \"conversation\" | \"single-turn\";\n\nfunction generateUUID(): string {\n const cryptoObj = typeof globalThis !== \"undefined\" ? globalThis.crypto : undefined;\n\n if (cryptoObj && typeof cryptoObj.randomUUID === \"function\") {\n return cryptoObj.randomUUID();\n }\n\n if (cryptoObj && typeof cryptoObj.getRandomValues === \"function\") {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (char) => {\n const randomValues = cryptoObj.getRandomValues(new Uint8Array(1));\n const random = (randomValues[0] ?? 0) % 16;\n const value = char === \"x\" ? random : (random & 0x3) | 0x8;\n return value.toString(16);\n });\n }\n\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (char) => {\n const random = (Math.random() * 16) | 0;\n const value = char === \"x\" ? random : (random & 0x3) | 0x8;\n return value.toString(16);\n });\n}\n\nfunction getAppIdFromHostname(hostname: string): string | null {\n const wwwMatch = /^www\\.([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (wwwMatch?.[1]) return wwwMatch[1];\n\n const domainMatch = /^([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (domainMatch?.[1]) return domainMatch[1];\n\n return null;\n}\n\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") return null;\n\n try {\n const url = window.location.href;\n const pathMatch = /\\/app\\/([\\da-z-]+)(?:\\/|$)/.exec(url);\n if (pathMatch?.[1]) return pathMatch[1];\n return getAppIdFromHostname(window.location.hostname);\n } catch {\n return null;\n }\n}\n\nlet cachedAppId: string | null = null;\nlet cachedAnonymousUid: string | null = null;\n\nfunction getAppId(hostname?: string): string {\n const urlAppId = hostname ? getAppIdFromHostname(hostname) : extractAppIdFromUrl();\n if (urlAppId) return urlAppId;\n if (!cachedAppId) cachedAppId = generateUUID();\n return cachedAppId;\n}\n\nexport function createContextIdResolver(url: string, getUserUid?: () => string | null) {\n const createContextId = createContextIdFactory(url, getUserUid);\n return () => {\n return createContextId(\"conversation\");\n };\n}\n\nexport function createContextIdFactory(url: string, getUserUid?: () => string | null) {\n return (mode: ContextIdMode = \"conversation\") => {\n const isMiniProgram = getMiniProgramRequest();\n let appId = getAppId();\n\n if (isMiniProgram) {\n const hostname = url ? url.replace(/^https?:\\/\\//, \"\").split(\"/\")[0] : \"\";\n appId = getAppId(hostname);\n }\n\n const userUid = getUserUid?.() ?? (cachedAnonymousUid ??= `anonymous-${generateUUID()}`);\n const baseContextId = `${appId}:${userUid}`;\n\n if (mode === \"single-turn\") {\n return `${baseContextId}:${generateUUID()}`;\n }\n\n return baseContextId;\n };\n}\n\nexport { generateUUID };\n","import type { Part } from \"@a2a-js/sdk\";\nimport type { MessageContent, TextContent } from \"../types\";\n\nexport function convertToA2AParts(content: string | MessageContent[]): Part[] {\n if (typeof content === \"string\") {\n return [{ kind: \"text\", text: content }];\n }\n\n return content\n .map((part): Part | null => {\n switch (part.type) {\n case \"text\":\n return { kind: \"text\", text: part.text };\n case \"image\":\n if (part.data) {\n return {\n kind: \"file\",\n file: {\n bytes: part.data,\n mimeType: part.mimeType || \"image/png\",\n },\n };\n }\n if (part.url) {\n return {\n kind: \"file\",\n file: { uri: part.url, mimeType: part.mimeType || \"image/png\" },\n };\n }\n return null;\n case \"file\":\n if (part.data) {\n return {\n kind: \"file\",\n file: {\n bytes: part.data,\n ...(part.mimeType && { mimeType: part.mimeType }),\n ...(part.name && { name: part.name }),\n },\n };\n }\n if (part.url) {\n return {\n kind: \"file\",\n file: {\n uri: part.url,\n ...(part.mimeType && { mimeType: part.mimeType }),\n ...(part.name && { name: part.name }),\n },\n };\n }\n return null;\n default:\n return null;\n }\n })\n .filter((part): part is Part => part !== null);\n}\n\nexport function extractTextFromContent(content: string | MessageContent[]): string {\n if (typeof content === \"string\") {\n return content;\n }\n return content\n .filter((part): part is TextContent => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\");\n}\n","import type { ContextIdMode } from \"./context\";\nimport type { ConversationRuntime, ConversationRuntimeFactory } from \"../types\";\n\nexport function createSessionRuntimeFactory(args: {\n createContextId: (mode?: ContextIdMode) => string;\n createRuntime: (contextId: string) => ConversationRuntime;\n}): ConversationRuntimeFactory {\n return {\n createContextId(mode) {\n return args.createContextId(mode);\n },\n createScopedRuntime(contextId: string) {\n return args.createRuntime(contextId);\n },\n };\n}\n","import type {\n CancelTaskRequest,\n CancelTaskResponse,\n SendStreamingMessageRequest,\n} from \"@a2a-js/sdk\";\nimport type { ConversationRuntime, ConversationRuntimeFactory } from \"../types\";\nimport { generateUUID, type ContextIdMode } from \"./context\";\nimport { convertToA2AParts, extractTextFromContent } from \"./message-content\";\nimport { createSessionRuntimeFactory } from \"./session-runtime\";\nimport type { StreamHandlers } from \"./stream\";\n\ninterface CreateCopilotRuntimeFactoryArgs {\n createContextId: (mode?: ContextIdMode) => string;\n postRpc: (data: unknown) => Promise<unknown>;\n sendMessageStream: (\n request: SendStreamingMessageRequest,\n handlers: StreamHandlers,\n signal?: ConversationRuntimeSendSignal,\n preferMiniProgramRequest?: boolean,\n ) => Promise<void>;\n}\n\ntype ConversationRuntimeSendSignal = Parameters<ConversationRuntime[\"sendMessage\"]>[1][\"signal\"];\n\nexport function createCopilotRuntimeFactory({\n createContextId,\n postRpc,\n sendMessageStream,\n}: CreateCopilotRuntimeFactoryArgs): ConversationRuntimeFactory {\n return createSessionRuntimeFactory({\n createContextId,\n createRuntime(contextId: string): ConversationRuntime {\n return {\n async sendMessage(messages, options) {\n const { taskId, signal, onOpen, onMessage, onClose, preferMiniProgramRequest } = options;\n const systemMsg = messages.find((message) => message.role === \"system\");\n const nonSystemMsgs = messages.filter((message) => message.role !== \"system\");\n const lastUserMsg = nonSystemMsgs[nonSystemMsgs.length - 1];\n\n const parts = lastUserMsg\n ? convertToA2AParts(lastUserMsg.content)\n : [{ kind: \"text\" as const, text: \"\" }];\n\n const systemPrompt = systemMsg ? extractTextFromContent(systemMsg.content) : undefined;\n\n const request: SendStreamingMessageRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"message/stream\",\n params: {\n message: {\n contextId,\n kind: \"message\",\n messageId: generateUUID(),\n role: \"user\",\n parts,\n ...(taskId ? { taskId } : {}),\n ...(systemPrompt ? { metadata: { systemPrompt } } : {}),\n },\n },\n };\n\n await sendMessageStream(\n request,\n { onOpen, onMessage, onClose },\n signal,\n preferMiniProgramRequest\n );\n },\n\n cancelChat(taskId) {\n const request: CancelTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/cancel\",\n params: { id: taskId },\n };\n return postRpc(request) as Promise<CancelTaskResponse>;\n },\n\n async getHistory(limit = 50, next?: string) {\n try {\n const response: any = await postRpc({\n jsonrpc: \"2.0\",\n method: \"messages/list\",\n id: generateUUID(),\n params: {\n filter: { contextId },\n limit,\n ...(next ? { next } : {}),\n },\n });\n const result = response?.data?.result || {};\n const messages = result?.messages || [];\n const cursor = result?.next || \"\";\n\n return {\n messages,\n next: cursor,\n hasMore: !!cursor,\n };\n } catch {\n return undefined;\n }\n },\n\n async newConversation() {\n try {\n await postRpc({\n jsonrpc: \"2.0\",\n method: \"messages/clear\",\n id: generateUUID(),\n params: { contextId },\n });\n } catch {\n // noop\n }\n },\n\n async getChatStatus(taskId) {\n try {\n const request = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/get\",\n params: taskId ? { id: taskId } : { contextId },\n };\n const result: any = await postRpc(request);\n const data = result?.data?.result;\n return {\n working: data?.status?.state === \"working\",\n taskId: data?.id,\n error: data?.error?.message || \"\",\n };\n } catch (error) {\n return {\n working: false,\n error: (error as any)?.message || \"\",\n };\n }\n },\n };\n },\n });\n}\n","import { createParser } from \"eventsource-parser\";\nimport type { SendStreamingMessageResponse } from \"@a2a-js/sdk\";\nimport type { AbortSignalLike } from \"../../types\";\n\nexport interface StreamHandlers {\n onOpen?: () => void;\n onMessage: (message: SendStreamingMessageResponse) => void;\n onClose?: () => void;\n}\n\nexport function normalizeStreamError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (error && typeof error === \"object\") {\n const payload = error as Record<string, unknown>;\n const message =\n (typeof payload.errMsg === \"string\" && payload.errMsg) ||\n (typeof payload.message === \"string\" && payload.message) ||\n JSON.stringify(payload);\n const normalized = new Error(message);\n if (typeof payload.errorCode === \"number\" || typeof payload.errorCode === \"string\") {\n (normalized as any).errorCode = payload.errorCode;\n }\n if (typeof payload.errNo === \"number\" || typeof payload.errNo === \"string\") {\n (normalized as any).errNo = payload.errNo;\n }\n (normalized as any).raw = error;\n return normalized;\n }\n\n return new Error(String(error));\n}\n\nexport function createAbortError(): Error {\n if (typeof DOMException !== \"undefined\") {\n return new DOMException(\"Aborted\", \"AbortError\");\n }\n const error = new Error(\"Aborted\");\n error.name = \"AbortError\";\n return error;\n}\n\nexport function createSSEConsumer(handlers: StreamHandlers) {\n return createParser({\n onEvent: (event) => {\n try {\n handlers.onMessage(JSON.parse(event.data));\n } catch (error) {\n console.error(\"[copilot stream] failed to parse SSE event:\", error, event.data);\n }\n },\n });\n}\n\nexport function bindAbortSignal(signal: AbortSignalLike | undefined, onAbort: () => void) {\n if (!signal) return;\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener(\"abort\", onAbort);\n}\n","import type { AbortSignalLike } from \"../../types\";\nimport { createAbortError, createSSEConsumer, type StreamHandlers } from \"./shared\";\n\nexport async function startBrowserStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string>,\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n): Promise<void> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...authHeader,\n };\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify(data),\n signal: signal as AbortSignal | undefined,\n });\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText || response.status}`);\n }\n\n handlers.onOpen?.();\n\n if (!response.body) {\n handlers.onClose?.();\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parser = createSSEConsumer(handlers);\n\n try {\n while (true) {\n if (signal?.aborted) {\n throw createAbortError();\n }\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n parser.feed(decoder.decode(value, { stream: true }));\n }\n } finally {\n handlers.onClose?.();\n }\n}\n","import MiniProgramTextDecoder from \"miniprogram-text-decoder\";\nimport type { AbortSignalLike } from \"../../types\";\nimport { getMiniProgramRequest, supportsChunkedRequest } from \"../platform\";\nimport { bindAbortSignal, createAbortError, createSSEConsumer, normalizeStreamError, type StreamHandlers } from \"./shared\";\n\nfunction decodeMiniProgramArrayBuffer(\n value: ArrayBuffer | Uint8Array | undefined,\n textDecoder: MiniProgramTextDecoder\n): string {\n if (!value) return \"\";\n const buffer = value instanceof Uint8Array ? value : new Uint8Array(value);\n if (buffer.length === 0) return \"\";\n return textDecoder.decode(buffer, { stream: false });\n}\n\nexport async function startMiniProgramStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string> = {},\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let chunkBuffer = new Uint8Array(0);\n const textDecoder = new MiniProgramTextDecoder(\"utf-8\", { fatal: false });\n let sawChunk = false;\n let settled = false;\n let opened = false;\n const parser = createSSEConsumer(handlers);\n\n const finish = (error?: unknown) => {\n if (settled) return;\n settled = true;\n if (error) {\n reject(normalizeStreamError(error));\n return;\n }\n handlers.onClose?.();\n resolve();\n };\n\n const emitOpen = () => {\n if (opened) return;\n opened = true;\n handlers.onOpen?.();\n };\n\n const feedText = (text: string) => {\n if (!text) return;\n emitOpen();\n parser.feed(text);\n };\n\n const chunkListener = (response: any) => {\n if (settled || !response.data) return;\n\n try {\n sawChunk = true;\n const newChunk = new Uint8Array(response.data as ArrayBuffer);\n const merged = new Uint8Array(chunkBuffer.length + newChunk.length);\n merged.set(chunkBuffer);\n merged.set(newChunk, chunkBuffer.length);\n chunkBuffer = merged;\n\n let decodeOffset = 0;\n while (decodeOffset < chunkBuffer.length) {\n const remaining = chunkBuffer.subarray(decodeOffset);\n const decoded = textDecoder.decode(remaining, { stream: false });\n\n if (decoded.length === 0) {\n break;\n }\n\n if (decoded.includes(\"�\")) {\n const lastGoodIndex = decoded.lastIndexOf(\"�\") === 0 ? 0 : decoded.indexOf(\"�\");\n if (lastGoodIndex <= 0) {\n break;\n }\n\n const goodPart = decoded.slice(0, lastGoodIndex);\n if (goodPart) {\n feedText(goodPart);\n }\n\n const encodedGood = new TextEncoder().encode(goodPart);\n decodeOffset += encodedGood.length;\n break;\n }\n\n feedText(decoded);\n decodeOffset += remaining.length;\n }\n\n chunkBuffer = chunkBuffer.subarray(decodeOffset);\n } catch (error) {\n console.error(\"[mini stream] chunk process error:\", error);\n }\n };\n\n const headersListener = (response: any) => {\n emitOpen();\n if (response.header?.[\"content-type\"]?.includes(\"text/event-stream\") === false) {\n console.warn(\"Warning: server did not return event-stream\");\n }\n };\n\n const miniReq = getMiniProgramRequest();\n if (!miniReq) {\n reject(new Error(\"Mini-program request API not found\"));\n return;\n }\n\n try {\n const requestTask = miniReq({\n url,\n method: \"POST\",\n header: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...authHeader,\n },\n data: typeof data === \"string\" ? data : JSON.stringify(data),\n responseType: \"arraybuffer\",\n ...supportsChunkedRequest() ? {\n enableChunked: true\n } : {},\n success: (response: any) => {\n if (!sawChunk && response?.data) {\n const wholeResponse = decodeMiniProgramArrayBuffer(response.data, textDecoder);\n feedText(wholeResponse);\n }\n if (chunkBuffer.length > 0) {\n const finalText = textDecoder.decode(chunkBuffer, { stream: true });\n feedText(finalText);\n }\n finish();\n },\n fail: (error: any) => {\n finish(error);\n },\n });\n\n bindAbortSignal(signal, () => {\n requestTask.abort?.();\n finish(createAbortError());\n });\n\n requestTask.onChunkReceived?.(chunkListener);\n requestTask.onHeadersReceived?.(headersListener);\n } catch (error) {\n finish(error);\n }\n });\n}\n","import type { AbortSignalLike } from \"../../types\";\nimport { getMiniProgramRequest } from \"../platform\";\n// import { supportsDouyinEventSource } from \"../platform\";\nimport { startBrowserStream } from \"./browser\";\n// import { startDouyinEventSourceStream } from \"./douyin\";\nimport { startMiniProgramStream } from \"./mini-program\";\nimport type { StreamHandlers } from \"./shared\";\n\nexport async function startStream(\n url: string,\n data: unknown,\n getAccessToken: (() => string | null) | undefined,\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n preferMiniProgramRequest = false,\n): Promise<void> {\n const token = getAccessToken?.();\n const authHeader: Record<string, string> = token ? { Authorization: `Bearer ${token}` } : {};\n const miniReq = getMiniProgramRequest();\n\n if (preferMiniProgramRequest && miniReq) {\n await startMiniProgramStream(url, data, authHeader, handlers, signal);\n return;\n }\n\n // 抖音小程序的真机流式非常不好用,先注释\n // if (supportsDouyinEventSource()) {\n // await startDouyinEventSourceStream(url, data, authHeader, handlers, signal);\n // return;\n // }\n\n if (miniReq) {\n await startMiniProgramStream(url, data, authHeader, handlers, signal);\n return;\n }\n\n await startBrowserStream(url, data, authHeader, handlers, signal);\n}\n\nexport type { StreamHandlers } from \"./shared\";\n","/* eslint-disable no-unused-vars */\nimport type { SendStreamingMessageRequest } from \"@a2a-js/sdk\";\nimport type { HttpClient } from \"@amaster.ai/http-client\";\nimport { createConversationController } from \"./conversation-controller\";\nimport { createContextIdFactory } from \"./runtime/context\";\nimport { createCopilotRuntimeFactory } from \"./runtime/copilot-runtime\";\nimport { startStream, type StreamHandlers } from \"./runtime/stream\";\nimport type {\n AbortSignalLike,\n ConversationController,\n ConversationControllerOptions,\n ConversationRuntimeFactory,\n} from \"./types\";\n\nexport type { TextContent, ImageContent, FileContent, MessageContent } from \"./types\";\n\nexport type CopilotClient = {\n createConversationController(options: ConversationControllerOptions): ConversationController;\n};\n\nexport function createCopilotClient(\n http: HttpClient,\n baseUrl?: string,\n getAccessToken?: () => string | null,\n getUserUid?: () => string | null\n): CopilotClient {\n let envBaseUrl = \"\";\n try {\n envBaseUrl =\n process.env.TARO_APP_API_BASE_URL ||\n process.env.VITE_API_BASE_URL ||\n process.env.API_BASE_URL ||\n \"\";\n } catch {\n // process is not defined -> ignore\n }\n\n envBaseUrl = String(envBaseUrl || \"\").trim();\n const url = `${baseUrl || envBaseUrl}/api/proxy/builtin/platform/copilot`;\n\n const postRpc = <T>(data: unknown) =>\n http.request<T>({\n url,\n method: \"POST\",\n data,\n });\n\n const createContextId = createContextIdFactory(url, getUserUid);\n\n async function sendMessageStream(\n request: SendStreamingMessageRequest,\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n preferMiniProgramRequest?: boolean,\n ): Promise<void> {\n try {\n await startStream(\n url,\n request,\n getAccessToken,\n handlers,\n signal,\n preferMiniProgramRequest,\n );\n } catch (error) {\n if (signal?.aborted) {\n return;\n }\n throw error;\n }\n }\n\n const runtime: ConversationRuntimeFactory = createCopilotRuntimeFactory({\n createContextId,\n postRpc,\n sendMessageStream,\n });\n\n return {\n createConversationController(options) {\n return createConversationController(runtime, options);\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/controller/utils.ts","../src/controller/message-handlers.ts","../src/runtime/platform.ts","../src/conversation-controller.ts","../src/runtime/context.ts","../src/runtime/message-content.ts","../src/runtime/session-runtime.ts","../src/runtime/copilot-runtime.ts","../src/runtime/stream/shared.ts","../src/runtime/stream/browser.ts","../src/runtime/stream/mini-program.ts","../src/runtime/stream/index.ts","../src/copilot-client.ts"],"names":["SimpleAbortController","_event","listener","createAbortController","nowIso","generateId","cloneMessage","message","cloneConversation","conversation","createSnapshot","state","id","handlers","conv","part","role","status","existing","newText","newChunk","_id","partData","tool","name","request","toolStatus","errorMsg","spec","getKind","metadata","supportsChunkedRequest","runtime","resolveMiniProgramGlobals","supportsDouyinEventSource","createConversationController","copilot","options","isSingleTurnMode","shouldLoadHistoryOnInit","shouldResumeOnInit","resolveContextId","listeners","activeAbortController","currentStreamingTaskId","lastMessageType","lastMessageId","initPromise","destroyed","currentContextId","sessionRuntime","activeRequestConversationId","emit","snapshot","removeTaskFromOrder","taskId","pushTaskToOrder","append","clearRuntimeMessageState","isNetworkError","error","payload","errorCode","errNo","createRuntimeError","source","updateConversationRequestMeta","input","clearConversationRuntimeState","resetState","setLoading","removeLoadingPlaceholder","refreshContextId","abortActiveSession","handleEnd","addConversation","clearConversation","addLoadingPlaceholder","fillData","kind","handler","isHistory","historyId","messageId","prevConversation","nextConversation","onSendError","requestConversationId","processLiveData","data","result","final","firstPart","processHistoryData","text","json","runSession","messages","chatOptions","showLoadingPlaceholder","recoveryAttempt","preferMiniProgramRequest","abortController","hasResponse","streamFailed","streamAborted","finalReceived","lastTaskId","runPromise","responseTaskId","responseFinal","recovery","getMiniProgramRequest","recoveryError","streamError","recovered","userContent","localTaskId","wasAborted","targetTaskId","greeting","limit","next","lastRole","taskIds","content","partial","response","messageIndex","oldMessage","updatedMessage","nextMessages","generateUUID","cryptoObj","char","random","getAppIdFromHostname","hostname","wwwMatch","domainMatch","extractAppIdFromUrl","url","pathMatch","cachedAppId","cachedAnonymousUid","getAppId","urlAppId","createContextIdFactory","getUserUid","mode","isMiniProgram","appId","userUid","baseContextId","convertToA2AParts","extractTextFromContent","createSessionRuntimeFactory","args","contextId","createCopilotRuntimeFactory","createContextId","postRpc","sendMessageStream","signal","onOpen","onMessage","onClose","systemMsg","nonSystemMsgs","lastUserMsg","parts","systemPrompt","cursor","normalizeStreamError","normalized","createAbortError","createSSEConsumer","createParser","event","bindAbortSignal","onAbort","startBrowserStream","authHeader","headers","reader","decoder","parser","done","value","decodeMiniProgramArrayBuffer","textDecoder","buffer","startMiniProgramStream","resolve","reject","chunkBuffer","MiniProgramTextDecoder","sawChunk","settled","opened","finish","emitOpen","feedText","chunkListener","merged","decodeOffset","remaining","decoded","lastGoodIndex","goodPart","encodedGood","headersListener","miniReq","requestTask","wholeResponse","finalText","startStream","getAccessToken","token","createCopilotClient","http","baseUrl","envBaseUrl"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\n Conversation,\n ConversationControllerSnapshot,\n HistoryState,\n MessagesItem,\n} from \"../types\";\n\nexport type InternalState = {\n byId: Record<string, Conversation>;\n order: string[];\n starting: boolean;\n isLoading: boolean;\n isLoadingHistory: boolean;\n historyState: HistoryState;\n};\n\nexport class SimpleAbortController {\n aborted = false;\n private listeners: Array<() => void> = [];\n\n signal = {\n aborted: false,\n addEventListener: (_event: \"abort\", listener: () => void) => {\n this.listeners.push(listener);\n },\n };\n\n abort() {\n if (this.aborted) return;\n this.aborted = true;\n this.signal.aborted = true;\n this.listeners.forEach((listener) => listener());\n }\n}\n\nexport function createAbortController(): AbortController | SimpleAbortController {\n if (typeof AbortController !== \"undefined\") {\n return new AbortController();\n }\n return new SimpleAbortController();\n}\n\nexport function nowIso() {\n return new Date().toISOString();\n}\n\nexport function generateId() {\n return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function cloneMessage<T extends MessagesItem>(message: T): T {\n return { ...message } as T;\n}\n\nexport function cloneConversation(conversation: Conversation): Conversation {\n return {\n ...conversation,\n system: conversation.system ? { ...conversation.system } : undefined,\n runtimeError: conversation.runtimeError ? { ...conversation.runtimeError } : undefined,\n messages: conversation.messages.map((message) => cloneMessage(message)),\n };\n}\n\nexport function createSnapshot(state: InternalState): ConversationControllerSnapshot {\n return {\n starting: state.starting,\n isLoading: state.isLoading,\n isLoadingHistory: state.isLoadingHistory,\n historyState: { ...state.historyState },\n conversations: state.order\n .map((id) => state.byId[id])\n .filter((conversation): conversation is Conversation => Boolean(conversation))\n .map((conversation) => cloneConversation(conversation)),\n };\n}\n","import type { Conversation, ErrorMessage, MessagesItem, Role, TextMessage, ThoughtMessage, ToolMessage, UIRenderMessage } from \"../types\";\nimport { nowIso } from \"./utils\";\n\nexport type MessageHandler = (\n conv: Conversation,\n part: any,\n id: string,\n role: Role,\n status?: any\n) => Conversation;\n\nexport const handlers: Record<string, MessageHandler> = {\n \"text-content\": (conv, part, id, role, status) => {\n if (!id) return conv;\n const existing = conv.messages.find((message) => message.messageId === id);\n const newText = part.text || \"\";\n\n if (existing && \"content\" in existing) {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id\n ? ({ ...message, content: (message as TextMessage).content + newText } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"text-content\",\n content: newText,\n timestamp: status?.timestamp || nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n thought: (conv, part, id, role, status) => {\n if (!id) return conv;\n const newChunk = part?.data?.description || \"\";\n const existing = conv.messages.find((message) => message.messageId === id);\n\n if (existing && \"thought\" in existing) {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id\n ? ({ ...message, thought: (message as ThoughtMessage).thought + newChunk } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"thought\",\n thought: newChunk,\n timestamp: status?.timestamp || nowIso(),\n } as ThoughtMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n tool: (conv, part, _id, role, status) => {\n const partData = part?.data || {};\n const tool = partData?.tool;\n const name = tool?.displayName || tool?.name || \"\";\n const request = partData?.request;\n const id = request?.callId;\n if (!id || !name) return conv;\n\n const toolStatus = partData?.status;\n const existing = conv.messages.find((message) => message.messageId === id);\n\n if (existing && \"toolStatus\" in existing) {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id\n ? ({\n ...message,\n toolStatus: toolStatus || (message as ToolMessage).toolStatus,\n } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"tool\",\n toolName: name,\n toolDescription: request?.args?.query || \"\",\n toolStatus: toolStatus || \"pending\",\n timestamp: status?.timestamp || nowIso(),\n } as ToolMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n error: (conv, part, id, role) => {\n const errorMsg = part?.text || part?.data?.error || \"发生错误\";\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id || `error-${Date.now()}`,\n role,\n kind: \"error\",\n content: errorMsg,\n timestamp: nowIso(),\n } as ErrorMessage,\n ],\n status: \"error\",\n lastUpdated: nowIso(),\n };\n },\n\n \"ui-render\": (conv, part, id, role, status) => {\n if (!id) return conv;\n const existing = conv.messages.find((message) => message.messageId === id);\n const partData = part?.data || {};\n const spec = partData.spec || { root: \"\", elements: {} };\n\n if (existing && existing.kind === \"ui-render\") {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id ? ({ ...(message as UIRenderMessage), spec } as MessagesItem) : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"ui-render\",\n spec,\n timestamp: status?.timestamp || nowIso(),\n } as UIRenderMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n};\n\nexport function getKind(part: any, metadata?: any) {\n if (part?.data?.tool) return \"tool\";\n if (part?.data?.type === \"ui\") return \"ui-render\";\n if (part?.kind === \"text\") return \"text-content\";\n if (part?.data?.type === \"though\" || metadata?.coderAgent?.kind === \"thought\") return \"thought\";\n if (metadata?.error) return \"error\";\n return \"unknown\";\n}\n","export { getMiniProgramRequest, resolveMiniProgramGlobals } from \"@amaster.ai/http-client\";\nimport { resolveMiniProgramGlobals } from \"@amaster.ai/http-client\";\n\nexport function supportsChunkedRequest(): boolean {\n const runtime = resolveMiniProgramGlobals();\n return typeof runtime?.wx?.request === \"function\" || typeof runtime?.qq?.request === \"function\";\n}\n\nexport function supportsDouyinEventSource(): boolean {\n const runtime = resolveMiniProgramGlobals();\n return typeof runtime?.tt?.createEventSource === \"function\";\n}\n","import type {\n Message1,\n SendStreamingMessageResponse,\n SendStreamingMessageSuccessResponse,\n TextPart,\n} from \"@a2a-js/sdk\";\nimport { handlers, type MessageHandler, getKind } from \"./controller/message-handlers\";\nimport {\n cloneConversation,\n createAbortController,\n createSnapshot,\n generateId,\n nowIso,\n type InternalState,\n type SimpleAbortController,\n} from \"./controller/utils\";\nimport { getMiniProgramRequest, supportsDouyinEventSource } from \"./runtime/platform\";\nimport type {\n Conversation,\n ConversationController,\n ConversationControllerOptions,\n ConversationRuntimeError,\n ConversationRuntimeFactory,\n MessagesItem,\n TextMessage,\n ThoughtMessage,\n ToolMessage,\n} from \"./types\";\n\nexport type {\n Role,\n TextMessage,\n ErrorMessage,\n ThoughtMessage,\n ToolMessage,\n UIRenderMessage,\n MessagesItem,\n Conversation,\n HistoryState,\n ConversationRequestState,\n ConversationRuntimeError,\n UpdateMessageInput,\n ConversationControllerSnapshot,\n ConversationStrings,\n ConversationControllerOptions,\n ConversationController,\n} from \"./types\";\n\nexport function createConversationController(\n copilot: ConversationRuntimeFactory,\n options: ConversationControllerOptions\n): ConversationController {\n const mode = options.mode || \"conversation\";\n const isSingleTurnMode = mode === \"single-turn\";\n const shouldLoadHistoryOnInit = !isSingleTurnMode;\n const shouldResumeOnInit = !isSingleTurnMode;\n const resolveContextId = () =>\n options.getContextId?.() ??\n copilot.createContextId(isSingleTurnMode ? \"single-turn\" : \"conversation\");\n\n const state: InternalState = {\n byId: {},\n order: [],\n starting: true,\n isLoading: false,\n isLoadingHistory: false,\n historyState: {\n next: null,\n hasMore: false,\n },\n };\n\n const listeners = new Set<(snapshot: ReturnType<typeof createSnapshot>) => void>();\n let activeAbortController: AbortController | SimpleAbortController | null = null;\n let activeRunPromise: Promise<void> | null = null;\n let currentStreamingTaskId: string | null = null;\n let lastMessageType = \"unknown\";\n let lastMessageId = \"\";\n let initPromise: Promise<void> | null = null;\n let destroyed = false;\n let currentContextId = resolveContextId();\n let sessionRuntime = copilot.createScopedRuntime(currentContextId);\n let activeRequestConversationId: string | null = null;\n\n const emit = () => {\n if (destroyed) return;\n const snapshot = createSnapshot(state);\n listeners.forEach((listener) => listener(snapshot));\n };\n\n const removeTaskFromOrder = (taskId: string) => {\n state.order = state.order.filter((id) => id !== taskId);\n };\n\n const pushTaskToOrder = (taskId: string, append = true) => {\n removeTaskFromOrder(taskId);\n state.order = append ? [...state.order, taskId] : [taskId, ...state.order];\n };\n\n const clearRuntimeMessageState = () => {\n lastMessageType = \"unknown\";\n lastMessageId = \"\";\n };\n\n const isNetworkError = (error: unknown) => {\n const payload = (error && typeof error === \"object\" ? error : {}) as Record<string, unknown>;\n const message = String(payload.message || payload.errMsg || \"\").toLowerCase();\n const errorCode = String(payload.errorCode || \"\");\n const errNo = String(payload.errNo || \"\");\n\n return (\n payload.name === \"TypeError\" ||\n /network|failed to fetch|fetch failed|request failed|timeout|timed out|connection|disconnected|offline|断网|网络/.test(\n message\n ) ||\n [\"600009\", \"21101\", \"21102\", \"21103\"].includes(errorCode) ||\n [\"600009\", \"21101\", \"21102\", \"21103\"].includes(errNo)\n );\n };\n\n const createRuntimeError = (\n error: unknown,\n source: \"send\" | \"stream\" | \"recovery\" = \"stream\"\n ): ConversationRuntimeError => {\n return {\n code: isNetworkError(error) ? \"network\" : \"unknown\",\n message: isNetworkError(error) ? \"网络错误,请检查网络连接后重试\" : options.strings.errorMessage,\n retryable: true,\n source,\n timestamp: nowIso(),\n };\n };\n\n const updateConversationRequestMeta = (\n taskId: string | null | undefined,\n input: {\n requestState?: \"idle\" | \"submitting\" | \"streaming\" | \"recovering\" | \"error\";\n runtimeError?: ReturnType<typeof createRuntimeError> | null;\n status?: Conversation[\"status\"];\n }\n ) => {\n if (!taskId) return;\n const conversation = state.byId[taskId];\n if (!conversation) return;\n\n state.byId[taskId] = {\n ...conversation,\n requestState: input.requestState ?? conversation.requestState,\n runtimeError:\n input.runtimeError === undefined ? conversation.runtimeError : input.runtimeError,\n status: input.status ?? conversation.status,\n lastUpdated: nowIso(),\n };\n };\n\n const clearConversationRuntimeState = (taskId: string | null | undefined) => {\n updateConversationRequestMeta(taskId, {\n requestState: \"idle\",\n runtimeError: null,\n });\n };\n\n const resetState = () => {\n state.byId = {};\n state.order = [];\n state.historyState = {\n next: null,\n hasMore: false,\n };\n };\n\n const setLoading = (status: boolean) => {\n state.isLoading = status;\n !status && removeLoadingPlaceholder();\n };\n\n const refreshContextId = () => {\n currentContextId = resolveContextId();\n sessionRuntime = copilot.createScopedRuntime(currentContextId);\n return currentContextId;\n };\n\n const abortActiveSession = () => {\n activeAbortController?.abort();\n activeAbortController = null;\n activeRunPromise = null;\n clearConversationRuntimeState(activeRequestConversationId);\n setLoading(false);\n emit();\n };\n\n const handleEnd = () => {\n clearRuntimeMessageState();\n clearConversationRuntimeState(activeRequestConversationId);\n if (activeRequestConversationId) {\n updateConversationRequestMeta(activeRequestConversationId, {\n status: \"completed\",\n });\n }\n activeRequestConversationId = null;\n currentStreamingTaskId = null;\n activeAbortController = null;\n activeRunPromise = null;\n setLoading(false);\n emit();\n };\n\n const addConversation = (conversation: Conversation) => {\n state.byId[conversation.taskId] = conversation;\n pushTaskToOrder(conversation.taskId, true);\n emit();\n };\n\n const clearConversation = (taskId: string) => {\n if (!state.byId[taskId]) return;\n delete state.byId[taskId];\n removeTaskFromOrder(taskId);\n emit();\n };\n\n const addLoadingPlaceholder = () => {\n addConversation({\n taskId: \"loading-placeholder\",\n status: \"working\",\n messages: [\n {\n messageId: \"loading-placeholder\",\n role: \"assistant\",\n kind: \"text-content\",\n content: options.strings.thinking,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n });\n };\n\n const removeLoadingPlaceholder = () => {\n clearConversation(\"loading-placeholder\");\n };\n\n const fillData = ({\n kind,\n taskId,\n part,\n status,\n handler,\n isHistory,\n historyId,\n messageId,\n }: {\n kind: string;\n taskId: string;\n part: any;\n status: any;\n handler: MessageHandler;\n isHistory?: boolean;\n historyId?: string;\n messageId?: string;\n }) => {\n let id = messageId || lastMessageId;\n const role = status?.message?.role === \"agent\" ? \"assistant\" : \"user\";\n\n if (!messageId && (kind === \"ui-render\" || (kind !== \"unknown\" && kind !== lastMessageType))) {\n lastMessageType = kind;\n id = generateId();\n lastMessageId = id;\n }\n\n const prevConversation =\n state.byId[taskId] ??\n ({\n taskId,\n status: isHistory ? \"completed\" : \"submitted\",\n messages: [],\n role,\n historyId,\n lastUpdated: nowIso(),\n } as Conversation);\n\n const nextConversation = handler(prevConversation, part, id, role, status);\n state.byId[taskId] = {\n ...nextConversation,\n status: status?.state || prevConversation.status,\n lastUpdated: nowIso(),\n };\n\n if (!isHistory) {\n pushTaskToOrder(taskId, true);\n }\n\n emit();\n };\n\n const onSendError = (\n error?: unknown,\n source: \"send\" | \"stream\" | \"recovery\" = \"stream\",\n requestConversationId: string | null | undefined = activeRequestConversationId\n ) => {\n updateConversationRequestMeta(requestConversationId, {\n requestState: \"error\",\n runtimeError: createRuntimeError(error, source),\n status: \"error\",\n });\n if (requestConversationId && activeRequestConversationId === requestConversationId) {\n activeRequestConversationId = null;\n }\n setLoading(false);\n emit();\n };\n\n const processLiveData = (data: SendStreamingMessageResponse) => {\n if (!(data as any)?.result) return;\n const result = (data as SendStreamingMessageSuccessResponse).result as any;\n const { taskId, status, metadata, final } = result;\n\n if (final) {\n handleEnd();\n return;\n }\n\n if (!taskId) return;\n\n currentStreamingTaskId = taskId;\n const firstPart = status?.message?.parts?.[0];\n const kind = getKind(firstPart, metadata);\n const handler = handlers[kind];\n if (!handler) return;\n\n removeLoadingPlaceholder();\n fillData({\n kind,\n taskId,\n part: firstPart,\n status,\n handler,\n });\n };\n\n const processHistoryData = (data: Message1, taskId: string) => {\n const { messageId, historyId } = (data || {}) as any;\n if (!messageId) return;\n\n const firstPart = data.parts?.[0];\n const kind = getKind(firstPart);\n\n if (kind === \"text-content\") {\n let text = (firstPart as TextPart).text || \"\";\n text = text.trim();\n if (text.startsWith(\"<ui>\")) {\n const json = text.slice(4).trim();\n try {\n const partData = JSON.parse(json);\n if (partData.root && partData.elements) {\n fillData({\n kind: \"ui-render\",\n taskId,\n part: { kind: \"data\", data: { type: \"ui\", spec: partData } },\n handler: handlers[\"ui-render\"]!,\n isHistory: true,\n historyId,\n messageId,\n status: { message: data },\n });\n }\n } catch {\n // ignore invalid history ui payload\n }\n return;\n }\n }\n\n const handler = handlers[kind];\n if (!handler) return;\n\n fillData({\n kind,\n taskId,\n part: firstPart,\n handler,\n isHistory: true,\n historyId,\n messageId,\n status: { message: data },\n });\n };\n\n const runSession = async (\n messages: Array<{ role: \"system\" | \"user\" | \"assistant\"; content: string }>,\n chatOptions?: { taskId?: string },\n showLoadingPlaceholder = false,\n recoveryAttempt = 0,\n preferMiniProgramRequest = false,\n requestConversationId: string | null = activeRequestConversationId\n ) => {\n activeRequestConversationId = requestConversationId;\n abortActiveSession();\n clearRuntimeMessageState();\n updateConversationRequestMeta(requestConversationId, {\n requestState: \"submitting\",\n runtimeError: null,\n status: \"submitted\",\n });\n\n const abortController = createAbortController() as AbortController | SimpleAbortController;\n activeAbortController = abortController;\n\n if (showLoadingPlaceholder) {\n addLoadingPlaceholder();\n setLoading(true);\n emit();\n }\n\n let hasResponse = false;\n let streamFailed = false;\n let streamAborted = false;\n let finalReceived = false;\n let lastTaskId = chatOptions?.taskId || null;\n\n const runPromise = sessionRuntime.sendMessage(messages, {\n taskId: chatOptions?.taskId,\n signal: abortController.signal,\n preferMiniProgramRequest,\n onMessage: (message) => {\n const responseTaskId = (message as any)?.result?.taskId;\n const responseFinal = Boolean((message as any)?.result?.final);\n if (responseTaskId) {\n lastTaskId = responseTaskId;\n }\n if (responseFinal) {\n finalReceived = true;\n }\n hasResponse = true;\n updateConversationRequestMeta(requestConversationId, {\n requestState: responseFinal ? \"idle\" : \"streaming\",\n runtimeError: null,\n status: responseFinal ? \"completed\" : \"working\",\n });\n processLiveData(message);\n },\n onClose: () => {},\n });\n activeRunPromise = runPromise;\n\n const recovery = async () => {\n const isDouyinMiniProgram = supportsDouyinEventSource() && !!getMiniProgramRequest();\n const canRecover =\n isDouyinMiniProgram && !streamAborted && !finalReceived && recoveryAttempt < 2;\n if (canRecover) {\n console.log(\"[recovering]\");\n updateConversationRequestMeta(requestConversationId, {\n requestState: \"recovering\",\n runtimeError: null,\n status: \"working\",\n });\n emit();\n try {\n const status = await sessionRuntime.getChatStatus(lastTaskId || undefined);\n\n if (status.working && status.taskId) {\n currentStreamingTaskId = status.taskId;\n await runSession(\n [],\n { taskId: status.taskId },\n true,\n recoveryAttempt + 1,\n true,\n requestConversationId\n );\n return true;\n }\n\n if (!hasResponse && !lastTaskId && !status.taskId && recoveryAttempt < 1) {\n await runSession(\n messages,\n chatOptions,\n true,\n recoveryAttempt + 1,\n true,\n requestConversationId\n );\n return true;\n }\n } catch (recoveryError) {\n console.error(\"[ConversationController] recovery failed:\", recoveryError);\n onSendError(recoveryError, \"recovery\", requestConversationId);\n return true;\n }\n }\n\n return false;\n };\n\n let streamError: unknown;\n let recovered = false;\n try {\n await runPromise;\n } catch (error) {\n if ((error as Error)?.name === \"AbortError\" || abortController.signal.aborted) {\n streamAborted = true;\n } else {\n streamFailed = true;\n streamError = error;\n console.error(\"[ConversationController] Stream error:\", error);\n }\n } finally {\n if (activeRunPromise === runPromise) {\n activeRunPromise = null;\n }\n if (activeAbortController === abortController) {\n activeAbortController = null;\n }\n\n recovered = await recovery();\n }\n\n if (recovered) {\n return;\n }\n\n if (streamFailed) {\n onSendError(streamError, \"stream\", requestConversationId);\n } else if (!hasResponse && showLoadingPlaceholder && !streamAborted) {\n onSendError(streamError, \"send\", requestConversationId);\n } else if (streamAborted) {\n clearConversationRuntimeState(requestConversationId);\n if (requestConversationId && activeRequestConversationId === requestConversationId) {\n activeRequestConversationId = null;\n }\n setLoading(false);\n emit();\n } else if (finalReceived && state.isLoading) {\n handleEnd();\n } else if (!finalReceived && state.isLoading) {\n onSendError(undefined, \"stream\", requestConversationId);\n }\n };\n\n return {\n getSnapshot() {\n return createSnapshot(state);\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n\n async init() {\n if (destroyed) return;\n if (initPromise) return initPromise;\n\n state.starting = true;\n emit();\n\n initPromise = (async () => {\n try {\n if (shouldLoadHistoryOnInit) {\n await this.loadHistory();\n }\n if (shouldResumeOnInit) {\n const result = await sessionRuntime.getChatStatus();\n if (result.taskId && result.working) {\n currentStreamingTaskId = result.taskId;\n await runSession([], { taskId: result.taskId }, false);\n }\n }\n } catch (error) {\n console.error(\"[ConversationController] init failed:\", error);\n } finally {\n state.starting = false;\n emit();\n initPromise = null;\n }\n })();\n\n return initPromise;\n },\n\n destroy() {\n destroyed = true;\n abortActiveSession();\n listeners.clear();\n },\n\n async sendMessage(userContent: string) {\n if (state.isLoading || !userContent.trim()) return;\n\n if (isSingleTurnMode) {\n this.abort();\n resetState();\n clearRuntimeMessageState();\n currentStreamingTaskId = null;\n refreshContextId();\n }\n\n const localTaskId = generateId();\n activeRequestConversationId = localTaskId;\n\n addConversation({\n taskId: localTaskId,\n status: \"submitted\",\n requestState: \"submitting\",\n runtimeError: null,\n messages: [\n {\n messageId: generateId(),\n role: \"user\",\n kind: \"text-content\",\n content: userContent,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n });\n\n try {\n await runSession(\n [{ role: \"user\", content: userContent }],\n undefined,\n true,\n 0,\n false,\n localTaskId\n );\n } catch (error) {\n if ((error as Error).name === \"AbortError\") return;\n onSendError(error, \"send\", localTaskId);\n }\n },\n\n abort() {\n const wasAborted = activeAbortController?.signal.aborted;\n abortActiveSession();\n clearRuntimeMessageState();\n clearConversationRuntimeState(activeRequestConversationId);\n activeRequestConversationId = null;\n currentStreamingTaskId = null;\n removeLoadingPlaceholder();\n if (!wasAborted) {\n void Promise.resolve();\n }\n },\n\n async cancelChat(taskId?: string) {\n const targetTaskId = taskId || currentStreamingTaskId;\n this.abort();\n\n addConversation({\n taskId: generateId(),\n status: \"error\",\n messages: [\n {\n messageId: `cancel-${Date.now()}`,\n role: \"assistant\",\n kind: \"text-content\",\n content: options.strings.cancelled,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n });\n\n if (!targetTaskId) return;\n\n try {\n await sessionRuntime.cancelChat(targetTaskId);\n currentStreamingTaskId = null;\n } catch (error) {\n console.error(\"[ConversationController] cancel failed:\", error);\n }\n },\n\n resetConversation(greeting?: string) {\n this.abort();\n resetState();\n activeRequestConversationId = null;\n currentStreamingTaskId = null;\n clearRuntimeMessageState();\n if (isSingleTurnMode) {\n refreshContextId();\n }\n\n if (greeting) {\n const taskId = `conv-${Date.now()}`;\n state.byId[taskId] = {\n taskId,\n status: \"submitted\",\n messages: [\n {\n messageId: `greeting-${Date.now()}`,\n role: \"assistant\",\n kind: \"text-content\",\n content: greeting,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n };\n state.order = [taskId];\n }\n\n emit();\n },\n\n async startNewConversation() {\n addConversation({\n taskId: generateId(),\n status: \"submitted\",\n messages: [],\n lastUpdated: nowIso(),\n system: { level: \"newConversation\" },\n });\n\n try {\n await sessionRuntime.newConversation();\n } catch (error) {\n console.error(\"[ConversationController] newConversation failed:\", error);\n }\n },\n\n async loadHistory(limit = 20, next?: string) {\n state.isLoadingHistory = true;\n emit();\n\n try {\n const result = await sessionRuntime.getHistory(limit, next);\n const messages = result?.messages || [];\n\n let taskId = \"\";\n let lastRole = \"\";\n const taskIds: string[] = [];\n\n messages.forEach((message: any) => {\n const role = message.role === \"agent\" ? \"assistant\" : \"user\";\n if (role !== lastRole) {\n taskId = `history-conv-${generateId()}`;\n taskIds.push(taskId);\n lastRole = role;\n }\n processHistoryData(message, taskId);\n });\n\n state.order = [...taskIds, ...state.order.filter((id) => !taskIds.includes(id))];\n state.historyState = {\n next: result?.next || null,\n hasMore: result?.hasMore || false,\n };\n } catch (error) {\n console.error(\"[ConversationController] loadHistory failed:\", error);\n } finally {\n state.isLoadingHistory = false;\n emit();\n }\n },\n\n async loadMoreHistory() {\n if (!state.historyState.hasMore || state.isLoadingHistory || !state.historyState.next) return;\n await this.loadHistory(20, state.historyState.next);\n },\n\n getConversation(taskId: string) {\n const conversation = state.byId[taskId];\n return conversation ? cloneConversation(conversation) : undefined;\n },\n\n clearConversation(taskId: string) {\n clearConversation(taskId);\n },\n\n removeMessage(taskId: string, messageId: string) {\n const conversation = state.byId[taskId];\n if (!conversation) return;\n\n state.byId[taskId] = {\n ...conversation,\n messages: conversation.messages.filter((message) => message.messageId !== messageId),\n lastUpdated: nowIso(),\n };\n pushTaskToOrder(taskId, true);\n emit();\n },\n\n updateMessage(input) {\n const {\n taskId,\n messageId,\n content,\n partial = false,\n status,\n response,\n metadata = {},\n } = input;\n const conversation = state.byId[taskId];\n if (!conversation) return;\n\n const messageIndex = conversation.messages.findIndex(\n (message) => message.messageId === messageId\n );\n if (messageIndex === -1) return;\n\n const oldMessage = conversation.messages[messageIndex];\n if (!oldMessage) return;\n\n const updatedMessage: MessagesItem = { ...oldMessage, ...metadata } as MessagesItem;\n\n if (content !== undefined) {\n if (\"content\" in updatedMessage) {\n updatedMessage.content = partial\n ? `${(updatedMessage as TextMessage).content || \"\"}${content}`\n : content;\n } else if (\"thought\" in updatedMessage) {\n updatedMessage.thought = partial\n ? `${(updatedMessage as ThoughtMessage).thought || \"\"}${content}`\n : content;\n } else if (oldMessage.kind === \"text-content\") {\n (updatedMessage as TextMessage).content = partial\n ? `${(oldMessage as TextMessage).content || \"\"}${content}`\n : content;\n }\n }\n\n if (\"toolStatus\" in updatedMessage || status) {\n (updatedMessage as ToolMessage).toolStatus =\n status || (updatedMessage as ToolMessage).toolStatus;\n }\n if (response !== undefined) {\n (updatedMessage as ToolMessage).response = response;\n }\n\n const nextMessages = [...conversation.messages];\n nextMessages[messageIndex] = updatedMessage;\n\n state.byId[taskId] = {\n ...conversation,\n messages: nextMessages,\n lastUpdated: nowIso(),\n };\n pushTaskToOrder(taskId, true);\n emit();\n },\n };\n}\n","import { getMiniProgramRequest } from \"@amaster.ai/http-client\";\n\nexport type ContextIdMode = \"conversation\" | \"single-turn\";\n\nfunction generateUUID(): string {\n const cryptoObj = typeof globalThis !== \"undefined\" ? globalThis.crypto : undefined;\n\n if (cryptoObj && typeof cryptoObj.randomUUID === \"function\") {\n return cryptoObj.randomUUID();\n }\n\n if (cryptoObj && typeof cryptoObj.getRandomValues === \"function\") {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (char) => {\n const randomValues = cryptoObj.getRandomValues(new Uint8Array(1));\n const random = (randomValues[0] ?? 0) % 16;\n const value = char === \"x\" ? random : (random & 0x3) | 0x8;\n return value.toString(16);\n });\n }\n\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (char) => {\n const random = (Math.random() * 16) | 0;\n const value = char === \"x\" ? random : (random & 0x3) | 0x8;\n return value.toString(16);\n });\n}\n\nfunction getAppIdFromHostname(hostname: string): string | null {\n const wwwMatch = /^www\\.([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (wwwMatch?.[1]) return wwwMatch[1];\n\n const domainMatch = /^([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (domainMatch?.[1]) return domainMatch[1];\n\n return null;\n}\n\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") return null;\n\n try {\n const url = window.location.href;\n const pathMatch = /\\/app\\/([\\da-z-]+)(?:\\/|$)/.exec(url);\n if (pathMatch?.[1]) return pathMatch[1];\n return getAppIdFromHostname(window.location.hostname);\n } catch {\n return null;\n }\n}\n\nlet cachedAppId: string | null = null;\nlet cachedAnonymousUid: string | null = null;\n\nfunction getAppId(hostname?: string): string {\n const urlAppId = hostname ? getAppIdFromHostname(hostname) : extractAppIdFromUrl();\n if (urlAppId) return urlAppId;\n if (!cachedAppId) cachedAppId = generateUUID();\n return cachedAppId;\n}\n\nexport function createContextIdResolver(url: string, getUserUid?: () => string | null) {\n const createContextId = createContextIdFactory(url, getUserUid);\n return () => {\n return createContextId(\"conversation\");\n };\n}\n\nexport function createContextIdFactory(url: string, getUserUid?: () => string | null) {\n return (mode: ContextIdMode = \"conversation\") => {\n const isMiniProgram = getMiniProgramRequest();\n let appId = getAppId();\n\n if (isMiniProgram) {\n const hostname = url ? url.replace(/^https?:\\/\\//, \"\").split(\"/\")[0] : \"\";\n appId = getAppId(hostname);\n }\n\n const userUid = getUserUid?.() ?? (cachedAnonymousUid ??= `anonymous-${generateUUID()}`);\n const baseContextId = `${appId}:${userUid}`;\n\n if (mode === \"single-turn\") {\n return `${baseContextId}:${generateUUID()}`;\n }\n\n return baseContextId;\n };\n}\n\nexport { generateUUID };\n","import type { Part } from \"@a2a-js/sdk\";\nimport type { MessageContent, TextContent } from \"../types\";\n\nexport function convertToA2AParts(content: string | MessageContent[]): Part[] {\n if (typeof content === \"string\") {\n return [{ kind: \"text\", text: content }];\n }\n\n return content\n .map((part): Part | null => {\n switch (part.type) {\n case \"text\":\n return { kind: \"text\", text: part.text };\n case \"image\":\n if (part.data) {\n return {\n kind: \"file\",\n file: {\n bytes: part.data,\n mimeType: part.mimeType || \"image/png\",\n },\n };\n }\n if (part.url) {\n return {\n kind: \"file\",\n file: { uri: part.url, mimeType: part.mimeType || \"image/png\" },\n };\n }\n return null;\n case \"file\":\n if (part.data) {\n return {\n kind: \"file\",\n file: {\n bytes: part.data,\n ...(part.mimeType && { mimeType: part.mimeType }),\n ...(part.name && { name: part.name }),\n },\n };\n }\n if (part.url) {\n return {\n kind: \"file\",\n file: {\n uri: part.url,\n ...(part.mimeType && { mimeType: part.mimeType }),\n ...(part.name && { name: part.name }),\n },\n };\n }\n return null;\n default:\n return null;\n }\n })\n .filter((part): part is Part => part !== null);\n}\n\nexport function extractTextFromContent(content: string | MessageContent[]): string {\n if (typeof content === \"string\") {\n return content;\n }\n return content\n .filter((part): part is TextContent => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\");\n}\n","import type { ContextIdMode } from \"./context\";\nimport type { ConversationRuntime, ConversationRuntimeFactory } from \"../types\";\n\nexport function createSessionRuntimeFactory(args: {\n createContextId: (mode?: ContextIdMode) => string;\n createRuntime: (contextId: string) => ConversationRuntime;\n}): ConversationRuntimeFactory {\n return {\n createContextId(mode) {\n return args.createContextId(mode);\n },\n createScopedRuntime(contextId: string) {\n return args.createRuntime(contextId);\n },\n };\n}\n","import type {\n CancelTaskRequest,\n CancelTaskResponse,\n SendStreamingMessageRequest,\n} from \"@a2a-js/sdk\";\nimport type { ConversationRuntime, ConversationRuntimeFactory } from \"../types\";\nimport { generateUUID, type ContextIdMode } from \"./context\";\nimport { convertToA2AParts, extractTextFromContent } from \"./message-content\";\nimport { createSessionRuntimeFactory } from \"./session-runtime\";\nimport type { StreamHandlers } from \"./stream\";\n\ninterface CreateCopilotRuntimeFactoryArgs {\n createContextId: (mode?: ContextIdMode) => string;\n postRpc: (data: unknown) => Promise<unknown>;\n sendMessageStream: (\n request: SendStreamingMessageRequest,\n handlers: StreamHandlers,\n signal?: ConversationRuntimeSendSignal,\n preferMiniProgramRequest?: boolean,\n ) => Promise<void>;\n}\n\ntype ConversationRuntimeSendSignal = Parameters<ConversationRuntime[\"sendMessage\"]>[1][\"signal\"];\n\nexport function createCopilotRuntimeFactory({\n createContextId,\n postRpc,\n sendMessageStream,\n}: CreateCopilotRuntimeFactoryArgs): ConversationRuntimeFactory {\n return createSessionRuntimeFactory({\n createContextId,\n createRuntime(contextId: string): ConversationRuntime {\n return {\n async sendMessage(messages, options) {\n const { taskId, signal, onOpen, onMessage, onClose, preferMiniProgramRequest } = options;\n const systemMsg = messages.find((message) => message.role === \"system\");\n const nonSystemMsgs = messages.filter((message) => message.role !== \"system\");\n const lastUserMsg = nonSystemMsgs[nonSystemMsgs.length - 1];\n\n const parts = lastUserMsg\n ? convertToA2AParts(lastUserMsg.content)\n : [{ kind: \"text\" as const, text: \"\" }];\n\n const systemPrompt = systemMsg ? extractTextFromContent(systemMsg.content) : undefined;\n\n const request: SendStreamingMessageRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"message/stream\",\n params: {\n message: {\n contextId,\n kind: \"message\",\n messageId: generateUUID(),\n role: \"user\",\n parts,\n ...(taskId ? { taskId } : {}),\n ...(systemPrompt ? { metadata: { systemPrompt } } : {}),\n },\n },\n };\n\n await sendMessageStream(\n request,\n { onOpen, onMessage, onClose },\n signal,\n preferMiniProgramRequest\n );\n },\n\n cancelChat(taskId) {\n const request: CancelTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/cancel\",\n params: { id: taskId },\n };\n return postRpc(request) as Promise<CancelTaskResponse>;\n },\n\n async getHistory(limit = 50, next?: string) {\n try {\n const response: any = await postRpc({\n jsonrpc: \"2.0\",\n method: \"messages/list\",\n id: generateUUID(),\n params: {\n filter: { contextId },\n limit,\n ...(next ? { next } : {}),\n },\n });\n const result = response?.data?.result || {};\n const messages = result?.messages || [];\n const cursor = result?.next || \"\";\n\n return {\n messages,\n next: cursor,\n hasMore: !!cursor,\n };\n } catch {\n return undefined;\n }\n },\n\n async newConversation() {\n try {\n await postRpc({\n jsonrpc: \"2.0\",\n method: \"messages/clear\",\n id: generateUUID(),\n params: { contextId },\n });\n } catch {\n // noop\n }\n },\n\n async getChatStatus(taskId) {\n try {\n const request = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/get\",\n params: taskId ? { id: taskId } : { contextId },\n };\n const result: any = await postRpc(request);\n const data = result?.data?.result;\n return {\n working: data?.status?.state === \"working\",\n taskId: data?.id,\n error: data?.error?.message || \"\",\n };\n } catch (error) {\n return {\n working: false,\n error: (error as any)?.message || \"\",\n };\n }\n },\n };\n },\n });\n}\n","import { createParser } from \"eventsource-parser\";\nimport type { SendStreamingMessageResponse } from \"@a2a-js/sdk\";\nimport type { AbortSignalLike } from \"../../types\";\n\nexport interface StreamHandlers {\n onOpen?: () => void;\n onMessage: (message: SendStreamingMessageResponse) => void;\n onClose?: () => void;\n}\n\nexport function normalizeStreamError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (error && typeof error === \"object\") {\n const payload = error as Record<string, unknown>;\n const message =\n (typeof payload.errMsg === \"string\" && payload.errMsg) ||\n (typeof payload.message === \"string\" && payload.message) ||\n JSON.stringify(payload);\n const normalized = new Error(message);\n if (typeof payload.errorCode === \"number\" || typeof payload.errorCode === \"string\") {\n (normalized as any).errorCode = payload.errorCode;\n }\n if (typeof payload.errNo === \"number\" || typeof payload.errNo === \"string\") {\n (normalized as any).errNo = payload.errNo;\n }\n (normalized as any).raw = error;\n return normalized;\n }\n\n return new Error(String(error));\n}\n\nexport function createAbortError(): Error {\n if (typeof DOMException !== \"undefined\") {\n return new DOMException(\"Aborted\", \"AbortError\");\n }\n const error = new Error(\"Aborted\");\n error.name = \"AbortError\";\n return error;\n}\n\nexport function createSSEConsumer(handlers: StreamHandlers) {\n return createParser({\n onEvent: (event) => {\n try {\n handlers.onMessage(JSON.parse(event.data));\n } catch (error) {\n console.error(\"[copilot stream] failed to parse SSE event:\", error, event.data);\n }\n },\n });\n}\n\nexport function bindAbortSignal(signal: AbortSignalLike | undefined, onAbort: () => void) {\n if (!signal) return;\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener(\"abort\", onAbort);\n}\n","import type { AbortSignalLike } from \"../../types\";\nimport { createAbortError, createSSEConsumer, type StreamHandlers } from \"./shared\";\n\nexport async function startBrowserStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string>,\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n): Promise<void> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...authHeader,\n };\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify(data),\n signal: signal as AbortSignal | undefined,\n });\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText || response.status}`);\n }\n\n handlers.onOpen?.();\n\n if (!response.body) {\n handlers.onClose?.();\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parser = createSSEConsumer(handlers);\n\n try {\n while (true) {\n if (signal?.aborted) {\n throw createAbortError();\n }\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n parser.feed(decoder.decode(value, { stream: true }));\n }\n } finally {\n handlers.onClose?.();\n }\n}\n","import MiniProgramTextDecoder from \"miniprogram-text-decoder\";\nimport type { AbortSignalLike } from \"../../types\";\nimport { getMiniProgramRequest, supportsChunkedRequest } from \"../platform\";\nimport { bindAbortSignal, createAbortError, createSSEConsumer, normalizeStreamError, type StreamHandlers } from \"./shared\";\n\nfunction decodeMiniProgramArrayBuffer(\n value: ArrayBuffer | Uint8Array | undefined,\n textDecoder: MiniProgramTextDecoder\n): string {\n if (!value) return \"\";\n const buffer = value instanceof Uint8Array ? value : new Uint8Array(value);\n if (buffer.length === 0) return \"\";\n return textDecoder.decode(buffer, { stream: false });\n}\n\nexport async function startMiniProgramStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string> = {},\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let chunkBuffer = new Uint8Array(0);\n const textDecoder = new MiniProgramTextDecoder(\"utf-8\", { fatal: false });\n let sawChunk = false;\n let settled = false;\n let opened = false;\n const parser = createSSEConsumer(handlers);\n\n const finish = (error?: unknown) => {\n if (settled) return;\n settled = true;\n if (error) {\n reject(normalizeStreamError(error));\n return;\n }\n handlers.onClose?.();\n resolve();\n };\n\n const emitOpen = () => {\n if (opened) return;\n opened = true;\n handlers.onOpen?.();\n };\n\n const feedText = (text: string) => {\n if (!text) return;\n emitOpen();\n parser.feed(text);\n };\n\n const chunkListener = (response: any) => {\n if (settled || !response.data) return;\n\n try {\n sawChunk = true;\n const newChunk = new Uint8Array(response.data as ArrayBuffer);\n const merged = new Uint8Array(chunkBuffer.length + newChunk.length);\n merged.set(chunkBuffer);\n merged.set(newChunk, chunkBuffer.length);\n chunkBuffer = merged;\n\n let decodeOffset = 0;\n while (decodeOffset < chunkBuffer.length) {\n const remaining = chunkBuffer.subarray(decodeOffset);\n const decoded = textDecoder.decode(remaining, { stream: false });\n\n if (decoded.length === 0) {\n break;\n }\n\n if (decoded.includes(\"�\")) {\n const lastGoodIndex = decoded.lastIndexOf(\"�\") === 0 ? 0 : decoded.indexOf(\"�\");\n if (lastGoodIndex <= 0) {\n break;\n }\n\n const goodPart = decoded.slice(0, lastGoodIndex);\n if (goodPart) {\n feedText(goodPart);\n }\n\n const encodedGood = new TextEncoder().encode(goodPart);\n decodeOffset += encodedGood.length;\n break;\n }\n\n feedText(decoded);\n decodeOffset += remaining.length;\n }\n\n chunkBuffer = chunkBuffer.subarray(decodeOffset);\n } catch (error) {\n console.error(\"[mini stream] chunk process error:\", error);\n }\n };\n\n const headersListener = (response: any) => {\n emitOpen();\n if (response.header?.[\"content-type\"]?.includes(\"text/event-stream\") === false) {\n console.warn(\"Warning: server did not return event-stream\");\n }\n };\n\n const miniReq = getMiniProgramRequest();\n if (!miniReq) {\n reject(new Error(\"Mini-program request API not found\"));\n return;\n }\n\n try {\n const requestTask = miniReq({\n url,\n method: \"POST\",\n header: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...authHeader,\n },\n data: typeof data === \"string\" ? data : JSON.stringify(data),\n responseType: \"arraybuffer\",\n ...supportsChunkedRequest() ? {\n enableChunked: true\n } : {},\n success: (response: any) => {\n if (!sawChunk && response?.data) {\n const wholeResponse = decodeMiniProgramArrayBuffer(response.data, textDecoder);\n feedText(wholeResponse);\n }\n if (chunkBuffer.length > 0) {\n const finalText = textDecoder.decode(chunkBuffer, { stream: true });\n feedText(finalText);\n }\n finish();\n },\n fail: (error: any) => {\n finish(error);\n },\n });\n\n bindAbortSignal(signal, () => {\n requestTask.abort?.();\n finish(createAbortError());\n });\n\n requestTask.onChunkReceived?.(chunkListener);\n requestTask.onHeadersReceived?.(headersListener);\n } catch (error) {\n finish(error);\n }\n });\n}\n","import type { AbortSignalLike } from \"../../types\";\nimport { getMiniProgramRequest } from \"../platform\";\n// import { supportsDouyinEventSource } from \"../platform\";\nimport { startBrowserStream } from \"./browser\";\n// import { startDouyinEventSourceStream } from \"./douyin\";\nimport { startMiniProgramStream } from \"./mini-program\";\nimport type { StreamHandlers } from \"./shared\";\n\nexport async function startStream(\n url: string,\n data: unknown,\n getAccessToken: (() => string | null) | undefined,\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n preferMiniProgramRequest = false,\n): Promise<void> {\n const token = getAccessToken?.();\n const authHeader: Record<string, string> = token ? { Authorization: `Bearer ${token}` } : {};\n const miniReq = getMiniProgramRequest();\n\n if (preferMiniProgramRequest && miniReq) {\n await startMiniProgramStream(url, data, authHeader, handlers, signal);\n return;\n }\n\n // 抖音小程序的真机流式非常不好用,先注释\n // if (supportsDouyinEventSource()) {\n // await startDouyinEventSourceStream(url, data, authHeader, handlers, signal);\n // return;\n // }\n\n if (miniReq) {\n await startMiniProgramStream(url, data, authHeader, handlers, signal);\n return;\n }\n\n await startBrowserStream(url, data, authHeader, handlers, signal);\n}\n\nexport type { StreamHandlers } from \"./shared\";\n","/* eslint-disable no-unused-vars */\nimport type { SendStreamingMessageRequest } from \"@a2a-js/sdk\";\nimport type { HttpClient } from \"@amaster.ai/http-client\";\nimport { createConversationController } from \"./conversation-controller\";\nimport { createContextIdFactory } from \"./runtime/context\";\nimport { createCopilotRuntimeFactory } from \"./runtime/copilot-runtime\";\nimport { startStream, type StreamHandlers } from \"./runtime/stream\";\nimport type {\n AbortSignalLike,\n ConversationController,\n ConversationControllerOptions,\n ConversationRuntimeFactory,\n} from \"./types\";\n\nexport type { TextContent, ImageContent, FileContent, MessageContent } from \"./types\";\n\nexport type CopilotClient = {\n createConversationController(options: ConversationControllerOptions): ConversationController;\n};\n\nexport function createCopilotClient(\n http: HttpClient,\n baseUrl?: string,\n getAccessToken?: () => string | null,\n getUserUid?: () => string | null\n): CopilotClient {\n let envBaseUrl = \"\";\n try {\n envBaseUrl =\n process.env.TARO_APP_API_BASE_URL ||\n process.env.VITE_API_BASE_URL ||\n process.env.API_BASE_URL ||\n \"\";\n } catch {\n // process is not defined -> ignore\n }\n\n envBaseUrl = String(envBaseUrl || \"\").trim();\n const url = `${baseUrl || envBaseUrl}/api/proxy/builtin/platform/copilot`;\n\n const postRpc = <T>(data: unknown) =>\n http.request<T>({\n url,\n method: \"POST\",\n data,\n });\n\n const createContextId = createContextIdFactory(url, getUserUid);\n\n async function sendMessageStream(\n request: SendStreamingMessageRequest,\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n preferMiniProgramRequest?: boolean,\n ): Promise<void> {\n try {\n await startStream(\n url,\n request,\n getAccessToken,\n handlers,\n signal,\n preferMiniProgramRequest,\n );\n } catch (error) {\n if (signal?.aborted) {\n return;\n }\n throw error;\n }\n }\n\n const runtime: ConversationRuntimeFactory = createCopilotRuntimeFactory({\n createContextId,\n postRpc,\n sendMessageStream,\n });\n\n return {\n createConversationController(options) {\n return createConversationController(runtime, options);\n },\n };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -63,6 +63,8 @@ interface Conversation {
63
63
  status: "submitted" | "working" | "completed" | "error";
64
64
  messages: MessagesItem[];
65
65
  lastUpdated: string;
66
+ requestState?: ConversationRequestState;
67
+ runtimeError?: ConversationRuntimeError | null;
66
68
  role?: Role;
67
69
  historyId?: string;
68
70
  system?: {
@@ -74,6 +76,14 @@ interface HistoryState {
74
76
  next: string | null;
75
77
  hasMore: boolean;
76
78
  }
79
+ type ConversationRequestState = "idle" | "submitting" | "streaming" | "recovering" | "error";
80
+ interface ConversationRuntimeError {
81
+ code: "network" | "unknown";
82
+ message: string;
83
+ retryable: boolean;
84
+ source: "send" | "stream" | "recovery";
85
+ timestamp: string;
86
+ }
77
87
  interface UpdateMessageInput {
78
88
  taskId: string;
79
89
  messageId: string;
@@ -123,4 +133,4 @@ type CopilotClient = {
123
133
  };
124
134
  declare function createCopilotClient(http: HttpClient, baseUrl?: string, getAccessToken?: () => string | null, getUserUid?: () => string | null): CopilotClient;
125
135
 
126
- export { type Conversation, type ConversationController, type ConversationControllerOptions, type ConversationControllerSnapshot, type ConversationStrings, type CopilotClient, type ErrorMessage, type FileContent, type HistoryState, type ImageContent, type MessageContent, type MessagesItem, type Role, type TextContent, type TextMessage, type ThoughtMessage, type ToolMessage, type UIRenderMessage, type UpdateMessageInput, createCopilotClient };
136
+ export { type Conversation, type ConversationController, type ConversationControllerOptions, type ConversationControllerSnapshot, type ConversationRequestState, type ConversationRuntimeError, type ConversationStrings, type CopilotClient, type ErrorMessage, type FileContent, type HistoryState, type ImageContent, type MessageContent, type MessagesItem, type Role, type TextContent, type TextMessage, type ThoughtMessage, type ToolMessage, type UIRenderMessage, type UpdateMessageInput, createCopilotClient };