refactor(default-mode): inject ultrawork via system prompt instead of visible text
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 <ultrawork-mode> 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'.
This commit is contained in:
@@ -17,7 +17,7 @@ import {
|
|||||||
removeSystemReminders,
|
removeSystemReminders,
|
||||||
} from "../../shared/system-directive"
|
} from "../../shared/system-directive"
|
||||||
import type { RalphLoopHook } from "../ralph-loop"
|
import type { RalphLoopHook } from "../ralph-loop"
|
||||||
import { getUltraworkMessage, isNonOmoAgent, isPlannerAgent } from "./constants"
|
import { isNonOmoAgent, isPlannerAgent } from "./constants"
|
||||||
import type { DetectedKeyword } from "./detector"
|
import type { DetectedKeyword } from "./detector"
|
||||||
import { detectKeywordsWithType, extractPromptText, looksLikeSlashCommand } from "./detector"
|
import { detectKeywordsWithType, extractPromptText, looksLikeSlashCommand } from "./detector"
|
||||||
|
|
||||||
@@ -113,14 +113,7 @@ export function createKeywordDetectorHook(
|
|||||||
if (defaultMode?.ultrawork && !isNonMainSession && !defaultModeUltraworkInjectedSessions.has(input.sessionID)) {
|
if (defaultMode?.ultrawork && !isNonMainSession && !defaultModeUltraworkInjectedSessions.has(input.sessionID)) {
|
||||||
defaultModeUltraworkInjectedSessions.add(input.sessionID)
|
defaultModeUltraworkInjectedSessions.add(input.sessionID)
|
||||||
|
|
||||||
const ultraworkMessage = getUltraworkMessage(currentAgent, modelID)
|
log(`[keyword-detector] Default ultrawork mode auto-activated (injected via system prompt)`, { sessionID: input.sessionID })
|
||||||
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 })
|
|
||||||
|
|
||||||
ctx.client.tui
|
ctx.client.tui
|
||||||
.showToast({
|
.showToast({
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import { createChatMessageHandler } from "./plugin/chat-message"
|
|||||||
import { createCommandExecuteBeforeHandler } from "./plugin/command-execute-before"
|
import { createCommandExecuteBeforeHandler } from "./plugin/command-execute-before"
|
||||||
import { createMessagesTransformHandler } from "./plugin/messages-transform"
|
import { createMessagesTransformHandler } from "./plugin/messages-transform"
|
||||||
import { createSystemTransformHandler } from "./plugin/system-transform"
|
import { createSystemTransformHandler } from "./plugin/system-transform"
|
||||||
|
import { getUltraworkMessage } from "./hooks/keyword-detector/ultrawork"
|
||||||
import { createEventHandler } from "./plugin/event"
|
import { createEventHandler } from "./plugin/event"
|
||||||
import { createToolExecuteAfterHandler } from "./plugin/tool-execute-after"
|
import { createToolExecuteAfterHandler } from "./plugin/tool-execute-after"
|
||||||
import { createToolExecuteBeforeHandler } from "./plugin/tool-execute-before"
|
import { createToolExecuteBeforeHandler } from "./plugin/tool-execute-before"
|
||||||
@@ -58,7 +59,10 @@ export function createPluginInterface(args: {
|
|||||||
hooks,
|
hooks,
|
||||||
}),
|
}),
|
||||||
|
|
||||||
"experimental.chat.system.transform": createSystemTransformHandler(),
|
"experimental.chat.system.transform": createSystemTransformHandler(
|
||||||
|
pluginConfig.default_mode,
|
||||||
|
getUltraworkMessage,
|
||||||
|
),
|
||||||
|
|
||||||
config: managers.configHandler,
|
config: managers.configHandler,
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,25 @@
|
|||||||
export function createSystemTransformHandler(): (
|
import type { DefaultModeConfig } from "../config/schema/default-mode"
|
||||||
|
|
||||||
|
const ULTRAWORK_MODE_TAG = "<ultrawork-mode>"
|
||||||
|
|
||||||
|
export function createSystemTransformHandler(
|
||||||
|
defaultMode?: DefaultModeConfig,
|
||||||
|
getUltraworkMessage?: (agentName?: string, modelID?: string) => string,
|
||||||
|
): (
|
||||||
input: { sessionID?: string; model: { id: string; providerID: string; [key: string]: unknown } },
|
input: { sessionID?: string; model: { id: string; providerID: string; [key: string]: unknown } },
|
||||||
output: { system: string[] },
|
output: { system: string[] },
|
||||||
) => Promise<void> {
|
) => Promise<void> {
|
||||||
return async (): Promise<void> => {}
|
return async (input, output): Promise<void> => {
|
||||||
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user