@jskit-ai/assistant-voice 0.1.11 → 0.1.13
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/README.md
CHANGED
|
@@ -209,3 +209,12 @@ through an application-authorized route; credentials stay on the server. The
|
|
|
209
209
|
result contains `voices` (IDs, labels and optional languages) and `defaultVoice`,
|
|
210
210
|
matching the WebSocket greeting. Listing voices does not synthesize or load
|
|
211
211
|
additional voice models.
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
`binding.defaults.reviewBeforeSend` is captured when each recording starts. An
|
|
215
|
+
explicit true value holds completed speech for the existing review/Send flow on
|
|
216
|
+
both manual finalization and automatic hands-free endpoint completion. A daemon
|
|
217
|
+
reset within the same continuous capture retains that choice while creating a
|
|
218
|
+
separate message identity; it does not append words to an earlier queued message.
|
|
219
|
+
Fresh capture reads fresh defaults. Missing/false retains automatic completed
|
|
220
|
+
speech delivery. This flag does not change playback or input ownership.
|
|
@@ -9,14 +9,14 @@
|
|
|
9
9
|
},
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@fastify/websocket": "^11.2.0",
|
|
12
|
-
"@jskit-ai/assistant-core": "0.1.
|
|
13
|
-
"@jskit-ai/assistant-runtime": "0.1.
|
|
14
|
-
"@jskit-ai/assistant-voice": "0.1.
|
|
15
|
-
"@jskit-ai/connectors-catalog": "0.1.
|
|
16
|
-
"@jskit-ai/http-runtime": "0.1.
|
|
17
|
-
"@jskit-ai/kernel": "0.1.
|
|
18
|
-
"@jskit-ai/realtime": "0.1.
|
|
19
|
-
"@jskit-ai/shell-web": "0.1.
|
|
12
|
+
"@jskit-ai/assistant-core": "0.1.213",
|
|
13
|
+
"@jskit-ai/assistant-runtime": "0.1.206",
|
|
14
|
+
"@jskit-ai/assistant-voice": "0.1.13",
|
|
15
|
+
"@jskit-ai/connectors-catalog": "0.1.52",
|
|
16
|
+
"@jskit-ai/http-runtime": "0.1.233",
|
|
17
|
+
"@jskit-ai/kernel": "0.1.235",
|
|
18
|
+
"@jskit-ai/realtime": "0.1.232",
|
|
19
|
+
"@jskit-ai/shell-web": "0.1.239",
|
|
20
20
|
"@mdi/js": "^7.4.47",
|
|
21
21
|
"@tanstack/vue-query": "^5.90.5",
|
|
22
22
|
"fastify": "^5.8.0",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jskit-ai/assistant-voice",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.13",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Duplex voice conversations with application-owned targets, authorization and speech services.",
|
|
6
6
|
"scripts": {
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"examples"
|
|
19
19
|
],
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@jskit-ai/assistant-core": "0.1.
|
|
21
|
+
"@jskit-ai/assistant-core": "0.1.213",
|
|
22
22
|
"@mdi/js": "^7.4.47",
|
|
23
23
|
"ws": "^8.20.1"
|
|
24
24
|
},
|
|
@@ -552,7 +552,8 @@ export function useVoiceConversation(binding, { socketUrl, createTransport = use
|
|
|
552
552
|
const key = `${candidate.turnId}:${candidate.revision}`;
|
|
553
553
|
if (decidedCandidate === key) return;
|
|
554
554
|
decidedCandidate = key;
|
|
555
|
-
const captured = { focus: { ...(recording?.focus || (binding.captureContext?.() || {})) }, messageId: recording?.messageId || crypto.randomUUID(), text: candidate.text
|
|
555
|
+
const captured = { focus: { ...(recording?.focus || (binding.captureContext?.() || {})) }, messageId: recording?.messageId || crypto.randomUUID(), text: candidate.text,
|
|
556
|
+
...(recording?.reviewBeforeSend ? { reviewBeforeSend: true } : {}) };
|
|
556
557
|
try {
|
|
557
558
|
const text = candidate.text.trim();
|
|
558
559
|
const spoken = currentSpokenText();
|
|
@@ -590,13 +591,15 @@ export function useVoiceConversation(binding, { socketUrl, createTransport = use
|
|
|
590
591
|
if (!utterance || !live.value || !committing || committing.turnId !== utterance.turnId || committing.revision !== utterance.revision) return;
|
|
591
592
|
pendingTranscript.value = { ...committing, text: utterance.text };
|
|
592
593
|
committing = null;
|
|
593
|
-
void deliverTranscript();
|
|
594
|
+
if (!pendingTranscript.value.reviewBeforeSend) void deliverTranscript();
|
|
595
|
+
else holding.value = false;
|
|
594
596
|
});
|
|
595
597
|
watch(voice.utteranceReset, (reset) => {
|
|
596
598
|
// A discard can lose a race with resumed speech. Keep this utterance's
|
|
597
599
|
// identity and destination until the daemon acknowledges the boundary.
|
|
598
600
|
if (reset?.turnId !== voice.activeListenTurnId.value || !live.value || !recording) return;
|
|
599
601
|
recording = { focus: { ...(binding.captureContext?.() || {}) }, messageId: crypto.randomUUID(), started: true, continuous: true,
|
|
602
|
+
...(recording.reviewBeforeSend ? { reviewBeforeSend: true } : {}),
|
|
600
603
|
...(recording.finishAfterPending ? { finishAfterPending: true } : {}) };
|
|
601
604
|
});
|
|
602
605
|
watch(voice.partialTranscript, (text, previous) => {
|