From fd6a33b88f544f61b39314a30602f57c7009ea62 Mon Sep 17 00:00:00 2001 From: justsisyphus Date: Fri, 16 Jan 2026 18:28:39 +0900 Subject: [PATCH] fix(context-injector): add mainSessionID fallback for synthetic part injection The transform hook was failing to inject synthetic parts because message.info.sessionID is not always available in the OpenCode SDK. Fix: Use getMainSessionID() as fallback when message.info.sessionID is undefined. This ensures keyword-detector and claude-code-hooks content (like ulw/ultrawork) is properly injected even when the SDK doesn't provide sessionID in message.info. --- src/features/context-injector/injector.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/features/context-injector/injector.ts b/src/features/context-injector/injector.ts index db7f2cbf..62e2e95e 100644 --- a/src/features/context-injector/injector.ts +++ b/src/features/context-injector/injector.ts @@ -1,6 +1,7 @@ import type { ContextCollector } from "./collector" import type { Message, Part } from "@opencode-ai/sdk" import { log } from "../../shared" +import { getMainSessionID } from "../claude-code-session-state" interface OutputPart { type: string @@ -105,14 +106,17 @@ export function createContextInjectorMessagesTransformHook( } const lastUserMessage = messages[lastUserMessageIndex] - const sessionID = (lastUserMessage.info as unknown as { sessionID?: string }).sessionID - log("[DEBUG] Extracted sessionID from lastUserMessage.info", { + // Try message.info.sessionID first, fallback to mainSessionID + const messageSessionID = (lastUserMessage.info as unknown as { sessionID?: string }).sessionID + const sessionID = messageSessionID ?? getMainSessionID() + log("[DEBUG] Extracted sessionID", { + messageSessionID, + mainSessionID: getMainSessionID(), sessionID, infoKeys: Object.keys(lastUserMessage.info), - lastUserMessageInfo: JSON.stringify(lastUserMessage.info).slice(0, 200), }) if (!sessionID) { - log("[DEBUG] sessionID is undefined or empty") + log("[DEBUG] sessionID is undefined (both message.info and mainSessionID are empty)") return }