@sumicom/quicksave 0.8.14 → 0.8.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/cardBuilder.d.ts +21 -2
- package/dist/ai/cardBuilder.d.ts.map +1 -1
- package/dist/ai/cardBuilder.js +100 -6
- package/dist/ai/cardBuilder.js.map +1 -1
- package/dist/ai/claudeCliProvider.d.ts +25 -2
- package/dist/ai/claudeCliProvider.d.ts.map +1 -1
- package/dist/ai/claudeCliProvider.js +76 -19
- package/dist/ai/claudeCliProvider.js.map +1 -1
- package/dist/ai/codexAppServer/cardAdapter.d.ts.map +1 -1
- package/dist/ai/codexAppServer/cardAdapter.js +87 -7
- package/dist/ai/codexAppServer/cardAdapter.js.map +1 -1
- package/dist/ai/codexAppServer/provider.d.ts +3 -0
- package/dist/ai/codexAppServer/provider.d.ts.map +1 -1
- package/dist/ai/codexAppServer/provider.js +15 -4
- package/dist/ai/codexAppServer/provider.js.map +1 -1
- package/dist/ai/codexMcpProvider.d.ts.map +1 -1
- package/dist/ai/codexMcpProvider.js +6 -0
- package/dist/ai/codexMcpProvider.js.map +1 -1
- package/dist/ai/provider.d.ts +3 -0
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/provider.js.map +1 -1
- package/dist/ai/queuedUserPrompts.d.ts +6 -0
- package/dist/ai/queuedUserPrompts.d.ts.map +1 -1
- package/dist/ai/queuedUserPrompts.js +9 -0
- package/dist/ai/queuedUserPrompts.js.map +1 -1
- package/dist/ai/realtimeTranscription.d.ts +2 -0
- package/dist/ai/realtimeTranscription.d.ts.map +1 -1
- package/dist/ai/realtimeTranscription.js +14 -0
- package/dist/ai/realtimeTranscription.js.map +1 -1
- package/dist/ai/sessionManager.d.ts +12 -0
- package/dist/ai/sessionManager.d.ts.map +1 -1
- package/dist/ai/sessionManager.js +73 -12
- package/dist/ai/sessionManager.js.map +1 -1
- package/dist/ai/voiceIntermediary/historyStore.d.ts +54 -0
- package/dist/ai/voiceIntermediary/historyStore.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/historyStore.js +159 -0
- package/dist/ai/voiceIntermediary/historyStore.js.map +1 -0
- package/dist/ai/voiceIntermediary/index.d.ts +13 -0
- package/dist/ai/voiceIntermediary/index.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/index.js +13 -0
- package/dist/ai/voiceIntermediary/index.js.map +1 -0
- package/dist/ai/voiceIntermediary/llm.d.ts +52 -0
- package/dist/ai/voiceIntermediary/llm.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/llm.js +63 -0
- package/dist/ai/voiceIntermediary/llm.js.map +1 -0
- package/dist/ai/voiceIntermediary/manager.d.ts +58 -0
- package/dist/ai/voiceIntermediary/manager.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/manager.js +134 -0
- package/dist/ai/voiceIntermediary/manager.js.map +1 -0
- package/dist/ai/voiceIntermediary/memory.d.ts +22 -0
- package/dist/ai/voiceIntermediary/memory.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/memory.js +109 -0
- package/dist/ai/voiceIntermediary/memory.js.map +1 -0
- package/dist/ai/voiceIntermediary/session.d.ts +81 -0
- package/dist/ai/voiceIntermediary/session.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/session.js +567 -0
- package/dist/ai/voiceIntermediary/session.js.map +1 -0
- package/dist/ai/voiceIntermediary/tools.d.ts +58 -0
- package/dist/ai/voiceIntermediary/tools.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/tools.js +277 -0
- package/dist/ai/voiceIntermediary/tools.js.map +1 -0
- package/dist/ai/voiceIntermediary/tts.d.ts +28 -0
- package/dist/ai/voiceIntermediary/tts.d.ts.map +1 -0
- package/dist/ai/voiceIntermediary/tts.js +66 -0
- package/dist/ai/voiceIntermediary/tts.js.map +1 -0
- package/dist/ai/voiceLog.d.ts +18 -0
- package/dist/ai/voiceLog.d.ts.map +1 -0
- package/dist/ai/voiceLog.js +74 -0
- package/dist/ai/voiceLog.js.map +1 -0
- package/dist/ai/voiceStream.d.ts +5 -0
- package/dist/ai/voiceStream.d.ts.map +1 -1
- package/dist/ai/voiceStream.js +29 -5
- package/dist/ai/voiceStream.js.map +1 -1
- package/dist/handlers/legacyBusAdapter.d.ts.map +1 -1
- package/dist/handlers/legacyBusAdapter.js +8 -0
- package/dist/handlers/legacyBusAdapter.js.map +1 -1
- package/dist/handlers/messageHandler.d.ts +14 -0
- package/dist/handlers/messageHandler.d.ts.map +1 -1
- package/dist/handlers/messageHandler.js +150 -1
- package/dist/handlers/messageHandler.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/service/ipcClient.js +1 -1
- package/dist/service/run.d.ts.map +1 -1
- package/dist/service/run.js +14 -1
- package/dist/service/run.js.map +1 -1
- package/dist/service/types.js +1 -1
- package/package.json +3 -3
|
@@ -69,6 +69,7 @@ export const LEGACY_BUS_VERBS = [
|
|
|
69
69
|
'claude:resume',
|
|
70
70
|
'claude:interrupt',
|
|
71
71
|
'claude:steer-queued',
|
|
72
|
+
'claude:delete-queued',
|
|
72
73
|
'claude:cancel',
|
|
73
74
|
'claude:close',
|
|
74
75
|
'claude:end-task',
|
|
@@ -108,6 +109,13 @@ export const LEGACY_BUS_VERBS = [
|
|
|
108
109
|
'artifact:fetch',
|
|
109
110
|
'voice:transcribe',
|
|
110
111
|
'voice:list-models',
|
|
112
|
+
'voice:log-event',
|
|
113
|
+
// voice intermediary ("AI coworker")
|
|
114
|
+
'voice-agent:attach',
|
|
115
|
+
'voice-agent:detach',
|
|
116
|
+
'voice-agent:utterance',
|
|
117
|
+
'voice-agent:playback-event',
|
|
118
|
+
'voice-agent:fetch-audio',
|
|
111
119
|
];
|
|
112
120
|
/**
|
|
113
121
|
* Bridge legacy `MessageHandler` request/response verbs onto a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacyBusAdapter.js","sourceRoot":"","sources":["../../src/handlers/legacyBusAdapter.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,+BAA+B;AAC/B,OAAO,EACL,aAAa,GAEd,MAAM,2BAA2B,CAAC;AAInC;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAkB;IAC7C,MAAM;IACN,MAAM;IACN,YAAY;IACZ,UAAU;IACV,WAAW;IACX,aAAa;IACb,iBAAiB;IACjB,mBAAmB;IACnB,YAAY;IACZ,SAAS;IACT,cAAc;IACd,cAAc;IACd,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,mBAAmB;IACnB,oBAAoB;IACpB,qBAAqB;IACrB,KAAK;IACL,4BAA4B;IAC5B,yBAAyB;IACzB,gBAAgB;IAChB,uBAAuB;IACvB,QAAQ;IACR,kBAAkB;IAClB,mBAAmB;IACnB,wBAAwB;IACxB,gBAAgB;IAChB,mBAAmB;IACnB,kBAAkB;IAClB,yBAAyB;IACzB,uBAAuB;IACvB,0BAA0B;IAC1B,oBAAoB;IACpB,cAAc;IACd,eAAe;IACf,aAAa;IACb,2EAA2E;IAC3E,gBAAgB;IAChB,iBAAiB;IACjB,mBAAmB;IACnB,QAAQ;IACR,mBAAmB;IACnB,mBAAmB;IACnB,oBAAoB;IACpB,oBAAoB;IACpB,SAAS;IACT,cAAc;IACd,eAAe;IACf,kBAAkB;IAClB,qBAAqB;IACrB,eAAe;IACf,cAAc;IACd,iBAAiB;IACjB,4BAA4B;IAC5B,wBAAwB;IACxB,+BAA+B;IAC/B,kBAAkB;IAClB,UAAU;IACV,oBAAoB;IACpB,yBAAyB;IACzB,6BAA6B;IAC7B,wBAAwB;IACxB,wBAAwB;IACxB,uBAAuB;IACvB,mBAAmB;IACnB,iCAAiC;IACjC,UAAU;IACV,wBAAwB;IACxB,oBAAoB;IACpB,gBAAgB;IAChB,OAAO;IACP,yBAAyB;IACzB,WAAW;IACX,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;IACjB,gBAAgB;IAChB,iBAAiB;IACjB,QAAQ;IACR,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,mBAAmB;IACnB,mBAAmB;IACnB,kBAAkB;IAClB,YAAY;IACZ,gBAAgB;IAChB,kBAAkB;IAClB,mBAAmB;
|
|
1
|
+
{"version":3,"file":"legacyBusAdapter.js","sourceRoot":"","sources":["../../src/handlers/legacyBusAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { Message, License, Repository, SessionRegistryEntry, AgentId, CodexModel
|
|
|
2
2
|
import type { PushClient } from '../service/pushClient.js';
|
|
3
3
|
import { CommitSummaryStateStore } from '../ai/commitSummaryStore.js';
|
|
4
4
|
import { SessionManager } from '../ai/sessionManager.js';
|
|
5
|
+
import { VoiceIntermediaryManager } from '../ai/voiceIntermediary/index.js';
|
|
5
6
|
import { AttachmentStaging } from '../ai/attachmentStaging.js';
|
|
6
7
|
import { CodexLoginManager } from '../ai/codexLogin.js';
|
|
7
8
|
export declare class MessageHandler {
|
|
@@ -18,6 +19,9 @@ export declare class MessageHandler {
|
|
|
18
19
|
* `state-updated` event to `connection.broadcast` (see service/run.ts). */
|
|
19
20
|
private commitSummaryStore;
|
|
20
21
|
private claudeService;
|
|
22
|
+
/** Voice intermediary ("AI coworker"). Bound to `claudeService` so its tools
|
|
23
|
+
* can steer/observe coding sessions; events wired to the bus in `run.ts`. */
|
|
24
|
+
private voiceIntermediary;
|
|
21
25
|
private attachmentStaging;
|
|
22
26
|
private attachmentGcTimer;
|
|
23
27
|
private pushClient;
|
|
@@ -123,6 +127,9 @@ export declare class MessageHandler {
|
|
|
123
127
|
/** Exposed so the daemon can wire state-updated events to broadcasts. */
|
|
124
128
|
getCommitSummaryStore(): CommitSummaryStateStore;
|
|
125
129
|
getClaudeService(): SessionManager;
|
|
130
|
+
/** Exposed so the daemon can republish voice-agent events on the bus and feed
|
|
131
|
+
* it coding-side permission prompts (see service/run.ts). */
|
|
132
|
+
getVoiceIntermediary(): VoiceIntermediaryManager;
|
|
126
133
|
/** Daemon wires this after construction so push:subscription-offer can
|
|
127
134
|
* forward to the relay. Absent in tests or when VAPID/signaling aren't
|
|
128
135
|
* configured — offer responses will report an error in that case. */
|
|
@@ -167,6 +174,7 @@ export declare class MessageHandler {
|
|
|
167
174
|
private getAiCliService;
|
|
168
175
|
private handleSetApiKey;
|
|
169
176
|
private handleVoiceTranscribe;
|
|
177
|
+
private handleVoiceLogEvent;
|
|
170
178
|
private handleVoiceListModels;
|
|
171
179
|
private handleGetApiKeyStatus;
|
|
172
180
|
private handleListRepos;
|
|
@@ -203,6 +211,7 @@ export declare class MessageHandler {
|
|
|
203
211
|
private handleClaudeCancel;
|
|
204
212
|
private handleClaudeInterrupt;
|
|
205
213
|
private handleClaudeSteerQueued;
|
|
214
|
+
private handleClaudeDeleteQueued;
|
|
206
215
|
private handleClaudeClose;
|
|
207
216
|
/**
|
|
208
217
|
* End Task: archive the session's registry entry, then terminate the live
|
|
@@ -218,6 +227,11 @@ export declare class MessageHandler {
|
|
|
218
227
|
private handleClaudeEndTask;
|
|
219
228
|
private handleClaudeUserInputResponse;
|
|
220
229
|
private handleClaudeGetCards;
|
|
230
|
+
private handleVoiceAgentAttach;
|
|
231
|
+
private handleVoiceAgentDetach;
|
|
232
|
+
private handleVoiceAgentUtterance;
|
|
233
|
+
private handleVoiceAgentPlaybackEvent;
|
|
234
|
+
private handleVoiceAgentFetchAudio;
|
|
221
235
|
private handleSetPreferences;
|
|
222
236
|
private handleSetSessionPermission;
|
|
223
237
|
private handleSetSessionConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/messageHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,OAAO,EAqCP,OAAO,EAQP,UAAU,
|
|
1
|
+
{"version":3,"file":"messageHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/messageHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { CommitSummaryService } from '../ai/commitSummary.js';
|
|
|
8
8
|
import { CommitSummaryCliService, CommitSummaryCliError } from '../ai/commitSummaryCli.js';
|
|
9
9
|
import { CommitSummaryStateStore } from '../ai/commitSummaryStore.js';
|
|
10
10
|
import { SessionManager } from '../ai/sessionManager.js';
|
|
11
|
+
import { VoiceIntermediaryManager } from '../ai/voiceIntermediary/index.js';
|
|
11
12
|
import { ClaudeCodeProvider } from '../ai/claudeCodeProvider.js';
|
|
12
13
|
import { ClaudeTerminalProvider } from '../ai/claudeTerminal/index.js';
|
|
13
14
|
import { OpenCodeProvider } from '../ai/openCodeProvider.js';
|
|
@@ -16,6 +17,7 @@ import { loadAttachment, removeSessionAttachments } from '../ai/attachmentStore.
|
|
|
16
17
|
import { loadArtifactBySession } from '../ai/artifactStore.js';
|
|
17
18
|
import { transcribeAudio, listModels } from '../ai/voiceTranscription.js';
|
|
18
19
|
import { probeAudioSupport } from '../ai/voiceStream.js';
|
|
20
|
+
import { voiceEventLogger } from '../ai/voiceLog.js';
|
|
19
21
|
import { CodexAppServerProvider } from '../ai/codexAppServer/index.js';
|
|
20
22
|
import { CodexLoginManager } from '../ai/codexLogin.js';
|
|
21
23
|
import { CodexQuotaService } from '../ai/codexQuota.js';
|
|
@@ -93,7 +95,7 @@ function projectAppServerModel(m) {
|
|
|
93
95
|
}
|
|
94
96
|
export class MessageHandler {
|
|
95
97
|
repos;
|
|
96
|
-
agentVersion = '0.8.
|
|
98
|
+
agentVersion = '0.8.15';
|
|
97
99
|
defaultRepoPath;
|
|
98
100
|
clientRepos = new Map(); // peerAddress -> repoPath
|
|
99
101
|
repoLocks = new Map(); // repoPath -> peerAddress holding lock
|
|
@@ -105,6 +107,9 @@ export class MessageHandler {
|
|
|
105
107
|
* `state-updated` event to `connection.broadcast` (see service/run.ts). */
|
|
106
108
|
commitSummaryStore = new CommitSummaryStateStore();
|
|
107
109
|
claudeService;
|
|
110
|
+
/** Voice intermediary ("AI coworker"). Bound to `claudeService` so its tools
|
|
111
|
+
* can steer/observe coding sessions; events wired to the bus in `run.ts`. */
|
|
112
|
+
voiceIntermediary;
|
|
108
113
|
attachmentStaging = new AttachmentStaging();
|
|
109
114
|
attachmentGcTimer = null;
|
|
110
115
|
pushClient = null;
|
|
@@ -137,6 +142,7 @@ export class MessageHandler {
|
|
|
137
142
|
new CodexAppServerProvider(),
|
|
138
143
|
new OpenCodeProvider(),
|
|
139
144
|
]);
|
|
145
|
+
this.voiceIntermediary = new VoiceIntermediaryManager(this.claudeService);
|
|
140
146
|
this.codexCacheDir = options?.codexCacheDir ?? join(homedir(), '.codex');
|
|
141
147
|
// Load explicit coding paths only (repos and coding paths are independent)
|
|
142
148
|
if (codingPaths) {
|
|
@@ -426,6 +432,11 @@ export class MessageHandler {
|
|
|
426
432
|
getClaudeService() {
|
|
427
433
|
return this.claudeService;
|
|
428
434
|
}
|
|
435
|
+
/** Exposed so the daemon can republish voice-agent events on the bus and feed
|
|
436
|
+
* it coding-side permission prompts (see service/run.ts). */
|
|
437
|
+
getVoiceIntermediary() {
|
|
438
|
+
return this.voiceIntermediary;
|
|
439
|
+
}
|
|
429
440
|
/** Daemon wires this after construction so push:subscription-offer can
|
|
430
441
|
* forward to the relay. Absent in tests or when VAPID/signaling aren't
|
|
431
442
|
* configured — offer responses will report an error in that case. */
|
|
@@ -575,6 +586,8 @@ export class MessageHandler {
|
|
|
575
586
|
return this.handleClaudeInterrupt(message);
|
|
576
587
|
case 'claude:steer-queued':
|
|
577
588
|
return this.handleClaudeSteerQueued(message);
|
|
589
|
+
case 'claude:delete-queued':
|
|
590
|
+
return this.handleClaudeDeleteQueued(message);
|
|
578
591
|
case 'claude:cancel':
|
|
579
592
|
return this.handleClaudeCancel(message);
|
|
580
593
|
case 'claude:close':
|
|
@@ -589,6 +602,16 @@ export class MessageHandler {
|
|
|
589
602
|
return this.handleSetSessionPermission(message);
|
|
590
603
|
case 'claude:get-cards':
|
|
591
604
|
return this.handleClaudeGetCards(message, peerAddress);
|
|
605
|
+
case 'voice-agent:attach':
|
|
606
|
+
return this.handleVoiceAgentAttach(message);
|
|
607
|
+
case 'voice-agent:detach':
|
|
608
|
+
return this.handleVoiceAgentDetach(message);
|
|
609
|
+
case 'voice-agent:utterance':
|
|
610
|
+
return this.handleVoiceAgentUtterance(message);
|
|
611
|
+
case 'voice-agent:playback-event':
|
|
612
|
+
return this.handleVoiceAgentPlaybackEvent(message);
|
|
613
|
+
case 'voice-agent:fetch-audio':
|
|
614
|
+
return this.handleVoiceAgentFetchAudio(message);
|
|
592
615
|
case 'session:set-config':
|
|
593
616
|
return this.handleSetSessionConfig(message);
|
|
594
617
|
case 'session:control-request':
|
|
@@ -639,6 +662,8 @@ export class MessageHandler {
|
|
|
639
662
|
return this.handleVoiceTranscribe(message);
|
|
640
663
|
case 'voice:list-models':
|
|
641
664
|
return this.handleVoiceListModels(message);
|
|
665
|
+
case 'voice:log-event':
|
|
666
|
+
return this.handleVoiceLogEvent(message);
|
|
642
667
|
default:
|
|
643
668
|
return this.createErrorResponse(message.id, 'UNKNOWN_MESSAGE_TYPE', `Unknown message type: ${message.type}`);
|
|
644
669
|
}
|
|
@@ -1203,14 +1228,31 @@ export class MessageHandler {
|
|
|
1203
1228
|
}
|
|
1204
1229
|
async handleVoiceTranscribe(message) {
|
|
1205
1230
|
const { audioBase64, mimeType, config } = message.payload;
|
|
1231
|
+
const audioBytes = Buffer.byteLength(audioBase64, 'base64');
|
|
1232
|
+
voiceEventLogger.log({
|
|
1233
|
+
event: 'stt.request',
|
|
1234
|
+
phase: 'stt',
|
|
1235
|
+
data: { mode: config.mode, model: config.transcribeModel, mimeType, audioBytes },
|
|
1236
|
+
});
|
|
1206
1237
|
try {
|
|
1207
1238
|
const audio = Buffer.from(audioBase64, 'base64');
|
|
1208
1239
|
const text = await transcribeAudio(audio, mimeType, config);
|
|
1240
|
+
voiceEventLogger.log({
|
|
1241
|
+
event: 'stt.result',
|
|
1242
|
+
phase: 'stt',
|
|
1243
|
+
data: { mode: config.mode, model: config.transcribeModel, text, textChars: text.length },
|
|
1244
|
+
});
|
|
1209
1245
|
const response = createMessage('voice:transcribe:response', { text });
|
|
1210
1246
|
response.id = message.id;
|
|
1211
1247
|
return response;
|
|
1212
1248
|
}
|
|
1213
1249
|
catch (error) {
|
|
1250
|
+
voiceEventLogger.log({
|
|
1251
|
+
event: 'stt.error',
|
|
1252
|
+
phase: 'stt',
|
|
1253
|
+
level: 'error',
|
|
1254
|
+
data: { mode: config.mode, model: config.transcribeModel, message: error instanceof Error ? error.message : 'Transcription failed' },
|
|
1255
|
+
});
|
|
1214
1256
|
const response = createMessage('voice:transcribe:response', {
|
|
1215
1257
|
text: '',
|
|
1216
1258
|
error: error instanceof Error ? error.message : 'Transcription failed',
|
|
@@ -1219,6 +1261,12 @@ export class MessageHandler {
|
|
|
1219
1261
|
return response;
|
|
1220
1262
|
}
|
|
1221
1263
|
}
|
|
1264
|
+
handleVoiceLogEvent(message) {
|
|
1265
|
+
voiceEventLogger.log(message.payload);
|
|
1266
|
+
const response = createMessage('voice:log-event:response', { ok: true });
|
|
1267
|
+
response.id = message.id;
|
|
1268
|
+
return response;
|
|
1269
|
+
}
|
|
1222
1270
|
async handleVoiceListModels(message) {
|
|
1223
1271
|
try {
|
|
1224
1272
|
const models = await listModels(message.payload.config);
|
|
@@ -1924,6 +1972,13 @@ export class MessageHandler {
|
|
|
1924
1972
|
response.id = message.id;
|
|
1925
1973
|
return response;
|
|
1926
1974
|
}
|
|
1975
|
+
async handleClaudeDeleteQueued(message) {
|
|
1976
|
+
const { sessionId, queuedId } = message.payload;
|
|
1977
|
+
const success = await this.claudeService.deleteQueuedMessage(sessionId, queuedId);
|
|
1978
|
+
const response = createMessage('claude:delete-queued:response', { success, error: success ? undefined : 'No matching queued message to delete' });
|
|
1979
|
+
response.id = message.id;
|
|
1980
|
+
return response;
|
|
1981
|
+
}
|
|
1927
1982
|
handleClaudeClose(message) {
|
|
1928
1983
|
const { sessionId } = message.payload;
|
|
1929
1984
|
const success = this.claudeService.closeSession(sessionId);
|
|
@@ -2002,6 +2057,100 @@ export class MessageHandler {
|
|
|
2002
2057
|
return response;
|
|
2003
2058
|
}
|
|
2004
2059
|
}
|
|
2060
|
+
handleVoiceAgentAttach(message) {
|
|
2061
|
+
const { sessionId, config } = message.payload;
|
|
2062
|
+
voiceEventLogger.log({
|
|
2063
|
+
sessionId,
|
|
2064
|
+
event: 'voice_agent.attach',
|
|
2065
|
+
phase: 'voice_agent',
|
|
2066
|
+
data: {
|
|
2067
|
+
mode: config.mode,
|
|
2068
|
+
baseUrl: config.baseUrl,
|
|
2069
|
+
transcribeModel: config.transcribeModel,
|
|
2070
|
+
streamModel: config.streamModel,
|
|
2071
|
+
agentModel: config.agentModel,
|
|
2072
|
+
ttsModel: config.ttsModel,
|
|
2073
|
+
ttsVoice: config.ttsVoice,
|
|
2074
|
+
},
|
|
2075
|
+
});
|
|
2076
|
+
let result;
|
|
2077
|
+
try {
|
|
2078
|
+
result = this.voiceIntermediary.attach(sessionId, config);
|
|
2079
|
+
}
|
|
2080
|
+
catch (err) {
|
|
2081
|
+
console.error('[voice-agent:attach] failed:', err);
|
|
2082
|
+
result = { ok: false, active: false };
|
|
2083
|
+
}
|
|
2084
|
+
const response = createMessage('voice-agent:attach:response', {
|
|
2085
|
+
ok: result.ok,
|
|
2086
|
+
active: result.active,
|
|
2087
|
+
error: result.ok ? undefined : 'attach failed',
|
|
2088
|
+
});
|
|
2089
|
+
response.id = message.id;
|
|
2090
|
+
return response;
|
|
2091
|
+
}
|
|
2092
|
+
handleVoiceAgentDetach(message) {
|
|
2093
|
+
voiceEventLogger.log({
|
|
2094
|
+
sessionId: message.payload.sessionId,
|
|
2095
|
+
event: 'voice_agent.detach',
|
|
2096
|
+
phase: 'voice_agent',
|
|
2097
|
+
});
|
|
2098
|
+
this.voiceIntermediary.detach(message.payload.sessionId);
|
|
2099
|
+
const response = createMessage('voice-agent:detach:response', { ok: true });
|
|
2100
|
+
response.id = message.id;
|
|
2101
|
+
return response;
|
|
2102
|
+
}
|
|
2103
|
+
async handleVoiceAgentUtterance(message) {
|
|
2104
|
+
const { sessionId, text, turnId, interactionId, utteranceId } = message.payload;
|
|
2105
|
+
voiceEventLogger.log({
|
|
2106
|
+
sessionId,
|
|
2107
|
+
event: 'voice_agent.utterance.received',
|
|
2108
|
+
phase: 'voice_agent',
|
|
2109
|
+
turnId,
|
|
2110
|
+
data: { text, textChars: text.length, interactionId, utteranceId },
|
|
2111
|
+
});
|
|
2112
|
+
// Fire-and-forget the tool loop: the spoken result streams back over the
|
|
2113
|
+
// `/sessions/:id/voice-agent` subscription. Ack receipt immediately so the
|
|
2114
|
+
// bus request doesn't block for the whole (multi-second) turn.
|
|
2115
|
+
void this.voiceIntermediary.handleUtterance(sessionId, text, { turnId, interactionId, utteranceId }).catch((err) => {
|
|
2116
|
+
console.error('[voice-agent:utterance] turn failed:', err);
|
|
2117
|
+
});
|
|
2118
|
+
const response = createMessage('voice-agent:utterance:response', { ok: true });
|
|
2119
|
+
response.id = message.id;
|
|
2120
|
+
return response;
|
|
2121
|
+
}
|
|
2122
|
+
handleVoiceAgentPlaybackEvent(message) {
|
|
2123
|
+
const { sessionId, event, audioId, turnId, interactionId, utteranceId, reason } = message.payload;
|
|
2124
|
+
voiceEventLogger.log({
|
|
2125
|
+
sessionId,
|
|
2126
|
+
event: `playback.${event}`,
|
|
2127
|
+
phase: 'playback',
|
|
2128
|
+
turnId,
|
|
2129
|
+
data: { audioId, interactionId, utteranceId, reason },
|
|
2130
|
+
});
|
|
2131
|
+
this.voiceIntermediary.recordPlaybackEvent(message.payload);
|
|
2132
|
+
const response = createMessage('voice-agent:playback-event:response', { ok: true });
|
|
2133
|
+
response.id = message.id;
|
|
2134
|
+
return response;
|
|
2135
|
+
}
|
|
2136
|
+
handleVoiceAgentFetchAudio(message) {
|
|
2137
|
+
const stored = this.voiceIntermediary.getAudio(message.payload.audioId);
|
|
2138
|
+
voiceEventLogger.log({
|
|
2139
|
+
sessionId: message.payload.sessionId,
|
|
2140
|
+
event: stored ? 'tts.audio.fetch' : 'tts.audio.expired',
|
|
2141
|
+
phase: 'tts',
|
|
2142
|
+
data: {
|
|
2143
|
+
audioId: message.payload.audioId,
|
|
2144
|
+
mimeType: stored?.mimeType,
|
|
2145
|
+
audioBytes: stored?.audio.length,
|
|
2146
|
+
},
|
|
2147
|
+
});
|
|
2148
|
+
const response = createMessage('voice-agent:fetch-audio:response', stored
|
|
2149
|
+
? { audioBase64: stored.audio.toString('base64'), mimeType: stored.mimeType }
|
|
2150
|
+
: { audioBase64: '', mimeType: '', error: 'audio expired' });
|
|
2151
|
+
response.id = message.id;
|
|
2152
|
+
return response;
|
|
2153
|
+
}
|
|
2005
2154
|
handleSetPreferences(message) {
|
|
2006
2155
|
const applied = this.claudeService.setPreferences(message.payload.preferences);
|
|
2007
2156
|
const response = createMessage('claude:set-preferences:response', { success: true, preferences: applied });
|