@dsh-enhanced/owner-console 0.1.66 → 0.1.67
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 +46 -38
- package/lib/artwork.d.ts +3 -1
- package/lib/artwork.d.ts.map +1 -1
- package/lib/artwork.js +8 -6
- package/lib/artwork.js.map +1 -1
- package/lib/chat-view.d.ts.map +1 -1
- package/lib/chat-view.js +4 -19
- package/lib/chat-view.js.map +1 -1
- package/lib/client.d.ts +6 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +26 -53
- package/lib/client.js.map +1 -1
- package/lib/service.d.ts +5 -4
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +17 -23
- package/lib/service.js.map +1 -1
- package/lib/ui.js +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -43,10 +43,11 @@ Host 侧的 `typert` 与 Web 侧的 `react` 由 DSH 提供。安装后左侧栏
|
|
|
43
43
|
`renderSlot`。子槽按原生 `conversationPhase` 同样的规则计算 `phase`,然后
|
|
44
44
|
`renderFactorySlot('conversation.content', {variant: 'embedded', phase, hero: false}, …)`。
|
|
45
45
|
`hero: false` 关掉工作区选择器和 agent preset 座;面板不会渲染目录清单。
|
|
46
|
-
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
46
|
+
- **语音**:原生对话直接使用 Host composer 自带的语音输入,面板不再重复渲染工具行。
|
|
47
|
+
仅降级窗口(没有 renderer seats 时)显示「语音对话」/「朗读」:前者用浏览器 `SpeechRecognition`
|
|
48
|
+
(`webkitSpeechRecognition` 回退)识别,通过 `conversation.input.for(actx).setDraft()` + `focus()`
|
|
49
|
+
写入**原生 composer 草稿**;后者用浏览器 `SpeechSynthesis`。浏览器没有对应 API 时按钮禁用并在
|
|
50
|
+
tooltip 中说明。语音识别/合成由浏览器(或其服务商)完成,不是 DSH 模型;插件不录音、不保存音频。
|
|
50
51
|
**隐私边界**:常见浏览器会把麦克风音频或待朗读文本发送给浏览器厂商自己的语音服务,
|
|
51
52
|
这段链路不经过 DSH 的权限模型、策略与审计,也不受本插件控制。
|
|
52
53
|
- **权限**:当前值读会话 `permissions` projection,可选目录读
|
|
@@ -104,7 +105,8 @@ secret 明文永不进入配置、日志或本插件。
|
|
|
104
105
|
卡片按实际状态给出下一步,状态由 `bundles[].enabled` 与 `plugins[].fiberPhase` 判定,不再把
|
|
105
106
|
“条目不在 `settings.describe()` 里”一律当成未启用:
|
|
106
107
|
|
|
107
|
-
- 未安装:显示「安装 lark-channel」(走 Host pluginManager 的 pnpm
|
|
108
|
+
- 未安装:显示「安装 lark-channel」(走 Host pluginManager 的 pnpm 安装,会先补装激活所需的
|
|
109
|
+
同伴 bundle `@dsh-enhanced/assistant-delivery`,再装该包及其 pnpm 依赖);
|
|
108
110
|
- 已安装但 bundle 未启用:显示「启用 lark-channel」;
|
|
109
111
|
- 已启用但 fiber 为 pending / failed / 无条目:显示「已启用,等待依赖服务 / 已启用但加载失败 /
|
|
110
112
|
已启用,但 Loader 没有条目」,附 fiber 阶段、诊断、缺少的 companion 服务(及对应要安装的
|
|
@@ -113,7 +115,9 @@ secret 明文永不进入配置、日志或本插件。
|
|
|
113
115
|
- fiber active 且条目有 live 字段:才显示配置表单。
|
|
114
116
|
|
|
115
117
|
安装只包含该包本身及其 pnpm `dependencies`;`peerDependencies` 里的 `@dsh-enhanced/*` bundle 与它
|
|
116
|
-
在 profile 里需要的 Host
|
|
118
|
+
在 profile 里需要的 Host 服务不会由 pnpm 自动装上。`lark-channel` 在激活时静态 import
|
|
119
|
+
`@dsh-enhanced/assistant-delivery`,因此面板的「安装 lark-channel」会先安装这个同伴 bundle;
|
|
120
|
+
其余缺失项仍由上面的状态区列出。
|
|
117
121
|
TraeX 卡片同理(安装/启用 traex-acp-provider)。
|
|
118
122
|
|
|
119
123
|
只有声明了 `.volatile()` 的配置字段才能这样实时改写:`lark-channel` 暴露
|
|
@@ -134,10 +138,11 @@ enabled/command。没有 live 字段的条目不会出现在面板里。
|
|
|
134
138
|
(与 `dsh plugin` 相同的 pnpm 路径),会一并安装该包声明的依赖并默认激活;本地路径和 git 地址
|
|
135
139
|
不在此面板处理,避免面板成为任意代码源入口。安装/启用后如返回 `restart-required`,按提示重启 profile。
|
|
136
140
|
- **依赖构建脚本**:pnpm 可能拒绝依赖的构建脚本(`ERR_PNPM_IGNORED_BUILDS`)。Host 记录到
|
|
137
|
-
`pendingBuilds`
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
+
`pendingBuilds` 时,面板会先让主人确认,再用这些精确名称重试。当前 Host 的 ANSI 解析缺陷会丢掉
|
|
142
|
+
依赖名、使 `pendingBuilds` 为空,因此面板也支持从失败输出中读出依赖名交给主人确认;确认后不再
|
|
143
|
+
依赖 Host 的 `approveBuilds`(它可能返回 `stale-approval`):面板先把确认过的名称写入当前 profile
|
|
144
|
+
的 `pnpm-workspace.yaml`(`allowBuilds: <name>: true`,原子写入、0600),再不带审批参数重试一次,
|
|
145
|
+
所以一键安装不再需要人工改 `allowBuilds`。不会自动放行,也不会写入未确认的名称。
|
|
141
146
|
- **不兼容版本**:Host 以 `incompatible-version` 拒绝时,面板列出被拒的 `包@版本`、缺失的 DSH peer
|
|
142
147
|
要求与当前 DSH 版本,并提示更新插件或为这个精确版本授予兼容豁免后重试。
|
|
143
148
|
- **高级**:对声明了 live 字段的条目仍可合并一段 JSON 配置(≤16 KiB),不重置其它字段。
|
|
@@ -179,7 +184,8 @@ intake 吻合度卡片只读:两个输入框只决定查询哪个 Evaluation
|
|
|
179
184
|
- 本插件自身不直接读写文件、不直接联网、不直接起子进程、不读取凭据;需要落盘的动作都委托给
|
|
180
185
|
Host 的 `settings`(配置)与 `pluginManager`(bundle/条目管理与 pnpm 安装),由后者执行。
|
|
181
186
|
- 安装动作因此会经由 Host 启动 pnpm 并访问 registry(与 `dsh plugin` 相同);只在主人点击时发生。
|
|
182
|
-
依赖构建脚本只有在主人于面板再次确认后、且仅针对 Host 记入 `pendingBuilds`
|
|
187
|
+
依赖构建脚本只有在主人于面板再次确认后、且仅针对 Host 记入 `pendingBuilds` 或安装输出中读到的
|
|
188
|
+
精确名称才被批准;确认写入 profile 的 `allowBuilds` 后由服务端重试,不经模型。
|
|
183
189
|
- 配置写入只经 Host `settings.mutate`,且限定到单个已安装条目;bundle/entry 管理只经 Host
|
|
184
190
|
`pluginManager` 且限定 `@dsh-enhanced/*`;授权来源是主人自己在面板上的点击,不是模型工具调用,
|
|
185
191
|
也不存在后台自动写配置。
|
|
@@ -187,8 +193,9 @@ intake 吻合度卡片只读:两个输入框只决定查询哪个 Evaluation
|
|
|
187
193
|
projection,用来显示状态、降级文本和朗读;不读取其它会话、报告或记忆,也不上报内容。
|
|
188
194
|
client bundle 只依赖宿主提供的 `react`(以及 `react/jsx-runtime`)与 Host 注入的客户端服务,
|
|
189
195
|
不 import 其它 DSH 组件包;原生正文由 renderer 的 factory seat 渲染。
|
|
190
|
-
-
|
|
191
|
-
|
|
196
|
+
- 降级窗口的语音识别/合成由浏览器完成,音频或文本可能发送给浏览器厂商的语音服务(不经过 DSH
|
|
197
|
+
权限模型与审计);插件不录音、不保存音频,只把最终转写写进当前会话的原生草稿。原生对话不渲染
|
|
198
|
+
这些控件,语音入口直接来自 Host composer。
|
|
192
199
|
- 安装/移除仅由主人点击触发,走 DSH 官方安装路径;移除只对 Host 标记为 `removable` 且非本面板自身的
|
|
193
200
|
bundle 显示,并需浏览器确认(无确认通道时给出可见提示并停止);不改动未列出的条目;
|
|
194
201
|
secret 明文不接受、不存储、不回显。
|
|
@@ -201,34 +208,34 @@ session-scoped 子槽三个注册与释放;并断言侧栏标签为「文鳐
|
|
|
201
208
|
内联 4 个 webp、包含原生对话与设置标记且不含外部图片 URL。因此该测试依赖先运行
|
|
202
209
|
`pnpm --dir plugins/owner-console build`(根检查与 `pnpm check` 均先构建)。
|
|
203
210
|
`tests/chat-dom.spec.ts` 在 jsdom 中真实挂载 React DOM,覆盖:降级消息列表与 composer 发送
|
|
204
|
-
(`SessionFace.prompt`)、附件上传 receipt
|
|
205
|
-
|
|
206
|
-
`SessionProvider`/子槽渲染、原生 phase
|
|
207
|
-
|
|
211
|
+
(`SessionFace.prompt`)、附件上传 receipt、上传服务缺失时的可见限制、降级窗口语音不可用禁用/
|
|
212
|
+
tooltip、可用时浏览器识别写入草稿、权限投影与 `/permission` 切换、renderer seat 下的原生
|
|
213
|
+
`SessionProvider`/子槽渲染、原生 phase 计算、原生对话不再重复渲染语音工具行、齿轮打开设置页并
|
|
214
|
+
保留全部卡片、返回对话。`tests/chat.spec.ts` 覆盖事件折叠、工具状态、会话创建/复用/过期、上传失败、权限标签等
|
|
208
215
|
纯函数。`jsdom` / `react-dom` / `@types/react-dom` 只作为测试 devDependencies,不进入客户端产物。
|
|
209
216
|
`tests/client-render.spec.ts` 不依赖 DOM,桩掉 React hooks 后展开设置页元素树,断言页头品牌、
|
|
210
|
-
|
|
217
|
+
02 水墨化鹏主视觉/面板背景/印章/侧栏图标均为纯装饰(`alt=""` + `aria-hidden`)、状态胶囊带文字
|
|
211
218
|
标签与空状态文案。
|
|
212
219
|
|
|
213
220
|
## 界面布局
|
|
214
221
|
|
|
215
|
-
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
222
|
+
- **对话窗口**:紧凑页头(圆形化鹏标、标题「文鳐 Ray」、状态胶囊、副标题、右上角「原生会话」与 ⚙),
|
|
223
|
+
正文和 composer 由 DSH 原生会话骨架占满剩余高度。原生 composer 自带发送、附件、语音输入、
|
|
224
|
+
权限 chip、模型选择与停止,宽屏居中、窄屏自适应;面板不重复渲染语音/朗读工具行。降级窗口才有
|
|
225
|
+
自己的消息列表、composer 与语音工具行。
|
|
226
|
+
- **设置页**:顶部「← 返回对话」+「设置」;下面是 02 水墨化鹏宽幅主视觉 banner(webp
|
|
227
|
+
data URI,纯装饰 `alt=""`)、标题与圆形化鹏印章、副标题,以及「开始对话 / 打开插件页」;再往下是
|
|
220
228
|
配置卡片。
|
|
221
|
-
-
|
|
229
|
+
- 两个视图共用同一套背景:02 水墨化鹏宽幅图以低透明度铺在面板表面、内容之下,文字仍落在主题卡片/原生
|
|
222
230
|
会话表面上,明暗主题的对比度不变。
|
|
223
|
-
- 侧栏入口图标与设置页印章都来自
|
|
231
|
+
- 侧栏入口图标与设置页印章都来自 02 水墨化鹏 `icon.png`(方形裁切鱼跃化鹏纹样,可作圆形头像裁切)。
|
|
224
232
|
- 卡片:统一圆角与边框,标题前一枚小云纹;状态用「圆点 + 文字」胶囊(ok/warn/error),不只靠颜色。
|
|
225
233
|
- 颜色只取宿主 `--dsw-*` 变量并带回退值,明暗主题通用;不引入外部 CSS、字体或网络资源。
|
|
226
234
|
装饰 SVG 见 `src/art.ts`。
|
|
227
235
|
|
|
228
236
|
### 主视觉与图标资产
|
|
229
237
|
|
|
230
|
-
源图 `
|
|
231
|
-
1240250 bytes)不入库;只提交 `assets/` 下压缩后的派生文件(合计约 88 KB)与内联结果
|
|
238
|
+
源图 `02_水墨化鹏_副本/background.png`(1672×941)与 `icon.png`(1254×1254)不入库;只提交 `assets/` 下压缩后的派生文件(hero 1254×706、backdrop 960×540、icon 128/256,合计约 53 KB)与内联结果
|
|
232
239
|
`src/artwork.ts`,因此 `lib/client.js` 仍然自包含。构建本身不重写 `src/`;`tests/artwork.spec.ts`
|
|
233
240
|
校验已提交的 `src/artwork.ts` 与 `assets/` 逐字节一致,资产重新压缩后忘记刷新会直接测试失败。
|
|
234
241
|
`assets/` 不随 npm 包发布,也不需要发布:数据已内联在 `lib/` 中。
|
|
@@ -236,7 +243,7 @@ session-scoped 子槽三个注册与释放;并断言侧栏标签为「文鳐
|
|
|
236
243
|
重新生成派生资产(仅当源图变化时;需要 Python + Pillow):
|
|
237
244
|
|
|
238
245
|
```sh
|
|
239
|
-
python3 plugins/owner-console/scripts/prepare-assets.py /path/to/
|
|
246
|
+
python3 plugins/owner-console/scripts/prepare-assets.py /path/to/02_水墨化鹏_副本
|
|
240
247
|
```
|
|
241
248
|
|
|
242
249
|
派生资产变化后,用已提交的 `assets/` 重新生成 `src/artwork.ts`(幂等、无需源图)并提交:
|
|
@@ -254,7 +261,8 @@ pnpm --dir plugins/owner-console build:assets
|
|
|
254
261
|
session-scoped 子槽;本插件据此复用 `conversation.content`。如果某个嵌入没有这些 seats,
|
|
255
262
|
或 Host 没有注册 `conversation.content` 工厂,面板退回自包含的降级窗口(文本消息 + composer),
|
|
256
263
|
不会假装渲染原生组件。2026-11-06 在临时 profile + pinned DSH `0.2.1-rc.2` 的真实 `dsh web`
|
|
257
|
-
中已确认原生正文、composer、附件按钮、权限 chip
|
|
264
|
+
中已确认原生正文、composer、附件按钮、权限 chip 与模型选择都在面板内;语音输入由 Host
|
|
265
|
+
composer 提供,面板自身不再重复渲染工具行(证据
|
|
258
266
|
`docs/evidence/owner-console/wenyao-chat-20261106/`)。
|
|
259
267
|
- **没有真实模型/API Key,未完成一次真实发送**:隔离 profile 未登录、未配置模型,原生 composer
|
|
260
268
|
显示「请选择模型」;因此只验证了 composer 的 DOM/按钮/草稿写入,没有验证真实模型回合并。
|
|
@@ -266,14 +274,14 @@ pnpm --dir plugins/owner-console build:assets
|
|
|
266
274
|
- **不显示目录**:面板不渲染工作区、文件目录或会话列表;`hero: false` 关掉原生工作区选择器。
|
|
267
275
|
切换会话/工作区要用左侧栏或「原生会话」。如果默认工作区不可用,会话退回 Host 默认 cwd 的
|
|
268
276
|
ungrouped 会话,原生视图可能要求选择工作区。
|
|
269
|
-
-
|
|
270
|
-
`SpeechSynthesis`;不可用时按钮禁用并在 tooltip
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
+
- **语音是浏览器能力(仅降级窗口)**:面板自己的「语音对话」/「朗读」分别依赖浏览器
|
|
278
|
+
`SpeechRecognition` / `SpeechSynthesis`;不可用时按钮禁用并在 tooltip 说明。识别/合成由浏览器
|
|
279
|
+
(及其可能的服务商)完成,不是 DSH 模型;插件不录音、不保存音频。**常见浏览器会把音频或待朗读
|
|
280
|
+
文本发给浏览器厂商的语音服务,这段链路不经过 DSH 的权限模型与审计**;真实麦克风与真人语音未
|
|
281
|
+
验收;jsdom 用桩覆盖降级与草稿写入。原生对话的语音入口归 Host composer,插件不渲染、不拦截。
|
|
282
|
+
- **降级窗口语音写入原生草稿会替换/追加纯文本**:通过 `conversation.input.for(actx).setDraft()`
|
|
283
|
+
写入;当前已有引用 chip 时,`setDraft` 会把草稿变为纯文本(浏览器语音的固有边界)。原生输入
|
|
284
|
+
服务缺失时按钮仍可点,但会显示可见失败,不会静默。
|
|
277
285
|
- **权限选项来自 Host**:原生权限 chip 需要 `ui-permission-presets`;没有它时本插件显示自己的
|
|
278
286
|
权限行。可选 preset 目录由 Host `permissionPresets.catalog()` 决定;隔离 profile 中目录只返回
|
|
279
287
|
一个可用 preset。切换只走 `/permission <preset>`,没有直接写会话权限的客户端 API;高风险
|
|
@@ -297,7 +305,7 @@ pnpm --dir plugins/owner-console build:assets
|
|
|
297
305
|
五张卡片渲染、返回对话正常。live Harness Mac app 为 `0.2.2-rc.1`:owner-console `0.1.66`
|
|
298
306
|
起 peer 采用已验证的 0.2 线范围(`>=0.2.1-rc.2 <0.3.0`),不再需要 owner 豁免即可安装;
|
|
299
307
|
同日在 live `desktop` profile 复验了侧栏「文鳐」入口、对话面板、原生正文与 composer、
|
|
300
|
-
|
|
308
|
+
⚙ 设置入口(证据 `docs/evidence/owner-console/mac-live-app-20261106/`)。
|
|
301
309
|
- **未在真实 GUI 中复验的部分**:飞书/TraeX 的“已安装未启用→启用”“活动→配置”两态此前是用 patch
|
|
302
310
|
覆盖伪造的状态,安装按钮也从未在真实 GUI 点击过;状态文案、安装拒绝与修复提示由单元测试覆盖。
|
|
303
311
|
登录态、模型连接与真实飞书 Bot 仍未验收。
|
package/lib/artwork.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generated by `node scripts/build-assets.mjs` from the committed files under `assets/`.
|
|
3
|
-
* Do not edit by hand; do not commit the multi-MB
|
|
3
|
+
* Do not edit by hand; do not commit the multi-MB 02 水墨化鹏 originals. The images are
|
|
4
4
|
* inlined so the emitted Web client bundle needs no network or bundler asset loading.
|
|
5
5
|
* Decorative only: every consumer renders them with `alt=""` + `aria-hidden`.
|
|
6
6
|
*/
|
|
7
7
|
export declare const WENYAO_HERO_WIDTH: number;
|
|
8
8
|
export declare const WENYAO_HERO_HEIGHT: number;
|
|
9
|
+
export declare const WENYAO_BACKDROP_WIDTH: number;
|
|
10
|
+
export declare const WENYAO_BACKDROP_HEIGHT: number;
|
|
9
11
|
export declare const WENYAO_HERO_DATA_URI: string;
|
|
10
12
|
export declare const WENYAO_BACKDROP_DATA_URI: string;
|
|
11
13
|
export declare const WENYAO_ICON_DATA_URI: string;
|
package/lib/artwork.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artwork.d.ts","sourceRoot":"","sources":["../src/artwork.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAa,CAAA;AAC7C,eAAO,MAAM,kBAAkB,EAAE,MAAY,CAAA;AAC7C,eAAO,MAAM,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"artwork.d.ts","sourceRoot":"","sources":["../src/artwork.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAa,CAAA;AAC7C,eAAO,MAAM,kBAAkB,EAAE,MAAY,CAAA;AAC7C,eAAO,MAAM,qBAAqB,EAAE,MAAY,CAAA;AAChD,eAAO,MAAM,sBAAsB,EAAE,MAAY,CAAA;AACjD,eAAO,MAAM,oBAAoB,EAAE,MACwtkC,CAAA;AAC3vkC,eAAO,MAAM,wBAAwB,EAAE,MACggqB,CAAA;AACviqB,eAAO,MAAM,oBAAoB,EAAE,MACwnI,CAAA;AAC3pI,eAAO,MAAM,oBAAoB,EAAE,MAC4wU,CAAA"}
|