feat(coding-agent): add after_provider_response hook closes #3128

This commit is contained in:
Mario Zechner
2026-04-16 20:27:04 +02:00
parent aa78fa91fe
commit d131fcd4ba
19 changed files with 120 additions and 25 deletions

View File

@@ -20,6 +20,7 @@ export type {
} from "./runner.js";
export { ExtensionRunner } from "./runner.js";
export type {
AfterProviderResponseEvent,
AgentEndEvent,
AgentStartEvent,
// Re-exports

View File

@@ -543,6 +543,13 @@ export interface BeforeProviderRequestEvent {
payload: unknown;
}
/** Fired after a provider response is received and before the response stream is consumed. */
export interface AfterProviderResponseEvent {
type: "after_provider_response";
status: number;
headers: Record<string, string>;
}
/** Fired after user submits prompt but before agent loop. */
export interface BeforeAgentStartEvent {
type: "before_agent_start";
@@ -863,6 +870,7 @@ export type ExtensionEvent =
| SessionEvent
| ContextEvent
| BeforeProviderRequestEvent
| AfterProviderResponseEvent
| BeforeAgentStartEvent
| AgentStartEvent
| AgentEndEvent
@@ -1010,6 +1018,7 @@ export interface ExtensionAPI {
event: "before_provider_request",
handler: ExtensionHandler<BeforeProviderRequestEvent, BeforeProviderRequestEventResult>,
): void;
on(event: "after_provider_response", handler: ExtensionHandler<AfterProviderResponseEvent>): void;
on(event: "before_agent_start", handler: ExtensionHandler<BeforeAgentStartEvent, BeforeAgentStartEventResult>): void;
on(event: "agent_start", handler: ExtensionHandler<AgentStartEvent>): void;
on(event: "agent_end", handler: ExtensionHandler<AgentEndEvent>): void;

View File

@@ -314,6 +314,17 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
}
return runner.emitBeforeProviderRequest(payload);
},
onResponse: async (response, _model) => {
const runner = extensionRunnerRef.current;
if (!runner?.hasHandlers("after_provider_response")) {
return;
}
await runner.emit({
type: "after_provider_response",
status: response.status,
headers: response.headers,
});
},
sessionId: sessionManager.getSessionId(),
transformContext: async (messages) => {
const runner = extensionRunnerRef.current;