@amaster.ai/copilot-client 1.1.14 → 1.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +49 -3
- package/dist/index.d.ts +49 -3
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.cts
CHANGED
|
@@ -19,8 +19,19 @@ interface FileContent {
|
|
|
19
19
|
url?: string;
|
|
20
20
|
mimeType?: string;
|
|
21
21
|
name?: string;
|
|
22
|
+
size?: number;
|
|
22
23
|
}
|
|
23
24
|
type MessageContent = TextContent | ImageContent | FileContent;
|
|
25
|
+
interface MessageFileAttachment {
|
|
26
|
+
id?: string;
|
|
27
|
+
name: string;
|
|
28
|
+
size?: number;
|
|
29
|
+
mimeType?: string;
|
|
30
|
+
url?: string;
|
|
31
|
+
}
|
|
32
|
+
interface SendMessageOptions {
|
|
33
|
+
files?: FileContent[];
|
|
34
|
+
}
|
|
24
35
|
interface BaseMessage {
|
|
25
36
|
messageId: string;
|
|
26
37
|
role?: Role;
|
|
@@ -31,6 +42,10 @@ interface TextMessage extends BaseMessage {
|
|
|
31
42
|
kind: "text-content" | "message";
|
|
32
43
|
content: string;
|
|
33
44
|
}
|
|
45
|
+
interface FileMessage extends BaseMessage {
|
|
46
|
+
kind: "file-content";
|
|
47
|
+
files: MessageFileAttachment[];
|
|
48
|
+
}
|
|
34
49
|
interface ErrorMessage extends BaseMessage {
|
|
35
50
|
kind: "error";
|
|
36
51
|
content: string;
|
|
@@ -57,7 +72,7 @@ interface UIRenderMessage extends BaseMessage {
|
|
|
57
72
|
}>;
|
|
58
73
|
};
|
|
59
74
|
}
|
|
60
|
-
type MessagesItem = TextMessage | ErrorMessage | ThoughtMessage | ToolMessage | UIRenderMessage | BaseMessage;
|
|
75
|
+
type MessagesItem = TextMessage | FileMessage | ErrorMessage | ThoughtMessage | ToolMessage | UIRenderMessage | BaseMessage;
|
|
61
76
|
interface Conversation {
|
|
62
77
|
taskId: string;
|
|
63
78
|
status: "submitted" | "working" | "completed" | "error";
|
|
@@ -115,7 +130,7 @@ interface ConversationController {
|
|
|
115
130
|
subscribe(listener: (snapshot: ConversationControllerSnapshot) => void): () => void;
|
|
116
131
|
init(): Promise<void>;
|
|
117
132
|
destroy(): void;
|
|
118
|
-
sendMessage(userContent: string): Promise<void>;
|
|
133
|
+
sendMessage(userContent: string, options?: SendMessageOptions): Promise<void>;
|
|
119
134
|
abort(): void;
|
|
120
135
|
cancelChat(taskId?: string): Promise<void>;
|
|
121
136
|
resetConversation(greeting?: string): void;
|
|
@@ -215,4 +230,35 @@ interface CreateAutoVoiceReplyControllerOptions {
|
|
|
215
230
|
}
|
|
216
231
|
declare function createAutoVoiceReplyController(options: CreateAutoVoiceReplyControllerOptions): AutoVoiceReplyController;
|
|
217
232
|
|
|
218
|
-
|
|
233
|
+
interface CopilotFileConstraints {
|
|
234
|
+
maxCount?: number;
|
|
235
|
+
maxSize?: number;
|
|
236
|
+
accept?: string[];
|
|
237
|
+
}
|
|
238
|
+
interface CopilotManagedFile {
|
|
239
|
+
id: string;
|
|
240
|
+
name: string;
|
|
241
|
+
size: number;
|
|
242
|
+
mimeType: string;
|
|
243
|
+
extension: string;
|
|
244
|
+
status: "ready" | "error";
|
|
245
|
+
error?: string;
|
|
246
|
+
file?: File;
|
|
247
|
+
content?: FileContent;
|
|
248
|
+
}
|
|
249
|
+
interface CopilotFileManagerSnapshot {
|
|
250
|
+
files: CopilotManagedFile[];
|
|
251
|
+
constraints: CopilotFileConstraints;
|
|
252
|
+
}
|
|
253
|
+
interface CopilotFileManager {
|
|
254
|
+
getSnapshot(): CopilotFileManagerSnapshot;
|
|
255
|
+
subscribe(listener: (snapshot: CopilotFileManagerSnapshot) => void): () => void;
|
|
256
|
+
addFiles(input: FileList | File[]): Promise<CopilotManagedFile[]>;
|
|
257
|
+
removeFile(fileId: string): void;
|
|
258
|
+
clearFiles(): void;
|
|
259
|
+
getReadyFiles(): CopilotManagedFile[];
|
|
260
|
+
getMessageFiles(): FileContent[];
|
|
261
|
+
}
|
|
262
|
+
declare function createCopilotFileManager(constraints?: CopilotFileConstraints): CopilotFileManager;
|
|
263
|
+
|
|
264
|
+
export { type AutoVoiceReplyController, type AutoVoiceReplyConversation, type AutoVoiceReplyMessage, type AutoVoiceReplySnapshot, type AutoVoiceReplySource, type AutoVoiceReplySourceSnapshot, type AutoVoiceReplySpeechDriver, type AutoVoiceReplySpeechSnapshot, type AutoVoiceReplyStorage, type Conversation, type ConversationController, type ConversationControllerOptions, type ConversationControllerSnapshot, type ConversationRequestState, type ConversationRuntimeError, type ConversationStrings, type CopilotClient, type CopilotFileConstraints, type CopilotFileManager, type CopilotFileManagerSnapshot, type CopilotManagedFile, type CreateAutoVoiceReplyControllerOptions, type ErrorMessage, type FileContent, type FileMessage, type HistoryState, type ImageContent, type MessageContent, type MessageFileAttachment, type MessagesItem, type Role, type SendMessageOptions, type TextContent, type TextMessage, type ThoughtMessage, type ToolMessage, type UIRenderMessage, type UpdateMessageInput, createAutoVoiceReplyController, createCopilotClient, createCopilotFileManager };
|
package/dist/index.d.ts
CHANGED
|
@@ -19,8 +19,19 @@ interface FileContent {
|
|
|
19
19
|
url?: string;
|
|
20
20
|
mimeType?: string;
|
|
21
21
|
name?: string;
|
|
22
|
+
size?: number;
|
|
22
23
|
}
|
|
23
24
|
type MessageContent = TextContent | ImageContent | FileContent;
|
|
25
|
+
interface MessageFileAttachment {
|
|
26
|
+
id?: string;
|
|
27
|
+
name: string;
|
|
28
|
+
size?: number;
|
|
29
|
+
mimeType?: string;
|
|
30
|
+
url?: string;
|
|
31
|
+
}
|
|
32
|
+
interface SendMessageOptions {
|
|
33
|
+
files?: FileContent[];
|
|
34
|
+
}
|
|
24
35
|
interface BaseMessage {
|
|
25
36
|
messageId: string;
|
|
26
37
|
role?: Role;
|
|
@@ -31,6 +42,10 @@ interface TextMessage extends BaseMessage {
|
|
|
31
42
|
kind: "text-content" | "message";
|
|
32
43
|
content: string;
|
|
33
44
|
}
|
|
45
|
+
interface FileMessage extends BaseMessage {
|
|
46
|
+
kind: "file-content";
|
|
47
|
+
files: MessageFileAttachment[];
|
|
48
|
+
}
|
|
34
49
|
interface ErrorMessage extends BaseMessage {
|
|
35
50
|
kind: "error";
|
|
36
51
|
content: string;
|
|
@@ -57,7 +72,7 @@ interface UIRenderMessage extends BaseMessage {
|
|
|
57
72
|
}>;
|
|
58
73
|
};
|
|
59
74
|
}
|
|
60
|
-
type MessagesItem = TextMessage | ErrorMessage | ThoughtMessage | ToolMessage | UIRenderMessage | BaseMessage;
|
|
75
|
+
type MessagesItem = TextMessage | FileMessage | ErrorMessage | ThoughtMessage | ToolMessage | UIRenderMessage | BaseMessage;
|
|
61
76
|
interface Conversation {
|
|
62
77
|
taskId: string;
|
|
63
78
|
status: "submitted" | "working" | "completed" | "error";
|
|
@@ -115,7 +130,7 @@ interface ConversationController {
|
|
|
115
130
|
subscribe(listener: (snapshot: ConversationControllerSnapshot) => void): () => void;
|
|
116
131
|
init(): Promise<void>;
|
|
117
132
|
destroy(): void;
|
|
118
|
-
sendMessage(userContent: string): Promise<void>;
|
|
133
|
+
sendMessage(userContent: string, options?: SendMessageOptions): Promise<void>;
|
|
119
134
|
abort(): void;
|
|
120
135
|
cancelChat(taskId?: string): Promise<void>;
|
|
121
136
|
resetConversation(greeting?: string): void;
|
|
@@ -215,4 +230,35 @@ interface CreateAutoVoiceReplyControllerOptions {
|
|
|
215
230
|
}
|
|
216
231
|
declare function createAutoVoiceReplyController(options: CreateAutoVoiceReplyControllerOptions): AutoVoiceReplyController;
|
|
217
232
|
|
|
218
|
-
|
|
233
|
+
interface CopilotFileConstraints {
|
|
234
|
+
maxCount?: number;
|
|
235
|
+
maxSize?: number;
|
|
236
|
+
accept?: string[];
|
|
237
|
+
}
|
|
238
|
+
interface CopilotManagedFile {
|
|
239
|
+
id: string;
|
|
240
|
+
name: string;
|
|
241
|
+
size: number;
|
|
242
|
+
mimeType: string;
|
|
243
|
+
extension: string;
|
|
244
|
+
status: "ready" | "error";
|
|
245
|
+
error?: string;
|
|
246
|
+
file?: File;
|
|
247
|
+
content?: FileContent;
|
|
248
|
+
}
|
|
249
|
+
interface CopilotFileManagerSnapshot {
|
|
250
|
+
files: CopilotManagedFile[];
|
|
251
|
+
constraints: CopilotFileConstraints;
|
|
252
|
+
}
|
|
253
|
+
interface CopilotFileManager {
|
|
254
|
+
getSnapshot(): CopilotFileManagerSnapshot;
|
|
255
|
+
subscribe(listener: (snapshot: CopilotFileManagerSnapshot) => void): () => void;
|
|
256
|
+
addFiles(input: FileList | File[]): Promise<CopilotManagedFile[]>;
|
|
257
|
+
removeFile(fileId: string): void;
|
|
258
|
+
clearFiles(): void;
|
|
259
|
+
getReadyFiles(): CopilotManagedFile[];
|
|
260
|
+
getMessageFiles(): FileContent[];
|
|
261
|
+
}
|
|
262
|
+
declare function createCopilotFileManager(constraints?: CopilotFileConstraints): CopilotFileManager;
|
|
263
|
+
|
|
264
|
+
export { type AutoVoiceReplyController, type AutoVoiceReplyConversation, type AutoVoiceReplyMessage, type AutoVoiceReplySnapshot, type AutoVoiceReplySource, type AutoVoiceReplySourceSnapshot, type AutoVoiceReplySpeechDriver, type AutoVoiceReplySpeechSnapshot, type AutoVoiceReplyStorage, type Conversation, type ConversationController, type ConversationControllerOptions, type ConversationControllerSnapshot, type ConversationRequestState, type ConversationRuntimeError, type ConversationStrings, type CopilotClient, type CopilotFileConstraints, type CopilotFileManager, type CopilotFileManagerSnapshot, type CopilotManagedFile, type CreateAutoVoiceReplyControllerOptions, type ErrorMessage, type FileContent, type FileMessage, type HistoryState, type ImageContent, type MessageContent, type MessageFileAttachment, type MessagesItem, type Role, type SendMessageOptions, type TextContent, type TextMessage, type ThoughtMessage, type ToolMessage, type UIRenderMessage, type UpdateMessageInput, createAutoVoiceReplyController, createCopilotClient, createCopilotFileManager };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {getMiniProgramRequest,resolveMiniProgramGlobals}from'@amaster.ai/http-client';import {createParser}from'eventsource-parser';import je from'miniprogram-text-decoder';var me=class{constructor(){this.aborted=false;this.listeners=[];this.signal={aborted:false,addEventListener:(t,r)=>{this.listeners.push(r);}};}abort(){this.aborted||(this.aborted=true,this.signal.aborted=true,this.listeners.forEach(t=>t()));}};function ve(){return typeof AbortController<"u"?new AbortController:new me}function f(){return new Date().toISOString()}function Q(){return `msg-${Date.now()}-${Math.random().toString(36).slice(2,10)}`}function De(e){return {...e}}function pe(e){return {...e,system:e.system?{...e.system}:void 0,runtimeError:e.runtimeError?{...e.runtimeError}:void 0,messages:e.messages.map(t=>De(t))}}function fe(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=>pe(t))}}var oe={"text-content":(e,t,r,a,i)=>{if(!r)return e;let c=e.messages.find(n=>n.messageId===r),d=t.text||"";return c&&"content"in c?{...e,messages:e.messages.map(n=>n.messageId===r?{...n,content:n.content+d}:n),lastUpdated:f()}:{...e,messages:[...e.messages,{messageId:r,role:a,kind:"text-content",content:d,timestamp:i?.timestamp||f()}],lastUpdated:f()}},thought:(e,t,r,a,i)=>{if(!r)return e;let c=t?.data?.description||"",d=e.messages.find(n=>n.messageId===r);return d&&"thought"in d?{...e,messages:e.messages.map(n=>n.messageId===r?{...n,thought:n.thought+c}:n),lastUpdated:f()}:{...e,messages:[...e.messages,{messageId:r,role:a,kind:"thought",thought:c,timestamp:i?.timestamp||f()}],lastUpdated:f()}},tool:(e,t,r,a,i)=>{let c=t?.data||{},d=c?.tool,n=d?.displayName||d?.name||"",m=c?.request,y=m?.callId;if(!y||!n)return e;let x=c?.status,S=e.messages.find(b=>b.messageId===y);return S&&"toolStatus"in S?{...e,messages:e.messages.map(b=>b.messageId===y?{...b,toolStatus:x||b.toolStatus}:b),lastUpdated:f()}:{...e,messages:[...e.messages,{messageId:y,role:a,kind:"tool",toolName:n,toolDescription:m?.args?.query||"",toolStatus:x||"pending",timestamp:i?.timestamp||f()}],lastUpdated:f()}},error:(e,t,r,a)=>{let i=t?.text||t?.data?.error||"\u53D1\u751F\u9519\u8BEF";return {...e,messages:[...e.messages,{messageId:r||`error-${Date.now()}`,role:a,kind:"error",content:i,timestamp:f()}],status:"error",lastUpdated:f()}},"ui-render":(e,t,r,a,i)=>{if(!r)return e;let c=e.messages.find(m=>m.messageId===r),n=(t?.data||{}).spec||{root:"",elements:{}};return c&&c.kind==="ui-render"?{...e,messages:e.messages.map(m=>m.messageId===r?{...m,spec:n}:m),lastUpdated:f()}:{...e,messages:[...e.messages,{messageId:r,role:a,kind:"ui-render",spec:n,timestamp:i?.timestamp||f()}],lastUpdated:f()}}};function ye(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 Fe(e,t){if(typeof e=="string"){let r=e.trim().toUpperCase();if(r==="TT"||r==="DOUYIN"||r==="WEAPP"||r==="WECHAT")return true}return t?typeof t.TT<"u"&&e===t.TT||typeof t.WEAPP<"u"&&e===t.WEAPP:false}function ae(){let e=resolveMiniProgramGlobals();return Fe(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 be(){let e=resolveMiniProgramGlobals();return !(typeof e?.tt?.request=="function"||typeof e?.tt?.createEventSource=="function")}function Me(){return typeof resolveMiniProgramGlobals()?.tt?.createEventSource=="function"}function Re(e,t){let a=(t.mode||"conversation")==="single-turn",i=!a,c=!a,d=()=>t.getContextId?.()??e.createContextId(a?"single-turn":"conversation"),n={byId:{},order:[],starting:true,isLoading:false,isLoadingHistory:false,historyState:{next:null,hasMore:false}},m=new Set,y=null,S=null,b="unknown",M="",P=null,R=false,D=d(),q=e.createScopedRuntime(D),h=null,g=()=>{if(R)return;let s=fe(n);m.forEach(o=>o(s));},H=s=>{n.order=n.order.filter(o=>o!==s);},k=(s,o=true)=>{H(s),n.order=o?[...n.order,s]:[s,...n.order];},I=()=>{b="unknown",M="";},z=s=>{let o=s&&typeof s=="object"?s:{},u=String(o.message||o.errMsg||"").toLowerCase(),p=String(o.errorCode||""),A=String(o.errNo||"");return o.name==="TypeError"||/failed to fetch|fetch failed|timed out|disconnected|offline|断网/.test(u)||["600009","21101","21102","21103"].includes(p)||["600009","21101","21102","21103"].includes(A)},_=(s,o="stream")=>{let u=s&&typeof s=="object"?s:{},p=String(u.message||u.errMsg||"").toLowerCase();return {code:z(s)?"network":"unknown",message:p,retryable:true,source:o,timestamp:f()}},L=(s,o)=>{if(!s)return;let u=n.byId[s];u&&(n.byId[s]={...u,requestState:o.requestState??u.requestState,runtimeError:o.runtimeError===void 0?u.runtimeError:o.runtimeError,status:o.status??u.status,lastUpdated:f()});},j=s=>{L(s,{requestState:"idle",runtimeError:null});},X=()=>{n.byId={},n.order=[],n.historyState={next:null,hasMore:false};},K=s=>{n.isLoading=s,!s&&ne();},G=()=>(D=d(),q=e.createScopedRuntime(D),D),Z=()=>{y?.abort(),y=null,j(h),K(false),g();},se=()=>{I(),j(h),h&&L(h,{status:"completed"}),h=null,S=null,y=null,K(false),g();},J=s=>{n.byId[s.taskId]=s,k(s.taskId,true),g();},re=s=>{n.byId[s]&&(delete n.byId[s],H(s),g());},ue=()=>{J({taskId:"loading-placeholder",status:"working",messages:[{messageId:"loading-placeholder",role:"assistant",kind:"text-content",content:t.strings.thinking,timestamp:f()}],lastUpdated:f()});},ne=()=>{re("loading-placeholder");},Y=({kind:s,taskId:o,part:u,status:p,handler:A,isHistory:C,historyId:E,messageId:T})=>{let w=T||M,O=p?.message?.role==="agent"?"assistant":"user";!T&&(s==="ui-render"||s!=="unknown"&&s!==b)&&(b=s,w=Q(),M=w);let $=n.byId[o]??{taskId:o,status:C?"completed":"submitted",messages:[],role:O,historyId:E,lastUpdated:f()},U=A($,u,w,O,p);n.byId[o]={...U,status:p?.state||$.status,lastUpdated:f()},C||k(o,true),g();},l=(s,o="stream",u=h)=>{L(u,{requestState:"error",runtimeError:_(s,o),status:"error"}),u&&h===u&&(h=null),K(false),g();},v=s=>{if(!s?.result)return;let o=s.result,{taskId:u,status:p,metadata:A,final:C}=o;if(C){se();return}if(!u)return;S=u;let E=p?.message?.parts?.[0],T=ye(E,A),w=oe[T];w&&(ne(),Y({kind:T,taskId:u,part:E,status:p,handler:w}));},F=(s,o)=>{let{messageId:u,historyId:p}=s||{};if(!u)return;let A=s.parts?.[0],C=ye(A);if(C==="text-content"){let T=A.text||"";if(T=T.trim(),T.startsWith("<ui>")){let w=T.slice(4).trim();try{let O=JSON.parse(w);O.root&&O.elements&&Y({kind:"ui-render",taskId:o,part:{kind:"data",data:{type:"ui",spec:O}},handler:oe["ui-render"],isHistory:!0,historyId:p,messageId:u,status:{message:s}});}catch{}return}}let E=oe[C];E&&Y({kind:C,taskId:o,part:A,handler:E,isHistory:true,historyId:p,messageId:u,status:{message:s}});},V=async(s,o,u=false,p=0,A=false,C=h)=>{h=C,Z(),I(),L(C,{requestState:"submitting",runtimeError:null,status:"submitted"});let E=ve();y=E,u&&(ue(),K(true),g());let T=false,w=false,O=false,$=false,U=o?.taskId||null,ee=q.sendMessage(s,{taskId:o?.taskId,signal:E.signal,preferMiniProgramRequest:A,onMessage:W=>{let ge=W?.result?.taskId,N=!!W?.result?.final;ge&&(U=ge),N&&($=true),T=true,L(C,{requestState:N?"idle":"streaming",runtimeError:null,status:N?"completed":"working"}),v(W);},onClose:()=>{}});let ce=async()=>{if(Me()&&!!getMiniProgramRequest()&&!O&&!$&&p<2){console.log("[recovering]"),L(C,{requestState:"recovering",runtimeError:null,status:"working"}),g();try{let N=await q.getChatStatus(U||void 0);if(N.working&&N.taskId)return S=N.taskId,await V([],{taskId:N.taskId},!0,p+1,!0,C),!0;if(!T&&!U&&!N.taskId&&p<1)return await V(s,o,!0,p+1,!0,C),!0}catch(N){return console.error("[ConversationController] recovery failed:",N),l(N,"recovery",C),true}}return false},de,Ce=false;try{await ee;}catch(W){W?.name==="AbortError"||E.signal.aborted?O=true:(w=true,de=W,console.error("[ConversationController] Stream error:",W));}finally{y===E&&(y=null),Ce=await ce();}Ce||(w?l(de,"stream",C):!T&&u&&!O?l(de,"send",C):O?(j(C),C&&h===C&&(h=null),K(false),g()):$&&n.isLoading?se():!$&&n.isLoading&&l(void 0,"stream",C));};return {getSnapshot(){return fe(n)},subscribe(s){return m.add(s),()=>{m.delete(s);}},async init(){if(!R)return P||(n.starting=true,g(),P=(async()=>{try{if(i&&await this.loadHistory(),c){let s=await q.getChatStatus();s.taskId&&s.working&&(S=s.taskId,await V([],{taskId:s.taskId},!1));}}catch(s){console.error("[ConversationController] init failed:",s);}finally{n.starting=false,g(),P=null;}})(),P)},destroy(){R=true,Z(),m.clear();},async sendMessage(s){if(n.isLoading||!s.trim())return;a&&(this.abort(),X(),I(),S=null,G());let o=Q();h=o,J({taskId:o,status:"submitted",requestState:"submitting",runtimeError:null,messages:[{messageId:Q(),role:"user",kind:"text-content",content:s,timestamp:f()}],lastUpdated:f()});try{await V([{role:"user",content:s}],void 0,!0,0,!1,o);}catch(u){if(u.name==="AbortError")return;l(u,"send",o);}},abort(){let s=y?.signal.aborted;Z(),I(),j(h),h=null,S=null,ne(),s||Promise.resolve();},async cancelChat(s){let o=s||S;if(this.abort(),J({taskId:Q(),status:"error",messages:[{messageId:`cancel-${Date.now()}`,role:"assistant",kind:"text-content",content:t.strings.cancelled,timestamp:f()}],lastUpdated:f()}),!!o)try{await q.cancelChat(o),S=null;}catch(u){console.error("[ConversationController] cancel failed:",u);}},resetConversation(s){if(this.abort(),X(),h=null,S=null,I(),a&&G(),s){let o=`conv-${Date.now()}`;n.byId[o]={taskId:o,status:"submitted",messages:[{messageId:`greeting-${Date.now()}`,role:"assistant",kind:"text-content",content:s,timestamp:f()}],lastUpdated:f()},n.order=[o];}g();},async startNewConversation(){J({taskId:Q(),status:"submitted",messages:[],lastUpdated:f(),system:{level:"newConversation"}});try{await q.newConversation();}catch(s){console.error("[ConversationController] newConversation failed:",s);}},async loadHistory(s=20,o){n.isLoadingHistory=true,g();try{let u=await q.getHistory(s,o),p=u?.messages||[],A="",C="",E=[];p.forEach(T=>{let w=T.role==="agent"?"assistant":"user";w!==C&&(A=`history-conv-${Q()}`,E.push(A),C=w),F(T,A);}),n.order=[...E,...n.order.filter(T=>!E.includes(T))],n.historyState={next:u?.next||null,hasMore:u?.hasMore||!1};}catch(u){console.error("[ConversationController] loadHistory failed:",u);}finally{n.isLoadingHistory=false,g();}},async loadMoreHistory(){!n.historyState.hasMore||n.isLoadingHistory||!n.historyState.next||await this.loadHistory(20,n.historyState.next);},getConversation(s){let o=n.byId[s];return o?pe(o):void 0},clearConversation(s){re(s);},removeMessage(s,o){let u=n.byId[s];u&&(n.byId[s]={...u,messages:u.messages.filter(p=>p.messageId!==o),lastUpdated:f()},k(s,true),g());},updateMessage(s){let{taskId:o,messageId:u,content:p,partial:A=false,status:C,response:E,metadata:T={}}=s,w=n.byId[o];if(!w)return;let O=w.messages.findIndex(ce=>ce.messageId===u);if(O===-1)return;let $=w.messages[O];if(!$)return;let U={...$,...T};p!==void 0&&("content"in U?U.content=A?`${U.content||""}${p}`:p:"thought"in U?U.thought=A?`${U.thought||""}${p}`:p:$.kind==="text-content"&&(U.content=A?`${$.content||""}${p}`:p)),("toolStatus"in U||C)&&(U.toolStatus=C||U.toolStatus),E!==void 0&&(U.response=E);let ee=[...w.messages];ee[O]=U,n.byId[o]={...w,messages:ee,lastUpdated:f()},k(o,true),g();}}}function B(){let e=typeof globalThis<"u"?globalThis.crypto:void 0;return e&&typeof e.randomUUID=="function"?e.randomUUID():e&&typeof e.getRandomValues=="function"?"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let a=(e.getRandomValues(new Uint8Array(1))[0]??0)%16;return (t==="x"?a:a&3|8).toString(16)}):"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{let r=Math.random()*16|0;return (t==="x"?r:r&3|8).toString(16)})}function ke(e){let t=/^www\.([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(e);if(t?.[1])return t[1];let r=/^([\da-z-]+)(?:-[^.]+)?\.[\w-]+\.(?:local|ai|cn)$/.exec(e);return r?.[1]?r[1]:null}function $e(){if(typeof window>"u")return null;try{let e=window.location.href,t=/\/app\/([\da-z-]+)(?:\/|$)/.exec(e);return t?.[1]?t[1]:ke(window.location.hostname)}catch{return null}}var Se=null,Ne=null;function Ie(e){let t=e?ke(e):$e();return t||(Se||(Se=B()),Se)}function Te(e,t){return (r="conversation")=>{let a=ae(),i=Ie();if(a){let n=e?e.replace(/^https?:\/\//,"").split("/")[0]:"";i=Ie(n);}let c=t?.()??Ne??(Ne=`anonymous-${B()}`),d=`${i}:${c}`;return r==="single-turn"?`${d}:${B()}`:d}}function we(e){return typeof e=="string"?[{kind:"text",text:e}]:e.map(t=>{switch(t.type){case "text":return {kind:"text",text:t.text};case "image":return t.data?{kind:"file",file:{bytes:t.data,mimeType:t.mimeType||"image/png"}}:t.url?{kind:"file",file:{uri:t.url,mimeType:t.mimeType||"image/png"}}:null;case "file":return t.data?{kind:"file",file:{bytes:t.data,...t.mimeType&&{mimeType:t.mimeType},...t.name&&{name:t.name}}}:t.url?{kind:"file",file:{uri:t.url,...t.mimeType&&{mimeType:t.mimeType},...t.name&&{name:t.name}}}:null;default:return null}}).filter(t=>t!==null)}function Ae(e){return typeof e=="string"?e:e.filter(t=>t.type==="text").map(t=>t.text).join(`
|
|
2
|
-
`)}function Ee(e){return {createContextId(t){return e.createContextId(t)},createScopedRuntime(t){return e.createRuntime(t)}}}function Pe({createContextId:e,postRpc:t,sendMessageStream:r}){return Ee({createContextId:e,createRuntime(a){return {async sendMessage(i,c){let{taskId:d,signal:n,onOpen:m,onMessage:y,onClose:x,preferMiniProgramRequest:S}=c,b=i.find(h=>h.role==="system"),M=i.filter(h=>h.role!=="system"),P=M[M.length-1],R=P?we(P.content):[{kind:"text",text:""}],D=b?Ae(b.content):void 0,q={jsonrpc:"2.0",id:B(),method:"message/stream",params:{message:{contextId:a,kind:"message",messageId:B(),role:"user",parts:R,...d?{taskId:d}:{},...D?{metadata:{systemPrompt:D}}:{}}}};await r(q,{onOpen:m,onMessage:y,onClose:x},n,S);},cancelChat(i){let c={jsonrpc:"2.0",id:B(),method:"tasks/cancel",params:{id:i}};return t(c)},async getHistory(i=50,c){try{let n=(await t({jsonrpc:"2.0",method:"messages/list",id:B(),params:{filter:{contextId:a},limit:i,...c?{next:c}:{}}}))?.data?.result||{},m=n?.messages||[],y=n?.next||"";return {messages:m,next:y,hasMore:!!y}}catch{return}},async newConversation(){try{await t({jsonrpc:"2.0",method:"messages/clear",id:B(),params:{contextId:a}});}catch{}},async getChatStatus(i){try{let c={jsonrpc:"2.0",id:B(),method:"tasks/get",params:i?{id:i}:{contextId:a}},n=(await t(c))?.data?.result;return {working:n?.status?.state==="working",taskId:n?.id,error:n?.error?.message||""}}catch(c){return {working:false,error:c?.message||""}}}}}})}function Ve(e){if(e instanceof Error)return e;if(e&&typeof e=="object"){let t=e,r=typeof t.errMsg=="string"&&t.errMsg||typeof t.message=="string"&&t.message||JSON.stringify(t),a=new Error(r);return (typeof t.errorCode=="number"||typeof t.errorCode=="string")&&(a.errorCode=t.errorCode),(typeof t.errNo=="number"||typeof t.errNo=="string")&&(a.errNo=t.errNo),a.raw=e,a}return new Error(String(e))}function ie(){if(typeof DOMException<"u")return new DOMException("Aborted","AbortError");let e=new Error("Aborted");return e.name="AbortError",e}function le(e){return createParser({onEvent:t=>{try{e.onMessage(JSON.parse(t.data));}catch(r){console.error("[copilot stream] failed to parse SSE event:",r,t.data);}}})}function Ue(e,t){if(e){if(e.aborted){t();return}e.addEventListener("abort",t);}}async function Le(e,t,r,a,i){let c={"Content-Type":"application/json",...r},d=await fetch(e,{method:"POST",headers:c,credentials:"include",body:JSON.stringify(t),signal:i});if(!d.ok)throw new Error(`Stream request failed: ${d.statusText||d.status}`);if(a.onOpen?.(),!d.body){a.onClose?.();return}let n=d.body.getReader(),m=new TextDecoder,y=le(a);try{for(;;){if(i?.aborted)throw ie();let{done:x,value:S}=await n.read();if(x)break;y.feed(m.decode(S,{stream:!0}));}}finally{a.onClose?.();}}function Be(e,t){if(!e)return "";let r=e instanceof Uint8Array?e:new Uint8Array(e);return r.length===0?"":t.decode(r,{stream:false})}async function he(e,t,r={},a,i){return new Promise((c,d)=>{let n=new Uint8Array(0),m=new je("utf-8",{fatal:false}),y=false,x=false,S=false,b=le(a),M=g=>{if(!x){if(x=true,g){d(Ve(g));return}a.onClose?.(),c();}},P=()=>{S||(S=true,a.onOpen?.());},R=g=>{g&&(P(),b.feed(g));},D=g=>{if(!(x||!g.data))try{y=!0;let H=new Uint8Array(g.data),k=new Uint8Array(n.length+H.length);k.set(n),k.set(H,n.length),n=k;let I=0;for(;I<n.length;){let z=n.subarray(I),_=m.decode(z,{stream:!1});if(_.length===0)break;if(_.includes("\uFFFD")){let L=_.lastIndexOf("\uFFFD")===0?0:_.indexOf("\uFFFD");if(L<=0)break;let j=_.slice(0,L);j&&R(j);let X=new TextEncoder().encode(j);I+=X.length;break}R(_),I+=z.length;}n=n.subarray(I);}catch(H){console.error("[mini stream] chunk process error:",H);}},q=g=>{P(),g.header?.["content-type"]?.includes("text/event-stream")===false&&console.warn("Warning: server did not return event-stream");},h=getMiniProgramRequest();if(!h){d(new Error("Mini-program request API not found"));return}try{let g=h({url:e,method:"POST",header:{"Content-Type":"application/json",Accept:"text/event-stream",...r},data:typeof t=="string"?t:JSON.stringify(t),responseType:"arraybuffer",...be()?{enableChunked:!0}:{},success:H=>{if(!y&&H?.data){let k=Be(H.data,m);R(k);}if(n.length>0){let k=m.decode(n,{stream:!0});R(k);}M();},fail:H=>{M(H);}});Ue(i,()=>{g.abort?.(),M(ie());}),g.onChunkReceived?.(D),g.onHeadersReceived?.(q);}catch(g){M(g);}})}async function He(e,t,r,a,i,c=false){let d=r?.(),n=d?{Authorization:`Bearer ${d}`}:{},m=getMiniProgramRequest(),y=ae()&&!!m;if(c&&y){await he(e,t,n,a,i);return}if(y){await he(e,t,n,a,i);return}await Le(e,t,n,a,i);}function ze(e,t,r,a){let i="";try{i=process.env.TARO_APP_API_BASE_URL||process.env.VITE_API_BASE_URL||process.env.API_BASE_URL||"";}catch{}i=String(i||"").trim();let c=`${t||i}/api/proxy/builtin/platform/copilot`,d=x=>e.request({url:c,method:"POST",data:x}),n=Te(c,a);async function m(x,S,b,M){try{await He(c,x,r,S,b,M);}catch(P){if(b?.aborted)return;throw P}}let y=Pe({createContextId:n,postRpc:d,sendMessageStream:m});return {createConversationController(x){return Re(y,x)}}}var Ke=/[\n。!?.!?;;]/,We=/[,、,::]\s*$/;var qe=e=>{if(!e)return null;for(let t=e.messages.length-1;t>=0;t-=1){let r=e.messages[t];if(r&&r.role==="assistant"&&(r.kind==="text-content"||r.kind==="message")&&r.content?.trim())return r}return null},Ge=e=>{if(!e)return null;for(let t=e.messages.length-1;t>=0;t-=1){let r=e.messages[t];if(r&&r.role==="user"&&r.messageId)return r.messageId}return null},Oe=(e,t)=>{if(!e)return null;if(!t)return qe(e);let r=e.messages.findIndex(a=>a.messageId===t);if(r<0)return qe(e);for(let a=e.messages.length-1;a>r;a-=1){let i=e.messages[a];if(i&&i.role==="assistant"&&(i.kind==="text-content"||i.kind==="message")&&i.content?.trim())return i}return null},Je=e=>{for(let t=e.length-1;t>=0;t-=1){let r=e[t];if(r&&(r.requestState==="submitting"||r.requestState==="streaming"||r.requestState==="recovering"||r.status==="submitted"||r.status==="working"))return r}return null},Ye=(e,t)=>t&&e.find(r=>r.taskId===t)||null,Qe=(e,t)=>{let r=e.trimStart();if(!r)return {segments:[],remainder:""};if(t)return {segments:[r].filter(Boolean),remainder:""};let a=[],i=0;for(let d=0;d<r.length;d+=1){let n=r[d];if(!n||!Ke.test(n))continue;let m=r.slice(i,d+1).trim();m&&a.push(m),i=d+1;}let c=r.slice(i).trimStart();return c.length>=24&&We.test(c)&&(a.push(c.trim()),c=""),{segments:a,remainder:c}};function Xe(e){let{source:t,speech:r,storage:a,enabledStorageKey:i,defaultVoice:c=null,id:d="auto-voice-reply",audioFormat:n="pcm",sampleRate:m=24e3,preprocessText:y}=e,x=false,S=i?a?.getItem(i)==="true":false,b=t.getSnapshot().isLoading,M=null,P=null,R=null,D=false,q=null,h="",g="",H=Promise.resolve(),k=r.getVoice?.()??c,I={enabled:S,status:r.getSnapshot().status,connecting:r.getSnapshot().status==="connecting",speaking:r.getSnapshot().status==="speaking",voice:k,activeTaskId:M,suppressedTaskId:R,error:r.getSnapshot().error||null},z=new Set,_=()=>{let l=r.getSnapshot(),v={enabled:S,status:l.status,connecting:l.status==="connecting",speaking:l.status==="speaking",voice:k,activeTaskId:M,suppressedTaskId:R,error:l.error||null},F=I.enabled!==v.enabled||I.status!==v.status||I.connecting!==v.connecting||I.speaking!==v.speaking||I.voice!==v.voice||I.activeTaskId!==v.activeTaskId||I.suppressedTaskId!==v.suppressedTaskId||I.error!==v.error;return F&&(I=v),F},L=()=>{x||(_(),z.forEach(l=>l()));},j=()=>{i&&a?.setItem(i,S?"true":"false");},X=(l=null)=>{q=l,h="",g="",D=false;},K=()=>{M=null,P=null;},G=l=>{let v=l?.preserveRoundContext??false;h="",g="",q=null,D=false,v||K(),r.stop();},Z=l=>(H=H.then(()=>l(),()=>l()),H),se=async l=>{if(!(!l.length||x)){D||(await r.startStream({id:d,voice:k,audioFormat:n,sampleRate:m}),D=true);for(let v of l){if(x)return;let F=y?y(v):v;F.trim()&&(await r.appendText({id:d,text:F}),r.commit());}}},J=async(l,v)=>{let F=l.messageId||null,V=l.content||"";if(!V.trim())return;q!==F&&X(F);let s=h;if(s&&!V.startsWith(s)){h=V;return}let o=V.slice(s.length);if(h=V,!o&&!v)return;g+=o;let{segments:u,remainder:p}=Qe(g,v);g=p,u.length&&await se(u),v&&r.finish();},re=()=>{if(x)return;let l=t.getSnapshot();if(!S){b=l.isLoading;return}let v=Je(l.conversations),F=b;if(l.isLoading&&v){if(v.taskId!==M&&(M=v.taskId,P=Ge(v),R=null),R===v.taskId){b=l.isLoading,L();return}let V=Oe(v,P);V&&Z(()=>J(V,false));}else if(F&&!l.isLoading){let V=Ye(l.conversations,M);if(V&&R!==V.taskId){let s=Oe(V,P);s&&Z(()=>J(s,true));}V?.taskId===R&&(R=null),K();}b=l.isLoading,L();},ue=t.subscribe(re),ne=r.subscribe(()=>{if(x)return;let l=r.getVoice?.()??k??c;l!==k&&(k=l),L();}),Y={subscribe(l){return z.add(l),()=>{z.delete(l);}},getSnapshot(){return _(),I},setEnabled(l){S!==l&&(S=l,j(),S?(b=t.getSnapshot().isLoading,re()):(G(),R=null),L());},toggleEnabled(){Y.setEnabled(!S);},toggleEnabledOrStop(){let l=r.getSnapshot().status;if(l==="connecting"||l==="speaking"){R=M,G({preserveRoundContext:true}),L();return}Y.toggleEnabled();},stop(){R=M,G({preserveRoundContext:true}),L();},setVoice(l){k=l,r.setVoice?.(l),L();},getVoice(){return k},destroy(){x||(x=true,G(),R=null,ue(),ne(),z.clear());}};return Y}export{Xe as createAutoVoiceReplyController,ze as createCopilotClient};//# sourceMappingURL=index.js.map
|
|
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
|
|
3
3
|
//# sourceMappingURL=index.js.map
|