Skip to content

Commit f1636d5

Browse files
committed
refactor: unify talk session runtime
1 parent 7431cb8 commit f1636d5

68 files changed

Lines changed: 1390 additions & 6589 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/macos/Sources/OpenClawProtocol/GatewayModels.swift

Lines changed: 229 additions & 441 deletions
Large diffs are not rendered by default.

apps/shared/OpenClawKit/Sources/OpenClawProtocol/GatewayModels.swift

Lines changed: 229 additions & 441 deletions
Large diffs are not rendered by default.

src/config/talk.normalize.test.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,45 @@ describe("talk normalization", () => {
129129
});
130130
});
131131

132+
it("does not report an active provider when the configured speech provider cannot resolve", () => {
133+
const mismatchPayload = buildTalkConfigResponse({
134+
provider: "acme",
135+
providers: {
136+
elevenlabs: {
137+
voiceId: "voice-123",
138+
},
139+
},
140+
});
141+
expect(mismatchPayload).toEqual({
142+
providers: {
143+
elevenlabs: {
144+
voiceId: "voice-123",
145+
},
146+
},
147+
});
148+
149+
const ambiguousPayload = buildTalkConfigResponse({
150+
providers: {
151+
acme: {
152+
voiceId: "voice-acme",
153+
},
154+
elevenlabs: {
155+
voiceId: "voice-123",
156+
},
157+
},
158+
});
159+
expect(ambiguousPayload).toEqual({
160+
providers: {
161+
acme: {
162+
voiceId: "voice-acme",
163+
},
164+
elevenlabs: {
165+
voiceId: "voice-123",
166+
},
167+
},
168+
});
169+
});
170+
132171
it("preserves SecretRef apiKey values during normalization", () => {
133172
const normalized = normalizeTalkSection({
134173
provider: TALK_TEST_PROVIDER_ID,

src/config/talk.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ export function buildTalkConfigResponse(value: unknown): TalkConfigResponse | un
238238
const resolved =
239239
resolveActiveTalkProviderConfig(normalized) ??
240240
(legacyCompat ? { provider: "elevenlabs", config: legacyCompat } : undefined);
241-
const activeProvider = normalizeOptionalString(normalized?.provider) ?? resolved?.provider;
241+
const activeProvider = resolved?.provider;
242242
if (activeProvider) {
243243
payload.provider = activeProvider;
244244
}

src/gateway/gateway-misc.test.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -322,9 +322,8 @@ describe("gateway broadcaster", () => {
322322
expect(readSocket.send).toHaveBeenCalledTimes(0);
323323

324324
broadcastToConnIds("tick", { ts: 1 }, new Set(["c-read"]));
325-
broadcastToConnIds("talk.realtime.relay", { type: "ready" }, new Set(["c-read"]));
326-
broadcastToConnIds("talk.transcription.relay", { type: "session.ready" }, new Set(["c-read"]));
327-
expect(readSocket.send).toHaveBeenCalledTimes(3);
325+
broadcastToConnIds("talk.event", { type: "session.ready" }, new Set(["c-read"]));
326+
expect(readSocket.send).toHaveBeenCalledTimes(2);
328327
expect(approvalsSocket.send).toHaveBeenCalledTimes(1);
329328
expect(pairingSocket.send).toHaveBeenCalledTimes(1);
330329
});

src/gateway/method-scopes.test.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,16 @@ describe("method scope resolution", () => {
4141
["diagnostics.stability", ["operator.read"]],
4242
["node.pair.approve", ["operator.pairing"]],
4343
["poll", ["operator.write"]],
44+
["talk.client.create", ["operator.write"]],
45+
["talk.client.toolCall", ["operator.write"]],
4446
["talk.session.create", ["operator.write"]],
45-
["talk.session.inputAudio", ["operator.write"]],
46-
["talk.session.control", ["operator.write"]],
47-
["talk.session.toolResult", ["operator.write"]],
47+
["talk.session.join", ["operator.write"]],
48+
["talk.session.appendAudio", ["operator.write"]],
49+
["talk.session.startTurn", ["operator.write"]],
50+
["talk.session.endTurn", ["operator.write"]],
51+
["talk.session.cancelTurn", ["operator.write"]],
52+
["talk.session.cancelOutput", ["operator.write"]],
53+
["talk.session.submitToolResult", ["operator.write"]],
4854
["talk.session.close", ["operator.write"]],
4955
["update.status", ["operator.admin"]],
5056
["config.patch", ["operator.admin"]],
@@ -103,10 +109,16 @@ describe("operator scope authorization", () => {
103109

104110
it("allows operator.write clients to use unified Talk sessions", () => {
105111
for (const method of [
112+
"talk.client.create",
113+
"talk.client.toolCall",
106114
"talk.session.create",
107-
"talk.session.inputAudio",
108-
"talk.session.control",
109-
"talk.session.toolResult",
115+
"talk.session.join",
116+
"talk.session.appendAudio",
117+
"talk.session.startTurn",
118+
"talk.session.endTurn",
119+
"talk.session.cancelTurn",
120+
"talk.session.cancelOutput",
121+
"talk.session.submitToolResult",
110122
"talk.session.close",
111123
]) {
112124
expect(authorizeOperatorScopesForMethod(method, ["operator.write"])).toEqual({

src/gateway/method-scopes.ts

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,6 @@ const METHOD_SCOPE_GROUPS: Record<OperatorScope, readonly string[]> = {
124124
"config.schema.lookup",
125125
"talk.catalog",
126126
"talk.config",
127-
"talk.handoff.join",
128127
"agents.files.list",
129128
"agents.files.get",
130129
"artifacts.list",
@@ -139,27 +138,17 @@ const METHOD_SCOPE_GROUPS: Record<OperatorScope, readonly string[]> = {
139138
"agent.wait",
140139
"wake",
141140
"talk.mode",
141+
"talk.client.create",
142+
"talk.client.toolCall",
142143
"talk.session.create",
143-
"talk.session.inputAudio",
144-
"talk.session.control",
145-
"talk.session.toolResult",
144+
"talk.session.join",
145+
"talk.session.appendAudio",
146+
"talk.session.startTurn",
147+
"talk.session.endTurn",
148+
"talk.session.cancelTurn",
149+
"talk.session.cancelOutput",
150+
"talk.session.submitToolResult",
146151
"talk.session.close",
147-
"talk.handoff.create",
148-
"talk.handoff.revoke",
149-
"talk.handoff.turnStart",
150-
"talk.handoff.turnEnd",
151-
"talk.handoff.turnCancel",
152-
"talk.realtime.session",
153-
"talk.realtime.toolCall",
154-
"talk.realtime.relayAudio",
155-
"talk.realtime.relayCancel",
156-
"talk.realtime.relayMark",
157-
"talk.realtime.relayStop",
158-
"talk.realtime.relayToolResult",
159-
"talk.transcription.session",
160-
"talk.transcription.relayAudio",
161-
"talk.transcription.relayCancel",
162-
"talk.transcription.relayStop",
163152
"talk.speak",
164153
"tts.enable",
165154
"tts.disable",

0 commit comments

Comments
 (0)