重构: aichat 双轨状态机收口 + AiCompressed 事件拆分
- generating bool + CONV_STATE_ENABLED 开关双轨退役,ConvState enum 单一真相源 - can_accept_request 接入 chat 域入口(覆盖 Stopping 竞态,严谨于 is_active) - AiCompressed 拆 AiManualCompressed/AiAutoCompressed(治自动压缩误触桌面toast+刷新) - convStates/getConvState 下沉 aiShared.ts 破循环依赖
This commit is contained in:
@@ -5,17 +5,19 @@
|
||||
//! 任一新增 return 漏写、或异常路径(前端 JS 错误/窗口崩溃恢复)跳过复位 →
|
||||
//! streaming 永久 true 卡死输入框(stop 按钮常驻、新消息入队不发)。
|
||||
//!
|
||||
//! 本模块把写侧收敛到单一 `setStreaming` 入口,做三件事:
|
||||
//! 本模块把写侧收敛到单一 `setStreaming` 入口,做两件事:
|
||||
//! 1. 合法性观测:`true→true` / `false→false` 幂等场景记 debug 日志(不拒绝——
|
||||
//! resetStreamWatchdog 等副作用场景需合法重入),异常模式(如 false 时仍在跑看门狗)
|
||||
//! 记 warn 日志供排查卡死。
|
||||
//! 2. 联动 generatingConvs:value=true 且带 convId → add(convId);value=false 且带 convId
|
||||
//! → delete(convId)。不带 convId 的复位(全局兜底)不动 generatingConvs,因其由
|
||||
//! AiCompleted/AiError 按 conversation_id 精确管理(避免误删并发会话生成态)。
|
||||
//! 3. feature flag `df-ai-generating-statemachine`:关时 guard 退化为直接赋值,
|
||||
//! 不校验不联动,回退原散布语义(灰度/回退开关)。
|
||||
//! 2. feature flag `df-ai-generating-statemachine`:关时 guard 退化为直接赋值,
|
||||
//! 不校验,回退原散布语义(灰度/回退开关)。
|
||||
//!
|
||||
//! 注:本 guard 是「写收敛 + 可观测 + 联动」三合一,不是拒绝式状态机——
|
||||
//! 批4 双轨收口后:generating 态真相归 convStates(enum),本 guard 不再联动 generatingConvs
|
||||
//! (bool 轨已退役)。streaming 单值(state.streaming)是全局当前视图流式态,另一条过渡态,
|
||||
//! 归 F-09 B 路线 per-conv streaming 收口,本批暂留。doSend setStreaming(true,{convId}) 后,
|
||||
//! 生成态由 useAiEvents handleEvent 活跃事件兜底写 setConvState('generating') 标记。
|
||||
//!
|
||||
//! 注:本 guard 是「写收敛 + 可观测」二合一,不是拒绝式状态机——
|
||||
//! streaming 是 boolean 无真正非法跃迁,guard 价值在集中入口与日志而非拦截。
|
||||
|
||||
import { state } from '@/stores/ai'
|
||||
@@ -29,8 +31,7 @@ const appSettings = useAppSettingsStore()
|
||||
/// guard 是否启用(读 appSettings,默认开=true)。
|
||||
///
|
||||
/// 默认开的理由:本 guard 是收敛性改造(行为等价 + 加可观测),非行为变更,
|
||||
/// 默认开启直接收效;flag 仅作紧急回退通道(若发现联动 generatingConvs 引入回归,
|
||||
/// 用户可在设置里关掉回退原散布语义)。
|
||||
/// 默认开启直接收效;flag 仅作紧急回退通道(若发现回归,用户可在设置里关掉回退原散布语义)。
|
||||
function isGuardEnabled(): boolean {
|
||||
return appSettings.get<boolean>(STREAMING_GUARD_FLAG, true)
|
||||
}
|
||||
@@ -38,14 +39,13 @@ function isGuardEnabled(): boolean {
|
||||
/**
|
||||
* streaming 写收敛入口 —— 替代散布的 `state.streaming = true/false`(原 14 处,现全收敛至此)。
|
||||
* @param value 目标流式态
|
||||
* @param opts.convId 关联会话 id。value=true 时 add 进 generatingConvs;
|
||||
* value=false 时 delete 出 generatingConvs。省略则不动 generatingConvs
|
||||
* (全局兜底复位场景,generatingConvs 由 AiCompleted/AiError 精确管理)。
|
||||
* @param opts.convId 关联会话 id(批4 收口后仅用于日志可观测,不再联动 generatingConvs;
|
||||
* 生成态真相归 convStates,由 useAiEvents 兜底写 setConvState 标记)。
|
||||
* @param opts.reason 调用方标注(日志可观测,如 'AiCompleted'/'stopChat'/'onStreamTimeout')。
|
||||
*
|
||||
* 行为:
|
||||
* - flag 关 → 直接 `state.streaming = value`(回退散布语义,不联动不校验)。
|
||||
* - flag 开 → 幂等检测(value===当前值记 debug)、联动 generatingConvs、写日志。
|
||||
* - flag 关 → 直接 `state.streaming = value`(回退散布语义,不校验)。
|
||||
* - flag 开 → 幂等检测(value===当前值记 debug)、写日志。
|
||||
*/
|
||||
export function setStreaming(
|
||||
value: boolean,
|
||||
@@ -73,18 +73,8 @@ export function setStreaming(
|
||||
)
|
||||
}
|
||||
|
||||
// 联动 generatingConvs:仅在有 convId 时联动。
|
||||
// value=true:convId 入 Set(标记该会话生成中,侧栏/分离窗口据此显示)。
|
||||
// value=false:convId 出 Set(该会话收尾)。无 convId 的全局复位不动 Set
|
||||
// (并发会话生成态由各自 AiCompleted/AiError 精确 delete 管理,全局清会误杀)。
|
||||
if (convId) {
|
||||
if (value) {
|
||||
state.generatingConvs.add(convId)
|
||||
} else {
|
||||
state.generatingConvs.delete(convId)
|
||||
}
|
||||
}
|
||||
|
||||
// 批4 双轨收口:generating 态真相归 convStates(enum),本 guard 不再联动 generatingConvs
|
||||
// (bool 轨已退役)。streaming 单值是另一条过渡态(F-09 per-conv streaming 收口前保留)。
|
||||
state.streaming = value
|
||||
}
|
||||
|
||||
@@ -94,9 +84,8 @@ export function setStreaming(
|
||||
* 与 setStreaming(false) 区别:本函数额外清 currentText + queue,
|
||||
* 专用于看门狗超时 / 前端异常恢复等「必须彻底清态」场景。
|
||||
*
|
||||
* TD-260621-01 per-conv:看门狗超时携带 convId 时,仅清该 conv 的 generatingConvs
|
||||
* (经 setStreaming 联动 delete),不再全清误杀并发会话生成态。不带 convId(全局兜底,
|
||||
* 如 stopListener 卸载场景)时 generatingConvs 不动,由各自会话收尾事件精确管理。
|
||||
* TD-260621-01 per-conv:看门狗超时携带 convId 时,经 setStreaming 仅复位该会话 streaming 态;
|
||||
* 该会话的 convStates 项由各自会话收尾事件精确管理(on/off 后端均会 emit 收尾态)。
|
||||
*
|
||||
* 注:currentText/queue 仍是单例(F-09 域,本批不动),per-conv 超时在多会话并发下
|
||||
* 会清当前累积的 currentText——但 currentText 仅活跃视图写入(useAiEvents handleEvent delta 累积),
|
||||
|
||||
Reference in New Issue
Block a user