@sumicom/quicksave 0.8.8 → 0.8.10
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 +65 -4
- package/dist/ai/cardBuilder.d.ts.map +1 -1
- package/dist/ai/cardBuilder.js +338 -28
- package/dist/ai/cardBuilder.js.map +1 -1
- package/dist/ai/claudeCliProvider.d.ts +15 -0
- package/dist/ai/claudeCliProvider.d.ts.map +1 -1
- package/dist/ai/claudeCliProvider.js +87 -3
- package/dist/ai/claudeCliProvider.js.map +1 -1
- package/dist/ai/claudeCodeProvider.d.ts +4 -0
- package/dist/ai/claudeCodeProvider.d.ts.map +1 -1
- package/dist/ai/claudeCodeProvider.js +41 -0
- package/dist/ai/claudeCodeProvider.js.map +1 -1
- package/dist/ai/claudeSdkProvider.d.ts +1 -0
- package/dist/ai/claudeSdkProvider.d.ts.map +1 -1
- package/dist/ai/claudeSdkProvider.js +14 -2
- package/dist/ai/claudeSdkProvider.js.map +1 -1
- package/dist/ai/claudeTerminal/cardSynth.d.ts +63 -0
- package/dist/ai/claudeTerminal/cardSynth.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/cardSynth.js +92 -0
- package/dist/ai/claudeTerminal/cardSynth.js.map +1 -0
- package/dist/ai/claudeTerminal/hookBridge.d.ts +56 -0
- package/dist/ai/claudeTerminal/hookBridge.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/hookBridge.js +131 -0
- package/dist/ai/claudeTerminal/hookBridge.js.map +1 -0
- package/dist/ai/claudeTerminal/hookHandler.d.ts +18 -0
- package/dist/ai/claudeTerminal/hookHandler.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/hookHandler.js +124 -0
- package/dist/ai/claudeTerminal/hookHandler.js.map +1 -0
- package/dist/ai/claudeTerminal/index.d.ts +5 -0
- package/dist/ai/claudeTerminal/index.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/index.js +7 -0
- package/dist/ai/claudeTerminal/index.js.map +1 -0
- package/dist/ai/claudeTerminal/jsonlTail.d.ts +40 -0
- package/dist/ai/claudeTerminal/jsonlTail.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/jsonlTail.js +129 -0
- package/dist/ai/claudeTerminal/jsonlTail.js.map +1 -0
- package/dist/ai/claudeTerminal/provider.d.ts +106 -0
- package/dist/ai/claudeTerminal/provider.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/provider.js +579 -0
- package/dist/ai/claudeTerminal/provider.js.map +1 -0
- package/dist/ai/claudeTerminal/settingsBuilder.d.ts +44 -0
- package/dist/ai/claudeTerminal/settingsBuilder.d.ts.map +1 -0
- package/dist/ai/claudeTerminal/settingsBuilder.js +40 -0
- package/dist/ai/claudeTerminal/settingsBuilder.js.map +1 -0
- package/dist/ai/codexAppServer/cardAdapter.d.ts.map +1 -1
- package/dist/ai/codexAppServer/cardAdapter.js +13 -5
- package/dist/ai/codexAppServer/cardAdapter.js.map +1 -1
- package/dist/ai/codexAppServer/provider.d.ts +10 -2
- package/dist/ai/codexAppServer/provider.d.ts.map +1 -1
- package/dist/ai/codexAppServer/provider.js +158 -22
- package/dist/ai/codexAppServer/provider.js.map +1 -1
- package/dist/ai/openCodeProvider.d.ts +106 -0
- package/dist/ai/openCodeProvider.d.ts.map +1 -0
- package/dist/ai/openCodeProvider.js +617 -0
- package/dist/ai/openCodeProvider.js.map +1 -0
- package/dist/ai/openCodeServer.d.ts +88 -0
- package/dist/ai/openCodeServer.d.ts.map +1 -0
- package/dist/ai/openCodeServer.js +350 -0
- package/dist/ai/openCodeServer.js.map +1 -0
- package/dist/ai/profiles/project-sandbox.sb +26 -0
- package/dist/ai/provider.d.ts +54 -1
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/provider.js +10 -0
- package/dist/ai/provider.js.map +1 -1
- package/dist/ai/queuedUserPrompts.d.ts +8 -0
- package/dist/ai/queuedUserPrompts.d.ts.map +1 -0
- package/dist/ai/queuedUserPrompts.js +19 -0
- package/dist/ai/queuedUserPrompts.js.map +1 -0
- package/dist/ai/realtimeTranscription.d.ts +39 -0
- package/dist/ai/realtimeTranscription.d.ts.map +1 -0
- package/dist/ai/realtimeTranscription.js +154 -0
- package/dist/ai/realtimeTranscription.js.map +1 -0
- package/dist/ai/sandboxMcp.d.ts +7 -0
- package/dist/ai/sandboxMcp.d.ts.map +1 -1
- package/dist/ai/sandboxMcp.js +4 -0
- package/dist/ai/sandboxMcp.js.map +1 -1
- package/dist/ai/sandboxMcpStdio.d.ts +1 -1
- package/dist/ai/sandboxMcpStdio.js +120 -47
- package/dist/ai/sandboxMcpStdio.js.map +1 -1
- package/dist/ai/sessionManager.d.ts +20 -1
- package/dist/ai/sessionManager.d.ts.map +1 -1
- package/dist/ai/sessionManager.js +220 -10
- package/dist/ai/sessionManager.js.map +1 -1
- package/dist/ai/sessionRegistry.d.ts +6 -0
- package/dist/ai/sessionRegistry.d.ts.map +1 -1
- package/dist/ai/sessionRegistry.js +13 -0
- package/dist/ai/sessionRegistry.js.map +1 -1
- package/dist/ai/sessionRegistryLocator.d.ts +14 -0
- package/dist/ai/sessionRegistryLocator.d.ts.map +1 -0
- package/dist/ai/sessionRegistryLocator.js +44 -0
- package/dist/ai/sessionRegistryLocator.js.map +1 -0
- package/dist/ai/systemPrompt.d.ts.map +1 -1
- package/dist/ai/systemPrompt.js +2 -1
- package/dist/ai/systemPrompt.js.map +1 -1
- package/dist/ai/voiceStream.d.ts +74 -0
- package/dist/ai/voiceStream.d.ts.map +1 -0
- package/dist/ai/voiceStream.js +179 -0
- package/dist/ai/voiceStream.js.map +1 -0
- package/dist/ai/voiceTranscription.d.ts +33 -0
- package/dist/ai/voiceTranscription.d.ts.map +1 -0
- package/dist/ai/voiceTranscription.js +122 -0
- package/dist/ai/voiceTranscription.js.map +1 -0
- package/dist/files/fileBrowser.d.ts.map +1 -1
- package/dist/files/fileBrowser.js +15 -2
- package/dist/files/fileBrowser.js.map +1 -1
- package/dist/handlers/legacyBusAdapter.d.ts +1 -1
- package/dist/handlers/legacyBusAdapter.d.ts.map +1 -1
- package/dist/handlers/legacyBusAdapter.js +7 -1
- package/dist/handlers/legacyBusAdapter.js.map +1 -1
- package/dist/handlers/messageHandler.d.ts +6 -0
- package/dist/handlers/messageHandler.d.ts.map +1 -1
- package/dist/handlers/messageHandler.js +119 -8
- package/dist/handlers/messageHandler.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/service/ipcClient.js +1 -1
- package/dist/service/ipcClient.js.map +1 -1
- package/dist/service/run.d.ts.map +1 -1
- package/dist/service/run.js +81 -3
- package/dist/service/run.js.map +1 -1
- package/dist/service/types.js +1 -1
- package/package.json +6 -3
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { RealtimeTranscriber } from './realtimeTranscription.js';
|
|
2
|
+
/**
|
|
3
|
+
* Decide whether a DataChannel frame is binary audio or a JSON control
|
|
4
|
+
* message. Extracted (and pure) so it can be unit-tested without WebRTC.
|
|
5
|
+
*/
|
|
6
|
+
export function classifyVoiceDcData(data) {
|
|
7
|
+
if (typeof data === 'string') {
|
|
8
|
+
try {
|
|
9
|
+
const msg = JSON.parse(data);
|
|
10
|
+
if (msg && typeof msg.t === 'string')
|
|
11
|
+
return { kind: 'control', msg };
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
/* fall through */
|
|
15
|
+
}
|
|
16
|
+
return { kind: 'ignore' };
|
|
17
|
+
}
|
|
18
|
+
if (data instanceof ArrayBuffer)
|
|
19
|
+
return { kind: 'audio', bytes: Buffer.from(data) };
|
|
20
|
+
if (ArrayBuffer.isView(data)) {
|
|
21
|
+
const view = data;
|
|
22
|
+
return { kind: 'audio', bytes: Buffer.from(view.buffer, view.byteOffset, view.byteLength) };
|
|
23
|
+
}
|
|
24
|
+
if (Buffer.isBuffer(data))
|
|
25
|
+
return { kind: 'audio', bytes: data };
|
|
26
|
+
return { kind: 'ignore' };
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Probe this machine's voice capability for the handshake ack. Batch
|
|
30
|
+
* transcription is always available in this build; streaming additionally
|
|
31
|
+
* requires the optional native WebRTC dependency to load.
|
|
32
|
+
*/
|
|
33
|
+
export async function probeAudioSupport() {
|
|
34
|
+
return { transcription: true, streaming: (await loadWrtc()) !== null };
|
|
35
|
+
}
|
|
36
|
+
/** STUN servers from env (comma-separated) or a public default. No TURN. */
|
|
37
|
+
function iceServers() {
|
|
38
|
+
const env = process.env.QUICKSAVE_VOICE_STUN?.trim();
|
|
39
|
+
const urls = env ? env.split(',').map((s) => s.trim()).filter(Boolean) : ['stun:stun.l.google.com:19302'];
|
|
40
|
+
return urls.map((u) => ({ urls: u }));
|
|
41
|
+
}
|
|
42
|
+
let wrtcCache;
|
|
43
|
+
async function loadWrtc() {
|
|
44
|
+
if (wrtcCache !== undefined)
|
|
45
|
+
return wrtcCache;
|
|
46
|
+
try {
|
|
47
|
+
const mod = (await import('@roamhq/wrtc'));
|
|
48
|
+
wrtcCache = (mod.default ?? mod);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
wrtcCache = null;
|
|
52
|
+
}
|
|
53
|
+
return wrtcCache;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Manages per-session WebRTC peers and their ASR bridges. One instance is
|
|
57
|
+
* created per agent process; `wireVoiceStream` registers the bus handlers.
|
|
58
|
+
*/
|
|
59
|
+
export class VoiceStreamManager {
|
|
60
|
+
bus;
|
|
61
|
+
peers = new Map();
|
|
62
|
+
constructor(bus) {
|
|
63
|
+
this.bus = bus;
|
|
64
|
+
}
|
|
65
|
+
/** Whether streaming is available (native WebRTC loadable) on this host. */
|
|
66
|
+
async available() {
|
|
67
|
+
return (await loadWrtc()) !== null;
|
|
68
|
+
}
|
|
69
|
+
/** Handle a WebRTC offer; returns the SDP answer (or an error). */
|
|
70
|
+
async connect(sessionId, offerSdp) {
|
|
71
|
+
const wrtc = await loadWrtc();
|
|
72
|
+
if (!wrtc)
|
|
73
|
+
return { error: 'Streaming voice is unavailable on this agent.' };
|
|
74
|
+
this.teardown(sessionId); // replace any stale peer for this session
|
|
75
|
+
const pc = new wrtc.RTCPeerConnection({ iceServers: iceServers() });
|
|
76
|
+
const peer = { pc, transcriber: null };
|
|
77
|
+
this.peers.set(sessionId, peer);
|
|
78
|
+
pc.onicecandidate = (e) => {
|
|
79
|
+
const candidate = e.candidate ? JSON.stringify(e.candidate) : null;
|
|
80
|
+
this.bus.publish(`/voice/rtc/${sessionId}`, { candidate });
|
|
81
|
+
};
|
|
82
|
+
pc.ondatachannel = (e) => this.wireDataChannel(sessionId, peer, e.channel);
|
|
83
|
+
pc.onconnectionstatechange = () => {
|
|
84
|
+
if (['failed', 'closed', 'disconnected'].includes(pc.connectionState))
|
|
85
|
+
this.teardown(sessionId);
|
|
86
|
+
};
|
|
87
|
+
try {
|
|
88
|
+
await pc.setRemoteDescription({ type: 'offer', sdp: offerSdp });
|
|
89
|
+
const answer = await pc.createAnswer();
|
|
90
|
+
await pc.setLocalDescription(answer);
|
|
91
|
+
return { sdp: answer.sdp };
|
|
92
|
+
}
|
|
93
|
+
catch (err) {
|
|
94
|
+
this.teardown(sessionId);
|
|
95
|
+
return { error: err instanceof Error ? err.message : 'Failed to negotiate WebRTC connection.' };
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Add a trickled ICE candidate from the PWA. */
|
|
99
|
+
async addIce(sessionId, candidate) {
|
|
100
|
+
const peer = this.peers.get(sessionId);
|
|
101
|
+
if (!peer)
|
|
102
|
+
return { ok: false, error: 'No active voice session.' };
|
|
103
|
+
if (candidate === null)
|
|
104
|
+
return { ok: true }; // end-of-candidates marker
|
|
105
|
+
try {
|
|
106
|
+
await peer.pc.addIceCandidate(JSON.parse(candidate));
|
|
107
|
+
return { ok: true };
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
return { ok: false, error: err instanceof Error ? err.message : 'Bad ICE candidate.' };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
wireDataChannel(sessionId, peer, channel) {
|
|
114
|
+
const sendDc = (msg) => {
|
|
115
|
+
try {
|
|
116
|
+
channel.send(JSON.stringify(msg));
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
/* channel may have closed */
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
channel.onmessage = (e) => {
|
|
123
|
+
const inbound = classifyVoiceDcData(e.data);
|
|
124
|
+
if (inbound.kind === 'audio') {
|
|
125
|
+
peer.transcriber?.appendAudio(inbound.bytes);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
if (inbound.kind !== 'control')
|
|
129
|
+
return;
|
|
130
|
+
const msg = inbound.msg;
|
|
131
|
+
if (msg.t === 'start') {
|
|
132
|
+
this.startUtterance(peer, msg.config, msg.sampleRate, sendDc);
|
|
133
|
+
}
|
|
134
|
+
else if (msg.t === 'stop') {
|
|
135
|
+
peer.transcriber?.commit();
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
channel.onclose = () => this.teardown(sessionId);
|
|
139
|
+
}
|
|
140
|
+
startUtterance(peer, config, sampleRate, sendDc) {
|
|
141
|
+
peer.transcriber?.close();
|
|
142
|
+
peer.transcriber = new RealtimeTranscriber(config, sampleRate, {
|
|
143
|
+
onPartial: (text) => sendDc({ t: 'transcript', final: false, text }),
|
|
144
|
+
onFinal: (text) => sendDc({ t: 'transcript', final: true, text }),
|
|
145
|
+
onError: (message) => sendDc({ t: 'error', message }),
|
|
146
|
+
});
|
|
147
|
+
peer.transcriber.start();
|
|
148
|
+
}
|
|
149
|
+
teardown(sessionId) {
|
|
150
|
+
const peer = this.peers.get(sessionId);
|
|
151
|
+
if (!peer)
|
|
152
|
+
return;
|
|
153
|
+
this.peers.delete(sessionId);
|
|
154
|
+
peer.transcriber?.close();
|
|
155
|
+
try {
|
|
156
|
+
peer.pc.close();
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
/* already closed */
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** Close all peers (process shutdown). */
|
|
163
|
+
closeAll() {
|
|
164
|
+
for (const id of [...this.peers.keys()])
|
|
165
|
+
this.teardown(id);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Register the streaming-voice signaling verbs on the bus. Kept separate from
|
|
170
|
+
* `wireLegacyBusVerbs` because these need async ICE pushes via `bus.publish`,
|
|
171
|
+
* which the MessageHandler dispatch path does not expose.
|
|
172
|
+
*/
|
|
173
|
+
export function wireVoiceStream(bus) {
|
|
174
|
+
const manager = new VoiceStreamManager(bus);
|
|
175
|
+
bus.onCommand('voice:rtc-connect', (payload) => manager.connect(payload.sessionId, payload.sdp));
|
|
176
|
+
bus.onCommand('voice:rtc-ice', (payload) => manager.addIce(payload.sessionId, payload.candidate));
|
|
177
|
+
return manager;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=voiceStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voiceStream.js","sourceRoot":"","sources":["../../src/ai/voiceStream.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAiBjE;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmB,CAAC;YAC/C,IAAI,GAAG,IAAI,OAAQ,GAAuB,CAAC,CAAC,KAAK,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;QAC7F,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,IAAI,YAAY,WAAW;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACpF,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAuB,CAAC;QACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;IAC9F,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,MAAM,QAAQ,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;AACzE,CAAC;AAED,4EAA4E;AAC5E,SAAS,UAAU;IACjB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,CAAC;IACrD,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC;IAC1G,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAID,IAAI,SAAwC,CAAC;AAC7C,KAAK,UAAU,QAAQ;IACrB,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,CAAqD,CAAC;QAC/F,SAAS,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAe,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAyBD;;;GAGG;AACH,MAAM,OAAO,kBAAkB;IAGA;IAFZ,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IAEtD,YAA6B,GAAa;QAAb,QAAG,GAAH,GAAG,CAAU;IAAG,CAAC;IAE9C,4EAA4E;IAC5E,KAAK,CAAC,SAAS;QACb,OAAO,CAAC,MAAM,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC;IACrC,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,QAAgB;QAC/C,MAAM,IAAI,GAAG,MAAM,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,KAAK,EAAE,+CAA+C,EAAE,CAAC;QAE7E,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,0CAA0C;QAEpE,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,iBAAiB,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QACpE,MAAM,IAAI,GAAc,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAEhC,EAAE,CAAC,cAAc,GAAG,CAAC,CAAC,EAAE,EAAE;YACxB,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACnE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAoB,cAAc,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAChF,CAAC,CAAC;QACF,EAAE,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3E,EAAE,CAAC,uBAAuB,GAAG,GAAG,EAAE;YAChC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,CAAC;gBAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAClG,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,EAAE,CAAC;YACvC,MAAM,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;YACrC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACzB,OAAO,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC,EAAE,CAAC;QAClG,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,SAAwB;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;QACnE,IAAI,SAAS,KAAK,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,2BAA2B;QACxE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YACrD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACzF,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,SAAiB,EAAE,IAAe,EAAE,OAA2B;QACrF,MAAM,MAAM,GAAG,CAAC,GAAmB,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,EAAE;YACxB,MAAM,OAAO,GAAG,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO;YACvC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;YACxB,IAAI,GAAG,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;gBACtB,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAChE,CAAC;iBAAM,IAAI,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;gBAC5B,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC;QACF,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAEO,cAAc,CACpB,IAAe,EACf,MAAmB,EACnB,UAAkB,EAClB,MAAqC;QAErC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE;YAC7D,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACpE,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACjE,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;SACtD,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAEO,QAAQ,CAAC,SAAiB;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,QAAQ;QACN,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,GAAa;IAC3C,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAE5C,GAAG,CAAC,SAAS,CACX,mBAAmB,EACnB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAC7D,CAAC;IACF,GAAG,CAAC,SAAS,CACX,eAAe,EACf,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAClE,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent-side voice transcription against a Whisper-compatible API.
|
|
3
|
+
*
|
|
4
|
+
* Runs on the agent (Node) rather than the PWA so there is no browser CORS
|
|
5
|
+
* constraint — OpenAI's hosted endpoint and self-hosted servers both work.
|
|
6
|
+
* The PWA sends the recording + the user's config; nothing is persisted here.
|
|
7
|
+
*/
|
|
8
|
+
import type { VoiceConfig } from '@sumicom/quicksave-shared';
|
|
9
|
+
/** Below this the audio is effectively empty (decodes to 0 seconds). */
|
|
10
|
+
export declare const MIN_AUDIO_BYTES = 1024;
|
|
11
|
+
export declare class VoiceTranscriptionError extends Error {
|
|
12
|
+
readonly cause?: unknown | undefined;
|
|
13
|
+
constructor(message: string, cause?: unknown | undefined);
|
|
14
|
+
}
|
|
15
|
+
/** True when the config has the minimum needed for batch transcription. */
|
|
16
|
+
export declare function isVoiceConfigUsable(config: VoiceConfig | null | undefined): config is VoiceConfig;
|
|
17
|
+
/**
|
|
18
|
+
* Transcribe audio bytes to text. Posts multipart/form-data to
|
|
19
|
+
* `{baseUrl}/audio/transcriptions` (OpenAI Whisper API shape).
|
|
20
|
+
*
|
|
21
|
+
* @throws {VoiceTranscriptionError} on misconfiguration, network failure,
|
|
22
|
+
* non-2xx, or a response missing a usable `text` field.
|
|
23
|
+
*/
|
|
24
|
+
export declare function transcribeAudio(audio: Buffer | Uint8Array, mimeType: string, config: VoiceConfig): Promise<string>;
|
|
25
|
+
/**
|
|
26
|
+
* List model ids from `GET {baseUrl}/models` (OpenAI-compatible). Used to
|
|
27
|
+
* populate the model dropdown in Settings.
|
|
28
|
+
*
|
|
29
|
+
* @throws {VoiceTranscriptionError} on misconfiguration, network/CORS-free
|
|
30
|
+
* failure, non-2xx, or an unrecognizable response shape.
|
|
31
|
+
*/
|
|
32
|
+
export declare function listModels(config: VoiceConfig): Promise<string[]>;
|
|
33
|
+
//# sourceMappingURL=voiceTranscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voiceTranscription.d.ts","sourceRoot":"","sources":["../../src/ai/voiceTranscription.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,wEAAwE;AACxE,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,qBAAa,uBAAwB,SAAQ,KAAK;IACnB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO;gBAAzC,OAAO,EAAE,MAAM,EAAW,KAAK,CAAC,EAAE,OAAO,YAAA;CAItD;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,IAAI,WAAW,CAEjG;AAqBD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,GAAG,UAAU,EAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CA8CjB;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoCvE"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/** Below this the audio is effectively empty (decodes to 0 seconds). */
|
|
2
|
+
export const MIN_AUDIO_BYTES = 1024;
|
|
3
|
+
export class VoiceTranscriptionError extends Error {
|
|
4
|
+
cause;
|
|
5
|
+
constructor(message, cause) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.cause = cause;
|
|
8
|
+
this.name = 'VoiceTranscriptionError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** True when the config has the minimum needed for batch transcription. */
|
|
12
|
+
export function isVoiceConfigUsable(config) {
|
|
13
|
+
return !!config && config.baseUrl.trim().length > 0 && config.transcribeModel.trim().length > 0;
|
|
14
|
+
}
|
|
15
|
+
/** Join base URL + path without doubling or dropping the slash. */
|
|
16
|
+
function apiUrl(baseUrl, path) {
|
|
17
|
+
return `${baseUrl.trim().replace(/\/+$/, '')}${path}`;
|
|
18
|
+
}
|
|
19
|
+
function authHeaders(config) {
|
|
20
|
+
const headers = {};
|
|
21
|
+
if (config.apiKey.trim())
|
|
22
|
+
headers.Authorization = `Bearer ${config.apiKey.trim()}`;
|
|
23
|
+
return headers;
|
|
24
|
+
}
|
|
25
|
+
async function errorDetail(res) {
|
|
26
|
+
try {
|
|
27
|
+
return (await res.text()).slice(0, 300);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return '';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Transcribe audio bytes to text. Posts multipart/form-data to
|
|
35
|
+
* `{baseUrl}/audio/transcriptions` (OpenAI Whisper API shape).
|
|
36
|
+
*
|
|
37
|
+
* @throws {VoiceTranscriptionError} on misconfiguration, network failure,
|
|
38
|
+
* non-2xx, or a response missing a usable `text` field.
|
|
39
|
+
*/
|
|
40
|
+
export async function transcribeAudio(audio, mimeType, config) {
|
|
41
|
+
if (!isVoiceConfigUsable(config)) {
|
|
42
|
+
throw new VoiceTranscriptionError('Voice transcription is not configured.');
|
|
43
|
+
}
|
|
44
|
+
// Reject effectively-empty audio before spending an API round-trip — a
|
|
45
|
+
// near-empty container decodes to 0 seconds and the API rejects it anyway.
|
|
46
|
+
if (audio.length < MIN_AUDIO_BYTES) {
|
|
47
|
+
throw new VoiceTranscriptionError('No speech captured.');
|
|
48
|
+
}
|
|
49
|
+
const ext = mimeType.includes('mp4') ? 'mp4' : mimeType.includes('ogg') ? 'ogg' : 'webm';
|
|
50
|
+
const form = new FormData();
|
|
51
|
+
form.append('file', new Blob([audio], { type: mimeType || 'audio/webm' }), `recording.${ext}`);
|
|
52
|
+
form.append('model', config.transcribeModel.trim());
|
|
53
|
+
form.append('response_format', 'json');
|
|
54
|
+
let res;
|
|
55
|
+
try {
|
|
56
|
+
res = await fetch(apiUrl(config.baseUrl, '/audio/transcriptions'), {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
headers: authHeaders(config),
|
|
59
|
+
body: form,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
throw new VoiceTranscriptionError('Could not reach the transcription server.', err);
|
|
64
|
+
}
|
|
65
|
+
if (!res.ok) {
|
|
66
|
+
const detail = await errorDetail(res);
|
|
67
|
+
throw new VoiceTranscriptionError(`Transcription failed (${res.status})${detail ? `: ${detail}` : ''}`);
|
|
68
|
+
}
|
|
69
|
+
let payload;
|
|
70
|
+
try {
|
|
71
|
+
payload = await res.json();
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
throw new VoiceTranscriptionError('Transcription server returned an invalid response.', err);
|
|
75
|
+
}
|
|
76
|
+
const text = payload?.text;
|
|
77
|
+
if (typeof text !== 'string') {
|
|
78
|
+
throw new VoiceTranscriptionError('Transcription response did not contain text.');
|
|
79
|
+
}
|
|
80
|
+
return text.trim();
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* List model ids from `GET {baseUrl}/models` (OpenAI-compatible). Used to
|
|
84
|
+
* populate the model dropdown in Settings.
|
|
85
|
+
*
|
|
86
|
+
* @throws {VoiceTranscriptionError} on misconfiguration, network/CORS-free
|
|
87
|
+
* failure, non-2xx, or an unrecognizable response shape.
|
|
88
|
+
*/
|
|
89
|
+
export async function listModels(config) {
|
|
90
|
+
if (!config.baseUrl.trim()) {
|
|
91
|
+
throw new VoiceTranscriptionError('No API base URL configured.');
|
|
92
|
+
}
|
|
93
|
+
let res;
|
|
94
|
+
try {
|
|
95
|
+
res = await fetch(apiUrl(config.baseUrl, '/models'), { headers: authHeaders(config) });
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
throw new VoiceTranscriptionError('Could not reach the model list endpoint.', err);
|
|
99
|
+
}
|
|
100
|
+
if (!res.ok) {
|
|
101
|
+
const detail = await errorDetail(res);
|
|
102
|
+
throw new VoiceTranscriptionError(`Listing models failed (${res.status})${detail ? `: ${detail}` : ''}`);
|
|
103
|
+
}
|
|
104
|
+
let payload;
|
|
105
|
+
try {
|
|
106
|
+
payload = await res.json();
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
throw new VoiceTranscriptionError('Model list endpoint returned an invalid response.', err);
|
|
110
|
+
}
|
|
111
|
+
// OpenAI shape: { data: [{ id }, ...] }. Some servers return a bare array.
|
|
112
|
+
const data = Array.isArray(payload)
|
|
113
|
+
? payload
|
|
114
|
+
: payload?.data;
|
|
115
|
+
if (!Array.isArray(data)) {
|
|
116
|
+
throw new VoiceTranscriptionError('Model list response was not in a recognized format.');
|
|
117
|
+
}
|
|
118
|
+
return data
|
|
119
|
+
.map((m) => (typeof m === 'string' ? m : m?.id))
|
|
120
|
+
.filter((id) => typeof id === 'string' && id.length > 0);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=voiceTranscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voiceTranscription.js","sourceRoot":"","sources":["../../src/ai/voiceTranscription.ts"],"names":[],"mappings":"AAWA,wEAAwE;AACxE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACV;IAAtC,YAAY,OAAe,EAAW,KAAe;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QADqB,UAAK,GAAL,KAAK,CAAU;QAEnD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,MAAsC;IACxE,OAAO,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAClG,CAAC;AAED,mEAAmE;AACnE,SAAS,MAAM,CAAC,OAAe,EAAE,IAAY;IAC3C,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,WAAW,CAAC,MAAmB;IACtC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,aAAa,GAAG,UAAU,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IACnF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAa;IACtC,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA0B,EAC1B,QAAgB,EAChB,MAAmB;IAEnB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,uBAAuB,CAAC,wCAAwC,CAAC,CAAC;IAC9E,CAAC;IACD,uEAAuE;IACvE,2EAA2E;IAC3E,IAAI,KAAK,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;QACnC,MAAM,IAAI,uBAAuB,CAAC,qBAAqB,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACzF,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,IAAI,YAAY,EAAE,CAAC,EAAE,aAAa,GAAG,EAAE,CAAC,CAAC;IAC/F,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAEvC,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,uBAAuB,CAAC,EAAE;YACjE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC;YAC5B,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,uBAAuB,CAAC,2CAA2C,EAAE,GAAG,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,uBAAuB,CAC/B,yBAAyB,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACrE,CAAC;IACJ,CAAC;IAED,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,uBAAuB,CAAC,oDAAoD,EAAE,GAAG,CAAC,CAAC;IAC/F,CAAC;IAED,MAAM,IAAI,GAAI,OAAqC,EAAE,IAAI,CAAC;IAC1D,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,uBAAuB,CAAC,8CAA8C,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;AACrB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAmB;IAClD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,uBAAuB,CAAC,6BAA6B,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,uBAAuB,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,uBAAuB,CAC/B,0BAA0B,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACtE,CAAC;IACJ,CAAC;IAED,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,uBAAuB,CAAC,mDAAmD,EAAE,GAAG,CAAC,CAAC;IAC9F,CAAC;IAED,2EAA2E;IAC3E,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QACjC,CAAC,CAAC,OAAO;QACT,CAAC,CAAE,OAAqC,EAAE,IAAI,CAAC;IACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,uBAAuB,CAAC,qDAAqD,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAsB,EAAE,EAAE,CAAC,CAAC;SACrE,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileBrowser.d.ts","sourceRoot":"","sources":["../../src/files/fileBrowser.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAGV,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"fileBrowser.d.ts","sourceRoot":"","sources":["../../src/files/fileBrowser.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAGV,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AAsCnC,qBAAa,WAAW;IAChB,IAAI,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAoCzE,IAAI,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,wBAAwB,CAAC;CA6EhF;AA2ED,wBAAgB,cAAc,IAAI,WAAW,CAG5C;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C"}
|
|
@@ -24,8 +24,9 @@ const DEFAULT_PREVIEW_BYTES = 100 * 1024;
|
|
|
24
24
|
/** Absolute ceiling on `maxBytes` regardless of what the PWA asks for. */
|
|
25
25
|
const HARD_PREVIEW_BYTES = 512 * 1024;
|
|
26
26
|
/** Larger ceiling when the caller opts in to image inlining (`allowImage`).
|
|
27
|
-
*
|
|
28
|
-
|
|
27
|
+
* Base64 inflates by ~33%, so 16 MiB of source pixels is ~21 MiB before
|
|
28
|
+
* transport compression. */
|
|
29
|
+
const HARD_IMAGE_BYTES = 16 * 1024 * 1024;
|
|
29
30
|
/** Bytes to sniff when classifying a file as text vs binary (NUL byte = binary). */
|
|
30
31
|
const SNIFF_BYTES = 8 * 1024;
|
|
31
32
|
/** Extensions we recognise for inline image rendering. SVG is text and is
|
|
@@ -46,6 +47,11 @@ function imageMimeFor(absPath) {
|
|
|
46
47
|
return undefined;
|
|
47
48
|
return IMAGE_EXT_TO_MIME[absPath.slice(dot + 1).toLowerCase()];
|
|
48
49
|
}
|
|
50
|
+
/** Weak ETag built from stat metadata. Same shape that the PWA produces
|
|
51
|
+
* from a cached response — keep both sides in sync. */
|
|
52
|
+
function etagOf(meta) {
|
|
53
|
+
return `${meta.mtime}-${meta.size}`;
|
|
54
|
+
}
|
|
49
55
|
export class FileBrowser {
|
|
50
56
|
async list(payload) {
|
|
51
57
|
try {
|
|
@@ -98,6 +104,13 @@ export class FileBrowser {
|
|
|
98
104
|
size: stats.size,
|
|
99
105
|
mtime: Math.floor(stats.mtimeMs),
|
|
100
106
|
};
|
|
107
|
+
// Conditional revalidation — HTTP-style If-None-Match. Caller sends
|
|
108
|
+
// "${mtime}-${size}" from a prior cached read; if the file is
|
|
109
|
+
// unchanged, we skip the disk read entirely and the PWA reuses its
|
|
110
|
+
// cached body. Saves both the readFile() and the on-wire payload.
|
|
111
|
+
if (payload.ifNoneMatch && payload.ifNoneMatch === etagOf(meta)) {
|
|
112
|
+
return { success: true, ...meta, notModified: true };
|
|
113
|
+
}
|
|
101
114
|
// Image branch — opt-in via `allowImage`. We use a separate, larger
|
|
102
115
|
// cap because images legitimately exceed the 100 KiB text preview
|
|
103
116
|
// budget, but we still bound it so a stray multi-MB asset can't
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileBrowser.js","sourceRoot":"","sources":["../../src/files/fileBrowser.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,+BAA+B;AAC/B;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUhD,0DAA0D;AAC1D,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAC;AACzC,0EAA0E;AAC1E,MAAM,kBAAkB,GAAG,GAAG,GAAG,IAAI,CAAC;AACtC;
|
|
1
|
+
{"version":3,"file":"fileBrowser.js","sourceRoot":"","sources":["../../src/files/fileBrowser.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import type { MessageHandler } from './messageHandler.js';
|
|
|
9
9
|
* and translates the response back into a bus result frame.
|
|
10
10
|
*
|
|
11
11
|
* **This list is one of three coupled sources** for the request/response
|
|
12
|
-
* surface — see
|
|
12
|
+
* surface — see AGENTS.md "Documentation Sync Pointers". Adding a new verb requires
|
|
13
13
|
* touching:
|
|
14
14
|
* 1. `messageHandler.ts` switch (the handler itself)
|
|
15
15
|
* 2. This array (the bus exposure)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacyBusAdapter.d.ts","sourceRoot":"","sources":["../../src/handlers/legacyBusAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"legacyBusAdapter.d.ts","sourceRoot":"","sources":["../../src/handlers/legacyBusAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAAW,EA0FzC,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,cAAc,EACvB,KAAK,GAAE,SAAS,WAAW,EAAqB,GAC/C,IAAI,CA4BN"}
|
|
@@ -9,7 +9,7 @@ import { createMessage, } from '@sumicom/quicksave-shared';
|
|
|
9
9
|
* and translates the response back into a bus result frame.
|
|
10
10
|
*
|
|
11
11
|
* **This list is one of three coupled sources** for the request/response
|
|
12
|
-
* surface — see
|
|
12
|
+
* surface — see AGENTS.md "Documentation Sync Pointers". Adding a new verb requires
|
|
13
13
|
* touching:
|
|
14
14
|
* 1. `messageHandler.ts` switch (the handler itself)
|
|
15
15
|
* 2. This array (the bus exposure)
|
|
@@ -54,6 +54,7 @@ export const LEGACY_BUS_VERBS = [
|
|
|
54
54
|
'agent:check-update',
|
|
55
55
|
'agent:update',
|
|
56
56
|
'agent:restart',
|
|
57
|
+
'agent:probe',
|
|
57
58
|
// systemd user-unit (Linux only — agent returns available:false elsewhere)
|
|
58
59
|
'systemd:status',
|
|
59
60
|
'systemd:install',
|
|
@@ -66,6 +67,8 @@ export const LEGACY_BUS_VERBS = [
|
|
|
66
67
|
// claude
|
|
67
68
|
'claude:start',
|
|
68
69
|
'claude:resume',
|
|
70
|
+
'claude:interrupt',
|
|
71
|
+
'claude:steer-queued',
|
|
69
72
|
'claude:cancel',
|
|
70
73
|
'claude:close',
|
|
71
74
|
'claude:end-task',
|
|
@@ -80,6 +83,7 @@ export const LEGACY_BUS_VERBS = [
|
|
|
80
83
|
'session:delete-history',
|
|
81
84
|
'session:list-archived',
|
|
82
85
|
'session:mark-read',
|
|
86
|
+
'session:dismiss-pending-mission',
|
|
83
87
|
// project
|
|
84
88
|
'project:list-summaries',
|
|
85
89
|
'project:list-repos',
|
|
@@ -99,6 +103,8 @@ export const LEGACY_BUS_VERBS = [
|
|
|
99
103
|
'attachment:upload',
|
|
100
104
|
'attachment:cancel',
|
|
101
105
|
'attachment:fetch',
|
|
106
|
+
'voice:transcribe',
|
|
107
|
+
'voice:list-models',
|
|
102
108
|
];
|
|
103
109
|
/**
|
|
104
110
|
* 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,2EAA2E;IAC3E,gBAAgB;IAChB,iBAAiB;IACjB,mBAAmB;IACnB,QAAQ;IACR,mBAAmB;IACnB,mBAAmB;IACnB,oBAAoB;IACpB,oBAAoB;IACpB,SAAS;IACT,cAAc;IACd,eAAe;IACf,eAAe;IACf,cAAc;IACd,iBAAiB;IACjB,4BAA4B;IAC5B,wBAAwB;IACxB,+BAA+B;IAC/B,kBAAkB;IAClB,UAAU;IACV,oBAAoB;IACpB,yBAAyB;IACzB,wBAAwB;IACxB,wBAAwB;IACxB,uBAAuB;IACvB,mBAAmB;IACnB,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;
|
|
1
|
+
{"version":3,"file":"legacyBusAdapter.js","sourceRoot":"","sources":["../../src/handlers/legacyBusAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -160,6 +160,8 @@ export declare class MessageHandler {
|
|
|
160
160
|
private handleClearCommitSummary;
|
|
161
161
|
private getAiCliService;
|
|
162
162
|
private handleSetApiKey;
|
|
163
|
+
private handleVoiceTranscribe;
|
|
164
|
+
private handleVoiceListModels;
|
|
163
165
|
private handleGetApiKeyStatus;
|
|
164
166
|
private handleListRepos;
|
|
165
167
|
private handleSwitchRepo;
|
|
@@ -175,6 +177,7 @@ export declare class MessageHandler {
|
|
|
175
177
|
private handleAgentCheckUpdate;
|
|
176
178
|
private handleAgentUpdate;
|
|
177
179
|
private handleAgentRestart;
|
|
180
|
+
private handleAgentProbe;
|
|
178
181
|
private handleSystemdStatus;
|
|
179
182
|
private handleSystemdInstall;
|
|
180
183
|
private handleSystemdUninstall;
|
|
@@ -192,6 +195,8 @@ export declare class MessageHandler {
|
|
|
192
195
|
private handleClaudeStart;
|
|
193
196
|
private handleClaudeResume;
|
|
194
197
|
private handleClaudeCancel;
|
|
198
|
+
private handleClaudeInterrupt;
|
|
199
|
+
private handleClaudeSteerQueued;
|
|
195
200
|
private handleClaudeClose;
|
|
196
201
|
/**
|
|
197
202
|
* End Task: archive the session's registry entry, then terminate the live
|
|
@@ -226,6 +231,7 @@ export declare class MessageHandler {
|
|
|
226
231
|
* undo a fresh read from a faster one.
|
|
227
232
|
*/
|
|
228
233
|
private handleMarkRead;
|
|
234
|
+
private handleDismissPendingMission;
|
|
229
235
|
private handleListProjectSummaries;
|
|
230
236
|
private handleListProjectRepos;
|
|
231
237
|
/**
|
|
@@ -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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"}
|