@amaster.ai/copilot-client 1.1.0-beta.72 → 1.1.0-beta.73

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