Skip to content

Commit 56deaa3

Browse files
committed
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)
1 parent 17ccf6b commit 56deaa3

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

src/hooks/keyword-detector/index.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,26 @@ export function createKeywordDetectorHook() {
2525
const isFirstMessage = !sessionFirstMessageProcessed.has(input.sessionID)
2626
sessionFirstMessageProcessed.add(input.sessionID)
2727

28-
if (isFirstMessage) {
29-
log("Skipping keyword detection on first message for title generation", { sessionID: input.sessionID })
30-
return
31-
}
32-
3328
const promptText = extractPromptText(output.parts)
3429
const messages = detectKeywords(promptText)
3530

3631
if (messages.length === 0) {
3732
return
3833
}
3934

35+
const context = messages.join("\n")
36+
37+
// First message: transform parts directly (for title generation compatibility)
38+
if (isFirstMessage) {
39+
log(`Keywords detected on first message, transforming parts directly`, { sessionID: input.sessionID, keywordCount: messages.length })
40+
const idx = output.parts.findIndex((p) => p.type === "text" && p.text)
41+
if (idx >= 0) {
42+
output.parts[idx].text = `${context}\n\n---\n\n${output.parts[idx].text ?? ""}`
43+
}
44+
return
45+
}
46+
47+
// Subsequent messages: inject as separate message
4048
log(`Keywords detected: ${messages.length}`, { sessionID: input.sessionID })
4149

4250
const message = output.message as {
@@ -46,7 +54,6 @@ export function createKeywordDetectorHook() {
4654
tools?: Record<string, boolean>
4755
}
4856

49-
const context = messages.join("\n")
5057
log(`[keyword-detector] Injecting context for ${messages.length} keywords`, { sessionID: input.sessionID, contextLength: context.length })
5158
const success = injectHookMessage(input.sessionID, context, {
5259
agent: message.agent,

0 commit comments

Comments
 (0)