fix(agent): restore streamFn extension compatibility

Keep streamFn required for typed callers while preserving the legacy runtime fallback for extensions that omit it.\n\nfixes #6915
This commit is contained in:
Mario Zechner
2026-07-21 18:34:56 +02:00
parent b142504125
commit b9e5c5d941
26 changed files with 210 additions and 88 deletions
@@ -24,7 +24,7 @@ describe("AgentSession auto-compaction queue resume", () => {
const model = getModel("anthropic", "claude-sonnet-4-5")!;
const agent = new Agent({
streamFunction: streamSimple,
streamFn: streamSimple,
initialState: {
model,
systemPrompt: "Test",
@@ -49,7 +49,7 @@ describe.skipIf(!API_KEY)("AgentSession compaction e2e", () => {
const model = getModel("anthropic", "claude-sonnet-4-5")!;
const agent = new Agent({
getApiKey: () => API_KEY,
streamFunction: streamSimple,
streamFn: streamSimple,
initialState: {
model,
systemPrompt: "You are a helpful assistant. Be concise.",
@@ -90,7 +90,7 @@ describe("AgentSession concurrent prompt guard", () => {
systemPrompt: "Test",
tools: [],
},
streamFunction: (_model, _context, options) => {
streamFn: (_model, _context, options) => {
abortSignal = options?.signal;
const stream = new MockAssistantStream();
queueMicrotask(() => {
@@ -195,7 +195,7 @@ describe("AgentSession concurrent prompt guard", () => {
systemPrompt: "Test",
tools: [],
},
streamFunction: (_model, context, options) => {
streamFn: (_model, context, options) => {
abortSignal = options?.signal;
const stream = new MockAssistantStream();
queueMicrotask(() => {
@@ -301,7 +301,7 @@ describe("AgentSession concurrent prompt guard", () => {
systemPrompt: "Test",
tools: [],
},
streamFunction: () => {
streamFn: () => {
const stream = new MockAssistantStream();
queueMicrotask(() => {
stream.push({ type: "start", partial: createAssistantMessage("") });
@@ -362,7 +362,7 @@ describe("AgentSession concurrent prompt guard", () => {
systemPrompt: "Test",
tools: [tool],
},
streamFunction: async (_model, context) => {
streamFn: async (_model, context) => {
const stream = new MockAssistantStream();
queueMicrotask(() => {
const toolResultCount = context.messages.filter((message) => message.role === "toolResult").length;
@@ -508,7 +508,7 @@ describe("AgentSession concurrent prompt guard", () => {
systemPrompt: "Test",
tools: [tool],
},
streamFunction: async (_model, context) => {
streamFn: async (_model, context) => {
const stream = new MockAssistantStream();
queueMicrotask(() => {
const hasToolResult = context.messages.some((message) => message.role === "toolResult");
@@ -82,7 +82,7 @@ describe("AgentSession retry", () => {
const agent = new Agent({
getApiKey: () => "test-key",
initialState: { model, systemPrompt: "Test", tools: [] },
streamFunction: () => {
streamFn: () => {
callCount++;
const stream = new MockAssistantStream();
queueMicrotask(() => {
@@ -203,7 +203,7 @@ describe("AgentSession retry", () => {
const agent = new Agent({
getApiKey: () => "test-key",
initialState: { model, systemPrompt: "Test", tools: [] },
streamFunction: streamFn,
streamFn: streamFn,
});
const sessionManager = SessionManager.inMemory();
const settingsManager = SettingsManager.create(tempDir, tempDir);
@@ -255,7 +255,7 @@ describe("AgentSession retry", () => {
const agent = new Agent({
getApiKey: () => "test-key",
initialState: { model, systemPrompt: "Test", tools: [] },
streamFunction: () => {
streamFn: () => {
callCount++;
const stream = new MockAssistantStream();
queueMicrotask(() => {
@@ -75,7 +75,7 @@ async function createSession() {
const session = new AgentSession({
agent: new Agent({
getApiKey: () => "test-key",
streamFunction: streamSimple,
streamFn: streamSimple,
initialState: {
model,
systemPrompt: "You are a helpful assistant.",
@@ -89,7 +89,7 @@ describe.skipIf(!API_KEY)("Compaction extensions", () => {
const model = getModel("anthropic", "claude-sonnet-4-5")!;
const agent = new Agent({
getApiKey: () => API_KEY,
streamFunction: streamSimple,
streamFn: streamSimple,
initialState: {
model,
systemPrompt: "You are a helpful assistant. Be concise.",
@@ -114,7 +114,7 @@ async function createRuntimeHost(options: { withAuth: boolean; responseDelayMs:
systemPrompt: "Test",
tools: [],
},
streamFunction: (_model, _context, _options) => {
streamFn: (_model, _context, _options) => {
const stream = new MockAssistantStream();
queueMicrotask(() => {
stream.push({ type: "start", partial: createAssistantMessage("") });
+1 -1
View File
@@ -137,7 +137,7 @@ export async function createHarness(options: HarnessOptions = {}): Promise<Harne
const agent = new Agent({
getApiKey: () => (withConfiguredAuth ? "faux-key" : undefined),
streamFunction: streamSimple,
streamFn: streamSimple,
initialState: {
model,
systemPrompt: options.systemPrompt ?? "You are a test assistant.",
@@ -61,7 +61,7 @@ describe("regression #5596: missing configured theme export", () => {
tools: [],
},
convertToLlm,
streamFunction: streamSimple,
streamFn: streamSimple,
});
const session = new AgentSession({
agent,
+1 -1
View File
@@ -378,7 +378,7 @@ async function createHarnessWithResourceLoader(
systemPrompt: options.systemPrompt ?? "You are a test assistant.",
tools: options.tools ?? [],
},
streamFunction: streamFn,
streamFn: streamFn,
});
const sessionManager = SessionManager.inMemory();
+1 -1
View File
@@ -246,7 +246,7 @@ export async function createTestSession(options: TestSessionOptions = {}): Promi
systemPrompt: options.systemPrompt ?? "You are a helpful assistant. Be extremely concise.",
tools: createCodingTools(process.cwd()),
},
streamFunction: streamSimple,
streamFn: streamSimple,
});
const sessionManager = options.inMemory ? SessionManager.inMemory() : SessionManager.create(tempDir);