Skip to content

Commit e1c70e2

Browse files
committed
fix(client): accept boolean for debugLogger in pipeline functions
Pipeline functions (verifyEvents, transformChunks, parseSSEStream, etc.) only accepted `DebugLogger | false | null`, rejecting `true`. Added `DebugLoggerInput` type and `resolveDebugLogger()` helper so passing `true` auto-creates a DebugLogger with all logging enabled.
1 parent e285ede commit e1c70e2

8 files changed

Lines changed: 68 additions & 18 deletions

File tree

sdks/typescript/packages/client/src/__tests__/debug-logger.test.ts

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2-
import { DebugLogger, createDebugLogger } from "@/debug-logger";
2+
import { DebugLogger, createDebugLogger, resolveDebugLogger } from "@/debug-logger";
33
import { resolveAgentDebugConfig, ResolvedAgentDebugConfig } from "@/agent/types";
44

55
describe("resolveAgentDebugConfig", () => {
@@ -148,6 +148,40 @@ describe("createDebugLogger", () => {
148148
});
149149
});
150150

151+
describe("resolveDebugLogger", () => {
152+
it("returns undefined for undefined", () => {
153+
expect(resolveDebugLogger(undefined)).toBeUndefined();
154+
});
155+
156+
it("returns undefined for null", () => {
157+
expect(resolveDebugLogger(null)).toBeUndefined();
158+
});
159+
160+
it("returns undefined for false", () => {
161+
expect(resolveDebugLogger(false)).toBeUndefined();
162+
});
163+
164+
it("returns a DebugLogger instance for true", () => {
165+
const logger = resolveDebugLogger(true);
166+
expect(logger).toBeInstanceOf(DebugLogger);
167+
expect(logger!.enabled).toBe(true);
168+
expect(logger!.eventsEnabled).toBe(true);
169+
expect(logger!.lifecycleEnabled).toBe(true);
170+
});
171+
172+
it("returns the same DebugLogger instance when given one", () => {
173+
const config: ResolvedAgentDebugConfig = {
174+
enabled: true,
175+
events: true,
176+
lifecycle: false,
177+
verbose: false,
178+
};
179+
const original = new DebugLogger(config);
180+
const resolved = resolveDebugLogger(original);
181+
expect(resolved).toBe(original);
182+
});
183+
});
184+
151185
describe("DebugLogger.event()", () => {
152186
let debugSpy: ReturnType<typeof vi.spyOn>;
153187

sdks/typescript/packages/client/src/agent/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,5 @@ export type {
1010
} from "./types";
1111
export { resolveAgentDebugConfig } from "./types";
1212
export type { AgentSubscriber, AgentStateMutation, AgentSubscriberParams } from "./subscriber";
13-
export { DebugLogger, createDebugLogger } from "../debug-logger";
13+
export { DebugLogger, createDebugLogger, resolveDebugLogger } from "../debug-logger";
14+
export type { DebugLoggerInput } from "../debug-logger";

sdks/typescript/packages/client/src/apply/default.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,16 @@ import type { Observable } from "rxjs";
4848
import { concatMap, defaultIfEmpty, mergeAll, mergeMap } from "rxjs/operators";
4949
import untruncateJson from "untruncate-json";
5050
import { structuredClone_ } from "../utils";
51-
import type { DebugLogger } from "@/debug-logger";
51+
import { type DebugLoggerInput, resolveDebugLogger } from "@/debug-logger";
5252

5353
export const defaultApplyEvents = (
5454
input: RunAgentInput,
5555
events$: Observable<BaseEvent>,
5656
agent: AbstractAgent,
5757
subscribers: AgentSubscriber[],
58-
debugLogger?: DebugLogger | false | null,
58+
debugLogger?: DebugLoggerInput,
5959
): Observable<AgentStateMutation> => {
60-
const log = debugLogger || undefined;
60+
const log = resolveDebugLogger(debugLogger);
6161
let messages = structuredClone_(agent.messages);
6262
let state = structuredClone_(input.state);
6363
let currentMutation: AgentStateMutation = {};

sdks/typescript/packages/client/src/chunks/transform.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
ReasoningMessageStartEvent,
1616
} from "@ag-ui/core";
1717
import { EventType } from "@ag-ui/core";
18-
import { DebugLogger } from "@/debug-logger";
18+
import { type DebugLoggerInput, resolveDebugLogger } from "@/debug-logger";
1919

2020
interface TextMessageFields {
2121
messageId: string;
@@ -33,9 +33,9 @@ interface ReasoningMessageFields {
3333
}
3434

3535
export const transformChunks =
36-
(debugLogger?: DebugLogger | false | null) =>
36+
(debugLogger?: DebugLoggerInput) =>
3737
(events$: Observable<BaseEvent>): Observable<BaseEvent> => {
38-
const log = debugLogger || undefined;
38+
const log = resolveDebugLogger(debugLogger);
3939
let textMessageFields: TextMessageFields | undefined;
4040
let toolCallFields: ToolCallFields | undefined;
4141
let reasoningMessageFields: ReasoningMessageFields | undefined;

sdks/typescript/packages/client/src/debug-logger.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,19 @@
1-
import { ResolvedAgentDebugConfig } from "@/agent/types";
1+
import { ResolvedAgentDebugConfig, resolveAgentDebugConfig } from "@/agent/types";
2+
3+
/** Accepted input wherever a debug logger can be provided. */
4+
export type DebugLoggerInput = DebugLogger | boolean | null | undefined;
5+
6+
/**
7+
* Resolves a DebugLoggerInput into a DebugLogger or undefined.
8+
* - `true` → creates a new DebugLogger with all logging enabled
9+
* - `DebugLogger` instance → returned as-is
10+
* - `false`, `null`, `undefined` → returns undefined
11+
*/
12+
export function resolveDebugLogger(input: DebugLoggerInput): DebugLogger | undefined {
13+
if (input instanceof DebugLogger) return input;
14+
if (input === true) return new DebugLogger(resolveAgentDebugConfig(true));
15+
return undefined;
16+
}
217

318
/**
419
* Centralized debug logger for the AG-UI event pipeline.

sdks/typescript/packages/client/src/transform/http.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@ import { parseSSEStream } from "./sse";
55
import { parseProtoStream } from "./proto";
66
import * as proto from "@ag-ui/proto";
77
import { EventType } from "@ag-ui/core";
8-
import { DebugLogger } from "@/debug-logger";
8+
import { type DebugLoggerInput, resolveDebugLogger } from "@/debug-logger";
99

1010
/**
1111
* Transforms HTTP events into BaseEvents using the appropriate format parser based on content type.
1212
*/
1313
export const transformHttpEventStream = (
1414
source$: Observable<HttpEvent>,
15-
debugLogger?: DebugLogger | false | null,
15+
debugLogger?: DebugLoggerInput,
1616
): Observable<BaseEvent> => {
17-
const log = debugLogger || undefined;
17+
const log = resolveDebugLogger(debugLogger);
1818
const eventSubject = new Subject<BaseEvent>();
1919

2020
// Use ReplaySubject to buffer events until we decide on the parser

sdks/typescript/packages/client/src/transform/sse.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Observable, Subject } from "rxjs";
22
import { HttpEvent, HttpEventType } from "../run/http-request";
3-
import { DebugLogger } from "@/debug-logger";
3+
import { type DebugLoggerInput, resolveDebugLogger } from "@/debug-logger";
44

55
/**
66
* Parses a stream of HTTP events into a stream of JSON objects using Server-Sent Events (SSE) format.
@@ -12,9 +12,9 @@ import { DebugLogger } from "@/debug-logger";
1212
*/
1313
export const parseSSEStream = (
1414
source$: Observable<HttpEvent>,
15-
debugLogger?: DebugLogger | false | null,
15+
debugLogger?: DebugLoggerInput,
1616
): Observable<any> => {
17-
const log = debugLogger || undefined;
17+
const log = resolveDebugLogger(debugLogger);
1818
const jsonSubject = new Subject<any>();
1919
// Create TextDecoder with stream option set to true to handle split UTF-8 characters
2020
const decoder = new TextDecoder("utf-8", { fatal: false });

sdks/typescript/packages/client/src/verify/verify.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { BaseEvent, EventType, AGUIError } from "@ag-ui/core";
22
import { Observable, throwError, of } from "rxjs";
33
import { mergeMap } from "rxjs/operators";
4-
import { DebugLogger } from "@/debug-logger";
4+
import { type DebugLoggerInput, resolveDebugLogger } from "@/debug-logger";
55

66
export const verifyEvents =
7-
(debugLogger?: DebugLogger | false | null) =>
7+
(debugLogger?: DebugLoggerInput) =>
88
(source$: Observable<BaseEvent>): Observable<BaseEvent> => {
9-
const log = debugLogger || undefined;
9+
const log = resolveDebugLogger(debugLogger);
1010
// Declare variables in closure to maintain state across events
1111
let activeMessages = new Map<string, boolean>(); // Map of message ID -> active status
1212
let activeToolCalls = new Map<string, boolean>(); // Map of tool call ID -> active status

0 commit comments

Comments
 (0)