fix: render talk transcripts in native webchat

This commit is contained in:
Peter Steinberger
2026-05-02 02:46:59 +01:00
parent 225b71db1e
commit ff45bc1f88
8 changed files with 164 additions and 12 deletions

View File

@@ -133,6 +133,13 @@ struct MacGatewayChatTransport: OpenClawChatTransport {
timeoutMs: 10000)
}
func setActiveSessionKey(_ sessionKey: String) async throws {
_ = try await GatewayConnection.shared.request(
method: "sessions.messages.subscribe",
params: ["key": AnyCodable(sessionKey)],
timeoutMs: 10000)
}
func events() -> AsyncStream<OpenClawChatTransportEvent> {
AsyncStream { continuation in
let task = Task {
@@ -184,6 +191,15 @@ struct MacGatewayChatTransport: OpenClawChatTransport {
return nil
}
return .chat(chat)
case "session.message":
guard let payload = evt.payload else { return nil }
guard let message = try? JSONDecoder().decode(
OpenClawSessionMessageEventPayload.self,
from: JSONEncoder().encode(payload))
else {
return nil
}
return .sessionMessage(message)
case "agent":
guard let payload = evt.payload else { return nil }
guard let agent = try? JSONDecoder().decode(

View File

@@ -80,6 +80,37 @@ struct MacGatewayChatTransportMappingTests {
}
}
@Test func `session message event maps to session message`() {
let payload = OpenClawProtocol.AnyCodable([
"sessionKey": OpenClawProtocol.AnyCodable("agent:main:main"),
"messageId": OpenClawProtocol.AnyCodable("msg-1"),
"messageSeq": OpenClawProtocol.AnyCodable(7),
"message": OpenClawProtocol.AnyCodable([
"role": OpenClawProtocol.AnyCodable("user"),
"content": OpenClawProtocol.AnyCodable([
OpenClawProtocol.AnyCodable([
"type": OpenClawProtocol.AnyCodable("text"),
"text": OpenClawProtocol.AnyCodable("spoken transcript"),
]),
]),
"timestamp": OpenClawProtocol.AnyCodable(1234.5),
]),
])
let frame = EventFrame(type: "event", event: "session.message", payload: payload, seq: 1, stateversion: nil)
let mapped = MacGatewayChatTransport.mapPushToTransportEvent(.event(frame))
switch mapped {
case let .sessionMessage(message):
#expect(message.sessionKey == "agent:main:main")
#expect(message.messageId == "msg-1")
#expect(message.messageSeq == 7)
#expect(message.message?.role == "user")
#expect(message.message?.content.first?.text == "spoken transcript")
default:
Issue.record("expected .sessionMessage from session.message event, got \(String(describing: mapped))")
}
}
@Test func `unknown event maps to nil`() {
let frame = EventFrame(
type: "event",