@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.211",
13
- "@jskit-ai/assistant-runtime": "0.1.204",
14
- "@jskit-ai/assistant-voice": "0.1.11",
15
- "@jskit-ai/connectors-catalog": "0.1.50",
16
- "@jskit-ai/http-runtime": "0.1.231",
17
- "@jskit-ai/kernel": "0.1.233",
18
- "@jskit-ai/realtime": "0.1.230",
19
- "@jskit-ai/shell-web": "0.1.237",
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.11",
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.211",
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) => {