@amaster.ai/copilot-client 1.1.17 → 1.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {getMiniProgramRequest,resolveMiniProgramGlobals}from'@amaster.ai/http-client';import {createParser}from'eventsource-parser';import et from'miniprogram-text-decoder';var Se=class{constructor(){this.aborted=false;this.listeners=[];this.signal={aborted:false,addEventListener:(t,n)=>{this.listeners.push(n);}};}abort(){this.aborted||(this.aborted=true,this.signal.aborted=true,this.listeners.forEach(t=>t()));}};function we(){return typeof AbortController<"u"?new AbortController:new Se}function C(){return new Date().toISOString()}function Y(){return `msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function We(e){return {...e}}function Me(e){return {...e,system:e.system?{...e.system}:void 0,runtimeError:e.runtimeError?{...e.runtimeError}:void 0,messages:e.messages.map(t=>We(t))}}function be(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=>Me(t))}}function oe(e,t){for(let n=e.messages.length-1;n>=0;n-=1){let o=e.messages[n];if(o&&t(o))return n}return -1}function Ke(e){return e.kind==="text-content"||e.kind==="message"}function Ge(e){let t=e?.file;return t?{name:t.name||"\u672A\u547D\u540D\u6587\u4EF6",mimeType:t.mimeType,url:t.uri,size:typeof e?.metadata?.size=="number"?e.metadata.size:typeof t?.size=="number"?t.size:void 0}:null}var de={"text-content":(e,t,n,o,l)=>{if(!n)return e;let a=oe(e,s=>s.messageId===n&&Ke(s)),d=t.text||"";if(a>=0){let s=e.messages[a];return {...e,messages:e.messages.map(u=>u===e.messages[a]?{...u,content:s.content+d}:u),lastUpdated:C()}}return {...e,messages:[...e.messages,{messageId:n,role:o,kind:"text-content",content:d,timestamp:l?.timestamp||C()}],lastUpdated:C()}},"file-content":(e,t,n,o,l)=>{if(!n)return e;let a=Ge(t);return !a||oe(e,s=>s.messageId===n&&s.kind==="file-content")>=0?e:{...e,messages:[...e.messages,{messageId:n,role:o,kind:"file-content",files:[a],timestamp:l?.timestamp||C()}],lastUpdated:C()}},thought:(e,t,n,o,l)=>{if(!n)return e;let a=t?.data?.description||"",d=oe(e,s=>s.messageId===n&&s.kind==="thought");if(d>=0){let s=e.messages[d];return {...e,messages:e.messages.map(u=>u===e.messages[d]?{...u,thought:s.thought+a}:u),lastUpdated:C()}}return {...e,messages:[...e.messages,{messageId:n,role:o,kind:"thought",thought:a,timestamp:l?.timestamp||C()}],lastUpdated:C()}},tool:(e,t,n,o,l)=>{let a=t?.data||{},d=a?.tool,s=d?.displayName||d?.name||"",u=a?.request,h=u?.callId;if(!h||!s)return e;let y=a?.status,x=oe(e,b=>b.messageId===h&&b.kind==="tool");if(x>=0){let b=e.messages[x];return {...e,messages:e.messages.map(v=>v===e.messages[x]?{...v,toolStatus:y||b.toolStatus}:v),lastUpdated:C()}}return {...e,messages:[...e.messages,{messageId:h,role:o,kind:"tool",toolName:s,toolDescription:u?.args?.query||"",toolStatus:y||"pending",timestamp:l?.timestamp||C()}],lastUpdated:C()}},error:(e,t,n,o)=>{let l=t?.text||t?.data?.error||"\u53D1\u751F\u9519\u8BEF";return {...e,messages:[...e.messages,{messageId:n||`error-${Date.now()}`,role:o,kind:"error",content:l,timestamp:C()}],status:"error",lastUpdated:C()}},"ui-render":(e,t,n,o,l)=>{if(!n)return e;let a=oe(e,u=>u.messageId===n&&u.kind==="ui-render"),s=(t?.data||{}).spec||{root:"",elements:{}};return a>=0?{...e,messages:e.messages.map(u=>u===e.messages[a]?{...u,spec:s}:u),lastUpdated:C()}:{...e,messages:[...e.messages,{messageId:n,role:o,kind:"ui-render",spec:s,timestamp:l?.timestamp||C()}],lastUpdated:C()}}};function ve(e,t){return e?.data?.tool?"tool":e?.data?.type==="ui"?"ui-render":e?.kind==="text"?"text-content":e?.kind==="file"?"file-content":e?.data?.type==="though"||t?.coderAgent?.kind==="thought"?"thought":t?.error?"error":"unknown"}function Je(e,t){if(typeof e=="string"){let n=e.trim().toUpperCase();if(n==="TT"||n==="DOUYIN"||n==="WEAPP"||n==="WECHAT")return true}return t?typeof t.TT<"u"&&e===t.TT||typeof t.WEAPP<"u"&&e===t.WEAPP:false}function ge(){let e=resolveMiniProgramGlobals();return Je(e?.Taro?.getEnv?.(),e?.Taro?.ENV_TYPE)?true:typeof e?.wx?.request=="function"||typeof e?.tt?.request=="function"||typeof e?.my?.request=="function"||typeof e?.swan?.request=="function"||typeof e?.qq?.request=="function"||typeof e?.jd?.request=="function"}function Ae(){let e=resolveMiniProgramGlobals();return !(typeof e?.tt?.request=="function"||typeof e?.tt?.createEventSource=="function")}function Ee(){return typeof resolveMiniProgramGlobals()?.tt?.createEventSource=="function"}function Fe(e,t){let o=(t.mode||"conversation")==="single-turn",l=!o,a=!o,d=()=>t.getContextId?.()??e.createContextId(o?"single-turn":"conversation"),s={byId:{},order:[],starting:true,isLoading:false,isLoadingHistory:false,historyState:{next:null,hasMore:false}},u=new Set,h=null,x=null,b="unknown",v="",L=null,k=false,$=d(),O=e.createScopedRuntime($),S=null,m=()=>{if(k)return;let r=be(s);u.forEach(i=>i(r));},V=r=>{s.order=s.order.filter(i=>i!==r);},w=(r,i=true)=>{V(r),s.order=i?[...s.order,r]:[r,...s.order];},T=()=>{b="unknown",v="";},B=(r,i)=>{let c=r?.file||{};return [c.uri,c.name,c.mimeType,r?.metadata?.size,c.size].filter(Boolean).join("::")||`part-${i??0}`},_=({messageId:r,kind:i,part:c,partIndex:p})=>r?i==="file-content"?`${r}::file::${B(c,p)}`:i==="text-content"?`${r}::text`:`${r}::${i}`:"",z=r=>{let i=r&&typeof r=="object"?r:{},c=String(i.message||i.errMsg||"").toLowerCase(),p=String(i.errorCode||""),A=String(i.errNo||"");return i.name==="TypeError"||/failed to fetch|fetch failed|timed out|disconnected|offline|断网/.test(c)||["600009","21101","21102","21103"].includes(p)||["600009","21101","21102","21103"].includes(A)},Q=(r,i="stream")=>{let c=r&&typeof r=="object"?r:{},p=String(c.message||c.errMsg||"").toLowerCase();return {code:z(r)?"network":"unknown",message:p,retryable:true,source:i,timestamp:C()}},N=(r,i)=>{if(!r)return;let c=s.byId[r];c&&(s.byId[r]={...c,requestState:i.requestState??c.requestState,runtimeError:i.runtimeError===void 0?c.runtimeError:i.runtimeError,status:i.status??c.status,lastUpdated:C()});},X=r=>{N(r,{requestState:"idle",runtimeError:null});},Z=()=>{s.byId={},s.order=[],s.historyState={next:null,hasMore:false};},W=r=>{s.isLoading=r,!r&&g();},ae=()=>($=d(),O=e.createScopedRuntime($),$),ee=()=>{h?.abort(),h=null,X(S),W(false),m();},re=()=>{T(),X(S),S&&N(S,{status:"completed"}),S=null,x=null,h=null,W(false),m();},te=r=>{s.byId[r.taskId]=r,w(r.taskId,true),m();},ie=r=>{s.byId[r]&&(delete s.byId[r],V(r),m());},se=()=>{te({taskId:"loading-placeholder",status:"working",messages:[{messageId:"loading-placeholder",role:"assistant",kind:"text-content",content:t.strings.thinking,timestamp:C()}],lastUpdated:C()});},g=()=>{ie("loading-placeholder");},M=({kind:r,taskId:i,part:c,status:p,handler:A,isHistory:f,historyId:I,messageId:E,partIndex:F})=>{let P=E?_({messageId:E,kind:r,part:c,partIndex:F}):v,U=p?.message?.role==="agent"?"assistant":"user";!E&&(r==="ui-render"||r==="file-content"||r!=="unknown"&&r!==b)&&(b=r,P=Y(),v=P);let R=s.byId[i]??{taskId:i,status:f?"completed":"submitted",messages:[],role:U,historyId:I,lastUpdated:C()},G=A(R,c,P,U,p);s.byId[i]={...G,status:p?.state||R.status,lastUpdated:C()},f||w(i,true),m();},H=(r,i="stream",c=S)=>{N(c,{requestState:"error",runtimeError:Q(r,i),status:"error"}),c&&S===c&&(S=null),W(false),m();},q=r=>{if(!r?.result)return;let i=r.result,{taskId:c,status:p,metadata:A,final:f}=i;if(f){re();return}if(!c)return;x=c;let I=p?.message?.parts||[],E=false;I.forEach((F,P)=>{let U=ve(F,A),R=de[U];R&&(U!=="unknown"&&(E=true),M({kind:U,taskId:c,part:F,status:p,handler:R,partIndex:P}));}),E&&g();},K=(r,i)=>{let{messageId:c,historyId:p}=r||{};if(!c)return;(r.parts||[]).forEach((f,I)=>{let E=ve(f);if(E==="text-content"){let P=f.text||"";if(P=P.trim(),P.startsWith("<ui>")){let U=P.slice(4).trim();try{let R=JSON.parse(U);R.root&&R.elements&&M({kind:"ui-render",taskId:i,part:{kind:"data",data:{type:"ui",spec:R}},handler:de["ui-render"],isHistory:!0,historyId:p,messageId:c,status:{message:r},partIndex:I});}catch{}return}}let F=de[E];F&&M({kind:E,taskId:i,part:f,handler:F,isHistory:true,historyId:p,messageId:c,status:{message:r},partIndex:I});});},le=(r,i)=>{let c=r.trim();return i?.length?[...c?[{type:"text",text:c}]:[],...i]:c},ue=r=>{if(r?.length)return r.map(i=>({name:i.name||"\u672A\u547D\u540D\u6587\u4EF6",size:i.size,mimeType:i.mimeType,url:i.url}))},ye=(r,i)=>{let c=[],p=r.trim(),A=ue(i)||[];return p&&c.push({messageId:Y(),role:"user",kind:"text-content",content:p,timestamp:C()}),A.length&&c.push({messageId:Y(),role:"user",kind:"file-content",files:A.map((f,I)=>({...f,id:f.id||`local-file-${I}`})),timestamp:C()}),c},ce=async(r,i,c=false,p=0,A=false,f=S)=>{S=f,ee(),T(),N(f,{requestState:"submitting",runtimeError:null,status:"submitted"});let I=we();h=I,c&&(se(),W(true),m());let E=false,F=false,P=false,U=false,R=i?.taskId||null,G=O.sendMessage(r,{taskId:i?.taskId,signal:I.signal,preferMiniProgramRequest:A,onMessage:J=>{let he=J?.result?.taskId,D=!!J?.result?.final;he&&(R=he),D&&(U=true),E=true,N(f,{requestState:D?"idle":"streaming",runtimeError:null,status:D?"completed":"working"}),q(J);},onClose:()=>{}});let xe=async()=>{if(Ee()&&!!getMiniProgramRequest()&&!P&&!U&&p<2){console.log("[recovering]"),N(f,{requestState:"recovering",runtimeError:null,status:"working"}),m();try{let D=await O.getChatStatus(R||void 0);if(D.working&&D.taskId)return x=D.taskId,await ce([],{taskId:D.taskId},!0,p+1,!0,f),!0;if(!E&&!R&&!D.taskId&&p<1)return await ce(r,i,!0,p+1,!0,f),!0}catch(D){return console.error("[ConversationController] recovery failed:",D),H(D,"recovery",f),true}}return false},Ce,Te=false;try{await G;}catch(J){J?.name==="AbortError"||I.signal.aborted?P=true:(F=true,Ce=J,console.error("[ConversationController] Stream error:",J));}finally{h===I&&(h=null),Te=await xe();}Te||(F?H(Ce,"stream",f):!E&&c&&!P?H(Ce,"send",f):P?(X(f),f&&S===f&&(S=null),W(false),m()):U&&s.isLoading?re():!U&&s.isLoading&&H(void 0,"stream",f));};return {getSnapshot(){return be(s)},subscribe(r){return u.add(r),()=>{u.delete(r);}},async init(){if(!k)return L||(s.starting=true,m(),L=(async()=>{try{if(l&&await this.loadHistory(),a){let r=await O.getChatStatus();r.taskId&&r.working&&(x=r.taskId,await ce([],{taskId:r.taskId},!1));}}catch(r){console.error("[ConversationController] init failed:",r);}finally{s.starting=false,m(),L=null;}})(),L)},destroy(){k=true,ee(),u.clear();},async sendMessage(r,i){let c=i?.files?.filter(I=>I.data||I.url)||[],p=!!r.trim(),A=c.length>0;if(s.isLoading||!p&&!A)return;o&&(this.abort(),Z(),T(),x=null,ae());let f=Y();S=f,te({taskId:f,status:"submitted",requestState:"submitting",runtimeError:null,messages:ye(r,c),lastUpdated:C()});try{await ce([{role:"user",content:le(r,c)}],void 0,!0,0,!1,f);}catch(I){if(I.name==="AbortError")return;H(I,"send",f);}},abort(){let r=h?.signal.aborted;ee(),T(),X(S),S=null,x=null,g(),r||Promise.resolve();},async cancelChat(r){let i=r||x;if(this.abort(),te({taskId:Y(),status:"error",messages:[{messageId:`cancel-${Date.now()}`,role:"assistant",kind:"text-content",content:t.strings.cancelled,timestamp:C()}],lastUpdated:C()}),!!i)try{await O.cancelChat(i),x=null;}catch(c){console.error("[ConversationController] cancel failed:",c);}},resetConversation(r){if(this.abort(),Z(),S=null,x=null,T(),o&&ae(),r){let i=`conv-${Date.now()}`;s.byId[i]={taskId:i,status:"submitted",messages:[{messageId:`greeting-${Date.now()}`,role:"assistant",kind:"text-content",content:r,timestamp:C()}],lastUpdated:C()},s.order=[i];}m();},async startNewConversation(){te({taskId:Y(),status:"submitted",messages:[],lastUpdated:C(),system:{level:"newConversation"}});try{await O.newConversation();}catch(r){console.error("[ConversationController] newConversation failed:",r);}},async loadHistory(r=20,i){s.isLoadingHistory=true,m();try{let c=await O.getHistory(r,i),p=c?.messages||[],A="",f="",I=[];p.forEach(E=>{let F=E.role==="agent"?"assistant":"user";F!==f&&(A=`history-conv-${Y()}`,I.push(A),f=F),K(E,A);}),s.order=[...I,...s.order.filter(E=>!I.includes(E))],s.historyState={next:c?.next||null,hasMore:c?.hasMore||!1};}catch(c){console.error("[ConversationController] loadHistory failed:",c);}finally{s.isLoadingHistory=false,m();}},async loadMoreHistory(){!s.historyState.hasMore||s.isLoadingHistory||!s.historyState.next||await this.loadHistory(20,s.historyState.next);},getConversation(r){let i=s.byId[r];return i?Me(i):void 0},clearConversation(r){ie(r);},removeMessage(r,i){let c=s.byId[r];c&&(s.byId[r]={...c,messages:c.messages.filter(p=>p.messageId!==i),lastUpdated:C()},w(r,true),m());},updateMessage(r){let{taskId:i,messageId:c,content:p,partial:A=false,status:f,response:I,metadata:E={}}=r,F=s.byId[i];if(!F)return;let P=F.messages.findIndex(xe=>xe.messageId===c);if(P===-1)return;let U=F.messages[P];if(!U)return;let R={...U,...E};p!==void 0&&("content"in R?R.content=A?`${R.content||""}${p}`:p:"thought"in R?R.thought=A?`${R.thought||""}${p}`:p:U.kind==="text-content"&&(R.content=A?`${U.content||""}${p}`:p)),("toolStatus"in R||f)&&(R.toolStatus=f||R.toolStatus),I!==void 0&&(R.response=I);let G=[...F.messages];G[P]=R,s.byId[i]={...F,messages:G,lastUpdated:C()},w(i,true),m();}}}function j(){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 n=Math.random()*16|0;return (t==="x"?n:n&3|8).toString(16)})}function Le(e){let t=/^www\.([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(e);if(t?.[1])return t[1];let n=/^([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(e);return n?.[1]?n[1]:null}function Ye(){if(typeof window>"u")return null;try{let e=window.location.href,t=/\/app\/([\da-z-]+)(?:\/|$)/.exec(e);return t?.[1]?t[1]:Le(window.location.hostname)}catch{return null}}var Re=null,Qe=null;function Pe(e){let t=e?Le(e):Ye();return t||(Re||(Re=j()),Re)}function Ue(e,t){return (n="conversation")=>{let o=ge(),l=Pe();if(o){let s=e?e.replace(/^https?:\/\//,"").split("/")[0]:"";l=Pe(s);}let a=t?.()??Qe??(Qe=`anonymous-${j()}`),d=`${l}:${a}`;return n==="single-turn"?`${d}:${j()}`:d}}function Xe(e){let t={...e.size!==void 0?{size:e.size}:{}};return e.data?{kind:"file",file:{bytes:e.data,...e.mimeType&&{mimeType:e.mimeType},...e.name&&{name:e.name}},...Object.keys(t).length>0?{metadata:t}:{}}:e.url?{kind:"file",file:{uri:e.url,...e.mimeType&&{mimeType:e.mimeType},...e.name&&{name:e.name}},...Object.keys(t).length>0?{metadata:t}:{}}:null}function Ve(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 Xe(t);default:return null}}).filter(t=>t!==null)}function He(e){return typeof e=="string"?e:e.filter(t=>t.type==="text").map(t=>t.text).join(`
|
|
2
|
-
`)}function Oe(e){return {createContextId(t){return e.createContextId(t)},createScopedRuntime(t){return e.createRuntime(t)}}}function qe({createContextId:e,postRpc:t,sendMessageStream:n}){return Oe({createContextId:e,createRuntime(o){return {async sendMessage(l,a){let{taskId:d,signal:s,onOpen:u,onMessage:h,onClose:y,preferMiniProgramRequest:x}=a,b=l.find(S=>S.role==="system"),v=l.filter(S=>S.role!=="system"),L=v[v.length-1],k=L?Ve(L.content):[{kind:"text",text:""}],$=b?He(b.content):void 0,O={jsonrpc:"2.0",id:j(),method:"message/stream",params:{message:{contextId:o,kind:"message",messageId:j(),role:"user",parts:k,...d?{taskId:d}:{},...$?{metadata:{systemPrompt:$}}:{}}}};await n(O,{onOpen:u,onMessage:h,onClose:y},s,x);},cancelChat(l){let a={jsonrpc:"2.0",id:j(),method:"tasks/cancel",params:{id:l}};return t(a)},async getHistory(l=50,a){try{let s=(await t({jsonrpc:"2.0",method:"messages/list",id:j(),params:{filter:{contextId:o},limit:l,...a?{next:a}:{}}}))?.data?.result||{},u=s?.messages||[],h=s?.next||"";return {messages:u,next:h,hasMore:!!h}}catch{return}},async newConversation(){try{await t({jsonrpc:"2.0",method:"messages/clear",id:j(),params:{contextId:o}});}catch{}},async getChatStatus(l){try{let a={jsonrpc:"2.0",id:j(),method:"tasks/get",params:l?{id:l}:{contextId:o}},s=(await t(a))?.data?.result;return {working:s?.status?.state==="working",taskId:s?.id,error:s?.error?.message||""}}catch(a){return {working:false,error:a?.message||""}}}}}})}function $e(e){if(e instanceof Error)return e;if(e&&typeof e=="object"){let t=e,n=typeof t.errMsg=="string"&&t.errMsg||typeof t.message=="string"&&t.message||JSON.stringify(t),o=new Error(n);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 me(){if(typeof DOMException<"u")return new DOMException("Aborted","AbortError");let e=new Error("Aborted");return e.name="AbortError",e}function pe(e){return createParser({onEvent:t=>{try{e.onMessage(JSON.parse(t.data));}catch(n){console.error("[copilot stream] failed to parse SSE event:",n,t.data);}}})}function ze(e,t){if(e){if(e.aborted){t();return}e.addEventListener("abort",t);}}async function De(e,t,n,o,l){let a={"Content-Type":"application/json",...n},d=await fetch(e,{method:"POST",headers:a,credentials:"include",body:JSON.stringify(t),signal:l});if(!d.ok)throw new Error(`Stream request failed: ${d.statusText||d.status}`);if(o.onOpen?.(),!d.body){o.onClose?.();return}let s=d.body.getReader(),u=new TextDecoder,h=pe(o);try{for(;;){if(l?.aborted)throw me();let{done:y,value:x}=await s.read();if(y)break;h.feed(u.decode(x,{stream:!0}));}}finally{o.onClose?.();}}function tt(e,t){if(!e)return "";let n=e instanceof Uint8Array?e:new Uint8Array(e);return n.length===0?"":t.decode(n,{stream:false})}async function ke(e,t,n={},o,l){return new Promise((a,d)=>{let s=new Uint8Array(0),u=new et("utf-8",{fatal:false}),h=false,y=false,x=false,b=pe(o),v=m=>{if(!y){if(y=true,m){d($e(m));return}o.onClose?.(),a();}},L=()=>{x||(x=true,o.onOpen?.());},k=m=>{m&&(L(),b.feed(m));},$=m=>{if(!(y||!m.data))try{h=!0;let V=new Uint8Array(m.data),w=new Uint8Array(s.length+V.length);w.set(s),w.set(V,s.length),s=w;let T=0;for(;T<s.length;){let B=s.subarray(T),_=u.decode(B,{stream:!1});if(_.length===0)break;if(_.includes("\uFFFD")){let z=_.lastIndexOf("\uFFFD")===0?0:_.indexOf("\uFFFD");if(z<=0)break;let Q=_.slice(0,z);Q&&k(Q);let N=new TextEncoder().encode(Q);T+=N.length;break}k(_),T+=B.length;}s=s.subarray(T);}catch(V){console.error("[mini stream] chunk process error:",V);}},O=m=>{L(),m.header?.["content-type"]?.includes("text/event-stream")===false&&console.warn("Warning: server did not return event-stream");},S=getMiniProgramRequest();if(!S){d(new Error("Mini-program request API not found"));return}try{let m=S({url:e,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...n},data:typeof t=="string"?t:JSON.stringify(t),responseType:"arraybuffer",...Ae()?{enableChunked:!0}:{},success:V=>{if(!h&&V?.data){let w=tt(V.data,u);k(w);}if(s.length>0){let w=u.decode(s,{stream:!0});k(w);}v();},fail:V=>{v(V);}});ze(l,()=>{m.abort?.(),v(me());}),m.onChunkReceived?.($),m.onHeadersReceived?.(O);}catch(m){v(m);}})}async function _e(e,t,n,o,l,a=false){let d=n?.(),s=d?{Authorization:`Bearer ${d}`}:{},u=getMiniProgramRequest(),h=ge()&&!!u;if(a&&h){await ke(e,t,s,o,l);return}if(h){await ke(e,t,s,o,l);return}await De(e,t,s,o,l);}function nt(e,t,n,o){let l="";try{l=process.env.TARO_APP_API_BASE_URL||process.env.VITE_API_BASE_URL||process.env.API_BASE_URL||"";}catch{}l=String(l||"").trim();let a=`${t||l}/api/proxy/builtin/platform/copilot`,d=y=>e.request({url:a,method:"POST",data:y}),s=Ue(a,o);async function u(y,x,b,v){try{await _e(a,y,n,x,b,v);}catch(L){if(b?.aborted)return;throw L}}let h=qe({createContextId:s,postRpc:d,sendMessageStream:u});return {createConversationController(y){return Fe(h,y)}}}var rt=/[\n。!?.!?;;]/,st=/[,、,::]\s*$/;var Ne=e=>{if(!e)return null;for(let t=e.messages.length-1;t>=0;t-=1){let n=e.messages[t];if(n&&n.role==="assistant"&&(n.kind==="text-content"||n.kind==="message")&&n.content?.trim())return n}return null},ot=e=>{if(!e)return null;for(let t=e.messages.length-1;t>=0;t-=1){let n=e.messages[t];if(n&&n.role==="user"&&n.messageId)return n.messageId}return null},je=(e,t)=>{if(!e)return null;if(!t)return Ne(e);let n=e.messages.findIndex(o=>o.messageId===t);if(n<0)return Ne(e);for(let o=e.messages.length-1;o>n;o-=1){let l=e.messages[o];if(l&&l.role==="assistant"&&(l.kind==="text-content"||l.kind==="message")&&l.content?.trim())return l}return null},at=e=>{for(let t=e.length-1;t>=0;t-=1){let n=e[t];if(n&&(n.requestState==="submitting"||n.requestState==="streaming"||n.requestState==="recovering"||n.status==="submitted"||n.status==="working"))return n}return null},it=(e,t)=>t&&e.find(n=>n.taskId===t)||null,lt=(e,t)=>{let n=e.trimStart();if(!n)return {segments:[],remainder:""};if(t)return {segments:[n].filter(Boolean),remainder:""};let o=[],l=0;for(let d=0;d<n.length;d+=1){let s=n[d];if(!s||!rt.test(s))continue;let u=n.slice(l,d+1).trim();u&&o.push(u),l=d+1;}let a=n.slice(l).trimStart();return a.length>=24&&st.test(a)&&(o.push(a.trim()),a=""),{segments:o,remainder:a}};function ut(e){let{source:t,speech:n,storage:o,enabledStorageKey:l,defaultVoice:a=null,id:d="auto-voice-reply",audioFormat:s="pcm",sampleRate:u=24e3,preprocessText:h}=e,y=false,x=l?o?.getItem(l)==="true":false,b=t.getSnapshot().isLoading,v=null,L=null,k=null,$=false,O=null,S="",m="",V=Promise.resolve(),w=n.getVoice?.()??a,T={enabled:x,status:n.getSnapshot().status,connecting:n.getSnapshot().status==="connecting",speaking:n.getSnapshot().status==="speaking",voice:w,activeTaskId:v,suppressedTaskId:k,error:n.getSnapshot().error||null},B=new Set,_=()=>{let g=n.getSnapshot(),M={enabled:x,status:g.status,connecting:g.status==="connecting",speaking:g.status==="speaking",voice:w,activeTaskId:v,suppressedTaskId:k,error:g.error||null},H=T.enabled!==M.enabled||T.status!==M.status||T.connecting!==M.connecting||T.speaking!==M.speaking||T.voice!==M.voice||T.activeTaskId!==M.activeTaskId||T.suppressedTaskId!==M.suppressedTaskId||T.error!==M.error;return H&&(T=M),H},z=()=>{y||(_(),B.forEach(g=>g()));},Q=()=>{l&&o?.setItem(l,x?"true":"false");},N=(g=null)=>{O=g,S="",m="",$=false;},X=()=>{v=null,L=null;},Z=g=>{let M=g?.preserveRoundContext??false;S="",m="",O=null,$=false,M||X(),n.stop();},W=g=>(V=V.then(()=>g(),()=>g()),V),ae=async g=>{if(!(!g.length||y)){$||(await n.startStream({id:d,voice:w,audioFormat:s,sampleRate:u}),$=true);for(let M of g){if(y)return;let H=h?h(M):M;H.trim()&&(await n.appendText({id:d,text:H}),n.commit());}}},ee=async(g,M)=>{let H=g.messageId||null,q=g.content||"";if(!q.trim())return;O!==H&&N(H);let K=S;if(K&&!q.startsWith(K)){S=q;return}let le=q.slice(K.length);if(S=q,!le&&!M)return;m+=le;let{segments:ue,remainder:ye}=lt(m,M);m=ye,ue.length&&await ae(ue),M&&n.finish();},re=()=>{if(y)return;let g=t.getSnapshot();if(!x){b=g.isLoading;return}let M=at(g.conversations),H=b;if(g.isLoading&&M){if(M.taskId!==v&&(v=M.taskId,L=ot(M),k=null),k===M.taskId){b=g.isLoading,z();return}let q=je(M,L);q&&W(()=>ee(q,false));}else if(H&&!g.isLoading){let q=it(g.conversations,v);if(q&&k!==q.taskId){let K=je(q,L);K&&W(()=>ee(K,true));}q?.taskId===k&&(k=null),X();}b=g.isLoading,z();},te=t.subscribe(re),ie=n.subscribe(()=>{if(y)return;let g=n.getVoice?.()??w??a;g!==w&&(w=g),z();}),se={subscribe(g){return B.add(g),()=>{B.delete(g);}},getSnapshot(){return _(),T},setEnabled(g){x!==g&&(x=g,Q(),x?(b=t.getSnapshot().isLoading,re()):(Z(),k=null),z());},toggleEnabled(){se.setEnabled(!x);},toggleEnabledOrStop(){let g=n.getSnapshot().status;if(g==="connecting"||g==="speaking"){k=v,Z({preserveRoundContext:true}),z();return}se.toggleEnabled();},stop(){k=v,Z({preserveRoundContext:true}),z();},setVoice(g){w=g,n.setVoice?.(g),z();},getVoice(){return w},destroy(){y||(y=true,Z(),k=null,te(),ie(),B.clear());}};return se}var Be={maxCount:5};function ct(){return `file-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function fe(e){let t=e.lastIndexOf(".");return t<=-1?"":e.slice(t).toLowerCase()}function dt(e){return new Promise((t,n)=>{let o=new FileReader;o.onerror=()=>n(o.error||new Error("Failed to read file")),o.onload=()=>{let l=typeof o.result=="string"?o.result:"",a=l.includes(",")?l.split(",")[1]||"":l;if(!a){n(new Error("Failed to encode file"));return}t(a);},o.readAsDataURL(e);})}function gt(e,t){if(!t.length)return true;let n=e.type||"",o=fe(e.name);return t.some(l=>{if(!l)return false;let a=l.trim().toLowerCase();if(!a)return false;if(a.startsWith("."))return o===a;if(a.endsWith("/*")){let d=a.slice(0,-1);return n.toLowerCase().startsWith(d)}return n.toLowerCase()===a})}function mt(e,t,n){let o=t.maxCount??Be.maxCount;return typeof o=="number"&&n>=o?`\u6700\u591A\u53EA\u80FD\u4E0A\u4F20 ${o} \u4E2A\u6587\u4EF6`:typeof t.maxSize=="number"&&e.size>t.maxSize?`\u6587\u4EF6 ${e.name} \u8D85\u8FC7\u5927\u5C0F\u9650\u5236`:t.accept&&!gt(e,t.accept)?`\u6587\u4EF6 ${e.name} \u7C7B\u578B\u4E0D\u652F\u6301`:null}function pt(e={}){let t=new Set,n=[],o={...Be,...e},l=()=>{let a={files:[...n],constraints:o};t.forEach(d=>d(a));};return {getSnapshot(){return {files:[...n],constraints:o}},subscribe(a){return t.add(a),()=>{t.delete(a);}},async addFiles(a){let d=Array.from(a),s=await Promise.all(d.map(async(u,h)=>{let y=ct(),x=mt(u,o,n.length+h);if(x)return {id:y,name:u.name,size:u.size,mimeType:u.type||"application/octet-stream",extension:fe(u.name),status:"error",error:x,file:u};try{let b=await dt(u);return {id:y,name:u.name,size:u.size,mimeType:u.type||"application/octet-stream",extension:fe(u.name),status:"ready",file:u,content:{type:"file",data:b,name:u.name,mimeType:u.type||"application/octet-stream",size:u.size}}}catch(b){return {id:y,name:u.name,size:u.size,mimeType:u.type||"application/octet-stream",extension:fe(u.name),status:"error",error:b.message||`\u6587\u4EF6 ${u.name} \u8BFB\u53D6\u5931\u8D25`,file:u}}}));return n=[...n,...s],l(),s},removeFile(a){n=n.filter(d=>d.id!==a),l();},clearFiles(){n=[],l();},getReadyFiles(){return n.filter(a=>a.status==="ready")},getMessageFiles(){return n.filter(a=>a.status==="ready"&&a.content).map(a=>a.content)}}}export{ut as createAutoVoiceReplyController,nt as createCopilotClient,pt as createCopilotFileManager};//# sourceMappingURL=index.js.map
|
|
1
|
+
import {getMiniProgramRequest,resolveMiniProgramGlobals}from'@amaster.ai/http-client';import {createParser}from'eventsource-parser';import tt from'miniprogram-text-decoder';var Se=class{constructor(){this.aborted=false;this.listeners=[];this.signal={aborted:false,addEventListener:(t,n)=>{this.listeners.push(n);}};}abort(){this.aborted||(this.aborted=true,this.signal.aborted=true,this.listeners.forEach(t=>t()));}};function Ae(){return typeof AbortController<"u"?new AbortController:new Se}function x(){return new Date().toISOString()}function Y(){return `msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function Ke(e){return {...e}}function Me(e){return {...e,system:e.system?{...e.system}:void 0,runtimeError:e.runtimeError?{...e.runtimeError}:void 0,messages:e.messages.map(t=>Ke(t))}}function be(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=>Me(t))}}function oe(e,t){for(let n=e.messages.length-1;n>=0;n-=1){let o=e.messages[n];if(o&&t(o))return n}return -1}function Ge(e){return e.kind==="text-content"||e.kind==="message"}function Je(e){let t=e?.file;return t?{name:t.name||"\u672A\u547D\u540D\u6587\u4EF6",mimeType:t.mimeType,url:t.uri,size:typeof e?.metadata?.size=="number"?e.metadata.size:typeof t?.size=="number"?t.size:void 0}:null}var de={"text-content":(e,t,n,o,u)=>{if(!n)return e;let a=oe(e,s=>s.messageId===n&&Ge(s)),d=t.text||"";if(a>=0){let s=e.messages[a];return {...e,messages:e.messages.map(l=>l===e.messages[a]?{...l,content:s.content+d}:l),lastUpdated:x()}}return {...e,messages:[...e.messages,{messageId:n,role:o,kind:"text-content",content:d,timestamp:u?.timestamp||x()}],lastUpdated:x()}},"file-content":(e,t,n,o,u)=>{if(!n)return e;let a=Je(t);return !a||oe(e,s=>s.messageId===n&&s.kind==="file-content")>=0?e:{...e,messages:[...e.messages,{messageId:n,role:o,kind:"file-content",files:[a],timestamp:u?.timestamp||x()}],lastUpdated:x()}},thought:(e,t,n,o,u)=>{if(!n)return e;let a=t?.data?.description||"",d=oe(e,s=>s.messageId===n&&s.kind==="thought");if(d>=0){let s=e.messages[d];return {...e,messages:e.messages.map(l=>l===e.messages[d]?{...l,thought:s.thought+a}:l),lastUpdated:x()}}return {...e,messages:[...e.messages,{messageId:n,role:o,kind:"thought",thought:a,timestamp:u?.timestamp||x()}],lastUpdated:x()}},tool:(e,t,n,o,u)=>{let a=t?.data||{},d=a?.tool,s=d?.displayName||d?.name||"",l=a?.request,h=l?.callId;if(!h||!s)return e;let C=a?.status,m=oe(e,I=>I.messageId===h&&I.kind==="tool");if(m>=0){let I=e.messages[m];return {...e,messages:e.messages.map(b=>b===e.messages[m]?{...b,toolStatus:C||I.toolStatus}:b),lastUpdated:x()}}return {...e,messages:[...e.messages,{messageId:h,role:o,kind:"tool",toolName:s,toolDescription:l?.args?.query||"",toolStatus:C||"pending",timestamp:u?.timestamp||x()}],lastUpdated:x()}},error:(e,t,n,o)=>{let u=t?.text||t?.data?.error||"\u53D1\u751F\u9519\u8BEF";return {...e,messages:[...e.messages,{messageId:n||`error-${Date.now()}`,role:o,kind:"error",content:u,timestamp:x()}],status:"error",lastUpdated:x()}},"ui-render":(e,t,n,o,u)=>{if(!n)return e;let a=oe(e,l=>l.messageId===n&&l.kind==="ui-render"),s=(t?.data||{}).spec||{root:"",elements:{}};return a>=0?{...e,messages:e.messages.map(l=>l===e.messages[a]?{...l,spec:s}:l),lastUpdated:x()}:{...e,messages:[...e.messages,{messageId:n,role:o,kind:"ui-render",spec:s,timestamp:u?.timestamp||x()}],lastUpdated:x()}}};function ve(e,t){return e?.data?.tool?"tool":e?.data?.type==="ui"?"ui-render":e?.kind==="text"?"text-content":e?.kind==="file"?"file-content":e?.data?.type==="though"||t?.coderAgent?.kind==="thought"?"thought":t?.error?"error":"unknown"}function Ye(e,t){if(typeof e=="string"){let n=e.trim().toUpperCase();if(n==="TT"||n==="DOUYIN"||n==="WEAPP"||n==="WECHAT")return true}return t?typeof t.TT<"u"&&e===t.TT||typeof t.WEAPP<"u"&&e===t.WEAPP:false}function ge(){let e=resolveMiniProgramGlobals();return Ye(e?.Taro?.getEnv?.(),e?.Taro?.ENV_TYPE)?true:typeof e?.wx?.request=="function"||typeof e?.tt?.request=="function"||typeof e?.my?.request=="function"||typeof e?.swan?.request=="function"||typeof e?.qq?.request=="function"||typeof e?.jd?.request=="function"}function Ee(){let e=resolveMiniProgramGlobals();return !(typeof e?.tt?.request=="function"||typeof e?.tt?.createEventSource=="function")}function Fe(){return typeof resolveMiniProgramGlobals()?.tt?.createEventSource=="function"}function Pe(e,t){let o=(t.mode||"conversation")==="single-turn",u=!o,a=!o,d=()=>t.getContextId?.()??e.createContextId(o?"single-turn":"conversation"),s={byId:{},order:[],starting:true,isLoading:false,isLoadingHistory:false,historyState:{next:null,hasMore:false}},l=new Set,h=null,m=null,I="unknown",b="",U=null,k=false,$=d(),O=e.createScopedRuntime($),S=null,p=()=>{if(k)return;let r=be(s);l.forEach(i=>i(r));},V=r=>{s.order=s.order.filter(i=>i!==r);},w=(r,i=true)=>{V(r),s.order=i?[...s.order,r]:[r,...s.order];},T=()=>{I="unknown",b="";},B=(r,i)=>{let c=r?.file||{};return [c.uri,c.name,c.mimeType,r?.metadata?.size,c.size].filter(Boolean).join("::")||`part-${i??0}`},_=({messageId:r,kind:i,part:c,partIndex:f})=>r?i==="file-content"?`${r}::file::${B(c,f)}`:i==="text-content"?`${r}::text`:`${r}::${i}`:"",z=r=>{let i=r&&typeof r=="object"?r:{},c=String(i.message||i.errMsg||"").toLowerCase(),f=String(i.errorCode||""),A=String(i.errNo||"");return i.name==="TypeError"||/failed to fetch|fetch failed|timed out|disconnected|offline|断网/.test(c)||["600009","21101","21102","21103"].includes(f)||["600009","21101","21102","21103"].includes(A)},Q=(r,i="stream")=>{let c=r&&typeof r=="object"?r:{},f=String(c.message||c.errMsg||"").toLowerCase();return {code:z(r)?"network":"unknown",message:f,retryable:true,source:i,timestamp:x()}},N=(r,i)=>{if(!r)return;let c=s.byId[r];c&&(s.byId[r]={...c,requestState:i.requestState??c.requestState,runtimeError:i.runtimeError===void 0?c.runtimeError:i.runtimeError,status:i.status??c.status,lastUpdated:x()});},X=r=>{N(r,{requestState:"idle",runtimeError:null});},Z=()=>{s.byId={},s.order=[],s.historyState={next:null,hasMore:false};},W=r=>{s.isLoading=r,!r&&g();},ae=()=>($=d(),O=e.createScopedRuntime($),$),ee=()=>{h?.abort(),h=null,X(S),W(false),p();},re=()=>{T(),X(S),S&&N(S,{status:"completed"}),S=null,m=null,h=null,W(false),p();},te=r=>{s.byId[r.taskId]=r,w(r.taskId,true),p();},ie=r=>{s.byId[r]&&(delete s.byId[r],V(r),p());},se=()=>{te({taskId:"loading-placeholder",status:"working",messages:[{messageId:"loading-placeholder",role:"assistant",kind:"text-content",content:t.strings.thinking,timestamp:x()}],lastUpdated:x()});},g=()=>{ie("loading-placeholder");},M=({kind:r,taskId:i,part:c,status:f,handler:A,isHistory:y,historyId:v,messageId:E,partIndex:F})=>{let P=E?_({messageId:E,kind:r,part:c,partIndex:F}):b,L=f?.message?.role==="agent"?"assistant":"user";!E&&(r==="ui-render"||r==="file-content"||r!=="unknown"&&r!==I)&&(I=r,P=Y(),b=P);let R=s.byId[i]??{taskId:i,status:y?"completed":"submitted",messages:[],role:L,historyId:v,lastUpdated:x()},G=A(R,c,P,L,f);s.byId[i]={...G,status:f?.state||R.status,lastUpdated:x()},y||w(i,true),p();},H=(r,i="stream",c=S)=>{N(c,{requestState:"error",runtimeError:Q(r,i),status:"error"}),c&&S===c&&(S=null),W(false),p();},q=r=>{if(!r?.result)return;let i=r.result,{taskId:c,status:f,metadata:A,final:y}=i;if(y){re();return}if(!c)return;m=c;let v=f?.message?.parts||[],E=false;v.forEach((F,P)=>{let L=ve(F,A),R=de[L];R&&(L!=="unknown"&&(E=true),M({kind:L,taskId:c,part:F,status:f,handler:R,partIndex:P}));}),E&&g();},K=(r,i)=>{let{messageId:c,historyId:f}=r||{};if(!c)return;(r.parts||[]).forEach((y,v)=>{let E=ve(y);if(E==="text-content"){let P=y.text||"";if(P=P.trim(),P.startsWith("<ui>")){let L=P.slice(4).trim();try{let R=JSON.parse(L);R.root&&R.elements&&M({kind:"ui-render",taskId:i,part:{kind:"data",data:{type:"ui",spec:R}},handler:de["ui-render"],isHistory:!0,historyId:f,messageId:c,status:{message:r},partIndex:v});}catch{}return}}let F=de[E];F&&M({kind:E,taskId:i,part:y,handler:F,isHistory:true,historyId:f,messageId:c,status:{message:r},partIndex:v});});},le=(r,i)=>{let c=r.trim();return i?.length?[...c?[{type:"text",text:c}]:[],...i]:c},ue=r=>{if(r?.length)return r.map(i=>({name:i.name||"\u672A\u547D\u540D\u6587\u4EF6",size:i.size,mimeType:i.mimeType,url:i.url}))},ye=(r,i)=>{let c=[],f=r.trim(),A=ue(i)||[];return f&&c.push({messageId:Y(),role:"user",kind:"text-content",content:f,timestamp:x()}),A.length&&c.push({messageId:Y(),role:"user",kind:"file-content",files:A.map((y,v)=>({...y,id:y.id||`local-file-${v}`})),timestamp:x()}),c},ce=async(r,i,c=false,f=0,A=false,y=S)=>{S=y,ee(),T(),N(y,{requestState:"submitting",runtimeError:null,status:"submitted"});let v=Ae();h=v,c&&(se(),W(true),p());let E=false,F=false,P=false,L=false,R=i?.taskId||null,G=O.sendMessage(r,{taskId:i?.taskId,signal:v.signal,preferMiniProgramRequest:A,onMessage:J=>{let he=J?.result?.taskId,D=!!J?.result?.final;he&&(R=he),D&&(L=true),E=true,N(y,{requestState:D?"idle":"streaming",runtimeError:null,status:D?"completed":"working"}),q(J);},onClose:()=>{}});let xe=async()=>{if(Fe()&&!!getMiniProgramRequest()&&!P&&!L&&f<2){console.log("[recovering]"),N(y,{requestState:"recovering",runtimeError:null,status:"working"}),p();try{let D=await O.getChatStatus(R||void 0);if(D.working&&D.taskId)return m=D.taskId,await ce([],{taskId:D.taskId},!0,f+1,!0,y),!0;if(!E&&!R&&!D.taskId&&f<1)return await ce(r,i,!0,f+1,!0,y),!0}catch(D){return console.error("[ConversationController] recovery failed:",D),H(D,"recovery",y),true}}return false},Ce,we=false;try{await G;}catch(J){J?.name==="AbortError"||v.signal.aborted?P=true:(F=true,Ce=J,console.error("[ConversationController] Stream error:",J));}finally{h===v&&(h=null),we=await xe();}we||(F?H(Ce,"stream",y):!E&&c&&!P?H(Ce,"send",y):P?(X(y),y&&S===y&&(S=null),W(false),p()):L&&s.isLoading?re():!L&&s.isLoading&&H(void 0,"stream",y));};return {getSnapshot(){return be(s)},subscribe(r){return l.add(r),()=>{l.delete(r);}},async init(){if(!k)return U||(s.starting=true,p(),U=(async()=>{try{if(u&&await this.loadHistory(),a){let r=await O.getChatStatus();r.taskId&&r.working&&(m=r.taskId,await ce([],{taskId:r.taskId},!1));}}catch(r){console.error("[ConversationController] init failed:",r);}finally{s.starting=false,p(),U=null;}})(),U)},destroy(){k=true,ee(),l.clear();},async sendMessage(r,i){let c=i?.files?.filter(v=>v.data||v.url)||[],f=!!r.trim(),A=c.length>0;if(s.isLoading||!f&&!A)return;o&&(this.abort(),Z(),T(),m=null,ae());let y=Y();S=y,te({taskId:y,status:"submitted",requestState:"submitting",runtimeError:null,messages:ye(r,c),lastUpdated:x()});try{await ce([{role:"user",content:le(r,c)}],void 0,!0,0,!1,y);}catch(v){if(v.name==="AbortError")return;H(v,"send",y);}},abort(){let r=h?.signal.aborted;ee(),T(),X(S),S=null,m=null,g(),r||Promise.resolve();},async cancelChat(r){let i=r||m;if(this.abort(),te({taskId:Y(),status:"error",messages:[{messageId:`cancel-${Date.now()}`,role:"assistant",kind:"text-content",content:t.strings.cancelled,timestamp:x()}],lastUpdated:x()}),!!i)try{await O.cancelChat(i),m=null;}catch(c){console.error("[ConversationController] cancel failed:",c);}},resetConversation(r){if(this.abort(),Z(),S=null,m=null,T(),o&&ae(),r){let i=`conv-${Date.now()}`;s.byId[i]={taskId:i,status:"submitted",messages:[{messageId:`greeting-${Date.now()}`,role:"assistant",kind:"text-content",content:r,timestamp:x()}],lastUpdated:x()},s.order=[i];}p();},async startNewConversation(){te({taskId:Y(),status:"submitted",messages:[],lastUpdated:x(),system:{level:"newConversation"}});try{await O.newConversation();}catch(r){console.error("[ConversationController] newConversation failed:",r);}},async loadHistory(r=20,i){s.isLoadingHistory=true,p();try{let c=await O.getHistory(r,i),f=c?.messages||[],A="",y="",v=[];f.forEach(E=>{let F=E.role==="agent"?"assistant":"user";F!==y&&(A=`history-conv-${Y()}`,v.push(A),y=F),K(E,A);}),s.order=[...v,...s.order.filter(E=>!v.includes(E))],s.historyState={next:c?.next||null,hasMore:c?.hasMore||!1};}catch(c){console.error("[ConversationController] loadHistory failed:",c);}finally{s.isLoadingHistory=false,p();}},async loadMoreHistory(){!s.historyState.hasMore||s.isLoadingHistory||!s.historyState.next||await this.loadHistory(20,s.historyState.next);},getConversation(r){let i=s.byId[r];return i?Me(i):void 0},clearConversation(r){ie(r);},removeMessage(r,i){let c=s.byId[r];c&&(s.byId[r]={...c,messages:c.messages.filter(f=>f.messageId!==i),lastUpdated:x()},w(r,true),p());},updateMessage(r){let{taskId:i,messageId:c,content:f,partial:A=false,status:y,response:v,metadata:E={}}=r,F=s.byId[i];if(!F)return;let P=F.messages.findIndex(xe=>xe.messageId===c);if(P===-1)return;let L=F.messages[P];if(!L)return;let R={...L,...E};f!==void 0&&("content"in R?R.content=A?`${R.content||""}${f}`:f:"thought"in R?R.thought=A?`${R.thought||""}${f}`:f:L.kind==="text-content"&&(R.content=A?`${L.content||""}${f}`:f)),("toolStatus"in R||y)&&(R.toolStatus=y||R.toolStatus),v!==void 0&&(R.response=v);let G=[...F.messages];G[P]=R,s.byId[i]={...F,messages:G,lastUpdated:x()},w(i,true),p();}}}function j(){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 n=Math.random()*16|0;return (t==="x"?n:n&3|8).toString(16)})}function Le(e){let t=/^www\.([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.\w+$/.exec(e);if(t?.[1])return t[1];let n=/^([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.\w+$/.exec(e);return n?.[1]?n[1]:null}function Qe(){if(typeof window>"u")return null;try{let e=window.location.href,t=/\/app\/([\da-z-]+)(?:\/|$)/.exec(e);return t?.[1]?t[1]:Le(window.location.hostname)}catch{return null}}var Ie=null,Xe=null;function Ue(e){let t=e?Le(e):Qe();return t||(Ie||(Ie=j()),Ie)}function ke(e){return ()=>e?.()??Xe??(Xe=`anonymous-${j()}`)}function Ve(e,t){let n=ke(t);return (o="conversation")=>{let u=ge(),a=Ue();if(u){let l=e?e.replace(/^https?:\/\//,"").split("/")[0]:"";a=Ue(l);}let d=n(),s=`${a}:${d}`;return o==="single-turn"?`${s}:${j()}`:s}}function Ze(e){let t={...e.size!==void 0?{size:e.size}:{}};return e.data?{kind:"file",file:{bytes:e.data,...e.mimeType&&{mimeType:e.mimeType},...e.name&&{name:e.name}},...Object.keys(t).length>0?{metadata:t}:{}}:e.url?{kind:"file",file:{uri:e.url,...e.mimeType&&{mimeType:e.mimeType},...e.name&&{name:e.name}},...Object.keys(t).length>0?{metadata:t}:{}}:null}function He(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 Ze(t);default:return null}}).filter(t=>t!==null)}function Oe(e){return typeof e=="string"?e:e.filter(t=>t.type==="text").map(t=>t.text).join(`
|
|
2
|
+
`)}function qe(e){return {createContextId(t){return e.createContextId(t)},createScopedRuntime(t){return e.createRuntime(t)}}}function $e({createContextId:e,postRpc:t,sendMessageStream:n}){return qe({createContextId:e,createRuntime(o){return {async sendMessage(u,a){let{taskId:d,signal:s,onOpen:l,onMessage:h,onClose:C,preferMiniProgramRequest:m}=a,I=u.find(S=>S.role==="system"),b=u.filter(S=>S.role!=="system"),U=b[b.length-1],k=U?He(U.content):[{kind:"text",text:""}],$=I?Oe(I.content):void 0,O={jsonrpc:"2.0",id:j(),method:"message/stream",params:{message:{contextId:o,kind:"message",messageId:j(),role:"user",parts:k,...d?{taskId:d}:{},...$?{metadata:{systemPrompt:$}}:{}}}};await n(O,{onOpen:l,onMessage:h,onClose:C},s,m);},cancelChat(u){let a={jsonrpc:"2.0",id:j(),method:"tasks/cancel",params:{id:u}};return t(a)},async getHistory(u=50,a){try{let s=(await t({jsonrpc:"2.0",method:"messages/list",id:j(),params:{filter:{contextId:o},limit:u,...a?{next:a}:{}}}))?.data?.result||{},l=s?.messages||[],h=s?.next||"";return {messages:l,next:h,hasMore:!!h}}catch{return}},async newConversation(){try{await t({jsonrpc:"2.0",method:"messages/clear",id:j(),params:{contextId:o}});}catch{}},async getChatStatus(u){try{let a={jsonrpc:"2.0",id:j(),method:"tasks/get",params:u?{id:u}:{contextId:o}},s=(await t(a))?.data?.result;return {working:s?.status?.state==="working",taskId:s?.id,error:s?.error?.message||""}}catch(a){return {working:false,error:a?.message||""}}}}}})}function ze(e){if(e instanceof Error)return e;if(e&&typeof e=="object"){let t=e,n=typeof t.errMsg=="string"&&t.errMsg||typeof t.message=="string"&&t.message||JSON.stringify(t),o=new Error(n);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 me(){if(typeof DOMException<"u")return new DOMException("Aborted","AbortError");let e=new Error("Aborted");return e.name="AbortError",e}function pe(e){return createParser({onEvent:t=>{try{e.onMessage(JSON.parse(t.data));}catch(n){console.error("[copilot stream] failed to parse SSE event:",n,t.data);}}})}function De(e,t){if(e){if(e.aborted){t();return}e.addEventListener("abort",t);}}async function _e(e,t,n,o,u){let a={"Content-Type":"application/json",...n},d=await fetch(e,{method:"POST",headers:a,credentials:"include",body:JSON.stringify(t),signal:u});if(!d.ok)throw new Error(`Stream request failed: ${d.statusText||d.status}`);if(o.onOpen?.(),!d.body){o.onClose?.();return}let s=d.body.getReader(),l=new TextDecoder,h=pe(o);try{for(;;){if(u?.aborted)throw me();let{done:C,value:m}=await s.read();if(C)break;h.feed(l.decode(m,{stream:!0}));}}finally{o.onClose?.();}}function nt(e,t){if(!e)return "";let n=e instanceof Uint8Array?e:new Uint8Array(e);return n.length===0?"":t.decode(n,{stream:false})}async function Te(e,t,n={},o,u){return new Promise((a,d)=>{let s=new Uint8Array(0),l=new tt("utf-8",{fatal:false}),h=false,C=false,m=false,I=pe(o),b=p=>{if(!C){if(C=true,p){d(ze(p));return}o.onClose?.(),a();}},U=()=>{m||(m=true,o.onOpen?.());},k=p=>{p&&(U(),I.feed(p));},$=p=>{if(!(C||!p.data))try{h=!0;let V=new Uint8Array(p.data),w=new Uint8Array(s.length+V.length);w.set(s),w.set(V,s.length),s=w;let T=0;for(;T<s.length;){let B=s.subarray(T),_=l.decode(B,{stream:!1});if(_.length===0)break;if(_.includes("\uFFFD")){let z=_.lastIndexOf("\uFFFD")===0?0:_.indexOf("\uFFFD");if(z<=0)break;let Q=_.slice(0,z);Q&&k(Q);let N=new TextEncoder().encode(Q);T+=N.length;break}k(_),T+=B.length;}s=s.subarray(T);}catch(V){console.error("[mini stream] chunk process error:",V);}},O=p=>{U(),p.header?.["content-type"]?.includes("text/event-stream")===false&&console.warn("Warning: server did not return event-stream");},S=getMiniProgramRequest();if(!S){d(new Error("Mini-program request API not found"));return}try{let p=S({url:e,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...n},data:typeof t=="string"?t:JSON.stringify(t),responseType:"arraybuffer",...Ee()?{enableChunked:!0}:{},success:V=>{if(!h&&V?.data){let w=nt(V.data,l);k(w);}if(s.length>0){let w=l.decode(s,{stream:!0});k(w);}b();},fail:V=>{b(V);}});De(u,()=>{p.abort?.(),b(me());}),p.onChunkReceived?.($),p.onHeadersReceived?.(O);}catch(p){b(p);}})}async function Ne(e,t,n,o,u,a=false,d){let s=n?.(),l=s?{Authorization:`Bearer ${s}`}:{},h=d?.();h&&(l["x-app-user-id"]=h);let C=getMiniProgramRequest(),m=ge()&&!!C;if(a&&m){await Te(e,t,l,o,u);return}if(m){await Te(e,t,l,o,u);return}await _e(e,t,l,o,u);}function rt(e,t,n,o){let u="";try{u=process.env.TARO_APP_API_BASE_URL||process.env.VITE_API_BASE_URL||process.env.API_BASE_URL||"";}catch{}u=String(u||"").trim();let a=`${t||u}/api/proxy/builtin/platform/copilot`,d=ke(o),s=m=>e.request({url:a,method:"POST",data:m,headers:{"x-app-user-id":d()}}),l=Ve(a,o);async function h(m,I,b,U){try{await Ne(a,m,n,I,b,U,d);}catch(k){if(b?.aborted)return;throw k}}let C=$e({createContextId:l,postRpc:s,sendMessageStream:h});return {createConversationController(m){return Pe(C,m)}}}var st=/[\n。!?.!?;;]/,ot=/[,、,::]\s*$/;var je=e=>{if(!e)return null;for(let t=e.messages.length-1;t>=0;t-=1){let n=e.messages[t];if(n&&n.role==="assistant"&&(n.kind==="text-content"||n.kind==="message")&&n.content?.trim())return n}return null},at=e=>{if(!e)return null;for(let t=e.messages.length-1;t>=0;t-=1){let n=e.messages[t];if(n&&n.role==="user"&&n.messageId)return n.messageId}return null},Be=(e,t)=>{if(!e)return null;if(!t)return je(e);let n=e.messages.findIndex(o=>o.messageId===t);if(n<0)return je(e);for(let o=e.messages.length-1;o>n;o-=1){let u=e.messages[o];if(u&&u.role==="assistant"&&(u.kind==="text-content"||u.kind==="message")&&u.content?.trim())return u}return null},it=e=>{for(let t=e.length-1;t>=0;t-=1){let n=e[t];if(n&&(n.requestState==="submitting"||n.requestState==="streaming"||n.requestState==="recovering"||n.status==="submitted"||n.status==="working"))return n}return null},lt=(e,t)=>t&&e.find(n=>n.taskId===t)||null,ut=(e,t)=>{let n=e.trimStart();if(!n)return {segments:[],remainder:""};if(t)return {segments:[n].filter(Boolean),remainder:""};let o=[],u=0;for(let d=0;d<n.length;d+=1){let s=n[d];if(!s||!st.test(s))continue;let l=n.slice(u,d+1).trim();l&&o.push(l),u=d+1;}let a=n.slice(u).trimStart();return a.length>=24&&ot.test(a)&&(o.push(a.trim()),a=""),{segments:o,remainder:a}};function ct(e){let{source:t,speech:n,storage:o,enabledStorageKey:u,defaultVoice:a=null,id:d="auto-voice-reply",audioFormat:s="pcm",sampleRate:l=24e3,preprocessText:h}=e,C=false,m=u?o?.getItem(u)==="true":false,I=t.getSnapshot().isLoading,b=null,U=null,k=null,$=false,O=null,S="",p="",V=Promise.resolve(),w=n.getVoice?.()??a,T={enabled:m,status:n.getSnapshot().status,connecting:n.getSnapshot().status==="connecting",speaking:n.getSnapshot().status==="speaking",voice:w,activeTaskId:b,suppressedTaskId:k,error:n.getSnapshot().error||null},B=new Set,_=()=>{let g=n.getSnapshot(),M={enabled:m,status:g.status,connecting:g.status==="connecting",speaking:g.status==="speaking",voice:w,activeTaskId:b,suppressedTaskId:k,error:g.error||null},H=T.enabled!==M.enabled||T.status!==M.status||T.connecting!==M.connecting||T.speaking!==M.speaking||T.voice!==M.voice||T.activeTaskId!==M.activeTaskId||T.suppressedTaskId!==M.suppressedTaskId||T.error!==M.error;return H&&(T=M),H},z=()=>{C||(_(),B.forEach(g=>g()));},Q=()=>{u&&o?.setItem(u,m?"true":"false");},N=(g=null)=>{O=g,S="",p="",$=false;},X=()=>{b=null,U=null;},Z=g=>{let M=g?.preserveRoundContext??false;S="",p="",O=null,$=false,M||X(),n.stop();},W=g=>(V=V.then(()=>g(),()=>g()),V),ae=async g=>{if(!(!g.length||C)){$||(await n.startStream({id:d,voice:w,audioFormat:s,sampleRate:l}),$=true);for(let M of g){if(C)return;let H=h?h(M):M;H.trim()&&(await n.appendText({id:d,text:H}),n.commit());}}},ee=async(g,M)=>{let H=g.messageId||null,q=g.content||"";if(!q.trim())return;O!==H&&N(H);let K=S;if(K&&!q.startsWith(K)){S=q;return}let le=q.slice(K.length);if(S=q,!le&&!M)return;p+=le;let{segments:ue,remainder:ye}=ut(p,M);p=ye,ue.length&&await ae(ue),M&&n.finish();},re=()=>{if(C)return;let g=t.getSnapshot();if(!m){I=g.isLoading;return}let M=it(g.conversations),H=I;if(g.isLoading&&M){if(M.taskId!==b&&(b=M.taskId,U=at(M),k=null),k===M.taskId){I=g.isLoading,z();return}let q=Be(M,U);q&&W(()=>ee(q,false));}else if(H&&!g.isLoading){let q=lt(g.conversations,b);if(q&&k!==q.taskId){let K=Be(q,U);K&&W(()=>ee(K,true));}q?.taskId===k&&(k=null),X();}I=g.isLoading,z();},te=t.subscribe(re),ie=n.subscribe(()=>{if(C)return;let g=n.getVoice?.()??w??a;g!==w&&(w=g),z();}),se={subscribe(g){return B.add(g),()=>{B.delete(g);}},getSnapshot(){return _(),T},setEnabled(g){m!==g&&(m=g,Q(),m?(I=t.getSnapshot().isLoading,re()):(Z(),k=null),z());},toggleEnabled(){se.setEnabled(!m);},toggleEnabledOrStop(){let g=n.getSnapshot().status;if(g==="connecting"||g==="speaking"){k=b,Z({preserveRoundContext:true}),z();return}se.toggleEnabled();},stop(){k=b,Z({preserveRoundContext:true}),z();},setVoice(g){w=g,n.setVoice?.(g),z();},getVoice(){return w},destroy(){C||(C=true,Z(),k=null,te(),ie(),B.clear());}};return se}var We={maxCount:5};function dt(){return `file-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function fe(e){let t=e.lastIndexOf(".");return t<=-1?"":e.slice(t).toLowerCase()}function gt(e){return new Promise((t,n)=>{let o=new FileReader;o.onerror=()=>n(o.error||new Error("Failed to read file")),o.onload=()=>{let u=typeof o.result=="string"?o.result:"",a=u.includes(",")?u.split(",")[1]||"":u;if(!a){n(new Error("Failed to encode file"));return}t(a);},o.readAsDataURL(e);})}function mt(e,t){if(!t.length)return true;let n=e.type||"",o=fe(e.name);return t.some(u=>{if(!u)return false;let a=u.trim().toLowerCase();if(!a)return false;if(a.startsWith("."))return o===a;if(a.endsWith("/*")){let d=a.slice(0,-1);return n.toLowerCase().startsWith(d)}return n.toLowerCase()===a})}function pt(e,t,n){let o=t.maxCount??We.maxCount;return typeof o=="number"&&n>=o?`\u6700\u591A\u53EA\u80FD\u4E0A\u4F20 ${o} \u4E2A\u6587\u4EF6`:typeof t.maxSize=="number"&&e.size>t.maxSize?`\u6587\u4EF6 ${e.name} \u8D85\u8FC7\u5927\u5C0F\u9650\u5236`:t.accept&&!mt(e,t.accept)?`\u6587\u4EF6 ${e.name} \u7C7B\u578B\u4E0D\u652F\u6301`:null}function ft(e={}){let t=new Set,n=[],o={...We,...e},u=()=>{let a={files:[...n],constraints:o};t.forEach(d=>d(a));};return {getSnapshot(){return {files:[...n],constraints:o}},subscribe(a){return t.add(a),()=>{t.delete(a);}},async addFiles(a){let d=Array.from(a),s=await Promise.all(d.map(async(l,h)=>{let C=dt(),m=pt(l,o,n.length+h);if(m)return {id:C,name:l.name,size:l.size,mimeType:l.type||"application/octet-stream",extension:fe(l.name),status:"error",error:m,file:l};try{let I=await gt(l);return {id:C,name:l.name,size:l.size,mimeType:l.type||"application/octet-stream",extension:fe(l.name),status:"ready",file:l,content:{type:"file",data:I,name:l.name,mimeType:l.type||"application/octet-stream",size:l.size}}}catch(I){return {id:C,name:l.name,size:l.size,mimeType:l.type||"application/octet-stream",extension:fe(l.name),status:"error",error:I.message||`\u6587\u4EF6 ${l.name} \u8BFB\u53D6\u5931\u8D25`,file:l}}}));return n=[...n,...s],u(),s},removeFile(a){n=n.filter(d=>d.id!==a),u();},clearFiles(){n=[],u();},getReadyFiles(){return n.filter(a=>a.status==="ready")},getMessageFiles(){return n.filter(a=>a.status==="ready"&&a.content).map(a=>a.content)}}}export{ct as createAutoVoiceReplyController,rt as createCopilotClient,ft as createCopilotFileManager};//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|