diff --git a/src/auto-reply/reply/directive-handling.impl.ts b/src/auto-reply/reply/directive-handling.impl.ts index cc8b5aef6..838d7aeee 100644 --- a/src/auto-reply/reply/directive-handling.impl.ts +++ b/src/auto-reply/reply/directive-handling.impl.ts @@ -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) { diff --git a/src/auto-reply/reply/directive-handling.persist.ts b/src/auto-reply/reply/directive-handling.persist.ts index 225cae081..a7c97ad44 100644 --- a/src/auto-reply/reply/directive-handling.persist.ts +++ b/src/auto-reply/reply/directive-handling.persist.ts @@ -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, + }); } } diff --git a/src/auto-reply/reply/directive-handling.shared.ts b/src/auto-reply/reply/directive-handling.shared.ts index 04d7ad0f6..01a61b773 100644 --- a/src/auto-reply/reply/directive-handling.shared.ts +++ b/src/auto-reply/reply/directive-handling.shared.ts @@ -40,6 +40,29 @@ export const formatReasoningEvent = (level: ReasoningLevel) => { return "Reasoning OFF — hide ."; }; +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 }>;