fix: let channels control reply length

ChannelService previously truncated every reply at 4,000 characters and discarded the remainder before the platform adapter could handle it. Complete executor output now reaches each channel driver, while error redaction and channel-specific platform limits remain intact.

Release note: 消息通道回复不再由公共服务统一截断;完整结果现在交由微信、企业微信或钉钉按各自平台能力处理。
This commit is contained in:
mesalogo
2026-08-19 00:50:09 +08:00
parent 0413807b8f
commit 87dec9baf3
5 changed files with 10 additions and 37 deletions
+3 -26
View File
@@ -15,14 +15,11 @@ import {
type Outbox
} from './channel-driver'
const TRUNCATION_MARKER = '\n…(结果已截断)'
export type ChannelServiceOptions = {
allowedSenderIds?: readonly string[]
allowGroupMessages?: boolean
maximumConcurrency?: number
maximumInputLength?: number
maximumResultLength?: number
dedupStore?: DedupStore
outbox?: Outbox
onDeliveryFailure?: (error: unknown) => void
@@ -48,19 +45,6 @@ function boundedInteger(
return candidate
}
function truncate(value: string, maximumLength: number): string {
if (value.length <= maximumLength) {
return value
}
if (maximumLength <= TRUNCATION_MARKER.length) {
return value.slice(0, maximumLength)
}
return (
value.slice(0, maximumLength - TRUNCATION_MARKER.length) +
TRUNCATION_MARKER
)
}
export function redactChannelError(value: string): string {
return value
.replace(/\bBearer\s+[^\s,;]+/giu, 'Bearer []')
@@ -84,7 +68,6 @@ export class ChannelService {
private readonly allowGroupMessages: boolean
private readonly maximumConcurrency: number
private readonly maximumInputLength: number
private readonly maximumResultLength: number
private readonly dedupStore: DedupStore
private readonly outbox: Outbox
private readonly onDeliveryFailure?: (error: unknown) => void
@@ -126,12 +109,6 @@ export class ChannelService {
CHANNEL_LIMITS.maximumTextLength,
'通道输入长度限制'
)
this.maximumResultLength = boundedInteger(
options.maximumResultLength,
4_000,
CHANNEL_LIMITS.maximumResultLength,
'通道结果长度限制'
)
this.dedupStore = options.dedupStore ?? new MemoryDedupStore()
this.outbox = options.outbox ?? new MemoryOutbox()
this.onDeliveryFailure = options.onDeliveryFailure
@@ -426,13 +403,13 @@ export class ChannelService {
...(result.output === undefined
? {}
: {
output: truncate(result.output, this.maximumResultLength)
output: result.output
}),
...(result.error === undefined
? {}
: {
error: truncate(
redactChannelError(result.error),
error: redactChannelError(result.error).slice(
0,
CHANNEL_LIMITS.maximumErrorLength
)
}),