import type { GetReplyOptions } from "../auto-reply/types.js"; import type { OpenClawConfig } from "../config/config.js"; import { resolveEffectiveMessagesConfig, resolveIdentityName } from "../agents/identity.js"; import { extractShortModelName, type ResponsePrefixContext, } from "../auto-reply/reply/response-prefix-template.js"; type ModelSelectionContext = Parameters>[0]; export type ReplyPrefixContextBundle = { prefixContext: ResponsePrefixContext; responsePrefix?: string; responsePrefixContextProvider: () => ResponsePrefixContext; onModelSelected: (ctx: ModelSelectionContext) => void; }; export function createReplyPrefixContext(params: { cfg: OpenClawConfig; agentId: string; }): ReplyPrefixContextBundle { const { cfg, agentId } = params; const prefixContext: ResponsePrefixContext = { identityName: resolveIdentityName(cfg, agentId), }; const onModelSelected = (ctx: ModelSelectionContext) => { // Mutate the object directly instead of reassigning to ensure closures see updates. prefixContext.provider = ctx.provider; prefixContext.model = extractShortModelName(ctx.model); prefixContext.modelFull = `${ctx.provider}/${ctx.model}`; prefixContext.thinkingLevel = ctx.thinkLevel ?? "off"; }; return { prefixContext, responsePrefix: resolveEffectiveMessagesConfig(cfg, agentId).responsePrefix, responsePrefixContextProvider: () => prefixContext, onModelSelected, }; }