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) + } }