Enable keyword detection on first message using direct parts transformation

Previously, first messages were skipped entirely to avoid interfering with title generation.
Now, keywords detected on the first message are injected directly into the message parts
instead of using the hook message injection system, allowing keywords like 'ultrawork' to
activate on the first message of a session.

This change:
- Removes the early return that skipped first message keyword detection
- Moves keyword context generation before the isFirstMessage check
- For first messages: transforms message parts directly by prepending keyword context
- For subsequent messages: maintains existing hook message injection behavior

🤖 GENERATED WITH ASSISTANCE OF [OhMyOpenCode](https://github.com/code-yeongyu/oh-my-opencode)
This commit is contained in:
YeonGyu-Kim
2025-12-23 14:25:49 +09:00
parent 17ccf6bbfb
commit 56deaa3a3e

View File

@@ -25,11 +25,6 @@ export function createKeywordDetectorHook() {
const isFirstMessage = !sessionFirstMessageProcessed.has(input.sessionID) const isFirstMessage = !sessionFirstMessageProcessed.has(input.sessionID)
sessionFirstMessageProcessed.add(input.sessionID) sessionFirstMessageProcessed.add(input.sessionID)
if (isFirstMessage) {
log("Skipping keyword detection on first message for title generation", { sessionID: input.sessionID })
return
}
const promptText = extractPromptText(output.parts) const promptText = extractPromptText(output.parts)
const messages = detectKeywords(promptText) const messages = detectKeywords(promptText)
@@ -37,6 +32,19 @@ export function createKeywordDetectorHook() {
return return
} }
const context = messages.join("\n")
// First message: transform parts directly (for title generation compatibility)
if (isFirstMessage) {
log(`Keywords detected on first message, transforming parts directly`, { sessionID: input.sessionID, keywordCount: messages.length })
const idx = output.parts.findIndex((p) => p.type === "text" && p.text)
if (idx >= 0) {
output.parts[idx].text = `${context}\n\n---\n\n${output.parts[idx].text ?? ""}`
}
return
}
// Subsequent messages: inject as separate message
log(`Keywords detected: ${messages.length}`, { sessionID: input.sessionID }) log(`Keywords detected: ${messages.length}`, { sessionID: input.sessionID })
const message = output.message as { const message = output.message as {
@@ -46,7 +54,6 @@ export function createKeywordDetectorHook() {
tools?: Record<string, boolean> tools?: Record<string, boolean>
} }
const context = messages.join("\n")
log(`[keyword-detector] Injecting context for ${messages.length} keywords`, { sessionID: input.sessionID, contextLength: context.length }) log(`[keyword-detector] Injecting context for ${messages.length} keywords`, { sessionID: input.sessionID, contextLength: context.length })
const success = injectHookMessage(input.sessionID, context, { const success = injectHookMessage(input.sessionID, context, {
agent: message.agent, agent: message.agent,