import type { PluginInput } from "@opencode-ai/plugin" import { detectKeywordsWithType, extractPromptText, removeCodeBlocks } from "./detector" import { log } from "../../shared" import { getMainSessionID } from "../../features/claude-code-session-state" export * from "./detector" export * from "./constants" export * from "./types" export function createKeywordDetectorHook(ctx: PluginInput) { return { "chat.message": async ( input: { sessionID: string agent?: string model?: { providerID: string; modelID: string } messageID?: string }, output: { message: Record parts: Array<{ type: string; text?: string; [key: string]: unknown }> } ): Promise => { const promptText = extractPromptText(output.parts) let detectedKeywords = detectKeywordsWithType(removeCodeBlocks(promptText), input.agent) if (detectedKeywords.length === 0) { return } // Only ultrawork keywords work in non-main sessions // Other keywords (search, analyze, etc.) only work in main sessions const mainSessionID = getMainSessionID() const isNonMainSession = mainSessionID && input.sessionID !== mainSessionID if (isNonMainSession) { detectedKeywords = detectedKeywords.filter((k) => k.type === "ultrawork") if (detectedKeywords.length === 0) { log(`[keyword-detector] Skipping non-ultrawork keywords in non-main session`, { sessionID: input.sessionID, mainSessionID, }) return } } const hasUltrawork = detectedKeywords.some((k) => k.type === "ultrawork") if (hasUltrawork) { log(`[keyword-detector] Ultrawork mode activated`, { sessionID: input.sessionID }) output.message.variant = "max" ctx.client.tui .showToast({ body: { title: "Ultrawork Mode Activated", message: "Maximum precision engaged. All agents at your disposal.", variant: "success" as const, duration: 3000, }, }) .catch((err) => log(`[keyword-detector] Failed to show toast`, { error: err, sessionID: input.sessionID }) ) } log(`[keyword-detector] Detected ${detectedKeywords.length} keywords`, { sessionID: input.sessionID, types: detectedKeywords.map((k) => k.type), }) }, } }