@amaster.ai/copilot-client 1.1.1 → 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 +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
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 };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {getMiniProgramRequest,resolveMiniProgramGlobals}from'@amaster.ai/http-client';import {createParser}from'eventsource-parser';import Ee from'miniprogram-text-decoder';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=resolveMiniProgramGlobals();return typeof e?.wx?.request=="function"||typeof e?.qq?.request=="function"}function ce(){return typeof 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()&&!!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=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
|
|
1
|
+
import {getMiniProgramRequest,resolveMiniProgramGlobals}from'@amaster.ai/http-client';import {createParser}from'eventsource-parser';import je from'miniprogram-text-decoder';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=resolveMiniProgramGlobals();return typeof e?.wx?.request=="function"||typeof e?.qq?.request=="function"}function he(){return typeof 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()&&!!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=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 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("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=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=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)}}}export{Be as createCopilotClient};//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -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.js","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.js","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"]}
|