dsh-life-pack 0.2.2 → 0.2.4
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 +543 -14
- package/dist/client.js.map +1 -1
- package/dist/dsh-ctx.d.ts +10 -1
- package/dist/dsh-ctx.d.ts.map +1 -1
- package/dist/health-contract.d.ts +58 -0
- package/dist/health-contract.d.ts.map +1 -0
- package/dist/health-contract.js +64 -0
- package/dist/health-contract.js.map +1 -0
- package/dist/health-fetch.d.ts +36 -0
- package/dist/health-fetch.d.ts.map +1 -0
- package/dist/health-fetch.js +49 -0
- package/dist/health-fetch.js.map +1 -0
- package/dist/health-panel.d.ts +25 -0
- package/dist/health-panel.d.ts.map +1 -0
- package/dist/health-panel.js +63 -0
- package/dist/health-panel.js.map +1 -0
- package/dist/health-view.d.ts +54 -0
- package/dist/health-view.d.ts.map +1 -0
- package/dist/health-view.js +193 -0
- package/dist/health-view.js.map +1 -0
- package/dist/nav.d.ts +1 -1
- package/dist/nav.js +1 -1
- package/dist/update-client.d.ts.map +1 -1
- package/dist/update-client.js +2 -1
- package/dist/update-client.js.map +1 -1
- package/dist/update-contract.d.ts +4 -2
- package/dist/update-contract.d.ts.map +1 -1
- package/dist/update-contract.js +4 -2
- package/dist/update-contract.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/** 配置体检:各家技能回给面板的那份报告的形状(唯一真相在技能侧,本件只是面板侧镜像)。
|
|
2
|
+
*
|
|
3
|
+
* 为什么形状这样定(票 #706「开工前的形状裁定」第一条):**判据住技能侧**。
|
|
4
|
+
* 每条检查项的有效值只有技能源码算得出来(例:`resolveDbDir()` 里「空串=按默认落点」),
|
|
5
|
+
* 插件包对技能的全部能力是 spawn `cmd_read` 与读 stdout 信封,看不到那些算式。所以:
|
|
6
|
+
*
|
|
7
|
+
* 技能侧出**判据**(每条给红/黄/绿 + 一句话 + 去哪修);
|
|
8
|
+
* 插件包出**透传**(把技能回执原样交回,不重写一个字);
|
|
9
|
+
* 总管出**总览与渲染**(零特例:不认任何一家,只认下面这个形状)。
|
|
10
|
+
*
|
|
11
|
+
* 于是「同一份数据、不许两处各算一遍」是结构上的性质:面板一次取数拿到六份报告,
|
|
12
|
+
* 总览一行与各家那张表都从同一个快照读(见 `health-panel.ts` 的单一状态源)。
|
|
13
|
+
*
|
|
14
|
+
* 三档判据的语义(照检查表 `docs/research/check-table-671-life-panel-20260917.html`):
|
|
15
|
+
* · `red`=现在用不了,必须去修;
|
|
16
|
+
* · `yellow`=现在这状态能用,但有人真去用那个功能时会撞上(例:照片目录没配);
|
|
17
|
+
* · `green`=正常。
|
|
18
|
+
*/
|
|
19
|
+
/** 体检出口:技能侧在**进分派层之前**拦下的那一类只读命令名(照三个配置命令的先例)。
|
|
20
|
+
*
|
|
21
|
+
* 载荷:入参 `{}`;回包 `{report}`(技能侧 envelope 的 `data`)。**只报不改**:
|
|
22
|
+
* 不建目录、不写文件、不落默认配置——凡是要建目录才算得出的结论,一律当「不在」报。 */
|
|
23
|
+
export const HEALTH_CHECK_KEY = 'config.check';
|
|
24
|
+
/** 面板第二段参数(与各家的端点名同值,和各家的 `RPC_CHANNEL` 配成一次调用)。 */
|
|
25
|
+
export const HEALTH_ENDPOINT = 'config.check';
|
|
26
|
+
/** 三档排序:数字大的更严重(总览一行取**最严重**那档当那一家的灯)。 */
|
|
27
|
+
const RANK = { green: 0, yellow: 1, red: 2 };
|
|
28
|
+
/** 一家的总判据:全部项里最严重的那一档;一条都没有时回 `null`(不冒充绿)。 */
|
|
29
|
+
export function worstStatus(items) {
|
|
30
|
+
let worst = null;
|
|
31
|
+
for (const item of items) {
|
|
32
|
+
if (worst === null || RANK[item.status] > RANK[worst])
|
|
33
|
+
worst = item.status;
|
|
34
|
+
}
|
|
35
|
+
return worst;
|
|
36
|
+
}
|
|
37
|
+
/** 三档计数(面板那一行「红 N 黄 N」用的就是它)。 */
|
|
38
|
+
export function countByStatus(items) {
|
|
39
|
+
const out = { red: 0, yellow: 0, green: 0 };
|
|
40
|
+
for (const item of items)
|
|
41
|
+
out[item.status] += 1;
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
/** 回执校验:面板只渲染自己认得的形状,认不出即报「回执异常」,不猜、不返空冒充正常。 */
|
|
45
|
+
export function isHealthReport(raw) {
|
|
46
|
+
if (typeof raw !== 'object' || raw === null)
|
|
47
|
+
return false;
|
|
48
|
+
const report = raw;
|
|
49
|
+
if (typeof report.skill !== 'string' || report.skill.length === 0)
|
|
50
|
+
return false;
|
|
51
|
+
if (typeof report.configPath !== 'string' || typeof report.dataDir !== 'string')
|
|
52
|
+
return false;
|
|
53
|
+
if (!Array.isArray(report.items))
|
|
54
|
+
return false;
|
|
55
|
+
return report.items.every((item) => {
|
|
56
|
+
if (typeof item !== 'object' || item === null)
|
|
57
|
+
return false;
|
|
58
|
+
const row = item;
|
|
59
|
+
return typeof row.id === 'string' && typeof row.title === 'string'
|
|
60
|
+
&& (row.status === 'red' || row.status === 'yellow' || row.status === 'green')
|
|
61
|
+
&& typeof row.message === 'string' && typeof row.action === 'string';
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=health-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-contract.js","sourceRoot":"","sources":["../src/health-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AA+BH;;;+CAG+C;AAC/C,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAuB,CAAC;AAExD,oDAAoD;AACpD,MAAM,CAAC,MAAM,eAAe,GAAG,cAAuB,CAAC;AAEvD,0CAA0C;AAC1C,MAAM,IAAI,GAA2C,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAErF,+CAA+C;AAC/C,MAAM,UAAU,WAAW,CAAC,KAA4B;IACtD,IAAI,KAAK,GAAwB,IAAI,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAAE,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;IAC7E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iCAAiC;AACjC,MAAM,UAAU,aAAa,CAAC,KAA4B;IACxD,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,MAAM,GAAG,GAA4B,CAAC;IAC5C,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAChF,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9F,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAa,EAAE,EAAE;QAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QAC5D,MAAM,GAAG,GAAG,IAA2B,CAAC;QACxC,OAAO,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;eAC7D,CAAC,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC;eAC3E,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { HealthReport } from './health-contract.js';
|
|
2
|
+
/** 传输口(DSH 载体 `connection.rpc.call` 的形状,cookbook §6)。 */
|
|
3
|
+
export type HealthCallFace = (channel: string, endpoint: string, payload: unknown, signal?: AbortSignal) => Promise<{
|
|
4
|
+
readonly ok: true;
|
|
5
|
+
readonly value: unknown;
|
|
6
|
+
} | {
|
|
7
|
+
readonly ok: false;
|
|
8
|
+
readonly error: {
|
|
9
|
+
readonly code: string;
|
|
10
|
+
readonly message: string;
|
|
11
|
+
readonly details: Record<string, unknown>;
|
|
12
|
+
};
|
|
13
|
+
}>;
|
|
14
|
+
/** 一次取数的时限(毫秒):技能侧 spawn 上限 20 s,这里留一点余量。 */
|
|
15
|
+
export declare const HEALTH_TIMEOUT_MS: 25000;
|
|
16
|
+
/** 一家的一行:报告取到了就是 `report`,取不到就是 `error`(缺席的包不进这张表)。 */
|
|
17
|
+
export interface HealthFetchRow {
|
|
18
|
+
/** 该家插件包名(=爱生活页签槽 id,也是缺席判定的那个 join 键)。 */
|
|
19
|
+
readonly id: string;
|
|
20
|
+
readonly report: HealthReport | null;
|
|
21
|
+
readonly error: string | null;
|
|
22
|
+
}
|
|
23
|
+
/** 一次取数的结果:每家一行(顺序照页签顺序)。 */
|
|
24
|
+
export interface HealthFetchResult {
|
|
25
|
+
readonly rows: readonly HealthFetchRow[];
|
|
26
|
+
/** 取数过程本身的错(通道缺席之类),不是某一家的问题。 */
|
|
27
|
+
readonly error: string | null;
|
|
28
|
+
}
|
|
29
|
+
/** 账本条目里本票要用的那一段(页签槽注册时写进 options)。 */
|
|
30
|
+
export interface HealthTabRow {
|
|
31
|
+
readonly id: string;
|
|
32
|
+
readonly channel: string;
|
|
33
|
+
}
|
|
34
|
+
/** 取六家的体检报告(缺席的包不在此列,由调用方按账本判断)。 */
|
|
35
|
+
export declare function loadHealthReports(call: HealthCallFace | null, tabs: readonly HealthTabRow[]): Promise<HealthFetchResult>;
|
|
36
|
+
//# sourceMappingURL=health-fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-fetch.d.ts","sourceRoot":"","sources":["../src/health-fetch.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,yDAAyD;AACzD,MAAM,MAAM,cAAc,GAAG,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CACR;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;CAAE,CACzI,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,iBAAiB,EAAG,KAAe,CAAC;AAEjD,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,6BAA6B;AAC7B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,CAAC;IACzC,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AA4BD,oCAAoC;AACpC,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAO9H"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** 面板到各家的配置体检:一次取数、六份报告(纯异步函数:无 DOM、无 react;传输口注入,便于单测)。
|
|
2
|
+
*
|
|
3
|
+
* 三条纪律:
|
|
4
|
+
* · **只走各家自己的通道**(`rpc.call(channel, HEALTH_ENDPOINT, …)`)——总管不认任何一家、也不加
|
|
5
|
+
* 任何单品的依赖;通道名从「爱生活页签槽」的账本条目带出来(各家注册时写进 options)。
|
|
6
|
+
* · **一次取数,六份报告**:总览那行与各家那张表读的是同一份结果(见 `health-panel.ts` 的单一状态源),
|
|
7
|
+
* 不许两处各算一遍。
|
|
8
|
+
* · 有界超时:一家不回不该拖死整屏(技能侧 spawn 上限 20 s,这里给 25 s)。
|
|
9
|
+
*/
|
|
10
|
+
import { HEALTH_ENDPOINT, isHealthReport } from './health-contract.js';
|
|
11
|
+
/** 一次取数的时限(毫秒):技能侧 spawn 上限 20 s,这里留一点余量。 */
|
|
12
|
+
export const HEALTH_TIMEOUT_MS = 25_000;
|
|
13
|
+
function timeoutText() {
|
|
14
|
+
return '体检超时(' + String(Math.round(HEALTH_TIMEOUT_MS / 1000)) + 's):技能没在时限内回话。';
|
|
15
|
+
}
|
|
16
|
+
async function fetchOne(call, row) {
|
|
17
|
+
try {
|
|
18
|
+
const result = await call(row.channel, HEALTH_ENDPOINT, {}, AbortSignal.timeout(HEALTH_TIMEOUT_MS));
|
|
19
|
+
if (!result || typeof result !== 'object' || typeof result.ok !== 'boolean') {
|
|
20
|
+
return { report: null, error: '回执信封异常(非 ok 信封)。' };
|
|
21
|
+
}
|
|
22
|
+
if (!result.ok) {
|
|
23
|
+
const error = result.error;
|
|
24
|
+
const message = typeof error?.message === 'string' && error.message.length > 0 ? error.message : '体检没跑起来。';
|
|
25
|
+
return { report: null, error: message };
|
|
26
|
+
}
|
|
27
|
+
const value = result.value;
|
|
28
|
+
if (!isHealthReport(value))
|
|
29
|
+
return { report: null, error: '体检报告形状认不出(技能包与总管版本对不上?)。' };
|
|
30
|
+
return { report: value, error: null };
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError')) {
|
|
34
|
+
return { report: null, error: timeoutText() };
|
|
35
|
+
}
|
|
36
|
+
return { report: null, error: '体检没跑起来:' + (error instanceof Error ? error.message : String(error)) };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** 取六家的体检报告(缺席的包不在此列,由调用方按账本判断)。 */
|
|
40
|
+
export async function loadHealthReports(call, tabs) {
|
|
41
|
+
if (typeof call !== 'function')
|
|
42
|
+
return { rows: [], error: '宿主连接缺席:connection.rpc.call 不可用' };
|
|
43
|
+
const rows = await Promise.all(tabs.map(async (tab) => {
|
|
44
|
+
const one = await fetchOne(call, tab);
|
|
45
|
+
return { id: tab.id, report: one.report, error: one.error };
|
|
46
|
+
}));
|
|
47
|
+
return { rows, error: null };
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=health-fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-fetch.js","sourceRoot":"","sources":["../src/health-fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAcvE,6CAA6C;AAC7C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAe,CAAC;AAuBjD,SAAS,WAAW;IAClB,OAAO,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,GAAG,eAAe,CAAC;AAClF,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAoB,EAAE,GAAiB;IAC7D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACpG,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAQ,MAA2B,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAClG,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,KAAK,GAAI,MAA4D,CAAC,KAAK,CAAC;YAClF,MAAM,OAAO,GAAG,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3G,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC1C,CAAC;QACD,MAAM,KAAK,GAAI,MAA8B,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;QACvF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,CAAC;YAC7F,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;QAChD,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IACvG,CAAC;AACH,CAAC;AAED,oCAAoC;AACpC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAA2B,EAAE,IAA6B;IAChG,IAAI,OAAO,IAAI,KAAK,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;IAC7F,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAA2B,EAAE;QAC7E,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IAC9D,CAAC,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { HealthCallFace, HealthTabRow } from './health-fetch.js';
|
|
2
|
+
import type { HealthReport, HealthStatus } from './health-contract.js';
|
|
3
|
+
/** 一家的状态:没跑过/正在跑/有报告/这一家出错。 */
|
|
4
|
+
export type HealthPhase = 'idle' | 'running' | 'ready' | 'failed';
|
|
5
|
+
export interface HealthPanelFace {
|
|
6
|
+
/** 一次取数的结果:包名 → 该家的状态(缺席的包不在表里)。 */
|
|
7
|
+
readonly rows: Readonly<Record<string, {
|
|
8
|
+
readonly phase: HealthPhase;
|
|
9
|
+
readonly report: HealthReport | null;
|
|
10
|
+
readonly error: string | null;
|
|
11
|
+
}>>;
|
|
12
|
+
/** 取数过程本身的错(通道缺席之类)。 */
|
|
13
|
+
readonly error: string | null;
|
|
14
|
+
/** 正在跑。 */
|
|
15
|
+
readonly running: boolean;
|
|
16
|
+
/** 跑一次(六家一起)。 */
|
|
17
|
+
run(): void;
|
|
18
|
+
}
|
|
19
|
+
/** 一家的灯:没报告=`null`(不冒充绿)。 */
|
|
20
|
+
export declare function lightOf(row: {
|
|
21
|
+
readonly report: HealthReport | null;
|
|
22
|
+
} | undefined): HealthStatus | null;
|
|
23
|
+
/** 体检状态源:挂载时不自动跑(体检要读盘、要起子进程,按需跑),点一次跑六家。 */
|
|
24
|
+
export declare function useHealthPanel(getCall: () => HealthCallFace | null, tabs: readonly HealthTabRow[]): HealthPanelFace;
|
|
25
|
+
//# sourceMappingURL=health-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-panel.d.ts","sourceRoot":"","sources":["../src/health-panel.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEvE,+BAA+B;AAC/B,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC,CAAC;IAC9I,wBAAwB;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW;IACX,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,iBAAiB;IACjB,GAAG,IAAI,IAAI,CAAC;CACb;AAID,6BAA6B;AAC7B,wBAAgB,OAAO,CAAC,GAAG,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CAEtG;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,cAAc,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,YAAY,EAAE,GAAG,eAAe,CAyCnH"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** 配置体检的状态源:**一份快照**喂两处(面板顶部那行总览 + 各家页签那张表)。
|
|
2
|
+
*
|
|
3
|
+
* 为什么是一个 hook 而不是两处各取一次(票 #706 验收第三条「同一份数据,不许两处各算一遍」):
|
|
4
|
+
* 这一处取数、这一处存状态,总览与各家表都从它读 —— 那条验收因此是**结构上的性质**,不是靠自觉。
|
|
5
|
+
*
|
|
6
|
+
* 取数是**按需**的(点「体检一次」才跑):没有轮询、没有定时器(静态门那条「无数据轮询」照旧)。
|
|
7
|
+
*/
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
import { loadHealthReports } from './health-fetch.js';
|
|
10
|
+
import { worstStatus } from './health-contract.js';
|
|
11
|
+
const IDLE = { phase: 'idle', report: null, error: null };
|
|
12
|
+
/** 一家的灯:没报告=`null`(不冒充绿)。 */
|
|
13
|
+
export function lightOf(row) {
|
|
14
|
+
return row?.report ? worstStatus(row.report.items) : null;
|
|
15
|
+
}
|
|
16
|
+
/** 体检状态源:挂载时不自动跑(体检要读盘、要起子进程,按需跑),点一次跑六家。 */
|
|
17
|
+
export function useHealthPanel(getCall, tabs) {
|
|
18
|
+
const [rows, setRows] = React.useState({});
|
|
19
|
+
const [error, setError] = React.useState(null);
|
|
20
|
+
const [running, setRunning] = React.useState(false);
|
|
21
|
+
const run = React.useCallback(() => {
|
|
22
|
+
const diag = globalThis.__T706_RUN__;
|
|
23
|
+
if (Array.isArray(diag))
|
|
24
|
+
diag.push('run:tabs=' + String(tabs.length));
|
|
25
|
+
setRunning(true);
|
|
26
|
+
setError(null);
|
|
27
|
+
const targets = tabs;
|
|
28
|
+
setRows(Object.fromEntries(targets.map((tab) => [tab.id, { ...IDLE, phase: 'running' }])));
|
|
29
|
+
void (async () => {
|
|
30
|
+
const loaded = await loadHealthReports(getCall(), targets);
|
|
31
|
+
// 渲染台的调试图(浏览器里没人写它,写入失败无所谓):只记条数与第一条的错。
|
|
32
|
+
try {
|
|
33
|
+
const diag = globalThis.__T706_RUN__;
|
|
34
|
+
if (Array.isArray(diag))
|
|
35
|
+
diag.push('rows=' + String(loaded.rows.length) + ' err=' + String(loaded.error) + ' first=' + String(loaded.rows[0]?.error ?? 'null'));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
/* 调试图写不进去不影响正经事 */
|
|
39
|
+
}
|
|
40
|
+
const next = {};
|
|
41
|
+
for (const row of loaded.rows) {
|
|
42
|
+
next[row.id] = { phase: row.report ? 'ready' : 'failed', report: row.report, error: row.error };
|
|
43
|
+
}
|
|
44
|
+
setRows(next);
|
|
45
|
+
setError(loaded.error);
|
|
46
|
+
setRunning(false);
|
|
47
|
+
})();
|
|
48
|
+
}, [getCall, tabs]);
|
|
49
|
+
const face = { rows, error, running, run };
|
|
50
|
+
// 出图页的取数口(渲染台的 hooks 替身没有真事件环,页内点按钮那条路不落定取数)。
|
|
51
|
+
// 只在有人预先挂了 `__T706_FACE_SINK__` 时写一次,浏览器里没人挂它,等于没有这一行。
|
|
52
|
+
const sink = globalThis.__T706_FACE_SINK__;
|
|
53
|
+
if (typeof sink === 'function') {
|
|
54
|
+
try {
|
|
55
|
+
sink(face);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
/* 出图口的错不影响正经渲染 */
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return face;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=health-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-panel.js","sourceRoot":"","sources":["../src/health-panel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** 配置体检的两个画法:面板顶部那行总览(六家一盏灯)+ 各家那张表。
|
|
2
|
+
*
|
|
3
|
+
* 面板侧纪律(沿 `client.ts`/`update-panel.ts` 既有口径):`createElement` 手写(禁 JSX)、内联 style、
|
|
4
|
+
* 颜色走 DSH 主题别名(深浅主题自适应,写死值只做回退)、不 import 任何单品包、不 import 技能实现。
|
|
5
|
+
*
|
|
6
|
+
* 判据与文案**全部来自各家技能的报告**,本件一个字都不重写——只按三档上色、按状态挑文案。
|
|
7
|
+
*/
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
import type { HealthReport, HealthStatus } from './health-contract.js';
|
|
10
|
+
export declare const HEALTH_STYLE: {
|
|
11
|
+
readonly box: React.CSSProperties;
|
|
12
|
+
readonly headRow: React.CSSProperties;
|
|
13
|
+
readonly head: React.CSSProperties;
|
|
14
|
+
/** 「体检一次」不挤在标题右端:它单独占一行、与标题同一起始边(视觉复评两轮点「孤立在右上缺层次」)。 */
|
|
15
|
+
readonly runRow: React.CSSProperties;
|
|
16
|
+
readonly btn: React.CSSProperties;
|
|
17
|
+
readonly lightsRow: React.CSSProperties;
|
|
18
|
+
readonly light: React.CSSProperties;
|
|
19
|
+
readonly lightIdle: React.CSSProperties;
|
|
20
|
+
readonly meta: React.CSSProperties;
|
|
21
|
+
readonly error: React.CSSProperties;
|
|
22
|
+
};
|
|
23
|
+
/** 「去哪修」那一行的正文:各家交回来的 action 里若已自带「去哪修:」,这里剥掉一层——
|
|
24
|
+
* 面板已经带了这个前缀,两边都写就会印成「去哪修:去哪修:…」。只剥开头那一次,别的一字不动。 */
|
|
25
|
+
export declare function actionText(action: string): string;
|
|
26
|
+
/** 一盏灯:一家一名一档(数到几个红黄绿)。点一下把面板切到那家的页签。 */
|
|
27
|
+
export interface HealthLightRow {
|
|
28
|
+
readonly id: string;
|
|
29
|
+
readonly title: string;
|
|
30
|
+
readonly status: HealthStatus | null;
|
|
31
|
+
readonly counts: Readonly<Record<HealthStatus, number>>;
|
|
32
|
+
}
|
|
33
|
+
/** 从六份报告数出那一行的灯(每家按最严重那一档上色)。 */
|
|
34
|
+
export declare function lightsOf(tabs: readonly {
|
|
35
|
+
readonly id: string;
|
|
36
|
+
readonly title: string;
|
|
37
|
+
}[], reports: Readonly<Record<string, HealthReport | undefined>>): readonly HealthLightRow[];
|
|
38
|
+
/** 顶部那行总览:六家一盏灯 + 一个「体检一次」按钮。 */
|
|
39
|
+
export declare function HealthOverview(props: {
|
|
40
|
+
readonly lights: readonly HealthLightRow[];
|
|
41
|
+
readonly running: boolean;
|
|
42
|
+
readonly error: string | null;
|
|
43
|
+
readonly onRun: () => void;
|
|
44
|
+
readonly onJump: (id: string) => void;
|
|
45
|
+
}): React.ReactElement;
|
|
46
|
+
/** 一家那张表:**要处理的**(红黄)一条一块、整行上底带一句话与「去哪修」;
|
|
47
|
+
* **正常的**(绿)收成一行并列的小字,点得到、扫得完(票面验收第一条:正常的收成一行,有问题的才展开)。 */
|
|
48
|
+
export declare function HealthTable(props: {
|
|
49
|
+
readonly title: string;
|
|
50
|
+
readonly phase: 'idle' | 'running' | 'ready' | 'failed';
|
|
51
|
+
readonly report: HealthReport | null;
|
|
52
|
+
readonly error: string | null;
|
|
53
|
+
}): React.ReactElement;
|
|
54
|
+
//# sourceMappingURL=health-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-view.d.ts","sourceRoot":"","sources":["../src/health-view.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAc,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAoCnF,eAAO,MAAM,YAAY;kBAMlB,KAAK,CAAC,aAAa;sBACyE,KAAK,CAAC,aAAa;mBAC7D,KAAK,CAAC,aAAa;IAC1E,wDAAwD;qBACpB,KAAK,CAAC,aAAa;kBASlD,KAAK,CAAC,aAAa;wBACoC,KAAK,CAAC,aAAa;oBAY1E,KAAK,CAAC,aAAa;wBAC4B,KAAK,CAAC,aAAa;mBACG,KAAK,CAAC,aAAa;oBACV,KAAK,CAAC,aAAa;CAC9F,CAAC;AAOX;qDACqD;AACrD,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,yCAAyC;AACzC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;CACzD;AAED,iCAAiC;AACjC,wBAAgB,QAAQ,CACtB,IAAI,EAAE,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,EAChE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,CAAC,CAAC,GAC1D,SAAS,cAAc,EAAE,CAU3B;AAWD,iCAAiC;AACjC,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,GAAG,KAAK,CAAC,YAAY,CA0ErB;AAOD;4DAC4D;AAC5D,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IACxD,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,GAAG,KAAK,CAAC,YAAY,CAgFrB"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/** 配置体检的两个画法:面板顶部那行总览(六家一盏灯)+ 各家那张表。
|
|
2
|
+
*
|
|
3
|
+
* 面板侧纪律(沿 `client.ts`/`update-panel.ts` 既有口径):`createElement` 手写(禁 JSX)、内联 style、
|
|
4
|
+
* 颜色走 DSH 主题别名(深浅主题自适应,写死值只做回退)、不 import 任何单品包、不 import 技能实现。
|
|
5
|
+
*
|
|
6
|
+
* 判据与文案**全部来自各家技能的报告**,本件一个字都不重写——只按三档上色、按状态挑文案。
|
|
7
|
+
*/
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
import { countByStatus, worstStatus } from './health-contract.js';
|
|
10
|
+
/** 三档的配色(绿走主题别名;红黄用实色,理由见下)。
|
|
11
|
+
*
|
|
12
|
+
* 红与黄为什么必须落在**不同明度带**上:这两档要一起出现在同一行灯里,用户扫一眼要能分开
|
|
13
|
+
* 「红了(用不了)」与「黄了(能用但要撞上)」。评审连着两轮点「黄灯偏暗与红相近」,所以:
|
|
14
|
+
* · 红=深红(暗、重);
|
|
15
|
+
* · 黄=高饱和的琥珀(亮、跳)——它在白底上的对比度仍然够(`#b45309` 对白 ≈ 4.9:1)。
|
|
16
|
+
* 绿不给底色:它是「正常」,不该和要处理的那两档抢注意力。 */
|
|
17
|
+
const STATUS_COLOR = {
|
|
18
|
+
red: '#c0392b',
|
|
19
|
+
yellow: '#e08a00',
|
|
20
|
+
green: 'var(--dsw-alias-state-success-primary, #4ec9a0)',
|
|
21
|
+
};
|
|
22
|
+
/** 整行底色的浅一档:饱和降一档,免得红黄行「刺眼」压过正文(评审第二轮的扣分点)。 */
|
|
23
|
+
const STATUS_TINT = {
|
|
24
|
+
red: 'rgba(192, 57, 43, 0.06)',
|
|
25
|
+
yellow: 'rgba(224, 138, 0, 0.10)',
|
|
26
|
+
green: 'transparent',
|
|
27
|
+
};
|
|
28
|
+
/** 档位词(灯里那几个字)用的色:红黄要**够深**才读得清,故另取一枚比灯更深的值。 */
|
|
29
|
+
const STATUS_TEXT = {
|
|
30
|
+
red: '#a5281b',
|
|
31
|
+
yellow: '#8a5200',
|
|
32
|
+
green: 'var(--dsw-alias-state-success-primary, #4ec9a0)',
|
|
33
|
+
};
|
|
34
|
+
const STATUS_LABEL = { red: '红', yellow: '黄', green: '绿' };
|
|
35
|
+
/** 面板上的文字色与分隔线(与 `client.ts` 同一套别名)。 */
|
|
36
|
+
const INK = 'var(--dsw-alias-label-primary, inherit)';
|
|
37
|
+
const INK_DIM = 'var(--dsw-alias-label-secondary, #9a9a9a)';
|
|
38
|
+
const BORDER = 'var(--dsw-alias-border, rgba(128,128,128,.35))';
|
|
39
|
+
export const HEALTH_STYLE = {
|
|
40
|
+
box: {
|
|
41
|
+
padding: '10px 12px',
|
|
42
|
+
marginBottom: 10,
|
|
43
|
+
borderRadius: 10,
|
|
44
|
+
border: '1px solid ' + BORDER,
|
|
45
|
+
},
|
|
46
|
+
headRow: { display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: 8, marginBottom: 4 },
|
|
47
|
+
head: { fontSize: 13, fontWeight: 700, color: INK },
|
|
48
|
+
/** 「体检一次」不挤在标题右端:它单独占一行、与标题同一起始边(视觉复评两轮点「孤立在右上缺层次」)。 */
|
|
49
|
+
runRow: { margin: '8px 0 10px' },
|
|
50
|
+
btn: {
|
|
51
|
+
border: '1px solid ' + BORDER,
|
|
52
|
+
background: 'transparent',
|
|
53
|
+
color: INK,
|
|
54
|
+
borderRadius: 8,
|
|
55
|
+
padding: '4px 12px',
|
|
56
|
+
fontSize: 13,
|
|
57
|
+
cursor: 'pointer',
|
|
58
|
+
},
|
|
59
|
+
lightsRow: { display: 'flex', flexWrap: 'wrap', gap: 8 },
|
|
60
|
+
light: {
|
|
61
|
+
display: 'inline-flex',
|
|
62
|
+
alignItems: 'center',
|
|
63
|
+
gap: 4,
|
|
64
|
+
background: 'transparent',
|
|
65
|
+
border: '1px solid ' + BORDER,
|
|
66
|
+
borderRadius: 999,
|
|
67
|
+
padding: '3px 10px',
|
|
68
|
+
fontSize: 12.5,
|
|
69
|
+
color: INK,
|
|
70
|
+
cursor: 'pointer',
|
|
71
|
+
},
|
|
72
|
+
lightIdle: { cursor: 'default', color: INK_DIM },
|
|
73
|
+
meta: { color: INK_DIM, fontSize: 12, lineHeight: 1.7, marginTop: 12 },
|
|
74
|
+
error: { color: STATUS_COLOR.red, fontSize: 12, lineHeight: 1.7, marginTop: 6 },
|
|
75
|
+
};
|
|
76
|
+
/** 值得一眼看见的那两档(档位名与整行文字都上色;绿行保持淡)。 */
|
|
77
|
+
function isAttention(status) {
|
|
78
|
+
return status === 'red' || status === 'yellow';
|
|
79
|
+
}
|
|
80
|
+
/** 「去哪修」那一行的正文:各家交回来的 action 里若已自带「去哪修:」,这里剥掉一层——
|
|
81
|
+
* 面板已经带了这个前缀,两边都写就会印成「去哪修:去哪修:…」。只剥开头那一次,别的一字不动。 */
|
|
82
|
+
export function actionText(action) {
|
|
83
|
+
const trimmed = action.trim();
|
|
84
|
+
return trimmed.startsWith('去哪修:') ? trimmed.slice(4).trim() : trimmed;
|
|
85
|
+
}
|
|
86
|
+
/** 从六份报告数出那一行的灯(每家按最严重那一档上色)。 */
|
|
87
|
+
export function lightsOf(tabs, reports) {
|
|
88
|
+
return tabs.map((tab) => {
|
|
89
|
+
const report = reports[tab.id];
|
|
90
|
+
return {
|
|
91
|
+
id: tab.id,
|
|
92
|
+
title: tab.title,
|
|
93
|
+
status: report ? worstStatus(report.items) : null,
|
|
94
|
+
counts: countByStatus(report?.items ?? []),
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/** 一家的一句话读数:「红 1 黄 2」,全绿就是「绿」。 */
|
|
99
|
+
function countsText(counts) {
|
|
100
|
+
const parts = [];
|
|
101
|
+
if (counts.red > 0)
|
|
102
|
+
parts.push('红 ' + String(counts.red));
|
|
103
|
+
if (counts.yellow > 0)
|
|
104
|
+
parts.push('黄 ' + String(counts.yellow));
|
|
105
|
+
if (parts.length === 0)
|
|
106
|
+
return '绿';
|
|
107
|
+
return parts.join(' · ');
|
|
108
|
+
}
|
|
109
|
+
/** 顶部那行总览:六家一盏灯 + 一个「体检一次」按钮。 */
|
|
110
|
+
export function HealthOverview(props) {
|
|
111
|
+
return React.createElement('div', { style: HEALTH_STYLE.box, 'data-ilife-health': 'overview' }, React.createElement('div', { style: HEALTH_STYLE.headRow }, React.createElement('div', { style: HEALTH_STYLE.head }, '配置体检')), React.createElement('div', { style: HEALTH_STYLE.runRow }, React.createElement('button', {
|
|
112
|
+
type: 'button',
|
|
113
|
+
style: props.running ? { ...HEALTH_STYLE.btn, opacity: 0.55, cursor: 'default' } : HEALTH_STYLE.btn,
|
|
114
|
+
disabled: props.running,
|
|
115
|
+
onClick: props.onRun,
|
|
116
|
+
title: '对六家各跑一次配置体检(只看不改:不建目录、不改配置)',
|
|
117
|
+
}, props.running ? '体检中…' : '体检一次')), React.createElement('div', { style: HEALTH_STYLE.lightsRow, 'data-ilife-health': 'lights' }, props.lights.map((light) => React.createElement('button', {
|
|
118
|
+
key: light.id,
|
|
119
|
+
type: 'button',
|
|
120
|
+
'data-ilife-health': 'light',
|
|
121
|
+
'data-skill': light.id,
|
|
122
|
+
// 档位落到按钮自身的边框与底色上:一眼扫过去先看到颜色,再读家名(票面验收:一屏看红黄)。
|
|
123
|
+
style: light.status === null
|
|
124
|
+
? { ...HEALTH_STYLE.light, ...HEALTH_STYLE.lightIdle }
|
|
125
|
+
: {
|
|
126
|
+
...HEALTH_STYLE.light,
|
|
127
|
+
borderColor: STATUS_COLOR[light.status],
|
|
128
|
+
borderWidth: 1.5,
|
|
129
|
+
background: STATUS_TINT[light.status],
|
|
130
|
+
},
|
|
131
|
+
disabled: light.status === null,
|
|
132
|
+
onClick: () => props.onJump(light.id),
|
|
133
|
+
title: light.status === null
|
|
134
|
+
? '还没体检(或这一家没装)'
|
|
135
|
+
: light.title + ':' + countsText(light.counts),
|
|
136
|
+
}, React.createElement('span', {
|
|
137
|
+
style: {
|
|
138
|
+
width: 10,
|
|
139
|
+
height: 10,
|
|
140
|
+
borderRadius: '50%',
|
|
141
|
+
background: light.status === null ? INK_DIM : STATUS_COLOR[light.status],
|
|
142
|
+
display: 'inline-block',
|
|
143
|
+
},
|
|
144
|
+
}), React.createElement('span', { style: { color: INK, fontWeight: 650 } }, light.title), React.createElement('span', { style: { color: light.status === null ? INK_DIM : STATUS_TEXT[light.status], fontWeight: 700 } }, light.status === null ? '—' : countsText(light.counts))))), React.createElement('div', { style: HEALTH_STYLE.meta }, props.error !== null ? props.error : '只看不改 · 灯=那一家最严重的一档 · 点一下跳到那家配置页'));
|
|
145
|
+
}
|
|
146
|
+
/** 正正常常的那些:绿条只留「名字」,一句话与「去哪修」都不印(票面验收第一条:正常的收成一行)。 */
|
|
147
|
+
function isAttentionItem(item) {
|
|
148
|
+
return isAttention(item.status);
|
|
149
|
+
}
|
|
150
|
+
/** 一家那张表:**要处理的**(红黄)一条一块、整行上底带一句话与「去哪修」;
|
|
151
|
+
* **正常的**(绿)收成一行并列的小字,点得到、扫得完(票面验收第一条:正常的收成一行,有问题的才展开)。 */
|
|
152
|
+
export function HealthTable(props) {
|
|
153
|
+
const { report } = props;
|
|
154
|
+
return React.createElement('div', { style: HEALTH_STYLE.box, 'data-ilife-health': 'table' }, React.createElement('div', { style: HEALTH_STYLE.headRow }, React.createElement('div', { style: HEALTH_STYLE.head }, props.title + ' · 体检'), report ? React.createElement('div', { style: { color: INK_DIM, fontSize: 12 } }, countsText(countByStatus(report.items))) : null), props.phase === 'idle'
|
|
155
|
+
? React.createElement('div', { style: HEALTH_STYLE.meta }, '还没体检:点上面那个「体检一次」。')
|
|
156
|
+
: null, props.phase === 'running' ? React.createElement('div', { style: HEALTH_STYLE.meta }, '正在体检…') : null, props.error !== null ? React.createElement('div', { style: HEALTH_STYLE.error }, props.error) : null, report
|
|
157
|
+
? React.createElement('div', null, React.createElement('div', { style: HEALTH_STYLE.meta }, '配置文件 ' + report.configPath + ' · 数据目录 ' + report.dataDir), report.items.filter(isAttentionItem).map((item) => React.createElement('div', {
|
|
158
|
+
key: item.id,
|
|
159
|
+
'data-ilife-health': 'item',
|
|
160
|
+
'data-status': item.status,
|
|
161
|
+
// 红黄两档整行上底:扫一眼先看见「要处理的」。
|
|
162
|
+
style: {
|
|
163
|
+
padding: '7px 8px',
|
|
164
|
+
margin: '2px 0',
|
|
165
|
+
borderTop: '1px solid ' + BORDER,
|
|
166
|
+
borderRadius: 6,
|
|
167
|
+
fontSize: 13,
|
|
168
|
+
lineHeight: 1.75,
|
|
169
|
+
background: STATUS_TINT[item.status],
|
|
170
|
+
},
|
|
171
|
+
}, React.createElement('div', { style: { display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: 6 } }, React.createElement('span', {
|
|
172
|
+
style: {
|
|
173
|
+
width: 8, height: 8, borderRadius: '50%', display: 'inline-block', background: STATUS_COLOR[item.status],
|
|
174
|
+
},
|
|
175
|
+
}), React.createElement('span', { style: { fontWeight: 650, color: INK } }, item.title), React.createElement('span', {
|
|
176
|
+
style: { color: STATUS_TEXT[item.status], fontWeight: 700 },
|
|
177
|
+
}, STATUS_LABEL[item.status]), item.source ? React.createElement('span', { style: { color: INK_DIM } }, '· 来自' + item.source) : null), React.createElement('div', { style: { color: INK } }, item.message), item.action.length > 0
|
|
178
|
+
? React.createElement('div', { style: { color: INK_DIM } }, '去哪修:' + actionText(item.action))
|
|
179
|
+
: null)),
|
|
180
|
+
// 正常的那一档:一条都不用点开,名字排成一行(`data-ilife-health="ok"` 供判据核对「一条不少」)。
|
|
181
|
+
report.items.some((item) => !isAttentionItem(item))
|
|
182
|
+
? React.createElement('div', {
|
|
183
|
+
'data-ilife-health': 'ok',
|
|
184
|
+
style: {
|
|
185
|
+
display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: '2px 10px',
|
|
186
|
+
marginTop: 8, paddingTop: 6, borderTop: '1px solid ' + BORDER,
|
|
187
|
+
fontSize: 12, lineHeight: 1.6, color: INK_DIM,
|
|
188
|
+
},
|
|
189
|
+
}, React.createElement('span', { style: { fontWeight: 650, color: INK } }, '正常 ' + String(countByStatus(report.items).green) + ' 条'), report.items.filter((item) => !isAttentionItem(item)).map((item) => React.createElement('span', { key: item.id, 'data-ilife-health': 'ok-item' }, '· ' + item.title)))
|
|
190
|
+
: null)
|
|
191
|
+
: null);
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=health-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-view.js","sourceRoot":"","sources":["../src/health-view.ts"],"names":[],"mappings":"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"}
|
package/dist/nav.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export interface RecoTab extends ManagerTab {
|
|
|
27
27
|
}
|
|
28
28
|
export declare const MANAGER_PLUGIN: "dsh-life-pack";
|
|
29
29
|
/** 总管版本号(与 package.json 同步,release 时一起 bump;设置页总设置区版本行唯一来源)。 */
|
|
30
|
-
export declare const MANAGER_VERSION: "0.2.
|
|
30
|
+
export declare const MANAGER_VERSION: "0.2.4";
|
|
31
31
|
export declare const DUAL_ADD_PREFIX: "dsh plugin add dsh-life-pack";
|
|
32
32
|
export declare function dualInstallCmd(singlePlugin: string): string;
|
|
33
33
|
/** P3 定案 6 tab(order 升序即 + 号菜单顺序;已打开条不受 order 控制)。 */
|
package/dist/nav.js
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
export const MANAGER_PLUGIN = 'dsh-life-pack';
|
|
15
15
|
/** 总管版本号(与 package.json 同步,release 时一起 bump;设置页总设置区版本行唯一来源)。 */
|
|
16
|
-
export const MANAGER_VERSION = '0.2.
|
|
16
|
+
export const MANAGER_VERSION = '0.2.4';
|
|
17
17
|
export const DUAL_ADD_PREFIX = 'dsh plugin add dsh-life-pack';
|
|
18
18
|
export function dualInstallCmd(singlePlugin) {
|
|
19
19
|
return DUAL_ADD_PREFIX + ' ' + singlePlugin;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-client.d.ts","sourceRoot":"","sources":["../src/update-client.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEjE,yDAAyD;AACzD,MAAM,MAAM,QAAQ,GAAG,CACrB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CACR;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;CAAE,CACzI,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"update-client.d.ts","sourceRoot":"","sources":["../src/update-client.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEjE,yDAAyD;AACzD,MAAM,MAAM,QAAQ,GAAG,CACrB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CACR;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;CAAE,CACzI,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG,WAAW,CAAC;AA4CpF,+CAA+C;AAC/C,wBAAsB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC;IAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAMxH;AAED,gEAAgE;AAChE,wBAAsB,WAAW,CAC/B,IAAI,EAAE,QAAQ,GAAG,IAAI,EACrB,MAAM,EAAE,UAAU,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAIpC;AAED,6CAA6C;AAC7C,wBAAsB,aAAa,CACjC,IAAI,EAAE,QAAQ,GAAG,IAAI,EACrB,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,WAAW,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAEhE;AAED,kDAAkD;AAClD,wBAAsB,eAAe,CACnC,IAAI,EAAE,QAAQ,GAAG,IAAI,EACrB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAyCpC"}
|
package/dist/update-client.js
CHANGED
|
@@ -33,7 +33,8 @@ async function callManager(call, method, payload) {
|
|
|
33
33
|
return failure('internal', { detail: '宿主连接缺席:connection.rpc.call 不可用' });
|
|
34
34
|
let result;
|
|
35
35
|
try {
|
|
36
|
-
|
|
36
|
+
// 第一段是**载体基段**(`/api`)、第二段才是本包端点;传错就是打到一个不存在的路由(真机踩过)。
|
|
37
|
+
result = await call(MANAGER_RPC.base, MANAGER_RPC.endpoint, { method, payload });
|
|
37
38
|
}
|
|
38
39
|
catch (error) {
|
|
39
40
|
return failure('check-failed', { detail: String(error?.message ?? error) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-client.js","sourceRoot":"","sources":["../src/update-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAyBhF,6CAA6C;AAC7C,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,8DAA8D;AAC9D,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,IAAI,UAAU,GAAG,CAAC,CAAC;AAEnB,SAAS,OAAO,CAAC,IAAY,EAAE,UAAmC,EAAE,EAAE,SAAwB,IAAI;IAChG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AACzE,CAAC;AAED;;;wBAGwB;AACxB,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CAAI,IAAqB,EAAE,MAAc,EAAE,OAAgC;IACnG,IAAI,OAAO,IAAI,KAAK,UAAU;QAAE,OAAO,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAC,CAAC;IACzG,IAAI,MAAqC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"update-client.js","sourceRoot":"","sources":["../src/update-client.ts"],"names":[],"mappings":"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"}
|