@amaster.ai/copilot-client 1.1.15 → 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.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/controller/utils.ts","../src/controller/message-handlers.ts","../src/runtime/platform.ts","../src/conversation-controller.ts","../src/runtime/context.ts","../src/runtime/message-content.ts","../src/runtime/session-runtime.ts","../src/runtime/copilot-runtime.ts","../src/runtime/stream/shared.ts","../src/runtime/stream/browser.ts","../src/runtime/stream/mini-program.ts","../src/runtime/stream/index.ts","../src/copilot-client.ts","../src/auto-voice-reply.ts"],"names":["SimpleAbortController","_event","listener","createAbortController","nowIso","generateId","cloneMessage","message","cloneConversation","conversation","createSnapshot","state","id","handlers","conv","part","role","status","existing","newText","newChunk","_id","partData","tool","name","request","toolStatus","errorMsg","spec","getKind","metadata","isKnownMiniProgramEnv","env","envType","normalizedEnv","isMiniProgramRuntime","runtime","resolveMiniProgramGlobals","supportsChunkedRequest","supportsDouyinEventSource","createConversationController","copilot","options","isSingleTurnMode","shouldLoadHistoryOnInit","shouldResumeOnInit","resolveContextId","listeners","activeAbortController","currentStreamingTaskId","lastMessageType","lastMessageId","initPromise","destroyed","currentContextId","sessionRuntime","activeRequestConversationId","emit","snapshot","removeTaskFromOrder","taskId","pushTaskToOrder","append","clearRuntimeMessageState","isNetworkError","error","payload","errorCode","errNo","createRuntimeError","source","updateConversationRequestMeta","input","clearConversationRuntimeState","resetState","setLoading","removeLoadingPlaceholder","refreshContextId","abortActiveSession","handleEnd","addConversation","clearConversation","addLoadingPlaceholder","fillData","kind","handler","isHistory","historyId","messageId","prevConversation","nextConversation","onSendError","requestConversationId","processLiveData","data","result","final","firstPart","processHistoryData","text","json","runSession","messages","chatOptions","showLoadingPlaceholder","recoveryAttempt","preferMiniProgramRequest","abortController","hasResponse","streamFailed","streamAborted","finalReceived","lastTaskId","runPromise","responseTaskId","responseFinal","recovery","getMiniProgramRequest","recoveryError","streamError","recovered","userContent","localTaskId","wasAborted","targetTaskId","greeting","limit","next","lastRole","taskIds","content","partial","response","messageIndex","oldMessage","updatedMessage","nextMessages","generateUUID","cryptoObj","char","random","getAppIdFromHostname","hostname","wwwMatch","domainMatch","extractAppIdFromUrl","url","pathMatch","cachedAppId","cachedAnonymousUid","getAppId","urlAppId","createContextIdFactory","getUserUid","mode","isMiniProgram","appId","userUid","baseContextId","convertToA2AParts","extractTextFromContent","createSessionRuntimeFactory","args","contextId","createCopilotRuntimeFactory","createContextId","postRpc","sendMessageStream","signal","onOpen","onMessage","onClose","systemMsg","nonSystemMsgs","lastUserMsg","parts","systemPrompt","cursor","normalizeStreamError","normalized","createAbortError","createSSEConsumer","createParser","event","bindAbortSignal","onAbort","startBrowserStream","authHeader","headers","reader","decoder","parser","done","value","decodeMiniProgramArrayBuffer","textDecoder","buffer","startMiniProgramStream","resolve","reject","chunkBuffer","MiniProgramTextDecoder","sawChunk","settled","opened","finish","emitOpen","feedText","chunkListener","merged","decodeOffset","remaining","decoded","lastGoodIndex","goodPart","encodedGood","headersListener","miniReq","requestTask","wholeResponse","finalText","startStream","getAccessToken","token","canUseMiniProgramStream","createCopilotClient","http","baseUrl","envBaseUrl","STREAM_BREAK_PATTERN","STREAM_SOFT_BREAK_PATTERN","getLatestAssistantTextMessageFromConversation","getLatestUserMessageIdFromConversation","getLatestAssistantTextMessageAfterUser","userMessageId","userIndex","getActiveConversation","conversations","index","getConversationByTaskId","takeCommittedSegments","trimmedBuffer","segments","lastIndex","segment","remainder","createAutoVoiceReplyController","speech","storage","enabledStorageKey","defaultVoice","audioFormat","sampleRate","preprocessText","enabled","lastLoading","activeTaskId","activeUserMessageId","suppressedTaskId","streamStarted","activeMessageId","observedText","pendingText","queuedOperations","voice","syncSnapshot","speechSnapshot","nextSnapshot","changed","persistEnabled","resetStreamingState","clearActiveRoundContext","stopStreaming","preserveRoundContext","enqueueOperation","operation","dispatchSegments","nextText","processLatestMessage","fullText","previousText","delta","handleSourceChange","activeConversation","wasLoading","latestMessage","finishedConversation","sourceUnsubscribe","speechUnsubscribe","nextVoice","controller","nextEnabled"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n Conversation,\n ConversationControllerSnapshot,\n HistoryState,\n MessagesItem,\n} from \"../types\";\n\nexport type InternalState = {\n byId: Record<string, Conversation>;\n order: string[];\n starting: boolean;\n isLoading: boolean;\n isLoadingHistory: boolean;\n historyState: HistoryState;\n};\n\nexport class SimpleAbortController {\n aborted = false;\n private listeners: Array<() => void> = [];\n\n signal = {\n aborted: false,\n addEventListener: (_event: \"abort\", listener: () => void) => {\n this.listeners.push(listener);\n },\n };\n\n abort() {\n if (this.aborted) return;\n this.aborted = true;\n this.signal.aborted = true;\n this.listeners.forEach((listener) => listener());\n }\n}\n\nexport function createAbortController(): AbortController | SimpleAbortController {\n if (typeof AbortController !== \"undefined\") {\n return new AbortController();\n }\n return new SimpleAbortController();\n}\n\nexport function nowIso() {\n return new Date().toISOString();\n}\n\nexport function generateId() {\n return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function cloneMessage<T extends MessagesItem>(message: T): T {\n return { ...message } as T;\n}\n\nexport function cloneConversation(conversation: Conversation): Conversation {\n return {\n ...conversation,\n system: conversation.system ? { ...conversation.system } : undefined,\n runtimeError: conversation.runtimeError ? { ...conversation.runtimeError } : undefined,\n messages: conversation.messages.map((message) => cloneMessage(message)),\n };\n}\n\nexport function createSnapshot(state: InternalState): ConversationControllerSnapshot {\n return {\n starting: state.starting,\n isLoading: state.isLoading,\n isLoadingHistory: state.isLoadingHistory,\n historyState: { ...state.historyState },\n conversations: state.order\n .map((id) => state.byId[id])\n .filter((conversation): conversation is Conversation => Boolean(conversation))\n .map((conversation) => cloneConversation(conversation)),\n };\n}\n","import type { Conversation, ErrorMessage, MessagesItem, Role, TextMessage, ThoughtMessage, ToolMessage, UIRenderMessage } from \"../types\";\nimport { nowIso } from \"./utils\";\n\nexport type MessageHandler = (\n conv: Conversation,\n part: any,\n id: string,\n role: Role,\n status?: any\n) => Conversation;\n\nexport const handlers: Record<string, MessageHandler> = {\n \"text-content\": (conv, part, id, role, status) => {\n if (!id) return conv;\n const existing = conv.messages.find((message) => message.messageId === id);\n const newText = part.text || \"\";\n\n if (existing && \"content\" in existing) {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id\n ? ({ ...message, content: (message as TextMessage).content + newText } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"text-content\",\n content: newText,\n timestamp: status?.timestamp || nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n thought: (conv, part, id, role, status) => {\n if (!id) return conv;\n const newChunk = part?.data?.description || \"\";\n const existing = conv.messages.find((message) => message.messageId === id);\n\n if (existing && \"thought\" in existing) {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id\n ? ({ ...message, thought: (message as ThoughtMessage).thought + newChunk } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"thought\",\n thought: newChunk,\n timestamp: status?.timestamp || nowIso(),\n } as ThoughtMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n tool: (conv, part, _id, role, status) => {\n const partData = part?.data || {};\n const tool = partData?.tool;\n const name = tool?.displayName || tool?.name || \"\";\n const request = partData?.request;\n const id = request?.callId;\n if (!id || !name) return conv;\n\n const toolStatus = partData?.status;\n const existing = conv.messages.find((message) => message.messageId === id);\n\n if (existing && \"toolStatus\" in existing) {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id\n ? ({\n ...message,\n toolStatus: toolStatus || (message as ToolMessage).toolStatus,\n } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"tool\",\n toolName: name,\n toolDescription: request?.args?.query || \"\",\n toolStatus: toolStatus || \"pending\",\n timestamp: status?.timestamp || nowIso(),\n } as ToolMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n error: (conv, part, id, role) => {\n const errorMsg = part?.text || part?.data?.error || \"发生错误\";\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id || `error-${Date.now()}`,\n role,\n kind: \"error\",\n content: errorMsg,\n timestamp: nowIso(),\n } as ErrorMessage,\n ],\n status: \"error\",\n lastUpdated: nowIso(),\n };\n },\n\n \"ui-render\": (conv, part, id, role, status) => {\n if (!id) return conv;\n const existing = conv.messages.find((message) => message.messageId === id);\n const partData = part?.data || {};\n const spec = partData.spec || { root: \"\", elements: {} };\n\n if (existing && existing.kind === \"ui-render\") {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message.messageId === id ? ({ ...(message as UIRenderMessage), spec } as MessagesItem) : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"ui-render\",\n spec,\n timestamp: status?.timestamp || nowIso(),\n } as UIRenderMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n};\n\nexport function getKind(part: any, metadata?: any) {\n if (part?.data?.tool) return \"tool\";\n if (part?.data?.type === \"ui\") return \"ui-render\";\n if (part?.kind === \"text\") return \"text-content\";\n if (part?.data?.type === \"though\" || metadata?.coderAgent?.kind === \"thought\") return \"thought\";\n if (metadata?.error) return \"error\";\n return \"unknown\";\n}\n","export { getMiniProgramRequest, resolveMiniProgramGlobals } from \"@amaster.ai/http-client\";\nimport { resolveMiniProgramGlobals } from \"@amaster.ai/http-client\";\n\nfunction isKnownMiniProgramEnv(env: unknown, envType?: Record<string, unknown>): boolean {\n if (typeof env === \"string\") {\n const normalizedEnv = env.trim().toUpperCase();\n if (\n normalizedEnv === \"TT\" ||\n normalizedEnv === \"DOUYIN\" ||\n normalizedEnv === \"WEAPP\" ||\n normalizedEnv === \"WECHAT\"\n ) {\n return true;\n }\n }\n\n if (!envType) {\n return false;\n }\n\n return (\n (typeof envType.TT !== \"undefined\" && env === envType.TT) ||\n (typeof envType.WEAPP !== \"undefined\" && env === envType.WEAPP)\n );\n}\n\nexport function isMiniProgramRuntime(): boolean {\n const runtime = resolveMiniProgramGlobals();\n if (isKnownMiniProgramEnv(runtime?.Taro?.getEnv?.(), runtime?.Taro?.ENV_TYPE)) {\n return true;\n }\n\n return (\n typeof runtime?.wx?.request === \"function\" ||\n typeof runtime?.tt?.request === \"function\" ||\n typeof runtime?.my?.request === \"function\" ||\n typeof runtime?.swan?.request === \"function\" ||\n typeof runtime?.qq?.request === \"function\" ||\n typeof runtime?.jd?.request === \"function\"\n );\n}\n\nexport function supportsChunkedRequest(): boolean {\n const runtime = resolveMiniProgramGlobals();\n if (typeof runtime?.tt?.request === \"function\" || typeof runtime?.tt?.createEventSource === \"function\") {\n return false;\n }\n\n return true;\n}\n\nexport function supportsDouyinEventSource(): boolean {\n const runtime = resolveMiniProgramGlobals();\n return typeof runtime?.tt?.createEventSource === \"function\";\n}\n","import type {\n Message1,\n SendStreamingMessageResponse,\n SendStreamingMessageSuccessResponse,\n TextPart,\n} from \"@a2a-js/sdk\";\nimport { handlers, type MessageHandler, getKind } from \"./controller/message-handlers\";\nimport {\n cloneConversation,\n createAbortController,\n createSnapshot,\n generateId,\n nowIso,\n type InternalState,\n type SimpleAbortController,\n} from \"./controller/utils\";\nimport { getMiniProgramRequest, supportsDouyinEventSource } from \"./runtime/platform\";\nimport type {\n Conversation,\n ConversationController,\n ConversationControllerOptions,\n ConversationRuntimeError,\n ConversationRuntimeFactory,\n MessagesItem,\n TextMessage,\n ThoughtMessage,\n ToolMessage,\n} from \"./types\";\n\nexport type {\n Role,\n TextMessage,\n ErrorMessage,\n ThoughtMessage,\n ToolMessage,\n UIRenderMessage,\n MessagesItem,\n Conversation,\n HistoryState,\n ConversationRequestState,\n ConversationRuntimeError,\n UpdateMessageInput,\n ConversationControllerSnapshot,\n ConversationStrings,\n ConversationControllerOptions,\n ConversationController,\n} from \"./types\";\n\nexport function createConversationController(\n copilot: ConversationRuntimeFactory,\n options: ConversationControllerOptions\n): ConversationController {\n const mode = options.mode || \"conversation\";\n const isSingleTurnMode = mode === \"single-turn\";\n const shouldLoadHistoryOnInit = !isSingleTurnMode;\n const shouldResumeOnInit = !isSingleTurnMode;\n const resolveContextId = () =>\n options.getContextId?.() ??\n copilot.createContextId(isSingleTurnMode ? \"single-turn\" : \"conversation\");\n\n const state: InternalState = {\n byId: {},\n order: [],\n starting: true,\n isLoading: false,\n isLoadingHistory: false,\n historyState: {\n next: null,\n hasMore: false,\n },\n };\n\n const listeners = new Set<(snapshot: ReturnType<typeof createSnapshot>) => void>();\n let activeAbortController: AbortController | SimpleAbortController | null = null;\n let activeRunPromise: Promise<void> | null = null;\n let currentStreamingTaskId: string | null = null;\n let lastMessageType = \"unknown\";\n let lastMessageId = \"\";\n let initPromise: Promise<void> | null = null;\n let destroyed = false;\n let currentContextId = resolveContextId();\n let sessionRuntime = copilot.createScopedRuntime(currentContextId);\n let activeRequestConversationId: string | null = null;\n\n const emit = () => {\n if (destroyed) return;\n const snapshot = createSnapshot(state);\n listeners.forEach((listener) => listener(snapshot));\n };\n\n const removeTaskFromOrder = (taskId: string) => {\n state.order = state.order.filter((id) => id !== taskId);\n };\n\n const pushTaskToOrder = (taskId: string, append = true) => {\n removeTaskFromOrder(taskId);\n state.order = append ? [...state.order, taskId] : [taskId, ...state.order];\n };\n\n const clearRuntimeMessageState = () => {\n lastMessageType = \"unknown\";\n lastMessageId = \"\";\n };\n\n const isNetworkError = (error: unknown) => {\n const payload = (error && typeof error === \"object\" ? error : {}) as Record<string, unknown>;\n const message = String(payload.message || payload.errMsg || \"\").toLowerCase();\n const errorCode = String(payload.errorCode || \"\");\n const errNo = String(payload.errNo || \"\");\n\n return (\n payload.name === \"TypeError\" ||\n /failed to fetch|fetch failed|timed out|disconnected|offline|断网/.test(message) ||\n [\"600009\", \"21101\", \"21102\", \"21103\"].includes(errorCode) ||\n [\"600009\", \"21101\", \"21102\", \"21103\"].includes(errNo)\n );\n };\n\n const createRuntimeError = (\n error: unknown,\n source: \"send\" | \"stream\" | \"recovery\" = \"stream\"\n ): ConversationRuntimeError => {\n const payload = (error && typeof error === \"object\" ? error : {}) as Record<string, unknown>;\n const message = String(payload.message || payload.errMsg || \"\").toLowerCase();\n return {\n code: isNetworkError(error) ? \"network\" : \"unknown\",\n message,\n retryable: true,\n source,\n timestamp: nowIso(),\n };\n };\n\n const updateConversationRequestMeta = (\n taskId: string | null | undefined,\n input: {\n requestState?: \"idle\" | \"submitting\" | \"streaming\" | \"recovering\" | \"error\";\n runtimeError?: ReturnType<typeof createRuntimeError> | null;\n status?: Conversation[\"status\"];\n }\n ) => {\n if (!taskId) return;\n const conversation = state.byId[taskId];\n if (!conversation) return;\n\n state.byId[taskId] = {\n ...conversation,\n requestState: input.requestState ?? conversation.requestState,\n runtimeError:\n input.runtimeError === undefined ? conversation.runtimeError : input.runtimeError,\n status: input.status ?? conversation.status,\n lastUpdated: nowIso(),\n };\n };\n\n const clearConversationRuntimeState = (taskId: string | null | undefined) => {\n updateConversationRequestMeta(taskId, {\n requestState: \"idle\",\n runtimeError: null,\n });\n };\n\n const resetState = () => {\n state.byId = {};\n state.order = [];\n state.historyState = {\n next: null,\n hasMore: false,\n };\n };\n\n const setLoading = (status: boolean) => {\n state.isLoading = status;\n !status && removeLoadingPlaceholder();\n };\n\n const refreshContextId = () => {\n currentContextId = resolveContextId();\n sessionRuntime = copilot.createScopedRuntime(currentContextId);\n return currentContextId;\n };\n\n const abortActiveSession = () => {\n activeAbortController?.abort();\n activeAbortController = null;\n activeRunPromise = null;\n clearConversationRuntimeState(activeRequestConversationId);\n setLoading(false);\n emit();\n };\n\n const handleEnd = () => {\n clearRuntimeMessageState();\n clearConversationRuntimeState(activeRequestConversationId);\n if (activeRequestConversationId) {\n updateConversationRequestMeta(activeRequestConversationId, {\n status: \"completed\",\n });\n }\n activeRequestConversationId = null;\n currentStreamingTaskId = null;\n activeAbortController = null;\n activeRunPromise = null;\n setLoading(false);\n emit();\n };\n\n const addConversation = (conversation: Conversation) => {\n state.byId[conversation.taskId] = conversation;\n pushTaskToOrder(conversation.taskId, true);\n emit();\n };\n\n const clearConversation = (taskId: string) => {\n if (!state.byId[taskId]) return;\n delete state.byId[taskId];\n removeTaskFromOrder(taskId);\n emit();\n };\n\n const addLoadingPlaceholder = () => {\n addConversation({\n taskId: \"loading-placeholder\",\n status: \"working\",\n messages: [\n {\n messageId: \"loading-placeholder\",\n role: \"assistant\",\n kind: \"text-content\",\n content: options.strings.thinking,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n });\n };\n\n const removeLoadingPlaceholder = () => {\n clearConversation(\"loading-placeholder\");\n };\n\n const fillData = ({\n kind,\n taskId,\n part,\n status,\n handler,\n isHistory,\n historyId,\n messageId,\n }: {\n kind: string;\n taskId: string;\n part: any;\n status: any;\n handler: MessageHandler;\n isHistory?: boolean;\n historyId?: string;\n messageId?: string;\n }) => {\n let id = messageId || lastMessageId;\n const role = status?.message?.role === \"agent\" ? \"assistant\" : \"user\";\n\n if (!messageId && (kind === \"ui-render\" || (kind !== \"unknown\" && kind !== lastMessageType))) {\n lastMessageType = kind;\n id = generateId();\n lastMessageId = id;\n }\n\n const prevConversation =\n state.byId[taskId] ??\n ({\n taskId,\n status: isHistory ? \"completed\" : \"submitted\",\n messages: [],\n role,\n historyId,\n lastUpdated: nowIso(),\n } as Conversation);\n\n const nextConversation = handler(prevConversation, part, id, role, status);\n state.byId[taskId] = {\n ...nextConversation,\n status: status?.state || prevConversation.status,\n lastUpdated: nowIso(),\n };\n\n if (!isHistory) {\n pushTaskToOrder(taskId, true);\n }\n\n emit();\n };\n\n const onSendError = (\n error?: unknown,\n source: \"send\" | \"stream\" | \"recovery\" = \"stream\",\n requestConversationId: string | null | undefined = activeRequestConversationId\n ) => {\n updateConversationRequestMeta(requestConversationId, {\n requestState: \"error\",\n runtimeError: createRuntimeError(error, source),\n status: \"error\",\n });\n if (requestConversationId && activeRequestConversationId === requestConversationId) {\n activeRequestConversationId = null;\n }\n setLoading(false);\n emit();\n };\n\n const processLiveData = (data: SendStreamingMessageResponse) => {\n if (!(data as any)?.result) return;\n const result = (data as SendStreamingMessageSuccessResponse).result as any;\n const { taskId, status, metadata, final } = result;\n\n if (final) {\n handleEnd();\n return;\n }\n\n if (!taskId) return;\n\n currentStreamingTaskId = taskId;\n const firstPart = status?.message?.parts?.[0];\n const kind = getKind(firstPart, metadata);\n const handler = handlers[kind];\n if (!handler) return;\n\n removeLoadingPlaceholder();\n fillData({\n kind,\n taskId,\n part: firstPart,\n status,\n handler,\n });\n };\n\n const processHistoryData = (data: Message1, taskId: string) => {\n const { messageId, historyId } = (data || {}) as any;\n if (!messageId) return;\n\n const firstPart = data.parts?.[0];\n const kind = getKind(firstPart);\n\n if (kind === \"text-content\") {\n let text = (firstPart as TextPart).text || \"\";\n text = text.trim();\n if (text.startsWith(\"<ui>\")) {\n const json = text.slice(4).trim();\n try {\n const partData = JSON.parse(json);\n if (partData.root && partData.elements) {\n fillData({\n kind: \"ui-render\",\n taskId,\n part: { kind: \"data\", data: { type: \"ui\", spec: partData } },\n handler: handlers[\"ui-render\"]!,\n isHistory: true,\n historyId,\n messageId,\n status: { message: data },\n });\n }\n } catch {\n // ignore invalid history ui payload\n }\n return;\n }\n }\n\n const handler = handlers[kind];\n if (!handler) return;\n\n fillData({\n kind,\n taskId,\n part: firstPart,\n handler,\n isHistory: true,\n historyId,\n messageId,\n status: { message: data },\n });\n };\n\n const runSession = async (\n messages: Array<{ role: \"system\" | \"user\" | \"assistant\"; content: string }>,\n chatOptions?: { taskId?: string },\n showLoadingPlaceholder = false,\n recoveryAttempt = 0,\n preferMiniProgramRequest = false,\n requestConversationId: string | null = activeRequestConversationId\n ) => {\n activeRequestConversationId = requestConversationId;\n abortActiveSession();\n clearRuntimeMessageState();\n updateConversationRequestMeta(requestConversationId, {\n requestState: \"submitting\",\n runtimeError: null,\n status: \"submitted\",\n });\n\n const abortController = createAbortController() as AbortController | SimpleAbortController;\n activeAbortController = abortController;\n\n if (showLoadingPlaceholder) {\n addLoadingPlaceholder();\n setLoading(true);\n emit();\n }\n\n let hasResponse = false;\n let streamFailed = false;\n let streamAborted = false;\n let finalReceived = false;\n let lastTaskId = chatOptions?.taskId || null;\n\n const runPromise = sessionRuntime.sendMessage(messages, {\n taskId: chatOptions?.taskId,\n signal: abortController.signal,\n preferMiniProgramRequest,\n onMessage: (message) => {\n const responseTaskId = (message as any)?.result?.taskId;\n const responseFinal = Boolean((message as any)?.result?.final);\n if (responseTaskId) {\n lastTaskId = responseTaskId;\n }\n if (responseFinal) {\n finalReceived = true;\n }\n hasResponse = true;\n updateConversationRequestMeta(requestConversationId, {\n requestState: responseFinal ? \"idle\" : \"streaming\",\n runtimeError: null,\n status: responseFinal ? \"completed\" : \"working\",\n });\n processLiveData(message);\n },\n onClose: () => {},\n });\n activeRunPromise = runPromise;\n\n const recovery = async () => {\n const isDouyinMiniProgram = supportsDouyinEventSource() && !!getMiniProgramRequest();\n const canRecover =\n isDouyinMiniProgram && !streamAborted && !finalReceived && recoveryAttempt < 2;\n if (canRecover) {\n console.log(\"[recovering]\");\n updateConversationRequestMeta(requestConversationId, {\n requestState: \"recovering\",\n runtimeError: null,\n status: \"working\",\n });\n emit();\n try {\n const status = await sessionRuntime.getChatStatus(lastTaskId || undefined);\n\n if (status.working && status.taskId) {\n currentStreamingTaskId = status.taskId;\n await runSession(\n [],\n { taskId: status.taskId },\n true,\n recoveryAttempt + 1,\n true,\n requestConversationId\n );\n return true;\n }\n\n if (!hasResponse && !lastTaskId && !status.taskId && recoveryAttempt < 1) {\n await runSession(\n messages,\n chatOptions,\n true,\n recoveryAttempt + 1,\n true,\n requestConversationId\n );\n return true;\n }\n } catch (recoveryError) {\n console.error(\"[ConversationController] recovery failed:\", recoveryError);\n onSendError(recoveryError, \"recovery\", requestConversationId);\n return true;\n }\n }\n\n return false;\n };\n\n let streamError: unknown;\n let recovered = false;\n try {\n await runPromise;\n } catch (error) {\n if ((error as Error)?.name === \"AbortError\" || abortController.signal.aborted) {\n streamAborted = true;\n } else {\n streamFailed = true;\n streamError = error;\n console.error(\"[ConversationController] Stream error:\", error);\n }\n } finally {\n if (activeRunPromise === runPromise) {\n activeRunPromise = null;\n }\n if (activeAbortController === abortController) {\n activeAbortController = null;\n }\n\n recovered = await recovery();\n }\n\n if (recovered) {\n return;\n }\n\n if (streamFailed) {\n onSendError(streamError, \"stream\", requestConversationId);\n } else if (!hasResponse && showLoadingPlaceholder && !streamAborted) {\n onSendError(streamError, \"send\", requestConversationId);\n } else if (streamAborted) {\n clearConversationRuntimeState(requestConversationId);\n if (requestConversationId && activeRequestConversationId === requestConversationId) {\n activeRequestConversationId = null;\n }\n setLoading(false);\n emit();\n } else if (finalReceived && state.isLoading) {\n handleEnd();\n } else if (!finalReceived && state.isLoading) {\n onSendError(undefined, \"stream\", requestConversationId);\n }\n };\n\n return {\n getSnapshot() {\n return createSnapshot(state);\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n\n async init() {\n if (destroyed) return;\n if (initPromise) return initPromise;\n\n state.starting = true;\n emit();\n\n initPromise = (async () => {\n try {\n if (shouldLoadHistoryOnInit) {\n await this.loadHistory();\n }\n if (shouldResumeOnInit) {\n const result = await sessionRuntime.getChatStatus();\n if (result.taskId && result.working) {\n currentStreamingTaskId = result.taskId;\n await runSession([], { taskId: result.taskId }, false);\n }\n }\n } catch (error) {\n console.error(\"[ConversationController] init failed:\", error);\n } finally {\n state.starting = false;\n emit();\n initPromise = null;\n }\n })();\n\n return initPromise;\n },\n\n destroy() {\n destroyed = true;\n abortActiveSession();\n listeners.clear();\n },\n\n async sendMessage(userContent: string) {\n if (state.isLoading || !userContent.trim()) return;\n\n if (isSingleTurnMode) {\n this.abort();\n resetState();\n clearRuntimeMessageState();\n currentStreamingTaskId = null;\n refreshContextId();\n }\n\n const localTaskId = generateId();\n activeRequestConversationId = localTaskId;\n\n addConversation({\n taskId: localTaskId,\n status: \"submitted\",\n requestState: \"submitting\",\n runtimeError: null,\n messages: [\n {\n messageId: generateId(),\n role: \"user\",\n kind: \"text-content\",\n content: userContent,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n });\n\n try {\n await runSession(\n [{ role: \"user\", content: userContent }],\n undefined,\n true,\n 0,\n false,\n localTaskId\n );\n } catch (error) {\n if ((error as Error).name === \"AbortError\") return;\n onSendError(error, \"send\", localTaskId);\n }\n },\n\n abort() {\n const wasAborted = activeAbortController?.signal.aborted;\n abortActiveSession();\n clearRuntimeMessageState();\n clearConversationRuntimeState(activeRequestConversationId);\n activeRequestConversationId = null;\n currentStreamingTaskId = null;\n removeLoadingPlaceholder();\n if (!wasAborted) {\n void Promise.resolve();\n }\n },\n\n async cancelChat(taskId?: string) {\n const targetTaskId = taskId || currentStreamingTaskId;\n this.abort();\n\n addConversation({\n taskId: generateId(),\n status: \"error\",\n messages: [\n {\n messageId: `cancel-${Date.now()}`,\n role: \"assistant\",\n kind: \"text-content\",\n content: options.strings.cancelled,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n });\n\n if (!targetTaskId) return;\n\n try {\n await sessionRuntime.cancelChat(targetTaskId);\n currentStreamingTaskId = null;\n } catch (error) {\n console.error(\"[ConversationController] cancel failed:\", error);\n }\n },\n\n resetConversation(greeting?: string) {\n this.abort();\n resetState();\n activeRequestConversationId = null;\n currentStreamingTaskId = null;\n clearRuntimeMessageState();\n if (isSingleTurnMode) {\n refreshContextId();\n }\n\n if (greeting) {\n const taskId = `conv-${Date.now()}`;\n state.byId[taskId] = {\n taskId,\n status: \"submitted\",\n messages: [\n {\n messageId: `greeting-${Date.now()}`,\n role: \"assistant\",\n kind: \"text-content\",\n content: greeting,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n };\n state.order = [taskId];\n }\n\n emit();\n },\n\n async startNewConversation() {\n addConversation({\n taskId: generateId(),\n status: \"submitted\",\n messages: [],\n lastUpdated: nowIso(),\n system: { level: \"newConversation\" },\n });\n\n try {\n await sessionRuntime.newConversation();\n } catch (error) {\n console.error(\"[ConversationController] newConversation failed:\", error);\n }\n },\n\n async loadHistory(limit = 20, next?: string) {\n state.isLoadingHistory = true;\n emit();\n\n try {\n const result = await sessionRuntime.getHistory(limit, next);\n const messages = result?.messages || [];\n\n let taskId = \"\";\n let lastRole = \"\";\n const taskIds: string[] = [];\n\n messages.forEach((message: any) => {\n const role = message.role === \"agent\" ? \"assistant\" : \"user\";\n if (role !== lastRole) {\n taskId = `history-conv-${generateId()}`;\n taskIds.push(taskId);\n lastRole = role;\n }\n processHistoryData(message, taskId);\n });\n\n state.order = [...taskIds, ...state.order.filter((id) => !taskIds.includes(id))];\n state.historyState = {\n next: result?.next || null,\n hasMore: result?.hasMore || false,\n };\n } catch (error) {\n console.error(\"[ConversationController] loadHistory failed:\", error);\n } finally {\n state.isLoadingHistory = false;\n emit();\n }\n },\n\n async loadMoreHistory() {\n if (!state.historyState.hasMore || state.isLoadingHistory || !state.historyState.next) return;\n await this.loadHistory(20, state.historyState.next);\n },\n\n getConversation(taskId: string) {\n const conversation = state.byId[taskId];\n return conversation ? cloneConversation(conversation) : undefined;\n },\n\n clearConversation(taskId: string) {\n clearConversation(taskId);\n },\n\n removeMessage(taskId: string, messageId: string) {\n const conversation = state.byId[taskId];\n if (!conversation) return;\n\n state.byId[taskId] = {\n ...conversation,\n messages: conversation.messages.filter((message) => message.messageId !== messageId),\n lastUpdated: nowIso(),\n };\n pushTaskToOrder(taskId, true);\n emit();\n },\n\n updateMessage(input) {\n const {\n taskId,\n messageId,\n content,\n partial = false,\n status,\n response,\n metadata = {},\n } = input;\n const conversation = state.byId[taskId];\n if (!conversation) return;\n\n const messageIndex = conversation.messages.findIndex(\n (message) => message.messageId === messageId\n );\n if (messageIndex === -1) return;\n\n const oldMessage = conversation.messages[messageIndex];\n if (!oldMessage) return;\n\n const updatedMessage: MessagesItem = { ...oldMessage, ...metadata } as MessagesItem;\n\n if (content !== undefined) {\n if (\"content\" in updatedMessage) {\n updatedMessage.content = partial\n ? `${(updatedMessage as TextMessage).content || \"\"}${content}`\n : content;\n } else if (\"thought\" in updatedMessage) {\n updatedMessage.thought = partial\n ? `${(updatedMessage as ThoughtMessage).thought || \"\"}${content}`\n : content;\n } else if (oldMessage.kind === \"text-content\") {\n (updatedMessage as TextMessage).content = partial\n ? `${(oldMessage as TextMessage).content || \"\"}${content}`\n : content;\n }\n }\n\n if (\"toolStatus\" in updatedMessage || status) {\n (updatedMessage as ToolMessage).toolStatus =\n status || (updatedMessage as ToolMessage).toolStatus;\n }\n if (response !== undefined) {\n (updatedMessage as ToolMessage).response = response;\n }\n\n const nextMessages = [...conversation.messages];\n nextMessages[messageIndex] = updatedMessage;\n\n state.byId[taskId] = {\n ...conversation,\n messages: nextMessages,\n lastUpdated: nowIso(),\n };\n pushTaskToOrder(taskId, true);\n emit();\n },\n };\n}\n","import { isMiniProgramRuntime } from \"./platform\";\n\nexport type ContextIdMode = \"conversation\" | \"single-turn\";\n\nfunction generateUUID(): string {\n const cryptoObj = typeof globalThis !== \"undefined\" ? globalThis.crypto : undefined;\n\n if (cryptoObj && typeof cryptoObj.randomUUID === \"function\") {\n return cryptoObj.randomUUID();\n }\n\n if (cryptoObj && typeof cryptoObj.getRandomValues === \"function\") {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (char) => {\n const randomValues = cryptoObj.getRandomValues(new Uint8Array(1));\n const random = (randomValues[0] ?? 0) % 16;\n const value = char === \"x\" ? random : (random & 0x3) | 0x8;\n return value.toString(16);\n });\n }\n\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (char) => {\n const random = (Math.random() * 16) | 0;\n const value = char === \"x\" ? random : (random & 0x3) | 0x8;\n return value.toString(16);\n });\n}\n\nfunction getAppIdFromHostname(hostname: string): string | null {\n const wwwMatch = /^www\\.([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (wwwMatch?.[1]) return wwwMatch[1];\n\n const domainMatch = /^([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (domainMatch?.[1]) return domainMatch[1];\n\n return null;\n}\n\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") return null;\n\n try {\n const url = window.location.href;\n const pathMatch = /\\/app\\/([\\da-z-]+)(?:\\/|$)/.exec(url);\n if (pathMatch?.[1]) return pathMatch[1];\n return getAppIdFromHostname(window.location.hostname);\n } catch {\n return null;\n }\n}\n\nlet cachedAppId: string | null = null;\nlet cachedAnonymousUid: string | null = null;\n\nfunction getAppId(hostname?: string): string {\n const urlAppId = hostname ? getAppIdFromHostname(hostname) : extractAppIdFromUrl();\n if (urlAppId) return urlAppId;\n if (!cachedAppId) cachedAppId = generateUUID();\n return cachedAppId;\n}\n\nexport function createContextIdResolver(url: string, getUserUid?: () => string | null) {\n const createContextId = createContextIdFactory(url, getUserUid);\n return () => {\n return createContextId(\"conversation\");\n };\n}\n\nexport function createContextIdFactory(url: string, getUserUid?: () => string | null) {\n return (mode: ContextIdMode = \"conversation\") => {\n const isMiniProgram = isMiniProgramRuntime();\n let appId = getAppId();\n\n if (isMiniProgram) {\n const hostname = url ? url.replace(/^https?:\\/\\//, \"\").split(\"/\")[0] : \"\";\n appId = getAppId(hostname);\n }\n\n const userUid = getUserUid?.() ?? (cachedAnonymousUid ??= `anonymous-${generateUUID()}`);\n const baseContextId = `${appId}:${userUid}`;\n\n if (mode === \"single-turn\") {\n return `${baseContextId}:${generateUUID()}`;\n }\n\n return baseContextId;\n };\n}\n\nexport { generateUUID };\n","import type { Part } from \"@a2a-js/sdk\";\nimport type { MessageContent, TextContent } from \"../types\";\n\nexport function convertToA2AParts(content: string | MessageContent[]): Part[] {\n if (typeof content === \"string\") {\n return [{ kind: \"text\", text: content }];\n }\n\n return content\n .map((part): Part | null => {\n switch (part.type) {\n case \"text\":\n return { kind: \"text\", text: part.text };\n case \"image\":\n if (part.data) {\n return {\n kind: \"file\",\n file: {\n bytes: part.data,\n mimeType: part.mimeType || \"image/png\",\n },\n };\n }\n if (part.url) {\n return {\n kind: \"file\",\n file: { uri: part.url, mimeType: part.mimeType || \"image/png\" },\n };\n }\n return null;\n case \"file\":\n if (part.data) {\n return {\n kind: \"file\",\n file: {\n bytes: part.data,\n ...(part.mimeType && { mimeType: part.mimeType }),\n ...(part.name && { name: part.name }),\n },\n };\n }\n if (part.url) {\n return {\n kind: \"file\",\n file: {\n uri: part.url,\n ...(part.mimeType && { mimeType: part.mimeType }),\n ...(part.name && { name: part.name }),\n },\n };\n }\n return null;\n default:\n return null;\n }\n })\n .filter((part): part is Part => part !== null);\n}\n\nexport function extractTextFromContent(content: string | MessageContent[]): string {\n if (typeof content === \"string\") {\n return content;\n }\n return content\n .filter((part): part is TextContent => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\");\n}\n","import type { ContextIdMode } from \"./context\";\nimport type { ConversationRuntime, ConversationRuntimeFactory } from \"../types\";\n\nexport function createSessionRuntimeFactory(args: {\n createContextId: (mode?: ContextIdMode) => string;\n createRuntime: (contextId: string) => ConversationRuntime;\n}): ConversationRuntimeFactory {\n return {\n createContextId(mode) {\n return args.createContextId(mode);\n },\n createScopedRuntime(contextId: string) {\n return args.createRuntime(contextId);\n },\n };\n}\n","import type {\n CancelTaskRequest,\n CancelTaskResponse,\n SendStreamingMessageRequest,\n} from \"@a2a-js/sdk\";\nimport type { ConversationRuntime, ConversationRuntimeFactory } from \"../types\";\nimport { generateUUID, type ContextIdMode } from \"./context\";\nimport { convertToA2AParts, extractTextFromContent } from \"./message-content\";\nimport { createSessionRuntimeFactory } from \"./session-runtime\";\nimport type { StreamHandlers } from \"./stream\";\n\ninterface CreateCopilotRuntimeFactoryArgs {\n createContextId: (mode?: ContextIdMode) => string;\n postRpc: (data: unknown) => Promise<unknown>;\n sendMessageStream: (\n request: SendStreamingMessageRequest,\n handlers: StreamHandlers,\n signal?: ConversationRuntimeSendSignal,\n preferMiniProgramRequest?: boolean,\n ) => Promise<void>;\n}\n\ntype ConversationRuntimeSendSignal = Parameters<ConversationRuntime[\"sendMessage\"]>[1][\"signal\"];\n\nexport function createCopilotRuntimeFactory({\n createContextId,\n postRpc,\n sendMessageStream,\n}: CreateCopilotRuntimeFactoryArgs): ConversationRuntimeFactory {\n return createSessionRuntimeFactory({\n createContextId,\n createRuntime(contextId: string): ConversationRuntime {\n return {\n async sendMessage(messages, options) {\n const { taskId, signal, onOpen, onMessage, onClose, preferMiniProgramRequest } = options;\n const systemMsg = messages.find((message) => message.role === \"system\");\n const nonSystemMsgs = messages.filter((message) => message.role !== \"system\");\n const lastUserMsg = nonSystemMsgs[nonSystemMsgs.length - 1];\n\n const parts = lastUserMsg\n ? convertToA2AParts(lastUserMsg.content)\n : [{ kind: \"text\" as const, text: \"\" }];\n\n const systemPrompt = systemMsg ? extractTextFromContent(systemMsg.content) : undefined;\n\n const request: SendStreamingMessageRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"message/stream\",\n params: {\n message: {\n contextId,\n kind: \"message\",\n messageId: generateUUID(),\n role: \"user\",\n parts,\n ...(taskId ? { taskId } : {}),\n ...(systemPrompt ? { metadata: { systemPrompt } } : {}),\n },\n },\n };\n\n await sendMessageStream(\n request,\n { onOpen, onMessage, onClose },\n signal,\n preferMiniProgramRequest\n );\n },\n\n cancelChat(taskId) {\n const request: CancelTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/cancel\",\n params: { id: taskId },\n };\n return postRpc(request) as Promise<CancelTaskResponse>;\n },\n\n async getHistory(limit = 50, next?: string) {\n try {\n const response: any = await postRpc({\n jsonrpc: \"2.0\",\n method: \"messages/list\",\n id: generateUUID(),\n params: {\n filter: { contextId },\n limit,\n ...(next ? { next } : {}),\n },\n });\n const result = response?.data?.result || {};\n const messages = result?.messages || [];\n const cursor = result?.next || \"\";\n\n return {\n messages,\n next: cursor,\n hasMore: !!cursor,\n };\n } catch {\n return undefined;\n }\n },\n\n async newConversation() {\n try {\n await postRpc({\n jsonrpc: \"2.0\",\n method: \"messages/clear\",\n id: generateUUID(),\n params: { contextId },\n });\n } catch {\n // noop\n }\n },\n\n async getChatStatus(taskId) {\n try {\n const request = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/get\",\n params: taskId ? { id: taskId } : { contextId },\n };\n const result: any = await postRpc(request);\n const data = result?.data?.result;\n return {\n working: data?.status?.state === \"working\",\n taskId: data?.id,\n error: data?.error?.message || \"\",\n };\n } catch (error) {\n return {\n working: false,\n error: (error as any)?.message || \"\",\n };\n }\n },\n };\n },\n });\n}\n","import { createParser } from \"eventsource-parser\";\nimport type { SendStreamingMessageResponse } from \"@a2a-js/sdk\";\nimport type { AbortSignalLike } from \"../../types\";\n\nexport interface StreamHandlers {\n onOpen?: () => void;\n onMessage: (message: SendStreamingMessageResponse) => void;\n onClose?: () => void;\n}\n\nexport function normalizeStreamError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (error && typeof error === \"object\") {\n const payload = error as Record<string, unknown>;\n const message =\n (typeof payload.errMsg === \"string\" && payload.errMsg) ||\n (typeof payload.message === \"string\" && payload.message) ||\n JSON.stringify(payload);\n const normalized = new Error(message);\n if (typeof payload.errorCode === \"number\" || typeof payload.errorCode === \"string\") {\n (normalized as any).errorCode = payload.errorCode;\n }\n if (typeof payload.errNo === \"number\" || typeof payload.errNo === \"string\") {\n (normalized as any).errNo = payload.errNo;\n }\n (normalized as any).raw = error;\n return normalized;\n }\n\n return new Error(String(error));\n}\n\nexport function createAbortError(): Error {\n if (typeof DOMException !== \"undefined\") {\n return new DOMException(\"Aborted\", \"AbortError\");\n }\n const error = new Error(\"Aborted\");\n error.name = \"AbortError\";\n return error;\n}\n\nexport function createSSEConsumer(handlers: StreamHandlers) {\n return createParser({\n onEvent: (event) => {\n try {\n handlers.onMessage(JSON.parse(event.data));\n } catch (error) {\n console.error(\"[copilot stream] failed to parse SSE event:\", error, event.data);\n }\n },\n });\n}\n\nexport function bindAbortSignal(signal: AbortSignalLike | undefined, onAbort: () => void) {\n if (!signal) return;\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener(\"abort\", onAbort);\n}\n","import type { AbortSignalLike } from \"../../types\";\nimport { createAbortError, createSSEConsumer, type StreamHandlers } from \"./shared\";\n\nexport async function startBrowserStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string>,\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n): Promise<void> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...authHeader,\n };\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify(data),\n signal: signal as AbortSignal | undefined,\n });\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText || response.status}`);\n }\n\n handlers.onOpen?.();\n\n if (!response.body) {\n handlers.onClose?.();\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parser = createSSEConsumer(handlers);\n\n try {\n while (true) {\n if (signal?.aborted) {\n throw createAbortError();\n }\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n parser.feed(decoder.decode(value, { stream: true }));\n }\n } finally {\n handlers.onClose?.();\n }\n}\n","import MiniProgramTextDecoder from \"miniprogram-text-decoder\";\nimport type { AbortSignalLike } from \"../../types\";\nimport { getMiniProgramRequest, supportsChunkedRequest } from \"../platform\";\nimport { bindAbortSignal, createAbortError, createSSEConsumer, normalizeStreamError, type StreamHandlers } from \"./shared\";\n\nfunction decodeMiniProgramArrayBuffer(\n value: ArrayBuffer | Uint8Array | undefined,\n textDecoder: MiniProgramTextDecoder\n): string {\n if (!value) return \"\";\n const buffer = value instanceof Uint8Array ? value : new Uint8Array(value);\n if (buffer.length === 0) return \"\";\n return textDecoder.decode(buffer, { stream: false });\n}\n\nexport async function startMiniProgramStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string> = {},\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let chunkBuffer = new Uint8Array(0);\n const textDecoder = new MiniProgramTextDecoder(\"utf-8\", { fatal: false });\n let sawChunk = false;\n let settled = false;\n let opened = false;\n const parser = createSSEConsumer(handlers);\n\n const finish = (error?: unknown) => {\n if (settled) return;\n settled = true;\n if (error) {\n reject(normalizeStreamError(error));\n return;\n }\n handlers.onClose?.();\n resolve();\n };\n\n const emitOpen = () => {\n if (opened) return;\n opened = true;\n handlers.onOpen?.();\n };\n\n const feedText = (text: string) => {\n if (!text) return;\n emitOpen();\n parser.feed(text);\n };\n\n const chunkListener = (response: any) => {\n if (settled || !response.data) return;\n\n try {\n sawChunk = true;\n const newChunk = new Uint8Array(response.data as ArrayBuffer);\n const merged = new Uint8Array(chunkBuffer.length + newChunk.length);\n merged.set(chunkBuffer);\n merged.set(newChunk, chunkBuffer.length);\n chunkBuffer = merged;\n\n let decodeOffset = 0;\n while (decodeOffset < chunkBuffer.length) {\n const remaining = chunkBuffer.subarray(decodeOffset);\n const decoded = textDecoder.decode(remaining, { stream: false });\n\n if (decoded.length === 0) {\n break;\n }\n\n if (decoded.includes(\"�\")) {\n const lastGoodIndex = decoded.lastIndexOf(\"�\") === 0 ? 0 : decoded.indexOf(\"�\");\n if (lastGoodIndex <= 0) {\n break;\n }\n\n const goodPart = decoded.slice(0, lastGoodIndex);\n if (goodPart) {\n feedText(goodPart);\n }\n\n const encodedGood = new TextEncoder().encode(goodPart);\n decodeOffset += encodedGood.length;\n break;\n }\n\n feedText(decoded);\n decodeOffset += remaining.length;\n }\n\n chunkBuffer = chunkBuffer.subarray(decodeOffset);\n } catch (error) {\n console.error(\"[mini stream] chunk process error:\", error);\n }\n };\n\n const headersListener = (response: any) => {\n emitOpen();\n if (response.header?.[\"content-type\"]?.includes(\"text/event-stream\") === false) {\n console.warn(\"Warning: server did not return event-stream\");\n }\n };\n\n const miniReq = getMiniProgramRequest();\n if (!miniReq) {\n reject(new Error(\"Mini-program request API not found\"));\n return;\n }\n\n try {\n const requestTask = miniReq({\n url,\n method: \"POST\",\n header: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...authHeader,\n },\n data: typeof data === \"string\" ? data : JSON.stringify(data),\n responseType: \"arraybuffer\",\n ...supportsChunkedRequest() ? {\n enableChunked: true\n } : {},\n success: (response: any) => {\n if (!sawChunk && response?.data) {\n const wholeResponse = decodeMiniProgramArrayBuffer(response.data, textDecoder);\n feedText(wholeResponse);\n }\n if (chunkBuffer.length > 0) {\n const finalText = textDecoder.decode(chunkBuffer, { stream: true });\n feedText(finalText);\n }\n finish();\n },\n fail: (error: any) => {\n finish(error);\n },\n });\n\n bindAbortSignal(signal, () => {\n requestTask.abort?.();\n finish(createAbortError());\n });\n\n requestTask.onChunkReceived?.(chunkListener);\n requestTask.onHeadersReceived?.(headersListener);\n } catch (error) {\n finish(error);\n }\n });\n}\n","import type { AbortSignalLike } from \"../../types\";\nimport { getMiniProgramRequest, isMiniProgramRuntime } from \"../platform\";\n// import { supportsDouyinEventSource } from \"../platform\";\nimport { startBrowserStream } from \"./browser\";\n// import { startDouyinEventSourceStream } from \"./douyin\";\nimport { startMiniProgramStream } from \"./mini-program\";\nimport type { StreamHandlers } from \"./shared\";\n\nexport async function startStream(\n url: string,\n data: unknown,\n getAccessToken: (() => string | null) | undefined,\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n preferMiniProgramRequest = false,\n): Promise<void> {\n const token = getAccessToken?.();\n const authHeader: Record<string, string> = token ? { Authorization: `Bearer ${token}` } : {};\n const miniReq = getMiniProgramRequest();\n const canUseMiniProgramStream = isMiniProgramRuntime() && !!miniReq;\n\n if (preferMiniProgramRequest && canUseMiniProgramStream) {\n await startMiniProgramStream(url, data, authHeader, handlers, signal);\n return;\n }\n\n // 抖音小程序的真机流式非常不好用,先注释\n // if (supportsDouyinEventSource()) {\n // await startDouyinEventSourceStream(url, data, authHeader, handlers, signal);\n // return;\n // }\n\n if (canUseMiniProgramStream) {\n await startMiniProgramStream(url, data, authHeader, handlers, signal);\n return;\n }\n\n await startBrowserStream(url, data, authHeader, handlers, signal);\n}\n\nexport type { StreamHandlers } from \"./shared\";\n","/* eslint-disable no-unused-vars */\nimport type { SendStreamingMessageRequest } from \"@a2a-js/sdk\";\nimport type { HttpClient } from \"@amaster.ai/http-client\";\nimport { createConversationController } from \"./conversation-controller\";\nimport { createContextIdFactory } from \"./runtime/context\";\nimport { createCopilotRuntimeFactory } from \"./runtime/copilot-runtime\";\nimport { startStream, type StreamHandlers } from \"./runtime/stream\";\nimport type {\n AbortSignalLike,\n ConversationController,\n ConversationControllerOptions,\n ConversationRuntimeFactory,\n} from \"./types\";\n\nexport type { TextContent, ImageContent, FileContent, MessageContent } from \"./types\";\n\nexport type CopilotClient = {\n createConversationController(options: ConversationControllerOptions): ConversationController;\n};\n\nexport function createCopilotClient(\n http: HttpClient,\n baseUrl?: string,\n getAccessToken?: () => string | null,\n getUserUid?: () => string | null\n): CopilotClient {\n let envBaseUrl = \"\";\n try {\n envBaseUrl =\n process.env.TARO_APP_API_BASE_URL ||\n process.env.VITE_API_BASE_URL ||\n process.env.API_BASE_URL ||\n \"\";\n } catch {\n // process is not defined -> ignore\n }\n\n envBaseUrl = String(envBaseUrl || \"\").trim();\n const url = `${baseUrl || envBaseUrl}/api/proxy/builtin/platform/copilot`;\n\n const postRpc = <T>(data: unknown) =>\n http.request<T>({\n url,\n method: \"POST\",\n data,\n });\n\n const createContextId = createContextIdFactory(url, getUserUid);\n\n async function sendMessageStream(\n request: SendStreamingMessageRequest,\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n preferMiniProgramRequest?: boolean,\n ): Promise<void> {\n try {\n await startStream(\n url,\n request,\n getAccessToken,\n handlers,\n signal,\n preferMiniProgramRequest,\n );\n } catch (error) {\n if (signal?.aborted) {\n return;\n }\n throw error;\n }\n }\n\n const runtime: ConversationRuntimeFactory = createCopilotRuntimeFactory({\n createContextId,\n postRpc,\n sendMessageStream,\n });\n\n return {\n createConversationController(options) {\n return createConversationController(runtime, options);\n },\n };\n}\n","export interface AutoVoiceReplyMessage {\n messageId?: string;\n role?: string;\n kind: string;\n content?: string;\n}\n\nexport interface AutoVoiceReplyConversation {\n taskId: string;\n status: string;\n requestState?: string;\n messages: AutoVoiceReplyMessage[];\n}\n\nexport interface AutoVoiceReplySourceSnapshot {\n conversations: AutoVoiceReplyConversation[];\n isLoading: boolean;\n}\n\nexport interface AutoVoiceReplySource {\n subscribe(listener: () => void): () => void;\n getSnapshot(): AutoVoiceReplySourceSnapshot;\n}\n\nexport interface AutoVoiceReplySpeechSnapshot {\n status: \"idle\" | \"connecting\" | \"speaking\" | \"error\";\n error?: string | null;\n voice?: string | null;\n}\n\nexport interface AutoVoiceReplySpeechDriver {\n subscribe(listener: () => void): () => void;\n getSnapshot(): AutoVoiceReplySpeechSnapshot;\n startStream(input: {\n id: string;\n voice?: string | null;\n audioFormat?: \"pcm\" | \"mp3\" | \"wav\" | \"opus\";\n sampleRate?: number;\n }): Promise<void>;\n appendText(input: { id: string; text: string }): Promise<void>;\n commit(): void;\n finish(): void;\n stop(): void;\n setVoice?(voice: string | null): void;\n getVoice?(): string | null;\n}\n\nexport interface AutoVoiceReplyStorage {\n getItem(key: string): string | null | undefined;\n setItem(key: string, value: string): void;\n}\n\nexport interface AutoVoiceReplySnapshot {\n enabled: boolean;\n status: \"idle\" | \"connecting\" | \"speaking\" | \"error\";\n connecting: boolean;\n speaking: boolean;\n voice: string | null;\n activeTaskId: string | null;\n suppressedTaskId: string | null;\n error: string | null;\n}\n\nexport interface AutoVoiceReplyController {\n subscribe(listener: () => void): () => void;\n getSnapshot(): AutoVoiceReplySnapshot;\n setEnabled(enabled: boolean): void;\n toggleEnabled(): void;\n toggleEnabledOrStop(): void;\n stop(): void;\n setVoice(voice: string | null): void;\n getVoice(): string | null;\n destroy(): void;\n}\n\nexport interface CreateAutoVoiceReplyControllerOptions {\n source: AutoVoiceReplySource;\n speech: AutoVoiceReplySpeechDriver;\n storage?: AutoVoiceReplyStorage;\n enabledStorageKey?: string;\n defaultVoice?: string | null;\n id?: string;\n audioFormat?: \"pcm\" | \"mp3\" | \"wav\" | \"opus\";\n sampleRate?: number;\n preprocessText?: (text: string) => string;\n}\n\nconst STREAM_BREAK_PATTERN = /[\\n。!?.!?;;]/;\nconst STREAM_SOFT_BREAK_PATTERN = /[,、,::]\\s*$/;\nconst STREAM_MIN_COMMIT_LENGTH = 24;\n\nconst getLatestAssistantTextMessageFromConversation = (\n conversation?: AutoVoiceReplyConversation | null,\n) => {\n if (!conversation) {\n return null;\n }\n\n for (let messageIndex = conversation.messages.length - 1; messageIndex >= 0; messageIndex -= 1) {\n const message = conversation.messages[messageIndex];\n\n if (!message) {\n continue;\n }\n\n if (\n message.role === \"assistant\" &&\n (message.kind === \"text-content\" || message.kind === \"message\") &&\n message.content?.trim()\n ) {\n return message;\n }\n }\n\n return null;\n};\n\nconst getLatestUserMessageIdFromConversation = (\n conversation?: AutoVoiceReplyConversation | null,\n) => {\n if (!conversation) {\n return null;\n }\n\n for (let messageIndex = conversation.messages.length - 1; messageIndex >= 0; messageIndex -= 1) {\n const message = conversation.messages[messageIndex];\n\n if (!message) {\n continue;\n }\n\n if (message.role === \"user\" && message.messageId) {\n return message.messageId;\n }\n }\n\n return null;\n};\n\nconst getLatestAssistantTextMessageAfterUser = (\n conversation?: AutoVoiceReplyConversation | null,\n userMessageId?: string | null,\n) => {\n if (!conversation) {\n return null;\n }\n\n if (!userMessageId) {\n return getLatestAssistantTextMessageFromConversation(conversation);\n }\n\n const userIndex = conversation.messages.findIndex(\n (message) => message.messageId === userMessageId,\n );\n\n if (userIndex < 0) {\n return getLatestAssistantTextMessageFromConversation(conversation);\n }\n\n for (let messageIndex = conversation.messages.length - 1; messageIndex > userIndex; messageIndex -= 1) {\n const message = conversation.messages[messageIndex];\n\n if (!message) {\n continue;\n }\n\n if (\n message.role === \"assistant\" &&\n (message.kind === \"text-content\" || message.kind === \"message\") &&\n message.content?.trim()\n ) {\n return message;\n }\n }\n\n return null;\n};\n\nconst getActiveConversation = (conversations: AutoVoiceReplyConversation[]) => {\n for (let index = conversations.length - 1; index >= 0; index -= 1) {\n const conversation = conversations[index];\n\n if (!conversation) {\n continue;\n }\n\n if (\n conversation.requestState === \"submitting\" ||\n conversation.requestState === \"streaming\" ||\n conversation.requestState === \"recovering\" ||\n conversation.status === \"submitted\" ||\n conversation.status === \"working\"\n ) {\n return conversation;\n }\n }\n\n return null;\n};\n\nconst getConversationByTaskId = (\n conversations: AutoVoiceReplyConversation[],\n taskId: string | null,\n) => {\n if (!taskId) {\n return null;\n }\n\n return conversations.find((conversation) => conversation.taskId === taskId) || null;\n};\n\nconst takeCommittedSegments = (buffer: string, final: boolean) => {\n const trimmedBuffer = buffer.trimStart();\n\n if (!trimmedBuffer) {\n return {\n segments: [] as string[],\n remainder: \"\",\n };\n }\n\n if (final) {\n return {\n segments: [trimmedBuffer].filter(Boolean),\n remainder: \"\",\n };\n }\n\n const segments: string[] = [];\n let lastIndex = 0;\n\n for (let index = 0; index < trimmedBuffer.length; index += 1) {\n const char = trimmedBuffer[index];\n\n if (!char) {\n continue;\n }\n\n if (!STREAM_BREAK_PATTERN.test(char)) {\n continue;\n }\n\n const segment = trimmedBuffer.slice(lastIndex, index + 1).trim();\n if (segment) {\n segments.push(segment);\n }\n lastIndex = index + 1;\n }\n\n let remainder = trimmedBuffer.slice(lastIndex).trimStart();\n\n if (remainder.length >= STREAM_MIN_COMMIT_LENGTH && STREAM_SOFT_BREAK_PATTERN.test(remainder)) {\n segments.push(remainder.trim());\n remainder = \"\";\n }\n\n return {\n segments,\n remainder,\n };\n};\n\nexport function createAutoVoiceReplyController(\n options: CreateAutoVoiceReplyControllerOptions,\n): AutoVoiceReplyController {\n const {\n source,\n speech,\n storage,\n enabledStorageKey,\n defaultVoice = null,\n id = \"auto-voice-reply\",\n audioFormat = \"pcm\",\n sampleRate = 24000,\n preprocessText,\n } = options;\n\n let destroyed = false;\n let enabled = enabledStorageKey ? storage?.getItem(enabledStorageKey) === \"true\" : false;\n let lastLoading = source.getSnapshot().isLoading;\n let activeTaskId: string | null = null;\n let activeUserMessageId: string | null = null;\n let suppressedTaskId: string | null = null;\n let streamStarted = false;\n let activeMessageId: string | null = null;\n let observedText = \"\";\n let pendingText = \"\";\n let queuedOperations = Promise.resolve();\n let voice = speech.getVoice?.() ?? defaultVoice;\n let snapshot: AutoVoiceReplySnapshot = {\n enabled,\n status: speech.getSnapshot().status,\n connecting: speech.getSnapshot().status === \"connecting\",\n speaking: speech.getSnapshot().status === \"speaking\",\n voice,\n activeTaskId,\n suppressedTaskId,\n error: speech.getSnapshot().error || null,\n };\n\n const listeners = new Set<() => void>();\n\n const syncSnapshot = () => {\n const speechSnapshot = speech.getSnapshot();\n const nextSnapshot: AutoVoiceReplySnapshot = {\n enabled,\n status: speechSnapshot.status,\n connecting: speechSnapshot.status === \"connecting\",\n speaking: speechSnapshot.status === \"speaking\",\n voice,\n activeTaskId,\n suppressedTaskId,\n error: speechSnapshot.error || null,\n };\n\n const changed =\n snapshot.enabled !== nextSnapshot.enabled ||\n snapshot.status !== nextSnapshot.status ||\n snapshot.connecting !== nextSnapshot.connecting ||\n snapshot.speaking !== nextSnapshot.speaking ||\n snapshot.voice !== nextSnapshot.voice ||\n snapshot.activeTaskId !== nextSnapshot.activeTaskId ||\n snapshot.suppressedTaskId !== nextSnapshot.suppressedTaskId ||\n snapshot.error !== nextSnapshot.error;\n\n if (changed) {\n snapshot = nextSnapshot;\n }\n\n return changed;\n };\n\n const emit = () => {\n if (destroyed) {\n return;\n }\n\n syncSnapshot();\n listeners.forEach((listener) => listener());\n };\n\n const persistEnabled = () => {\n if (enabledStorageKey) {\n storage?.setItem(enabledStorageKey, enabled ? \"true\" : \"false\");\n }\n };\n\n const resetStreamingState = (messageId: string | null = null) => {\n activeMessageId = messageId;\n observedText = \"\";\n pendingText = \"\";\n streamStarted = false;\n };\n\n const clearActiveRoundContext = () => {\n activeTaskId = null;\n activeUserMessageId = null;\n };\n\n const stopStreaming = (input?: { preserveRoundContext?: boolean }) => {\n const preserveRoundContext = input?.preserveRoundContext ?? false;\n\n observedText = \"\";\n pendingText = \"\";\n activeMessageId = null;\n streamStarted = false;\n\n if (!preserveRoundContext) {\n clearActiveRoundContext();\n }\n\n speech.stop();\n };\n\n const enqueueOperation = (operation: () => Promise<void> | void) => {\n queuedOperations = queuedOperations.then(\n () => operation(),\n () => operation(),\n );\n\n return queuedOperations;\n };\n\n const dispatchSegments = async (segments: string[]) => {\n if (!segments.length || destroyed) {\n return;\n }\n\n if (!streamStarted) {\n await speech.startStream({\n id,\n voice,\n audioFormat,\n sampleRate,\n });\n streamStarted = true;\n }\n\n for (const segment of segments) {\n if (destroyed) {\n return;\n }\n\n const nextText = preprocessText ? preprocessText(segment) : segment;\n if (!nextText.trim()) {\n continue;\n }\n\n await speech.appendText({\n id,\n text: nextText,\n });\n speech.commit();\n }\n };\n\n const processLatestMessage = async (\n message: AutoVoiceReplyMessage,\n final: boolean,\n ) => {\n const messageId = message.messageId || null;\n const fullText = message.content || \"\";\n\n if (!fullText.trim()) {\n return;\n }\n\n if (activeMessageId !== messageId) {\n resetStreamingState(messageId);\n }\n\n const previousText = observedText;\n\n if (previousText && !fullText.startsWith(previousText)) {\n observedText = fullText;\n return;\n }\n\n const delta = fullText.slice(previousText.length);\n observedText = fullText;\n\n if (!delta && !final) {\n return;\n }\n\n pendingText += delta;\n const { segments, remainder } = takeCommittedSegments(pendingText, final);\n pendingText = remainder;\n\n if (segments.length) {\n await dispatchSegments(segments);\n }\n\n if (final) {\n speech.finish();\n }\n };\n\n const handleSourceChange = () => {\n if (destroyed) {\n return;\n }\n\n const snapshot = source.getSnapshot();\n\n if (!enabled) {\n lastLoading = snapshot.isLoading;\n return;\n }\n\n const activeConversation = getActiveConversation(snapshot.conversations);\n const wasLoading = lastLoading;\n\n if (snapshot.isLoading && activeConversation) {\n if (activeConversation.taskId !== activeTaskId) {\n activeTaskId = activeConversation.taskId;\n activeUserMessageId = getLatestUserMessageIdFromConversation(activeConversation);\n suppressedTaskId = null;\n }\n\n if (suppressedTaskId === activeConversation.taskId) {\n lastLoading = snapshot.isLoading;\n emit();\n return;\n }\n\n const latestMessage = getLatestAssistantTextMessageAfterUser(\n activeConversation,\n activeUserMessageId,\n );\n\n if (latestMessage) {\n void enqueueOperation(() => processLatestMessage(latestMessage, false));\n }\n } else if (wasLoading && !snapshot.isLoading) {\n const finishedConversation = getConversationByTaskId(\n snapshot.conversations,\n activeTaskId,\n );\n\n if (finishedConversation && suppressedTaskId !== finishedConversation.taskId) {\n const latestMessage = getLatestAssistantTextMessageAfterUser(\n finishedConversation,\n activeUserMessageId,\n );\n\n if (latestMessage) {\n void enqueueOperation(() => processLatestMessage(latestMessage, true));\n }\n }\n\n if (finishedConversation?.taskId === suppressedTaskId) {\n suppressedTaskId = null;\n }\n clearActiveRoundContext();\n }\n\n lastLoading = snapshot.isLoading;\n emit();\n };\n\n const sourceUnsubscribe = source.subscribe(handleSourceChange);\n const speechUnsubscribe = speech.subscribe(() => {\n if (destroyed) {\n return;\n }\n\n const nextVoice = speech.getVoice?.() ?? voice ?? defaultVoice;\n if (nextVoice !== voice) {\n voice = nextVoice;\n }\n\n emit();\n });\n\n const controller: AutoVoiceReplyController = {\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n getSnapshot() {\n syncSnapshot();\n return snapshot;\n },\n setEnabled(nextEnabled) {\n if (enabled === nextEnabled) {\n return;\n }\n\n enabled = nextEnabled;\n persistEnabled();\n\n if (!enabled) {\n stopStreaming();\n suppressedTaskId = null;\n } else {\n lastLoading = source.getSnapshot().isLoading;\n handleSourceChange();\n }\n\n emit();\n },\n toggleEnabled() {\n controller.setEnabled(!enabled);\n },\n toggleEnabledOrStop() {\n const status = speech.getSnapshot().status;\n\n if (status === \"connecting\" || status === \"speaking\") {\n suppressedTaskId = activeTaskId;\n stopStreaming({ preserveRoundContext: true });\n emit();\n return;\n }\n\n controller.toggleEnabled();\n },\n stop() {\n suppressedTaskId = activeTaskId;\n stopStreaming({ preserveRoundContext: true });\n emit();\n },\n setVoice(nextVoice) {\n voice = nextVoice;\n speech.setVoice?.(nextVoice);\n emit();\n },\n getVoice() {\n return voice;\n },\n destroy() {\n if (destroyed) {\n return;\n }\n\n destroyed = true;\n stopStreaming();\n suppressedTaskId = null;\n sourceUnsubscribe();\n speechUnsubscribe();\n listeners.clear();\n },\n };\n\n return controller;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/controller/utils.ts","../src/controller/message-handlers.ts","../src/runtime/platform.ts","../src/conversation-controller.ts","../src/runtime/context.ts","../src/runtime/message-content.ts","../src/runtime/session-runtime.ts","../src/runtime/copilot-runtime.ts","../src/runtime/stream/shared.ts","../src/runtime/stream/browser.ts","../src/runtime/stream/mini-program.ts","../src/runtime/stream/index.ts","../src/copilot-client.ts","../src/auto-voice-reply.ts","../src/file-manager.ts"],"names":["SimpleAbortController","_event","listener","createAbortController","nowIso","generateId","cloneMessage","message","cloneConversation","conversation","createSnapshot","state","id","findMessageIndex","conv","predicate","index","isTextLikeMessage","normalizeFileAttachment","part","file","handlers","role","status","existingIndex","newText","existing","nextFile","newChunk","_id","partData","tool","name","request","toolStatus","errorMsg","spec","getKind","metadata","isKnownMiniProgramEnv","env","envType","normalizedEnv","isMiniProgramRuntime","runtime","resolveMiniProgramGlobals","supportsChunkedRequest","supportsDouyinEventSource","createConversationController","copilot","options","isSingleTurnMode","shouldLoadHistoryOnInit","shouldResumeOnInit","resolveContextId","listeners","activeAbortController","currentStreamingTaskId","lastMessageType","lastMessageId","initPromise","destroyed","currentContextId","sessionRuntime","activeRequestConversationId","emit","snapshot","removeTaskFromOrder","taskId","pushTaskToOrder","append","clearRuntimeMessageState","getFilePartSignature","partIndex","createPartMessageId","messageId","kind","isNetworkError","error","payload","errorCode","errNo","createRuntimeError","source","updateConversationRequestMeta","input","clearConversationRuntimeState","resetState","setLoading","removeLoadingPlaceholder","refreshContextId","abortActiveSession","handleEnd","addConversation","clearConversation","addLoadingPlaceholder","fillData","handler","isHistory","historyId","prevConversation","nextConversation","onSendError","requestConversationId","processLiveData","data","result","final","parts","removeLoading","processHistoryData","text","json","buildMessageContent","userContent","files","trimmedContent","toMessageFileAttachments","buildLocalUserMessages","messages","attachments","runSession","chatOptions","showLoadingPlaceholder","recoveryAttempt","preferMiniProgramRequest","abortController","hasResponse","streamFailed","streamAborted","finalReceived","lastTaskId","runPromise","responseTaskId","responseFinal","recovery","getMiniProgramRequest","recoveryError","streamError","recovered","hasText","hasFiles","localTaskId","wasAborted","targetTaskId","greeting","limit","next","lastRole","taskIds","content","partial","response","messageIndex","oldMessage","updatedMessage","nextMessages","generateUUID","cryptoObj","char","random","getAppIdFromHostname","hostname","wwwMatch","domainMatch","extractAppIdFromUrl","url","pathMatch","cachedAppId","cachedAnonymousUid","getAppId","urlAppId","createContextIdFactory","getUserUid","mode","isMiniProgram","appId","userUid","baseContextId","convertFileContentToPart","convertToA2AParts","extractTextFromContent","createSessionRuntimeFactory","args","contextId","createCopilotRuntimeFactory","createContextId","postRpc","sendMessageStream","signal","onOpen","onMessage","onClose","systemMsg","nonSystemMsgs","lastUserMsg","systemPrompt","cursor","normalizeStreamError","normalized","createAbortError","createSSEConsumer","createParser","event","bindAbortSignal","onAbort","startBrowserStream","authHeader","headers","reader","decoder","parser","done","value","decodeMiniProgramArrayBuffer","textDecoder","buffer","startMiniProgramStream","resolve","reject","chunkBuffer","MiniProgramTextDecoder","sawChunk","settled","opened","finish","emitOpen","feedText","chunkListener","merged","decodeOffset","remaining","decoded","lastGoodIndex","goodPart","encodedGood","headersListener","miniReq","requestTask","wholeResponse","finalText","startStream","getAccessToken","token","canUseMiniProgramStream","createCopilotClient","http","baseUrl","envBaseUrl","STREAM_BREAK_PATTERN","STREAM_SOFT_BREAK_PATTERN","getLatestAssistantTextMessageFromConversation","getLatestUserMessageIdFromConversation","getLatestAssistantTextMessageAfterUser","userMessageId","userIndex","getActiveConversation","conversations","getConversationByTaskId","takeCommittedSegments","trimmedBuffer","segments","lastIndex","segment","remainder","createAutoVoiceReplyController","speech","storage","enabledStorageKey","defaultVoice","audioFormat","sampleRate","preprocessText","enabled","lastLoading","activeTaskId","activeUserMessageId","suppressedTaskId","streamStarted","activeMessageId","observedText","pendingText","queuedOperations","voice","syncSnapshot","speechSnapshot","nextSnapshot","changed","persistEnabled","resetStreamingState","clearActiveRoundContext","stopStreaming","preserveRoundContext","enqueueOperation","operation","dispatchSegments","nextText","processLatestMessage","fullText","previousText","delta","handleSourceChange","activeConversation","wasLoading","latestMessage","finishedConversation","sourceUnsubscribe","speechUnsubscribe","nextVoice","controller","nextEnabled","defaultConstraints","createId","getExtension","fileName","lastDot","readFileAsBase64","base64","isAcceptedType","acceptRules","mimeType","extension","rule","normalizedRule","prefix","validateFile","constraints","currentCount","maxCount","createCopilotFileManager","resolvedConstraints","incomingFiles","nextEntries","fileId"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n Conversation,\n ConversationControllerSnapshot,\n HistoryState,\n MessagesItem,\n} from \"../types\";\n\nexport type InternalState = {\n byId: Record<string, Conversation>;\n order: string[];\n starting: boolean;\n isLoading: boolean;\n isLoadingHistory: boolean;\n historyState: HistoryState;\n};\n\nexport class SimpleAbortController {\n aborted = false;\n private listeners: Array<() => void> = [];\n\n signal = {\n aborted: false,\n addEventListener: (_event: \"abort\", listener: () => void) => {\n this.listeners.push(listener);\n },\n };\n\n abort() {\n if (this.aborted) return;\n this.aborted = true;\n this.signal.aborted = true;\n this.listeners.forEach((listener) => listener());\n }\n}\n\nexport function createAbortController(): AbortController | SimpleAbortController {\n if (typeof AbortController !== \"undefined\") {\n return new AbortController();\n }\n return new SimpleAbortController();\n}\n\nexport function nowIso() {\n return new Date().toISOString();\n}\n\nexport function generateId() {\n return `msg-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function cloneMessage<T extends MessagesItem>(message: T): T {\n return { ...message } as T;\n}\n\nexport function cloneConversation(conversation: Conversation): Conversation {\n return {\n ...conversation,\n system: conversation.system ? { ...conversation.system } : undefined,\n runtimeError: conversation.runtimeError ? { ...conversation.runtimeError } : undefined,\n messages: conversation.messages.map((message) => cloneMessage(message)),\n };\n}\n\nexport function createSnapshot(state: InternalState): ConversationControllerSnapshot {\n return {\n starting: state.starting,\n isLoading: state.isLoading,\n isLoadingHistory: state.isLoadingHistory,\n historyState: { ...state.historyState },\n conversations: state.order\n .map((id) => state.byId[id])\n .filter((conversation): conversation is Conversation => Boolean(conversation))\n .map((conversation) => cloneConversation(conversation)),\n };\n}\n","import type {\n Conversation,\n ErrorMessage,\n FileMessage,\n MessageFileAttachment,\n MessagesItem,\n Role,\n TextMessage,\n ThoughtMessage,\n ToolMessage,\n UIRenderMessage,\n} from \"../types\";\nimport { nowIso } from \"./utils\";\n\nfunction findMessageIndex(\n conv: Conversation,\n predicate: (message: MessagesItem) => boolean\n) {\n for (let index = conv.messages.length - 1; index >= 0; index -= 1) {\n const message = conv.messages[index];\n if (!message) continue;\n if (predicate(message)) {\n return index;\n }\n }\n return -1;\n}\n\nfunction isTextLikeMessage(message: MessagesItem) {\n return message.kind === \"text-content\" || message.kind === \"message\";\n}\n\nfunction normalizeFileAttachment(part: any): MessageFileAttachment | null {\n const file = part?.file;\n if (!file) return null;\n\n return {\n name: file.name || \"未命名文件\",\n mimeType: file.mimeType,\n url: file.uri,\n size:\n typeof part?.metadata?.size === \"number\"\n ? part.metadata.size\n : typeof file?.size === \"number\"\n ? file.size\n : undefined,\n };\n}\n\nexport type MessageHandler = (\n conv: Conversation,\n part: any,\n id: string,\n role: Role,\n status?: any\n) => Conversation;\n\nexport const handlers: Record<string, MessageHandler> = {\n \"text-content\": (conv, part, id, role, status) => {\n if (!id) return conv;\n const existingIndex = findMessageIndex(\n conv,\n (message) => message.messageId === id && isTextLikeMessage(message)\n );\n const newText = part.text || \"\";\n\n if (existingIndex >= 0) {\n const existing = conv.messages[existingIndex] as TextMessage;\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message === conv.messages[existingIndex]\n ? ({ ...message, content: existing.content + newText } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"text-content\",\n content: newText,\n timestamp: status?.timestamp || nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n \"file-content\": (conv, part, id, role, status) => {\n if (!id) return conv;\n const nextFile = normalizeFileAttachment(part);\n if (!nextFile) return conv;\n const existingIndex = findMessageIndex(\n conv,\n (message) => message.messageId === id && message.kind === \"file-content\"\n );\n\n if (existingIndex >= 0) {\n return conv;\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"file-content\",\n files: [nextFile],\n timestamp: status?.timestamp || nowIso(),\n } as FileMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n thought: (conv, part, id, role, status) => {\n if (!id) return conv;\n const newChunk = part?.data?.description || \"\";\n const existingIndex = findMessageIndex(\n conv,\n (message) => message.messageId === id && message.kind === \"thought\"\n );\n\n if (existingIndex >= 0) {\n const existing = conv.messages[existingIndex] as ThoughtMessage;\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message === conv.messages[existingIndex]\n ? ({ ...message, thought: existing.thought + newChunk } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"thought\",\n thought: newChunk,\n timestamp: status?.timestamp || nowIso(),\n } as ThoughtMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n tool: (conv, part, _id, role, status) => {\n const partData = part?.data || {};\n const tool = partData?.tool;\n const name = tool?.displayName || tool?.name || \"\";\n const request = partData?.request;\n const id = request?.callId;\n if (!id || !name) return conv;\n\n const toolStatus = partData?.status;\n const existingIndex = findMessageIndex(\n conv,\n (message) => message.messageId === id && message.kind === \"tool\"\n );\n\n if (existingIndex >= 0) {\n const existing = conv.messages[existingIndex] as ToolMessage;\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message === conv.messages[existingIndex]\n ? ({\n ...message,\n toolStatus: toolStatus || existing.toolStatus,\n } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"tool\",\n toolName: name,\n toolDescription: request?.args?.query || \"\",\n toolStatus: toolStatus || \"pending\",\n timestamp: status?.timestamp || nowIso(),\n } as ToolMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n\n error: (conv, part, id, role) => {\n const errorMsg = part?.text || part?.data?.error || \"发生错误\";\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id || `error-${Date.now()}`,\n role,\n kind: \"error\",\n content: errorMsg,\n timestamp: nowIso(),\n } as ErrorMessage,\n ],\n status: \"error\",\n lastUpdated: nowIso(),\n };\n },\n\n \"ui-render\": (conv, part, id, role, status) => {\n if (!id) return conv;\n const existingIndex = findMessageIndex(\n conv,\n (message) => message.messageId === id && message.kind === \"ui-render\"\n );\n const partData = part?.data || {};\n const spec = partData.spec || { root: \"\", elements: {} };\n\n if (existingIndex >= 0) {\n return {\n ...conv,\n messages: conv.messages.map((message) =>\n message === conv.messages[existingIndex]\n ? ({ ...(message as UIRenderMessage), spec } as MessagesItem)\n : message\n ),\n lastUpdated: nowIso(),\n };\n }\n\n return {\n ...conv,\n messages: [\n ...conv.messages,\n {\n messageId: id,\n role,\n kind: \"ui-render\",\n spec,\n timestamp: status?.timestamp || nowIso(),\n } as UIRenderMessage,\n ],\n lastUpdated: nowIso(),\n };\n },\n};\n\nexport function getKind(part: any, metadata?: any) {\n if (part?.data?.tool) return \"tool\";\n if (part?.data?.type === \"ui\") return \"ui-render\";\n if (part?.kind === \"text\") return \"text-content\";\n if (part?.kind === \"file\") return \"file-content\";\n if (part?.data?.type === \"though\" || metadata?.coderAgent?.kind === \"thought\") return \"thought\";\n if (metadata?.error) return \"error\";\n return \"unknown\";\n}\n","export { getMiniProgramRequest, resolveMiniProgramGlobals } from \"@amaster.ai/http-client\";\nimport { resolveMiniProgramGlobals } from \"@amaster.ai/http-client\";\n\nfunction isKnownMiniProgramEnv(env: unknown, envType?: Record<string, unknown>): boolean {\n if (typeof env === \"string\") {\n const normalizedEnv = env.trim().toUpperCase();\n if (\n normalizedEnv === \"TT\" ||\n normalizedEnv === \"DOUYIN\" ||\n normalizedEnv === \"WEAPP\" ||\n normalizedEnv === \"WECHAT\"\n ) {\n return true;\n }\n }\n\n if (!envType) {\n return false;\n }\n\n return (\n (typeof envType.TT !== \"undefined\" && env === envType.TT) ||\n (typeof envType.WEAPP !== \"undefined\" && env === envType.WEAPP)\n );\n}\n\nexport function isMiniProgramRuntime(): boolean {\n const runtime = resolveMiniProgramGlobals();\n if (isKnownMiniProgramEnv(runtime?.Taro?.getEnv?.(), runtime?.Taro?.ENV_TYPE)) {\n return true;\n }\n\n return (\n typeof runtime?.wx?.request === \"function\" ||\n typeof runtime?.tt?.request === \"function\" ||\n typeof runtime?.my?.request === \"function\" ||\n typeof runtime?.swan?.request === \"function\" ||\n typeof runtime?.qq?.request === \"function\" ||\n typeof runtime?.jd?.request === \"function\"\n );\n}\n\nexport function supportsChunkedRequest(): boolean {\n const runtime = resolveMiniProgramGlobals();\n if (typeof runtime?.tt?.request === \"function\" || typeof runtime?.tt?.createEventSource === \"function\") {\n return false;\n }\n\n return true;\n}\n\nexport function supportsDouyinEventSource(): boolean {\n const runtime = resolveMiniProgramGlobals();\n return typeof runtime?.tt?.createEventSource === \"function\";\n}\n","import type {\n Message1,\n SendStreamingMessageResponse,\n SendStreamingMessageSuccessResponse,\n TextPart,\n} from \"@a2a-js/sdk\";\nimport { handlers, type MessageHandler, getKind } from \"./controller/message-handlers\";\nimport {\n cloneConversation,\n createAbortController,\n createSnapshot,\n generateId,\n nowIso,\n type InternalState,\n type SimpleAbortController,\n} from \"./controller/utils\";\nimport { getMiniProgramRequest, supportsDouyinEventSource } from \"./runtime/platform\";\nimport type {\n Conversation,\n ConversationController,\n ConversationControllerOptions,\n ConversationRuntimeError,\n ConversationRuntimeFactory,\n FileContent,\n MessageFileAttachment,\n MessagesItem,\n RuntimeMessageContent,\n SendMessageOptions,\n TextMessage,\n ThoughtMessage,\n ToolMessage,\n} from \"./types\";\n\nexport type {\n Role,\n TextMessage,\n ErrorMessage,\n ThoughtMessage,\n ToolMessage,\n UIRenderMessage,\n MessagesItem,\n Conversation,\n HistoryState,\n ConversationRequestState,\n ConversationRuntimeError,\n UpdateMessageInput,\n ConversationControllerSnapshot,\n ConversationStrings,\n ConversationControllerOptions,\n ConversationController,\n} from \"./types\";\n\nexport function createConversationController(\n copilot: ConversationRuntimeFactory,\n options: ConversationControllerOptions\n): ConversationController {\n const mode = options.mode || \"conversation\";\n const isSingleTurnMode = mode === \"single-turn\";\n const shouldLoadHistoryOnInit = !isSingleTurnMode;\n const shouldResumeOnInit = !isSingleTurnMode;\n const resolveContextId = () =>\n options.getContextId?.() ??\n copilot.createContextId(isSingleTurnMode ? \"single-turn\" : \"conversation\");\n\n const state: InternalState = {\n byId: {},\n order: [],\n starting: true,\n isLoading: false,\n isLoadingHistory: false,\n historyState: {\n next: null,\n hasMore: false,\n },\n };\n\n const listeners = new Set<(snapshot: ReturnType<typeof createSnapshot>) => void>();\n let activeAbortController: AbortController | SimpleAbortController | null = null;\n let activeRunPromise: Promise<void> | null = null;\n let currentStreamingTaskId: string | null = null;\n let lastMessageType = \"unknown\";\n let lastMessageId = \"\";\n let initPromise: Promise<void> | null = null;\n let destroyed = false;\n let currentContextId = resolveContextId();\n let sessionRuntime = copilot.createScopedRuntime(currentContextId);\n let activeRequestConversationId: string | null = null;\n\n const emit = () => {\n if (destroyed) return;\n const snapshot = createSnapshot(state);\n listeners.forEach((listener) => listener(snapshot));\n };\n\n const removeTaskFromOrder = (taskId: string) => {\n state.order = state.order.filter((id) => id !== taskId);\n };\n\n const pushTaskToOrder = (taskId: string, append = true) => {\n removeTaskFromOrder(taskId);\n state.order = append ? [...state.order, taskId] : [taskId, ...state.order];\n };\n\n const clearRuntimeMessageState = () => {\n lastMessageType = \"unknown\";\n lastMessageId = \"\";\n };\n\n const getFilePartSignature = (part: any, partIndex?: number) => {\n const file = part?.file || {};\n return (\n [file.uri, file.name, file.mimeType, part?.metadata?.size, file.size]\n .filter(Boolean)\n .join(\"::\") || `part-${partIndex ?? 0}`\n );\n };\n\n const createPartMessageId = ({\n messageId,\n kind,\n part,\n partIndex,\n }: {\n messageId?: string;\n kind: string;\n part: any;\n partIndex?: number;\n }) => {\n if (!messageId) return \"\";\n\n if (kind === \"file-content\") {\n return `${messageId}::file::${getFilePartSignature(part, partIndex)}`;\n }\n\n if (kind === \"text-content\") {\n return `${messageId}::text`;\n }\n\n return `${messageId}::${kind}`;\n };\n\n const isNetworkError = (error: unknown) => {\n const payload = (error && typeof error === \"object\" ? error : {}) as Record<string, unknown>;\n const message = String(payload.message || payload.errMsg || \"\").toLowerCase();\n const errorCode = String(payload.errorCode || \"\");\n const errNo = String(payload.errNo || \"\");\n\n return (\n payload.name === \"TypeError\" ||\n /failed to fetch|fetch failed|timed out|disconnected|offline|断网/.test(message) ||\n [\"600009\", \"21101\", \"21102\", \"21103\"].includes(errorCode) ||\n [\"600009\", \"21101\", \"21102\", \"21103\"].includes(errNo)\n );\n };\n\n const createRuntimeError = (\n error: unknown,\n source: \"send\" | \"stream\" | \"recovery\" = \"stream\"\n ): ConversationRuntimeError => {\n const payload = (error && typeof error === \"object\" ? error : {}) as Record<string, unknown>;\n const message = String(payload.message || payload.errMsg || \"\").toLowerCase();\n return {\n code: isNetworkError(error) ? \"network\" : \"unknown\",\n message,\n retryable: true,\n source,\n timestamp: nowIso(),\n };\n };\n\n const updateConversationRequestMeta = (\n taskId: string | null | undefined,\n input: {\n requestState?: \"idle\" | \"submitting\" | \"streaming\" | \"recovering\" | \"error\";\n runtimeError?: ReturnType<typeof createRuntimeError> | null;\n status?: Conversation[\"status\"];\n }\n ) => {\n if (!taskId) return;\n const conversation = state.byId[taskId];\n if (!conversation) return;\n\n state.byId[taskId] = {\n ...conversation,\n requestState: input.requestState ?? conversation.requestState,\n runtimeError:\n input.runtimeError === undefined ? conversation.runtimeError : input.runtimeError,\n status: input.status ?? conversation.status,\n lastUpdated: nowIso(),\n };\n };\n\n const clearConversationRuntimeState = (taskId: string | null | undefined) => {\n updateConversationRequestMeta(taskId, {\n requestState: \"idle\",\n runtimeError: null,\n });\n };\n\n const resetState = () => {\n state.byId = {};\n state.order = [];\n state.historyState = {\n next: null,\n hasMore: false,\n };\n };\n\n const setLoading = (status: boolean) => {\n state.isLoading = status;\n !status && removeLoadingPlaceholder();\n };\n\n const refreshContextId = () => {\n currentContextId = resolveContextId();\n sessionRuntime = copilot.createScopedRuntime(currentContextId);\n return currentContextId;\n };\n\n const abortActiveSession = () => {\n activeAbortController?.abort();\n activeAbortController = null;\n activeRunPromise = null;\n clearConversationRuntimeState(activeRequestConversationId);\n setLoading(false);\n emit();\n };\n\n const handleEnd = () => {\n clearRuntimeMessageState();\n clearConversationRuntimeState(activeRequestConversationId);\n if (activeRequestConversationId) {\n updateConversationRequestMeta(activeRequestConversationId, {\n status: \"completed\",\n });\n }\n activeRequestConversationId = null;\n currentStreamingTaskId = null;\n activeAbortController = null;\n activeRunPromise = null;\n setLoading(false);\n emit();\n };\n\n const addConversation = (conversation: Conversation) => {\n state.byId[conversation.taskId] = conversation;\n pushTaskToOrder(conversation.taskId, true);\n emit();\n };\n\n const clearConversation = (taskId: string) => {\n if (!state.byId[taskId]) return;\n delete state.byId[taskId];\n removeTaskFromOrder(taskId);\n emit();\n };\n\n const addLoadingPlaceholder = () => {\n addConversation({\n taskId: \"loading-placeholder\",\n status: \"working\",\n messages: [\n {\n messageId: \"loading-placeholder\",\n role: \"assistant\",\n kind: \"text-content\",\n content: options.strings.thinking,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n });\n };\n\n const removeLoadingPlaceholder = () => {\n clearConversation(\"loading-placeholder\");\n };\n\n const fillData = ({\n kind,\n taskId,\n part,\n status,\n handler,\n isHistory,\n historyId,\n messageId,\n partIndex,\n }: {\n kind: string;\n taskId: string;\n part: any;\n status: any;\n handler: MessageHandler;\n isHistory?: boolean;\n historyId?: string;\n messageId?: string;\n partIndex?: number;\n }) => {\n let id = messageId\n ? createPartMessageId({ messageId, kind, part, partIndex })\n : lastMessageId;\n const role = status?.message?.role === \"agent\" ? \"assistant\" : \"user\";\n\n if (\n !messageId &&\n (kind === \"ui-render\" ||\n kind === \"file-content\" ||\n (kind !== \"unknown\" && kind !== lastMessageType))\n ) {\n lastMessageType = kind;\n id = generateId();\n lastMessageId = id;\n }\n\n const prevConversation =\n state.byId[taskId] ??\n ({\n taskId,\n status: isHistory ? \"completed\" : \"submitted\",\n messages: [],\n role,\n historyId,\n lastUpdated: nowIso(),\n } as Conversation);\n\n const nextConversation = handler(prevConversation, part, id, role, status);\n state.byId[taskId] = {\n ...nextConversation,\n status: status?.state || prevConversation.status,\n lastUpdated: nowIso(),\n };\n\n if (!isHistory) {\n pushTaskToOrder(taskId, true);\n }\n\n emit();\n };\n\n const onSendError = (\n error?: unknown,\n source: \"send\" | \"stream\" | \"recovery\" = \"stream\",\n requestConversationId: string | null | undefined = activeRequestConversationId\n ) => {\n updateConversationRequestMeta(requestConversationId, {\n requestState: \"error\",\n runtimeError: createRuntimeError(error, source),\n status: \"error\",\n });\n if (requestConversationId && activeRequestConversationId === requestConversationId) {\n activeRequestConversationId = null;\n }\n setLoading(false);\n emit();\n };\n\n const processLiveData = (data: SendStreamingMessageResponse) => {\n if (!(data as any)?.result) return;\n const result = (data as SendStreamingMessageSuccessResponse).result as any;\n const { taskId, status, metadata, final } = result;\n\n if (final) {\n handleEnd();\n return;\n }\n\n if (!taskId) return;\n\n currentStreamingTaskId = taskId;\n const parts = status?.message?.parts || [];\n let removeLoading = false;\n parts.forEach((part: any, partIndex: number) => {\n const kind = getKind(part, metadata);\n const handler = handlers[kind];\n if (!handler) return;\n if (kind !== \"unknown\") {\n removeLoading = true;\n }\n fillData({\n kind,\n taskId,\n part,\n status,\n handler,\n partIndex,\n });\n });\n\n removeLoading && removeLoadingPlaceholder();\n };\n\n\n const processHistoryData = (data: Message1, taskId: string) => {\n const { messageId, historyId } = (data || {}) as any;\n if (!messageId) return;\n\n const parts = data.parts || [];\n parts.forEach((part, partIndex) => {\n const kind = getKind(part);\n\n if (kind === \"text-content\") {\n let text = (part as TextPart).text || \"\";\n text = text.trim();\n if (text.startsWith(\"<ui>\")) {\n const json = text.slice(4).trim();\n try {\n const partData = JSON.parse(json);\n if (partData.root && partData.elements) {\n fillData({\n kind: \"ui-render\",\n taskId,\n part: { kind: \"data\", data: { type: \"ui\", spec: partData } },\n handler: handlers[\"ui-render\"]!,\n isHistory: true,\n historyId,\n messageId,\n status: { message: data },\n partIndex,\n });\n }\n } catch {\n // ignore invalid history ui payload\n }\n return;\n }\n }\n\n const handler = handlers[kind];\n if (!handler) return;\n\n fillData({\n kind,\n taskId,\n part,\n handler,\n isHistory: true,\n historyId,\n messageId,\n status: { message: data },\n partIndex,\n });\n });\n };\n\n const buildMessageContent = (userContent: string, files?: FileContent[]): RuntimeMessageContent => {\n const trimmedContent = userContent.trim();\n if (!files?.length) return trimmedContent;\n\n return [\n ...(trimmedContent ? [{ type: \"text\" as const, text: trimmedContent }] : []),\n ...files,\n ];\n };\n\n const toMessageFileAttachments = (files?: FileContent[]): MessageFileAttachment[] | undefined => {\n if (!files?.length) return undefined;\n\n return files.map((file) => ({\n name: file.name || \"未命名文件\",\n size: file.size,\n mimeType: file.mimeType,\n url: file.url,\n }));\n };\n\n const buildLocalUserMessages = (\n userContent: string,\n files?: FileContent[]\n ): MessagesItem[] => {\n const messages: MessagesItem[] = [];\n const trimmedContent = userContent.trim();\n const attachments = toMessageFileAttachments(files) || [];\n\n if (trimmedContent) {\n messages.push({\n messageId: generateId(),\n role: \"user\",\n kind: \"text-content\",\n content: trimmedContent,\n timestamp: nowIso(),\n } as TextMessage);\n }\n\n if (attachments.length) {\n messages.push({\n messageId: generateId(),\n role: \"user\",\n kind: \"file-content\",\n files: attachments.map((file, index) => ({\n ...file,\n id: file.id || `local-file-${index}`,\n })),\n timestamp: nowIso(),\n } as MessagesItem);\n }\n\n return messages;\n };\n\n const runSession = async (\n messages: Array<{\n role: \"system\" | \"user\" | \"assistant\";\n content: RuntimeMessageContent;\n }>,\n chatOptions?: { taskId?: string },\n showLoadingPlaceholder = false,\n recoveryAttempt = 0,\n preferMiniProgramRequest = false,\n requestConversationId: string | null = activeRequestConversationId\n ) => {\n activeRequestConversationId = requestConversationId;\n abortActiveSession();\n clearRuntimeMessageState();\n updateConversationRequestMeta(requestConversationId, {\n requestState: \"submitting\",\n runtimeError: null,\n status: \"submitted\",\n });\n\n const abortController = createAbortController() as AbortController | SimpleAbortController;\n activeAbortController = abortController;\n\n if (showLoadingPlaceholder) {\n addLoadingPlaceholder();\n setLoading(true);\n emit();\n }\n\n let hasResponse = false;\n let streamFailed = false;\n let streamAborted = false;\n let finalReceived = false;\n let lastTaskId = chatOptions?.taskId || null;\n\n const runPromise = sessionRuntime.sendMessage(messages, {\n taskId: chatOptions?.taskId,\n signal: abortController.signal,\n preferMiniProgramRequest,\n onMessage: (message) => {\n const responseTaskId = (message as any)?.result?.taskId;\n const responseFinal = Boolean((message as any)?.result?.final);\n if (responseTaskId) {\n lastTaskId = responseTaskId;\n }\n if (responseFinal) {\n finalReceived = true;\n }\n hasResponse = true;\n updateConversationRequestMeta(requestConversationId, {\n requestState: responseFinal ? \"idle\" : \"streaming\",\n runtimeError: null,\n status: responseFinal ? \"completed\" : \"working\",\n });\n processLiveData(message);\n },\n onClose: () => {},\n });\n activeRunPromise = runPromise;\n\n const recovery = async () => {\n const isDouyinMiniProgram = supportsDouyinEventSource() && !!getMiniProgramRequest();\n const canRecover =\n isDouyinMiniProgram && !streamAborted && !finalReceived && recoveryAttempt < 2;\n if (canRecover) {\n console.log(\"[recovering]\");\n updateConversationRequestMeta(requestConversationId, {\n requestState: \"recovering\",\n runtimeError: null,\n status: \"working\",\n });\n emit();\n try {\n const status = await sessionRuntime.getChatStatus(lastTaskId || undefined);\n\n if (status.working && status.taskId) {\n currentStreamingTaskId = status.taskId;\n await runSession(\n [],\n { taskId: status.taskId },\n true,\n recoveryAttempt + 1,\n true,\n requestConversationId\n );\n return true;\n }\n\n if (!hasResponse && !lastTaskId && !status.taskId && recoveryAttempt < 1) {\n await runSession(\n messages,\n chatOptions,\n true,\n recoveryAttempt + 1,\n true,\n requestConversationId\n );\n return true;\n }\n } catch (recoveryError) {\n console.error(\"[ConversationController] recovery failed:\", recoveryError);\n onSendError(recoveryError, \"recovery\", requestConversationId);\n return true;\n }\n }\n\n return false;\n };\n\n let streamError: unknown;\n let recovered = false;\n try {\n await runPromise;\n } catch (error) {\n if ((error as Error)?.name === \"AbortError\" || abortController.signal.aborted) {\n streamAborted = true;\n } else {\n streamFailed = true;\n streamError = error;\n console.error(\"[ConversationController] Stream error:\", error);\n }\n } finally {\n if (activeRunPromise === runPromise) {\n activeRunPromise = null;\n }\n if (activeAbortController === abortController) {\n activeAbortController = null;\n }\n\n recovered = await recovery();\n }\n\n if (recovered) {\n return;\n }\n\n if (streamFailed) {\n onSendError(streamError, \"stream\", requestConversationId);\n } else if (!hasResponse && showLoadingPlaceholder && !streamAborted) {\n onSendError(streamError, \"send\", requestConversationId);\n } else if (streamAborted) {\n clearConversationRuntimeState(requestConversationId);\n if (requestConversationId && activeRequestConversationId === requestConversationId) {\n activeRequestConversationId = null;\n }\n setLoading(false);\n emit();\n } else if (finalReceived && state.isLoading) {\n handleEnd();\n } else if (!finalReceived && state.isLoading) {\n onSendError(undefined, \"stream\", requestConversationId);\n }\n };\n\n return {\n getSnapshot() {\n return createSnapshot(state);\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n\n async init() {\n if (destroyed) return;\n if (initPromise) return initPromise;\n\n state.starting = true;\n emit();\n\n initPromise = (async () => {\n try {\n if (shouldLoadHistoryOnInit) {\n await this.loadHistory();\n }\n if (shouldResumeOnInit) {\n const result = await sessionRuntime.getChatStatus();\n if (result.taskId && result.working) {\n currentStreamingTaskId = result.taskId;\n await runSession([], { taskId: result.taskId }, false);\n }\n }\n } catch (error) {\n console.error(\"[ConversationController] init failed:\", error);\n } finally {\n state.starting = false;\n emit();\n initPromise = null;\n }\n })();\n\n return initPromise;\n },\n\n destroy() {\n destroyed = true;\n abortActiveSession();\n listeners.clear();\n },\n\n async sendMessage(userContent: string, options?: SendMessageOptions) {\n const files = options?.files?.filter((file) => file.data || file.url) || [];\n const hasText = !!userContent.trim();\n const hasFiles = files.length > 0;\n if (state.isLoading || (!hasText && !hasFiles)) return;\n\n if (isSingleTurnMode) {\n this.abort();\n resetState();\n clearRuntimeMessageState();\n currentStreamingTaskId = null;\n refreshContextId();\n }\n\n const localTaskId = generateId();\n activeRequestConversationId = localTaskId;\n\n addConversation({\n taskId: localTaskId,\n status: \"submitted\",\n requestState: \"submitting\",\n runtimeError: null,\n messages: buildLocalUserMessages(userContent, files),\n lastUpdated: nowIso(),\n });\n\n try {\n await runSession(\n [{ role: \"user\", content: buildMessageContent(userContent, files) }],\n undefined,\n true,\n 0,\n false,\n localTaskId\n );\n } catch (error) {\n if ((error as Error).name === \"AbortError\") return;\n onSendError(error, \"send\", localTaskId);\n }\n },\n\n abort() {\n const wasAborted = activeAbortController?.signal.aborted;\n abortActiveSession();\n clearRuntimeMessageState();\n clearConversationRuntimeState(activeRequestConversationId);\n activeRequestConversationId = null;\n currentStreamingTaskId = null;\n removeLoadingPlaceholder();\n if (!wasAborted) {\n void Promise.resolve();\n }\n },\n\n async cancelChat(taskId?: string) {\n const targetTaskId = taskId || currentStreamingTaskId;\n this.abort();\n\n addConversation({\n taskId: generateId(),\n status: \"error\",\n messages: [\n {\n messageId: `cancel-${Date.now()}`,\n role: \"assistant\",\n kind: \"text-content\",\n content: options.strings.cancelled,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n });\n\n if (!targetTaskId) return;\n\n try {\n await sessionRuntime.cancelChat(targetTaskId);\n currentStreamingTaskId = null;\n } catch (error) {\n console.error(\"[ConversationController] cancel failed:\", error);\n }\n },\n\n resetConversation(greeting?: string) {\n this.abort();\n resetState();\n activeRequestConversationId = null;\n currentStreamingTaskId = null;\n clearRuntimeMessageState();\n if (isSingleTurnMode) {\n refreshContextId();\n }\n\n if (greeting) {\n const taskId = `conv-${Date.now()}`;\n state.byId[taskId] = {\n taskId,\n status: \"submitted\",\n messages: [\n {\n messageId: `greeting-${Date.now()}`,\n role: \"assistant\",\n kind: \"text-content\",\n content: greeting,\n timestamp: nowIso(),\n } as TextMessage,\n ],\n lastUpdated: nowIso(),\n };\n state.order = [taskId];\n }\n\n emit();\n },\n\n async startNewConversation() {\n addConversation({\n taskId: generateId(),\n status: \"submitted\",\n messages: [],\n lastUpdated: nowIso(),\n system: { level: \"newConversation\" },\n });\n\n try {\n await sessionRuntime.newConversation();\n } catch (error) {\n console.error(\"[ConversationController] newConversation failed:\", error);\n }\n },\n\n async loadHistory(limit = 20, next?: string) {\n state.isLoadingHistory = true;\n emit();\n\n try {\n const result = await sessionRuntime.getHistory(limit, next);\n const messages = result?.messages || [];\n\n let taskId = \"\";\n let lastRole = \"\";\n const taskIds: string[] = [];\n\n messages.forEach((message: any) => {\n const role = message.role === \"agent\" ? \"assistant\" : \"user\";\n if (role !== lastRole) {\n taskId = `history-conv-${generateId()}`;\n taskIds.push(taskId);\n lastRole = role;\n }\n processHistoryData(message, taskId);\n });\n\n state.order = [...taskIds, ...state.order.filter((id) => !taskIds.includes(id))];\n state.historyState = {\n next: result?.next || null,\n hasMore: result?.hasMore || false,\n };\n } catch (error) {\n console.error(\"[ConversationController] loadHistory failed:\", error);\n } finally {\n state.isLoadingHistory = false;\n emit();\n }\n },\n\n async loadMoreHistory() {\n if (!state.historyState.hasMore || state.isLoadingHistory || !state.historyState.next) return;\n await this.loadHistory(20, state.historyState.next);\n },\n\n getConversation(taskId: string) {\n const conversation = state.byId[taskId];\n return conversation ? cloneConversation(conversation) : undefined;\n },\n\n clearConversation(taskId: string) {\n clearConversation(taskId);\n },\n\n removeMessage(taskId: string, messageId: string) {\n const conversation = state.byId[taskId];\n if (!conversation) return;\n\n state.byId[taskId] = {\n ...conversation,\n messages: conversation.messages.filter((message) => message.messageId !== messageId),\n lastUpdated: nowIso(),\n };\n pushTaskToOrder(taskId, true);\n emit();\n },\n\n updateMessage(input) {\n const {\n taskId,\n messageId,\n content,\n partial = false,\n status,\n response,\n metadata = {},\n } = input;\n const conversation = state.byId[taskId];\n if (!conversation) return;\n\n const messageIndex = conversation.messages.findIndex(\n (message) => message.messageId === messageId\n );\n if (messageIndex === -1) return;\n\n const oldMessage = conversation.messages[messageIndex];\n if (!oldMessage) return;\n\n const updatedMessage: MessagesItem = { ...oldMessage, ...metadata } as MessagesItem;\n\n if (content !== undefined) {\n if (\"content\" in updatedMessage) {\n updatedMessage.content = partial\n ? `${(updatedMessage as TextMessage).content || \"\"}${content}`\n : content;\n } else if (\"thought\" in updatedMessage) {\n updatedMessage.thought = partial\n ? `${(updatedMessage as ThoughtMessage).thought || \"\"}${content}`\n : content;\n } else if (oldMessage.kind === \"text-content\") {\n (updatedMessage as TextMessage).content = partial\n ? `${(oldMessage as TextMessage).content || \"\"}${content}`\n : content;\n }\n }\n\n if (\"toolStatus\" in updatedMessage || status) {\n (updatedMessage as ToolMessage).toolStatus =\n status || (updatedMessage as ToolMessage).toolStatus;\n }\n if (response !== undefined) {\n (updatedMessage as ToolMessage).response = response;\n }\n\n const nextMessages = [...conversation.messages];\n nextMessages[messageIndex] = updatedMessage;\n\n state.byId[taskId] = {\n ...conversation,\n messages: nextMessages,\n lastUpdated: nowIso(),\n };\n pushTaskToOrder(taskId, true);\n emit();\n },\n };\n}\n","import { isMiniProgramRuntime } from \"./platform\";\n\nexport type ContextIdMode = \"conversation\" | \"single-turn\";\n\nfunction generateUUID(): string {\n const cryptoObj = typeof globalThis !== \"undefined\" ? globalThis.crypto : undefined;\n\n if (cryptoObj && typeof cryptoObj.randomUUID === \"function\") {\n return cryptoObj.randomUUID();\n }\n\n if (cryptoObj && typeof cryptoObj.getRandomValues === \"function\") {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (char) => {\n const randomValues = cryptoObj.getRandomValues(new Uint8Array(1));\n const random = (randomValues[0] ?? 0) % 16;\n const value = char === \"x\" ? random : (random & 0x3) | 0x8;\n return value.toString(16);\n });\n }\n\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (char) => {\n const random = (Math.random() * 16) | 0;\n const value = char === \"x\" ? random : (random & 0x3) | 0x8;\n return value.toString(16);\n });\n}\n\nfunction getAppIdFromHostname(hostname: string): string | null {\n const wwwMatch = /^www\\.([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (wwwMatch?.[1]) return wwwMatch[1];\n\n const domainMatch = /^([\\da-z-]+)(?:-[^.]+)?\\.[\\w-]+\\.(?:local|ai|cn)$/.exec(hostname);\n if (domainMatch?.[1]) return domainMatch[1];\n\n return null;\n}\n\nfunction extractAppIdFromUrl(): string | null {\n if (typeof window === \"undefined\") return null;\n\n try {\n const url = window.location.href;\n const pathMatch = /\\/app\\/([\\da-z-]+)(?:\\/|$)/.exec(url);\n if (pathMatch?.[1]) return pathMatch[1];\n return getAppIdFromHostname(window.location.hostname);\n } catch {\n return null;\n }\n}\n\nlet cachedAppId: string | null = null;\nlet cachedAnonymousUid: string | null = null;\n\nfunction getAppId(hostname?: string): string {\n const urlAppId = hostname ? getAppIdFromHostname(hostname) : extractAppIdFromUrl();\n if (urlAppId) return urlAppId;\n if (!cachedAppId) cachedAppId = generateUUID();\n return cachedAppId;\n}\n\nexport function createContextIdResolver(url: string, getUserUid?: () => string | null) {\n const createContextId = createContextIdFactory(url, getUserUid);\n return () => {\n return createContextId(\"conversation\");\n };\n}\n\nexport function createContextIdFactory(url: string, getUserUid?: () => string | null) {\n return (mode: ContextIdMode = \"conversation\") => {\n const isMiniProgram = isMiniProgramRuntime();\n let appId = getAppId();\n\n if (isMiniProgram) {\n const hostname = url ? url.replace(/^https?:\\/\\//, \"\").split(\"/\")[0] : \"\";\n appId = getAppId(hostname);\n }\n\n const userUid = getUserUid?.() ?? (cachedAnonymousUid ??= `anonymous-${generateUUID()}`);\n const baseContextId = `${appId}:${userUid}`;\n\n if (mode === \"single-turn\") {\n return `${baseContextId}:${generateUUID()}`;\n }\n\n return baseContextId;\n };\n}\n\nexport { generateUUID };\n","import type { FilePart, Part } from \"@a2a-js/sdk\";\nimport type { FileContent, MessageContent, TextContent } from \"../types\";\n\nfunction convertFileContentToPart(part: FileContent): FilePart | null {\n const metadata = {\n ...(part.size !== undefined ? { size: part.size } : {}),\n };\n\n if (part.data) {\n return {\n kind: \"file\",\n file: {\n bytes: part.data,\n ...(part.mimeType && { mimeType: part.mimeType }),\n ...(part.name && { name: part.name }),\n },\n ...(Object.keys(metadata).length > 0 ? { metadata } : {}),\n };\n }\n\n if (part.url) {\n return {\n kind: \"file\",\n file: {\n uri: part.url,\n ...(part.mimeType && { mimeType: part.mimeType }),\n ...(part.name && { name: part.name }),\n },\n ...(Object.keys(metadata).length > 0 ? { metadata } : {}),\n };\n }\n\n return null;\n}\n\nexport function convertToA2AParts(content: string | MessageContent[]): Part[] {\n if (typeof content === \"string\") {\n return [{ kind: \"text\", text: content }];\n }\n\n return content\n .map((part): Part | null => {\n switch (part.type) {\n case \"text\":\n return { kind: \"text\", text: part.text };\n case \"image\":\n if (part.data) {\n return {\n kind: \"file\",\n file: {\n bytes: part.data,\n mimeType: part.mimeType || \"image/png\",\n },\n };\n }\n if (part.url) {\n return {\n kind: \"file\",\n file: { uri: part.url, mimeType: part.mimeType || \"image/png\" },\n };\n }\n return null;\n case \"file\":\n return convertFileContentToPart(part);\n default:\n return null;\n }\n })\n .filter((part): part is Part => part !== null);\n}\n\nexport function extractTextFromContent(content: string | MessageContent[]): string {\n if (typeof content === \"string\") {\n return content;\n }\n return content\n .filter((part): part is TextContent => part.type === \"text\")\n .map((part) => part.text)\n .join(\"\\n\");\n}\n","import type { ContextIdMode } from \"./context\";\nimport type { ConversationRuntime, ConversationRuntimeFactory } from \"../types\";\n\nexport function createSessionRuntimeFactory(args: {\n createContextId: (mode?: ContextIdMode) => string;\n createRuntime: (contextId: string) => ConversationRuntime;\n}): ConversationRuntimeFactory {\n return {\n createContextId(mode) {\n return args.createContextId(mode);\n },\n createScopedRuntime(contextId: string) {\n return args.createRuntime(contextId);\n },\n };\n}\n","import type {\n CancelTaskRequest,\n CancelTaskResponse,\n SendStreamingMessageRequest,\n} from \"@a2a-js/sdk\";\nimport type { ConversationRuntime, ConversationRuntimeFactory } from \"../types\";\nimport { generateUUID, type ContextIdMode } from \"./context\";\nimport { convertToA2AParts, extractTextFromContent } from \"./message-content\";\nimport { createSessionRuntimeFactory } from \"./session-runtime\";\nimport type { StreamHandlers } from \"./stream\";\n\ninterface CreateCopilotRuntimeFactoryArgs {\n createContextId: (mode?: ContextIdMode) => string;\n postRpc: (data: unknown) => Promise<unknown>;\n sendMessageStream: (\n request: SendStreamingMessageRequest,\n handlers: StreamHandlers,\n signal?: ConversationRuntimeSendSignal,\n preferMiniProgramRequest?: boolean,\n ) => Promise<void>;\n}\n\ntype ConversationRuntimeSendSignal = Parameters<ConversationRuntime[\"sendMessage\"]>[1][\"signal\"];\n\nexport function createCopilotRuntimeFactory({\n createContextId,\n postRpc,\n sendMessageStream,\n}: CreateCopilotRuntimeFactoryArgs): ConversationRuntimeFactory {\n return createSessionRuntimeFactory({\n createContextId,\n createRuntime(contextId: string): ConversationRuntime {\n return {\n async sendMessage(messages, options) {\n const { taskId, signal, onOpen, onMessage, onClose, preferMiniProgramRequest } = options;\n const systemMsg = messages.find((message) => message.role === \"system\");\n const nonSystemMsgs = messages.filter((message) => message.role !== \"system\");\n const lastUserMsg = nonSystemMsgs[nonSystemMsgs.length - 1];\n\n const parts = lastUserMsg\n ? convertToA2AParts(lastUserMsg.content)\n : [{ kind: \"text\" as const, text: \"\" }];\n\n const systemPrompt = systemMsg ? extractTextFromContent(systemMsg.content) : undefined;\n\n const request: SendStreamingMessageRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"message/stream\",\n params: {\n message: {\n contextId,\n kind: \"message\",\n messageId: generateUUID(),\n role: \"user\",\n parts,\n ...(taskId ? { taskId } : {}),\n ...(systemPrompt ? { metadata: { systemPrompt } } : {}),\n },\n },\n };\n\n await sendMessageStream(\n request,\n { onOpen, onMessage, onClose },\n signal,\n preferMiniProgramRequest\n );\n },\n\n cancelChat(taskId) {\n const request: CancelTaskRequest = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/cancel\",\n params: { id: taskId },\n };\n return postRpc(request) as Promise<CancelTaskResponse>;\n },\n\n async getHistory(limit = 50, next?: string) {\n try {\n const response: any = await postRpc({\n jsonrpc: \"2.0\",\n method: \"messages/list\",\n id: generateUUID(),\n params: {\n filter: { contextId },\n limit,\n ...(next ? { next } : {}),\n },\n });\n const result = response?.data?.result || {};\n const messages = result?.messages || [];\n const cursor = result?.next || \"\";\n\n return {\n messages,\n next: cursor,\n hasMore: !!cursor,\n };\n } catch {\n return undefined;\n }\n },\n\n async newConversation() {\n try {\n await postRpc({\n jsonrpc: \"2.0\",\n method: \"messages/clear\",\n id: generateUUID(),\n params: { contextId },\n });\n } catch {\n // noop\n }\n },\n\n async getChatStatus(taskId) {\n try {\n const request = {\n jsonrpc: \"2.0\",\n id: generateUUID(),\n method: \"tasks/get\",\n params: taskId ? { id: taskId } : { contextId },\n };\n const result: any = await postRpc(request);\n const data = result?.data?.result;\n return {\n working: data?.status?.state === \"working\",\n taskId: data?.id,\n error: data?.error?.message || \"\",\n };\n } catch (error) {\n return {\n working: false,\n error: (error as any)?.message || \"\",\n };\n }\n },\n };\n },\n });\n}\n","import { createParser } from \"eventsource-parser\";\nimport type { SendStreamingMessageResponse } from \"@a2a-js/sdk\";\nimport type { AbortSignalLike } from \"../../types\";\n\nexport interface StreamHandlers {\n onOpen?: () => void;\n onMessage: (message: SendStreamingMessageResponse) => void;\n onClose?: () => void;\n}\n\nexport function normalizeStreamError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n if (error && typeof error === \"object\") {\n const payload = error as Record<string, unknown>;\n const message =\n (typeof payload.errMsg === \"string\" && payload.errMsg) ||\n (typeof payload.message === \"string\" && payload.message) ||\n JSON.stringify(payload);\n const normalized = new Error(message);\n if (typeof payload.errorCode === \"number\" || typeof payload.errorCode === \"string\") {\n (normalized as any).errorCode = payload.errorCode;\n }\n if (typeof payload.errNo === \"number\" || typeof payload.errNo === \"string\") {\n (normalized as any).errNo = payload.errNo;\n }\n (normalized as any).raw = error;\n return normalized;\n }\n\n return new Error(String(error));\n}\n\nexport function createAbortError(): Error {\n if (typeof DOMException !== \"undefined\") {\n return new DOMException(\"Aborted\", \"AbortError\");\n }\n const error = new Error(\"Aborted\");\n error.name = \"AbortError\";\n return error;\n}\n\nexport function createSSEConsumer(handlers: StreamHandlers) {\n return createParser({\n onEvent: (event) => {\n try {\n handlers.onMessage(JSON.parse(event.data));\n } catch (error) {\n console.error(\"[copilot stream] failed to parse SSE event:\", error, event.data);\n }\n },\n });\n}\n\nexport function bindAbortSignal(signal: AbortSignalLike | undefined, onAbort: () => void) {\n if (!signal) return;\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener(\"abort\", onAbort);\n}\n","import type { AbortSignalLike } from \"../../types\";\nimport { createAbortError, createSSEConsumer, type StreamHandlers } from \"./shared\";\n\nexport async function startBrowserStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string>,\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n): Promise<void> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...authHeader,\n };\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify(data),\n signal: signal as AbortSignal | undefined,\n });\n\n if (!response.ok) {\n throw new Error(`Stream request failed: ${response.statusText || response.status}`);\n }\n\n handlers.onOpen?.();\n\n if (!response.body) {\n handlers.onClose?.();\n return;\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const parser = createSSEConsumer(handlers);\n\n try {\n while (true) {\n if (signal?.aborted) {\n throw createAbortError();\n }\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n parser.feed(decoder.decode(value, { stream: true }));\n }\n } finally {\n handlers.onClose?.();\n }\n}\n","import MiniProgramTextDecoder from \"miniprogram-text-decoder\";\nimport type { AbortSignalLike } from \"../../types\";\nimport { getMiniProgramRequest, supportsChunkedRequest } from \"../platform\";\nimport { bindAbortSignal, createAbortError, createSSEConsumer, normalizeStreamError, type StreamHandlers } from \"./shared\";\n\nfunction decodeMiniProgramArrayBuffer(\n value: ArrayBuffer | Uint8Array | undefined,\n textDecoder: MiniProgramTextDecoder\n): string {\n if (!value) return \"\";\n const buffer = value instanceof Uint8Array ? value : new Uint8Array(value);\n if (buffer.length === 0) return \"\";\n return textDecoder.decode(buffer, { stream: false });\n}\n\nexport async function startMiniProgramStream(\n url: string,\n data: unknown,\n authHeader: Record<string, string> = {},\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let chunkBuffer = new Uint8Array(0);\n const textDecoder = new MiniProgramTextDecoder(\"utf-8\", { fatal: false });\n let sawChunk = false;\n let settled = false;\n let opened = false;\n const parser = createSSEConsumer(handlers);\n\n const finish = (error?: unknown) => {\n if (settled) return;\n settled = true;\n if (error) {\n reject(normalizeStreamError(error));\n return;\n }\n handlers.onClose?.();\n resolve();\n };\n\n const emitOpen = () => {\n if (opened) return;\n opened = true;\n handlers.onOpen?.();\n };\n\n const feedText = (text: string) => {\n if (!text) return;\n emitOpen();\n parser.feed(text);\n };\n\n const chunkListener = (response: any) => {\n if (settled || !response.data) return;\n\n try {\n sawChunk = true;\n const newChunk = new Uint8Array(response.data as ArrayBuffer);\n const merged = new Uint8Array(chunkBuffer.length + newChunk.length);\n merged.set(chunkBuffer);\n merged.set(newChunk, chunkBuffer.length);\n chunkBuffer = merged;\n\n let decodeOffset = 0;\n while (decodeOffset < chunkBuffer.length) {\n const remaining = chunkBuffer.subarray(decodeOffset);\n const decoded = textDecoder.decode(remaining, { stream: false });\n\n if (decoded.length === 0) {\n break;\n }\n\n if (decoded.includes(\"�\")) {\n const lastGoodIndex = decoded.lastIndexOf(\"�\") === 0 ? 0 : decoded.indexOf(\"�\");\n if (lastGoodIndex <= 0) {\n break;\n }\n\n const goodPart = decoded.slice(0, lastGoodIndex);\n if (goodPart) {\n feedText(goodPart);\n }\n\n const encodedGood = new TextEncoder().encode(goodPart);\n decodeOffset += encodedGood.length;\n break;\n }\n\n feedText(decoded);\n decodeOffset += remaining.length;\n }\n\n chunkBuffer = chunkBuffer.subarray(decodeOffset);\n } catch (error) {\n console.error(\"[mini stream] chunk process error:\", error);\n }\n };\n\n const headersListener = (response: any) => {\n emitOpen();\n if (response.header?.[\"content-type\"]?.includes(\"text/event-stream\") === false) {\n console.warn(\"Warning: server did not return event-stream\");\n }\n };\n\n const miniReq = getMiniProgramRequest();\n if (!miniReq) {\n reject(new Error(\"Mini-program request API not found\"));\n return;\n }\n\n try {\n const requestTask = miniReq({\n url,\n method: \"POST\",\n header: {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...authHeader,\n },\n data: typeof data === \"string\" ? data : JSON.stringify(data),\n responseType: \"arraybuffer\",\n ...supportsChunkedRequest() ? {\n enableChunked: true\n } : {},\n success: (response: any) => {\n if (!sawChunk && response?.data) {\n const wholeResponse = decodeMiniProgramArrayBuffer(response.data, textDecoder);\n feedText(wholeResponse);\n }\n if (chunkBuffer.length > 0) {\n const finalText = textDecoder.decode(chunkBuffer, { stream: true });\n feedText(finalText);\n }\n finish();\n },\n fail: (error: any) => {\n finish(error);\n },\n });\n\n bindAbortSignal(signal, () => {\n requestTask.abort?.();\n finish(createAbortError());\n });\n\n requestTask.onChunkReceived?.(chunkListener);\n requestTask.onHeadersReceived?.(headersListener);\n } catch (error) {\n finish(error);\n }\n });\n}\n","import type { AbortSignalLike } from \"../../types\";\nimport { getMiniProgramRequest, isMiniProgramRuntime } from \"../platform\";\n// import { supportsDouyinEventSource } from \"../platform\";\nimport { startBrowserStream } from \"./browser\";\n// import { startDouyinEventSourceStream } from \"./douyin\";\nimport { startMiniProgramStream } from \"./mini-program\";\nimport type { StreamHandlers } from \"./shared\";\n\nexport async function startStream(\n url: string,\n data: unknown,\n getAccessToken: (() => string | null) | undefined,\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n preferMiniProgramRequest = false,\n): Promise<void> {\n const token = getAccessToken?.();\n const authHeader: Record<string, string> = token ? { Authorization: `Bearer ${token}` } : {};\n const miniReq = getMiniProgramRequest();\n const canUseMiniProgramStream = isMiniProgramRuntime() && !!miniReq;\n\n if (preferMiniProgramRequest && canUseMiniProgramStream) {\n await startMiniProgramStream(url, data, authHeader, handlers, signal);\n return;\n }\n\n // 抖音小程序的真机流式非常不好用,先注释\n // if (supportsDouyinEventSource()) {\n // await startDouyinEventSourceStream(url, data, authHeader, handlers, signal);\n // return;\n // }\n\n if (canUseMiniProgramStream) {\n await startMiniProgramStream(url, data, authHeader, handlers, signal);\n return;\n }\n\n await startBrowserStream(url, data, authHeader, handlers, signal);\n}\n\nexport type { StreamHandlers } from \"./shared\";\n","/* eslint-disable no-unused-vars */\nimport type { SendStreamingMessageRequest } from \"@a2a-js/sdk\";\nimport type { HttpClient } from \"@amaster.ai/http-client\";\nimport { createConversationController } from \"./conversation-controller\";\nimport { createContextIdFactory } from \"./runtime/context\";\nimport { createCopilotRuntimeFactory } from \"./runtime/copilot-runtime\";\nimport { startStream, type StreamHandlers } from \"./runtime/stream\";\nimport type {\n AbortSignalLike,\n ConversationController,\n ConversationControllerOptions,\n ConversationRuntimeFactory,\n} from \"./types\";\n\nexport type { TextContent, ImageContent, FileContent, MessageContent } from \"./types\";\n\nexport type CopilotClient = {\n createConversationController(options: ConversationControllerOptions): ConversationController;\n};\n\nexport function createCopilotClient(\n http: HttpClient,\n baseUrl?: string,\n getAccessToken?: () => string | null,\n getUserUid?: () => string | null\n): CopilotClient {\n let envBaseUrl = \"\";\n try {\n envBaseUrl =\n process.env.TARO_APP_API_BASE_URL ||\n process.env.VITE_API_BASE_URL ||\n process.env.API_BASE_URL ||\n \"\";\n } catch {\n // process is not defined -> ignore\n }\n\n envBaseUrl = String(envBaseUrl || \"\").trim();\n const url = `${baseUrl || envBaseUrl}/api/proxy/builtin/platform/copilot`;\n\n const postRpc = <T>(data: unknown) =>\n http.request<T>({\n url,\n method: \"POST\",\n data,\n });\n\n const createContextId = createContextIdFactory(url, getUserUid);\n\n async function sendMessageStream(\n request: SendStreamingMessageRequest,\n handlers: StreamHandlers,\n signal?: AbortSignalLike,\n preferMiniProgramRequest?: boolean,\n ): Promise<void> {\n try {\n await startStream(\n url,\n request,\n getAccessToken,\n handlers,\n signal,\n preferMiniProgramRequest,\n );\n } catch (error) {\n if (signal?.aborted) {\n return;\n }\n throw error;\n }\n }\n\n const runtime: ConversationRuntimeFactory = createCopilotRuntimeFactory({\n createContextId,\n postRpc,\n sendMessageStream,\n });\n\n return {\n createConversationController(options) {\n return createConversationController(runtime, options);\n },\n };\n}\n","export interface AutoVoiceReplyMessage {\n messageId?: string;\n role?: string;\n kind: string;\n content?: string;\n}\n\nexport interface AutoVoiceReplyConversation {\n taskId: string;\n status: string;\n requestState?: string;\n messages: AutoVoiceReplyMessage[];\n}\n\nexport interface AutoVoiceReplySourceSnapshot {\n conversations: AutoVoiceReplyConversation[];\n isLoading: boolean;\n}\n\nexport interface AutoVoiceReplySource {\n subscribe(listener: () => void): () => void;\n getSnapshot(): AutoVoiceReplySourceSnapshot;\n}\n\nexport interface AutoVoiceReplySpeechSnapshot {\n status: \"idle\" | \"connecting\" | \"speaking\" | \"error\";\n error?: string | null;\n voice?: string | null;\n}\n\nexport interface AutoVoiceReplySpeechDriver {\n subscribe(listener: () => void): () => void;\n getSnapshot(): AutoVoiceReplySpeechSnapshot;\n startStream(input: {\n id: string;\n voice?: string | null;\n audioFormat?: \"pcm\" | \"mp3\" | \"wav\" | \"opus\";\n sampleRate?: number;\n }): Promise<void>;\n appendText(input: { id: string; text: string }): Promise<void>;\n commit(): void;\n finish(): void;\n stop(): void;\n setVoice?(voice: string | null): void;\n getVoice?(): string | null;\n}\n\nexport interface AutoVoiceReplyStorage {\n getItem(key: string): string | null | undefined;\n setItem(key: string, value: string): void;\n}\n\nexport interface AutoVoiceReplySnapshot {\n enabled: boolean;\n status: \"idle\" | \"connecting\" | \"speaking\" | \"error\";\n connecting: boolean;\n speaking: boolean;\n voice: string | null;\n activeTaskId: string | null;\n suppressedTaskId: string | null;\n error: string | null;\n}\n\nexport interface AutoVoiceReplyController {\n subscribe(listener: () => void): () => void;\n getSnapshot(): AutoVoiceReplySnapshot;\n setEnabled(enabled: boolean): void;\n toggleEnabled(): void;\n toggleEnabledOrStop(): void;\n stop(): void;\n setVoice(voice: string | null): void;\n getVoice(): string | null;\n destroy(): void;\n}\n\nexport interface CreateAutoVoiceReplyControllerOptions {\n source: AutoVoiceReplySource;\n speech: AutoVoiceReplySpeechDriver;\n storage?: AutoVoiceReplyStorage;\n enabledStorageKey?: string;\n defaultVoice?: string | null;\n id?: string;\n audioFormat?: \"pcm\" | \"mp3\" | \"wav\" | \"opus\";\n sampleRate?: number;\n preprocessText?: (text: string) => string;\n}\n\nconst STREAM_BREAK_PATTERN = /[\\n。!?.!?;;]/;\nconst STREAM_SOFT_BREAK_PATTERN = /[,、,::]\\s*$/;\nconst STREAM_MIN_COMMIT_LENGTH = 24;\n\nconst getLatestAssistantTextMessageFromConversation = (\n conversation?: AutoVoiceReplyConversation | null,\n) => {\n if (!conversation) {\n return null;\n }\n\n for (let messageIndex = conversation.messages.length - 1; messageIndex >= 0; messageIndex -= 1) {\n const message = conversation.messages[messageIndex];\n\n if (!message) {\n continue;\n }\n\n if (\n message.role === \"assistant\" &&\n (message.kind === \"text-content\" || message.kind === \"message\") &&\n message.content?.trim()\n ) {\n return message;\n }\n }\n\n return null;\n};\n\nconst getLatestUserMessageIdFromConversation = (\n conversation?: AutoVoiceReplyConversation | null,\n) => {\n if (!conversation) {\n return null;\n }\n\n for (let messageIndex = conversation.messages.length - 1; messageIndex >= 0; messageIndex -= 1) {\n const message = conversation.messages[messageIndex];\n\n if (!message) {\n continue;\n }\n\n if (message.role === \"user\" && message.messageId) {\n return message.messageId;\n }\n }\n\n return null;\n};\n\nconst getLatestAssistantTextMessageAfterUser = (\n conversation?: AutoVoiceReplyConversation | null,\n userMessageId?: string | null,\n) => {\n if (!conversation) {\n return null;\n }\n\n if (!userMessageId) {\n return getLatestAssistantTextMessageFromConversation(conversation);\n }\n\n const userIndex = conversation.messages.findIndex(\n (message) => message.messageId === userMessageId,\n );\n\n if (userIndex < 0) {\n return getLatestAssistantTextMessageFromConversation(conversation);\n }\n\n for (let messageIndex = conversation.messages.length - 1; messageIndex > userIndex; messageIndex -= 1) {\n const message = conversation.messages[messageIndex];\n\n if (!message) {\n continue;\n }\n\n if (\n message.role === \"assistant\" &&\n (message.kind === \"text-content\" || message.kind === \"message\") &&\n message.content?.trim()\n ) {\n return message;\n }\n }\n\n return null;\n};\n\nconst getActiveConversation = (conversations: AutoVoiceReplyConversation[]) => {\n for (let index = conversations.length - 1; index >= 0; index -= 1) {\n const conversation = conversations[index];\n\n if (!conversation) {\n continue;\n }\n\n if (\n conversation.requestState === \"submitting\" ||\n conversation.requestState === \"streaming\" ||\n conversation.requestState === \"recovering\" ||\n conversation.status === \"submitted\" ||\n conversation.status === \"working\"\n ) {\n return conversation;\n }\n }\n\n return null;\n};\n\nconst getConversationByTaskId = (\n conversations: AutoVoiceReplyConversation[],\n taskId: string | null,\n) => {\n if (!taskId) {\n return null;\n }\n\n return conversations.find((conversation) => conversation.taskId === taskId) || null;\n};\n\nconst takeCommittedSegments = (buffer: string, final: boolean) => {\n const trimmedBuffer = buffer.trimStart();\n\n if (!trimmedBuffer) {\n return {\n segments: [] as string[],\n remainder: \"\",\n };\n }\n\n if (final) {\n return {\n segments: [trimmedBuffer].filter(Boolean),\n remainder: \"\",\n };\n }\n\n const segments: string[] = [];\n let lastIndex = 0;\n\n for (let index = 0; index < trimmedBuffer.length; index += 1) {\n const char = trimmedBuffer[index];\n\n if (!char) {\n continue;\n }\n\n if (!STREAM_BREAK_PATTERN.test(char)) {\n continue;\n }\n\n const segment = trimmedBuffer.slice(lastIndex, index + 1).trim();\n if (segment) {\n segments.push(segment);\n }\n lastIndex = index + 1;\n }\n\n let remainder = trimmedBuffer.slice(lastIndex).trimStart();\n\n if (remainder.length >= STREAM_MIN_COMMIT_LENGTH && STREAM_SOFT_BREAK_PATTERN.test(remainder)) {\n segments.push(remainder.trim());\n remainder = \"\";\n }\n\n return {\n segments,\n remainder,\n };\n};\n\nexport function createAutoVoiceReplyController(\n options: CreateAutoVoiceReplyControllerOptions,\n): AutoVoiceReplyController {\n const {\n source,\n speech,\n storage,\n enabledStorageKey,\n defaultVoice = null,\n id = \"auto-voice-reply\",\n audioFormat = \"pcm\",\n sampleRate = 24000,\n preprocessText,\n } = options;\n\n let destroyed = false;\n let enabled = enabledStorageKey ? storage?.getItem(enabledStorageKey) === \"true\" : false;\n let lastLoading = source.getSnapshot().isLoading;\n let activeTaskId: string | null = null;\n let activeUserMessageId: string | null = null;\n let suppressedTaskId: string | null = null;\n let streamStarted = false;\n let activeMessageId: string | null = null;\n let observedText = \"\";\n let pendingText = \"\";\n let queuedOperations = Promise.resolve();\n let voice = speech.getVoice?.() ?? defaultVoice;\n let snapshot: AutoVoiceReplySnapshot = {\n enabled,\n status: speech.getSnapshot().status,\n connecting: speech.getSnapshot().status === \"connecting\",\n speaking: speech.getSnapshot().status === \"speaking\",\n voice,\n activeTaskId,\n suppressedTaskId,\n error: speech.getSnapshot().error || null,\n };\n\n const listeners = new Set<() => void>();\n\n const syncSnapshot = () => {\n const speechSnapshot = speech.getSnapshot();\n const nextSnapshot: AutoVoiceReplySnapshot = {\n enabled,\n status: speechSnapshot.status,\n connecting: speechSnapshot.status === \"connecting\",\n speaking: speechSnapshot.status === \"speaking\",\n voice,\n activeTaskId,\n suppressedTaskId,\n error: speechSnapshot.error || null,\n };\n\n const changed =\n snapshot.enabled !== nextSnapshot.enabled ||\n snapshot.status !== nextSnapshot.status ||\n snapshot.connecting !== nextSnapshot.connecting ||\n snapshot.speaking !== nextSnapshot.speaking ||\n snapshot.voice !== nextSnapshot.voice ||\n snapshot.activeTaskId !== nextSnapshot.activeTaskId ||\n snapshot.suppressedTaskId !== nextSnapshot.suppressedTaskId ||\n snapshot.error !== nextSnapshot.error;\n\n if (changed) {\n snapshot = nextSnapshot;\n }\n\n return changed;\n };\n\n const emit = () => {\n if (destroyed) {\n return;\n }\n\n syncSnapshot();\n listeners.forEach((listener) => listener());\n };\n\n const persistEnabled = () => {\n if (enabledStorageKey) {\n storage?.setItem(enabledStorageKey, enabled ? \"true\" : \"false\");\n }\n };\n\n const resetStreamingState = (messageId: string | null = null) => {\n activeMessageId = messageId;\n observedText = \"\";\n pendingText = \"\";\n streamStarted = false;\n };\n\n const clearActiveRoundContext = () => {\n activeTaskId = null;\n activeUserMessageId = null;\n };\n\n const stopStreaming = (input?: { preserveRoundContext?: boolean }) => {\n const preserveRoundContext = input?.preserveRoundContext ?? false;\n\n observedText = \"\";\n pendingText = \"\";\n activeMessageId = null;\n streamStarted = false;\n\n if (!preserveRoundContext) {\n clearActiveRoundContext();\n }\n\n speech.stop();\n };\n\n const enqueueOperation = (operation: () => Promise<void> | void) => {\n queuedOperations = queuedOperations.then(\n () => operation(),\n () => operation(),\n );\n\n return queuedOperations;\n };\n\n const dispatchSegments = async (segments: string[]) => {\n if (!segments.length || destroyed) {\n return;\n }\n\n if (!streamStarted) {\n await speech.startStream({\n id,\n voice,\n audioFormat,\n sampleRate,\n });\n streamStarted = true;\n }\n\n for (const segment of segments) {\n if (destroyed) {\n return;\n }\n\n const nextText = preprocessText ? preprocessText(segment) : segment;\n if (!nextText.trim()) {\n continue;\n }\n\n await speech.appendText({\n id,\n text: nextText,\n });\n speech.commit();\n }\n };\n\n const processLatestMessage = async (\n message: AutoVoiceReplyMessage,\n final: boolean,\n ) => {\n const messageId = message.messageId || null;\n const fullText = message.content || \"\";\n\n if (!fullText.trim()) {\n return;\n }\n\n if (activeMessageId !== messageId) {\n resetStreamingState(messageId);\n }\n\n const previousText = observedText;\n\n if (previousText && !fullText.startsWith(previousText)) {\n observedText = fullText;\n return;\n }\n\n const delta = fullText.slice(previousText.length);\n observedText = fullText;\n\n if (!delta && !final) {\n return;\n }\n\n pendingText += delta;\n const { segments, remainder } = takeCommittedSegments(pendingText, final);\n pendingText = remainder;\n\n if (segments.length) {\n await dispatchSegments(segments);\n }\n\n if (final) {\n speech.finish();\n }\n };\n\n const handleSourceChange = () => {\n if (destroyed) {\n return;\n }\n\n const snapshot = source.getSnapshot();\n\n if (!enabled) {\n lastLoading = snapshot.isLoading;\n return;\n }\n\n const activeConversation = getActiveConversation(snapshot.conversations);\n const wasLoading = lastLoading;\n\n if (snapshot.isLoading && activeConversation) {\n if (activeConversation.taskId !== activeTaskId) {\n activeTaskId = activeConversation.taskId;\n activeUserMessageId = getLatestUserMessageIdFromConversation(activeConversation);\n suppressedTaskId = null;\n }\n\n if (suppressedTaskId === activeConversation.taskId) {\n lastLoading = snapshot.isLoading;\n emit();\n return;\n }\n\n const latestMessage = getLatestAssistantTextMessageAfterUser(\n activeConversation,\n activeUserMessageId,\n );\n\n if (latestMessage) {\n void enqueueOperation(() => processLatestMessage(latestMessage, false));\n }\n } else if (wasLoading && !snapshot.isLoading) {\n const finishedConversation = getConversationByTaskId(\n snapshot.conversations,\n activeTaskId,\n );\n\n if (finishedConversation && suppressedTaskId !== finishedConversation.taskId) {\n const latestMessage = getLatestAssistantTextMessageAfterUser(\n finishedConversation,\n activeUserMessageId,\n );\n\n if (latestMessage) {\n void enqueueOperation(() => processLatestMessage(latestMessage, true));\n }\n }\n\n if (finishedConversation?.taskId === suppressedTaskId) {\n suppressedTaskId = null;\n }\n clearActiveRoundContext();\n }\n\n lastLoading = snapshot.isLoading;\n emit();\n };\n\n const sourceUnsubscribe = source.subscribe(handleSourceChange);\n const speechUnsubscribe = speech.subscribe(() => {\n if (destroyed) {\n return;\n }\n\n const nextVoice = speech.getVoice?.() ?? voice ?? defaultVoice;\n if (nextVoice !== voice) {\n voice = nextVoice;\n }\n\n emit();\n });\n\n const controller: AutoVoiceReplyController = {\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n getSnapshot() {\n syncSnapshot();\n return snapshot;\n },\n setEnabled(nextEnabled) {\n if (enabled === nextEnabled) {\n return;\n }\n\n enabled = nextEnabled;\n persistEnabled();\n\n if (!enabled) {\n stopStreaming();\n suppressedTaskId = null;\n } else {\n lastLoading = source.getSnapshot().isLoading;\n handleSourceChange();\n }\n\n emit();\n },\n toggleEnabled() {\n controller.setEnabled(!enabled);\n },\n toggleEnabledOrStop() {\n const status = speech.getSnapshot().status;\n\n if (status === \"connecting\" || status === \"speaking\") {\n suppressedTaskId = activeTaskId;\n stopStreaming({ preserveRoundContext: true });\n emit();\n return;\n }\n\n controller.toggleEnabled();\n },\n stop() {\n suppressedTaskId = activeTaskId;\n stopStreaming({ preserveRoundContext: true });\n emit();\n },\n setVoice(nextVoice) {\n voice = nextVoice;\n speech.setVoice?.(nextVoice);\n emit();\n },\n getVoice() {\n return voice;\n },\n destroy() {\n if (destroyed) {\n return;\n }\n\n destroyed = true;\n stopStreaming();\n suppressedTaskId = null;\n sourceUnsubscribe();\n speechUnsubscribe();\n listeners.clear();\n },\n };\n\n return controller;\n}\n","import type { FileContent } from \"./types\";\n\nexport interface CopilotFileConstraints {\n maxCount?: number;\n maxSize?: number;\n accept?: string[];\n}\n\nexport interface CopilotManagedFile {\n id: string;\n name: string;\n size: number;\n mimeType: string;\n extension: string;\n status: \"ready\" | \"error\";\n error?: string;\n file?: File;\n content?: FileContent;\n}\n\nexport interface CopilotFileManagerSnapshot {\n files: CopilotManagedFile[];\n constraints: CopilotFileConstraints;\n}\n\nexport interface CopilotFileManager {\n getSnapshot(): CopilotFileManagerSnapshot;\n subscribe(listener: (snapshot: CopilotFileManagerSnapshot) => void): () => void;\n addFiles(input: FileList | File[]): Promise<CopilotManagedFile[]>;\n removeFile(fileId: string): void;\n clearFiles(): void;\n getReadyFiles(): CopilotManagedFile[];\n getMessageFiles(): FileContent[];\n}\n\nconst defaultConstraints: CopilotFileConstraints = {\n maxCount: 5,\n};\n\nfunction createId() {\n return `file-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction getExtension(fileName: string) {\n const lastDot = fileName.lastIndexOf(\".\");\n if (lastDot <= -1) return \"\";\n return fileName.slice(lastDot).toLowerCase();\n}\n\nfunction readFileAsBase64(file: File) {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = () => reject(reader.error || new Error(\"Failed to read file\"));\n reader.onload = () => {\n const result = typeof reader.result === \"string\" ? reader.result : \"\";\n const base64 = result.includes(\",\") ? result.split(\",\")[1] || \"\" : result;\n if (!base64) {\n reject(new Error(\"Failed to encode file\"));\n return;\n }\n resolve(base64);\n };\n reader.readAsDataURL(file);\n });\n}\n\nfunction isAcceptedType(file: File, acceptRules: string[]) {\n if (!acceptRules.length) return true;\n\n const mimeType = file.type || \"\";\n const extension = getExtension(file.name);\n\n return acceptRules.some((rule) => {\n if (!rule) return false;\n const normalizedRule = rule.trim().toLowerCase();\n if (!normalizedRule) return false;\n if (normalizedRule.startsWith(\".\")) {\n return extension === normalizedRule;\n }\n if (normalizedRule.endsWith(\"/*\")) {\n const prefix = normalizedRule.slice(0, -1);\n return mimeType.toLowerCase().startsWith(prefix);\n }\n return mimeType.toLowerCase() === normalizedRule;\n });\n}\n\nfunction validateFile(\n file: File,\n constraints: CopilotFileConstraints,\n currentCount: number,\n): string | null {\n const maxCount = constraints.maxCount ?? defaultConstraints.maxCount;\n if (typeof maxCount === \"number\" && currentCount >= maxCount) {\n return `最多只能上传 ${maxCount} 个文件`;\n }\n\n if (typeof constraints.maxSize === \"number\" && file.size > constraints.maxSize) {\n return `文件 ${file.name} 超过大小限制`;\n }\n\n if (constraints.accept && !isAcceptedType(file, constraints.accept)) {\n return `文件 ${file.name} 类型不支持`;\n }\n\n return null;\n}\n\nexport function createCopilotFileManager(\n constraints: CopilotFileConstraints = {},\n): CopilotFileManager {\n const listeners = new Set<(snapshot: CopilotFileManagerSnapshot) => void>();\n let files: CopilotManagedFile[] = [];\n const resolvedConstraints = {\n ...defaultConstraints,\n ...constraints,\n };\n\n const emit = () => {\n const snapshot = {\n files: [...files],\n constraints: resolvedConstraints,\n };\n listeners.forEach((listener) => listener(snapshot));\n };\n\n return {\n getSnapshot() {\n return {\n files: [...files],\n constraints: resolvedConstraints,\n };\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n\n async addFiles(input) {\n const incomingFiles = Array.from(input);\n const nextEntries = await Promise.all(\n incomingFiles.map(async (file, index) => {\n const id = createId();\n const error = validateFile(file, resolvedConstraints, files.length + index);\n if (error) {\n return {\n id,\n name: file.name,\n size: file.size,\n mimeType: file.type || \"application/octet-stream\",\n extension: getExtension(file.name),\n status: \"error\" as const,\n error,\n file,\n };\n }\n\n try {\n const data = await readFileAsBase64(file);\n return {\n id,\n name: file.name,\n size: file.size,\n mimeType: file.type || \"application/octet-stream\",\n extension: getExtension(file.name),\n status: \"ready\" as const,\n file,\n content: {\n type: \"file\" as const,\n data,\n name: file.name,\n mimeType: file.type || \"application/octet-stream\",\n size: file.size,\n },\n };\n } catch (error) {\n return {\n id,\n name: file.name,\n size: file.size,\n mimeType: file.type || \"application/octet-stream\",\n extension: getExtension(file.name),\n status: \"error\" as const,\n error: (error as Error).message || `文件 ${file.name} 读取失败`,\n file,\n };\n }\n }),\n );\n\n files = [...files, ...nextEntries];\n emit();\n return nextEntries;\n },\n\n removeFile(fileId) {\n files = files.filter((file) => file.id !== fileId);\n emit();\n },\n\n clearFiles() {\n files = [];\n emit();\n },\n\n getReadyFiles() {\n return files.filter((file) => file.status === \"ready\");\n },\n\n getMessageFiles() {\n return files\n .filter((file) => file.status === \"ready\" && file.content)\n .map((file) => file.content as FileContent);\n },\n };\n}\n"]}
|