Skip to content

Commit 93fd174

Browse files
committed
fix(talk): preserve null lifecycle payloads
1 parent ebf2024 commit 93fd174

3 files changed

Lines changed: 23 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ Docs: https://docs.openclaw.ai
4545

4646
### Fixes
4747

48+
- Talk: preserve explicit `null` payloads on controller-created turn and output-audio lifecycle events.
4849
- Agents/TUI: keep local custom provider runs from loading plugin runtime and auth alias metadata when plugins are disabled.
4950
- Agents/TUI: restore in-flight TUI run switch-back behavior, keep no-policy native hook fallback available, guard vanished workspaces, and keep lightweight isolated subagents lightweight.
5051
- Agents/media: keep async image, music, and video generation starts from ending the Codex turn, so mixed requests can continue with summaries or other work while media renders in the background.

src/talk/talk-session-controller.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,20 @@ describe("createTalkSessionController", () => {
134134
expect(talk.outputAudioActive).toBe(false);
135135
});
136136

137+
it("preserves explicit null lifecycle payloads", () => {
138+
const talk = createController();
139+
140+
const started = talk.startTurn({ payload: null });
141+
const ended = talk.endTurn({ payload: null, turnId: started.turnId });
142+
const audioStarted = talk.startOutputAudio({ payload: null });
143+
const audioDone = talk.finishOutputAudio({ payload: null });
144+
145+
expect(started.event?.payload).toBeNull();
146+
expect(ended.ok ? ended.event.payload : undefined).toBeNull();
147+
expect(audioStarted.event?.payload).toBeNull();
148+
expect(audioDone?.payload).toBeNull();
149+
});
150+
137151
it("notifies an event hook for emitted and controller-created events", () => {
138152
const events: string[] = [];
139153
const talk = createTalkSessionController(

src/talk/talk-session-controller.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ export type TalkSessionControllerOptions = {
5656
sequencer?: TalkEventSequencer;
5757
};
5858

59+
function defaultTalkEventPayload(payload: unknown): unknown {
60+
return payload === undefined ? {} : payload;
61+
}
62+
5963
export function createTalkSessionController(
6064
params: TalkSessionControllerParams,
6165
options: TalkSessionControllerOptions = {},
@@ -111,7 +115,7 @@ export function createTalkSessionController(
111115
event: emit({
112116
type: "turn.started",
113117
turnId,
114-
payload: startParams.payload ?? {},
118+
payload: defaultTalkEventPayload(startParams.payload),
115119
}),
116120
};
117121
};
@@ -132,7 +136,7 @@ export function createTalkSessionController(
132136
event: emit({
133137
type,
134138
turnId,
135-
payload: paramsForTurn.payload ?? {},
139+
payload: defaultTalkEventPayload(paramsForTurn.payload),
136140
final: true,
137141
}),
138142
};
@@ -174,7 +178,7 @@ export function createTalkSessionController(
174178
return emit({
175179
type: "output.audio.done",
176180
turnId,
177-
payload: paramsForOutput.payload ?? {},
181+
payload: defaultTalkEventPayload(paramsForOutput.payload),
178182
final: true,
179183
});
180184
},
@@ -189,7 +193,7 @@ export function createTalkSessionController(
189193
event: emit({
190194
type: "output.audio.started",
191195
turnId: turn.turnId,
192-
payload: paramsForOutput.payload ?? {},
196+
payload: defaultTalkEventPayload(paramsForOutput.payload),
193197
}),
194198
};
195199
},

0 commit comments

Comments
 (0)