fix(talk): preserve null lifecycle payloads

This commit is contained in:
Vincent Koc
2026-06-02 06:55:00 +02:00
parent ebf20241bd
commit 93fd17447a
3 changed files with 23 additions and 4 deletions
+1
View File
@@ -45,6 +45,7 @@ Docs: https://docs.openclaw.ai
### Fixes
- Talk: preserve explicit `null` payloads on controller-created turn and output-audio lifecycle events.
- Agents/TUI: keep local custom provider runs from loading plugin runtime and auth alias metadata when plugins are disabled.
- 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.
- 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.
+14
View File
@@ -134,6 +134,20 @@ describe("createTalkSessionController", () => {
expect(talk.outputAudioActive).toBe(false);
});
it("preserves explicit null lifecycle payloads", () => {
const talk = createController();
const started = talk.startTurn({ payload: null });
const ended = talk.endTurn({ payload: null, turnId: started.turnId });
const audioStarted = talk.startOutputAudio({ payload: null });
const audioDone = talk.finishOutputAudio({ payload: null });
expect(started.event?.payload).toBeNull();
expect(ended.ok ? ended.event.payload : undefined).toBeNull();
expect(audioStarted.event?.payload).toBeNull();
expect(audioDone?.payload).toBeNull();
});
it("notifies an event hook for emitted and controller-created events", () => {
const events: string[] = [];
const talk = createTalkSessionController(
+8 -4
View File
@@ -56,6 +56,10 @@ export type TalkSessionControllerOptions = {
sequencer?: TalkEventSequencer;
};
function defaultTalkEventPayload(payload: unknown): unknown {
return payload === undefined ? {} : payload;
}
export function createTalkSessionController(
params: TalkSessionControllerParams,
options: TalkSessionControllerOptions = {},
@@ -111,7 +115,7 @@ export function createTalkSessionController(
event: emit({
type: "turn.started",
turnId,
payload: startParams.payload ?? {},
payload: defaultTalkEventPayload(startParams.payload),
}),
};
};
@@ -132,7 +136,7 @@ export function createTalkSessionController(
event: emit({
type,
turnId,
payload: paramsForTurn.payload ?? {},
payload: defaultTalkEventPayload(paramsForTurn.payload),
final: true,
}),
};
@@ -174,7 +178,7 @@ export function createTalkSessionController(
return emit({
type: "output.audio.done",
turnId,
payload: paramsForOutput.payload ?? {},
payload: defaultTalkEventPayload(paramsForOutput.payload),
final: true,
});
},
@@ -189,7 +193,7 @@ export function createTalkSessionController(
event: emit({
type: "output.audio.started",
turnId: turn.turnId,
payload: paramsForOutput.payload ?? {},
payload: defaultTalkEventPayload(paramsForOutput.payload),
}),
};
},