From 2f1380f52d2a54f857d4f635f5333c9d58625b76 Mon Sep 17 00:00:00 2001 From: herjarsa <204746071+herjarsa@users.noreply.github.com> Date: Tue, 19 May 2026 15:50:02 +0200 Subject: [PATCH] refactor(default-mode): inject ultrawork via system prompt instead of visible text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When default_mode.ultrawork is enabled, inject the ultrawork behavioral instructions into the system prompt (experimental.chat.system.transform) instead of prepending them to the user's visible chat message. - system-transform.ts: No-op handler now injects ultrawork message into output.system[] when defaultMode.ultrawork is active. Checks for existing tag to avoid re-injection after compaction. - keyword-detector/hook.ts: Removes the visible text injection (output.parts[].text prepend) for default_mode.ultrawork path. Only shows the toast as the user-facing indicator. - plugin-interface.ts: Wires getUltraworkMessage from keyword-detector into createSystemTransformHandler. Result: Ultrawork mode activates silently via system prompt — the chat stays clean, and only a toast shows 'Ultrawork Mode Active'. --- src/hooks/keyword-detector/hook.ts | 11 ++--------- src/plugin-interface.ts | 6 +++++- src/plugin/system-transform.ts | 23 +++++++++++++++++++++-- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/hooks/keyword-detector/hook.ts b/src/hooks/keyword-detector/hook.ts index 1376ded90..65051021e 100644 --- a/src/hooks/keyword-detector/hook.ts +++ b/src/hooks/keyword-detector/hook.ts @@ -17,7 +17,7 @@ import { removeSystemReminders, } from "../../shared/system-directive" import type { RalphLoopHook } from "../ralph-loop" -import { getUltraworkMessage, isNonOmoAgent, isPlannerAgent } from "./constants" +import { isNonOmoAgent, isPlannerAgent } from "./constants" import type { DetectedKeyword } from "./detector" import { detectKeywordsWithType, extractPromptText, looksLikeSlashCommand } from "./detector" @@ -113,14 +113,7 @@ export function createKeywordDetectorHook( if (defaultMode?.ultrawork && !isNonMainSession && !defaultModeUltraworkInjectedSessions.has(input.sessionID)) { defaultModeUltraworkInjectedSessions.add(input.sessionID) - const ultraworkMessage = getUltraworkMessage(currentAgent, modelID) - const textPartIndex = output.parts.findIndex(isRealUserTextPart) - if (textPartIndex >= 0) { - const originalText = output.parts[textPartIndex].text ?? "" - output.parts[textPartIndex].text = `${ultraworkMessage}\n\n---\n\n${originalText}` - } - - log(`[keyword-detector] Default ultrawork mode auto-activated`, { sessionID: input.sessionID }) + log(`[keyword-detector] Default ultrawork mode auto-activated (injected via system prompt)`, { sessionID: input.sessionID }) ctx.client.tui .showToast({ diff --git a/src/plugin-interface.ts b/src/plugin-interface.ts index 5bcc0c364..79543c086 100644 --- a/src/plugin-interface.ts +++ b/src/plugin-interface.ts @@ -7,6 +7,7 @@ import { createChatMessageHandler } from "./plugin/chat-message" import { createCommandExecuteBeforeHandler } from "./plugin/command-execute-before" import { createMessagesTransformHandler } from "./plugin/messages-transform" import { createSystemTransformHandler } from "./plugin/system-transform" +import { getUltraworkMessage } from "./hooks/keyword-detector/ultrawork" import { createEventHandler } from "./plugin/event" import { createToolExecuteAfterHandler } from "./plugin/tool-execute-after" import { createToolExecuteBeforeHandler } from "./plugin/tool-execute-before" @@ -58,7 +59,10 @@ export function createPluginInterface(args: { hooks, }), - "experimental.chat.system.transform": createSystemTransformHandler(), + "experimental.chat.system.transform": createSystemTransformHandler( + pluginConfig.default_mode, + getUltraworkMessage, + ), config: managers.configHandler, diff --git a/src/plugin/system-transform.ts b/src/plugin/system-transform.ts index d6a04820c..39356a380 100644 --- a/src/plugin/system-transform.ts +++ b/src/plugin/system-transform.ts @@ -1,6 +1,25 @@ -export function createSystemTransformHandler(): ( +import type { DefaultModeConfig } from "../config/schema/default-mode" + +const ULTRAWORK_MODE_TAG = "" + +export function createSystemTransformHandler( + defaultMode?: DefaultModeConfig, + getUltraworkMessage?: (agentName?: string, modelID?: string) => string, +): ( input: { sessionID?: string; model: { id: string; providerID: string; [key: string]: unknown } }, output: { system: string[] }, ) => Promise { - return async (): Promise => {} + return async (input, output): Promise => { + if (!defaultMode?.ultrawork || !getUltraworkMessage) return + + // Avoid re-injecting if the ultrawork prompt is already in the system prompt + // (e.g. after compaction the system prompt is rebuilt and this hook fires again) + if (output.system.some((part) => part.includes(ULTRAWORK_MODE_TAG))) return + + const modelID = input.model?.id + const ultraworkMessage = getUltraworkMessage("sisyphus", modelID) + if (!ultraworkMessage) return + + output.system.push(ultraworkMessage) + } }