feat: /status 通用状态显示 + /compact 手动压缩;HTML 兼容渲染默认化
- /status:绑定会话/会话 ID/工作区/当前模型/思考强度/上下文长度/ 首 token 平均/输出速率/输入输出 tokens —— 与 Web 底部统计条同源 同算法(sessionProjections: sessionStats/tokenUsage/contextPressure), 投影插件缺失时逐组优雅降级;冷会话不强制 resume - /compact:复用 ctx.compaction.compactNow 手动压缩绑定会话历史, 异步执行不阻塞轮询,完成/失败均中文通知,同会话去重, 桥停止/热重载自动中止进行中的压缩 - 全部用户可见文案不使用 emoji - rendering 默认改 html(兼容优先)+ userQuestions/approval 双通道等 既有修改一并合入(此前已上线确认) - tests:+6 覆盖 /status 全字段与 /compact 各分支(51 全绿)
This commit is contained in:
+43
-1
@@ -9,7 +9,9 @@ export const MSG = {
|
||||
'/sessions — 按工作区列出本机会话(与 Web 对齐,排除归档)并附着',
|
||||
'/last — 查看绑定会话的上次问答(便于续接)',
|
||||
'/model — 切换当前绑定会话的模型(下一回合生效)',
|
||||
'/status — 查看当前绑定',
|
||||
'/status — 会话状态:绑定/会话ID/工作区/模型/思考强度/上下文/首token/速率/输入输出tokens',
|
||||
'/compact — 压缩当前会话历史(缩短上下文,会话空闲时执行)',
|
||||
'/rich — 渲染模式:on=富文本(需新版客户端) / off=HTML兼容(默认);本聊天永久生效',
|
||||
'/unbind — 断开绑定(不关闭本机会话)',
|
||||
'/help — 显示帮助',
|
||||
'',
|
||||
@@ -36,6 +38,25 @@ export const MSG = {
|
||||
STATUS_BOUND_COLD(label: string): string {
|
||||
return `当前绑定:${label}\n(会话当前未在内存中运行;发消息时会自动 resume。)`
|
||||
},
|
||||
COMPACT_USAGE: '用法:/compact(无参数,压缩当前绑定会话的历史,缩短上下文)',
|
||||
COMPACT_UNAVAILABLE: '当前宿主未启用压缩服务(compaction 未装配),无法执行 /compact。',
|
||||
COMPACT_STARTED: '已开始压缩会话历史…\n压缩会占用一个模型回合,期间新消息排队;完成或失败后会在这里报告结果。',
|
||||
COMPACT_BUSY: '当前会话有任务正在运行(或压缩锁被占用),无法压缩。请等本轮结束(或 /stop)后再试。',
|
||||
COMPACT_INFLIGHT: '该会话已在进行压缩,请稍候(完成后会报告结果)。',
|
||||
COMPACT_NOTHING: '压缩完成:暂无可压缩的有效历史(历史过短,或没有可安全汇总的区间)。',
|
||||
COMPACT_DONE(n: number, tokens: number): string {
|
||||
return `压缩完成:合并 ${n} 条历史记录(约 ${tokens} tokens)。上下文已缩短,会话可继续。`
|
||||
},
|
||||
COMPACT_CANCELLED: '压缩已取消(会话未改变)。',
|
||||
COMPACT_CHANGED: '压缩失败:待压缩的历史在过程中发生了变化(会话未改变),请重试。',
|
||||
COMPACT_SUMMARY_FAILED: '压缩失败:未能生成有效的摘要(会话未改变),请重试。',
|
||||
COMPACT_COMMIT_FAILED: '压缩未完整结束:部分历史可能已变化。请先检查会话状态再重试。',
|
||||
COMPACT_PERSIST_FAILED: '压缩完成但保存失败。请检查本机存储与权限后重试。',
|
||||
COMPACT_FAILED(detail?: string): string {
|
||||
const tip = '压缩失败。'
|
||||
if (!detail) return tip
|
||||
return `${tip}\n详情:${detail}`
|
||||
},
|
||||
GONE: '绑定的会话已不可用。请重新 /sessions。',
|
||||
LAST_FAILED: '无法读取上次对话。请确认已绑定,且本机 dsh web / apiProxy 可用。',
|
||||
MODEL_UNAVAILABLE(detail?: string): string {
|
||||
@@ -52,6 +73,17 @@ export const MSG = {
|
||||
MODEL_SET(selected: string): string {
|
||||
return `已切换模型:${selected}\n下一回合生效。`
|
||||
},
|
||||
RICH_USAGE: '用法:/rich on(富文本渲染,需新版客户端)|/rich off(HTML 兼容,默认)|/rich(查看当前状态)',
|
||||
RICH_STATE(mode: 'rich' | 'html'): string {
|
||||
return mode === 'rich'
|
||||
? '当前渲染模式:富文本(on)。若你的客户端把回复显示为“不支持”,请发 /rich off 切回兼容。'
|
||||
: '当前渲染模式:HTML 兼容(off)。新版客户端可用 /rich on 开启富文本渲染。'
|
||||
},
|
||||
RICH_SET(mode: 'rich' | 'html'): string {
|
||||
return mode === 'rich'
|
||||
? '已切换为富文本渲染(本聊天永久生效)。注意:需新版 Telegram 客户端才能显示,旧客户端会显示“不支持”。'
|
||||
: '已切换为 HTML 兼容渲染(本聊天永久生效),所有客户端版本均可正常显示。'
|
||||
},
|
||||
MODEL_FAILED(detail?: string): string {
|
||||
const tip = '切换模型失败。请稍后重试或在 Web 中切换。'
|
||||
if (!detail) return tip
|
||||
@@ -69,6 +101,8 @@ export type ParsedCommand =
|
||||
| { type: 'last'; text: string }
|
||||
| { type: 'model'; text: string }
|
||||
| { type: 'status'; text: string }
|
||||
| { type: 'compact'; text: string }
|
||||
| { type: 'rich'; text: string; arg?: string }
|
||||
| { type: 'unbind'; text: string }
|
||||
| { type: 'stop'; text: string }
|
||||
| { type: 'mission'; text: string }
|
||||
@@ -96,6 +130,14 @@ export function parseCommand(text: string): ParsedCommand {
|
||||
return { type: 'model', text }
|
||||
case '/status':
|
||||
return { type: 'status', text }
|
||||
case '/compact':
|
||||
return { type: 'compact', text }
|
||||
case '/rich':
|
||||
case '/render':
|
||||
case '/setting': {
|
||||
const arg = text.split(/\s+/)[1]?.toLowerCase()
|
||||
return { type: 'rich', text, arg }
|
||||
}
|
||||
case '/unbind':
|
||||
case '/disconnect':
|
||||
return { type: 'unbind', text }
|
||||
|
||||
Reference in New Issue
Block a user