refactor(auto-reply): share mode-switch events

This commit is contained in:
Peter Steinberger
2026-02-15 17:03:02 +00:00
parent 9f393a045c
commit ca4c2b33d7
3 changed files with 39 additions and 31 deletions

View File

@@ -21,10 +21,9 @@ import {
import { maybeHandleQueueDirective } from "./directive-handling.queue-validation.js";
import {
formatDirectiveAck,
formatElevatedEvent,
formatElevatedRuntimeHint,
formatElevatedUnavailableText,
formatReasoningEvent,
enqueueModeSwitchEvents,
withOptions,
} from "./directive-handling.shared.js";
@@ -363,20 +362,13 @@ export async function handleDirectiveOnly(
});
}
}
if (elevatedChanged) {
const nextElevated = (sessionEntry.elevatedLevel ?? "off") as ElevatedLevel;
enqueueSystemEvent(formatElevatedEvent(nextElevated), {
sessionKey,
contextKey: "mode:elevated",
});
}
if (reasoningChanged) {
const nextReasoning = (sessionEntry.reasoningLevel ?? "off") as ReasoningLevel;
enqueueSystemEvent(formatReasoningEvent(nextReasoning), {
sessionKey,
contextKey: "mode:reasoning",
});
}
enqueueModeSwitchEvents({
enqueueSystemEvent,
sessionEntry,
sessionKey,
elevatedChanged,
reasoningChanged,
});
const parts: string[] = [];
if (directives.hasThinkDirective && directives.thinkLevel) {

View File

@@ -20,7 +20,7 @@ import { enqueueSystemEvent } from "../../infra/system-events.js";
import { applyVerboseOverride } from "../../sessions/level-overrides.js";
import { applyModelOverrideToSessionEntry } from "../../sessions/model-overrides.js";
import { resolveProfileOverride } from "./directive-handling.auth.js";
import { formatElevatedEvent, formatReasoningEvent } from "./directive-handling.shared.js";
import { enqueueModeSwitchEvents } from "./directive-handling.shared.js";
export async function persistInlineDirectives(params: {
directives: InlineDirectives;
@@ -199,20 +199,13 @@ export async function persistInlineDirectives(params: {
store[sessionKey] = sessionEntry;
});
}
if (elevatedChanged) {
const nextElevated = (sessionEntry.elevatedLevel ?? "off") as ElevatedLevel;
enqueueSystemEvent(formatElevatedEvent(nextElevated), {
sessionKey,
contextKey: "mode:elevated",
});
}
if (reasoningChanged) {
const nextReasoning = (sessionEntry.reasoningLevel ?? "off") as ReasoningLevel;
enqueueSystemEvent(formatReasoningEvent(nextReasoning), {
sessionKey,
contextKey: "mode:reasoning",
});
}
enqueueModeSwitchEvents({
enqueueSystemEvent,
sessionEntry,
sessionKey,
elevatedChanged,
reasoningChanged,
});
}
}

View File

@@ -40,6 +40,29 @@ export const formatReasoningEvent = (level: ReasoningLevel) => {
return "Reasoning OFF — hide <think>.";
};
export function enqueueModeSwitchEvents(params: {
enqueueSystemEvent: (text: string, meta: { sessionKey: string; contextKey: string }) => void;
sessionEntry: { elevatedLevel?: string | null; reasoningLevel?: string | null };
sessionKey: string;
elevatedChanged?: boolean;
reasoningChanged?: boolean;
}): void {
if (params.elevatedChanged) {
const nextElevated = (params.sessionEntry.elevatedLevel ?? "off") as ElevatedLevel;
params.enqueueSystemEvent(formatElevatedEvent(nextElevated), {
sessionKey: params.sessionKey,
contextKey: "mode:elevated",
});
}
if (params.reasoningChanged) {
const nextReasoning = (params.sessionEntry.reasoningLevel ?? "off") as ReasoningLevel;
params.enqueueSystemEvent(formatReasoningEvent(nextReasoning), {
sessionKey: params.sessionKey,
contextKey: "mode:reasoning",
});
}
}
export function formatElevatedUnavailableText(params: {
runtimeSandboxed: boolean;
failures?: Array<{ gate: string; key: string }>;