import type { PluginHookContributions } from "../../types/hook"; type MessagesTransformHook = NonNullable< PluginHookContributions["experimental.chat.messages.transform"] >; export const PHASE_REMINDER = `Recall Workflow Rules: Understand → choose best path (delegate by rules and parallelize independent work) → execute → verify. If mentioning a specialist, launch it in the same turn.`; const REMINDER_PREFIX = "Recall Workflow Rules:"; function isRecord(value: unknown): value is Record { return typeof value === "object" && value !== null; } function isOrchestratorAgent(agent: unknown): boolean { if (typeof agent !== "string") return true; return agent.toLowerCase() === "orchestrator"; } function prependReminder(text: string): string { if (text.includes(REMINDER_PREFIX)) { return text; } return `${PHASE_REMINDER}\n\n---\n\n${text}`; } export function createPhaseReminderHandler(): MessagesTransformHook { return async (_input: unknown, output: unknown) => { if (!isRecord(output)) return; const messages = output.messages; if (!Array.isArray(messages) || messages.length === 0) return; for (let index = messages.length - 1; index >= 0; index -= 1) { const message = messages[index]; if (!isRecord(message)) continue; const info = message.info; if (!isRecord(info) || info.role !== "user") continue; if (!isOrchestratorAgent(info.agent)) return; const parts = message.parts; if (!Array.isArray(parts)) return; const textPart = parts.find((part) => part?.type === "text" && typeof part.text === "string"); if (!textPart || typeof textPart.text !== "string") return; textPart.text = prependReminder(textPart.text); return; } }; }