@bittersmilezzz/dsh-asr-voice 0.4.0 → 0.4.2
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 +2 -2
- package/lib/client.js +33 -4
- package/lib/client.js.map +1 -1
- package/lib/index.js +31 -4
- package/lib/index.js.map +1 -1
- package/lib/settings.js +13 -2
- package/lib/settings.js.map +1 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/settings.d.ts +13 -2
- package/lib/types/settings.d.ts.map +1 -1
- package/package.json +31 -28
package/README.md
CHANGED
|
@@ -105,7 +105,7 @@ dsh plugin --profile <profile> add <本插件路径或 GitHub 仓库>
|
|
|
105
105
|
浏览器端依赖官方 client 包(由 DSH 提供),无需额外安装。
|
|
106
106
|
*The browser side relies on official DSH client packages — nothing extra to install.*
|
|
107
107
|
|
|
108
|
-
## 设置项 Settings(namespace `asr-voice`)
|
|
108
|
+
## 设置项 Settings(namespace `dsh-asr-voice`)
|
|
109
109
|
|
|
110
110
|
| 分组 | 字段 | 默认 | 说明 |
|
|
111
111
|
|---|---|---|---|
|
|
@@ -266,7 +266,7 @@ qwen3-asr-flash-realtime,凭据复用 `DASHSCOPE_API_KEY`),保持默认 `b
|
|
|
266
266
|
| 麦克风 | 高 | 浏览器 `getUserMedia` 需要用户授权;采集只由点击/快捷键发起。整段模式在点击停止或静音判定时结束;**实时对话会持续占用麦克风**,直到你结束会话,或 `realtime.maxSessionMs` 到点自动结束 |
|
|
267
267
|
| 网络 | 中 | 云端 ASR/LLM 时,本机 host 向**你配置的** baseUrl 发起 HTTPS 请求;`realtime.provider = dashscope-realtime` 或 `realtime.tts = cloud` 时另向阿里云百炼发起 WSS(WebSocket)连接 |
|
|
268
268
|
| 音频输出 | 低 | 实时对话把 agent 回复经**系统默认输出设备外放**:`realtime.tts = browser`(默认)走浏览器 `speechSynthesis`,`= cloud` 走云端 TTS 返回的 PCM;两种情况周围人都听得到,且没有单独的音量/静音路由(止声用打断入口) |
|
|
269
|
-
| 设置读写 | 中 | 读写自有 namespace `asr-voice`(**不含密钥**:两个 `apiKey` 字段标了 `role('secret')`,过线即被脱敏) |
|
|
269
|
+
| 设置读写 | 中 | 读写自有 namespace `dsh-asr-voice`(**不含密钥**:两个 `apiKey` 字段标了 `role('secret')`,过线即被脱敏) |
|
|
270
270
|
| 凭据读写 | 中 | 只按**自己派生的引用名**读写:`OPENAI_API_KEY` / `GROQ_API_KEY` / `SILICONFLOW_API_KEY` / `MIMO_API_KEY` / `DASHSCOPE_API_KEY` / `ASR_VOICE_*_API_KEY`。预置引用名与官方 LLM 凭据**同名**(刻意复用,代价是共用同一把 key 与配额)。页面上输入的 key 仅在保存那一次经 connection RPC 送到 host 落库;**已存的值永不回传浏览器**,设置页只看得到「已配置 / 未配置」 |
|
|
271
271
|
| 文件(诊断落盘) | 中 | **默认不落盘**:仅当显式设置 `DSH_ASR_DEBUG_KEEP_WAVS=1`(或 `true`/`yes`)时,才把原始录音写入 `~/.dsh/asr-voice-debug/`(可用 `DSH_ASR_DEBUG_DIR` 重定向,按**文件数 100 + 总字节 200MB** 双约束自动裁剪)用于排查采集/转码问题;未开启时连 `?capture=1` 显式抓取也一律拒绝。不执行命令、不读取其他凭据 |
|
|
272
272
|
|
package/lib/client.js
CHANGED
|
@@ -657,7 +657,7 @@ window.__ModuleLoader__.load({
|
|
|
657
657
|
/* 整条 pointer-events: none,这里必须单独打开,否则 × 点不动。 */
|
|
658
658
|
pointer-events: auto;
|
|
659
659
|
}
|
|
660
|
-
.dshav-hint-dismiss:hover { background: var(--dsw-alias-
|
|
660
|
+
.dshav-hint-dismiss:hover { background: var(--dsw-alias-interactive-bg-hover, rgba(128,128,128,.18)); }
|
|
661
661
|
.dshav-hotkey-hint .dshav-dot {
|
|
662
662
|
flex: none;
|
|
663
663
|
width: 8px;
|
|
@@ -1219,8 +1219,23 @@ window.__ModuleLoader__.load({
|
|
|
1219
1219
|
listeners.delete(fn);
|
|
1220
1220
|
};
|
|
1221
1221
|
}
|
|
1222
|
-
/**
|
|
1223
|
-
|
|
1222
|
+
/**
|
|
1223
|
+
* settings namespace = host 半区 `cordis.patch.yml` 的 entry `id`(DSH 0.1.7 起
|
|
1224
|
+
* `SettingsForms.update/describe` 与 `ConfigForms.get` 都用这个字符串定位 entry,
|
|
1225
|
+
* 官方实现是 `entries().find(row => row.options.id === ns)`)。
|
|
1226
|
+
*
|
|
1227
|
+
* ⚠ 它**不是** npm 包名(本插件 npm 包名是 `@bittersmilezzz/dsh-asr-voice`),也不
|
|
1228
|
+
* 是文件里其它地方的插件短名。拿错字符串不会抛错:host 侧 update 抛
|
|
1229
|
+
* `No configurable plugin entry`(migrateLegacyKeys 只落一句 warn),client 侧
|
|
1230
|
+
* configForms.get 拿到 unavailable 快照 → 设置卡能渲染但**所有读写静默失效**。
|
|
1231
|
+
* 一致性由 test/entry-id-parity.test.mjs 钉住(读 cordis.patch.yml 的 id,并与
|
|
1232
|
+
* host 侧 `src/settings.ts` 的 `ASR_VOICE_SETTINGS_NAMESPACE` 三方比对)。
|
|
1233
|
+
*
|
|
1234
|
+
* 这里刻意**不再 import** host 侧的常量:client bundle 由 tsdown 打包,把
|
|
1235
|
+
* `src/settings.ts`(整棵 schemastery schema)拖进浏览器产物没有意义;用一个字面量
|
|
1236
|
+
* 加一条三方比对测试守住等价性,比共享导入更轻。
|
|
1237
|
+
*/
|
|
1238
|
+
const ASR_VOICE_NS = "dsh-asr-voice";
|
|
1224
1239
|
/** 把旧版凭据通道适配成新版形状(alpha.3 前的老运行时仍暴露旧面时兜底)。 */
|
|
1225
1240
|
function adaptLegacyCredentials(legacy) {
|
|
1226
1241
|
if (legacy === void 0) return void 0;
|
|
@@ -1509,6 +1524,10 @@ window.__ModuleLoader__.load({
|
|
|
1509
1524
|
/** 保存草稿:只把真正改过的顶层段写回 host,然后**读回校验**。
|
|
1510
1525
|
* `SettingsScope.set` 会把失败吞掉并重载宿主状态(promise 成功不代表落盘),所以
|
|
1511
1526
|
* 判定标准只能是写完之后宿主那边到底剩什么——这也正是官方设置卡的做法。
|
|
1527
|
+
*
|
|
1528
|
+
* 两道防线:① `set` 返回 `false` = 宿主拒写/跳过,直接计入失败集合并提前返回段名,
|
|
1529
|
+
* 不等读回——因为拒写时宿主刚触发过一次状态重载,重载值恰好等于草稿时读回会算出
|
|
1530
|
+
* 「零变更」→ 静默报成功;② 读回校验兜住「set 说成功但宿主没留住」这一类。
|
|
1512
1531
|
* @returns 未落盘的段名,undefined 表示全部落定。
|
|
1513
1532
|
*/
|
|
1514
1533
|
async function writeDraft(draft) {
|
|
@@ -1526,7 +1545,17 @@ window.__ModuleLoader__.load({
|
|
|
1526
1545
|
announce();
|
|
1527
1546
|
return;
|
|
1528
1547
|
}
|
|
1529
|
-
|
|
1548
|
+
const refused = [];
|
|
1549
|
+
for (const key of changed) {
|
|
1550
|
+
let accepted = false;
|
|
1551
|
+
try {
|
|
1552
|
+
accepted = await scope.set(key, draft[key]);
|
|
1553
|
+
} catch {
|
|
1554
|
+
accepted = false;
|
|
1555
|
+
}
|
|
1556
|
+
if (!accepted) refused.push(key);
|
|
1557
|
+
}
|
|
1558
|
+
if (refused.length > 0) return refused[0];
|
|
1530
1559
|
mergeHostValue(draft);
|
|
1531
1560
|
announce();
|
|
1532
1561
|
const resolved = scope.getSnapshot().value;
|