@flowingspring/dsh-voco 0.2.0 → 0.2.1
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/LICENSE +21 -0
- package/README.md +55 -30
- package/README.zh.md +55 -30
- package/lib/client.js +24 -24
- package/lib/plugins/voice-assistant.js +28 -7
- package/lib/plugins/voice-local.js +19 -2
- package/package.json +40 -27
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 QUAN
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,31 +1,56 @@
|
|
|
1
1
|
# `@flowingspring/dsh-voco`
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@flowingspring/dsh-voco)
|
|
4
|
+
[](https://github.com/lgquan/dsh-voco/blob/master/LICENSE)
|
|
5
|
+
|
|
6
|
+
English | [中文](README.zh.md)
|
|
7
|
+
|
|
8
|
+
Persistent, interruptible voice conversations for the DSH Web UI. Speak naturally, get an immediate conversational response, and delegate workspace tasks to a durable background Agent Session without losing context.
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
dsh plugin --profile web add @flowingspring/dsh-voco
|
|
14
|
+
dsh web
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Install the DSH CLI first if needed:
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
npm install -g @deepseek-ai/dsh
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Configure speech recognition
|
|
24
|
+
|
|
25
|
+
Set a [SiliconFlow](https://siliconflow.cn/) API key in the DSH environment:
|
|
26
|
+
|
|
27
|
+
```dotenv
|
|
28
|
+
SILICONFLOW_API_KEY=your-key
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The plugin uses `XingChenAGI/XingChenASR-V3.2-Ultra` for cloud speech recognition and Edge TTS with `zh-CN-XiaoxiaoNeural` for speech output. Browser audio is uploaded only after lightweight local speech and silence detection.
|
|
32
|
+
|
|
33
|
+
## Highlights
|
|
34
|
+
|
|
35
|
+
- Keeps one background Agent Session bound to each Voice Session, including after DSH restarts.
|
|
36
|
+
- Answers ordinary conversation directly and delegates only work that needs tools.
|
|
37
|
+
- Speaks a short contextual acknowledgement before starting delegated Agent work.
|
|
38
|
+
- Keeps full task reports in the task UI while speaking a concise, purpose-written result.
|
|
39
|
+
- Supports interruption, browser navigation, reconnects, and restored conversation history.
|
|
40
|
+
- Ships the server and browser surfaces as one public npm package.
|
|
41
|
+
|
|
42
|
+
## Configuration
|
|
43
|
+
|
|
44
|
+
The default utterance boundary is 1.5 seconds of continuous silence. Advanced settings such as `silenceDurationMs`, `speechThreshold`, `minSpeechDurationMs`, and `maxUtteranceMs` are available in the plugin profile configuration.
|
|
45
|
+
|
|
46
|
+
## Requirements and limitations
|
|
47
|
+
|
|
48
|
+
- The microphone and playback surface targets the DSH Web UI and is not a framework-independent browser plugin.
|
|
49
|
+
- Speech recognition requires network access and a SiliconFlow API key.
|
|
50
|
+
- Voice responses currently use the Chinese Xiaoxiao Edge TTS voice by default.
|
|
51
|
+
|
|
52
|
+
Source, development instructions, and issue tracking are available in the [GitHub repository](https://github.com/lgquan/dsh-voco).
|
|
53
|
+
|
|
54
|
+
## License
|
|
55
|
+
|
|
56
|
+
[MIT](LICENSE)
|
package/README.zh.md
CHANGED
|
@@ -1,31 +1,56 @@
|
|
|
1
1
|
# `@flowingspring/dsh-voco`
|
|
2
|
-
|
|
3
|
-
[
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
-
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@flowingspring/dsh-voco)
|
|
4
|
+
[](https://github.com/lgquan/dsh-voco/blob/master/LICENSE)
|
|
5
|
+
|
|
6
|
+
[English](README.md) | 中文
|
|
7
|
+
|
|
8
|
+
面向 DSH Web UI 的可恢复、可打断语音对话插件。你可以自然说出需求、立即获得口语回复,并把需要工具的工作委派给持续复用的后台 Agent Session,而不会丢失任务上下文。
|
|
9
|
+
|
|
10
|
+
## 安装
|
|
11
|
+
|
|
12
|
+
```sh
|
|
13
|
+
dsh plugin --profile web add @flowingspring/dsh-voco
|
|
14
|
+
dsh web
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
如果尚未安装 DSH 命令行:
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
npm install -g @deepseek-ai/dsh
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 配置语音识别
|
|
24
|
+
|
|
25
|
+
在 DSH 的运行环境中设置[硅基流动](https://siliconflow.cn/) API Key:
|
|
26
|
+
|
|
27
|
+
```dotenv
|
|
28
|
+
SILICONFLOW_API_KEY=你的密钥
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
插件使用 `XingChenAGI/XingChenASR-V3.2-Ultra` 完成云端语音识别,并通过 Edge TTS 的 `zh-CN-XiaoxiaoNeural` 音色输出语音。浏览器只在本地做轻量起音和静音检测,确认一句话结束后才上传音频。
|
|
32
|
+
|
|
33
|
+
## 主要功能
|
|
34
|
+
|
|
35
|
+
- 每个 Voice Session 持续绑定一个后台 Agent Session,重启 DSH 后也能恢复。
|
|
36
|
+
- 普通聊天直接回答,只有需要工具的工作才委派给后台 Agent。
|
|
37
|
+
- 委派任务启动前立即播报一句贴合当前请求的简短确认语。
|
|
38
|
+
- 完整任务报告保留在任务界面,语音只播报专门生成的简洁结果。
|
|
39
|
+
- 支持语音打断、页面切换、断线重连以及历史对话恢复。
|
|
40
|
+
- 服务端和浏览器界面统一通过一个公开 npm 包发行。
|
|
41
|
+
|
|
42
|
+
## 配置项
|
|
43
|
+
|
|
44
|
+
默认以连续静音 1.5 秒作为一句话的边界。`silenceDurationMs`、`speechThreshold`、`minSpeechDurationMs` 和 `maxUtteranceMs` 等高级参数可在插件 profile 配置中调整。
|
|
45
|
+
|
|
46
|
+
## 要求与限制
|
|
47
|
+
|
|
48
|
+
- 麦克风和播放界面面向 DSH Web UI,并不是框架无关的浏览器插件。
|
|
49
|
+
- 云端语音识别需要网络连接及硅基流动 API Key。
|
|
50
|
+
- 语音回复目前默认使用 Edge TTS 的中文晓晓音色。
|
|
51
|
+
|
|
52
|
+
源码、开发说明和问题反馈请前往 [GitHub 仓库](https://github.com/lgquan/dsh-voco)。
|
|
53
|
+
|
|
54
|
+
## 许可证
|
|
55
|
+
|
|
56
|
+
[MIT](LICENSE)
|
package/lib/client.js
CHANGED
|
@@ -18,9 +18,9 @@ window.__ModuleLoader__.load({
|
|
|
18
18
|
document.head.appendChild(tag);
|
|
19
19
|
}
|
|
20
20
|
var VoiceControl_module_css_default = {
|
|
21
|
+
"button": "PapC8q_button",
|
|
21
22
|
"active": "PapC8q_active",
|
|
22
|
-
"voice-pulse": "PapC8q_voice-pulse"
|
|
23
|
-
"button": "PapC8q_button"
|
|
23
|
+
"voice-pulse": "PapC8q_voice-pulse"
|
|
24
24
|
};
|
|
25
25
|
//#endregion
|
|
26
26
|
//#region ../ui-voice/src/client/VoiceControl.tsx
|
|
@@ -89,17 +89,17 @@ window.__ModuleLoader__.load({
|
|
|
89
89
|
document.head.appendChild(tag);
|
|
90
90
|
}
|
|
91
91
|
var VoiceHistoryAction_module_css_default = {
|
|
92
|
-
"list": "hhHVeG_list",
|
|
93
92
|
"empty": "hhHVeG_empty",
|
|
94
|
-
"panel": "hhHVeG_panel",
|
|
95
|
-
"wave": "hhHVeG_wave",
|
|
96
|
-
"meta": "hhHVeG_meta",
|
|
97
|
-
"row": "hhHVeG_row",
|
|
98
93
|
"close": "hhHVeG_close",
|
|
99
|
-
"rowText": "hhHVeG_rowText",
|
|
100
94
|
"title": "hhHVeG_title",
|
|
101
95
|
"header": "hhHVeG_header",
|
|
102
|
-
"trigger": "hhHVeG_trigger"
|
|
96
|
+
"trigger": "hhHVeG_trigger",
|
|
97
|
+
"row": "hhHVeG_row",
|
|
98
|
+
"list": "hhHVeG_list",
|
|
99
|
+
"panel": "hhHVeG_panel",
|
|
100
|
+
"rowText": "hhHVeG_rowText",
|
|
101
|
+
"meta": "hhHVeG_meta",
|
|
102
|
+
"wave": "hhHVeG_wave"
|
|
103
103
|
};
|
|
104
104
|
//#endregion
|
|
105
105
|
//#region ../ui-voice/src/client/VoiceHistoryAction.tsx
|
|
@@ -211,22 +211,22 @@ window.__ModuleLoader__.load({
|
|
|
211
211
|
document.head.appendChild(tag);
|
|
212
212
|
}
|
|
213
213
|
var VoiceNodeViews_module_css_default = {
|
|
214
|
+
"taskDot": "KSbXkW_taskDot",
|
|
215
|
+
"taskCard": "KSbXkW_taskCard",
|
|
216
|
+
"miniWave": "KSbXkW_miniWave",
|
|
217
|
+
"taskTitle": "KSbXkW_taskTitle",
|
|
218
|
+
"taskStatus": "KSbXkW_taskStatus",
|
|
219
|
+
"taskInput": "KSbXkW_taskInput",
|
|
220
|
+
"taskUpdate": "KSbXkW_taskUpdate",
|
|
214
221
|
"bubble": "KSbXkW_bubble",
|
|
215
|
-
"
|
|
222
|
+
"taskDetails": "KSbXkW_taskDetails",
|
|
223
|
+
"taskActions": "KSbXkW_taskActions",
|
|
216
224
|
"meta": "KSbXkW_meta",
|
|
217
225
|
"voiceBadge": "KSbXkW_voiceBadge",
|
|
218
|
-
"
|
|
226
|
+
"taskCancel": "KSbXkW_taskCancel",
|
|
219
227
|
"taskSummary": "KSbXkW_taskSummary",
|
|
220
|
-
"taskDetails": "KSbXkW_taskDetails",
|
|
221
|
-
"taskStatus": "KSbXkW_taskStatus",
|
|
222
|
-
"taskDot": "KSbXkW_taskDot",
|
|
223
|
-
"taskTitle": "KSbXkW_taskTitle",
|
|
224
|
-
"taskChevron": "KSbXkW_taskChevron",
|
|
225
|
-
"taskActions": "KSbXkW_taskActions",
|
|
226
|
-
"miniWave": "KSbXkW_miniWave",
|
|
227
|
-
"taskCard": "KSbXkW_taskCard",
|
|
228
228
|
"taskLink": "KSbXkW_taskLink",
|
|
229
|
-
"
|
|
229
|
+
"taskChevron": "KSbXkW_taskChevron",
|
|
230
230
|
"utterance": "KSbXkW_utterance"
|
|
231
231
|
};
|
|
232
232
|
//#endregion
|
|
@@ -355,12 +355,12 @@ window.__ModuleLoader__.load({
|
|
|
355
355
|
document.head.appendChild(tag);
|
|
356
356
|
}
|
|
357
357
|
var VoiceOverlay_module_css_default = {
|
|
358
|
-
"voice-wave": "AAuDqa_voice-wave",
|
|
359
|
-
"stop": "AAuDqa_stop",
|
|
360
|
-
"status": "AAuDqa_status",
|
|
361
358
|
"wave": "AAuDqa_wave",
|
|
359
|
+
"link": "AAuDqa_link",
|
|
360
|
+
"stop": "AAuDqa_stop",
|
|
362
361
|
"root": "AAuDqa_root",
|
|
363
|
-
"
|
|
362
|
+
"voice-wave": "AAuDqa_voice-wave",
|
|
363
|
+
"status": "AAuDqa_status"
|
|
364
364
|
};
|
|
365
365
|
//#endregion
|
|
366
366
|
//#region ../ui-voice/src/client/VoiceOverlay.tsx
|
|
@@ -641,7 +641,7 @@ function apply(ctx, config = {}) {
|
|
|
641
641
|
}, false);
|
|
642
642
|
agent.steer(message);
|
|
643
643
|
};
|
|
644
|
-
const onTaskCommand = async (binding, voiceSessionId, call) => {
|
|
644
|
+
const onTaskCommand = async (binding, voiceSessionId, call, taskIdOverride) => {
|
|
645
645
|
const complete = (result) => {
|
|
646
646
|
ctx.voice.completeTaskCommand(voiceSessionId, call.id, result);
|
|
647
647
|
};
|
|
@@ -670,16 +670,21 @@ function apply(ctx, config = {}) {
|
|
|
670
670
|
route = await routeFrontendInput(ctx, requireSourceSession(binding).events, call.command.input);
|
|
671
671
|
} catch (error) {
|
|
672
672
|
ctx.logger.warn(error instanceof Error ? error : new Error(String(error)));
|
|
673
|
-
route = {
|
|
673
|
+
route = {
|
|
674
|
+
action: "delegate",
|
|
675
|
+
acknowledgement: DEFAULT_DELEGATION_ACKNOWLEDGEMENT
|
|
676
|
+
};
|
|
674
677
|
}
|
|
675
678
|
if (route.action === "delegate") {
|
|
679
|
+
const taskId = VoiceTaskId(randomUUID());
|
|
680
|
+
speakFragment(binding, taskId, route.acknowledgement);
|
|
676
681
|
await onTaskCommand(binding, voiceSessionId, {
|
|
677
682
|
id: call.id,
|
|
678
683
|
command: {
|
|
679
684
|
type: "realtime_delegation",
|
|
680
685
|
input: call.command.input
|
|
681
686
|
}
|
|
682
|
-
});
|
|
687
|
+
}, taskId);
|
|
683
688
|
return;
|
|
684
689
|
}
|
|
685
690
|
complete({ kind: "handled" });
|
|
@@ -696,7 +701,7 @@ function apply(ctx, config = {}) {
|
|
|
696
701
|
return;
|
|
697
702
|
}
|
|
698
703
|
cancelRewrite(binding);
|
|
699
|
-
const taskId = VoiceTaskId(randomUUID());
|
|
704
|
+
const taskId = taskIdOverride ?? VoiceTaskId(randomUUID());
|
|
700
705
|
const continuous = (config.taskSessionPolicy ?? "isolated") === "continuous";
|
|
701
706
|
let created;
|
|
702
707
|
try {
|
|
@@ -1064,6 +1069,14 @@ function speechFragments(text, flush) {
|
|
|
1064
1069
|
rest
|
|
1065
1070
|
};
|
|
1066
1071
|
}
|
|
1072
|
+
const DEFAULT_DELEGATION_ACKNOWLEDGEMENT = "好的,我先查看一下。";
|
|
1073
|
+
const MAX_DELEGATION_ACKNOWLEDGEMENT_LENGTH = 40;
|
|
1074
|
+
function delegationAcknowledgement(value) {
|
|
1075
|
+
if (typeof value !== "string") return DEFAULT_DELEGATION_ACKNOWLEDGEMENT;
|
|
1076
|
+
const normalized = value.replace(/\s+/gu, " ").trim();
|
|
1077
|
+
if (normalized === "" || normalized.length > MAX_DELEGATION_ACKNOWLEDGEMENT_LENGTH) return DEFAULT_DELEGATION_ACKNOWLEDGEMENT;
|
|
1078
|
+
return normalized;
|
|
1079
|
+
}
|
|
1067
1080
|
async function routeFrontendInput(ctx, events, input) {
|
|
1068
1081
|
let llm;
|
|
1069
1082
|
try {
|
|
@@ -1071,7 +1084,10 @@ async function routeFrontendInput(ctx, events, input) {
|
|
|
1071
1084
|
} catch {
|
|
1072
1085
|
llm = void 0;
|
|
1073
1086
|
}
|
|
1074
|
-
if (llm === void 0) return {
|
|
1087
|
+
if (llm === void 0) return {
|
|
1088
|
+
action: "delegate",
|
|
1089
|
+
acknowledgement: DEFAULT_DELEGATION_ACKNOWLEDGEMENT
|
|
1090
|
+
};
|
|
1075
1091
|
const selection = ctx.agentDefaultModel.currentSelection();
|
|
1076
1092
|
const recentConversation = events.flatMap((event) => {
|
|
1077
1093
|
if (event.type !== "voice/utterance-end" || event.data.state !== "completed") return [];
|
|
@@ -1085,10 +1101,12 @@ async function routeFrontendInput(ctx, events, input) {
|
|
|
1085
1101
|
"判断下面这句话应该由语音助手直接回答,还是委派给后台编码 Agent。",
|
|
1086
1102
|
"普通寒暄、日常对话、无需读取本地项目或调用工具即可回答的问题,选择 chat,并直接给出自然简洁的中文回复。",
|
|
1087
1103
|
"只有需要查看或修改工作区文件、运行命令、测试、安装依赖或执行其他工具操作时,才选择 delegate。",
|
|
1104
|
+
"选择 delegate 时,同时给出一句简短自然的 acknowledgement,表示接下来要做什么。不能声称任务已经完成、已经找到结果,也不要提后台 Agent、工具或路由。",
|
|
1105
|
+
"acknowledgement 只能有一句,最多 40 个字符,例如“好的,我先检查一下相关代码。”。",
|
|
1088
1106
|
"只输出一行 JSON,不要 Markdown。格式只能是:",
|
|
1089
1107
|
"{\"action\":\"chat\",\"reply\":\"...\"}",
|
|
1090
1108
|
"或:",
|
|
1091
|
-
"{\"action\":\"delegate\"}",
|
|
1109
|
+
"{\"action\":\"delegate\",\"acknowledgement\":\"...\"}",
|
|
1092
1110
|
"",
|
|
1093
1111
|
"最近对话:",
|
|
1094
1112
|
recentConversation || "(无)",
|
|
@@ -1115,7 +1133,10 @@ async function routeFrontendInput(ctx, events, input) {
|
|
|
1115
1133
|
action: "chat",
|
|
1116
1134
|
reply: parsed.reply.trim()
|
|
1117
1135
|
};
|
|
1118
|
-
if (parsed.action === "delegate") return {
|
|
1136
|
+
if (parsed.action === "delegate") return {
|
|
1137
|
+
action: "delegate",
|
|
1138
|
+
acknowledgement: delegationAcknowledgement(parsed.acknowledgement)
|
|
1139
|
+
};
|
|
1119
1140
|
throw new Error("voice frontend router returned an invalid decision");
|
|
1120
1141
|
}
|
|
1121
1142
|
function fallbackSpeechText(text) {
|
|
@@ -557,9 +557,26 @@ const Config = z.object({
|
|
|
557
557
|
maxUtteranceMs: z.natural().min(1e3).default(6e4)
|
|
558
558
|
});
|
|
559
559
|
const PACKAGE_ROOT = dirname(fileURLToPath(import.meta.url));
|
|
560
|
-
|
|
560
|
+
/**
|
|
561
|
+
* Load development configuration from either the source workspace or the
|
|
562
|
+
* bundled single-package layout. DSH-installed profiles still use the
|
|
563
|
+
* process environment, so no package-local `.env` is required in production.
|
|
564
|
+
*/
|
|
565
|
+
function loadProjectEnv() {
|
|
566
|
+
const candidates = [
|
|
567
|
+
resolve(process.cwd(), ".env"),
|
|
568
|
+
resolve(PACKAGE_ROOT, "../../../.env"),
|
|
569
|
+
resolve(PACKAGE_ROOT, "../../../../.env")
|
|
570
|
+
];
|
|
571
|
+
const loaded = /* @__PURE__ */ new Set();
|
|
572
|
+
for (const filename of candidates) {
|
|
573
|
+
if (loaded.has(filename) || !existsSync(filename)) continue;
|
|
574
|
+
loaded.add(filename);
|
|
575
|
+
loadEnvFile(filename);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
561
578
|
function apply(ctx, config = {}) {
|
|
562
|
-
|
|
579
|
+
loadProjectEnv();
|
|
563
580
|
return ctx.voice.registerProvider({
|
|
564
581
|
id: "local",
|
|
565
582
|
available: () => true,
|
package/package.json
CHANGED
|
@@ -1,19 +1,32 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
2
|
"name": "@flowingspring/dsh-voco",
|
|
3
|
-
"description": "
|
|
4
|
-
"version": "0.2.
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
3
|
+
"description": "Persistent voice conversations for DSH with cloud speech recognition, Edge TTS, and background Agent delegation",
|
|
4
|
+
"version": "0.2.1",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"deepseek-harness",
|
|
7
|
+
"dsh",
|
|
8
|
+
"dsh-plugin",
|
|
9
|
+
"voice",
|
|
10
|
+
"speech-recognition",
|
|
11
|
+
"text-to-speech",
|
|
12
|
+
"agent"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/lgquan/dsh-voco#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/lgquan/dsh-voco/issues"
|
|
12
17
|
},
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/lgquan/dsh-voco.git",
|
|
24
|
+
"directory": "packages/voice-app"
|
|
25
|
+
},
|
|
26
|
+
"type": "module",
|
|
27
|
+
"main": "lib/index.js",
|
|
28
|
+
"types": "lib/types/index.d.ts",
|
|
29
|
+
"exports": {
|
|
17
30
|
".": {
|
|
18
31
|
"types": "./lib/types/index.d.ts",
|
|
19
32
|
"default": "./lib/index.js"
|
|
@@ -32,17 +45,17 @@
|
|
|
32
45
|
"./voice-web": "./lib/plugins/voice-web.js",
|
|
33
46
|
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
34
47
|
"./package.json": "./package.json"
|
|
35
|
-
},
|
|
36
|
-
"files": [
|
|
48
|
+
},
|
|
49
|
+
"files": [
|
|
37
50
|
"lib/index.js",
|
|
38
51
|
"lib/invariant.js",
|
|
39
52
|
"lib/client.js",
|
|
40
53
|
"lib/client.js.map",
|
|
41
54
|
"lib/plugins/*.js",
|
|
42
55
|
"cordis.patch.yml",
|
|
43
|
-
"lib/types/**/*.d.ts"
|
|
44
|
-
],
|
|
45
|
-
"license": "MIT",
|
|
56
|
+
"lib/types/**/*.d.ts"
|
|
57
|
+
],
|
|
58
|
+
"license": "MIT",
|
|
46
59
|
"dsh": {
|
|
47
60
|
"bundle": {
|
|
48
61
|
"patch": "./cordis.patch.yml"
|
|
@@ -105,15 +118,15 @@
|
|
|
105
118
|
"@deepseek-ai/dsh-system-prompt": "^0.1.1-rc.1",
|
|
106
119
|
"@deepseek-ai/dsh-tools": "^0.1.1-rc.1",
|
|
107
120
|
"@deepseek-ai/dsh-workspace": "^0.1.1-rc.1",
|
|
121
|
+
"@flowingspring/dsh-client-ui-voice": "workspace:*",
|
|
122
|
+
"@flowingspring/dsh-llm-tool-call-compat": "workspace:*",
|
|
123
|
+
"@flowingspring/dsh-voice": "workspace:*",
|
|
124
|
+
"@flowingspring/dsh-voice-assistant": "workspace:*",
|
|
125
|
+
"@flowingspring/dsh-voice-local": "workspace:*",
|
|
126
|
+
"@flowingspring/dsh-voice-web": "workspace:*",
|
|
108
127
|
"@types/react": "~18.3.1",
|
|
109
128
|
"@types/ws": "^8.18.1",
|
|
110
129
|
"react": "^18.2.0",
|
|
111
|
-
"react-dom": "^18.2.0"
|
|
112
|
-
"@flowingspring/dsh-client-ui-voice": "0.1.2",
|
|
113
|
-
"@flowingspring/dsh-voice-local": "0.1.0",
|
|
114
|
-
"@flowingspring/dsh-llm-tool-call-compat": "0.1.0",
|
|
115
|
-
"@flowingspring/dsh-voice-web": "0.1.2",
|
|
116
|
-
"@flowingspring/dsh-voice": "0.1.2",
|
|
117
|
-
"@flowingspring/dsh-voice-assistant": "0.1.2"
|
|
130
|
+
"react-dom": "^18.2.0"
|
|
118
131
|
}
|
|
119
|
-
}
|
|
132
|
+
}
|