dsh-plugin-update 0.5.7 → 0.6.0
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/CHANGELOG.md +17 -4
- package/README.md +29 -10
- package/dist/bilingual.d.ts +23 -13
- package/dist/bilingual.js +324 -10
- package/dist/changelog.d.ts +19 -13
- package/dist/changelog.js +60 -22
- package/dist/diag.d.ts +3 -0
- package/dist/diag.js +32 -20
- package/dist/entry-batch.d.ts +22 -5
- package/dist/entry-batch.js +86 -19
- package/dist/entry.d.ts +37 -9
- package/dist/entry.js +105 -51
- package/dist/host-batch.js +104 -13
- package/dist/http.d.ts +2 -2
- package/dist/http.js +1 -1
- package/dist/lang.js +150 -0
- package/dist/panel-batch.d.ts +50 -9
- package/dist/panel-batch.js +484 -150
- package/dist/panel.d.ts +37 -22
- package/dist/panel.js +504 -362
- package/dist/store.d.ts +42 -0
- package/dist/store.js +139 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
格式为 Keep-a-Changelog 子集:`Added/Fixed/Changed` 必写,`Deprecated/Removed/Security` 有则透传,`Unreleased` 面板忽略,禁止 git-log 直倒。面板缺日志时中性提示,不挡安装。
|
|
4
4
|
|
|
5
|
+
## [0.6.0] - 2026-10-06
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- 主题 token 全系更名(breaking):`--d5-*` 18 个全系删除,`--dsh-upd-*` 展开为 `--dsh-update-*`;补全状态字色/次级字/强边线/深主色/字体/阴影/圆角 token,两主题共用同一张词典,主题只换值;卷宗横幅边框改吃 `*-border`(值与旧字色相等,零视觉差);默认主题按钮边框吃 `border-strong`、卡片与按钮圆角及字体栈走变量(值与旧硬编码相等)。
|
|
9
|
+
|
|
10
|
+
### Removed
|
|
11
|
+
- 主题取值 `'d5-paper'` 删除,仅剩 `'default' | 'archive'`(非法即抛);常量 `UPDATE_PANEL_D5_CSS / UPDATE_BATCH_PANEL_D5_CSS` 更名为 `UPDATE_PANEL_ARCHIVE_CSS / UPDATE_BATCH_PANEL_ARCHIVE_CSS`;手写旧变量覆盖须迁移到新词典;`demo/d5-progress.*` 更名为 `demo/archive-progress.*`,`tests/panel-d5-theme.test.mjs` 更名为 `tests/panel-archive-theme.test.mjs`。
|
|
12
|
+
|
|
13
|
+
## [0.5.8] - 2026-10-06
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- 语言底座 v2 按宿主语言单语渲染,入口两条链先生效(#60,地图 #51):新增 `src/lang.ts` 信号层(显式 `locale` > `document.documentElement.lang` > `navigator.languages` > 中文兜底,非中文落英文;单例 `MutationObserver` + 服务订阅,切换即时重绘,`unmount` 停订,无 DOM 落中文);`bilingual.ts` 新增 `copyHTML/copyText(key, lang, values)` 单语纯函数出口(一次一种语言,单 `span[lang]`),旧 `bilingualHTML/Text` 转为按当前语言包装,字典新增 `batch-entry.*` 6 键(13 键全 `draft`);`entry/entry-batch` 新增 `locale` 选项全走字典单语块(含聚合口径与 `已是最新` 小字);`panel/panel-batch` 仅加 `locale` 占位暂不消费(#61-#66 按面迁移);双语门禁改断言单语(缺语言/混语言即红,冻结词元除外);`build.mjs` 加 `lang.ts` 单元;README 补单语与窗口期说明。
|
|
17
|
+
|
|
5
18
|
## [0.5.7] - 2026-10-06
|
|
6
19
|
|
|
7
20
|
### Fixed
|
|
@@ -18,7 +31,7 @@
|
|
|
18
31
|
## [0.5.5] - 2026-10-06
|
|
19
32
|
|
|
20
33
|
### Added
|
|
21
|
-
- 档案卷主题收敛 archive 与面板紧凑化:运行时 data-theme 统一为 archive
|
|
34
|
+
- 档案卷主题收敛 archive 与面板紧凑化:运行时 data-theme 统一为 archive,entry/entry-batch/panel-batch 输出与 CSS 选择器同步,panel-batch setTheme 补 archive 并归一存储;根/卷头/横幅/版本条/章节/章头/队列行/footer 间距收紧;删 changelog-wrap 与章节线重影内边框;页脚去技术词,批量关闭 title 同步。
|
|
22
35
|
- 双语底座 #54(先行):bilingual 字典模块、entry key 映射链、noteVersion 运行时值;research/52-inventory 双语盘点与原型矩阵随附。
|
|
23
36
|
|
|
24
37
|
### Fixed
|
|
@@ -34,7 +47,7 @@
|
|
|
34
47
|
|
|
35
48
|
### Added
|
|
36
49
|
- 进入面板自动查一次新版(#46 结论固化 #48):首绘 loading 后先只读本地刷新,拿到活体快照后条件自动查一次;轮询心跳永远只读本地、不触发查新版;抑制谓词 `pendingAutoCheck` 为纯函数,仅快照任务态 installing/verifying 或已有查/装在途时不发起,同范围忙/凭证过期/各类阻拦一律不抑制,无活体快照不发起;复用手动查同一通路与“正在查新版…”提示;并发只信服务端真相源(面板 busyAct 互斥 + checking 在途复用 + 2s 复用窗口),卸载靠 mounted 丢弃;失败无退避,只渲染既有失败文案与复制诊断,手动查清日志退避、关闭重开立即重问;embedded/dialog 一致;pollMs 不影响时机;四电话形状与快照六字段零变更。
|
|
37
|
-
- 关闭按钮住右下角独立 footer 区(#47 定案 A):第一章 actions 不再画 close-view,内核末尾 05 章之后新增 `.dsh-upd-footer`(dialog + 非只读渲染才有),按钮原 title/data-action 原样搬入;embedded 无面板自带关闭(宿主框架自带关);默认 +
|
|
50
|
+
- 关闭按钮住右下角独立 footer 区(#47 定案 A):第一章 actions 不再画 close-view,内核末尾 05 章之后新增 `.dsh-upd-footer`(dialog + 非只读渲染才有),按钮原 title/data-action 原样搬入;embedded 无面板自带关闭(宿主框架自带关);默认 + 档案卷只换肤、DOM 同序;act/Esc/onCloseRequested 语义一字未动。
|
|
38
51
|
|
|
39
52
|
### Changed
|
|
40
53
|
- 入口件 direct 断言收紧:区分入口自身空参预查与面板挂载带 includeQueue 自查(面板挂载即自查归面板)。
|
|
@@ -63,7 +76,7 @@
|
|
|
63
76
|
## [0.5.0] - 2026-10-05
|
|
64
77
|
|
|
65
78
|
### Added
|
|
66
|
-
- 主题首选名 `archive`(档案卷纸面浅色):`
|
|
79
|
+
- 主题首选名 `archive`(档案卷纸面浅色):`archive` 为唯一的档案卷取值;入口件与批量面板同一套取值。
|
|
67
80
|
- 弹窗关闭落地 `onCloseRequested`:dialog 下点「关闭」/按 Esc 先交调用方撤 DOM 再停轮询;入口件打开的 dialog 已内置(收 dialog + 还原按钮 + 重查一次)。
|
|
68
81
|
|
|
69
82
|
### Fixed
|
|
@@ -100,7 +113,7 @@
|
|
|
100
113
|
- 现成整组件:`dsh-plugin-update/panel`(内嵌/弹窗一键切换,轮询/门控/中文一句话/待重启横幅/手工复制/排队开关/跳过/诊断复制全内置),完整类型定义随包分发,零运行依赖。
|
|
101
114
|
- 脱敏规则表:五条具名规则(绝对路径/URL 账号密码/令牌前缀/密码键值对/邮箱),顺序固定,两占位符 `<路径>`/`<脱敏>`,复制前收敛。
|
|
102
115
|
- 后台安装不中断:关面板不中断,重开读盘 1 秒内恢复,仅进程关判中断。
|
|
103
|
-
-
|
|
116
|
+
- 档案卷可选主题:`theme: 'archive'`(`mountUpdatePanel` + `setTheme`,默认不动),迷你印章 + profile 牌 + 待重启衬线横幅 + 手绘 SVG 标 + 窄屏印章固定 + 省略号逐字折叠 + 浅深双主题,DOM 冻结、复制诊断常在。
|
|
104
117
|
|
|
105
118
|
### Fixed
|
|
106
119
|
- **死按钮根治**:批量面板的详情曾把单插件内核 markup 原样搬入而不接管行为,里面 5 颗按钮可点却无反应。现在详情的内核走**只读渲染**(`actions:'none'`,连队列章的 `toggle-queue` 一起摘),动作行由批量面板自己提供(与行内同一 `act` 通道、同一忙守卫)。
|
package/README.md
CHANGED
|
@@ -142,7 +142,7 @@ mountUpdatePanel(slot, { pluginId: 'my-notes-plugin', prefix: 'notes', call: hos
|
|
|
142
142
|
|
|
143
143
|
面板画成档案五章:**01 检查与安装、02 更新日志、03 更新队列、04 错误信息、05 手工命令**(五章恒在,缺内容给中性提示,不跳号)。档案头一行是「插件名 + 使用范围 + `profile` 牌」:使用范围由面板自动向宿主索取(电话入参 `includeEnv`,宿主只回**范围名与宿主种类**、不回任何路径),显示的就是更新要落到的那个 profile——`web` 与 `desktop` 各装一份,装错范围是严重故障,所以这一栏宁可显示“未知”也不猜。调用方知道得更准时可以用 `profileName` 显式覆盖。
|
|
144
144
|
|
|
145
|
-
可选档案卷主题(纸面浅色案卷风,不替换默认):挂载时加 `theme: 'archive'` 即换肤(右上大印章「待查/可装/安装中/待重启/受阻/已最新」+ 横幅小印章一字 + profile 牌 + 待重启衬线横幅配手绘 SVG 标 + 窄屏印章固定 + 省略号逐字折叠 + 浅深双主题跟随系统),内核 DOM 顺序不动、复制诊断常在;不传即最小可用默认深色样式。运行时用 `panel.setTheme('archive' | 'default')` 可切。旧值 `theme: '
|
|
145
|
+
可选档案卷主题(纸面浅色案卷风,不替换默认):挂载时加 `theme: 'archive'` 即换肤(右上大印章「待查/可装/安装中/待重启/受阻/已最新」+ 横幅小印章一字 + profile 牌 + 待重启衬线横幅配手绘 SVG 标 + 窄屏印章固定 + 省略号逐字折叠 + 浅深双主题跟随系统),内核 DOM 顺序不动、复制诊断常在;不传即最小可用默认深色样式。运行时用 `panel.setTheme('archive' | 'default')` 可切。旧值 `theme: 'archive'` 仍可用(同一套渲染)。入口件与批量面板是同一个 `theme` 参数,取值同一套。
|
|
146
146
|
|
|
147
147
|
类型定义随包分发(`dsh-plugin-update/panel` 的 `.d.ts`),不用自编译;面板离线可读,与包版本绑定。
|
|
148
148
|
|
|
@@ -183,10 +183,22 @@ const entry = mountUpdateEntry(document.getElementById('upd-entry'), {
|
|
|
183
183
|
| 什么时候查 | `mount` / `never` | `mount` | 进页面静默查一次(**只调 `.updateStatus`,只读**);`never` 则只在点击时查 |
|
|
184
184
|
| 点了做什么 | `has-update` / `always` / `manual` / `direct` | `has-update` | 有新版才开面板;检查完总是开;交给 `onActivate` 自己跳;点开即弹窗、不预查 |
|
|
185
185
|
|
|
186
|
-
|
|
186
|
+
按钮文案随状态自己变(按宿主语言单语渲染:中文界面纯中文、英文界面纯英文,一次只出现一种语言):`检查更新` / `有新版 1.1.0` / `正在安装…` / `待重启` / `更新失败,点此查看`(英文见集中字典同 key)。
|
|
187
|
+
|
|
188
|
+
语言跟随(单语):入口件默认跟随 `document.documentElement.lang` > `navigator.languages` > 中文兜底;显式覆盖传 `locale: 'zh' | 'en' | { getActive(): string; subscribe?(cb): () => void }`(对象形态可接宿主语言服务,切换即时重绘,`unmount` 后停订;无 DOM 环境不抛,落中文)。
|
|
187
189
|
|
|
188
190
|
无新版时原地那句小字(`已是最新 X.Y.Z`)只在 `has-update` 下出现:不想看它就用 `openOn: 'always'`(检查完总是开弹窗,无新版在弹窗里看“已是最新”)或 `openOn: 'direct'`(点开即弹窗,连预查都省了,面板挂载即自查;徽标形态仍走回调口径)。
|
|
189
191
|
|
|
192
|
+
按钮尺寸(跟头行其他控件同高/整体缩放):传 `sizing` 只改按钮本体,不碰面板;不传即默认外观。`scale` 是整体缩放(默认 `1`,如 `1.2` 放大、`0.9` 缩小),原来写在容器上的 `zoom` 可整体搬进来:
|
|
193
|
+
|
|
194
|
+
```js
|
|
195
|
+
mountUpdateEntry(el, { pluginId: 'p', prefix: 'notes', call,
|
|
196
|
+
sizing: { fontSize: '12px', padding: '2px 8px', borderRadius: '8px', scale: 1 },
|
|
197
|
+
})
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
等价的手写 CSS 变量(与现有 `--dsh-update-*` 颜色变量同口径,写在容器或祖先元素上即可):`--dsh-update-entry-font-size`(默认 `13px`)、`--dsh-update-entry-padding`(默认 `4px 12px`)、`--dsh-update-entry-border-radius`(默认 `6px`,`archive` 主题下 `3px`)、`--dsh-update-entry-scale`(默认 `1`)。`badge` 圆点与 `inline` 内嵌不受影响。一点约束:`sizing` 与手写变量都不接 `!important`(变量本身已赢特异性);确需 `!important` 请手写 CSS 覆盖。
|
|
201
|
+
|
|
190
202
|
**一条铁律:检查是只读、安装是写入,两者不许合并成一个动作。** 入口件永远只做「查 + 打开面板」,
|
|
191
203
|
任何路径都不自动安装;用户必须在面板里明确点「安装」。想让点击交给自己(例如你已有自己的更新页):
|
|
192
204
|
|
|
@@ -212,10 +224,12 @@ const entry = mountUpdateBatchEntry(document.getElementById('upd-entry'), {
|
|
|
212
224
|
```
|
|
213
225
|
|
|
214
226
|
聚合口径与批量面板总账同一份数法(含「忙失败占位翻回可更新」):`忙 > 失败 > 待重启 > 可更新 > 待查`,
|
|
215
|
-
|
|
227
|
+
文案按宿主语言单语渲染(中文如左,英文见字典 `batch-entry.*` 同 key),`locale` 选项与单入口同形态,切换即时重绘。
|
|
216
228
|
三自由度与单入口同取值,缺省不同:`openOn` 缺省 `'always'`(查完总是开批量面板;`has-update` 下有事才开,否则原地给总账一句)。
|
|
217
229
|
`autoCheck` 缺省 `'mount'`(只调 `.batchStatus`,只读);铁律同单入口:任何路径都不自动安装。
|
|
218
230
|
|
|
231
|
+
窗口期说明(必读):`mountUpdatePanel` 与 `mountUpdateBatchPanel` 已接受 `locale` 选项(与入口件同形态),但本版本暂不消费——传了不生效,面板内容仍按既有中文渲染;语言跟随的按面迁移在后续版本逐面落地,入口件两条链已先生效。
|
|
232
|
+
|
|
219
233
|
### 第 2.6 节:多目标批量更新(一个插件管 N 个插件的更新)
|
|
220
234
|
|
|
221
235
|
一个插件替自己**和另外几个插件**管更新时,别把 N 个面板并排——用户在那块界面上只问三件事:
|
|
@@ -239,16 +253,18 @@ const multi = createMultiHostUpdate({ ctx, logCtx }, {
|
|
|
239
253
|
for (const [name, handler] of Object.entries(multi.handlers)) registry.set(name, handler)
|
|
240
254
|
```
|
|
241
255
|
|
|
242
|
-
|
|
256
|
+
七个批量电话(`<prefix>` 即上面的 `life`,同时是账本属主身份):`batchStatus` / `batchCheck` / `batchInstall` / `batchResume` / `batchCancel` / `batchPrefs` / `batchPrefsSave`;
|
|
243
257
|
每个目标的四个单插件电话照旧以**各自前缀**暴露(`ilife-bill.updateStatus` 等)。
|
|
244
258
|
|
|
245
|
-
|
|
259
|
+
回包形状(成功六项,失败只有三项):
|
|
246
260
|
|
|
247
261
|
```js
|
|
248
|
-
{ ok: true, session, rows, progress }
|
|
262
|
+
{ ok: true, session, rows, progress, inventory, prefs } // rows 一行一家:key/title/phase/targetVersion/restartRequired/error/snapshot
|
|
249
263
|
{ ok: false, error, errorKind } // 跨使用范围混目标会回 cross-scope,不抢锁、不写盘
|
|
250
264
|
```
|
|
251
265
|
|
|
266
|
+
`batchResume` 无事可续时回 `resumed: false`(面板不再报空话成功);`batchPrefsSave` 只收布尔 `checkOnOpen`。
|
|
267
|
+
|
|
252
268
|
面板侧:
|
|
253
269
|
|
|
254
270
|
```js
|
|
@@ -257,12 +273,12 @@ import { mountUpdateBatchPanel } from 'dsh-plugin-update/panel-batch'
|
|
|
257
273
|
const panel = mountUpdateBatchPanel(el, {
|
|
258
274
|
prefix: 'life',
|
|
259
275
|
call: (name, args) => host.call(name, args),
|
|
260
|
-
theme: 'archive', // 与单插件面板同一套皮肤(archive =
|
|
276
|
+
theme: 'archive', // 与单插件面板同一套皮肤(archive = 档案卷)
|
|
261
277
|
})
|
|
262
278
|
```
|
|
263
279
|
// 弹窗版与单面板同口径:传 `onCloseRequested`(点关闭/Esc 时先调它撤 DOM,再停轮询;入口件打开的 dialog 已内置;不传即只停轮询)。
|
|
264
280
|
|
|
265
|
-
批量面板 HTTP 版(无 `host.call`
|
|
281
|
+
批量面板 HTTP 版(无 `host.call` 环境即跑:同一传输内核,七电话走同一映射,取消走 `batchCancel`):
|
|
266
282
|
|
|
267
283
|
```js
|
|
268
284
|
import { mountUpdateBatchPanelHttp } from 'dsh-plugin-update/http'
|
|
@@ -289,10 +305,13 @@ mountUpdateBatchPanelHttp(document.querySelector('#batch'), {
|
|
|
289
305
|
> 自己写渲染时同理:`renderUpdatePanelHTML(input)` 少传 `actions` 即默认(画动作行);
|
|
290
306
|
> 传 `actions: 'none'` 就是只读内容——**凡是要复用内核 HTML 的地方,都必须显式接管或摘掉它的动作面**。
|
|
291
307
|
|
|
292
|
-
|
|
293
|
-
`<家目录>/update-queue
|
|
308
|
+
**耐久(这是这套东西存在的理由)**:批量会话按属主落在
|
|
309
|
+
`<家目录>/update-queue/<使用范围短指纹>/<批量前缀>/batch.json`,每一步都写盘;检查知识(只做展示)落同目录 `inventory.json`,面板偏好落 `prefs.json`。所以关面板、重载页面、
|
|
294
310
|
甚至进程重启都不怕——`batchResume` 读回来接着推:**已完成的不重装**(编号恒等、幂等),
|
|
295
311
|
没做完的重新查一次再装。这就是「更新自己时 UI 消失、剩下几家永不启动」那个病的正解。
|
|
312
|
+
面板打开即按偏好自动查一轮(缺省开,底部可关;60 秒节流 + 在途抑制,入口预查与面板开查一击只查一次),有没做完的一轮自动续一次,显式按钮保留;面板常驻「关掉面板不会中断」一行事实。
|
|
313
|
+
|
|
314
|
+
**升级说明**:旧版无属主 `batch.json`(根目录那份)不再被读取、不删除、不接管——没跑完的那批重打一次「全部更新」即可(幂等,已完成的秒过不重装)。单队列不变:四家单插件与批量仍共用同一份 `queue.json` + 全局锁,一次只装一个。
|
|
296
315
|
|
|
297
316
|
**自更新安全**:`selfKey` 指定的那家默认排到最后。承载更新界面的那个包若第一个被替换掉,
|
|
298
317
|
界面与推进它的循环会一起消失——排最后则前面几家早已落盘收尾。
|
package/dist/bilingual.d.ts
CHANGED
|
@@ -1,30 +1,40 @@
|
|
|
1
|
+
import { type AppLang } from './lang.js';
|
|
1
2
|
/** 字典版本钉(#53 Q3 解耦):key 冻即解阻塞 #54,文案按词标 draft/locked;开发钉此版本,转正只换文案不换 key。 */
|
|
2
3
|
export declare const BILINGUAL_DICT_VERSION = "2026-10-06-pin53";
|
|
3
|
-
/**
|
|
4
|
-
export type BilingualKey = 'entry.label.idle' | 'entry.label.failed' | 'entry.label.busy' | 'entry.label.restart' | 'entry.label.has-update' | 'entry.action.checking' | 'entry.note.up-to-date';
|
|
5
|
-
/** 一条双语:en/zh 模板 + 成熟度。模板内具名槽如 {version},运行时值填入(值永不翻译)。 */
|
|
4
|
+
/** key 全集(entry 7 + batch-entry 6 + panel 75(#61)+ kernel 72(#62 §3.7)+ diag 35(#63 §3.3/3.4)+ batch-ledger 33(#64 §4.1/4.3/4.4/4.5)+ batch-row 42(#65 §4.2 13 + §4.6 15 + §4.7 14)+ changelog 9 + diag-fallback 15(#66 §6.1/§7.1),命名沿 #52 key 提案,area.group.name;既有 288 键 en/zh/draft 不动)。 */
|
|
5
|
+
export type BilingualKey = 'entry.label.idle' | 'entry.label.failed' | 'entry.label.busy' | 'entry.label.restart' | 'entry.label.has-update' | 'entry.action.checking' | 'entry.note.up-to-date' | 'batch-entry.label.idle' | 'batch-entry.label.update' | 'batch-entry.label.busy' | 'batch-entry.label.restart' | 'batch-entry.label.failed' | 'batch-entry.action.checking' | 'panel.blocked.unknown-profile.title' | 'panel.blocked.unknown-profile.action' | 'panel.blocked.source-install.title' | 'panel.blocked.source-install.action' | 'panel.blocked.invalid-installation.title' | 'panel.blocked.invalid-installation.action' | 'panel.blocked.installation-changed.title' | 'panel.blocked.installation-changed.action' | 'panel.blocked.pending-restart.title' | 'panel.blocked.pending-restart.action' | 'panel.blocked.registry-conflict.title' | 'panel.blocked.registry-conflict.action' | 'panel.blocked.incompatible-node.title' | 'panel.blocked.incompatible-node.action' | 'panel.blocked.recovery-required.title' | 'panel.blocked.recovery-required.action' | 'panel.failure.check-failed.title' | 'panel.failure.check-failed.action' | 'panel.failure.invalid-release.title' | 'panel.failure.invalid-release.action' | 'panel.failure.check-expired.title' | 'panel.failure.check-expired.action' | 'panel.failure.update-busy.title' | 'panel.failure.update-busy.action' | 'panel.failure.install-failed.title' | 'panel.failure.install-failed.action' | 'panel.failure.internal.title' | 'panel.failure.internal.action' | 'panel.failure.unknown.title' | 'panel.failure.unknown.action' | 'panel.seal.loading.text' | 'panel.seal.loading.mini' | 'panel.seal.idle.text' | 'panel.seal.idle.mini' | 'panel.seal.update.text' | 'panel.seal.update.mini' | 'panel.seal.busy.text' | 'panel.seal.busy.mini' | 'panel.seal.restart.text' | 'panel.seal.restart.mini' | 'panel.seal.blocked.text' | 'panel.seal.blocked.mini' | 'panel.seal.failed.text' | 'panel.seal.failed.mini' | 'panel.seal.done.text' | 'panel.seal.done.mini' | 'panel.banner.error.title' | 'panel.banner.error.action-fallback' | 'panel.action.retry-install' | 'panel.banner.loading' | 'panel.action.install' | 'panel.queue.busy-self' | 'panel.queue.busy-queued' | 'panel.queue.busy-other' | 'panel.skip.skipped-title' | 'panel.skip.skipped-action' | 'panel.banner.restart-title' | 'panel.banner.installing-title' | 'panel.banner.installing-action' | 'panel.action.installing' | 'panel.banner.update-title' | 'panel.banner.update-action' | 'panel.action.install-version' | 'panel.banner.done' | 'panel.toast.checking' | 'panel.toast.installing' | 'panel.toast.copy-manual-ok' | 'panel.toast.copy-manual-fail' | 'panel.toast.copy-diag-ok' | 'panel.toast.copy-diag-fail' | 'panel.toast.restart-delegated' | 'panel.toast.restart-manual' | 'panel.toast.restart-failed' | 'panel.toast.copy-state-ok' | 'panel.toast.failure-dismissed' | 'panel.strip.running' | 'panel.strip.installed' | 'panel.strip.latest' | 'panel.meta.label' | 'panel.meta.unknown' | 'panel.masthead.kicker' | 'panel.masthead.title' | 'panel.masthead.volume' | 'panel.chapter.check' | 'panel.chapter.changelog' | 'panel.chapter.queue' | 'panel.chapter.error' | 'panel.chapter.manual' | 'panel.progress.installing' | 'panel.progress.verifying' | 'panel.action.check' | 'panel.action.check-title' | 'panel.action.checking-busy' | 'panel.action.checking-busy-title' | 'panel.action.installing-busy' | 'panel.action.installing-busy-title' | 'panel.action.install-title' | 'panel.action.skip' | 'panel.action.skip-title' | 'panel.action.unskip' | 'panel.action.unskip-title' | 'panel.action.copy-manual' | 'panel.action.copy-manual-title' | 'panel.action.restart-host' | 'panel.action.restart-host-title' | 'panel.action.dismiss' | 'panel.action.dismiss-title' | 'panel.action.copy-diag' | 'panel.action.copy-diag-title' | 'panel.skip.line-tag' | 'panel.skip.line-note' | 'panel.changelog.heading' | 'panel.changelog.heading-range' | 'panel.changelog.unavailable' | 'panel.changelog.unavailable-empty' | 'panel.changelog.toggle-title' | 'panel.changelog.expand' | 'panel.changelog.collapse' | 'panel.queue.state-idle' | 'panel.queue.other' | 'panel.queue.self' | 'panel.queue.pos-absent' | 'panel.queue.pos-n' | 'panel.queue.pos-next' | 'panel.queue.pos-ahead' | 'panel.queue.row-installing' | 'panel.queue.row-installing-note' | 'panel.queue.row-idle-note' | 'panel.queue.row-position' | 'panel.queue.row-order' | 'panel.queue.toggle-hide' | 'panel.queue.toggle-show' | 'panel.queue.empty' | 'panel.error.code-label' | 'panel.error.code-note' | 'panel.error.query-request' | 'panel.error.query-check' | 'panel.error.failed-at' | 'panel.error.query-keys' | 'panel.error.evidence-frozen' | 'panel.error.evidence-transient' | 'panel.error.no-failure' | 'panel.error.log-hint' | 'panel.error.log-follow' | 'panel.manual.heading' | 'panel.manual.absent' | 'panel.footer.note' | 'panel.footer.close' | 'panel.footer.close-title' | 'panel.diag.header' | 'panel.diag.label.human' | 'panel.diag.label.running' | 'panel.diag.label.installed' | 'panel.diag.label.latest' | 'panel.diag.queue.installing' | 'panel.diag.queue.position' | 'panel.diag.queue.absent' | 'panel.diag.label.host' | 'panel.diag.label.profile' | 'panel.diag.label.queue' | 'panel.diag.label.request' | 'panel.diag.label.manual' | 'panel.diag.copy.no-detail' | 'panel.diag.copy.unknown-package' | 'panel.diag.copy.unknown' | 'panel.diag.copy.field.plugin' | 'panel.diag.copy.field.version' | 'panel.diag.copy.field.host' | 'panel.diag.copy.field.profile' | 'panel.diag.copy.field.route' | 'panel.diag.copy.field.stage' | 'panel.diag.copy.field.method' | 'panel.diag.copy.field.latency' | 'panel.diag.copy.field.registry' | 'panel.diag.copy.field.registry-unknown' | 'panel.diag.copy.field.action' | 'panel.diag.copy.field.request' | 'panel.diag.copy.field.check' | 'panel.diag.copy.field.queue' | 'panel.diag.copy.line.summary' | 'panel.diag.copy.line.remedy' | 'panel.diag.copy.block.summary' | 'panel.diag.copy.block.source' | 'panel.diag.copy.block.remedy' | 'batch.action.resume' | 'batch.action.discard' | 'batch.action.confirm-discard' | 'batch.fact.close-safe' | 'batch.setting.check-on-open' | 'batch.row.update' | 'batch.row.current' | 'batch.row.never' | 'batch.row.failed' | 'batch.notice.auto-resumed' | 'batch.notice.resumed' | 'batch.notice.no-resume' | 'batch.notice.discarded' | 'batch.notice.cancel-confirm' | 'batch.notice.busy-cancel' | 'batch.row.unfinished-tag' | 'batch.summary.updatable' | 'batch.summary.installing' | 'batch.summary.pending' | 'batch.summary.restart' | 'batch.summary.failed' | 'batch.summary.skipped' | 'batch.summary.settled' | 'batch.summary.empty' | 'batch.header.title' | 'batch.action.check' | 'batch.action.check-title' | 'batch.action.install-all' | 'batch.action.install-all-title' | 'batch.action.close' | 'batch.action.close-title' | 'batch.banner.loading' | 'batch.hint.error' | 'batch.hint.empty' | 'batch.hint.installing-queueable' | 'batch.hint.installing-auto' | 'batch.hint.failed' | 'batch.hint.updatable' | 'batch.hint.restart' | 'batch.hint.pending' | 'batch.hint.done' | 'batch.seal.ledger' | 'batch.banner.error-title' | 'batch.banner.error-action-fallback' | 'batch.banner.failed-title' | 'batch.banner.failed-action' | 'batch.banner.restart-title' | 'batch.banner.restart-action' | 'batch.banner.restart-button' | 'batch.row.queued-generic' | 'batch.row.queued-n' | 'batch.row.skipped' | 'batch.row.wait-turn' | 'batch.row.checking' | 'batch.row.cta-version' | 'batch.row.cta-generic' | 'batch.row.installing' | 'batch.row.done-restart' | 'batch.row.done' | 'batch.row.failed-retry' | 'batch.row.skipped-idle' | 'batch.row.unknown' | 'batch.row-action.installing' | 'batch.row-action.cancel-queue' | 'batch.row-action.queue' | 'batch.row-action.install-row' | 'batch.row-action.retry' | 'batch.row-action.install-version' | 'batch.row-action.install-generic' | 'batch.row-action.unskip' | 'batch.row-action.restart' | 'batch.row-action.show-detail' | 'batch.row-action.hide-detail' | 'batch.row-action.skip' | 'batch.row-action.copy-manual' | 'batch.row-action.copy-diag' | 'batch.row.error-label' | 'batch.diag.source-job' | 'batch.toast.copy-fail' | 'batch.toast.queue-missed' | 'batch.toast.skipped' | 'batch.toast.unskipped-version' | 'batch.toast.unskipped-all' | 'batch.toast.cancel-unavailable' | 'batch.toast.cancel-ok' | 'batch.toast.cancel-fail' | 'batch.toast.copy-manual-ok' | 'batch.toast.copy-diag-ok' | 'batch.toast.restart-delegated' | 'batch.toast.restart-manual' | 'batch.toast.restart-failed' | 'changelog.neutral.hint' | 'changelog.neutral.line' | 'changelog.breaking.badge' | 'changelog.breaking.aria' | 'changelog.truncated.count' | 'changelog.yanked.banner' | 'changelog.yanked.suffix' | 'changelog.security.summary' | 'changelog.security.note' | 'diag.fallback.generic' | 'diag.fallback.read-installed' | 'diag.fallback.revalidate-fetch' | 'diag.fallback.rate-limited' | 'diag.fallback.http-status' | 'diag.fallback.invalid-release' | 'diag.fallback.install-failed' | 'diag.fallback.unknown-profile' | 'diag.fallback.source-install' | 'diag.fallback.invalid-installation' | 'diag.fallback.installation-changed' | 'diag.fallback.pending-restart' | 'diag.fallback.incompatible-node' | 'diag.fallback.registry-conflict' | 'diag.fallback.recovery-required';
|
|
6
|
+
/** 一条双语:en/zh 模板 + 成熟度。模板内具名槽如 {version}/{count},运行时值填入(值永不翻译)。 */
|
|
6
7
|
export interface BilingualEntry {
|
|
7
8
|
en: string;
|
|
8
9
|
zh: string;
|
|
9
|
-
/** true=待母语+域内双签(#53 Q3),false
|
|
10
|
+
/** true=待母语+域内双签(#53 Q3),false=已双签转正。首批与新增全 draft(无评审不假锁)。 */
|
|
10
11
|
draft: boolean;
|
|
11
12
|
}
|
|
12
13
|
/**
|
|
13
14
|
* 集中字典(机器源,类型锁死:Record<BilingualKey, BilingualEntry> 缺键即 tsc 报错)。
|
|
14
|
-
* 人读源为 #57 规格 + #53 结论英文定调;英文终稿待母语评审,故全标 draft
|
|
15
|
-
* zh 逐字等于 entry.ts
|
|
15
|
+
* 人读源为 #57 规格 + #53 结论英文定调;英文终稿待母语评审,故全标 draft(#61/#62/#63 新增亦全 draft)。
|
|
16
|
+
* zh 逐字等于 panel.ts / entry.ts 既有散落文案(兼容既有测试与接入方口径;#63 旧 13/新 22 的 zh 均逐字等于旧复制文本)。
|
|
16
17
|
*/
|
|
17
18
|
export declare const BILINGUAL_STRINGS: Record<BilingualKey, BilingualEntry>;
|
|
18
19
|
/** 取一条双语原文(类型锁死:未知 key 在 tsc 即拦;运行时未知亦抛,不静默回退)。 */
|
|
19
20
|
export declare function bilingualEntry(key: BilingualKey): BilingualEntry;
|
|
20
21
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
22
|
+
* 单语纯文本(v2 主出口,纯函数):只渲染 lang 那一种语言,不读全局信号。
|
|
23
|
+
* lang 显式入参('zh'/'en'/BCP47,缺省 zh);返回原文(未转义),调用方按上下文转义后再拼入属性。
|
|
24
|
+
*/
|
|
25
|
+
export declare function copyText(key: BilingualKey, lang?: AppLang | string | null, values?: Record<string, unknown>): string;
|
|
26
|
+
/**
|
|
27
|
+
* 单语语义块 HTML(v2 主出口,纯函数):一次只出现一种语言,语义块仍带 lang 属性。
|
|
28
|
+
* lang 显式入参(缺省 zh);返回已转义可直接拼入 innerHTML 的片段;调用方不得再对整体转义,不得拆 span 重组。
|
|
29
|
+
*/
|
|
30
|
+
export declare function copyHTML(key: BilingualKey, lang?: AppLang | string | null, values?: Record<string, unknown>): string;
|
|
31
|
+
/**
|
|
32
|
+
* 历史名包装(v2 前叫双语,v2 起为单语,保留旧名见文件头说明):
|
|
33
|
+
* 无显式 lang 时按当前语言单语渲染(读全局信号),有覆盖需求请直接用 copyHTML/copyText。
|
|
23
34
|
*/
|
|
24
35
|
export declare function bilingualText(key: BilingualKey, values?: Record<string, unknown>): string;
|
|
25
36
|
/**
|
|
26
|
-
*
|
|
27
|
-
* 返回已转义可直接拼入 innerHTML 的片段;调用方不得再对整体转义,不得拆 span 重组。
|
|
37
|
+
* 历史名包装(见上):无显式 lang 时按当前语言单语渲染;返回单语块(只含当前语言一个 span)。
|
|
28
38
|
*/
|
|
29
39
|
export declare function bilingualHTML(key: BilingualKey, values?: Record<string, unknown>): string;
|
|
30
40
|
/** 是否 draft(供 #56 门禁读零 draft 放行条件;#54 自身不断言零 draft)。 */
|
|
@@ -32,8 +42,8 @@ export declare function isDraft(key: BilingualKey): boolean;
|
|
|
32
42
|
/** 全表 draft key 一览(#56 门禁:空数组才放行合入主分支)。 */
|
|
33
43
|
export declare function draftKeys(): BilingualKey[];
|
|
34
44
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
45
|
+
* 单语块最小样式(与 UPDATE_ENTRY_CSS 同缝注入):
|
|
46
|
+
* v2 起窄处竖排退场(一次只一种语言,不断行压力消失,#55 横排/竖排结论作废,排版改由 #67 仲裁);
|
|
47
|
+
* 只保留 overflow-wrap,不断行不溢出;不管字重字号。
|
|
38
48
|
*/
|
|
39
49
|
export declare const BILINGUAL_CSS: string;
|