refactor: centralize typing mode signals

This commit is contained in:
Peter Steinberger
2026-01-07 22:18:11 +00:00
parent bac1608933
commit 434c25331e
13 changed files with 192 additions and 73 deletions

View File

@@ -1,4 +1,5 @@
import type { TypingMode } from "../../config/types.js";
import type { TypingController } from "./typing.js";
export type TypingModeContext = {
configured?: TypingMode;
@@ -21,5 +22,56 @@ export function resolveTypingMode({
return DEFAULT_GROUP_TYPING_MODE;
}
export const shouldStartTypingImmediately = (mode: TypingMode) =>
mode === "instant";
export type TypingSignaler = {
mode: TypingMode;
shouldStartImmediately: boolean;
shouldStartOnText: boolean;
shouldStartOnReasoning: boolean;
signalRunStart: () => Promise<void>;
signalTextDelta: (text?: string) => Promise<void>;
signalReasoningDelta: () => Promise<void>;
};
export function createTypingSignaler(params: {
typing: TypingController;
mode: TypingMode;
isHeartbeat: boolean;
}): TypingSignaler {
const { typing, mode, isHeartbeat } = params;
const shouldStartImmediately = mode === "instant";
const shouldStartOnText = mode === "message" || mode === "instant";
const shouldStartOnReasoning = mode === "thinking";
const disabled = isHeartbeat || mode === "never";
const signalRunStart = async () => {
if (disabled || !shouldStartImmediately) return;
await typing.startTypingLoop();
};
const signalTextDelta = async (text?: string) => {
if (disabled) return;
if (shouldStartOnText) {
await typing.startTypingOnText(text);
return;
}
if (shouldStartOnReasoning) {
typing.refreshTypingTtl();
}
};
const signalReasoningDelta = async () => {
if (disabled || !shouldStartOnReasoning) return;
await typing.startTypingLoop();
typing.refreshTypingTtl();
};
return {
mode,
shouldStartImmediately,
shouldStartOnText,
shouldStartOnReasoning,
signalRunStart,
signalTextDelta,
signalReasoningDelta,
};
}