- /status:绑定会话/会话 ID/工作区/当前模型/思考强度/上下文长度/ 首 token 平均/输出速率/输入输出 tokens —— 与 Web 底部统计条同源 同算法(sessionProjections: sessionStats/tokenUsage/contextPressure), 投影插件缺失时逐组优雅降级;冷会话不强制 resume - /compact:复用 ctx.compaction.compactNow 手动压缩绑定会话历史, 异步执行不阻塞轮询,完成/失败均中文通知,同会话去重, 桥停止/热重载自动中止进行中的压缩 - 全部用户可见文案不使用 emoji - rendering 默认改 html(兼容优先)+ userQuestions/approval 双通道等 既有修改一并合入(此前已上线确认) - tests:+6 覆盖 /status 全字段与 /compact 各分支(51 全绿)
53 lines
2.0 KiB
JavaScript
53 lines
2.0 KiB
JavaScript
import Schema from '@deepseek-ai/schemastery';
|
|
import { TelegramBridge } from './bridge.js';
|
|
export const name = 'dsh-telegram-channel';
|
|
/** agents: followup; apiProxy: workspace/session catalog + /model; userQuestions: TG answer hook (Cordis requires inject). */
|
|
export const inject = ['agents', 'apiProxy', 'userQuestions'];
|
|
export const Config = Schema.object({
|
|
token: Schema.string().default(''),
|
|
allowedUserIds: Schema.array(Schema.number()).default([]),
|
|
allowAllUsers: Schema.boolean().default(false),
|
|
maxMessageLength: Schema.number().default(4096),
|
|
pollingTimeoutSec: Schema.number().default(30),
|
|
rendering: Schema.string().default('html'),
|
|
});
|
|
function resolveAllowedUserIds(config) {
|
|
if (config.allowedUserIds && config.allowedUserIds.length > 0) {
|
|
return config.allowedUserIds;
|
|
}
|
|
const raw = process.env.DSH_TELEGRAM_ALLOWED_USER_IDS ?? '';
|
|
return raw
|
|
.split(/[,;\s]+/)
|
|
.map((part) => part.trim())
|
|
.filter(Boolean)
|
|
.map((part) => Number(part))
|
|
.filter((n) => Number.isFinite(n) && n > 0);
|
|
}
|
|
export function apply(ctx, config) {
|
|
const token = (config.token && config.token.length > 0)
|
|
? config.token
|
|
: (process.env.DSH_TELEGRAM_TOKEN ?? '');
|
|
if (!token) {
|
|
ctx.logger.error('dsh-telegram-channel: missing bot token (set config.token or DSH_TELEGRAM_TOKEN); polling not started');
|
|
return;
|
|
}
|
|
const bridge = new TelegramBridge(ctx, {
|
|
token,
|
|
allowedUserIds: resolveAllowedUserIds(config),
|
|
allowAllUsers: config.allowAllUsers ?? false,
|
|
maxMessageLength: config.maxMessageLength ?? 4096,
|
|
pollingTimeoutSec: config.pollingTimeoutSec ?? 30,
|
|
rendering: config.rendering === 'rich' ? 'rich' : 'html',
|
|
});
|
|
ctx.effect(() => {
|
|
bridge.start();
|
|
return () => { void bridge.stop(); };
|
|
}, 'dsh-telegram-channel.serve');
|
|
}
|
|
export * from './format.js';
|
|
export * from './client.js';
|
|
export * from './auth.js';
|
|
export * from './commands.js';
|
|
export * from './label.js';
|
|
export * from './bridge.js';
|