|
|
@@ -25,6 +25,10 @@ export interface SessionLoadDoneInfo {
|
|
|
// 文件下载标记:$$FILE_DOWNLOAD:{...}$$(模块作用域,避免每次调用重新编译)
|
|
|
const FILE_MARKER_RE = /\$\$FILE_DOWNLOAD:([\s\S]*?)\$\$/g
|
|
|
|
|
|
+// 用户消息中的上下文前缀:[context] userId=xxx, sessionId=xxx\n\n(模块作用域,避免每次调用重新编译)
|
|
|
+// 用 [^\n]* 精确限定 userId/sessionId 值(不含换行),避免贪婪 .* 越过分隔的 \n\n。
|
|
|
+const CONTEXT_PREFIX_RE = /^\[context\] userId=[^\n]*, sessionId=[^\n]*\n\n/
|
|
|
+
|
|
|
// 全局消息提示(模块作用域,避免每次调用重建 discrete api 实例)
|
|
|
const { message } = useDiscreteApi()
|
|
|
|
|
|
@@ -781,7 +785,7 @@ export function useAiChat() {
|
|
|
function stripContextPrefix(content: string, role: string): string {
|
|
|
if (role !== 'user') return content
|
|
|
// 匹配 "[context] userId=xxx, sessionId=xxx\n\n" 前缀
|
|
|
- return content.replace(/^\[context\] userId=.*?, sessionId=.*?\n\n/, '')
|
|
|
+ return content.replace(CONTEXT_PREFIX_RE, '')
|
|
|
}
|
|
|
|
|
|
// 最终扫描:处理跨 chunk 拆分导致实时匹配遗漏的标记。
|
|
|
@@ -847,7 +851,7 @@ export function useAiChat() {
|
|
|
async function resolvePermission(optionId: string) {
|
|
|
try {
|
|
|
// 记住当前要 resolve 的 requestId,防止 await 期间被新 permission 覆盖后误标记
|
|
|
- const lastMsg = messages.value[messages.value.length - 1]
|
|
|
+ const lastMsg = messages.value.at(-1)
|
|
|
const targetRequestId = lastMsg?.permission?.requestId
|
|
|
await resolveAiPermission(optionId)
|
|
|
// await 回来后检查 permission 是否仍是同一个(未被新事件覆盖)
|