dsh-life-pack 0.2.0 → 0.2.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/dist/client.js +820 -13
- package/dist/client.js.map +1 -1
- package/dist/dsh-ctx.d.ts +18 -2
- package/dist/dsh-ctx.d.ts.map +1 -1
- package/dist/index.d.ts +4 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +63 -7
- package/dist/index.js.map +1 -1
- package/dist/nav.d.ts +34 -1
- package/dist/nav.d.ts.map +1 -1
- package/dist/nav.js +43 -1
- package/dist/nav.js.map +1 -1
- package/dist/update-client.d.ts +40 -0
- package/dist/update-client.d.ts.map +1 -0
- package/dist/update-client.js +121 -0
- package/dist/update-client.js.map +1 -0
- package/dist/update-contract.d.ts +47 -0
- package/dist/update-contract.d.ts.map +1 -0
- package/dist/update-contract.js +69 -0
- package/dist/update-contract.js.map +1 -0
- package/dist/update-env.d.ts +36 -0
- package/dist/update-env.d.ts.map +1 -0
- package/dist/update-env.js +242 -0
- package/dist/update-env.js.map +1 -0
- package/dist/update-host.d.ts +18 -0
- package/dist/update-host.d.ts.map +1 -0
- package/dist/update-host.js +161 -0
- package/dist/update-host.js.map +1 -0
- package/dist/update-panel.d.ts +63 -0
- package/dist/update-panel.d.ts.map +1 -0
- package/dist/update-panel.js +231 -0
- package/dist/update-panel.js.map +1 -0
- package/dist/update-targets.d.ts +17 -0
- package/dist/update-targets.d.ts.map +1 -0
- package/dist/update-targets.js +29 -0
- package/dist/update-targets.js.map +1 -0
- package/dist/update-view.d.ts +55 -0
- package/dist/update-view.d.ts.map +1 -0
- package/dist/update-view.js +65 -0
- package/dist/update-view.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/** 总管宿主半的电话表:七组更新电话(更新包建)+ 两个总管自有电话(本包建)。
|
|
2
|
+
*
|
|
3
|
+
* 形状:`buildUpdatePhoneTable(ctx).call(方法名, 入参)` —— 一条入口,内部按方法名派发。
|
|
4
|
+
* 表的建成是**懒的**(首次调用时建):要读磁盘拿使用范围与七个目标的运行版本,
|
|
5
|
+
* 而 cordis 的 `apply` 是同步的。
|
|
6
|
+
*
|
|
7
|
+
* 七组电话来自更新包的 `createHostUpdate`(`host.ts:326-367`),每组一套
|
|
8
|
+
* `{phoneNames, handlers}`;七组之间靠各自的前缀与插件标识隔离。读数按更新包公开的接缝
|
|
9
|
+
* `readerOverrides` 注入(`host.ts:123-155`),理由见 `update-env.ts` 头注。
|
|
10
|
+
*/
|
|
11
|
+
import { createHostUpdate, createUpdateExecutor, detectEnvironmentKind, resolveUpdateConfig } from 'dsh-plugin-update';
|
|
12
|
+
import { DEFAULT_REGISTRY, MANAGER_ACTIONS, reasonText } from './update-contract.js';
|
|
13
|
+
import { UPDATE_TARGETS, targetFor } from './update-targets.js';
|
|
14
|
+
import { MISSING_RUNNING_VERSION, captureRunningVersion, readSkillRide, readTargetEnvironment, resolveProfileDir } from './update-env.js';
|
|
15
|
+
function service(ctx, name) {
|
|
16
|
+
try {
|
|
17
|
+
const get = ctx?.get;
|
|
18
|
+
return typeof get === 'function' ? get.call(ctx, name) : undefined;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function failure(code, details = {}) {
|
|
25
|
+
return { ok: false, error: { code, message: reasonText(code), details } };
|
|
26
|
+
}
|
|
27
|
+
/** 总管自有电话一:装上缺席的目标包(更新包的三个电话只管已装的包,见 `update-env.ts` 头注)。 */
|
|
28
|
+
async function installMissing(facts, target, args) {
|
|
29
|
+
const version = typeof args.version === 'string' && /^\d+\.\d+\.\d+$/.test(args.version) ? args.version : '';
|
|
30
|
+
if (!version)
|
|
31
|
+
return failure('invalid-release', { packageName: target.packageName });
|
|
32
|
+
try {
|
|
33
|
+
// 装的动作交回更新包的执行器:路由(桌面服务 / 子进程)与参数数组(精确版本、官方源、
|
|
34
|
+
// --save-exact)都是它冻结的配方(`commands.ts:71-96`),总管不自己拼命令、不按系统分支。
|
|
35
|
+
const runInstall = createUpdateExecutor({
|
|
36
|
+
profileName: facts.profileName,
|
|
37
|
+
environmentKind: facts.environmentKind,
|
|
38
|
+
profileDir: facts.profileDir,
|
|
39
|
+
subprocess: () => service(facts.ctx, 'subprocess'),
|
|
40
|
+
desktopPnpm: () => service(facts.ctx, 'desktopPnpm'),
|
|
41
|
+
desktopProfiles: () => service(facts.ctx, 'desktopProfiles'),
|
|
42
|
+
targetPackageName: target.packageName,
|
|
43
|
+
registryUrl: DEFAULT_REGISTRY,
|
|
44
|
+
pluginId: 'dsh-life-pack-' + target.key,
|
|
45
|
+
});
|
|
46
|
+
await runInstall({ version, profileName: facts.profileName, environmentKind: facts.environmentKind });
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
return failure('install-failed', { packageName: target.packageName, version });
|
|
50
|
+
}
|
|
51
|
+
return { ok: true, value: { packageName: target.packageName, version } };
|
|
52
|
+
}
|
|
53
|
+
/** 总管自有电话二:七个更新目标的表 —— 每家的三个电话名 + 版本行事实 + 轮询间隔。 */
|
|
54
|
+
async function readTargets(facts, phones, pollMs) {
|
|
55
|
+
const targets = [];
|
|
56
|
+
for (const target of UPDATE_TARGETS) {
|
|
57
|
+
targets.push({
|
|
58
|
+
key: target.key,
|
|
59
|
+
title: target.title,
|
|
60
|
+
packageName: target.packageName,
|
|
61
|
+
phones: phones.get(target.key) ?? null,
|
|
62
|
+
runningVersion: facts.runningVersions.get(target.key) ?? null,
|
|
63
|
+
installedVersion: await captureRunningVersion(target.packageName, facts.profileDir),
|
|
64
|
+
skill: await readSkillRide(target.packageName, facts.profileDir),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return { ok: true, value: { targets, pollMs } };
|
|
68
|
+
}
|
|
69
|
+
async function buildTable(ctx) {
|
|
70
|
+
const { dir: profileDir, name: profileName } = await resolveProfileDir();
|
|
71
|
+
const environmentKind = detectEnvironmentKind(ctx);
|
|
72
|
+
const runningVersions = new Map();
|
|
73
|
+
for (const target of UPDATE_TARGETS) {
|
|
74
|
+
runningVersions.set(target.key, await captureRunningVersion(target.packageName, profileDir));
|
|
75
|
+
}
|
|
76
|
+
const facts = { ctx, profileDir, profileName, environmentKind, runningVersions };
|
|
77
|
+
const updatePhones = new Map();
|
|
78
|
+
const phonesByTarget = new Map();
|
|
79
|
+
let pollMs = 1000;
|
|
80
|
+
for (const target of UPDATE_TARGETS) {
|
|
81
|
+
const pluginId = 'dsh-life-pack-' + target.key;
|
|
82
|
+
const runningVersion = runningVersions.get(target.key) ?? MISSING_RUNNING_VERSION;
|
|
83
|
+
const update = createHostUpdate({
|
|
84
|
+
ctx,
|
|
85
|
+
readerOverrides: {
|
|
86
|
+
profileDir,
|
|
87
|
+
profileName,
|
|
88
|
+
runningVersion,
|
|
89
|
+
environmentKind,
|
|
90
|
+
readInstalled: () => readTargetEnvironment(target.packageName, {
|
|
91
|
+
profileDir,
|
|
92
|
+
profileName,
|
|
93
|
+
runningVersion,
|
|
94
|
+
environmentKind,
|
|
95
|
+
pluginId,
|
|
96
|
+
}),
|
|
97
|
+
},
|
|
98
|
+
}, { pluginId, prefix: target.phonePrefix, targetPackageName: target.packageName });
|
|
99
|
+
for (const [phoneName, handler] of Object.entries(update.handlers))
|
|
100
|
+
updatePhones.set(phoneName, handler);
|
|
101
|
+
phonesByTarget.set(target.key, {
|
|
102
|
+
status: update.phoneNames.updateStatus,
|
|
103
|
+
check: update.phoneNames.updateCheck,
|
|
104
|
+
install: update.phoneNames.updateInstall,
|
|
105
|
+
});
|
|
106
|
+
// 面板轮询间隔取更新包自己的取值(`resolveUpdateConfig` 的冻结默认,见其 README 第 11 节),
|
|
107
|
+
// 面板侧一律不写死数字。
|
|
108
|
+
if (pollMs === 1000)
|
|
109
|
+
pollMs = resolveUpdateConfig({ pluginId }).panelPollMs;
|
|
110
|
+
}
|
|
111
|
+
const managerActions = new Map([
|
|
112
|
+
[
|
|
113
|
+
MANAGER_ACTIONS.install,
|
|
114
|
+
(args) => {
|
|
115
|
+
const packageName = typeof args.packageName === 'string' ? args.packageName : '';
|
|
116
|
+
const target = targetFor(packageName);
|
|
117
|
+
if (!target)
|
|
118
|
+
return Promise.resolve(failure('bad-request', { packageName }));
|
|
119
|
+
return installMissing(facts, target, args);
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
[MANAGER_ACTIONS.targets, () => readTargets(facts, phonesByTarget, pollMs)],
|
|
123
|
+
]);
|
|
124
|
+
return async (method, args) => {
|
|
125
|
+
const action = managerActions.get(method);
|
|
126
|
+
if (action) {
|
|
127
|
+
try {
|
|
128
|
+
return await action(args);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
return failure('internal', { detail: String(error?.message ?? error) });
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const handler = updatePhones.get(method);
|
|
135
|
+
if (!handler)
|
|
136
|
+
return failure('bad-request', { method });
|
|
137
|
+
try {
|
|
138
|
+
// 更新包的电话回包(`host.ts:294-315`):成功带快照与手工命令,失败带原因码。
|
|
139
|
+
const out = await handler(args);
|
|
140
|
+
if (out.ok === true) {
|
|
141
|
+
return { ok: true, value: { snapshot: out.snapshot, manual: out.manual ?? null, receipt: out.receipt ?? null } };
|
|
142
|
+
}
|
|
143
|
+
const code = typeof out.error === 'string' ? out.error : 'internal';
|
|
144
|
+
return failure(code, { errorKind: String(out.errorKind ?? '') });
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return failure('internal', { detail: String(error?.message ?? error) });
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/** 建电话表(懒建:首次调用时才读磁盘)。 */
|
|
152
|
+
export function buildUpdatePhoneTable(ctx) {
|
|
153
|
+
let table = null;
|
|
154
|
+
return {
|
|
155
|
+
async call(method, args) {
|
|
156
|
+
table ??= buildTable(ctx);
|
|
157
|
+
return (await table)(method, args ?? {});
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=update-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-host.js","sourceRoot":"","sources":["../src/update-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** 爱生活面板的更新界面:检查更新按钮、七家结果行、待重启横幅、缺席卡的「装上」。
|
|
2
|
+
*
|
|
3
|
+
* 面板侧纪律(沿 `client.ts` 既有口径):React.createElement 手写(禁 JSX)、内联 style、
|
|
4
|
+
* 颜色走 DSH 主题别名(深浅主题自适应,写死值只做回退)、只用 `dsh-ctx` 镜像内的上下文成员、
|
|
5
|
+
* 不 import 更新包(电话名与轮询间隔由宿主转交,见 `update-contract.ts` 的 `MANAGER_ACTIONS.targets`)。
|
|
6
|
+
*
|
|
7
|
+
* 视觉对照(用户给的第二张截图,参照实现 `dsh-mattpocock-skills-deck/src/client/views/SettingsPage.js:152-168`):
|
|
8
|
+
* 标题右侧并排若干件——本文件出「检查更新」一件,隔壁票(爱生活面板头部与底部)在同一个
|
|
9
|
+
* `actions` 容器里补星与气泡两件,故这里把容器单独留出来。
|
|
10
|
+
*/
|
|
11
|
+
import * as React from 'react';
|
|
12
|
+
import type { CallFailure } from './update-client.js';
|
|
13
|
+
import type { CheckOutcome, TargetInfo } from './update-view.js';
|
|
14
|
+
/** 面板视觉(沿用总管既有语言:内联 style,主题别名带回退)。 */
|
|
15
|
+
export declare const PANEL_STYLE: {
|
|
16
|
+
head: React.CSSProperties;
|
|
17
|
+
headRow: React.CSSProperties;
|
|
18
|
+
actions: React.CSSProperties;
|
|
19
|
+
meta: React.CSSProperties;
|
|
20
|
+
tablist: React.CSSProperties;
|
|
21
|
+
tab: React.CSSProperties;
|
|
22
|
+
tabActive: React.CSSProperties;
|
|
23
|
+
reco: React.CSSProperties;
|
|
24
|
+
cmd: React.CSSProperties;
|
|
25
|
+
btn: React.CSSProperties;
|
|
26
|
+
banner: React.CSSProperties;
|
|
27
|
+
row: React.CSSProperties;
|
|
28
|
+
rowHead: React.CSSProperties;
|
|
29
|
+
rowMeta: React.CSSProperties;
|
|
30
|
+
reason: React.CSSProperties;
|
|
31
|
+
skill: React.CSSProperties;
|
|
32
|
+
};
|
|
33
|
+
/** 一行的运行时状态:还没查 / 查着 / 有结果 / 装着 / 出错。 */
|
|
34
|
+
export interface UpdateRowState {
|
|
35
|
+
readonly phase: 'idle' | 'checking' | 'ready' | 'installing' | 'failed';
|
|
36
|
+
readonly outcome: CheckOutcome | null;
|
|
37
|
+
readonly failure: CallFailure | null;
|
|
38
|
+
}
|
|
39
|
+
export interface UpdateRowsFace {
|
|
40
|
+
readonly targets: readonly TargetInfo[];
|
|
41
|
+
readonly rows: Readonly<Record<string, UpdateRowState>>;
|
|
42
|
+
readonly pollMs: number;
|
|
43
|
+
readonly loadError: string | null;
|
|
44
|
+
readonly checking: boolean;
|
|
45
|
+
checkAll(): void;
|
|
46
|
+
act(target: TargetInfo): void;
|
|
47
|
+
}
|
|
48
|
+
/** 标题右侧的「检查更新」:一个按钮一次查七家(吃 `useUpdateRows` 的表)。 */
|
|
49
|
+
export declare function CheckUpdateButton(props: {
|
|
50
|
+
readonly face: UpdateRowsFace;
|
|
51
|
+
}): React.ReactElement;
|
|
52
|
+
/** 七家结果行:一家一行(版本行两行、结论一句、按钮一个、装不了给原因与手工命令)。 */
|
|
53
|
+
export declare function UpdateResults(props: {
|
|
54
|
+
readonly face: UpdateRowsFace;
|
|
55
|
+
}): React.ReactElement | null;
|
|
56
|
+
/** 缺席卡:一句人话 +「装上」按钮(复制命令降为辅助展示);总管缺席时不显示此卡(面板也看不到)。 */
|
|
57
|
+
export declare function AbsentCard(props: {
|
|
58
|
+
readonly target: TargetInfo | null;
|
|
59
|
+
readonly fallbackCommand: string;
|
|
60
|
+
readonly face: UpdateRowsFace;
|
|
61
|
+
}): React.ReactElement;
|
|
62
|
+
export { MANAGER_ACTIONS };
|
|
63
|
+
//# sourceMappingURL=update-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-panel.d.ts","sourceRoot":"","sources":["../src/update-panel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAY,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEjE,uCAAuC;AACvC,eAAO,MAAM,WAAW;UAC4F,KAAK,CAAC,aAAa;aACpB,KAAK,CAAC,aAAa;aAC/D,KAAK,CAAC,aAAa;UACyB,KAAK,CAAC,aAAa;aACxD,KAAK,CAAC,aAAa;SAS1F,KAAK,CAAC,aAAa;eAMnB,KAAK,CAAC,aAAa;UAQnB,KAAK,CAAC,aAAa;SAWnB,KAAK,CAAC,aAAa;SASnB,KAAK,CAAC,aAAa;YAUnB,KAAK,CAAC,aAAa;SAQnB,KAAK,CAAC,aAAa;aACyB,KAAK,CAAC,aAAa;aACa,KAAK,CAAC,aAAa;YACF,KAAK,CAAC,aAAa;WACzB,KAAK,CAAC,aAAa;CAChH,CAAC;AAEF,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,GAAG,QAAQ,CAAC;IACxE,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,IAAI,IAAI,CAAC;IACjB,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;CAC/B;AA6ED,mDAAmD;AACnD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GAAG,KAAK,CAAC,YAAY,CAc9F;AAmBD,+CAA+C;AAC/C,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GAAG,KAAK,CAAC,YAAY,GAAG,IAAI,CAiDjG;AAED,uDAAuD;AACvD,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAChC,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;CAC/B,GAAG,KAAK,CAAC,YAAY,CAyBrB;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/** 爱生活面板的更新界面:检查更新按钮、七家结果行、待重启横幅、缺席卡的「装上」。
|
|
2
|
+
*
|
|
3
|
+
* 面板侧纪律(沿 `client.ts` 既有口径):React.createElement 手写(禁 JSX)、内联 style、
|
|
4
|
+
* 颜色走 DSH 主题别名(深浅主题自适应,写死值只做回退)、只用 `dsh-ctx` 镜像内的上下文成员、
|
|
5
|
+
* 不 import 更新包(电话名与轮询间隔由宿主转交,见 `update-contract.ts` 的 `MANAGER_ACTIONS.targets`)。
|
|
6
|
+
*
|
|
7
|
+
* 视觉对照(用户给的第二张截图,参照实现 `dsh-mattpocock-skills-deck/src/client/views/SettingsPage.js:152-168`):
|
|
8
|
+
* 标题右侧并排若干件——本文件出「检查更新」一件,隔壁票(爱生活面板头部与底部)在同一个
|
|
9
|
+
* `actions` 容器里补星与气泡两件,故这里把容器单独留出来。
|
|
10
|
+
*/
|
|
11
|
+
import * as React from 'react';
|
|
12
|
+
import { checkTarget, installAbsent, loadTargets, updateInstalled } from './update-client.js';
|
|
13
|
+
import { isAbsent, pendingRestartText, verdictOf, versionLines } from './update-view.js';
|
|
14
|
+
/** 面板视觉(沿用总管既有语言:内联 style,主题别名带回退)。 */
|
|
15
|
+
export const PANEL_STYLE = {
|
|
16
|
+
head: { fontSize: 15, fontWeight: 700, margin: '2px 0 8px', color: 'var(--dsw-alias-label-primary, inherit)' },
|
|
17
|
+
headRow: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8, flexWrap: 'wrap' },
|
|
18
|
+
actions: { display: 'inline-flex', alignItems: 'center', gap: 6 },
|
|
19
|
+
meta: { color: 'var(--dsw-alias-label-secondary, #9a9a9a)', fontSize: 12, lineHeight: 1.7, marginBottom: 10 },
|
|
20
|
+
tablist: { display: 'flex', flexWrap: 'wrap', gap: 6, marginBottom: 10 },
|
|
21
|
+
tab: {
|
|
22
|
+
border: '1px solid var(--dsw-alias-border, rgba(128,128,128,.35))',
|
|
23
|
+
background: 'transparent',
|
|
24
|
+
color: 'var(--dsw-alias-label-primary, inherit)',
|
|
25
|
+
borderRadius: 999,
|
|
26
|
+
padding: '4px 12px',
|
|
27
|
+
fontSize: 13,
|
|
28
|
+
cursor: 'pointer',
|
|
29
|
+
},
|
|
30
|
+
tabActive: {
|
|
31
|
+
background: 'var(--dsw-alias-brand-primary, #0a84ff)',
|
|
32
|
+
borderColor: 'transparent',
|
|
33
|
+
color: '#fff',
|
|
34
|
+
fontWeight: 700,
|
|
35
|
+
},
|
|
36
|
+
reco: {
|
|
37
|
+
padding: '12px 14px',
|
|
38
|
+
borderRadius: 10,
|
|
39
|
+
border: '1px dashed var(--dsw-alias-border, rgba(128,128,128,.45))',
|
|
40
|
+
color: 'var(--dsw-alias-label-secondary, #9a9a9a)',
|
|
41
|
+
fontSize: 13,
|
|
42
|
+
lineHeight: 1.7,
|
|
43
|
+
},
|
|
44
|
+
cmd: {
|
|
45
|
+
display: 'block',
|
|
46
|
+
marginTop: 8,
|
|
47
|
+
padding: '8px 10px',
|
|
48
|
+
borderRadius: 8,
|
|
49
|
+
background: 'var(--dsw-alias-bg-base, rgba(128,128,128,.12))',
|
|
50
|
+
color: 'var(--dsw-alias-label-primary, inherit)',
|
|
51
|
+
fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',
|
|
52
|
+
fontSize: 12,
|
|
53
|
+
userSelect: 'all',
|
|
54
|
+
},
|
|
55
|
+
btn: {
|
|
56
|
+
border: '1px solid var(--dsw-alias-border, rgba(128,128,128,.35))',
|
|
57
|
+
background: 'transparent',
|
|
58
|
+
color: 'var(--dsw-alias-label-primary, inherit)',
|
|
59
|
+
borderRadius: 8,
|
|
60
|
+
padding: '4px 12px',
|
|
61
|
+
fontSize: 13,
|
|
62
|
+
cursor: 'pointer',
|
|
63
|
+
},
|
|
64
|
+
banner: {
|
|
65
|
+
padding: '10px 12px',
|
|
66
|
+
marginBottom: 10,
|
|
67
|
+
borderRadius: 8,
|
|
68
|
+
border: '1px solid var(--dsw-alias-state-warning-primary, #d8a300)',
|
|
69
|
+
background: 'var(--dsw-alias-bg-base, rgba(216,163,0,.12))',
|
|
70
|
+
color: 'var(--dsw-alias-label-primary, inherit)',
|
|
71
|
+
fontSize: 13,
|
|
72
|
+
lineHeight: 1.7,
|
|
73
|
+
},
|
|
74
|
+
row: {
|
|
75
|
+
padding: '10px 12px',
|
|
76
|
+
marginBottom: 8,
|
|
77
|
+
borderRadius: 10,
|
|
78
|
+
border: '1px solid var(--dsw-alias-border, rgba(128,128,128,.3))',
|
|
79
|
+
fontSize: 13,
|
|
80
|
+
lineHeight: 1.7,
|
|
81
|
+
},
|
|
82
|
+
rowHead: { fontWeight: 700, marginBottom: 2 },
|
|
83
|
+
rowMeta: { color: 'var(--dsw-alias-label-secondary, #9a9a9a)', fontSize: 12 },
|
|
84
|
+
reason: { color: 'var(--dsw-alias-state-error-primary, #ff6b6b)', fontSize: 12, marginTop: 4 },
|
|
85
|
+
skill: { color: 'var(--dsw-alias-label-tertiary, #8a8a8a)', fontSize: 12, marginTop: 4 },
|
|
86
|
+
};
|
|
87
|
+
const IDLE = { phase: 'idle', outcome: null, failure: null };
|
|
88
|
+
function useUpdateRows(getCall) {
|
|
89
|
+
const [targets, setTargets] = React.useState([]);
|
|
90
|
+
const [rows, setRows] = React.useState({});
|
|
91
|
+
const [pollMs, setPollMs] = React.useState(1000);
|
|
92
|
+
const [loadError, setLoadError] = React.useState(null);
|
|
93
|
+
const [checking, setChecking] = React.useState(false);
|
|
94
|
+
React.useEffect(() => {
|
|
95
|
+
let alive = true;
|
|
96
|
+
void (async () => {
|
|
97
|
+
const loaded = await loadTargets(getCall());
|
|
98
|
+
if (!alive)
|
|
99
|
+
return;
|
|
100
|
+
if (loaded.ok) {
|
|
101
|
+
setTargets(loaded.value.targets);
|
|
102
|
+
setPollMs(loaded.value.pollMs);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
setLoadError(loaded.message);
|
|
106
|
+
}
|
|
107
|
+
})();
|
|
108
|
+
return () => {
|
|
109
|
+
alive = false;
|
|
110
|
+
};
|
|
111
|
+
}, [getCall]);
|
|
112
|
+
const patch = React.useCallback((key, next) => {
|
|
113
|
+
setRows((previous) => ({ ...previous, [key]: next }));
|
|
114
|
+
}, []);
|
|
115
|
+
const checkAll = React.useCallback(() => {
|
|
116
|
+
setChecking(true);
|
|
117
|
+
const list = targets;
|
|
118
|
+
for (const target of list)
|
|
119
|
+
patch(target.key, { phase: 'checking', outcome: rows[target.key]?.outcome ?? null, failure: null });
|
|
120
|
+
void Promise.all(list.map(async (target) => {
|
|
121
|
+
const result = await checkTarget(getCall(), target);
|
|
122
|
+
patch(target.key, result.ok ? { phase: 'ready', outcome: result.value, failure: null } : { phase: 'failed', outcome: null, failure: result });
|
|
123
|
+
})).finally(() => setChecking(false));
|
|
124
|
+
}, [getCall, patch, rows, targets]);
|
|
125
|
+
const act = React.useCallback((target) => {
|
|
126
|
+
const current = rows[target.key] ?? IDLE;
|
|
127
|
+
patch(target.key, { ...current, phase: 'installing', failure: null });
|
|
128
|
+
void (async () => {
|
|
129
|
+
const absent = isAbsent(target);
|
|
130
|
+
let version = current.outcome?.snapshot.latestVersion ?? null;
|
|
131
|
+
if (absent && version === null) {
|
|
132
|
+
const checked = await checkTarget(getCall(), target);
|
|
133
|
+
if (!checked.ok) {
|
|
134
|
+
patch(target.key, { phase: 'failed', outcome: null, failure: checked });
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
patch(target.key, { phase: 'installing', outcome: checked.value, failure: null });
|
|
138
|
+
version = checked.value.snapshot.latestVersion;
|
|
139
|
+
}
|
|
140
|
+
const result = absent
|
|
141
|
+
? await installAbsent(getCall(), target, version ?? '')
|
|
142
|
+
: await updateInstalled(getCall(), target, pollMs);
|
|
143
|
+
if (result.ok) {
|
|
144
|
+
// 装完不自己编快照:向宿主问一次真实状态(装到磁盘但宿主还跑着旧版 ⇒ 待重启)。
|
|
145
|
+
const refreshed = await checkTarget(getCall(), target, target.phones?.status);
|
|
146
|
+
patch(target.key, refreshed.ok ? { phase: 'ready', outcome: refreshed.value, failure: null } : { phase: 'failed', outcome: null, failure: refreshed });
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
patch(target.key, {
|
|
150
|
+
phase: 'failed',
|
|
151
|
+
outcome: current.outcome,
|
|
152
|
+
failure: { ...result, manual: result.manual ?? current.outcome?.manual ?? null },
|
|
153
|
+
});
|
|
154
|
+
})();
|
|
155
|
+
}, [getCall, patch, pollMs, rows]);
|
|
156
|
+
return { targets, rows, pollMs, loadError, checking, checkAll, act };
|
|
157
|
+
}
|
|
158
|
+
/** 标题右侧的「检查更新」:一个按钮一次查七家(吃 `useUpdateRows` 的表)。 */
|
|
159
|
+
export function CheckUpdateButton(props) {
|
|
160
|
+
const { checking, checkAll, targets } = props.face;
|
|
161
|
+
const disabled = checking || targets.length === 0;
|
|
162
|
+
return React.createElement('button', {
|
|
163
|
+
type: 'button',
|
|
164
|
+
style: disabled ? { ...PANEL_STYLE.btn, opacity: 0.55, cursor: 'default' } : PANEL_STYLE.btn,
|
|
165
|
+
disabled,
|
|
166
|
+
onClick: checkAll,
|
|
167
|
+
title: '一次查七家(总管自己 + 六个单品)的插件包版本',
|
|
168
|
+
}, checking ? '检查中…' : '检查更新');
|
|
169
|
+
}
|
|
170
|
+
/** 待重启横幅:任何一家成 `pending-restart` 就常驻显示,重启宿主后自动消失(更新包 README 第 10 节)。 */
|
|
171
|
+
function RestartBanners(props) {
|
|
172
|
+
const lines = [];
|
|
173
|
+
for (const target of props.face.targets) {
|
|
174
|
+
const outcome = props.face.rows[target.key]?.outcome;
|
|
175
|
+
if (!outcome)
|
|
176
|
+
continue;
|
|
177
|
+
const text = pendingRestartText(target, outcome.snapshot);
|
|
178
|
+
if (text)
|
|
179
|
+
lines.push(text);
|
|
180
|
+
}
|
|
181
|
+
if (lines.length === 0)
|
|
182
|
+
return null;
|
|
183
|
+
return React.createElement('div', { style: PANEL_STYLE.banner }, lines.map((line, index) => React.createElement('div', { key: String(index) }, line)));
|
|
184
|
+
}
|
|
185
|
+
/** 七家结果行:一家一行(版本行两行、结论一句、按钮一个、装不了给原因与手工命令)。 */
|
|
186
|
+
export function UpdateResults(props) {
|
|
187
|
+
const { targets, rows, loadError, checking } = props.face;
|
|
188
|
+
const shown = targets.filter((target) => rows[target.key] && rows[target.key].phase !== 'idle');
|
|
189
|
+
if (loadError)
|
|
190
|
+
return React.createElement('div', { style: PANEL_STYLE.reason }, '更新能力没接上:' + loadError);
|
|
191
|
+
if (targets.length === 0)
|
|
192
|
+
return null;
|
|
193
|
+
if (shown.length === 0)
|
|
194
|
+
return null;
|
|
195
|
+
return React.createElement('div', null, React.createElement(RestartBanners, { face: props.face }), shown.map((target) => {
|
|
196
|
+
const row = rows[target.key];
|
|
197
|
+
const snapshot = row.outcome?.snapshot ?? null;
|
|
198
|
+
const verdict = snapshot ? verdictOf(target, snapshot) : null;
|
|
199
|
+
const manual = row.failure?.manual ?? row.outcome?.manual ?? null;
|
|
200
|
+
const busy = row.phase === 'installing';
|
|
201
|
+
return React.createElement('div', { key: target.key, style: PANEL_STYLE.row }, React.createElement('div', { style: PANEL_STYLE.rowHead }, target.title + ' · ' + target.packageName), React.createElement('div', { style: PANEL_STYLE.rowMeta }, '当前 ' +
|
|
202
|
+
String(snapshot?.runningVersion ?? target.runningVersion ?? '未安装') +
|
|
203
|
+
' · 最新 ' +
|
|
204
|
+
String(snapshot?.latestVersion ?? '未查')), React.createElement('div', null, busy ? '正在装,请稍候…' : (verdict?.text ?? (checking ? '检查中…' : ''))), verdict?.action
|
|
205
|
+
? React.createElement('button', {
|
|
206
|
+
type: 'button',
|
|
207
|
+
style: busy ? { ...PANEL_STYLE.btn, opacity: 0.55 } : { ...PANEL_STYLE.btn, marginTop: 6 },
|
|
208
|
+
disabled: busy,
|
|
209
|
+
onClick: () => props.face.act(target),
|
|
210
|
+
}, verdict.action === 'install' ? '装上' : '装上更新')
|
|
211
|
+
: null, row.failure ? React.createElement('div', { style: PANEL_STYLE.reason }, '装不上:' + row.failure.message) : null, versionLines(target, snapshot).map((line, index) => React.createElement('div', { key: String(index), style: PANEL_STYLE.skill }, line)), manual ? React.createElement('code', { style: PANEL_STYLE.cmd }, manual) : null);
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
214
|
+
/** 缺席卡:一句人话 +「装上」按钮(复制命令降为辅助展示);总管缺席时不显示此卡(面板也看不到)。 */
|
|
215
|
+
export function AbsentCard(props) {
|
|
216
|
+
const target = props.target;
|
|
217
|
+
const row = target ? props.face.rows[target.key] : null;
|
|
218
|
+
const busy = row?.phase === 'installing';
|
|
219
|
+
const manual = row?.failure?.manual ?? row?.outcome?.manual ?? props.fallbackCommand;
|
|
220
|
+
const reason = row?.failure?.message ?? (row?.outcome && row.outcome.snapshot.blockedReason ? verdictOf(target, row.outcome.snapshot).text : null);
|
|
221
|
+
return React.createElement('div', { style: PANEL_STYLE.reco }, React.createElement('div', null, target ? '未安装[' + target.packageName + '],装上后这个页签就能用了。' : '这个页签对应的插件还没装。'), target
|
|
222
|
+
? React.createElement('button', {
|
|
223
|
+
type: 'button',
|
|
224
|
+
style: busy ? { ...PANEL_STYLE.btn, marginTop: 8, opacity: 0.55 } : { ...PANEL_STYLE.btn, marginTop: 8 },
|
|
225
|
+
disabled: busy,
|
|
226
|
+
onClick: () => props.face.act(target),
|
|
227
|
+
}, busy ? '正在装,请稍候…' : '装上')
|
|
228
|
+
: null, reason ? React.createElement('div', { style: PANEL_STYLE.reason }, reason) : null, React.createElement('code', { style: PANEL_STYLE.cmd }, manual));
|
|
229
|
+
}
|
|
230
|
+
export { MANAGER_ACTIONS };
|
|
231
|
+
//# sourceMappingURL=update-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-panel.js","sourceRoot":"","sources":["../src/update-panel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE9F,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGzF,uCAAuC;AACvC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,yCAAyC,EAAyB;IACrI,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAyB;IACpI,OAAO,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAyB;IACxF,IAAI,EAAE,EAAE,KAAK,EAAE,2CAA2C,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAyB;IACpI,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAyB;IAC/F,GAAG,EAAE;QACH,MAAM,EAAE,0DAA0D;QAClE,UAAU,EAAE,aAAa;QACzB,KAAK,EAAE,yCAAyC;QAChD,YAAY,EAAE,GAAG;QACjB,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,SAAS;KACK;IACxB,SAAS,EAAE;QACT,UAAU,EAAE,yCAAyC;QACrD,WAAW,EAAE,aAAa;QAC1B,KAAK,EAAE,MAAM;QACb,UAAU,EAAE,GAAG;KACO;IACxB,IAAI,EAAE;QACJ,OAAO,EAAE,WAAW;QACpB,YAAY,EAAE,EAAE;QAChB,MAAM,EAAE,2DAA2D;QACnE,KAAK,EAAE,2CAA2C;QAClD,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,GAAG;KACO;IACxB,GAAG,EAAE;QACH,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,UAAU;QACnB,YAAY,EAAE,CAAC;QACf,UAAU,EAAE,iDAAiD;QAC7D,KAAK,EAAE,yCAAyC;QAChD,UAAU,EAAE,gDAAgD;QAC5D,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;KACK;IACxB,GAAG,EAAE;QACH,MAAM,EAAE,0DAA0D;QAClE,UAAU,EAAE,aAAa;QACzB,KAAK,EAAE,yCAAyC;QAChD,YAAY,EAAE,CAAC;QACf,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,SAAS;KACK;IACxB,MAAM,EAAE;QACN,OAAO,EAAE,WAAW;QACpB,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,CAAC;QACf,MAAM,EAAE,2DAA2D;QACnE,UAAU,EAAE,+CAA+C;QAC3D,KAAK,EAAE,yCAAyC;QAChD,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,GAAG;KACO;IACxB,GAAG,EAAE;QACH,OAAO,EAAE,WAAW;QACpB,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,EAAE;QAChB,MAAM,EAAE,yDAAyD;QACjE,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,GAAG;KACO;IACxB,OAAO,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,EAAyB;IACpE,OAAO,EAAE,EAAE,KAAK,EAAE,2CAA2C,EAAE,QAAQ,EAAE,EAAE,EAAyB;IACpG,MAAM,EAAE,EAAE,KAAK,EAAE,+CAA+C,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAyB;IACrH,KAAK,EAAE,EAAE,KAAK,EAAE,0CAA0C,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAyB;CAChH,CAAC;AAmBF,MAAM,IAAI,GAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAE7E,SAAS,aAAa,CAAC,OAA8B;IACnD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAwB,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAiC,EAAE,CAAC,CAAC;IAC3E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,GAAG,EAAE;YACV,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACd,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,GAAW,EAAE,IAAoB,EAAE,EAAE;QACpE,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACtC,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,IAAI,GAAG,OAAO,CAAC;QACrB,KAAK,MAAM,MAAM,IAAI,IAAI;YAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/H,KAAK,OAAO,CAAC,GAAG,CACd,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;YACpD,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAChJ,CAAC,CAAC,CACH,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAC3B,CAAC,MAAkB,EAAE,EAAE;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;QACzC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,aAAa,IAAI,IAAI,CAAC;YAC9D,IAAI,MAAM,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC/B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;gBACrD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;oBAChB,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;oBACxE,OAAO;gBACT,CAAC;gBACD,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClF,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;YACjD,CAAC;YACD,MAAM,MAAM,GAAG,MAAM;gBACnB,CAAC,CAAC,MAAM,aAAa,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;gBACvD,CAAC,CAAC,MAAM,eAAe,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YACrD,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;gBACd,2CAA2C;gBAC3C,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC9E,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;gBACvJ,OAAO;YACT,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;gBAChB,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,IAAI,EAAE;aACjF,CAAC,CAAC;QACL,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,EACD,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAC/B,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AACvE,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,iBAAiB,CAAC,KAAwC;IACxE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;IACnD,MAAM,QAAQ,GAAG,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,aAAa,CACxB,QAAQ,EACR;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG;QAC5F,QAAQ;QACR,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,0BAA0B;KAClC,EACD,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAC3B,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,SAAS,cAAc,CAAC,KAAwC;IAC9D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;QACrD,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1D,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,KAAK,CAAC,aAAa,CACxB,KAAK,EACL,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,EAC7B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CACrF,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,aAAa,CAAC,KAAwC;IACpE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;IAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;IAChG,IAAI,SAAS;QAAE,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC;IACxG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,KAAK,CAAC,aAAa,CACxB,KAAK,EACL,IAAI,EACJ,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EACzD,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC;QAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9D,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC;QAClE,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,KAAK,YAAY,CAAC;QACxC,OAAO,KAAK,CAAC,aAAa,CACxB,KAAK,EACL,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,EAC3C,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,EACrG,KAAK,CAAC,aAAa,CACjB,KAAK,EACL,EAAE,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,EAC9B,KAAK;YACH,MAAM,CAAC,QAAQ,EAAE,cAAc,IAAI,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC;YAClE,QAAQ;YACR,MAAM,CAAC,QAAQ,EAAE,aAAa,IAAI,IAAI,CAAC,CAC1C,EACD,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EACjG,OAAO,EAAE,MAAM;YACb,CAAC,CAAC,KAAK,CAAC,aAAa,CACjB,QAAQ,EACR;gBACE,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE;gBAC1F,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;aACtC,EACD,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAC7C;YACH,CAAC,CAAC,IAAI,EACR,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAC5G,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACjD,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CACnF,EACD,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAChF,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,UAAU,CAAC,KAI1B;IACC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,MAAM,IAAI,GAAG,GAAG,EAAE,KAAK,KAAK,YAAY,CAAC;IACzC,MAAM,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC;IACrF,MAAM,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,MAAoB,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjK,OAAO,KAAK,CAAC,aAAa,CACxB,KAAK,EACL,EAAE,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,EAC3B,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC,eAAe,CAAC,EAC3G,MAAM;QACJ,CAAC,CAAC,KAAK,CAAC,aAAa,CACjB,QAAQ,EACR;YACE,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE;YACxG,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;SACtC,EACD,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CACzB;QACH,CAAC,CAAC,IAAI,EACR,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EACjF,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAChE,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface UpdateTarget {
|
|
2
|
+
/** 稳定键(= 导航表的 `skill`;总管自己用 `life-pack`)。 */
|
|
3
|
+
readonly key: string;
|
|
4
|
+
/** 中文名(面板行首用)。 */
|
|
5
|
+
readonly title: string;
|
|
6
|
+
/** 更新与安装的目标包。 */
|
|
7
|
+
readonly packageName: string;
|
|
8
|
+
/** 更新包的电话名前缀(七个必须互不相同,否则串台)。 */
|
|
9
|
+
readonly phonePrefix: string;
|
|
10
|
+
}
|
|
11
|
+
/** 总管自己的键:不占六个技能的键名。 */
|
|
12
|
+
export declare const MANAGER_TARGET_KEY: "life-pack";
|
|
13
|
+
/** 七个目标:总管自己在前,六家按导航表顺序。 */
|
|
14
|
+
export declare const UPDATE_TARGETS: readonly UpdateTarget[];
|
|
15
|
+
/** 按包名取一个目标(总管自有的「装上」电话只认这七个,别的一律拒绝)。 */
|
|
16
|
+
export declare function targetFor(packageName: string): UpdateTarget | undefined;
|
|
17
|
+
//# sourceMappingURL=update-targets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-targets.d.ts","sourceRoot":"","sources":["../src/update-targets.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,kBAAkB;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iBAAiB;IACjB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,gCAAgC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAwB;AACxB,eAAO,MAAM,kBAAkB,EAAG,WAAoB,CAAC;AAEvD,4BAA4B;AAC5B,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAQjD,CAAC;AAEF,yCAAyC;AACzC,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAEvE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** 七个更新目标(总管自己 + 六个单品),以及每个目标的电话名前缀。
|
|
2
|
+
*
|
|
3
|
+
* 为什么要这张表:更新包一次只管一个**目标包**(`createHostUpdate` 的 `targetPackageName`),
|
|
4
|
+
* 面板的「一个按钮查七家」要七组电话;七组之间靠**各自的前缀**与**各自的插件标识**隔离
|
|
5
|
+
* (更新包 README 第 12 节:前缀相同就是串台)。
|
|
6
|
+
*
|
|
7
|
+
* 包名不新开一处定义:六个单品的包名取自 `nav.ts` 的 `MANAGER_TABS`(导航表是唯一真相),
|
|
8
|
+
* 总管自己的包名取自 `install.ts` 的 `MANAGER_PACKAGE`。
|
|
9
|
+
* 安装与更新的单位都是**插件包**:技能包是插件包精确 pin 的传递依赖,不单独查更新。
|
|
10
|
+
*/
|
|
11
|
+
import { MANAGER_PACKAGE } from './install.js';
|
|
12
|
+
import { MANAGER_TABS } from './nav.js';
|
|
13
|
+
/** 总管自己的键:不占六个技能的键名。 */
|
|
14
|
+
export const MANAGER_TARGET_KEY = 'life-pack';
|
|
15
|
+
/** 七个目标:总管自己在前,六家按导航表顺序。 */
|
|
16
|
+
export const UPDATE_TARGETS = [
|
|
17
|
+
{ key: MANAGER_TARGET_KEY, title: '爱生活', packageName: MANAGER_PACKAGE, phonePrefix: 'ilife-life-pack' },
|
|
18
|
+
...MANAGER_TABS.map((tab) => ({
|
|
19
|
+
key: tab.skill,
|
|
20
|
+
title: tab.title,
|
|
21
|
+
packageName: tab.plugin,
|
|
22
|
+
phonePrefix: 'ilife-' + tab.skill,
|
|
23
|
+
})),
|
|
24
|
+
];
|
|
25
|
+
/** 按包名取一个目标(总管自有的「装上」电话只认这七个,别的一律拒绝)。 */
|
|
26
|
+
export function targetFor(packageName) {
|
|
27
|
+
return UPDATE_TARGETS.find((target) => target.packageName === packageName);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=update-targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-targets.js","sourceRoot":"","sources":["../src/update-targets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAaxC,wBAAwB;AACxB,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAoB,CAAC;AAEvD,4BAA4B;AAC5B,MAAM,CAAC,MAAM,cAAc,GAA4B;IACrD,EAAE,GAAG,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE;IACvG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5B,GAAG,EAAE,GAAG,CAAC,KAAK;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,WAAW,EAAE,GAAG,CAAC,MAAM;QACvB,WAAW,EAAE,QAAQ,GAAG,GAAG,CAAC,KAAK;KAClC,CAAC,CAAC;CACJ,CAAC;AAEF,yCAAyC;AACzC,MAAM,UAAU,SAAS,CAAC,WAAmB;IAC3C,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/** 面板的视图逻辑(纯函数:无 DOM、无 node、无 react),客户端与单测共用同一份。
|
|
2
|
+
*
|
|
3
|
+
* 判定「有没有新版」不自己算版本号大小:更新核心已经在快照里给了结论
|
|
4
|
+
* (`canInstall` 为真即有新版可装,`blockedReason` 非空即为什么装不了,见更新包 README 第 8 节),
|
|
5
|
+
* 本文件只把结论翻成三种状态与一句话,不另起一套版本比较。
|
|
6
|
+
*/
|
|
7
|
+
import type { CheckReceipt, UpdateSnapshot } from 'dsh-plugin-update';
|
|
8
|
+
/** 一个更新目标的面板数据(宿主 `ilife-manager.targets` 的每行)。 */
|
|
9
|
+
export interface TargetInfo {
|
|
10
|
+
readonly key: string;
|
|
11
|
+
readonly title: string;
|
|
12
|
+
readonly packageName: string;
|
|
13
|
+
readonly phones: {
|
|
14
|
+
readonly status: string;
|
|
15
|
+
readonly check: string;
|
|
16
|
+
readonly install: string;
|
|
17
|
+
} | null;
|
|
18
|
+
/** 宿主启动那一刻磁盘上的版本;null = 启动时这个包还没装。 */
|
|
19
|
+
readonly runningVersion: string | null;
|
|
20
|
+
readonly installedVersion: string | null;
|
|
21
|
+
/** 技能包随插件的那条精确 pin(插件包 manifest 里的 `skill-*` 依赖)。 */
|
|
22
|
+
readonly skill: {
|
|
23
|
+
readonly packageName: string;
|
|
24
|
+
readonly version: string;
|
|
25
|
+
} | null;
|
|
26
|
+
}
|
|
27
|
+
/** 更新电话查到的结果(`updateCheck` / `updateStatus` 回包体)。 */
|
|
28
|
+
export interface CheckOutcome {
|
|
29
|
+
readonly snapshot: UpdateSnapshot;
|
|
30
|
+
readonly manual: string | null;
|
|
31
|
+
readonly receipt: CheckReceipt | null;
|
|
32
|
+
}
|
|
33
|
+
/** 缺席:宿主启动时没装、现在磁盘上也没有(`runningVersion`/`installedVersion` 都是 null)。 */
|
|
34
|
+
export declare function isAbsent(target: TargetInfo): boolean;
|
|
35
|
+
export type VerdictKind = 'unknown' | 'up-to-date' | 'update-available' | 'blocked';
|
|
36
|
+
export interface Verdict {
|
|
37
|
+
readonly kind: VerdictKind;
|
|
38
|
+
/** 一句话结论(面板那行正文)。 */
|
|
39
|
+
readonly text: string;
|
|
40
|
+
/** 这一行给不给按钮:缺席给「装上」,有新版给「装上更新」,其余不给。 */
|
|
41
|
+
readonly action: 'install' | 'update' | null;
|
|
42
|
+
}
|
|
43
|
+
/** 把快照翻成一行结论:还没查 / 已是最新 / 有新版 / 装不了(附人话原因)。 */
|
|
44
|
+
export declare function verdictOf(target: TargetInfo, snapshot: UpdateSnapshot): Verdict;
|
|
45
|
+
/** 待重启横幅文案(更新包 README 第 10 节:说清新版号与「重启后才生效」两件事)。 */
|
|
46
|
+
export declare function pendingRestartText(target: TargetInfo, snapshot: UpdateSnapshot): string | null;
|
|
47
|
+
/** 面板展示的那条可复制命令(用户会照着敲的那一条)。
|
|
48
|
+
*
|
|
49
|
+
* 缺席包给人人都会用的**单命令双包**口径(#674 冻结的装入口径:不带版本号、不带任何开关);
|
|
50
|
+
* 已装包给更新包回包里那条(`--save-exact ... --registry=` 是它 README 第 9 节的冻结合同,
|
|
51
|
+
* 本仓不动它——要改只能提上游)。规范词见 docs/plugins/plugin-manager/t678-缺席即装与检查更新.md。 */
|
|
52
|
+
export declare function manualForDisplay(target: TargetInfo, manual: string | null): string | null;
|
|
53
|
+
/** 版本行两行文字:插件包(本家) + 技能包(随插件,不单独查更新)。 */
|
|
54
|
+
export declare function versionLines(target: TargetInfo, snapshot: UpdateSnapshot | null): readonly string[];
|
|
55
|
+
//# sourceMappingURL=update-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-view.d.ts","sourceRoot":"","sources":["../src/update-view.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAiB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIrF,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACtG,sCAAsC;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACnF;AAED,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CACvC;AAED,wEAAwE;AACxE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAEpD;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,kBAAkB,GAAG,SAAS,CAAC;AAEpF,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,qBAAqB;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC;CAC9C;AAED,+CAA+C;AAC/C,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAuB/E;AAED,oDAAoD;AACpD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAO9F;AAED;;;;yEAIyE;AACzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAGzF;AAED,yCAAyC;AACzC,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,MAAM,EAAE,CAOnG"}
|