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