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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,4 +1,3 @@
1
- 'use strict';var httpClient=require('@amaster.ai/http-client'),eventsourceParser=require('eventsource-parser'),E=require('miniprogram-text-decoder');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var E__default=/*#__PURE__*/_interopDefault(E);var o=globalThis;function _(){return typeof o?.Taro?.request=="function"?o.Taro.request.bind(o.Taro):typeof o?.wx?.request=="function"?o.wx.request.bind(o.wx):typeof o?.tt?.request=="function"?o.tt.request.bind(o.tt):typeof o?.my?.request=="function"?o.my.request.bind(o.my):typeof o?.swan?.request=="function"?o.swan.request.bind(o.swan):typeof o?.qq?.request=="function"?o.qq.request.bind(o.qq):typeof o?.jd?.request=="function"?o.jd.request.bind(o.jd):null}function C(){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 d=(t.getRandomValues(new Uint8Array(1))[0]??0)%16;return (e==="x"?d:d&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let u=Math.random()*16|0;return (e==="x"?u:u&3|8).toString(16)})}var R=class{constructor(){this.aborted=false;this.listeners=[];this.signal={aborted:false,addEventListener:(e,u)=>{this.listeners.push(u);}};}abort(){this.aborted||(this.aborted=true,this.signal.aborted=true,this.listeners.forEach(e=>e()));}};function j(){return typeof AbortController<"u"?new AbortController:new R}function I(t){let e=/^www\.([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(t);if(e?.[1])return e[1];let u=/^([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(t);return u?.[1]?u[1]:null}function $(){if(typeof window>"u")return null;try{let t=window.location.href,e=/\/app\/([\da-z-]+)(?:\/|$)/.exec(t);return e?.[1]?e[1]:I(window.location.hostname)}catch{return null}}var q=null,B=null;function v(t){let e=t?I(t):$();return e||(q||(q=C()),q)}async function H(t,e,u={},d){return new Promise(c=>{let r=new Uint8Array(0),S=new E__default.default("utf-8",{fatal:false}),f=false,g=false,x=[],a=null,i=()=>new Promise(n=>{x.length>0?n(x.shift()):f?n(null):a=n;}),s=n=>{n&&(x.push(n),a&&(a(x.shift()),a=null));},l=n=>{if(!(g||f||!n.data))try{let m=new Uint8Array(n.data),T=new Uint8Array(r.length+m.length);T.set(r),T.set(m,r.length),r=T;let h=0;for(;h<r.length;){let A=r.subarray(h),b=S.decode(A,{stream:!1});if(b.length===0)break;if(b.includes("\uFFFD")){let P=b.lastIndexOf("\uFFFD")===0?0:b.indexOf("\uFFFD");if(P<=0)break;let k=b.slice(0,P);k&&s(k);let M=new TextEncoder().encode(k);h+=M.length;break}else s(b),h+=A.length;}r=r.subarray(h);}catch(m){console.error("[mini stream] chunk process error:",m);}},y=n=>{n.header?.["content-type"]?.includes("text/event-stream")===false&&console.warn("Warning: server did not return event-stream");},p=o.wx.request.bind(o.wx),w;try{w=p({url:t,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...u},data:typeof e=="string"?e:JSON.stringify(e),responseType:"arraybuffer",enableChunked:!0,timeout:3e5,success:()=>{if(r.length>0){let n=S.decode(r,{stream:!0});s(n);}f=!0,a?.(null);},fail:()=>{g=!0,f=!0,a?.(null);}}),d&&(d.aborted?w.abort():d.addEventListener("abort",()=>{w.abort();})),w.onChunkReceived?.(l),w.onHeadersReceived?.(y),c({ok:!0,statusText:"OK",read:async()=>g?null:i()});}catch(n){console.error("miniReq error",n);}})}async function L(t,e,u,d){let c=u?.(),r=c?{Authorization:`Bearer ${c}`}:{};if(typeof o?.wx?.request=="function")return H(t,e,r,d);let S=_();if(S)return new Promise(i=>{let s="",l=false,y=false,p=0,w={url:t,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...r},data:typeof e=="string"?e:JSON.stringify(e),timeout:6e4,success:n=>{s=typeof n.data=="string"?n.data:JSON.stringify(n.data),l=true;},fail:n=>{console.error("[createStream] wx.request failed:",n),y=true,l=true;},complete:()=>{}};try{let n=S(w);n&&typeof n.then=="function"&&n.then(m=>{s=typeof m.data=="string"?m.data:JSON.stringify(m.data),l=!0;}).catch(()=>{y=!0,l=!0;});}catch(n){console.error("[createStream] Exception:",n),y=true,l=true;}i({ok:true,statusText:"OK",read:async()=>{for(;!l&&p>=s.length;)await new Promise(m=>setTimeout(m,50));if(y)return null;if(p>=s.length)return l?null:"";let n=s.slice(p);return p=s.length,n}});});let f={"Content-Type":"application/json",...r},g=await fetch(t,{method:"POST",headers:f,credentials:"include",body:JSON.stringify(e),signal:d});if(!g.body)return {ok:g.ok,statusText:g.statusText,read:async()=>null};let x=g.body.getReader(),a=new TextDecoder;return {ok:g.ok,statusText:g.statusText,read:async()=>{let{done:i,value:s}=await x.read();return i?null:a.decode(s,{stream:true})}}}function D(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 F(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
2
- `)}async function*J(t,e){let u=[],d=eventsourceParser.createParser({onEvent:c=>{try{u.push(JSON.parse(c.data));}catch(r){console.error("[parseSSEStream] Parse error:",r);}}});try{for(;!e?.aborted;){let c=await t.read();if(c===null)break;if(c)for(d.feed(c);u.length>0;){let r=u.shift();r&&(yield r);}}}catch(c){if(e?.aborted)return;console.error("[parseSSEStream] Stream error:",c);}}function N(t=httpClient.createHttpClient(),e,u,d){let c="",r=null,S=undefined;if(S&&(c=S.TARO_APP_API_BASE_URL||S.VITE_API_BASE_URL||""),!c)try{c=process.env.TARO_APP_API_BASE_URL||process.env.VITE_API_BASE_URL||"";}catch{}c=String(c||"").trim();let f=`${e||c}/api/proxy/builtin/platform/copilot`;console.log("xxxxxx");async function*g(a,i){try{let s=await L(f,a,u,i);if(!s.ok)throw new Error(`Stream request failed: ${s.statusText}`);yield*J(s,i);}catch(s){if(i?.aborted)return;console.error("[sendMessageStream] Error:",s);}}let x=()=>{let a=v();if(typeof o?.wx?.request=="function"){let l=f?f.replace(/^https?:\/\//,"").split("/")[0]:"";a=v(l);}let i=d?.()??B??(B=`anonymous-${C()}`);return `${a}:${i}`};return {async*chat(a,i={}){let{taskId:s}=i;r=j();let l=r?.signal;try{let y=a.find(h=>h.role==="system"),p=a.filter(h=>h.role!=="system"),w=p[p.length-1],n=w?D(w.content):[{kind:"text",text:""}],m=y?F(y.content):void 0,T={jsonrpc:"2.0",id:C(),method:"message/stream",params:{message:{contextId:x(),kind:"message",messageId:C(),role:"user",parts:n,...s&&{taskId:s},...m&&{metadata:{systemPrompt:m}}}}};for await(let h of g(T,l)){if(l?.aborted)break;yield h;}}finally{r=null;}},cancelChat(a){r?.abort(),r=null;let i={jsonrpc:"2.0",id:C(),method:"tasks/cancel",params:{id:a}};return t.request({url:f,method:"POST",data:i})},async getHistory(a=50,i){try{let l=(await t.request({url:f,method:"POST",data:{jsonrpc:"2.0",method:"messages/list",id:C(),params:{filter:{contextId:x()},limit:a,...i?{next:i}:{}}}}))?.data?.result||{},y=l?.messages||[],p=l?.next||"";return {messages:y,next:p,hasMore:!!p}}catch{}},async newConversation(){try{await t.request({url:f,method:"POST",data:{jsonrpc:"2.0",method:"messages/clear",id:C(),params:{contextId:x()}}});}catch{}},async getChatStatus(a){try{let i={jsonrpc:"2.0",id:C(),method:"tasks/get",params:a?{id:a}:{contextId:x()}},l=(await t.request({url:f,method:"POST",data:i}))?.data?.result;return {working:l?.status?.state==="working",taskId:l?.id,error:l?.error?.message||""}}catch(i){return {working:false,error:i?.message||""}}}}}
3
- exports.createCopilotClient=N;//# sourceMappingURL=index.cjs.map
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
4
3
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/copilot-client.ts"],"names":["g","getMiniProgramRequest","generateUUID","cryptoObj","c","r","SimpleAbortController","_","cb","createAbortController","getAppIdFromHostname","hostname","wwwMatch","domainMatch","extractAppIdFromUrl","url","pathMatch","cachedAppId","cachedAnonymousUid","getAppId","urlAppId","createWeChatMiniProgramStream","data","authHeader","signal","resolve","chunkBuffer","textDecoder","MiniProgramTextDecoder","ended","errorOccurred","dataQueue","resolveRead","pendingRead","pushChunk","text","chunkListener","res","newChunk","merged","decodeOffset","remaining","decoded","lastGoodIndex","goodPart","encodedGood","err","headersListener","miniReq","requestTask","finalText","error","createStream","getAccessToken","token","buffer","completed","failed","position","opts","ret","chunk","headers","response","reader","decoder","done","value","convertToA2AParts","content","part","extractTextFromContent","parseSSEStream","streamResponse","queue","parser","createParser","event","item","createCopilotClient","http","createHttpClient","baseUrl","getUserUid","envBaseUrl","activeChatAbortController","metaEnv","sendMessageStream","request","getContextId","appId","userUid","messages","chatOptions","taskId","systemMsg","m","nonSystemMsgs","lastUserMsg","parts","systemPrompt","limit","next","result","_next"],"mappings":"qQAgBA,IAAMA,CAAAA,CAAI,UAAA,CAEV,SAASC,CAAAA,EAAsD,CAC7D,OAAI,OAAOD,CAAAA,EAAG,IAAA,EAAM,OAAA,EAAY,UAAA,CAAmBA,EAAE,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAKA,CAAAA,CAAE,IAAI,CAAA,CACzE,OAAOA,CAAAA,EAAG,IAAI,OAAA,EAAY,UAAA,CAAmBA,CAAAA,CAAE,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAKA,CAAAA,CAAE,EAAE,EACnE,OAAOA,CAAAA,EAAG,EAAA,EAAI,OAAA,EAAY,UAAA,CAAmBA,CAAAA,CAAE,EAAA,CAAG,OAAA,CAAQ,KAAKA,CAAAA,CAAE,EAAE,CAAA,CACnE,OAAOA,CAAAA,EAAG,EAAA,EAAI,OAAA,EAAY,UAAA,CAAmBA,EAAE,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAKA,CAAAA,CAAE,EAAE,CAAA,CACnE,OAAOA,CAAAA,EAAG,IAAA,EAAM,SAAY,UAAA,CAAmBA,CAAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAKA,CAAAA,CAAE,IAAI,CAAA,CACzE,OAAOA,CAAAA,EAAG,EAAA,EAAI,OAAA,EAAY,UAAA,CAAmBA,CAAAA,CAAE,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAKA,EAAE,EAAE,CAAA,CACnE,OAAOA,CAAAA,EAAG,EAAA,EAAI,OAAA,EAAY,UAAA,CAAmBA,CAAAA,CAAE,GAAG,OAAA,CAAQ,IAAA,CAAKA,CAAAA,CAAE,EAAE,EAChE,IACT,CAIA,SAASE,CAAAA,EAAuB,CAC9B,IAAMC,CAAAA,CAAY,OAAO,UAAA,CAAe,GAAA,CAAc,UAAA,CAAW,MAAA,CAAS,MAAA,CAE1E,OAAIA,CAAAA,EAAa,OAAOA,CAAAA,CAAU,UAAA,EAAe,UAAA,CACxCA,CAAAA,CAAU,UAAA,EAAW,CAG1BA,GAAa,OAAOA,CAAAA,CAAU,eAAA,EAAoB,UAAA,CAC7C,sCAAA,CAAuC,OAAA,CAAQ,OAAA,CAAUC,CAAAA,EAAM,CAEpE,IAAMC,CAAAA,CAAAA,CADeF,CAAAA,CAAU,eAAA,CAAgB,IAAI,UAAA,CAAW,CAAC,CAAC,CAAA,CACxC,CAAC,CAAA,EAAK,CAAA,EAAK,EAAA,CAEnC,OAAA,CADUC,CAAAA,GAAM,GAAA,CAAMC,CAAAA,CAAKA,CAAAA,CAAI,EAAO,CAAA,EAC7B,QAAA,CAAS,EAAE,CACtB,CAAC,CAAA,CAGI,sCAAA,CAAuC,OAAA,CAAQ,QAAUD,CAAAA,EAAM,CACpE,IAAMC,CAAAA,CAAK,IAAA,CAAK,MAAA,EAAO,CAAI,EAAA,CAAM,EAEjC,OAAA,CADUD,CAAAA,GAAM,GAAA,CAAMC,CAAAA,CAAKA,CAAAA,CAAI,CAAA,CAAO,CAAA,EAC7B,QAAA,CAAS,EAAE,CACtB,CAAC,CACH,CAGA,IAAMC,CAAAA,CAAN,KAA4B,CAA5B,cACE,IAAA,CAAA,OAAA,CAAU,KAAA,CACV,IAAA,CAAQ,SAAA,CAA4B,EAAC,CAErC,IAAA,CAAA,MAAA,CAAS,CACP,QAAS,KAAA,CACT,gBAAA,CAAkB,CAACC,CAAAA,CAAYC,CAAAA,GAAmB,CAChD,IAAA,CAAK,SAAA,CAAU,KAAKA,CAAE,EACxB,CACF,EAAA,CAEA,OAAQ,CACF,IAAA,CAAK,OAAA,GACT,IAAA,CAAK,QAAU,IAAA,CACf,IAAA,CAAK,MAAA,CAAO,OAAA,CAAU,IAAA,CACtB,IAAA,CAAK,SAAA,CAAU,OAAA,CAASA,GAAOA,CAAAA,EAAI,CAAA,EACrC,CACF,CAAA,CAEA,SAASC,CAAAA,EAAiE,CACxE,OAAI,OAAO,eAAA,CAAoB,GAAA,CACtB,IAAI,eAAA,CAEN,IAAIH,CACb,CAIA,SAASI,CAAAA,CAAqBC,CAAAA,CAAiC,CAE7D,IAAMC,EAAW,wDAAA,CAAyD,IAAA,CAAKD,CAAQ,CAAA,CACvF,GAAIC,CAAAA,GAAW,CAAC,CAAA,CAAG,OAAOA,CAAAA,CAAS,CAAC,CAAA,CAGpC,IAAMC,EAAc,mDAAA,CAAoD,IAAA,CAAKF,CAAQ,CAAA,CACrF,OAAIE,CAAAA,GAAc,CAAC,CAAA,CAAUA,EAAY,CAAC,CAAA,CAEnC,IACT,CAEA,SAASC,CAAAA,EAAqC,CAC5C,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,OAAO,IAAA,CAE1C,GAAI,CACF,IAAMC,CAAAA,CAAM,MAAA,CAAO,SAAS,IAAA,CACtBC,CAAAA,CAAY,4BAAA,CAA6B,IAAA,CAAKD,CAAG,CAAA,CACvD,OAAIC,CAAAA,GAAY,CAAC,CAAA,CAAUA,CAAAA,CAAU,CAAC,CAAA,CAC/BN,CAAAA,CAAqB,MAAA,CAAO,QAAA,CAAS,QAAQ,CACtD,CAAA,KAAQ,CACN,OAAO,IACT,CACF,CAGA,IAAIO,CAAAA,CAA6B,KAG7BC,CAAAA,CAAoC,IAAA,CAExC,SAASC,CAAAA,CAASR,CAAAA,CAA2B,CAC3C,IAAMS,CAAAA,CAAWT,EAAWD,CAAAA,CAAqBC,CAAQ,CAAA,CAAIG,CAAAA,EAAoB,CACjF,OAAIM,CAAAA,GACCH,CAAAA,GAAaA,EAAcf,CAAAA,EAAa,CAAA,CACtCe,CAAAA,CACT,CAWA,eAAeI,CAAAA,CACbN,CAAAA,CACAO,CAAAA,CACAC,EAAqC,EAAC,CACtCC,CAAAA,CACyB,CACzB,OAAO,IAAI,OAAA,CAAyBC,CAAAA,EAAY,CAC9C,IAAIC,CAAAA,CAAc,IAAI,UAAA,CAAW,CAAC,CAAA,CAC5BC,CAAAA,CAAc,IAAIC,kBAAAA,CAAuB,QAAS,CAAE,KAAA,CAAO,KAAM,CAAC,CAAA,CAEpEC,CAAAA,CAAQ,KAAA,CACRC,CAAAA,CAAgB,MAEdC,CAAAA,CAAsB,EAAC,CACzBC,CAAAA,CAAuD,IAAA,CAErDC,CAAAA,CAAc,IAClB,IAAI,QAAwB5B,CAAAA,EAAM,CAC5B0B,CAAAA,CAAU,MAAA,CAAS,CAAA,CACrB1B,CAAAA,CAAE0B,CAAAA,CAAU,KAAA,EAAQ,CAAA,CACXF,CAAAA,CACTxB,CAAAA,CAAE,IAAI,EAEN2B,CAAAA,CAAc3B,EAElB,CAAC,CAAA,CAEG6B,EAAaC,CAAAA,EAAiB,CAC7BA,CAAAA,GACLJ,CAAAA,CAAU,IAAA,CAAKI,CAAI,CAAA,CACfH,CAAAA,GACFA,EAAYD,CAAAA,CAAU,KAAA,EAAQ,CAAA,CAC9BC,CAAAA,CAAc,IAAA,CAAA,EAElB,CAAA,CAEMI,CAAAA,CAAiBC,GAAa,CAClC,GAAI,EAAAP,CAAAA,EAAiBD,CAAAA,EAAS,CAACQ,CAAAA,CAAI,IAAA,CAAA,CAEnC,GAAI,CACF,IAAMC,CAAAA,CAAW,IAAI,WAAWD,CAAAA,CAAI,IAAmB,CAAA,CAGjDE,CAAAA,CAAS,IAAI,UAAA,CAAWb,CAAAA,CAAY,MAAA,CAASY,CAAAA,CAAS,MAAM,CAAA,CAClEC,CAAAA,CAAO,GAAA,CAAIb,CAAW,CAAA,CACtBa,CAAAA,CAAO,GAAA,CAAID,CAAAA,CAAUZ,CAAAA,CAAY,MAAM,CAAA,CACvCA,CAAAA,CAAca,EAEd,IAAIC,CAAAA,CAAe,CAAA,CAEnB,KAAOA,CAAAA,CAAed,CAAAA,CAAY,MAAA,EAAQ,CAExC,IAAMe,CAAAA,CAAYf,CAAAA,CAAY,QAAA,CAASc,CAAY,EAC7CE,CAAAA,CAAUf,CAAAA,CAAY,MAAA,CAAOc,CAAAA,CAAW,CAAE,MAAA,CAAQ,CAAA,CAAM,CAAC,CAAA,CAE/D,GAAIC,CAAAA,CAAQ,MAAA,GAAW,CAAA,CAErB,MAMF,GAAIA,CAAAA,CAAQ,QAAA,CAAS,QAAG,CAAA,CAAG,CAGzB,IAAMC,CAAAA,CAAgBD,EAAQ,WAAA,CAAY,QAAG,CAAA,GAAM,CAAA,CAAI,CAAA,CAAIA,CAAAA,CAAQ,OAAA,CAAQ,QAAG,EAC9E,GAAIC,CAAAA,EAAiB,CAAA,CACnB,MAGF,IAAMC,CAAAA,CAAWF,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAGC,CAAa,CAAA,CAC3CC,CAAAA,EACFV,CAAAA,CAAUU,CAAQ,CAAA,CAIpB,IAAMC,CAAAA,CAAc,IAAI,aAAY,CAAE,MAAA,CAAOD,CAAQ,CAAA,CACrDJ,CAAAA,EAAgBK,CAAAA,CAAY,MAAA,CAE5B,KACF,MAEEX,CAAAA,CAAUQ,CAAO,CAAA,CACjBF,CAAAA,EAAgBC,CAAAA,CAAU,OAE9B,CAGAf,CAAAA,CAAcA,EAAY,QAAA,CAASc,CAAY,EACjD,CAAA,MAASM,EAAK,CACZ,OAAA,CAAQ,KAAA,CAAM,oCAAA,CAAsCA,CAAG,EACzD,CACF,CAAA,CAEMC,CAAAA,CAAmBV,CAAAA,EAAa,CAChCA,CAAAA,CAAI,MAAA,GAAS,cAAc,CAAA,EAAG,QAAA,CAAS,mBAAmB,CAAA,GAAM,KAAA,EAClE,OAAA,CAAQ,IAAA,CAAK,6CAA6C,EAE9D,CAAA,CAEMW,CAAAA,CAAUhD,CAAAA,CAAE,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAKA,CAAAA,CAAE,EAAE,EAElCiD,CAAAA,CAEJ,GAAI,CACFA,CAAAA,CAAcD,EAAQ,CACpB,GAAA,CAAAjC,CAAAA,CACA,MAAA,CAAQ,OACR,MAAA,CAAQ,CACN,cAAA,CAAgB,kBAAA,CAChB,MAAA,CAAQ,mBAAA,CACR,GAAGQ,CACL,EACA,IAAA,CAAM,OAAOD,CAAAA,EAAS,QAAA,CAAWA,CAAAA,CAAO,IAAA,CAAK,SAAA,CAAUA,CAAI,EAC3D,YAAA,CAAc,aAAA,CACd,aAAA,CAAe,CAAA,CAAA,CACf,OAAA,CAAS,GAAA,CAET,OAAA,CAAS,IAAM,CACb,GAAII,CAAAA,CAAY,MAAA,CAAS,CAAA,CAAG,CAC1B,IAAMwB,CAAAA,CAAYvB,CAAAA,CAAY,OAAOD,CAAAA,CAAa,CAAE,MAAA,CAAQ,CAAA,CAAK,CAAC,CAAA,CAClEQ,CAAAA,CAAUgB,CAAS,EACrB,CACArB,CAAAA,CAAQ,CAAA,CAAA,CACRG,CAAAA,GAAc,IAAI,EACpB,CAAA,CAEA,IAAA,CAAM,IAAM,CACVF,CAAAA,CAAgB,CAAA,CAAA,CAChBD,CAAAA,CAAQ,CAAA,CAAA,CACRG,CAAAA,GAAc,IAAI,EACpB,CACF,CAAC,CAAA,CAGGR,CAAAA,GACEA,CAAAA,CAAO,QACTyB,CAAAA,CAAY,KAAA,EAAM,CAElBzB,CAAAA,CAAO,iBAAiB,OAAA,CAAS,IAAM,CACrCyB,CAAAA,CAAY,KAAA,GACd,CAAC,CAAA,CAAA,CAKLA,EAAY,eAAA,GAAkBb,CAAa,CAAA,CAE3Ca,CAAAA,CAAY,iBAAA,GAAoBF,CAAe,CAAA,CAE/CtB,CAAAA,CAAQ,CACN,EAAA,CAAI,CAAA,CAAA,CACJ,UAAA,CAAY,IAAA,CACZ,IAAA,CAAM,SACAK,CAAAA,CAAsB,IAAA,CACnBG,GAEX,CAAC,EACH,CAAA,MAASkB,EAAO,CACd,OAAA,CAAQ,KAAA,CAAM,eAAA,CAAiBA,CAAK,EACtC,CACF,CAAC,CACH,CAEA,eAAeC,CAAAA,CACbrC,CAAAA,CACAO,EACA+B,CAAAA,CACA7B,CAAAA,CACyB,CAEzB,IAAM8B,CAAAA,CAAQD,CAAAA,IAAiB,CACzB9B,CAAAA,CAAqC+B,EAAQ,CAAE,aAAA,CAAe,CAAA,OAAA,EAAUA,CAAK,CAAA,CAAG,CAAA,CAAI,EAAC,CAE3F,GAAI,OAAOtD,CAAAA,EAAG,EAAA,EAAI,OAAA,EAAY,WAC5B,OAAOqB,CAAAA,CAA8BN,CAAAA,CAAKO,CAAAA,CAAMC,EAAYC,CAAM,CAAA,CAEpE,IAAMwB,CAAAA,CAAU/C,CAAAA,EAAsB,CACtC,GAAI+C,CAAAA,CAEF,OAAO,IAAI,OAAA,CAASvB,CAAAA,EAAY,CAC9B,IAAI8B,CAAAA,CAAS,EAAA,CACTC,CAAAA,CAAY,MACZC,CAAAA,CAAS,KAAA,CACTC,CAAAA,CAAW,CAAA,CAETC,CAAAA,CAAO,CACX,GAAA,CAAA5C,CAAAA,CACA,OAAQ,MAAA,CACR,MAAA,CAAQ,CACN,cAAA,CAAgB,kBAAA,CAChB,MAAA,CAAQ,mBAAA,CACR,GAAGQ,CACL,CAAA,CACA,IAAA,CAAM,OAAOD,CAAAA,EAAS,QAAA,CAAWA,CAAAA,CAAO,IAAA,CAAK,SAAA,CAAUA,CAAI,CAAA,CAC3D,OAAA,CAAS,GAAA,CACT,OAAA,CAAUe,CAAAA,EAAa,CACrBkB,CAAAA,CAAS,OAAOlB,EAAI,IAAA,EAAS,QAAA,CAAWA,CAAAA,CAAI,IAAA,CAAO,IAAA,CAAK,SAAA,CAAUA,CAAAA,CAAI,IAAI,EAC1EmB,CAAAA,CAAY,KACd,CAAA,CACA,IAAA,CAAOV,GAAa,CAClB,OAAA,CAAQ,KAAA,CAAM,mCAAA,CAAqCA,CAAG,CAAA,CACtDW,CAAAA,CAAS,IAAA,CACTD,CAAAA,CAAY,KACd,CAAA,CACA,QAAA,CAAU,IAAM,CAAC,CACnB,CAAA,CAEA,GAAI,CACF,IAAMI,CAAAA,CAAMZ,CAAAA,CAAQW,CAAI,EAEpBC,CAAAA,EAAO,OAAOA,CAAAA,CAAI,IAAA,EAAS,UAAA,EAC7BA,CAAAA,CACG,IAAA,CAAMvB,CAAAA,EAAa,CAClBkB,CAAAA,CAAS,OAAOlB,CAAAA,CAAI,IAAA,EAAS,SAAWA,CAAAA,CAAI,IAAA,CAAO,IAAA,CAAK,SAAA,CAAUA,EAAI,IAAI,CAAA,CAC1EmB,CAAAA,CAAY,CAAA,EACd,CAAC,CAAA,CACA,KAAA,CAAM,IAAM,CACXC,CAAAA,CAAS,CAAA,CAAA,CACTD,CAAAA,CAAY,CAAA,EACd,CAAC,EAEP,CAAA,MAASV,CAAAA,CAAK,CACZ,OAAA,CAAQ,KAAA,CAAM,2BAAA,CAA6BA,CAAG,CAAA,CAC9CW,CAAAA,CAAS,IAAA,CACTD,CAAAA,CAAY,KACd,CAEA/B,CAAAA,CAAQ,CACN,EAAA,CAAI,KACJ,UAAA,CAAY,IAAA,CACZ,IAAA,CAAM,SAAY,CAChB,KAAO,CAAC+B,CAAAA,EAAaE,CAAAA,EAAYH,CAAAA,CAAO,MAAA,EACtC,MAAM,IAAI,QAASlD,CAAAA,EAAM,UAAA,CAAWA,CAAAA,CAAG,EAAE,CAAC,CAAA,CAE5C,GAAIoD,CAAAA,CAAQ,OAAO,IAAA,CACnB,GAAIC,CAAAA,EAAYH,CAAAA,CAAO,MAAA,CAAQ,OAAOC,CAAAA,CAAY,IAAA,CAAO,GACzD,IAAMK,CAAAA,CAAQN,CAAAA,CAAO,KAAA,CAAMG,CAAQ,CAAA,CACnC,OAAAA,CAAAA,CAAWH,EAAO,MAAA,CACXM,CACT,CACF,CAAC,EACH,CAAC,CAAA,CAIH,IAAMC,EAAkC,CACtC,cAAA,CAAgB,kBAAA,CAChB,GAAGvC,CACL,CAAA,CAEMwC,CAAAA,CAAW,MAAM,MAAMhD,CAAAA,CAAK,CAChC,MAAA,CAAQ,MAAA,CACR,OAAA,CAAA+C,CAAAA,CACA,WAAA,CAAa,SAAA,CACb,KAAM,IAAA,CAAK,SAAA,CAAUxC,CAAI,CAAA,CACzB,OAAAE,CACF,CAAC,CAAA,CAED,GAAI,CAACuC,CAAAA,CAAS,IAAA,CACZ,OAAO,CACL,EAAA,CAAIA,CAAAA,CAAS,EAAA,CACb,UAAA,CAAYA,EAAS,UAAA,CACrB,IAAA,CAAM,SAAY,IACpB,CAAA,CAGF,IAAMC,CAAAA,CAASD,CAAAA,CAAS,KAAK,SAAA,EAAU,CACjCE,CAAAA,CAAU,IAAI,WAAA,CAEpB,OAAO,CACL,EAAA,CAAIF,EAAS,EAAA,CACb,UAAA,CAAYA,CAAAA,CAAS,UAAA,CACrB,KAAM,SAAY,CAChB,GAAM,CAAE,KAAAG,CAAAA,CAAM,KAAA,CAAAC,CAAM,CAAA,CAAI,MAAMH,CAAAA,CAAO,IAAA,EAAK,CAC1C,OAAIE,CAAAA,CAAa,IAAA,CACVD,CAAAA,CAAQ,MAAA,CAAOE,CAAAA,CAAO,CAAE,MAAA,CAAQ,IAAK,CAAC,CAC/C,CACF,CACF,CAqCA,SAASC,CAAAA,CAAkBC,CAAAA,CAA4C,CACrE,OAAI,OAAOA,CAAAA,EAAY,QAAA,CACd,CAAC,CAAE,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAMA,CAAQ,CAAC,CAAA,CAGlCA,CAAAA,CACJ,GAAA,CAAKC,CAAAA,EAAsB,CAC1B,OAAQA,CAAAA,CAAK,IAAA,EACX,KAAK,MAAA,CACH,OAAO,CAAE,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAMA,CAAAA,CAAK,IAAK,CAAA,CACzC,KAAK,OAAA,CACH,OAAIA,CAAAA,CAAK,IAAA,CACA,CACL,IAAA,CAAM,OACN,IAAA,CAAM,CACJ,KAAA,CAAOA,CAAAA,CAAK,KACZ,QAAA,CAAUA,CAAAA,CAAK,QAAA,EAAY,WAC7B,CACF,CAAA,CAEEA,CAAAA,CAAK,GAAA,CACA,CACL,IAAA,CAAM,MAAA,CACN,IAAA,CAAM,CAAE,IAAKA,CAAAA,CAAK,GAAA,CAAK,QAAA,CAAUA,CAAAA,CAAK,QAAA,EAAY,WAAY,CAChE,CAAA,CAEK,KACT,KAAK,MAAA,CACH,OAAIA,CAAAA,CAAK,IAAA,CACA,CACL,IAAA,CAAM,MAAA,CACN,KAAM,CACJ,KAAA,CAAOA,CAAAA,CAAK,IAAA,CACZ,GAAIA,CAAAA,CAAK,QAAA,EAAY,CAAE,QAAA,CAAUA,EAAK,QAAS,CAAA,CAC/C,GAAIA,CAAAA,CAAK,IAAA,EAAQ,CAAE,IAAA,CAAMA,CAAAA,CAAK,IAAK,CACrC,CACF,CAAA,CAEEA,CAAAA,CAAK,GAAA,CACA,CACL,IAAA,CAAM,MAAA,CACN,KAAM,CACJ,GAAA,CAAKA,CAAAA,CAAK,GAAA,CACV,GAAIA,CAAAA,CAAK,QAAA,EAAY,CAAE,SAAUA,CAAAA,CAAK,QAAS,CAAA,CAC/C,GAAIA,EAAK,IAAA,EAAQ,CAAE,IAAA,CAAMA,CAAAA,CAAK,IAAK,CACrC,CACF,CAAA,CAEK,IAAA,CACT,QACE,OAAO,IACX,CACF,CAAC,CAAA,CACA,MAAA,CAAQA,CAAAA,EAAuBA,CAAAA,GAAS,IAAI,CACjD,CAEA,SAASC,EAAuBF,CAAAA,CAA4C,CAC1E,OAAI,OAAOA,CAAAA,EAAY,QAAA,CACdA,CAAAA,CAEFA,CAAAA,CACJ,OAAQC,CAAAA,EAA8BA,CAAAA,CAAK,IAAA,GAAS,MAAM,EAC1D,GAAA,CAAKA,CAAAA,EAASA,CAAAA,CAAK,IAAI,EACvB,IAAA,CAAK;AAAA,CAAI,CACd,CAIA,eAAgBE,CAAAA,CACdC,EACAjD,CAAAA,CAC6D,CAC7D,IAAMkD,CAAAA,CAAwC,EAAC,CAEzCC,CAAAA,CAASC,8BAAAA,CAAa,CAC1B,OAAA,CAAUC,CAAAA,EAAU,CAClB,GAAI,CACFH,CAAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAMG,CAAAA,CAAM,IAAI,CAAC,EACnC,OAAS/B,CAAAA,CAAK,CACZ,OAAA,CAAQ,KAAA,CAAM,gCAAiCA,CAAG,EACpD,CACF,CACF,CAAC,CAAA,CAED,GAAI,CACF,KACM,CAAAtB,CAAAA,EAAQ,OAAA,EADD,CAIX,IAAMqC,CAAAA,CAAQ,MAAMY,CAAAA,CAAe,IAAA,GACnC,GAAIZ,CAAAA,GAAU,IAAA,CACZ,MAEF,GAAIA,CAAAA,CAEF,IADAc,CAAAA,CAAO,KAAKd,CAAK,CAAA,CACVa,CAAAA,CAAM,MAAA,CAAS,GAAG,CACvB,IAAMI,CAAAA,CAAOJ,CAAAA,CAAM,OAAM,CACrBI,CAAAA,GACF,MAAMA,CAAAA,EAEV,CAEJ,CACF,CAAA,MAAShC,CAAAA,CAAK,CACZ,GAAItB,CAAAA,EAAQ,OAAA,CACV,OAEF,OAAA,CAAQ,KAAA,CAAM,gCAAA,CAAkCsB,CAAG,EACrD,CACF,CAiDO,SAASiC,CAAAA,CACdC,CAAAA,CAAmBC,2BAAAA,EAAiB,CACpCC,CAAAA,CACA7B,EACA8B,CAAAA,CACe,CACf,IAAIC,CAAAA,CAAa,GACbC,CAAAA,CAAoD,IAAA,CAGlDC,CAAAA,CAAW,UAOjB,GANIA,CAAAA,GACFF,CAAAA,CAAaE,CAAAA,CAAQ,qBAAA,EAAyBA,CAAAA,CAAQ,iBAAA,EAAqB,EAAA,CAAA,CAKzE,CAACF,CAAAA,CACH,GAAI,CACFA,CAAAA,CAAa,QAAQ,GAAA,CAAI,qBAAA,EAAyB,OAAA,CAAQ,GAAA,CAAI,mBAAqB,GACrF,CAAA,KAAQ,CAER,CAGFA,CAAAA,CAAa,MAAA,CAAOA,CAAAA,EAAc,EAAE,EAAE,IAAA,EAAK,CAC3C,IAAMrE,CAAAA,CAAM,GAAGmE,CAAAA,EAAWE,CAAU,CAAA,mCAAA,CAAA,CAEpC,OAAA,CAAQ,IAAI,QAAQ,CAAA,CAEpB,eAAgBG,CAAAA,CACdC,CAAAA,CACAhE,CAAAA,CAC6D,CAC7D,GAAI,CACF,IAAMiD,CAAAA,CAAiB,MAAMrB,CAAAA,CAAarC,CAAAA,CAAKyE,CAAAA,CAASnC,CAAAA,CAAgB7B,CAAM,EAE9E,GAAI,CAACiD,CAAAA,CAAe,EAAA,CAClB,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0BA,EAAe,UAAU,CAAA,CAAE,CAAA,CAGvE,MAAOD,EAAeC,CAAAA,CAAgBjD,CAAM,EAC9C,CAAA,MAASsB,EAAK,CACZ,GAAItB,CAAAA,EAAQ,OAAA,CACV,OAEF,OAAA,CAAQ,KAAA,CAAM,4BAAA,CAA8BsB,CAAG,EACjD,CACF,CAEA,IAAM2C,EAAe,IAAM,CACzB,IAAIC,CAAAA,CAAQvE,GAAS,CAErB,GAAI,OAAOnB,CAAAA,EAAG,EAAA,EAAI,OAAA,EAAY,UAAA,CAAY,CACxC,IAAMW,CAAAA,CAAWI,CAAAA,CAAMA,CAAAA,CAAI,OAAA,CAAQ,eAAgB,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA,CAAI,EAAA,CACvE2E,CAAAA,CAAQvE,CAAAA,CAASR,CAAQ,EAC3B,CAEA,IAAMgF,CAAAA,CAAUR,CAAAA,IAAa,EAAMjE,CAAAA,GAAAA,CAAAA,CAAuB,aAAahB,CAAAA,EAAc,CAAA,CAAA,CAAA,CAErF,OADkB,GAAGwF,CAAK,CAAA,CAAA,EAAIC,CAAO,CAAA,CAEvC,CAAA,CAEA,OAAO,CACL,MAAO,KAAKC,CAAAA,CAAUC,CAAAA,CAAc,EAAC,CAAG,CACtC,GAAM,CAAE,MAAA,CAAAC,CAAO,EAAID,CAAAA,CAEnBR,CAAAA,CAA4B5E,CAAAA,EAAsB,CAClD,IAAMe,CAAAA,CAAS6D,CAAAA,EAA2B,MAAA,CAE1C,GAAI,CACF,IAAMU,CAAAA,CAAYH,CAAAA,CAAS,KAAMI,CAAAA,EAAMA,CAAAA,CAAE,IAAA,GAAS,QAAQ,EACpDC,CAAAA,CAAgBL,CAAAA,CAAS,MAAA,CAAQI,CAAAA,EAAMA,CAAAA,CAAE,IAAA,GAAS,QAAQ,CAAA,CAC1DE,EAAcD,CAAAA,CAAcA,CAAAA,CAAc,MAAA,CAAS,CAAC,EAEpDE,CAAAA,CAAQD,CAAAA,CACV9B,CAAAA,CAAkB8B,CAAAA,CAAY,OAAO,CAAA,CACrC,CAAC,CAAE,IAAA,CAAM,MAAA,CAAiB,IAAA,CAAM,EAAG,CAAC,EAElCE,CAAAA,CAAeL,CAAAA,CAAYxB,CAAAA,CAAuBwB,CAAAA,CAAU,OAAO,CAAA,CAAI,KAAA,CAAA,CAEvEP,CAAAA,CAAuC,CAC3C,OAAA,CAAS,KAAA,CACT,EAAA,CAAItF,CAAAA,EAAa,CACjB,MAAA,CAAQ,gBAAA,CACR,MAAA,CAAQ,CACN,OAAA,CAAS,CACP,SAAA,CAAWuF,CAAAA,GACX,IAAA,CAAM,SAAA,CACN,SAAA,CAAWvF,CAAAA,GACX,IAAA,CAAM,MAAA,CACN,KAAA,CAAAiG,CAAAA,CACA,GAAIL,CAAAA,EAAU,CAAE,MAAA,CAAAA,CAAO,CAAA,CACvB,GAAIM,CAAAA,EAAgB,CAAE,SAAU,CAAE,YAAA,CAAAA,CAAa,CAAE,CACnD,CACF,CACF,CAAA,CAEA,UAAA,IAAiBrC,CAAAA,IAAYwB,CAAAA,CAAkBC,CAAAA,CAAShE,CAAM,EAAG,CAC/D,GAAIA,CAAAA,EAAQ,OAAA,CACV,MAEF,MAAMuC,EACR,CACF,CAAA,OAAE,CACAsB,CAAAA,CAA4B,KAC9B,CACF,CAAA,CAEA,UAAA,CAAWS,CAAAA,CAAQ,CACjBT,CAAAA,EAA2B,OAAM,CACjCA,CAAAA,CAA4B,IAAA,CAE5B,IAAMG,CAAAA,CAA6B,CACjC,OAAA,CAAS,KAAA,CACT,GAAItF,CAAAA,EAAa,CACjB,MAAA,CAAQ,cAAA,CACR,MAAA,CAAQ,CAAE,EAAA,CAAI4F,CAAO,CACvB,CAAA,CACA,OAAOd,CAAAA,CAAK,OAAA,CAA4B,CACtC,GAAA,CAAAjE,CAAAA,CACA,MAAA,CAAQ,MAAA,CACR,KAAMyE,CACR,CAAC,CACH,CAAA,CAEA,MAAM,UAAA,CAAWa,CAAAA,CAAQ,EAAA,CAAIC,EAAe,CAC1C,GAAI,CAWF,IAAMC,GAVW,MAAMvB,CAAAA,CAAK,OAAA,CAAQ,CAClC,IAAAjE,CAAAA,CACA,MAAA,CAAQ,MAAA,CACR,IAAA,CAAM,CACJ,OAAA,CAAS,KAAA,CACT,MAAA,CAAQ,gBACR,EAAA,CAAIb,CAAAA,EAAa,CACjB,MAAA,CAAQ,CAAE,MAAA,CAAQ,CAAE,SAAA,CAAWuF,CAAAA,EAAe,CAAA,CAAG,KAAA,CAAAY,CAAAA,CAAO,GAAIC,CAAAA,CAAO,CAAE,IAAA,CAAAA,CAAK,EAAI,EAAI,CACpF,CACF,CAAC,CAAA,GACmB,IAAA,EAAM,MAAA,EAAU,EAAC,CAC/BV,CAAAA,CAAWW,CAAAA,EAAQ,QAAA,EAAY,EAAC,CAChCC,CAAAA,CAAQD,CAAAA,EAAQ,MAAQ,EAAA,CAE9B,OAAO,CACL,QAAA,CAAAX,EACA,IAAA,CAAMY,CAAAA,CACN,OAAA,CAAS,CAAC,CAACA,CACb,CACF,CAAA,KAAc,CAAC,CACjB,CAAA,CAEA,MAAM,eAAA,EAAkB,CACtB,GAAI,CACF,MAAMxB,CAAAA,CAAK,QAAQ,CACjB,GAAA,CAAAjE,CAAAA,CACA,MAAA,CAAQ,OACR,IAAA,CAAM,CACJ,OAAA,CAAS,KAAA,CACT,MAAA,CAAQ,gBAAA,CACR,EAAA,CAAIb,CAAAA,GACJ,MAAA,CAAQ,CAAE,SAAA,CAAWuF,CAAAA,EAAe,CACtC,CACF,CAAC,EACH,MAAc,CAAC,CACjB,CAAA,CAEA,MAAM,aAAA,CAAcK,CAAAA,CAAQ,CAC1B,GAAI,CACF,IAAMN,CAAAA,CAAU,CACd,OAAA,CAAS,MACT,EAAA,CAAItF,CAAAA,EAAa,CACjB,MAAA,CAAQ,YACR,MAAA,CAAQ4F,CAAAA,CACJ,CAAE,EAAA,CAAIA,CAAO,CAAA,CACb,CACE,SAAA,CAAWL,GACb,CACN,CAAA,CAMMnE,CAAAA,CAAAA,CALS,MAAM0D,CAAAA,CAAK,OAAA,CAAa,CACrC,GAAA,CAAAjE,EACA,MAAA,CAAQ,MAAA,CACR,IAAA,CAAMyE,CACR,CAAC,CAAA,GACoB,IAAA,EAAM,MAAA,CAC3B,OAAO,CACL,OAAA,CAASlE,CAAAA,EAAM,MAAA,EAAQ,QAAU,SAAA,CACjC,MAAA,CAAQA,CAAAA,EAAM,EAAA,CACd,MAAOA,CAAAA,EAAM,KAAA,EAAO,OAAA,EAAW,EACjC,CACF,CAAA,MAASwB,CAAAA,CAAK,CACZ,OAAO,CACL,OAAA,CAAS,KAAA,CACT,KAAA,CAAQA,GAAa,OAAA,EAAW,EAClC,CACF,CACF,CACF,CACF","file":"index.cjs","sourcesContent":["/* eslint-disable no-undef, no-unused-vars */\nimport type {\n CancelTaskRequest,\n CancelTaskResponse,\n Part,\n SendStreamingMessageRequest,\n SendStreamingMessageResponse,\n} from \"@a2a-js/sdk\";\nimport { type ClientResult, createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\nimport { createParser } from \"eventsource-parser\";\nimport MiniProgramTextDecoder from \"miniprogram-text-decoder\";\n// import MiniProgramTextEncoder from \"miniprogram-text-encoder\";\n\n// ============ Internal: Platform Detection (same as http-client) ============\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst g = globalThis as any;\n\nfunction getMiniProgramRequest(): ((_opts: any) => any) | null {\n if (typeof g?.Taro?.request === \"function\") return g.Taro.request.bind(g.Taro);\n if (typeof g?.wx?.request === \"function\") return g.wx.request.bind(g.wx);\n if (typeof g?.tt?.request === \"function\") return g.tt.request.bind(g.tt);\n if (typeof g?.my?.request === \"function\") return g.my.request.bind(g.my);\n if (typeof g?.swan?.request === \"function\") return g.swan.request.bind(g.swan);\n if (typeof g?.qq?.request === \"function\") return g.qq.request.bind(g.qq);\n if (typeof g?.jd?.request === \"function\") return g.jd.request.bind(g.jd);\n return null;\n}\n\n// ============ Internal: UUID Generator ============\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, (c) => {\n const randomValues = cryptoObj.getRandomValues(new Uint8Array(1));\n const r = (randomValues[0] ?? 0) % 16;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// ============ AbortController Polyfill (Mini Program Safe) ============\nclass SimpleAbortController {\n aborted = false;\n private listeners: (() => void)[] = [];\n\n signal = {\n aborted: false,\n addEventListener: (_: \"abort\", cb: () => void) => {\n this.listeners.push(cb);\n },\n };\n\n abort() {\n if (this.aborted) return;\n this.aborted = true;\n this.signal.aborted = true;\n this.listeners.forEach((cb) => cb());\n }\n}\n\nfunction createAbortController(): AbortController | SimpleAbortController {\n if (typeof AbortController !== \"undefined\") {\n return new AbortController();\n }\n return new SimpleAbortController();\n}\n\n// ============ Internal: URL Utilities ============\n\nfunction getAppIdFromHostname(hostname: string): string | null {\n // Pattern 1: www.{app_id}.domain.tld or www.{app_id}-{env}.domain.tld\n const wwwMatch = /^www\\.([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (wwwMatch?.[1]) return wwwMatch[1];\n\n // Pattern 2: {app_id}-{env}.domain.tld or {app_id}.domain.tld\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\n// Cache appId for session consistency\nlet cachedAppId: string | null = null;\n\n// Cache anonymous user ID for session consistency\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\n// ============ Internal: Streaming ============\n\ninterface StreamResponse {\n ok: boolean;\n statusText: string;\n read(): Promise<string | null>;\n}\n\n// 小程序专用的流式请求\nasync function createWeChatMiniProgramStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string> = {},\n signal?: AbortSignal\n): Promise<StreamResponse> {\n return new Promise<StreamResponse>((resolve) => {\n let chunkBuffer = new Uint8Array(0);\n const textDecoder = new MiniProgramTextDecoder(\"utf-8\", { fatal: false });\n\n let ended = false;\n let errorOccurred = false;\n\n const dataQueue: string[] = [];\n let resolveRead: ((value: string | null) => void) | null = null;\n\n const pendingRead = () =>\n new Promise<string | null>((r) => {\n if (dataQueue.length > 0) {\n r(dataQueue.shift()!);\n } else if (ended) {\n r(null);\n } else {\n resolveRead = r;\n }\n });\n\n const pushChunk = (text: string) => {\n if (!text) return;\n dataQueue.push(text);\n if (resolveRead) {\n resolveRead(dataQueue.shift()!);\n resolveRead = null;\n }\n };\n\n const chunkListener = (res: any) => {\n if (errorOccurred || ended || !res.data) return;\n\n try {\n const newChunk = new Uint8Array(res.data as ArrayBuffer);\n\n // 追加\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\n while (decodeOffset < chunkBuffer.length) {\n // 尝试从当前偏移解码尽可能多的内容,但 stream: false\n const remaining = chunkBuffer.subarray(decodeOffset);\n const decoded = textDecoder.decode(remaining, { stream: false });\n\n if (decoded.length === 0) {\n // 连一个字符都解不出来,说明剩余部分不完整,等待下次 chunk\n break;\n }\n\n // 关键:计算真正被成功解码的字节数(不依赖 replacement character)\n // 方法1:利用 replacement character 出现的位置来推断(较可靠)\n // 方法2:更简单粗暴但在大多数场景够用:假设没有 � 就全消费,有 � 则回退\n if (decoded.includes(\"�\")) {\n // 有替换字符 → 说明后面有不完整序列,不能全消费\n // 保守策略:本次只消费到最后一个完整字符之前\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 pushChunk(goodPart);\n }\n\n // 估算已消费字节数(不完美,但比原来好很多)\n const encodedGood = new TextEncoder().encode(goodPart);\n decodeOffset += encodedGood.length;\n\n break; // 剩余部分等下次\n } else {\n // 没有 � → 说明本次 remaining 里全是完整字符,可以全部消费\n pushChunk(decoded);\n decodeOffset += remaining.length; // 安全,因为没出现替换字符\n }\n }\n\n // 保留剩余未解码部分\n chunkBuffer = chunkBuffer.subarray(decodeOffset);\n } catch (err) {\n console.error(\"[mini stream] chunk process error:\", err);\n }\n };\n\n const headersListener = (res: any) => {\n if (res.header?.[\"content-type\"]?.includes(\"text/event-stream\") === false) {\n console.warn(\"Warning: server did not return event-stream\");\n }\n };\n\n const miniReq = g.wx.request.bind(g.wx);\n\n let requestTask: any;\n\n try {\n 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: true,\n timeout: 300000,\n\n success: () => {\n if (chunkBuffer.length > 0) {\n const finalText = textDecoder.decode(chunkBuffer, { stream: true });\n pushChunk(finalText);\n }\n ended = true;\n resolveRead?.(null);\n },\n\n fail: () => {\n errorOccurred = true;\n ended = true;\n resolveRead?.(null);\n },\n });\n\n // 支持 abort\n if (signal) {\n if (signal.aborted) {\n requestTask.abort();\n } else {\n signal.addEventListener(\"abort\", () => {\n requestTask.abort();\n });\n }\n }\n\n // 关键:监听分块到达\n requestTask.onChunkReceived?.(chunkListener);\n // 可选:监听 HTTP headers 到达(可用于检查状态码)\n requestTask.onHeadersReceived?.(headersListener);\n\n resolve({\n ok: true,\n statusText: \"OK\",\n read: async () => {\n if (errorOccurred) return null;\n return pendingRead();\n },\n });\n } catch (error) {\n console.error(\"miniReq error\", error);\n }\n });\n}\n\nasync function createStream(\n url: string,\n data: unknown,\n getAccessToken?: () => string | null,\n signal?: AbortSignal\n): Promise<StreamResponse> {\n // Get token for authentication\n const token = getAccessToken?.();\n const authHeader: Record<string, string> = token ? { Authorization: `Bearer ${token}` } : {};\n\n if (typeof g?.wx?.request === \"function\") {\n return createWeChatMiniProgramStream(url, data, authHeader, signal);\n }\n const miniReq = getMiniProgramRequest();\n if (miniReq) {\n // Mini-program: buffer full response\n return new Promise((resolve) => {\n let buffer = \"\";\n let completed = false;\n let failed = false;\n let position = 0;\n\n const opts = {\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 timeout: 60000,\n success: (res: any) => {\n buffer = typeof res.data === \"string\" ? res.data : JSON.stringify(res.data);\n completed = true;\n },\n fail: (err: any) => {\n console.error(\"[createStream] wx.request failed:\", err);\n failed = true;\n completed = true;\n },\n complete: () => {},\n };\n\n try {\n const ret = miniReq(opts);\n\n if (ret && typeof ret.then === \"function\") {\n ret\n .then((res: any) => {\n buffer = typeof res.data === \"string\" ? res.data : JSON.stringify(res.data);\n completed = true;\n })\n .catch(() => {\n failed = true;\n completed = true;\n });\n }\n } catch (err) {\n console.error(\"[createStream] Exception:\", err);\n failed = true;\n completed = true;\n }\n\n resolve({\n ok: true,\n statusText: \"OK\",\n read: async () => {\n while (!completed && position >= buffer.length) {\n await new Promise((r) => setTimeout(r, 50));\n }\n if (failed) return null;\n if (position >= buffer.length) return completed ? null : \"\";\n const chunk = buffer.slice(position);\n position = buffer.length;\n return chunk;\n },\n });\n });\n }\n\n // Browser: use fetch streaming with authentication\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,\n });\n\n if (!response.body) {\n return {\n ok: response.ok,\n statusText: response.statusText,\n read: async () => null,\n };\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n return {\n ok: response.ok,\n statusText: response.statusText,\n read: async () => {\n const { done, value } = await reader.read();\n if (done) return null;\n return decoder.decode(value, { stream: true });\n },\n };\n}\n\n// ============ Input Types ============\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport interface ImageContent {\n type: \"image\";\n data?: string;\n url?: string;\n mimeType?: string;\n}\n\nexport interface FileContent {\n type: \"file\";\n data?: string;\n url?: string;\n mimeType?: string;\n name?: string;\n}\n\nexport type MessageContent = TextContent | ImageContent | FileContent;\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string | MessageContent[];\n}\n\nexport interface ChatOptions {\n taskId?: string;\n}\n\n// ============ Convert Input to A2A Part ============\n\nfunction 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\nfunction 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\n// ============ SSE Stream Handling ============\n\nasync function* parseSSEStream(\n streamResponse: StreamResponse,\n signal?: AbortSignal\n): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n const queue: SendStreamingMessageResponse[] = [];\n\n const parser = createParser({\n onEvent: (event) => {\n try {\n queue.push(JSON.parse(event.data));\n } catch (err) {\n console.error(\"[parseSSEStream] Parse error:\", err);\n }\n },\n });\n\n try {\n while (true) {\n if (signal?.aborted) {\n break;\n }\n const chunk = await streamResponse.read();\n if (chunk === null) {\n break;\n }\n if (chunk) {\n parser.feed(chunk);\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n yield item;\n }\n }\n }\n }\n } catch (err) {\n if (signal?.aborted) {\n return;\n }\n console.error(\"[parseSSEStream] Stream error:\", err);\n }\n}\n\n// ============ Client ============\n\nexport type CopilotClient = {\n /**\n * Stream messages from Copilot Agent.\n *\n * @example\n * ```typescript\n * import { createCopilotClient, Data } from \"@amaster.ai/copilot-client\";\n *\n * const client = createCopilotClient();\n *\n * for await (const response of client.chat([{ role: \"user\", content: \"Hello\" }])) {\n * // deal response\n * }\n * ```\n */\n chat(\n messages: ChatMessage[],\n options?: ChatOptions\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId?: string): Promise<{\n working: boolean;\n taskId?: string;\n error?: string;\n }>;\n getHistory(\n limit?: number,\n next?: string\n ): Promise<\n | {\n messages: SendStreamingMessageResponse[];\n next: string;\n hasMore: boolean;\n }\n | undefined\n >;\n newConversation(): Promise<void>;\n};\n\n/**\n * Create Copilot client\n *\n * Auto-detects runtime environment (Browser/Vite/Taro H5/Taro Mini-program)\n */\nexport function createCopilotClient(\n http: HttpClient = createHttpClient(),\n baseUrl?: string,\n getAccessToken?: () => string | null,\n getUserUid?: () => string | null\n): CopilotClient {\n let envBaseUrl = \"\";\n let activeChatAbortController: AbortController | null = null;\n\n // Vite/H5:必须直接写 import.meta.env,Vite 才能正确处理\n const metaEnv = (import.meta as any)?.env;\n if (metaEnv) {\n envBaseUrl = metaEnv.TARO_APP_API_BASE_URL || metaEnv.VITE_API_BASE_URL || \"\";\n }\n\n // Taro 小程序 build:defineConstants 会把 process.env.xxx 替换为字面量\n // H5 环境:process 不存在会抛 ReferenceError,这里用 try/catch 吞掉\n if (!envBaseUrl) {\n try {\n envBaseUrl = process.env.TARO_APP_API_BASE_URL || process.env.VITE_API_BASE_URL || \"\";\n } catch {\n // process is not defined -> ignore\n }\n }\n\n envBaseUrl = String(envBaseUrl || \"\").trim();\n const url = `${baseUrl || envBaseUrl}/api/proxy/builtin/platform/copilot`;\n\n console.log(\"xxxxxx\");\n\n async function* sendMessageStream(\n request: SendStreamingMessageRequest,\n signal?: AbortSignal\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n try {\n const streamResponse = await createStream(url, request, getAccessToken, signal);\n\n if (!streamResponse.ok) {\n throw new Error(`Stream request failed: ${streamResponse.statusText}`);\n }\n\n yield* parseSSEStream(streamResponse, signal);\n } catch (err) {\n if (signal?.aborted) {\n return;\n }\n console.error(\"[sendMessageStream] Error:\", err);\n }\n }\n\n const getContextId = () => {\n let appId = getAppId();\n\n if (typeof g?.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 contextId = `${appId}:${userUid}`;\n return contextId;\n };\n\n return {\n async *chat(messages, chatOptions = {}) {\n const { taskId } = chatOptions;\n\n activeChatAbortController = createAbortController() as any;\n const signal = activeChatAbortController?.signal;\n\n try {\n const systemMsg = messages.find((m) => m.role === \"system\");\n const nonSystemMsgs = messages.filter((m) => m.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: getContextId(),\n kind: \"message\",\n messageId: generateUUID(),\n role: \"user\",\n parts,\n ...(taskId && { taskId }),\n ...(systemPrompt && { metadata: { systemPrompt } }),\n },\n },\n };\n\n for await (const response of sendMessageStream(request, signal)) {\n if (signal?.aborted) {\n break;\n }\n yield response;\n }\n } finally {\n activeChatAbortController = null;\n }\n },\n\n cancelChat(taskId) {\n activeChatAbortController?.abort();\n activeChatAbortController = null;\n\n const request: CancelTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/cancel\",\n params: { id: taskId },\n };\n return http.request<CancelTaskResponse>({\n url,\n method: \"POST\",\n data: request,\n });\n },\n\n async getHistory(limit = 50, next?: string) {\n try {\n const res: any = await http.request({\n url,\n method: \"POST\",\n data: {\n jsonrpc: \"2.0\",\n method: \"messages/list\",\n id: generateUUID(),\n params: { filter: { contextId: getContextId() }, limit, ...(next ? { next } : {}) },\n },\n });\n const result = res?.data?.result || {};\n const messages = result?.messages || [];\n const _next = result?.next || \"\";\n\n return {\n messages,\n next: _next,\n hasMore: !!_next,\n };\n } catch (err) {}\n },\n\n async newConversation() {\n try {\n await http.request({\n url,\n method: \"POST\",\n data: {\n jsonrpc: \"2.0\",\n method: \"messages/clear\",\n id: generateUUID(),\n params: { contextId: getContextId() },\n },\n });\n } catch (err) {}\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\n ? { id: taskId }\n : {\n contextId: getContextId(),\n },\n };\n const result = await http.request<any>({\n url,\n method: \"POST\",\n data: request,\n });\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 (err) {\n return {\n working: false,\n error: (err as any)?.message || \"\",\n };\n }\n },\n };\n}\n"]}
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"]}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,8 @@
1
- import { SendStreamingMessageResponse, CancelTaskResponse } from '@a2a-js/sdk';
2
- import { HttpClient, ClientResult } from '@amaster.ai/http-client';
1
+ import { HttpClient } from '@amaster.ai/http-client';
3
2
 
3
+ type ContextIdMode = "conversation" | "single-turn";
4
+
5
+ type Role = "user" | "assistant" | "system";
4
6
  interface TextContent {
5
7
  type: "text";
6
8
  text: string;
@@ -19,47 +21,108 @@ interface FileContent {
19
21
  name?: string;
20
22
  }
21
23
  type MessageContent = TextContent | ImageContent | FileContent;
22
- interface ChatMessage {
23
- role: "system" | "user" | "assistant";
24
- content: string | MessageContent[];
24
+ interface BaseMessage {
25
+ messageId: string;
26
+ role?: Role;
27
+ kind: string;
28
+ timestamp?: string;
29
+ }
30
+ interface TextMessage extends BaseMessage {
31
+ kind: "text-content" | "message";
32
+ content: string;
33
+ }
34
+ interface ErrorMessage extends BaseMessage {
35
+ kind: "error";
36
+ content: string;
37
+ }
38
+ interface ThoughtMessage extends BaseMessage {
39
+ kind: "thought";
40
+ thought: string;
41
+ }
42
+ interface ToolMessage extends BaseMessage {
43
+ kind: "tool";
44
+ toolName?: string;
45
+ toolStatus?: string;
46
+ toolDescription?: string;
47
+ response?: unknown;
48
+ }
49
+ interface UIRenderMessage extends BaseMessage {
50
+ kind: "ui-render";
51
+ spec: {
52
+ root: string;
53
+ elements: Record<string, {
54
+ type: string;
55
+ props?: Record<string, unknown>;
56
+ children?: string[];
57
+ }>;
58
+ };
59
+ }
60
+ type MessagesItem = TextMessage | ErrorMessage | ThoughtMessage | ToolMessage | UIRenderMessage | BaseMessage;
61
+ interface Conversation {
62
+ taskId: string;
63
+ status: "submitted" | "working" | "completed" | "error";
64
+ messages: MessagesItem[];
65
+ lastUpdated: string;
66
+ role?: Role;
67
+ historyId?: string;
68
+ system?: {
69
+ level: "newConversation";
70
+ content?: string;
71
+ };
25
72
  }
26
- interface ChatOptions {
27
- taskId?: string;
73
+ interface HistoryState {
74
+ next: string | null;
75
+ hasMore: boolean;
28
76
  }
77
+ interface UpdateMessageInput {
78
+ taskId: string;
79
+ messageId: string;
80
+ content?: string;
81
+ partial?: boolean;
82
+ status?: string;
83
+ response?: unknown;
84
+ metadata?: Record<string, unknown>;
85
+ }
86
+ interface ConversationControllerSnapshot {
87
+ starting: boolean;
88
+ isLoading: boolean;
89
+ isLoadingHistory: boolean;
90
+ historyState: HistoryState;
91
+ conversations: Conversation[];
92
+ }
93
+ interface ConversationStrings {
94
+ thinking: string;
95
+ errorMessage: string;
96
+ cancelled: string;
97
+ }
98
+ interface ConversationControllerOptions {
99
+ strings: ConversationStrings;
100
+ mode?: ContextIdMode;
101
+ getContextId?: () => string;
102
+ loadHistoryOnInit?: boolean;
103
+ resumeOnInit?: boolean;
104
+ }
105
+ interface ConversationController {
106
+ getSnapshot(): ConversationControllerSnapshot;
107
+ subscribe(listener: (snapshot: ConversationControllerSnapshot) => void): () => void;
108
+ init(): Promise<void>;
109
+ destroy(): void;
110
+ sendMessage(userContent: string): Promise<void>;
111
+ abort(): void;
112
+ cancelChat(taskId?: string): Promise<void>;
113
+ resetConversation(greeting?: string): void;
114
+ startNewConversation(): Promise<void>;
115
+ loadHistory(limit?: number, next?: string): Promise<void>;
116
+ loadMoreHistory(): Promise<void>;
117
+ getConversation(taskId: string): Conversation | undefined;
118
+ clearConversation(taskId: string): void;
119
+ removeMessage(taskId: string, messageId: string): void;
120
+ updateMessage(input: UpdateMessageInput): void;
121
+ }
122
+
29
123
  type CopilotClient = {
30
- /**
31
- * Stream messages from Copilot Agent.
32
- *
33
- * @example
34
- * ```typescript
35
- * import { createCopilotClient, Data } from "@amaster.ai/copilot-client";
36
- *
37
- * const client = createCopilotClient();
38
- *
39
- * for await (const response of client.chat([{ role: "user", content: "Hello" }])) {
40
- * // deal response
41
- * }
42
- * ```
43
- */
44
- chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;
45
- cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;
46
- getChatStatus(taskId?: string): Promise<{
47
- working: boolean;
48
- taskId?: string;
49
- error?: string;
50
- }>;
51
- getHistory(limit?: number, next?: string): Promise<{
52
- messages: SendStreamingMessageResponse[];
53
- next: string;
54
- hasMore: boolean;
55
- } | undefined>;
56
- newConversation(): Promise<void>;
124
+ createConversationController(options: ConversationControllerOptions): ConversationController;
57
125
  };
58
- /**
59
- * Create Copilot client
60
- *
61
- * Auto-detects runtime environment (Browser/Vite/Taro H5/Taro Mini-program)
62
- */
63
126
  declare function createCopilotClient(http?: HttpClient, baseUrl?: string, getAccessToken?: () => string | null, getUserUid?: () => string | null): CopilotClient;
64
127
 
65
- export { type ChatMessage, type ChatOptions, type CopilotClient, type FileContent, type ImageContent, type MessageContent, type TextContent, createCopilotClient };
128
+ export { type Conversation, type ConversationController, type ConversationControllerOptions, type ConversationControllerSnapshot, type ConversationStrings, type CopilotClient, type ErrorMessage, type FileContent, type HistoryState, type ImageContent, type MessageContent, type MessagesItem, type Role, type TextContent, type TextMessage, type ThoughtMessage, type ToolMessage, type UIRenderMessage, type UpdateMessageInput, createCopilotClient };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
- import { SendStreamingMessageResponse, CancelTaskResponse } from '@a2a-js/sdk';
2
- import { HttpClient, ClientResult } from '@amaster.ai/http-client';
1
+ import { HttpClient } from '@amaster.ai/http-client';
3
2
 
3
+ type ContextIdMode = "conversation" | "single-turn";
4
+
5
+ type Role = "user" | "assistant" | "system";
4
6
  interface TextContent {
5
7
  type: "text";
6
8
  text: string;
@@ -19,47 +21,108 @@ interface FileContent {
19
21
  name?: string;
20
22
  }
21
23
  type MessageContent = TextContent | ImageContent | FileContent;
22
- interface ChatMessage {
23
- role: "system" | "user" | "assistant";
24
- content: string | MessageContent[];
24
+ interface BaseMessage {
25
+ messageId: string;
26
+ role?: Role;
27
+ kind: string;
28
+ timestamp?: string;
29
+ }
30
+ interface TextMessage extends BaseMessage {
31
+ kind: "text-content" | "message";
32
+ content: string;
33
+ }
34
+ interface ErrorMessage extends BaseMessage {
35
+ kind: "error";
36
+ content: string;
37
+ }
38
+ interface ThoughtMessage extends BaseMessage {
39
+ kind: "thought";
40
+ thought: string;
41
+ }
42
+ interface ToolMessage extends BaseMessage {
43
+ kind: "tool";
44
+ toolName?: string;
45
+ toolStatus?: string;
46
+ toolDescription?: string;
47
+ response?: unknown;
48
+ }
49
+ interface UIRenderMessage extends BaseMessage {
50
+ kind: "ui-render";
51
+ spec: {
52
+ root: string;
53
+ elements: Record<string, {
54
+ type: string;
55
+ props?: Record<string, unknown>;
56
+ children?: string[];
57
+ }>;
58
+ };
59
+ }
60
+ type MessagesItem = TextMessage | ErrorMessage | ThoughtMessage | ToolMessage | UIRenderMessage | BaseMessage;
61
+ interface Conversation {
62
+ taskId: string;
63
+ status: "submitted" | "working" | "completed" | "error";
64
+ messages: MessagesItem[];
65
+ lastUpdated: string;
66
+ role?: Role;
67
+ historyId?: string;
68
+ system?: {
69
+ level: "newConversation";
70
+ content?: string;
71
+ };
25
72
  }
26
- interface ChatOptions {
27
- taskId?: string;
73
+ interface HistoryState {
74
+ next: string | null;
75
+ hasMore: boolean;
28
76
  }
77
+ interface UpdateMessageInput {
78
+ taskId: string;
79
+ messageId: string;
80
+ content?: string;
81
+ partial?: boolean;
82
+ status?: string;
83
+ response?: unknown;
84
+ metadata?: Record<string, unknown>;
85
+ }
86
+ interface ConversationControllerSnapshot {
87
+ starting: boolean;
88
+ isLoading: boolean;
89
+ isLoadingHistory: boolean;
90
+ historyState: HistoryState;
91
+ conversations: Conversation[];
92
+ }
93
+ interface ConversationStrings {
94
+ thinking: string;
95
+ errorMessage: string;
96
+ cancelled: string;
97
+ }
98
+ interface ConversationControllerOptions {
99
+ strings: ConversationStrings;
100
+ mode?: ContextIdMode;
101
+ getContextId?: () => string;
102
+ loadHistoryOnInit?: boolean;
103
+ resumeOnInit?: boolean;
104
+ }
105
+ interface ConversationController {
106
+ getSnapshot(): ConversationControllerSnapshot;
107
+ subscribe(listener: (snapshot: ConversationControllerSnapshot) => void): () => void;
108
+ init(): Promise<void>;
109
+ destroy(): void;
110
+ sendMessage(userContent: string): Promise<void>;
111
+ abort(): void;
112
+ cancelChat(taskId?: string): Promise<void>;
113
+ resetConversation(greeting?: string): void;
114
+ startNewConversation(): Promise<void>;
115
+ loadHistory(limit?: number, next?: string): Promise<void>;
116
+ loadMoreHistory(): Promise<void>;
117
+ getConversation(taskId: string): Conversation | undefined;
118
+ clearConversation(taskId: string): void;
119
+ removeMessage(taskId: string, messageId: string): void;
120
+ updateMessage(input: UpdateMessageInput): void;
121
+ }
122
+
29
123
  type CopilotClient = {
30
- /**
31
- * Stream messages from Copilot Agent.
32
- *
33
- * @example
34
- * ```typescript
35
- * import { createCopilotClient, Data } from "@amaster.ai/copilot-client";
36
- *
37
- * const client = createCopilotClient();
38
- *
39
- * for await (const response of client.chat([{ role: "user", content: "Hello" }])) {
40
- * // deal response
41
- * }
42
- * ```
43
- */
44
- chat(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;
45
- cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;
46
- getChatStatus(taskId?: string): Promise<{
47
- working: boolean;
48
- taskId?: string;
49
- error?: string;
50
- }>;
51
- getHistory(limit?: number, next?: string): Promise<{
52
- messages: SendStreamingMessageResponse[];
53
- next: string;
54
- hasMore: boolean;
55
- } | undefined>;
56
- newConversation(): Promise<void>;
124
+ createConversationController(options: ConversationControllerOptions): ConversationController;
57
125
  };
58
- /**
59
- * Create Copilot client
60
- *
61
- * Auto-detects runtime environment (Browser/Vite/Taro H5/Taro Mini-program)
62
- */
63
126
  declare function createCopilotClient(http?: HttpClient, baseUrl?: string, getAccessToken?: () => string | null, getUserUid?: () => string | null): CopilotClient;
64
127
 
65
- export { type ChatMessage, type ChatOptions, type CopilotClient, type FileContent, type ImageContent, type MessageContent, type TextContent, createCopilotClient };
128
+ export { type Conversation, type ConversationController, type ConversationControllerOptions, type ConversationControllerSnapshot, type ConversationStrings, type CopilotClient, type ErrorMessage, type FileContent, type HistoryState, type ImageContent, type MessageContent, type MessagesItem, type Role, type TextContent, type TextMessage, type ThoughtMessage, type ToolMessage, type UIRenderMessage, type UpdateMessageInput, createCopilotClient };
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- import {createHttpClient}from'@amaster.ai/http-client';import {createParser}from'eventsource-parser';import E from'miniprogram-text-decoder';var o=globalThis;function _(){return typeof o?.Taro?.request=="function"?o.Taro.request.bind(o.Taro):typeof o?.wx?.request=="function"?o.wx.request.bind(o.wx):typeof o?.tt?.request=="function"?o.tt.request.bind(o.tt):typeof o?.my?.request=="function"?o.my.request.bind(o.my):typeof o?.swan?.request=="function"?o.swan.request.bind(o.swan):typeof o?.qq?.request=="function"?o.qq.request.bind(o.qq):typeof o?.jd?.request=="function"?o.jd.request.bind(o.jd):null}function C(){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 d=(t.getRandomValues(new Uint8Array(1))[0]??0)%16;return (e==="x"?d:d&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{let u=Math.random()*16|0;return (e==="x"?u:u&3|8).toString(16)})}var R=class{constructor(){this.aborted=false;this.listeners=[];this.signal={aborted:false,addEventListener:(e,u)=>{this.listeners.push(u);}};}abort(){this.aborted||(this.aborted=true,this.signal.aborted=true,this.listeners.forEach(e=>e()));}};function j(){return typeof AbortController<"u"?new AbortController:new R}function I(t){let e=/^www\.([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(t);if(e?.[1])return e[1];let u=/^([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(t);return u?.[1]?u[1]:null}function $(){if(typeof window>"u")return null;try{let t=window.location.href,e=/\/app\/([\da-z-]+)(?:\/|$)/.exec(t);return e?.[1]?e[1]:I(window.location.hostname)}catch{return null}}var q=null,B=null;function v(t){let e=t?I(t):$();return e||(q||(q=C()),q)}async function H(t,e,u={},d){return new Promise(c=>{let r=new Uint8Array(0),S=new E("utf-8",{fatal:false}),f=false,g=false,x=[],a=null,i=()=>new Promise(n=>{x.length>0?n(x.shift()):f?n(null):a=n;}),s=n=>{n&&(x.push(n),a&&(a(x.shift()),a=null));},l=n=>{if(!(g||f||!n.data))try{let m=new Uint8Array(n.data),T=new Uint8Array(r.length+m.length);T.set(r),T.set(m,r.length),r=T;let h=0;for(;h<r.length;){let A=r.subarray(h),b=S.decode(A,{stream:!1});if(b.length===0)break;if(b.includes("\uFFFD")){let P=b.lastIndexOf("\uFFFD")===0?0:b.indexOf("\uFFFD");if(P<=0)break;let k=b.slice(0,P);k&&s(k);let M=new TextEncoder().encode(k);h+=M.length;break}else s(b),h+=A.length;}r=r.subarray(h);}catch(m){console.error("[mini stream] chunk process error:",m);}},y=n=>{n.header?.["content-type"]?.includes("text/event-stream")===false&&console.warn("Warning: server did not return event-stream");},p=o.wx.request.bind(o.wx),w;try{w=p({url:t,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...u},data:typeof e=="string"?e:JSON.stringify(e),responseType:"arraybuffer",enableChunked:!0,timeout:3e5,success:()=>{if(r.length>0){let n=S.decode(r,{stream:!0});s(n);}f=!0,a?.(null);},fail:()=>{g=!0,f=!0,a?.(null);}}),d&&(d.aborted?w.abort():d.addEventListener("abort",()=>{w.abort();})),w.onChunkReceived?.(l),w.onHeadersReceived?.(y),c({ok:!0,statusText:"OK",read:async()=>g?null:i()});}catch(n){console.error("miniReq error",n);}})}async function L(t,e,u,d){let c=u?.(),r=c?{Authorization:`Bearer ${c}`}:{};if(typeof o?.wx?.request=="function")return H(t,e,r,d);let S=_();if(S)return new Promise(i=>{let s="",l=false,y=false,p=0,w={url:t,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...r},data:typeof e=="string"?e:JSON.stringify(e),timeout:6e4,success:n=>{s=typeof n.data=="string"?n.data:JSON.stringify(n.data),l=true;},fail:n=>{console.error("[createStream] wx.request failed:",n),y=true,l=true;},complete:()=>{}};try{let n=S(w);n&&typeof n.then=="function"&&n.then(m=>{s=typeof m.data=="string"?m.data:JSON.stringify(m.data),l=!0;}).catch(()=>{y=!0,l=!0;});}catch(n){console.error("[createStream] Exception:",n),y=true,l=true;}i({ok:true,statusText:"OK",read:async()=>{for(;!l&&p>=s.length;)await new Promise(m=>setTimeout(m,50));if(y)return null;if(p>=s.length)return l?null:"";let n=s.slice(p);return p=s.length,n}});});let f={"Content-Type":"application/json",...r},g=await fetch(t,{method:"POST",headers:f,credentials:"include",body:JSON.stringify(e),signal:d});if(!g.body)return {ok:g.ok,statusText:g.statusText,read:async()=>null};let x=g.body.getReader(),a=new TextDecoder;return {ok:g.ok,statusText:g.statusText,read:async()=>{let{done:i,value:s}=await x.read();return i?null:a.decode(s,{stream:true})}}}function D(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 F(t){return typeof t=="string"?t:t.filter(e=>e.type==="text").map(e=>e.text).join(`
2
- `)}async function*J(t,e){let u=[],d=createParser({onEvent:c=>{try{u.push(JSON.parse(c.data));}catch(r){console.error("[parseSSEStream] Parse error:",r);}}});try{for(;!e?.aborted;){let c=await t.read();if(c===null)break;if(c)for(d.feed(c);u.length>0;){let r=u.shift();r&&(yield r);}}}catch(c){if(e?.aborted)return;console.error("[parseSSEStream] Stream error:",c);}}function N(t=createHttpClient(),e,u,d){let c="",r=null,S=import.meta?.env;if(S&&(c=S.TARO_APP_API_BASE_URL||S.VITE_API_BASE_URL||""),!c)try{c=process.env.TARO_APP_API_BASE_URL||process.env.VITE_API_BASE_URL||"";}catch{}c=String(c||"").trim();let f=`${e||c}/api/proxy/builtin/platform/copilot`;console.log("xxxxxx");async function*g(a,i){try{let s=await L(f,a,u,i);if(!s.ok)throw new Error(`Stream request failed: ${s.statusText}`);yield*J(s,i);}catch(s){if(i?.aborted)return;console.error("[sendMessageStream] Error:",s);}}let x=()=>{let a=v();if(typeof o?.wx?.request=="function"){let l=f?f.replace(/^https?:\/\//,"").split("/")[0]:"";a=v(l);}let i=d?.()??B??(B=`anonymous-${C()}`);return `${a}:${i}`};return {async*chat(a,i={}){let{taskId:s}=i;r=j();let l=r?.signal;try{let y=a.find(h=>h.role==="system"),p=a.filter(h=>h.role!=="system"),w=p[p.length-1],n=w?D(w.content):[{kind:"text",text:""}],m=y?F(y.content):void 0,T={jsonrpc:"2.0",id:C(),method:"message/stream",params:{message:{contextId:x(),kind:"message",messageId:C(),role:"user",parts:n,...s&&{taskId:s},...m&&{metadata:{systemPrompt:m}}}}};for await(let h of g(T,l)){if(l?.aborted)break;yield h;}}finally{r=null;}},cancelChat(a){r?.abort(),r=null;let i={jsonrpc:"2.0",id:C(),method:"tasks/cancel",params:{id:a}};return t.request({url:f,method:"POST",data:i})},async getHistory(a=50,i){try{let l=(await t.request({url:f,method:"POST",data:{jsonrpc:"2.0",method:"messages/list",id:C(),params:{filter:{contextId:x()},limit:a,...i?{next:i}:{}}}}))?.data?.result||{},y=l?.messages||[],p=l?.next||"";return {messages:y,next:p,hasMore:!!p}}catch{}},async newConversation(){try{await t.request({url:f,method:"POST",data:{jsonrpc:"2.0",method:"messages/clear",id:C(),params:{contextId:x()}}});}catch{}},async getChatStatus(a){try{let i={jsonrpc:"2.0",id:C(),method:"tasks/get",params:a?{id:a}:{contextId:x()}},l=(await t.request({url:f,method:"POST",data:i}))?.data?.result;return {working:l?.status?.state==="working",taskId:l?.id,error:l?.error?.message||""}}catch(i){return {working:false,error:i?.message||""}}}}}
3
- export{N as createCopilotClient};//# sourceMappingURL=index.js.map
1
+ import {createHttpClient}from'@amaster.ai/http-client';import {createParser}from'eventsource-parser';import Pe from'miniprogram-text-decoder';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 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 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("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)}}}export{He as createCopilotClient};//# sourceMappingURL=index.js.map
4
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/copilot-client.ts"],"names":["g","getMiniProgramRequest","generateUUID","cryptoObj","c","r","SimpleAbortController","_","cb","createAbortController","getAppIdFromHostname","hostname","wwwMatch","domainMatch","extractAppIdFromUrl","url","pathMatch","cachedAppId","cachedAnonymousUid","getAppId","urlAppId","createWeChatMiniProgramStream","data","authHeader","signal","resolve","chunkBuffer","textDecoder","MiniProgramTextDecoder","ended","errorOccurred","dataQueue","resolveRead","pendingRead","pushChunk","text","chunkListener","res","newChunk","merged","decodeOffset","remaining","decoded","lastGoodIndex","goodPart","encodedGood","err","headersListener","miniReq","requestTask","finalText","error","createStream","getAccessToken","token","buffer","completed","failed","position","opts","ret","chunk","headers","response","reader","decoder","done","value","convertToA2AParts","content","part","extractTextFromContent","parseSSEStream","streamResponse","queue","parser","createParser","event","item","createCopilotClient","http","createHttpClient","baseUrl","getUserUid","envBaseUrl","activeChatAbortController","metaEnv","sendMessageStream","request","getContextId","appId","userUid","messages","chatOptions","taskId","systemMsg","m","nonSystemMsgs","lastUserMsg","parts","systemPrompt","limit","next","result","_next"],"mappings":"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","file":"index.js","sourcesContent":["/* eslint-disable no-undef, no-unused-vars */\nimport type {\n CancelTaskRequest,\n CancelTaskResponse,\n Part,\n SendStreamingMessageRequest,\n SendStreamingMessageResponse,\n} from \"@a2a-js/sdk\";\nimport { type ClientResult, createHttpClient, type HttpClient } from \"@amaster.ai/http-client\";\nimport { createParser } from \"eventsource-parser\";\nimport MiniProgramTextDecoder from \"miniprogram-text-decoder\";\n// import MiniProgramTextEncoder from \"miniprogram-text-encoder\";\n\n// ============ Internal: Platform Detection (same as http-client) ============\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst g = globalThis as any;\n\nfunction getMiniProgramRequest(): ((_opts: any) => any) | null {\n if (typeof g?.Taro?.request === \"function\") return g.Taro.request.bind(g.Taro);\n if (typeof g?.wx?.request === \"function\") return g.wx.request.bind(g.wx);\n if (typeof g?.tt?.request === \"function\") return g.tt.request.bind(g.tt);\n if (typeof g?.my?.request === \"function\") return g.my.request.bind(g.my);\n if (typeof g?.swan?.request === \"function\") return g.swan.request.bind(g.swan);\n if (typeof g?.qq?.request === \"function\") return g.qq.request.bind(g.qq);\n if (typeof g?.jd?.request === \"function\") return g.jd.request.bind(g.jd);\n return null;\n}\n\n// ============ Internal: UUID Generator ============\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, (c) => {\n const randomValues = cryptoObj.getRandomValues(new Uint8Array(1));\n const r = (randomValues[0] ?? 0) % 16;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n// ============ AbortController Polyfill (Mini Program Safe) ============\nclass SimpleAbortController {\n aborted = false;\n private listeners: (() => void)[] = [];\n\n signal = {\n aborted: false,\n addEventListener: (_: \"abort\", cb: () => void) => {\n this.listeners.push(cb);\n },\n };\n\n abort() {\n if (this.aborted) return;\n this.aborted = true;\n this.signal.aborted = true;\n this.listeners.forEach((cb) => cb());\n }\n}\n\nfunction createAbortController(): AbortController | SimpleAbortController {\n if (typeof AbortController !== \"undefined\") {\n return new AbortController();\n }\n return new SimpleAbortController();\n}\n\n// ============ Internal: URL Utilities ============\n\nfunction getAppIdFromHostname(hostname: string): string | null {\n // Pattern 1: www.{app_id}.domain.tld or www.{app_id}-{env}.domain.tld\n const wwwMatch = /^www\\.([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (wwwMatch?.[1]) return wwwMatch[1];\n\n // Pattern 2: {app_id}-{env}.domain.tld or {app_id}.domain.tld\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\n// Cache appId for session consistency\nlet cachedAppId: string | null = null;\n\n// Cache anonymous user ID for session consistency\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\n// ============ Internal: Streaming ============\n\ninterface StreamResponse {\n ok: boolean;\n statusText: string;\n read(): Promise<string | null>;\n}\n\n// 小程序专用的流式请求\nasync function createWeChatMiniProgramStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string> = {},\n signal?: AbortSignal\n): Promise<StreamResponse> {\n return new Promise<StreamResponse>((resolve) => {\n let chunkBuffer = new Uint8Array(0);\n const textDecoder = new MiniProgramTextDecoder(\"utf-8\", { fatal: false });\n\n let ended = false;\n let errorOccurred = false;\n\n const dataQueue: string[] = [];\n let resolveRead: ((value: string | null) => void) | null = null;\n\n const pendingRead = () =>\n new Promise<string | null>((r) => {\n if (dataQueue.length > 0) {\n r(dataQueue.shift()!);\n } else if (ended) {\n r(null);\n } else {\n resolveRead = r;\n }\n });\n\n const pushChunk = (text: string) => {\n if (!text) return;\n dataQueue.push(text);\n if (resolveRead) {\n resolveRead(dataQueue.shift()!);\n resolveRead = null;\n }\n };\n\n const chunkListener = (res: any) => {\n if (errorOccurred || ended || !res.data) return;\n\n try {\n const newChunk = new Uint8Array(res.data as ArrayBuffer);\n\n // 追加\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\n while (decodeOffset < chunkBuffer.length) {\n // 尝试从当前偏移解码尽可能多的内容,但 stream: false\n const remaining = chunkBuffer.subarray(decodeOffset);\n const decoded = textDecoder.decode(remaining, { stream: false });\n\n if (decoded.length === 0) {\n // 连一个字符都解不出来,说明剩余部分不完整,等待下次 chunk\n break;\n }\n\n // 关键:计算真正被成功解码的字节数(不依赖 replacement character)\n // 方法1:利用 replacement character 出现的位置来推断(较可靠)\n // 方法2:更简单粗暴但在大多数场景够用:假设没有 � 就全消费,有 � 则回退\n if (decoded.includes(\"�\")) {\n // 有替换字符 → 说明后面有不完整序列,不能全消费\n // 保守策略:本次只消费到最后一个完整字符之前\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 pushChunk(goodPart);\n }\n\n // 估算已消费字节数(不完美,但比原来好很多)\n const encodedGood = new TextEncoder().encode(goodPart);\n decodeOffset += encodedGood.length;\n\n break; // 剩余部分等下次\n } else {\n // 没有 � → 说明本次 remaining 里全是完整字符,可以全部消费\n pushChunk(decoded);\n decodeOffset += remaining.length; // 安全,因为没出现替换字符\n }\n }\n\n // 保留剩余未解码部分\n chunkBuffer = chunkBuffer.subarray(decodeOffset);\n } catch (err) {\n console.error(\"[mini stream] chunk process error:\", err);\n }\n };\n\n const headersListener = (res: any) => {\n if (res.header?.[\"content-type\"]?.includes(\"text/event-stream\") === false) {\n console.warn(\"Warning: server did not return event-stream\");\n }\n };\n\n const miniReq = g.wx.request.bind(g.wx);\n\n let requestTask: any;\n\n try {\n 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: true,\n timeout: 300000,\n\n success: () => {\n if (chunkBuffer.length > 0) {\n const finalText = textDecoder.decode(chunkBuffer, { stream: true });\n pushChunk(finalText);\n }\n ended = true;\n resolveRead?.(null);\n },\n\n fail: () => {\n errorOccurred = true;\n ended = true;\n resolveRead?.(null);\n },\n });\n\n // 支持 abort\n if (signal) {\n if (signal.aborted) {\n requestTask.abort();\n } else {\n signal.addEventListener(\"abort\", () => {\n requestTask.abort();\n });\n }\n }\n\n // 关键:监听分块到达\n requestTask.onChunkReceived?.(chunkListener);\n // 可选:监听 HTTP headers 到达(可用于检查状态码)\n requestTask.onHeadersReceived?.(headersListener);\n\n resolve({\n ok: true,\n statusText: \"OK\",\n read: async () => {\n if (errorOccurred) return null;\n return pendingRead();\n },\n });\n } catch (error) {\n console.error(\"miniReq error\", error);\n }\n });\n}\n\nasync function createStream(\n url: string,\n data: unknown,\n getAccessToken?: () => string | null,\n signal?: AbortSignal\n): Promise<StreamResponse> {\n // Get token for authentication\n const token = getAccessToken?.();\n const authHeader: Record<string, string> = token ? { Authorization: `Bearer ${token}` } : {};\n\n if (typeof g?.wx?.request === \"function\") {\n return createWeChatMiniProgramStream(url, data, authHeader, signal);\n }\n const miniReq = getMiniProgramRequest();\n if (miniReq) {\n // Mini-program: buffer full response\n return new Promise((resolve) => {\n let buffer = \"\";\n let completed = false;\n let failed = false;\n let position = 0;\n\n const opts = {\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 timeout: 60000,\n success: (res: any) => {\n buffer = typeof res.data === \"string\" ? res.data : JSON.stringify(res.data);\n completed = true;\n },\n fail: (err: any) => {\n console.error(\"[createStream] wx.request failed:\", err);\n failed = true;\n completed = true;\n },\n complete: () => {},\n };\n\n try {\n const ret = miniReq(opts);\n\n if (ret && typeof ret.then === \"function\") {\n ret\n .then((res: any) => {\n buffer = typeof res.data === \"string\" ? res.data : JSON.stringify(res.data);\n completed = true;\n })\n .catch(() => {\n failed = true;\n completed = true;\n });\n }\n } catch (err) {\n console.error(\"[createStream] Exception:\", err);\n failed = true;\n completed = true;\n }\n\n resolve({\n ok: true,\n statusText: \"OK\",\n read: async () => {\n while (!completed && position >= buffer.length) {\n await new Promise((r) => setTimeout(r, 50));\n }\n if (failed) return null;\n if (position >= buffer.length) return completed ? null : \"\";\n const chunk = buffer.slice(position);\n position = buffer.length;\n return chunk;\n },\n });\n });\n }\n\n // Browser: use fetch streaming with authentication\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,\n });\n\n if (!response.body) {\n return {\n ok: response.ok,\n statusText: response.statusText,\n read: async () => null,\n };\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n\n return {\n ok: response.ok,\n statusText: response.statusText,\n read: async () => {\n const { done, value } = await reader.read();\n if (done) return null;\n return decoder.decode(value, { stream: true });\n },\n };\n}\n\n// ============ Input Types ============\n\nexport interface TextContent {\n type: \"text\";\n text: string;\n}\n\nexport interface ImageContent {\n type: \"image\";\n data?: string;\n url?: string;\n mimeType?: string;\n}\n\nexport interface FileContent {\n type: \"file\";\n data?: string;\n url?: string;\n mimeType?: string;\n name?: string;\n}\n\nexport type MessageContent = TextContent | ImageContent | FileContent;\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string | MessageContent[];\n}\n\nexport interface ChatOptions {\n taskId?: string;\n}\n\n// ============ Convert Input to A2A Part ============\n\nfunction 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\nfunction 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\n// ============ SSE Stream Handling ============\n\nasync function* parseSSEStream(\n streamResponse: StreamResponse,\n signal?: AbortSignal\n): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n const queue: SendStreamingMessageResponse[] = [];\n\n const parser = createParser({\n onEvent: (event) => {\n try {\n queue.push(JSON.parse(event.data));\n } catch (err) {\n console.error(\"[parseSSEStream] Parse error:\", err);\n }\n },\n });\n\n try {\n while (true) {\n if (signal?.aborted) {\n break;\n }\n const chunk = await streamResponse.read();\n if (chunk === null) {\n break;\n }\n if (chunk) {\n parser.feed(chunk);\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n yield item;\n }\n }\n }\n }\n } catch (err) {\n if (signal?.aborted) {\n return;\n }\n console.error(\"[parseSSEStream] Stream error:\", err);\n }\n}\n\n// ============ Client ============\n\nexport type CopilotClient = {\n /**\n * Stream messages from Copilot Agent.\n *\n * @example\n * ```typescript\n * import { createCopilotClient, Data } from \"@amaster.ai/copilot-client\";\n *\n * const client = createCopilotClient();\n *\n * for await (const response of client.chat([{ role: \"user\", content: \"Hello\" }])) {\n * // deal response\n * }\n * ```\n */\n chat(\n messages: ChatMessage[],\n options?: ChatOptions\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown>;\n\n cancelChat(taskId: string): Promise<ClientResult<CancelTaskResponse>>;\n getChatStatus(taskId?: string): Promise<{\n working: boolean;\n taskId?: string;\n error?: string;\n }>;\n getHistory(\n limit?: number,\n next?: string\n ): Promise<\n | {\n messages: SendStreamingMessageResponse[];\n next: string;\n hasMore: boolean;\n }\n | undefined\n >;\n newConversation(): Promise<void>;\n};\n\n/**\n * Create Copilot client\n *\n * Auto-detects runtime environment (Browser/Vite/Taro H5/Taro Mini-program)\n */\nexport function createCopilotClient(\n http: HttpClient = createHttpClient(),\n baseUrl?: string,\n getAccessToken?: () => string | null,\n getUserUid?: () => string | null\n): CopilotClient {\n let envBaseUrl = \"\";\n let activeChatAbortController: AbortController | null = null;\n\n // Vite/H5:必须直接写 import.meta.env,Vite 才能正确处理\n const metaEnv = (import.meta as any)?.env;\n if (metaEnv) {\n envBaseUrl = metaEnv.TARO_APP_API_BASE_URL || metaEnv.VITE_API_BASE_URL || \"\";\n }\n\n // Taro 小程序 build:defineConstants 会把 process.env.xxx 替换为字面量\n // H5 环境:process 不存在会抛 ReferenceError,这里用 try/catch 吞掉\n if (!envBaseUrl) {\n try {\n envBaseUrl = process.env.TARO_APP_API_BASE_URL || process.env.VITE_API_BASE_URL || \"\";\n } catch {\n // process is not defined -> ignore\n }\n }\n\n envBaseUrl = String(envBaseUrl || \"\").trim();\n const url = `${baseUrl || envBaseUrl}/api/proxy/builtin/platform/copilot`;\n\n console.log(\"xxxxxx\");\n\n async function* sendMessageStream(\n request: SendStreamingMessageRequest,\n signal?: AbortSignal\n ): AsyncGenerator<SendStreamingMessageResponse, void, unknown> {\n try {\n const streamResponse = await createStream(url, request, getAccessToken, signal);\n\n if (!streamResponse.ok) {\n throw new Error(`Stream request failed: ${streamResponse.statusText}`);\n }\n\n yield* parseSSEStream(streamResponse, signal);\n } catch (err) {\n if (signal?.aborted) {\n return;\n }\n console.error(\"[sendMessageStream] Error:\", err);\n }\n }\n\n const getContextId = () => {\n let appId = getAppId();\n\n if (typeof g?.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 contextId = `${appId}:${userUid}`;\n return contextId;\n };\n\n return {\n async *chat(messages, chatOptions = {}) {\n const { taskId } = chatOptions;\n\n activeChatAbortController = createAbortController() as any;\n const signal = activeChatAbortController?.signal;\n\n try {\n const systemMsg = messages.find((m) => m.role === \"system\");\n const nonSystemMsgs = messages.filter((m) => m.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: getContextId(),\n kind: \"message\",\n messageId: generateUUID(),\n role: \"user\",\n parts,\n ...(taskId && { taskId }),\n ...(systemPrompt && { metadata: { systemPrompt } }),\n },\n },\n };\n\n for await (const response of sendMessageStream(request, signal)) {\n if (signal?.aborted) {\n break;\n }\n yield response;\n }\n } finally {\n activeChatAbortController = null;\n }\n },\n\n cancelChat(taskId) {\n activeChatAbortController?.abort();\n activeChatAbortController = null;\n\n const request: CancelTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/cancel\",\n params: { id: taskId },\n };\n return http.request<CancelTaskResponse>({\n url,\n method: \"POST\",\n data: request,\n });\n },\n\n async getHistory(limit = 50, next?: string) {\n try {\n const res: any = await http.request({\n url,\n method: \"POST\",\n data: {\n jsonrpc: \"2.0\",\n method: \"messages/list\",\n id: generateUUID(),\n params: { filter: { contextId: getContextId() }, limit, ...(next ? { next } : {}) },\n },\n });\n const result = res?.data?.result || {};\n const messages = result?.messages || [];\n const _next = result?.next || \"\";\n\n return {\n messages,\n next: _next,\n hasMore: !!_next,\n };\n } catch (err) {}\n },\n\n async newConversation() {\n try {\n await http.request({\n url,\n method: \"POST\",\n data: {\n jsonrpc: \"2.0\",\n method: \"messages/clear\",\n id: generateUUID(),\n params: { contextId: getContextId() },\n },\n });\n } catch (err) {}\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\n ? { id: taskId }\n : {\n contextId: getContextId(),\n },\n };\n const result = await http.request<any>({\n url,\n method: \"POST\",\n data: request,\n });\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 (err) {\n return {\n working: false,\n error: (err as any)?.message || \"\",\n };\n }\n },\n };\n}\n"]}
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.js","sourcesContent":["import type {\n Conversation,\n ConversationControllerSnapshot,\n HistoryState,\n MessagesItem,\n} from \"../types\";\n\nexport type InternalState = {\n byId: Record<string, Conversation>;\n order: string[];\n starting: boolean;\n isLoading: boolean;\n isLoadingHistory: boolean;\n historyState: HistoryState;\n};\n\nexport class SimpleAbortController {\n aborted = false;\n private listeners: Array<() => void> = [];\n\n signal = {\n aborted: false,\n addEventListener: (_event: \"abort\", listener: () => void) => {\n this.listeners.push(listener);\n },\n };\n\n abort() {\n if (this.aborted) return;\n this.aborted = true;\n this.signal.aborted = true;\n this.listeners.forEach((listener) => listener());\n }\n}\n\nexport function createAbortController(): AbortController | SimpleAbortController {\n if (typeof AbortController !== \"undefined\") {\n return new AbortController();\n }\n return new SimpleAbortController();\n}\n\nexport function nowIso() {\n return new Date().toISOString();\n}\n\nexport function generateId() {\n return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function cloneMessage<T extends MessagesItem>(message: T): T {\n return { ...message } as T;\n}\n\nexport function cloneConversation(conversation: Conversation): Conversation {\n return {\n ...conversation,\n system: conversation.system ? { ...conversation.system } : undefined,\n messages: conversation.messages.map((message) => cloneMessage(message)),\n };\n}\n\nexport function createSnapshot(state: InternalState): ConversationControllerSnapshot {\n return {\n starting: state.starting,\n isLoading: state.isLoading,\n isLoadingHistory: state.isLoadingHistory,\n historyState: { ...state.historyState },\n conversations: state.order\n .map((id) => state.byId[id])\n .filter((conversation): conversation is Conversation => Boolean(conversation))\n .map((conversation) => cloneConversation(conversation)),\n };\n}\n","import type { Conversation, ErrorMessage, MessagesItem, Role, TextMessage, ThoughtMessage, ToolMessage, UIRenderMessage } from \"../types\";\nimport { nowIso } from \"./utils\";\n\nexport type MessageHandler = (\n conv: Conversation,\n part: any,\n id: string,\n role: Role,\n status?: any\n) => Conversation;\n\nexport const handlers: Record<string, MessageHandler> = {\n \"text-content\": (conv, part, id, role, status) => {\n if (!id) return conv;\n const existing = conv.messages.find((message) => message.messageId === id);\n const newText = part.text || \"\";\n\n if (existing && \"content\" in existing) {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id\n ? ({ ...message, content: (message as TextMessage).content + newText } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"text-content\",\n content: newText,\n timestamp: status?.timestamp || nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n thought: (conv, part, id, role, status) => {\n if (!id) return conv;\n const newChunk = part?.data?.description || \"\";\n const existing = conv.messages.find((message) => message.messageId === id);\n\n if (existing && \"thought\" in existing) {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id\n ? ({ ...message, thought: (message as ThoughtMessage).thought + newChunk } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"thought\",\n thought: newChunk,\n timestamp: status?.timestamp || nowIso(),\n } as ThoughtMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n tool: (conv, part, _id, role, status) => {\n const partData = part?.data || {};\n const tool = partData?.tool;\n const name = tool?.displayName || tool?.name || \"\";\n const request = partData?.request;\n const id = request?.callId;\n if (!id || !name) return conv;\n\n const toolStatus = partData?.status;\n const existing = conv.messages.find((message) => message.messageId === id);\n\n if (existing && \"toolStatus\" in existing) {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id\n ? ({\n ...message,\n toolStatus: toolStatus || (message as ToolMessage).toolStatus,\n } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"tool\",\n toolName: name,\n toolDescription: request?.args?.query || \"\",\n toolStatus: toolStatus || \"pending\",\n timestamp: status?.timestamp || nowIso(),\n } as ToolMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n error: (conv, part, id, role) => {\n const errorMsg = part?.text || part?.data?.error || \"发生错误\";\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id || `error-${Date.now()}`,\n role,\n kind: \"error\",\n content: errorMsg,\n timestamp: nowIso(),\n } as ErrorMessage,\n ],\n status: \"error\",\n lastUpdated: nowIso(),\n };\n },\n\n \"ui-render\": (conv, part, id, role, status) => {\n if (!id) return conv;\n const existing = conv.messages.find((message) => message.messageId === id);\n const partData = part?.data || {};\n const spec = partData.spec || { root: \"\", elements: {} };\n\n if (existing && existing.kind === \"ui-render\") {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id ? ({ ...(message as UIRenderMessage), spec } as MessagesItem) : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"ui-render\",\n spec,\n timestamp: status?.timestamp || nowIso(),\n } as UIRenderMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n};\n\nexport function getKind(part: any, metadata?: any) {\n if (part?.data?.tool) return \"tool\";\n if (part?.data?.type === \"ui\") return \"ui-render\";\n if (part?.kind === \"text\") return \"text-content\";\n if (part?.data?.type === \"though\" || metadata?.coderAgent?.kind === \"thought\") return \"thought\";\n if (metadata?.error) return \"error\";\n return \"unknown\";\n}\n","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amaster.ai/copilot-client",
3
- "version": "1.1.0-beta.70",
3
+ "version": "1.1.0-beta.72",
4
4
  "description": "AI copilot chat client with streaming support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -34,7 +34,7 @@
34
34
  "eventsource-parser": "^3.0.6",
35
35
  "miniprogram-text-decoder": "^2.0.0",
36
36
  "miniprogram-text-encoder": "^2.0.0",
37
- "@amaster.ai/http-client": "1.1.0-beta.70"
37
+ "@amaster.ai/http-client": "1.1.0-beta.72"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "@a2a-js/sdk": "^0.3.7"