fix: mutate prefixContext object instead of reassigning for closure correctness

This commit is contained in:
Sebastian
2026-01-14 23:20:19 -05:00
parent 7b04e6ac42
commit 113eea5047
8 changed files with 30 additions and 53 deletions

View File

@@ -127,9 +127,6 @@ export async function runAgentTurnWithFallback(params: {
run: (provider, model) => {
// Notify that model selection is complete (including after fallback).
// This allows responsePrefix template interpolation with the actual model.
logVerbose(
`[prefix-debug] onModelSelected firing: provider=${provider} model=${model} thinkLevel=${params.followupRun.run.thinkLevel}`,
);
params.opts?.onModelSelected?.({
provider,
model,

View File

@@ -75,14 +75,6 @@ function normalizeReplyPayloadInternal(
// Prefer dynamic context provider over static context
const prefixContext = opts.responsePrefixContextProvider?.() ?? opts.responsePrefixContext;
// Debug logging for prefix template resolution
if (opts.responsePrefix?.includes("{")) {
// eslint-disable-next-line no-console
console.log(
`[prefix-debug] normalizing with context: ${JSON.stringify(prefixContext)} prefix: ${opts.responsePrefix}`,
);
}
return normalizeReplyPayload(payload, {
responsePrefix: opts.responsePrefix,
responsePrefixContext: prefixContext,

View File

@@ -329,13 +329,11 @@ export async function processDiscordMessage(ctx: DiscordMessagePreflightContext)
? !discordConfig.blockStreaming
: undefined,
onModelSelected: (ctx) => {
prefixContext = {
...prefixContext,
provider: ctx.provider,
model: extractShortModelName(ctx.model),
modelFull: `${ctx.provider}/${ctx.model}`,
thinkingLevel: ctx.thinkLevel ?? "off",
};
// Mutate the object directly instead of reassigning to ensure the closure sees updates
prefixContext.provider = ctx.provider;
prefixContext.model = extractShortModelName(ctx.model);
prefixContext.modelFull = `${ctx.provider}/${ctx.model}`;
prefixContext.thinkingLevel = ctx.thinkLevel ?? "off";
},
},
});

View File

@@ -386,13 +386,11 @@ export async function monitorIMessageProvider(opts: MonitorIMessageOpts = {}): P
? !accountInfo.config.blockStreaming
: undefined,
onModelSelected: (ctx) => {
prefixContext = {
...prefixContext,
provider: ctx.provider,
model: extractShortModelName(ctx.model),
modelFull: `${ctx.provider}/${ctx.model}`,
thinkingLevel: ctx.thinkLevel ?? "off",
};
// Mutate the object directly instead of reassigning to ensure the closure sees updates
prefixContext.provider = ctx.provider;
prefixContext.model = extractShortModelName(ctx.model);
prefixContext.modelFull = `${ctx.provider}/${ctx.model}`;
prefixContext.thinkingLevel = ctx.thinkLevel ?? "off";
},
},
});

View File

@@ -354,13 +354,11 @@ export function createSignalEventHandler(deps: SignalEventHandlerDeps) {
disableBlockStreaming:
typeof deps.blockStreaming === "boolean" ? !deps.blockStreaming : undefined,
onModelSelected: (ctx) => {
prefixContext = {
...prefixContext,
provider: ctx.provider,
model: extractShortModelName(ctx.model),
modelFull: `${ctx.provider}/${ctx.model}`,
thinkingLevel: ctx.thinkLevel ?? "off",
};
// Mutate the object directly instead of reassigning to ensure the closure sees updates
prefixContext.provider = ctx.provider;
prefixContext.model = extractShortModelName(ctx.model);
prefixContext.modelFull = `${ctx.provider}/${ctx.model}`;
prefixContext.thinkingLevel = ctx.thinkLevel ?? "off";
},
},
});

View File

@@ -117,13 +117,11 @@ export async function dispatchPreparedSlackMessage(prepared: PreparedSlackMessag
? !account.config.blockStreaming
: undefined,
onModelSelected: (ctx) => {
prefixContext = {
...prefixContext,
provider: ctx.provider,
model: extractShortModelName(ctx.model),
modelFull: `${ctx.provider}/${ctx.model}`,
thinkingLevel: ctx.thinkLevel ?? "off",
};
// Mutate the object directly instead of reassigning to ensure the closure sees updates
prefixContext.provider = ctx.provider;
prefixContext.model = extractShortModelName(ctx.model);
prefixContext.modelFull = `${ctx.provider}/${ctx.model}`;
prefixContext.thinkingLevel = ctx.thinkLevel ?? "off";
},
},
});

View File

@@ -162,13 +162,11 @@ export const dispatchTelegramMessage = async ({
: undefined,
disableBlockStreaming,
onModelSelected: (ctx) => {
prefixContext = {
...prefixContext,
provider: ctx.provider,
model: extractShortModelName(ctx.model),
modelFull: `${ctx.provider}/${ctx.model}`,
thinkingLevel: ctx.thinkLevel ?? "off",
};
// Mutate the object directly instead of reassigning to ensure the closure sees updates
prefixContext.provider = ctx.provider;
prefixContext.model = extractShortModelName(ctx.model);
prefixContext.modelFull = `${ctx.provider}/${ctx.model}`;
prefixContext.thinkingLevel = ctx.thinkLevel ?? "off";
},
},
});

View File

@@ -278,13 +278,11 @@ export async function processMessage(params: {
? !params.cfg.channels.whatsapp.blockStreaming
: undefined,
onModelSelected: (ctx) => {
prefixContext = {
...prefixContext,
provider: ctx.provider,
model: extractShortModelName(ctx.model),
modelFull: `${ctx.provider}/${ctx.model}`,
thinkingLevel: ctx.thinkLevel ?? "off",
};
// Mutate the object directly instead of reassigning to ensure the closure sees updates
prefixContext.provider = ctx.provider;
prefixContext.model = extractShortModelName(ctx.model);
prefixContext.modelFull = `${ctx.provider}/${ctx.model}`;
prefixContext.thinkingLevel = ctx.thinkLevel ?? "off";
},
},
});