@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.
Files changed (87) hide show
  1. package/dist/ai/cardBuilder.d.ts +21 -2
  2. package/dist/ai/cardBuilder.d.ts.map +1 -1
  3. package/dist/ai/cardBuilder.js +100 -6
  4. package/dist/ai/cardBuilder.js.map +1 -1
  5. package/dist/ai/claudeCliProvider.d.ts +25 -2
  6. package/dist/ai/claudeCliProvider.d.ts.map +1 -1
  7. package/dist/ai/claudeCliProvider.js +76 -19
  8. package/dist/ai/claudeCliProvider.js.map +1 -1
  9. package/dist/ai/codexAppServer/cardAdapter.d.ts.map +1 -1
  10. package/dist/ai/codexAppServer/cardAdapter.js +87 -7
  11. package/dist/ai/codexAppServer/cardAdapter.js.map +1 -1
  12. package/dist/ai/codexAppServer/provider.d.ts +3 -0
  13. package/dist/ai/codexAppServer/provider.d.ts.map +1 -1
  14. package/dist/ai/codexAppServer/provider.js +15 -4
  15. package/dist/ai/codexAppServer/provider.js.map +1 -1
  16. package/dist/ai/codexMcpProvider.d.ts.map +1 -1
  17. package/dist/ai/codexMcpProvider.js +6 -0
  18. package/dist/ai/codexMcpProvider.js.map +1 -1
  19. package/dist/ai/provider.d.ts +3 -0
  20. package/dist/ai/provider.d.ts.map +1 -1
  21. package/dist/ai/provider.js.map +1 -1
  22. package/dist/ai/queuedUserPrompts.d.ts +6 -0
  23. package/dist/ai/queuedUserPrompts.d.ts.map +1 -1
  24. package/dist/ai/queuedUserPrompts.js +9 -0
  25. package/dist/ai/queuedUserPrompts.js.map +1 -1
  26. package/dist/ai/realtimeTranscription.d.ts +2 -0
  27. package/dist/ai/realtimeTranscription.d.ts.map +1 -1
  28. package/dist/ai/realtimeTranscription.js +14 -0
  29. package/dist/ai/realtimeTranscription.js.map +1 -1
  30. package/dist/ai/sessionManager.d.ts +12 -0
  31. package/dist/ai/sessionManager.d.ts.map +1 -1
  32. package/dist/ai/sessionManager.js +73 -12
  33. package/dist/ai/sessionManager.js.map +1 -1
  34. package/dist/ai/voiceIntermediary/historyStore.d.ts +54 -0
  35. package/dist/ai/voiceIntermediary/historyStore.d.ts.map +1 -0
  36. package/dist/ai/voiceIntermediary/historyStore.js +159 -0
  37. package/dist/ai/voiceIntermediary/historyStore.js.map +1 -0
  38. package/dist/ai/voiceIntermediary/index.d.ts +13 -0
  39. package/dist/ai/voiceIntermediary/index.d.ts.map +1 -0
  40. package/dist/ai/voiceIntermediary/index.js +13 -0
  41. package/dist/ai/voiceIntermediary/index.js.map +1 -0
  42. package/dist/ai/voiceIntermediary/llm.d.ts +52 -0
  43. package/dist/ai/voiceIntermediary/llm.d.ts.map +1 -0
  44. package/dist/ai/voiceIntermediary/llm.js +63 -0
  45. package/dist/ai/voiceIntermediary/llm.js.map +1 -0
  46. package/dist/ai/voiceIntermediary/manager.d.ts +58 -0
  47. package/dist/ai/voiceIntermediary/manager.d.ts.map +1 -0
  48. package/dist/ai/voiceIntermediary/manager.js +134 -0
  49. package/dist/ai/voiceIntermediary/manager.js.map +1 -0
  50. package/dist/ai/voiceIntermediary/memory.d.ts +22 -0
  51. package/dist/ai/voiceIntermediary/memory.d.ts.map +1 -0
  52. package/dist/ai/voiceIntermediary/memory.js +109 -0
  53. package/dist/ai/voiceIntermediary/memory.js.map +1 -0
  54. package/dist/ai/voiceIntermediary/session.d.ts +81 -0
  55. package/dist/ai/voiceIntermediary/session.d.ts.map +1 -0
  56. package/dist/ai/voiceIntermediary/session.js +567 -0
  57. package/dist/ai/voiceIntermediary/session.js.map +1 -0
  58. package/dist/ai/voiceIntermediary/tools.d.ts +58 -0
  59. package/dist/ai/voiceIntermediary/tools.d.ts.map +1 -0
  60. package/dist/ai/voiceIntermediary/tools.js +277 -0
  61. package/dist/ai/voiceIntermediary/tools.js.map +1 -0
  62. package/dist/ai/voiceIntermediary/tts.d.ts +28 -0
  63. package/dist/ai/voiceIntermediary/tts.d.ts.map +1 -0
  64. package/dist/ai/voiceIntermediary/tts.js +66 -0
  65. package/dist/ai/voiceIntermediary/tts.js.map +1 -0
  66. package/dist/ai/voiceLog.d.ts +18 -0
  67. package/dist/ai/voiceLog.d.ts.map +1 -0
  68. package/dist/ai/voiceLog.js +74 -0
  69. package/dist/ai/voiceLog.js.map +1 -0
  70. package/dist/ai/voiceStream.d.ts +5 -0
  71. package/dist/ai/voiceStream.d.ts.map +1 -1
  72. package/dist/ai/voiceStream.js +29 -5
  73. package/dist/ai/voiceStream.js.map +1 -1
  74. package/dist/handlers/legacyBusAdapter.d.ts.map +1 -1
  75. package/dist/handlers/legacyBusAdapter.js +8 -0
  76. package/dist/handlers/legacyBusAdapter.js.map +1 -1
  77. package/dist/handlers/messageHandler.d.ts +14 -0
  78. package/dist/handlers/messageHandler.d.ts.map +1 -1
  79. package/dist/handlers/messageHandler.js +150 -1
  80. package/dist/handlers/messageHandler.js.map +1 -1
  81. package/dist/index.js +2 -2
  82. package/dist/service/ipcClient.js +1 -1
  83. package/dist/service/run.d.ts.map +1 -1
  84. package/dist/service/run.js +14 -1
  85. package/dist/service/run.js.map +1 -1
  86. package/dist/service/types.js +1 -1
  87. 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":"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"}
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":"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"}
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.14';
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 });