fix(ask): prototype 拦截器替代 waterfall hook + TG 原生按钮作答
根因:dsh 0.1.5-rc.1 把 'user-questions/request' waterfall 分发到 per-fiber events 注册表,其他 fiber 的 ctx.on 监听(含本插件)永远收不到 分发(实测 root/global/agent 作用域监听全部落空)。 修复:包装 UserQuestionService.prototype.ask(类跨实例共享),无论哪个 fiber/实例发起的 ask 都能拦截到 agent+questions;TG 答案与原 ask 竞速, 保留 dual-path 语义;stop 时恢复原型,热重载不叠加。 功能(应用户要求): - 提问前显式发送预告文本消息 - 选项改用 TG 原生 inline keyboard 按钮(单选即点即答,多选带提交键) - 文本作答保留并与按钮作答合并,逐题累计、齐题自动提交 - 附带修复:Telegram API 调用加 15s 客户端超时(代理挂死会卡死通知队列) Co-authored-by: Shirobana Agent Bot <tg-bridge>
This commit is contained in:
co-authored by
Shirobana Agent Bot <tg-bridge>
parent
4039dec03c
commit
da06485d64
+23
-1
@@ -14,6 +14,28 @@ function inlineToHtml(text: string): string {
|
||||
return html
|
||||
}
|
||||
|
||||
/** Convert `> …` line groups into `<blockquote>` (Telegram renders it with the accent-colored left bar). */
|
||||
function blocksToHtml(text: string): string {
|
||||
const lines = text.split('\n')
|
||||
const out: string[] = []
|
||||
let quote: string[] = []
|
||||
const flush = (): void => {
|
||||
if (quote.length === 0) return
|
||||
out.push(`<blockquote>${inlineToHtml(quote.join('\n'))}</blockquote>`)
|
||||
quote = []
|
||||
}
|
||||
for (const line of lines) {
|
||||
if (line.startsWith('> ')) quote.push(line.slice(2))
|
||||
else if (line === '>') quote.push('')
|
||||
else {
|
||||
flush()
|
||||
out.push(inlineToHtml(line))
|
||||
}
|
||||
}
|
||||
flush()
|
||||
return out.join('\n')
|
||||
}
|
||||
|
||||
export function markdownToHtml(text: string): string {
|
||||
const parts = text.split(/```[\w-]*/)
|
||||
if (parts.length % 2 === 0) return inlineToHtml(text)
|
||||
@@ -23,7 +45,7 @@ export function markdownToHtml(text: string): string {
|
||||
const code = parts[i]!.replace(/^\n/, '').replace(/\n$/, '')
|
||||
html += `<pre>${escapeHtml(code)}</pre>`
|
||||
} else {
|
||||
html += inlineToHtml(parts[i]!)
|
||||
html += blocksToHtml(parts[i]!)
|
||||
}
|
||||
}
|
||||
return html
|
||||
|
||||
Reference in New Issue
Block a user