































@@ -19,6 +19,7 @@ type ProcessSupervisor = ReturnType<
1919type ManagedRun = Awaited<ReturnType<ProcessSupervisor["spawn"]>>;
2020type ClaudeLiveTurn = {
2121backend: CliBackendConfig;
22+outputLimits: ClaudeLiveOutputLimits;
2223startedAtMs: number;
2324rawLines: string[];
2425rawChars: number;
@@ -49,13 +50,21 @@ type ClaudeLiveSession = {
4950type ClaudeLiveRunResult = {
5051output: CliOutput;
5152};
53+type ClaudeLiveOutputLimits = {
54+maxTurnRawChars: number;
55+maxPendingLineChars: number;
56+maxTurnLines: number;
57+};
52585359const CLAUDE_LIVE_IDLE_TIMEOUT_MS = 10 * 60 * 1_000;
5460const CLAUDE_LIVE_MAX_SESSIONS = 16;
5561const CLAUDE_LIVE_MAX_STDERR_CHARS = 64 * 1024;
56-const CLAUDE_LIVE_MAX_TURN_RAW_CHARS = 2 * 1024 * 1024;
57-const CLAUDE_LIVE_MAX_PENDING_LINE_CHARS = CLAUDE_LIVE_MAX_TURN_RAW_CHARS;
58-const CLAUDE_LIVE_MAX_TURN_LINES = 5_000;
62+const CLAUDE_LIVE_DEFAULT_MAX_TURN_RAW_CHARS = 8 * 1024 * 1024;
63+const CLAUDE_LIVE_MIN_TURN_RAW_CHARS = 1_024;
64+const CLAUDE_LIVE_MAX_CONFIGURABLE_TURN_RAW_CHARS = 64 * 1024 * 1024;
65+const CLAUDE_LIVE_DEFAULT_MAX_TURN_LINES = 20_000;
66+const CLAUDE_LIVE_MIN_TURN_LINES = 100;
67+const CLAUDE_LIVE_MAX_CONFIGURABLE_TURN_LINES = 100_000;
5968const CLAUDE_LIVE_CLOSE_WAIT_TIMEOUT_MS = 5_000;
6069const liveSessions = new Map<string, ClaudeLiveSession>();
6170const liveSessionCreates = new Map<string, Promise<ClaudeLiveSession>>();
@@ -439,11 +448,45 @@ function isRecord(value: unknown): value is Record<string, unknown> {
439448return Boolean(value && typeof value === "object" && !Array.isArray(value));
440449}
441450451+function normalizePositiveInt(
452+value: number | undefined,
453+fallback: number,
454+min: number,
455+max: number,
456+): number {
457+if (!Number.isInteger(value)) {
458+return fallback;
459+}
460+return Math.min(Math.max(value, min), max);
461+}
462+463+function resolveClaudeLiveOutputLimits(backend: CliBackendConfig): ClaudeLiveOutputLimits {
464+const configured = backend.reliability?.outputLimits;
465+const maxTurnRawChars = normalizePositiveInt(
466+configured?.maxTurnRawChars,
467+CLAUDE_LIVE_DEFAULT_MAX_TURN_RAW_CHARS,
468+CLAUDE_LIVE_MIN_TURN_RAW_CHARS,
469+CLAUDE_LIVE_MAX_CONFIGURABLE_TURN_RAW_CHARS,
470+);
471+return {
472+ maxTurnRawChars,
473+maxPendingLineChars: maxTurnRawChars,
474+maxTurnLines: normalizePositiveInt(
475+configured?.maxTurnLines,
476+CLAUDE_LIVE_DEFAULT_MAX_TURN_LINES,
477+CLAUDE_LIVE_MIN_TURN_LINES,
478+CLAUDE_LIVE_MAX_CONFIGURABLE_TURN_LINES,
479+),
480+};
481+}
482+442483function parseClaudeLiveJsonLine(
443484session: ClaudeLiveSession,
444485trimmed: string,
445486): Record<string, unknown> | null {
446-if (trimmed.length > CLAUDE_LIVE_MAX_PENDING_LINE_CHARS) {
487+const maxPendingLineChars =
488+session.currentTurn?.outputLimits.maxPendingLineChars ?? CLAUDE_LIVE_DEFAULT_MAX_TURN_RAW_CHARS;
489+if (trimmed.length > maxPendingLineChars) {
447490closeLiveSession(
448491session,
449492"abort",
@@ -504,8 +547,8 @@ function handleClaudeLiveLine(session: ClaudeLiveSession, line: string): void {
504547}
505548turn.rawChars += trimmed.length + 1;
506549if (
507-turn.rawChars > CLAUDE_LIVE_MAX_TURN_RAW_CHARS ||
508-turn.rawLines.length >= CLAUDE_LIVE_MAX_TURN_LINES
550+turn.rawChars > turn.outputLimits.maxTurnRawChars ||
551+turn.rawLines.length >= turn.outputLimits.maxTurnLines
509552) {
510553closeLiveSession(
511554session,
@@ -541,7 +584,9 @@ function handleClaudeLiveLine(session: ClaudeLiveSession, line: string): void {
541584function handleClaudeStdout(session: ClaudeLiveSession, chunk: string) {
542585resetNoOutputTimer(session);
543586session.stdoutBuffer += chunk;
544-if (session.stdoutBuffer.length > CLAUDE_LIVE_MAX_PENDING_LINE_CHARS) {
587+const maxPendingLineChars =
588+session.currentTurn?.outputLimits.maxPendingLineChars ?? CLAUDE_LIVE_DEFAULT_MAX_TURN_RAW_CHARS;
589+if (session.stdoutBuffer.length > maxPendingLineChars) {
545590closeLiveSession(
546591session,
547592"abort",
@@ -719,6 +764,7 @@ function createTurn(params: {
719764}): ClaudeLiveTurn {
720765const turn: ClaudeLiveTurn = {
721766backend: params.context.preparedBackend.backend,
767+outputLimits: resolveClaudeLiveOutputLimits(params.context.preparedBackend.backend),
722768startedAtMs: Date.now(),
723769rawLines: [],
724770rawChars: 0,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。