karin-plugin-kkk 2.39.0 → 2.40.1
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 +47 -44
- package/README.md +70 -35
- package/lib/apps/admin.js +1 -1
- package/lib/apps/help.js +2 -2
- package/lib/build-metadata.json +5 -5
- package/lib/core_chunk/amagi.js +1 -1
- package/lib/core_chunk/amagiClient.js +1 -1
- package/lib/core_chunk/db.js +1 -1
- package/lib/core_chunk/main.js +629 -19
- package/lib/core_chunk/richtext.js +1 -1
- package/lib/core_chunk/template.d.mts +75 -3
- package/lib/core_chunk/template.js +1 -1
- package/lib/core_chunk/vendor.js +113 -113
- package/lib/karin-plugin-kkk.css +371 -40
- package/lib/root.js +1 -1
- package/lib/web/assets/{CronEditor-Cw1JG8-z.js → CronEditor-DiywKvi5.js} +1 -1
- package/lib/web/assets/{DesktopLayout-DhczG_oH.js → DesktopLayout-Dg2zhXab.js} +1 -1
- package/lib/web/assets/{MobileLayout-BPDCYfNY.js → MobileLayout-Bm9iTFi2.js} +1 -1
- package/lib/web/assets/{ThemeSwitch-CBS2uDXB.js → ThemeSwitch-C-Ak-yA2.js} +1 -1
- package/lib/web/assets/index-DfwUwUnH.css +2 -0
- package/lib/web/assets/{index-BFbeGR86.js → index-sIuuHdZD.js} +2 -2
- package/lib/web/assets/{separator-UALFsgvI.js → separator-eS-a7Ser.js} +1 -1
- package/lib/web/index.html +2 -2
- package/lib/web.config.js +1 -1
- package/package.json +2 -2
- package/lib/web/assets/index-CDqOqICt.css +0 -2
package/lib/core_chunk/main.js
CHANGED
|
@@ -4,7 +4,7 @@ import "node:module";
|
|
|
4
4
|
import fs from "node:fs";
|
|
5
5
|
import path, { resolve } from "node:path";
|
|
6
6
|
import URL$2, { fileURLToPath } from "node:url";
|
|
7
|
-
import karin, { BOT_CONNECT, app, authMiddleware, checkPkgUpdate, checkPort, common, config, createBadRequestResponse, createNotFoundResponse, createServerErrorResponse, createSuccessResponse, db, defineConfig, ffmpeg, ffprobe, hooks, karin as karin$1, karinPathHtml, karinPathTemp, logger, logger as logger$1, logs, mkdirSync, parseChangelog, range, render, restart, segment, updatePkg, watch } from "node-karin";
|
|
7
|
+
import karin, { BOT_CONNECT, app, authMiddleware, checkPkgUpdate, checkPort, common, config, createBadRequestResponse, createNotFoundResponse, createServerErrorResponse, createSuccessResponse, db, defineConfig, ffmpeg, ffprobe, hooks, isDocker, karin as karin$1, karinPathHtml, karinPathTemp, logger, logger as logger$1, logs, mkdirSync, parseChangelog, range, render, restart, segment, updatePkg, watch } from "node-karin";
|
|
8
8
|
import { EventEmitter } from "node:events";
|
|
9
9
|
import crypto, { createCipheriv, createHash, randomBytes, randomUUID } from "node:crypto";
|
|
10
10
|
import axios, { AxiosError } from "node-karin/axios";
|
|
@@ -12983,7 +12983,7 @@ function processLocalImageFile(filePath) {
|
|
|
12983
12983
|
//#region ../template/src/dev/preview/utils/time.ts
|
|
12984
12984
|
var import_react = /* @__PURE__ */ __toESM(require_react(), 1);
|
|
12985
12985
|
var import_server_node = require_server_node();
|
|
12986
|
-
var formatDuration$
|
|
12986
|
+
var formatDuration$3 = (ms) => {
|
|
12987
12987
|
const totalSeconds = Math.max(Math.floor(ms / 1e3), 0);
|
|
12988
12988
|
const hours = Math.floor(totalSeconds / 3600);
|
|
12989
12989
|
const minutes = Math.floor(totalSeconds % 3600 / 60);
|
|
@@ -13007,7 +13007,7 @@ var buildStatus = (state) => {
|
|
|
13007
13007
|
statusText: `文件 ${filePath} 将在未知时间后删除`,
|
|
13008
13008
|
countdownText: "--:--"
|
|
13009
13009
|
};
|
|
13010
|
-
const countdownText = formatDuration$
|
|
13010
|
+
const countdownText = formatDuration$3(state.remainingMs);
|
|
13011
13011
|
return {
|
|
13012
13012
|
statusText: `文件 ${filePath} 将在 ${countdownText} 后删除`,
|
|
13013
13013
|
countdownText
|
|
@@ -22870,7 +22870,7 @@ var formatCount = (count) => {
|
|
|
22870
22870
|
* 格式化视频时长显示 (如: 6:20)
|
|
22871
22871
|
* @param milliseconds 毫秒数
|
|
22872
22872
|
*/
|
|
22873
|
-
var formatDuration$
|
|
22873
|
+
var formatDuration$2 = (milliseconds) => {
|
|
22874
22874
|
const seconds = Math.floor(milliseconds / 1e3);
|
|
22875
22875
|
return `${Math.floor(seconds / 60)}:${(seconds % 60).toString().padStart(2, "0")}`;
|
|
22876
22876
|
};
|
|
@@ -22906,7 +22906,7 @@ var VideoCard = ({ video }) => {
|
|
|
22906
22906
|
}),
|
|
22907
22907
|
video.is_video && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
22908
22908
|
className: "absolute bottom-4 right-4 px-8 py-3 rounded-2xl text-4xl bg-white/50 text-black backdrop-blur-xs shadow-lg",
|
|
22909
|
-
children: formatDuration$
|
|
22909
|
+
children: formatDuration$2(video.duration)
|
|
22910
22910
|
}),
|
|
22911
22911
|
video.music && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
22912
22912
|
className: "absolute bottom-4 left-4 flex items-center gap-2 px-6 py-3 rounded-2xl text-xl bg-white/50 text-black backdrop-blur-xs shadow-lg",
|
|
@@ -23119,7 +23119,7 @@ var getTitleClassName = (titleLength) => {
|
|
|
23119
23119
|
if (titleLength > 48) return "text-[54px] leading-[1.26]";
|
|
23120
23120
|
return "text-[62px] leading-tight";
|
|
23121
23121
|
};
|
|
23122
|
-
function formatDuration(duration) {
|
|
23122
|
+
function formatDuration$1(duration) {
|
|
23123
23123
|
if (typeof duration !== "number" || !Number.isFinite(duration) || duration < 0) return void 0;
|
|
23124
23124
|
const totalSeconds = Math.floor(duration / 1e3);
|
|
23125
23125
|
const hours = Math.floor(totalSeconds / 3600);
|
|
@@ -23245,7 +23245,7 @@ var DouyinPosterHeader = ({ data }) => {
|
|
|
23245
23245
|
};
|
|
23246
23246
|
var DouyinVideoCover = ({ data }) => {
|
|
23247
23247
|
const { image_url, music, duration } = data;
|
|
23248
|
-
const durationText = formatDuration(duration);
|
|
23248
|
+
const durationText = formatDuration$1(duration);
|
|
23249
23249
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
|
|
23250
23250
|
className: "relative -mx-20 mt-12 overflow-visible",
|
|
23251
23251
|
children: [
|
|
@@ -27707,6 +27707,478 @@ var QrLogin = import_react.memo((props) => {
|
|
|
27707
27707
|
});
|
|
27708
27708
|
QrLogin.displayName = "QrLogin";
|
|
27709
27709
|
//#endregion
|
|
27710
|
+
//#region ../template/src/components/platforms/other/runtime.tsx
|
|
27711
|
+
/**
|
|
27712
|
+
* `#kkk版本` 运行环境诊断海报。
|
|
27713
|
+
*
|
|
27714
|
+
* 面向手机端看图场景:整幅统一底色 + 多色弥散光 + 高对比离散噪点层,内容单列纵向排布、
|
|
27715
|
+
* 不使用卡片容器,靠大留白与字号层级分区,超大实心版本号作为第一视觉中心。
|
|
27716
|
+
* 深色主题为紫罗兰 → 品红 → 琥珀橙弥散;浅色主题为 #271151 / #9754c7 / #deacf5 同色系紫,避免多色对撞。
|
|
27717
|
+
*/
|
|
27718
|
+
var RuntimeReport = import_react.memo((props) => {
|
|
27719
|
+
const { data } = props;
|
|
27720
|
+
const isDark = data.useDarkTheme ?? false;
|
|
27721
|
+
const releaseLabel = data.identity.releaseType.toLowerCase() === "stable" ? "正式版" : data.identity.releaseType.toLowerCase() === "preview" ? "预览版" : data.identity.releaseType;
|
|
27722
|
+
const buildStatus = data.build.state === "matched" ? {
|
|
27723
|
+
label: "构建信息一致",
|
|
27724
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleCheck, { className: "h-8 w-8" }),
|
|
27725
|
+
color: "#22c55e"
|
|
27726
|
+
} : data.build.state === "mismatched" ? {
|
|
27727
|
+
label: "构建信息不一致",
|
|
27728
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TriangleAlert, { className: "h-8 w-8" }),
|
|
27729
|
+
color: "#f59e0b"
|
|
27730
|
+
} : {
|
|
27731
|
+
label: "未找到构建信息",
|
|
27732
|
+
icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TriangleAlert, { className: "h-8 w-8" }),
|
|
27733
|
+
color: "#94a3b8"
|
|
27734
|
+
};
|
|
27735
|
+
const palette = isDark ? {
|
|
27736
|
+
background: "#0d0a1c",
|
|
27737
|
+
glowPrimary: "rgba(139, 92, 246, 0.34)",
|
|
27738
|
+
glowSecondary: "rgba(217, 70, 239, 0.22)",
|
|
27739
|
+
glowWarm: "rgba(251, 146, 60, 0.20)",
|
|
27740
|
+
versionGlow: "radial-gradient(ellipse at center, rgba(167, 139, 250, 0.30) 0%, rgba(240, 171, 252, 0.15) 50%, transparent 75%)",
|
|
27741
|
+
versionInk: "#f6f3ff",
|
|
27742
|
+
versionAccent: "#fdba74",
|
|
27743
|
+
accentText: "#c4b5fd",
|
|
27744
|
+
pillBg: "rgba(139, 92, 246, 0.12)",
|
|
27745
|
+
pillBorder: "rgba(196, 181, 253, 0.35)",
|
|
27746
|
+
pillText: "#c4b5fd",
|
|
27747
|
+
statusDot: "linear-gradient(112deg, #c4b5fd 0%, #f0abfc 48%, #fdba74 100%)",
|
|
27748
|
+
dotGlow: "0 0 28px rgba(192, 132, 252, 0.85)",
|
|
27749
|
+
barAccent: "linear-gradient(112deg, #c4b5fd 0%, #f0abfc 48%, #fdba74 100%)",
|
|
27750
|
+
meterGradient: "linear-gradient(112deg, #c4b5fd 0%, #f0abfc 48%, #fdba74 100%)",
|
|
27751
|
+
bgWord: "#ede9fe",
|
|
27752
|
+
noteHeading: "#f5f3ff",
|
|
27753
|
+
noteBody: "rgba(240, 237, 255, 0.72)",
|
|
27754
|
+
noteStrong: "#ffffff",
|
|
27755
|
+
noteCodeBg: "rgba(139, 92, 246, 0.16)",
|
|
27756
|
+
noteCodeText: "#c4b5fd",
|
|
27757
|
+
noteLink: "#c4b5fd",
|
|
27758
|
+
noteBulletClass: "before:bg-violet-400/70",
|
|
27759
|
+
warnText: "#fbbf24",
|
|
27760
|
+
noiseOpacity: .16
|
|
27761
|
+
} : {
|
|
27762
|
+
background: "#f7f1fe",
|
|
27763
|
+
glowPrimary: "rgba(151, 84, 199, 0.30)",
|
|
27764
|
+
glowSecondary: "rgba(222, 172, 245, 0.55)",
|
|
27765
|
+
glowWarm: "rgba(250, 211, 22, 0.38)",
|
|
27766
|
+
versionGlow: "radial-gradient(ellipse at center, rgba(222, 172, 245, 0.50) 0%, rgba(250, 211, 22, 0.16) 55%, transparent 78%)",
|
|
27767
|
+
versionInk: "#271151",
|
|
27768
|
+
versionAccent: "#9754c7",
|
|
27769
|
+
accentText: "#9754c7",
|
|
27770
|
+
pillBg: "rgba(151, 84, 199, 0.10)",
|
|
27771
|
+
pillBorder: "rgba(151, 84, 199, 0.30)",
|
|
27772
|
+
pillText: "#7a3db0",
|
|
27773
|
+
statusDot: "#9754c7",
|
|
27774
|
+
dotGlow: "0 0 26px rgba(151, 84, 199, 0.55)",
|
|
27775
|
+
barAccent: "linear-gradient(90deg, #271151 0%, #9754c7 100%)",
|
|
27776
|
+
meterGradient: "linear-gradient(90deg, #271151 0%, #9754c7 100%)",
|
|
27777
|
+
bgWord: "#271151",
|
|
27778
|
+
noteHeading: "#271151",
|
|
27779
|
+
noteBody: "rgba(39, 17, 81, 0.70)",
|
|
27780
|
+
noteStrong: "#271151",
|
|
27781
|
+
noteCodeBg: "rgba(151, 84, 199, 0.10)",
|
|
27782
|
+
noteCodeText: "#7a3db0",
|
|
27783
|
+
noteLink: "#7a3db0",
|
|
27784
|
+
noteBulletClass: "before:bg-[#9754c7]/70",
|
|
27785
|
+
warnText: "#8a5a06",
|
|
27786
|
+
noiseOpacity: .12
|
|
27787
|
+
};
|
|
27788
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(DefaultLayout, {
|
|
27789
|
+
...props,
|
|
27790
|
+
className: "relative min-h-455 overflow-hidden",
|
|
27791
|
+
style: { backgroundColor: palette.background },
|
|
27792
|
+
children: [
|
|
27793
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
27794
|
+
className: "pointer-events-none absolute inset-0 z-0 overflow-hidden",
|
|
27795
|
+
children: [
|
|
27796
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
27797
|
+
className: "absolute -left-130 -top-120 h-337.5 w-375 rounded-full blur-[230px]",
|
|
27798
|
+
style: { background: `radial-gradient(ellipse at center, ${palette.glowPrimary} 0%, transparent 70%)` }
|
|
27799
|
+
}),
|
|
27800
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
27801
|
+
className: "absolute -right-130 top-[32%] h-312.5 w-300 rounded-full blur-[240px]",
|
|
27802
|
+
style: { background: `radial-gradient(ellipse at center, ${palette.glowSecondary} 0%, transparent 72%)` }
|
|
27803
|
+
}),
|
|
27804
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
27805
|
+
className: "absolute -bottom-120 -left-80 h-287.5 w-337.5 rounded-full blur-[260px]",
|
|
27806
|
+
style: { background: `radial-gradient(ellipse at center, ${palette.glowWarm} 0%, transparent 72%)` }
|
|
27807
|
+
}),
|
|
27808
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
27809
|
+
className: "absolute -bottom-90 -right-105 h-225 w-250 rounded-full blur-[240px]",
|
|
27810
|
+
style: { background: `radial-gradient(ellipse at center, ${palette.glowPrimary} 0%, transparent 72%)` }
|
|
27811
|
+
}),
|
|
27812
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
27813
|
+
className: "absolute left-115 top-200 select-none text-[400px] -rotate-90 font-black leading-none tracking-[-0.06em] opacity-[0.03]",
|
|
27814
|
+
style: { color: palette.bgWord },
|
|
27815
|
+
children: "RUNTIME"
|
|
27816
|
+
})
|
|
27817
|
+
]
|
|
27818
|
+
}),
|
|
27819
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
27820
|
+
className: "pointer-events-none absolute inset-0 z-0",
|
|
27821
|
+
style: { opacity: palette.noiseOpacity },
|
|
27822
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
|
|
27823
|
+
className: "h-full w-full",
|
|
27824
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
27825
|
+
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("filter", {
|
|
27826
|
+
id: "runtimeReportNoise",
|
|
27827
|
+
x: "0%",
|
|
27828
|
+
y: "0%",
|
|
27829
|
+
width: "100%",
|
|
27830
|
+
height: "100%",
|
|
27831
|
+
children: [
|
|
27832
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("feTurbulence", {
|
|
27833
|
+
type: "fractalNoise",
|
|
27834
|
+
baseFrequency: "0.8",
|
|
27835
|
+
numOctaves: "1",
|
|
27836
|
+
stitchTiles: "stitch",
|
|
27837
|
+
result: "noise"
|
|
27838
|
+
}),
|
|
27839
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("feColorMatrix", {
|
|
27840
|
+
type: "saturate",
|
|
27841
|
+
values: "0",
|
|
27842
|
+
result: "gray"
|
|
27843
|
+
}),
|
|
27844
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("feComponentTransfer", { children: [
|
|
27845
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("feFuncR", {
|
|
27846
|
+
type: "discrete",
|
|
27847
|
+
tableValues: "0 1"
|
|
27848
|
+
}),
|
|
27849
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("feFuncG", {
|
|
27850
|
+
type: "discrete",
|
|
27851
|
+
tableValues: "0 1"
|
|
27852
|
+
}),
|
|
27853
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("feFuncB", {
|
|
27854
|
+
type: "discrete",
|
|
27855
|
+
tableValues: "0 1"
|
|
27856
|
+
})
|
|
27857
|
+
] })
|
|
27858
|
+
]
|
|
27859
|
+
}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", {
|
|
27860
|
+
width: "100%",
|
|
27861
|
+
height: "100%",
|
|
27862
|
+
filter: "url(#runtimeReportNoise)"
|
|
27863
|
+
})]
|
|
27864
|
+
})
|
|
27865
|
+
}),
|
|
27866
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("main", {
|
|
27867
|
+
className: "relative z-10 px-22 pb-16 pt-20",
|
|
27868
|
+
children: [
|
|
27869
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", {
|
|
27870
|
+
className: "relative",
|
|
27871
|
+
children: [
|
|
27872
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
27873
|
+
className: "flex items-center justify-between gap-12",
|
|
27874
|
+
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
27875
|
+
className: "flex items-center gap-4",
|
|
27876
|
+
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
27877
|
+
className: "h-3.5 w-3.5 rounded-full",
|
|
27878
|
+
style: {
|
|
27879
|
+
background: palette.statusDot,
|
|
27880
|
+
boxShadow: palette.dotGlow
|
|
27881
|
+
}
|
|
27882
|
+
}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
27883
|
+
className: "text-[24px] font-bold tracking-[0.28em] text-foreground/44",
|
|
27884
|
+
children: "运行诊断 · RUNTIME REPORT"
|
|
27885
|
+
})]
|
|
27886
|
+
}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
27887
|
+
className: "whitespace-nowrap rounded-full border px-6 py-2 text-[22px] font-black tracking-[0.14em]",
|
|
27888
|
+
style: {
|
|
27889
|
+
borderColor: palette.pillBorder,
|
|
27890
|
+
background: palette.pillBg,
|
|
27891
|
+
color: palette.pillText
|
|
27892
|
+
},
|
|
27893
|
+
children: releaseLabel
|
|
27894
|
+
})]
|
|
27895
|
+
}),
|
|
27896
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
27897
|
+
className: "mt-19",
|
|
27898
|
+
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", {
|
|
27899
|
+
className: "whitespace-nowrap text-[136px] font-black leading-none tracking-[-0.05em] text-foreground",
|
|
27900
|
+
children: "运行环境"
|
|
27901
|
+
}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
|
|
27902
|
+
className: "mt-8 whitespace-nowrap text-[32px] font-semibold text-foreground/48",
|
|
27903
|
+
children: "插件、框架与本地宿主的精简诊断快照"
|
|
27904
|
+
})]
|
|
27905
|
+
}),
|
|
27906
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
27907
|
+
className: "relative mt-23",
|
|
27908
|
+
children: [
|
|
27909
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
27910
|
+
className: "pointer-events-none absolute -left-16 -top-24 h-105 w-205 rounded-full blur-[150px]",
|
|
27911
|
+
style: { background: palette.versionGlow }
|
|
27912
|
+
}),
|
|
27913
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
27914
|
+
className: "relative text-[24px] font-bold tracking-[0.2em] text-foreground/36",
|
|
27915
|
+
children: "插件版本"
|
|
27916
|
+
}),
|
|
27917
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
27918
|
+
className: "relative mt-5 whitespace-nowrap font-mono text-[200px] font-black leading-none tracking-[-0.08em]",
|
|
27919
|
+
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
27920
|
+
className: "mr-4 text-[64px]",
|
|
27921
|
+
style: { color: palette.versionAccent },
|
|
27922
|
+
children: "v"
|
|
27923
|
+
}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
27924
|
+
style: { color: palette.versionInk },
|
|
27925
|
+
children: data.identity.pluginVersion
|
|
27926
|
+
})]
|
|
27927
|
+
}),
|
|
27928
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
27929
|
+
className: "relative mt-8 flex items-center gap-4",
|
|
27930
|
+
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
27931
|
+
className: "whitespace-nowrap font-mono text-[26px] font-bold text-foreground/46",
|
|
27932
|
+
children: data.identity.pluginName
|
|
27933
|
+
}), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
27934
|
+
className: "flex items-center gap-3 whitespace-nowrap rounded-full border px-5 py-1.5 text-[24px] font-bold",
|
|
27935
|
+
style: {
|
|
27936
|
+
color: buildStatus.color,
|
|
27937
|
+
borderColor: `${buildStatus.color}55`,
|
|
27938
|
+
background: `${buildStatus.color}14`
|
|
27939
|
+
},
|
|
27940
|
+
children: [buildStatus.icon, buildStatus.label]
|
|
27941
|
+
})]
|
|
27942
|
+
}),
|
|
27943
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
27944
|
+
className: "relative mt-11 whitespace-nowrap font-mono text-[22px] font-semibold text-foreground/28",
|
|
27945
|
+
children: [
|
|
27946
|
+
"构建 ",
|
|
27947
|
+
data.build.shortCommitHash ?? "未知",
|
|
27948
|
+
" · ",
|
|
27949
|
+
data.build.buildTime ?? "时间未知"
|
|
27950
|
+
]
|
|
27951
|
+
})
|
|
27952
|
+
]
|
|
27953
|
+
})
|
|
27954
|
+
]
|
|
27955
|
+
}),
|
|
27956
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
|
|
27957
|
+
className: "relative mt-30",
|
|
27958
|
+
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
27959
|
+
className: "relative flex items-center gap-5",
|
|
27960
|
+
children: [
|
|
27961
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
27962
|
+
className: "h-3 w-3 rounded-full",
|
|
27963
|
+
style: { background: palette.statusDot }
|
|
27964
|
+
}),
|
|
27965
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
27966
|
+
className: "text-[24px] font-black tracking-[0.28em]",
|
|
27967
|
+
style: { color: palette.accentText },
|
|
27968
|
+
children: "环境摘要"
|
|
27969
|
+
}),
|
|
27970
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
27971
|
+
className: "ml-2 h-2 w-22 rounded-full",
|
|
27972
|
+
style: { background: palette.barAccent }
|
|
27973
|
+
})
|
|
27974
|
+
]
|
|
27975
|
+
}), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
27976
|
+
className: "relative mt-16 grid grid-cols-2 gap-x-18 gap-y-16",
|
|
27977
|
+
children: [
|
|
27978
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
27979
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
27980
|
+
className: "text-[22px] font-bold tracking-[0.18em] text-foreground/36",
|
|
27981
|
+
children: "操作系统"
|
|
27982
|
+
}),
|
|
27983
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
27984
|
+
className: "mt-3 truncate whitespace-nowrap text-[48px] font-black tracking-[-0.02em] text-foreground",
|
|
27985
|
+
children: data.runtime.os
|
|
27986
|
+
}),
|
|
27987
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
27988
|
+
className: "mt-4 whitespace-nowrap font-mono text-[26px] font-bold text-foreground/42",
|
|
27989
|
+
children: [
|
|
27990
|
+
data.runtime.platform,
|
|
27991
|
+
" · ",
|
|
27992
|
+
data.runtime.arch
|
|
27993
|
+
]
|
|
27994
|
+
})
|
|
27995
|
+
] }),
|
|
27996
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
27997
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
27998
|
+
className: "text-[22px] font-bold tracking-[0.18em] text-foreground/36",
|
|
27999
|
+
children: "当前适配器"
|
|
28000
|
+
}),
|
|
28001
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
28002
|
+
className: "mt-3 truncate whitespace-nowrap text-[48px] font-black tracking-[-0.02em] text-foreground",
|
|
28003
|
+
children: data.adapter.name
|
|
28004
|
+
}),
|
|
28005
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
28006
|
+
className: "mt-4 whitespace-nowrap font-mono text-[27px] font-black",
|
|
28007
|
+
style: { color: palette.accentText },
|
|
28008
|
+
children: ["v", data.adapter.version]
|
|
28009
|
+
})
|
|
28010
|
+
] }),
|
|
28011
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
28012
|
+
className: "text-[22px] font-bold tracking-[0.18em] text-foreground/36",
|
|
28013
|
+
children: "Karin 版本"
|
|
28014
|
+
}), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
28015
|
+
className: "mt-3 whitespace-nowrap font-mono text-[48px] font-black leading-none tracking-[-0.02em] text-foreground",
|
|
28016
|
+
children: ["v", data.identity.karinVersion]
|
|
28017
|
+
})] }),
|
|
28018
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
28019
|
+
className: "text-[22px] font-bold tracking-[0.18em] text-foreground/36",
|
|
28020
|
+
children: "Node.js 版本"
|
|
28021
|
+
}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
28022
|
+
className: "mt-3 whitespace-nowrap font-mono text-[48px] font-black leading-none tracking-[-0.02em]",
|
|
28023
|
+
style: { color: palette.accentText },
|
|
28024
|
+
children: data.runtime.nodeVersion
|
|
28025
|
+
})] }),
|
|
28026
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
28027
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
28028
|
+
className: "text-[22px] font-bold tracking-[0.18em] text-foreground/36",
|
|
28029
|
+
children: "内存占用"
|
|
28030
|
+
}),
|
|
28031
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
28032
|
+
className: "mt-3 flex items-end gap-5",
|
|
28033
|
+
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
28034
|
+
className: "whitespace-nowrap font-mono text-[72px] font-black leading-none tracking-[-0.04em] text-foreground",
|
|
28035
|
+
children: data.resources.memoryUsagePercent
|
|
28036
|
+
}), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
|
|
28037
|
+
className: "whitespace-nowrap pb-2 font-mono text-[24px] font-bold text-foreground/40",
|
|
28038
|
+
children: [
|
|
28039
|
+
data.resources.usedMemory,
|
|
28040
|
+
" / ",
|
|
28041
|
+
data.resources.totalMemory
|
|
28042
|
+
]
|
|
28043
|
+
})]
|
|
28044
|
+
}),
|
|
28045
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
28046
|
+
className: "mt-5 h-3 w-full max-w-105 overflow-hidden rounded-full bg-foreground/8",
|
|
28047
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
28048
|
+
className: "h-full rounded-full",
|
|
28049
|
+
style: {
|
|
28050
|
+
width: data.resources.memoryUsagePercent,
|
|
28051
|
+
background: palette.meterGradient
|
|
28052
|
+
}
|
|
28053
|
+
})
|
|
28054
|
+
})
|
|
28055
|
+
] }),
|
|
28056
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
28057
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
28058
|
+
className: "text-[22px] font-bold tracking-[0.18em] text-foreground/36",
|
|
28059
|
+
children: "处理器"
|
|
28060
|
+
}),
|
|
28061
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
28062
|
+
className: "mt-3 line-clamp-2 wrap-break-word text-[32px] font-black leading-[1.4] text-foreground/78",
|
|
28063
|
+
children: data.resources.cpuModel
|
|
28064
|
+
}),
|
|
28065
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
28066
|
+
className: "mt-4 whitespace-nowrap font-mono text-[24px] font-bold text-foreground/40",
|
|
28067
|
+
children: [data.resources.cpuCores, " 核心"]
|
|
28068
|
+
})
|
|
28069
|
+
] })
|
|
28070
|
+
]
|
|
28071
|
+
})]
|
|
28072
|
+
}),
|
|
28073
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
|
|
28074
|
+
className: "relative mt-32.5",
|
|
28075
|
+
children: [
|
|
28076
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
28077
|
+
className: "relative flex items-center gap-5",
|
|
28078
|
+
children: [
|
|
28079
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
28080
|
+
className: "h-3 w-3 rounded-full",
|
|
28081
|
+
style: { background: palette.statusDot }
|
|
28082
|
+
}),
|
|
28083
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
28084
|
+
className: "text-[24px] font-black tracking-[0.28em]",
|
|
28085
|
+
style: { color: palette.accentText },
|
|
28086
|
+
children: "仅展示当前版本"
|
|
28087
|
+
}),
|
|
28088
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
28089
|
+
className: "ml-2 h-2 w-22 rounded-full",
|
|
28090
|
+
style: { background: palette.barAccent }
|
|
28091
|
+
})
|
|
28092
|
+
]
|
|
28093
|
+
}),
|
|
28094
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", {
|
|
28095
|
+
className: "mt-7 text-[76px] font-black leading-none",
|
|
28096
|
+
style: { color: palette.noteStrong },
|
|
28097
|
+
children: "本版变更"
|
|
28098
|
+
}),
|
|
28099
|
+
data.releaseNotes.available ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
28100
|
+
className: "runtime-release-notes relative mt-15",
|
|
28101
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Markdown, {
|
|
28102
|
+
components: {
|
|
28103
|
+
h2: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", {
|
|
28104
|
+
className: "mb-11 whitespace-nowrap text-[48px] font-black leading-tight",
|
|
28105
|
+
style: { color: palette.noteStrong },
|
|
28106
|
+
children
|
|
28107
|
+
}),
|
|
28108
|
+
h3: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("h3", {
|
|
28109
|
+
className: "mb-5 mt-10 flex items-center gap-5 whitespace-nowrap text-[36px] font-black leading-tight",
|
|
28110
|
+
style: { color: palette.noteHeading },
|
|
28111
|
+
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
28112
|
+
className: "h-2.5 w-12 shrink-0 rounded-full",
|
|
28113
|
+
style: { background: palette.barAccent }
|
|
28114
|
+
}), children]
|
|
28115
|
+
}),
|
|
28116
|
+
p: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
|
|
28117
|
+
className: "mb-6 text-[32px] leading-[1.7]",
|
|
28118
|
+
style: { color: palette.noteBody },
|
|
28119
|
+
children
|
|
28120
|
+
}),
|
|
28121
|
+
ul: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", {
|
|
28122
|
+
className: "mb-8 space-y-5 pl-10",
|
|
28123
|
+
children
|
|
28124
|
+
}),
|
|
28125
|
+
ol: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ol", {
|
|
28126
|
+
className: "mb-8 list-decimal space-y-5 pl-12",
|
|
28127
|
+
children
|
|
28128
|
+
}),
|
|
28129
|
+
li: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("li", {
|
|
28130
|
+
className: `relative wrap-break-word text-[32px] font-semibold leading-[1.65] before:absolute before:-left-8 before:top-[0.74em] before:h-2.5 before:w-2.5 before:rounded-full ${palette.noteBulletClass}`,
|
|
28131
|
+
style: { color: palette.noteBody },
|
|
28132
|
+
children
|
|
28133
|
+
}),
|
|
28134
|
+
strong: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("strong", {
|
|
28135
|
+
className: "font-black",
|
|
28136
|
+
style: { color: palette.noteStrong },
|
|
28137
|
+
children
|
|
28138
|
+
}),
|
|
28139
|
+
code: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
|
|
28140
|
+
className: "break-all rounded-lg px-3 py-1 font-mono text-[0.88em] font-bold",
|
|
28141
|
+
style: {
|
|
28142
|
+
background: palette.noteCodeBg,
|
|
28143
|
+
color: palette.noteCodeText
|
|
28144
|
+
},
|
|
28145
|
+
children
|
|
28146
|
+
}),
|
|
28147
|
+
a: ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
28148
|
+
className: "font-bold",
|
|
28149
|
+
style: { color: palette.noteLink },
|
|
28150
|
+
children
|
|
28151
|
+
})
|
|
28152
|
+
},
|
|
28153
|
+
children: data.releaseNotes.markdown
|
|
28154
|
+
})
|
|
28155
|
+
}) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
|
|
28156
|
+
className: "relative mt-15 flex items-start gap-6",
|
|
28157
|
+
style: { color: palette.warnText },
|
|
28158
|
+
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(TriangleAlert, { className: "mt-1 h-11 w-11 shrink-0" }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
28159
|
+
className: "text-[34px] font-black",
|
|
28160
|
+
children: "当前构建没有可用的变更日志"
|
|
28161
|
+
}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
|
|
28162
|
+
className: "mt-3 text-[27px] font-semibold leading-[1.55] opacity-70",
|
|
28163
|
+
children: "环境摘要仍可正常用于问题定位。"
|
|
28164
|
+
})] })]
|
|
28165
|
+
})
|
|
28166
|
+
]
|
|
28167
|
+
}),
|
|
28168
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("footer", {
|
|
28169
|
+
className: "mt-20 flex items-end justify-between gap-12 whitespace-nowrap text-[22px] font-semibold text-foreground/32",
|
|
28170
|
+
children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "仅包含经过脱敏的本地运行信息" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
|
|
28171
|
+
className: "font-mono",
|
|
28172
|
+
children: data.snapshotAt
|
|
28173
|
+
})]
|
|
28174
|
+
})
|
|
28175
|
+
]
|
|
28176
|
+
})
|
|
28177
|
+
]
|
|
28178
|
+
});
|
|
28179
|
+
});
|
|
28180
|
+
RuntimeReport.displayName = "RuntimeReport";
|
|
28181
|
+
//#endregion
|
|
27710
28182
|
//#region ../template/src/components/platforms/other/VersionWarning.tsx
|
|
27711
28183
|
var VersionWarning = (props) => {
|
|
27712
28184
|
const isDark = props.data.useDarkTheme;
|
|
@@ -29091,6 +29563,14 @@ var baseComponentConfigs = [
|
|
|
29091
29563
|
componentPath: "platforms/other/changelog",
|
|
29092
29564
|
exportName: "changelog"
|
|
29093
29565
|
},
|
|
29566
|
+
{
|
|
29567
|
+
id: "runtime",
|
|
29568
|
+
name: "运行环境诊断",
|
|
29569
|
+
description: "KKK插件运行环境诊断页面",
|
|
29570
|
+
enabled: true,
|
|
29571
|
+
componentPath: "platforms/other/runtime",
|
|
29572
|
+
exportName: "RuntimeReport"
|
|
29573
|
+
},
|
|
29094
29574
|
{
|
|
29095
29575
|
id: "version_warning",
|
|
29096
29576
|
name: "版本警告",
|
|
@@ -29290,6 +29770,7 @@ var componentConfigs = baseComponentConfigs.map((basePlatform) => {
|
|
|
29290
29770
|
case "help": return createComponentConfig(baseComponent, { component: Help });
|
|
29291
29771
|
case "handlerError": return createComponentConfig(baseComponent, { component: handlerError });
|
|
29292
29772
|
case "changelog": return createComponentConfig(baseComponent, { component: Changelog });
|
|
29773
|
+
case "runtime": return createComponentConfig(baseComponent, { component: RuntimeReport });
|
|
29293
29774
|
case "version_warning": return createComponentConfig(baseComponent, { component: VersionWarning });
|
|
29294
29775
|
case "qrlogin": return createComponentConfig(baseComponent, { component: QrLogin });
|
|
29295
29776
|
case "live-photo-tip": return createComponentConfig(baseComponent, { component: LivePhotoTip });
|
|
@@ -41823,6 +42304,127 @@ var removeOldFiles = (dir, beforeTimestamp) => {
|
|
|
41823
42304
|
return deletedCount;
|
|
41824
42305
|
};
|
|
41825
42306
|
//#endregion
|
|
42307
|
+
//#region src/module/utils/runtime-report.ts
|
|
42308
|
+
/**
|
|
42309
|
+
* 将秒数格式化为适合诊断海报展示的紧凑时长。
|
|
42310
|
+
*
|
|
42311
|
+
* @param seconds 原始秒数
|
|
42312
|
+
* @returns 例如 `2天 6小时 18分钟`
|
|
42313
|
+
*/
|
|
42314
|
+
var formatDuration = (seconds) => {
|
|
42315
|
+
if (!Number.isFinite(seconds) || seconds < 0) return "未知";
|
|
42316
|
+
const totalMinutes = Math.floor(seconds / 60);
|
|
42317
|
+
const days = Math.floor(totalMinutes / 1440);
|
|
42318
|
+
const hours = Math.floor(totalMinutes % 1440 / 60);
|
|
42319
|
+
const minutes = totalMinutes % 60;
|
|
42320
|
+
if (days > 0) return `${days}天 ${hours}小时 ${minutes}分钟`;
|
|
42321
|
+
if (hours > 0) return `${hours}小时 ${minutes}分钟`;
|
|
42322
|
+
if (minutes > 0) return `${minutes}分钟`;
|
|
42323
|
+
return `${Math.floor(seconds)}秒`;
|
|
42324
|
+
};
|
|
42325
|
+
/**
|
|
42326
|
+
* 从随包发布的 CHANGELOG 中提取指定数量的本地版本记录。
|
|
42327
|
+
* 读取失败时返回空字符串,让调用方决定降级展示或抛出错误。
|
|
42328
|
+
*
|
|
42329
|
+
* @param length 需要提取的版本数量
|
|
42330
|
+
*/
|
|
42331
|
+
var getLocalChangelog = (length) => {
|
|
42332
|
+
try {
|
|
42333
|
+
const changelogPath = path.join(Root.pluginPath, "CHANGELOG.md");
|
|
42334
|
+
const changelogContent = fs.readFileSync(changelogPath, "utf8");
|
|
42335
|
+
return logs({
|
|
42336
|
+
version: Root.pluginVersion,
|
|
42337
|
+
data: changelogContent,
|
|
42338
|
+
length
|
|
42339
|
+
});
|
|
42340
|
+
} catch {
|
|
42341
|
+
return "";
|
|
42342
|
+
}
|
|
42343
|
+
};
|
|
42344
|
+
/**
|
|
42345
|
+
* 采集 `#kkk版本` 使用的安全运行环境快照。
|
|
42346
|
+
*
|
|
42347
|
+
* 不采集账号、主机名、用户目录、网络地址、环境变量内容、启动参数或适配器鉴权信息,
|
|
42348
|
+
* 保证该命令在群聊中触发时不会把机器身份和凭据写入图片。
|
|
42349
|
+
*
|
|
42350
|
+
* @param event 当前消息事件
|
|
42351
|
+
*/
|
|
42352
|
+
var collectRuntimeReport = (event) => {
|
|
42353
|
+
const packageMetadata = Root.pkg;
|
|
42354
|
+
const adapter = event.bot.adapter;
|
|
42355
|
+
const cpus = os.cpus();
|
|
42356
|
+
const memory = process.memoryUsage();
|
|
42357
|
+
const totalMemory = os.totalmem();
|
|
42358
|
+
const usedMemory = Math.max(0, totalMemory - os.freemem());
|
|
42359
|
+
const buildMetadata = getBuildMetadata();
|
|
42360
|
+
const currentChangelog = getLocalChangelog(1);
|
|
42361
|
+
const renderScale = Math.min(2, Math.max(.5, Number(Config.app.renderScale) / 100));
|
|
42362
|
+
const buildState = !buildMetadata ? "unavailable" : buildMetadata.version === Root.pluginVersion ? "matched" : "mismatched";
|
|
42363
|
+
return {
|
|
42364
|
+
snapshotAt: new Intl.DateTimeFormat("zh-CN", {
|
|
42365
|
+
year: "numeric",
|
|
42366
|
+
month: "2-digit",
|
|
42367
|
+
day: "2-digit",
|
|
42368
|
+
hour: "2-digit",
|
|
42369
|
+
minute: "2-digit",
|
|
42370
|
+
second: "2-digit",
|
|
42371
|
+
hour12: false
|
|
42372
|
+
}).format(/* @__PURE__ */ new Date()),
|
|
42373
|
+
identity: {
|
|
42374
|
+
pluginName: Root.pluginName,
|
|
42375
|
+
pluginVersion: Root.pluginVersion,
|
|
42376
|
+
karinVersion: Root.karinVersion || "未知",
|
|
42377
|
+
releaseType: /^\d+\.\d+\.\d+$/.test(Root.pluginVersion) ? "Stable" : "Preview",
|
|
42378
|
+
requiredNodeVersion: packageMetadata.engines?.node ?? "未声明",
|
|
42379
|
+
requiredKarinVersion: packageMetadata.karin?.engines ?? packageMetadata.engines?.karin ?? "未声明"
|
|
42380
|
+
},
|
|
42381
|
+
build: {
|
|
42382
|
+
state: buildState,
|
|
42383
|
+
version: buildMetadata?.version,
|
|
42384
|
+
buildTime: buildMetadata?.buildTime ? formatBuildTime(buildMetadata.buildTime) : void 0,
|
|
42385
|
+
shortCommitHash: buildMetadata?.shortCommitHash
|
|
42386
|
+
},
|
|
42387
|
+
runtime: {
|
|
42388
|
+
nodeVersion: process.version,
|
|
42389
|
+
nodeEnv: process.env.NODE_ENV ?? "未设置",
|
|
42390
|
+
os: `${os.type()} ${os.release()}`,
|
|
42391
|
+
platform: os.platform(),
|
|
42392
|
+
arch: os.arch(),
|
|
42393
|
+
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone || "未知",
|
|
42394
|
+
container: isDocker,
|
|
42395
|
+
systemUptime: formatDuration(os.uptime()),
|
|
42396
|
+
processUptime: formatDuration(process.uptime())
|
|
42397
|
+
},
|
|
42398
|
+
adapter: {
|
|
42399
|
+
name: adapter.name || "未知",
|
|
42400
|
+
version: adapter.version || "未知",
|
|
42401
|
+
platform: String(adapter.platform || "未知"),
|
|
42402
|
+
protocol: String(adapter.protocol || "未知"),
|
|
42403
|
+
standard: String(adapter.standard || "未知"),
|
|
42404
|
+
communication: String(adapter.communication || "未知"),
|
|
42405
|
+
connectedFor: formatDuration(Math.max(0, (Date.now() - adapter.connectTime) / 1e3))
|
|
42406
|
+
},
|
|
42407
|
+
renderer: {
|
|
42408
|
+
scale: `${renderScale.toFixed(2)}x`,
|
|
42409
|
+
timeout: `${Config.app.RenderWaitTime}秒`,
|
|
42410
|
+
multiPage: Config.app.multiPageRender && adapter.protocol !== "qqbot"
|
|
42411
|
+
},
|
|
42412
|
+
resources: {
|
|
42413
|
+
cpuModel: cpus[0]?.model?.trim() || "未知处理器",
|
|
42414
|
+
cpuCores: cpus.length,
|
|
42415
|
+
totalMemory: formatBytes(totalMemory),
|
|
42416
|
+
usedMemory: formatBytes(usedMemory),
|
|
42417
|
+
memoryUsagePercent: totalMemory > 0 ? `${(usedMemory / totalMemory * 100).toFixed(1)}%` : "未知",
|
|
42418
|
+
processRss: formatBytes(memory.rss),
|
|
42419
|
+
heapUsed: formatBytes(memory.heapUsed)
|
|
42420
|
+
},
|
|
42421
|
+
releaseNotes: {
|
|
42422
|
+
markdown: currentChangelog,
|
|
42423
|
+
available: currentChangelog.length > 0
|
|
42424
|
+
}
|
|
42425
|
+
};
|
|
42426
|
+
};
|
|
42427
|
+
//#endregion
|
|
41826
42428
|
//#region src/apps/help.ts
|
|
41827
42429
|
var HELP_MENU_CONFIG = [
|
|
41828
42430
|
{
|
|
@@ -41927,8 +42529,13 @@ var HELP_MENU_CONFIG = [
|
|
|
41927
42529
|
{
|
|
41928
42530
|
title: "其他",
|
|
41929
42531
|
items: [{
|
|
42532
|
+
title: "#kkk版本",
|
|
42533
|
+
description: "查看插件、Karin、Node.js、适配器与系统资源等运行环境诊断信息",
|
|
42534
|
+
icon: "ph:monitor-fill",
|
|
42535
|
+
roles: ["member", "master"]
|
|
42536
|
+
}, {
|
|
41930
42537
|
title: "「#kkk更新日志」「#kkk更新」",
|
|
41931
|
-
description: "
|
|
42538
|
+
description: "查看更新日志或执行插件更新",
|
|
41932
42539
|
icon: "ph:arrows-clockwise-fill",
|
|
41933
42540
|
roles: ["master"]
|
|
41934
42541
|
}]
|
|
@@ -41977,22 +42584,25 @@ var handleHelp = wrapWithErrorHandler(async (e) => {
|
|
|
41977
42584
|
return true;
|
|
41978
42585
|
}, { businessName: "KKK帮助" });
|
|
41979
42586
|
var handleVersion = wrapWithErrorHandler(async (e) => {
|
|
41980
|
-
const
|
|
42587
|
+
const img = await Render(e, "other/runtime", collectRuntimeReport(e));
|
|
42588
|
+
await e.reply(img);
|
|
42589
|
+
return true;
|
|
42590
|
+
}, { businessName: "KKK版本" });
|
|
42591
|
+
var handleChangelog = wrapWithErrorHandler(async (e) => {
|
|
42592
|
+
const forwardLogs = getLocalChangelog(10);
|
|
42593
|
+
if (!forwardLogs) throw new Error("当前构建未携带可用的 CHANGELOG.md");
|
|
41981
42594
|
const img = await Render(e, "other/changelog", {
|
|
41982
|
-
markdown:
|
|
41983
|
-
version: Root.pluginVersion,
|
|
41984
|
-
data: changelogContent,
|
|
41985
|
-
length: 10
|
|
41986
|
-
}),
|
|
42595
|
+
markdown: forwardLogs,
|
|
41987
42596
|
Tip: false,
|
|
41988
42597
|
localVersion: "",
|
|
41989
42598
|
remoteVersion: ""
|
|
41990
42599
|
});
|
|
41991
|
-
e.reply(img);
|
|
42600
|
+
await e.reply(img);
|
|
41992
42601
|
return true;
|
|
41993
|
-
}, { businessName: "KKK
|
|
42602
|
+
}, { businessName: "KKK更新日志" });
|
|
41994
42603
|
var help = karin.command(/^#?kkk帮助$/, handleHelp, { name: "kkk-帮助" });
|
|
41995
|
-
var version = karin.command(/^#?kkk
|
|
42604
|
+
var version = karin.command(/^#?kkk版本$/, handleVersion, { name: "kkk-版本" });
|
|
42605
|
+
var changelog = karin.command(/^#?kkk更新日志$/, handleChangelog, { name: "kkk-更新日志" });
|
|
41996
42606
|
//#endregion
|
|
41997
42607
|
//#region src/apps/push.ts
|
|
41998
42608
|
var handleDouyinPush = wrapWithErrorHandler(async () => {
|
|
@@ -43638,7 +44248,7 @@ app$1.use(ASSETS_PREFIX, staticRouter);
|
|
|
43638
44248
|
app.use(KKK_PREFIX, app$1);
|
|
43639
44249
|
//#endregion
|
|
43640
44250
|
//#region src/setup.ts
|
|
43641
|
-
var requireVersion = "1.16.
|
|
44251
|
+
var requireVersion = "1.16.3";
|
|
43642
44252
|
if (process.env.NODE_ENV !== "development" && isSemverGreater(requireVersion, Root.karinVersion)) {
|
|
43643
44253
|
const msg = `[karin-plugin-kkk] 插件构建时的 karin 版本 (${requireVersion}) 高于当前运行版本 (${Root.karinVersion}),可能会出现兼容性问题!`;
|
|
43644
44254
|
logger.warn(msg);
|
|
@@ -43682,4 +44292,4 @@ mkdirSync(`${karinPathBase}/${Root.pluginName}/data`);
|
|
|
43682
44292
|
mkdirSync(Common.tempDri.images);
|
|
43683
44293
|
mkdirSync(Common.tempDri.video);
|
|
43684
44294
|
//#endregion
|
|
43685
|
-
export {
|
|
44295
|
+
export { createImageNode as $, xiaohongshuApiUrls as $n, emitLog as $r, MajorType as $t, testWrapWithErrorHandler as A, fetchResponse as An, BilibiliBangumiStreamParamsSchema as Ar, DouyinMethodMapping as At, StatisticsDBBase as B, createBoundDouyinFetcher as Bn, BilibiliMethodRoutes as Br, DouyinFetcherMethods as Bt, changelog as C, bv2av as Cn, DouyinWorkParamsSchema as Cr, softFetch as Ct, dylogin as D, logMiddleware as Dn, BilibiliArticleParamsSchema as Dr, BilibiliApiRoutes as Dt, biLogin as E, initLogger as En, BilibiliArticleInfoParamsSchema as Er, amagiClient$1 as Et, douyinDBInstance as F, createBoundKuaishouFetcher as Fn, BilibiliDanmakuParamsSchema as Fr, getApiRoute as Ft, renderRichTextToReact as G, createErrorResponse as Gn, BilibiliValidationSchemas as Gr, KuaishouMethodToFetcher as Gt, BilibiliDBBase as H, douyinSign as Hn, BilibiliQrcodeStatusParamsSchema as Hr, DouyinMethodToFetcher as Ht, getBilibiliDB as I, kuaishouFetcher$1 as In, BilibiliDynamicParamsSchema as Ir, getEnglishMethodName as It, createCodeBlockNode as J, validateDouyinParams as Jn, amagiEvents as Jr, XiaohongshuInternalMethods as Jt, createAtNode as K, createSuccessResponse$1 as Kn, BilibiliVideoDownloadParamsSchema as Kr, MethodMaps as Kt, getDouyinDB as L, kuaishouSign as Ln, BilibiliEmojiParamsSchema as Lr, BilibiliFetcherMethods as Lt, webConfig as M, isNetworkErrorResult as Mn, BilibiliColumnInfoParamsSchema as Mr, KuaishouMethodMapping as Mt, bilibiliDBInstance as N, createBoundXiaohongshuFetcher as Nn, BilibiliCommentParamsSchema as Nr, XiaohongshuApiRoutes as Nt, removeOldFiles as O, logger$2 as On, BilibiliAv2BvParamsSchema as Or, BilibiliMethodMapping as Ot, cleanOldDynamicCache as P, xiaohongshuFetcher$1 as Pn, BilibiliCommentReplyParamsSchema as Pr, XiaohongshuMethodMapping as Pt, createHorizontalRuleNode as Q, XiaohongshuValidationSchemas as Qn, emitHttpResponse as Qr, AdditionalType as Qt, getStatisticsDB as R, kuaishouApiUrls as Rn, BilibiliLiveParamsSchema as Rr, BilibiliInternalMethods as Rt, setdyPush as S, av2bv as Sn, DouyinValidationSchemas as Sr, reloadAmagiConfig as St, version as T, httpLogger as Tn, BilibiliArticleCardParamsSchema as Tr, amagi as Tt, reactServerRender as U, bilibiliFetcher$1 as Un, BilibiliUserParamsSchema as Ur, KuaishouFetcherMethods as Ut, DouyinDBBase as V, douyinApiUrls as Vn, BilibiliQrcodeParamsSchema as Vr, DouyinInternalMethods as Vt, renderVideoPreviewPage as W, createBoundBilibiliFetcher as Wn, BilibiliValidateCaptchaParamsSchema as Wr, KuaishouInternalMethods as Wt, createHashtagNode as X, validateXiaohongshuParams as Xn, emitApiSuccess as Xr, toFetcherMethod as Xt, createEmojiNode as Y, validateKuaishouParams as Yn, emitApiError as Yr, XiaohongshuMethodToFetcher as Yt, createHeadingNode as Z, XiaohongshuMethodRoutes as Zn, emitHttpRequest as Zr, DynamicType as Zt, douyinPush as _, ValidationError as _n, DouyinMusicParamsSchema as _r, AmagiError as _t, bilibiliAPP as a, emitNetworkError as ai, xiaohongshu$1 as an, KuaishouUserProfileParamsSchema as ar, createMentionNode as at, globalIgnore as b, wbi_sign as bn, DouyinUserListParamsSchema as br, douyinFetcher as bt, prefix as c, createBoundBilibiliApi as ci, createBoundKuaishouApi as cn, KuaishouVideoParamsSchema as cr, createSearchKeywordNode as ct, globalStatistics as d, getDouyinData as di, createDouyinRoutes as dn, DouyinDanmakuParamsSchema as dr, createViewPictureNode as dt, emitLogDebug as ei, CommentType as en, xiaohongshuSign as er, createLineBreakNode as et, groupStatistics as f, getKuaishouData as fi, createBoundDouyinApi as fn, DouyinEmojiListParamsSchema as fr, createVoteNode as ft, changeBotID as g, ApiError as gn, DouyinMethodRoutes as gr, AmagiBase as gt, bilibiliPushList as h, createBilibiliRoutes as hn, DouyinLiveRoomParamsSchema as hr, normalizeRichTextNodes as ht, update as i, emitLogWarn as ii, createBoundXiaohongshuApi as in, KuaishouMethodRoutes as ir, createLotteryNode as it, template_default as j, getHeadersAndData as jn, BilibiliBv2AvParamsSchema as jr, KuaishouApiRoutes as jt, task as k, fetchData as kn, BilibiliBangumiInfoParamsSchema as kr, DouyinApiRoutes as kt, xiaohongshuAPP as l, bilibiliApiUrls as li, kuaishou$1 as ln, DouyinCommentParamsSchema as lr, createTextNode as lt, bilibiliPush as m, bilibiliUtils as mn, DouyinHotWordsParamsSchema as mr, extractRichTextPlainText as mt, kkkUpdateCommand as n, emitLogInfo as ni, xiaohongshuUtils as nn, KuaishouEmojiParamsSchema as nr, createListItemNode as nt, douyinAPP as o, emitNetworkRetry as oi, kuaishouUtils as on, KuaishouUserWorkListParamsSchema as or, createParagraphNode as ot, qrLogin as p, Root as pi, douyin$1 as pn, DouyinEmojiProParamsSchema as pr, createWebLinkNode as pt, createBlockquoteNode as q, validateBilibiliParams as qn, BilibiliVideoParamsSchema as qr, XiaohongshuFetcherMethods as qt, kkkUpdateTest as r, emitLogMark as ri, createXiaohongshuRoutes as rn, KuaishouLiveRoomInfoParamsSchema as rr, createListNode as rt, kuaishouAPP as s, bilibili$1 as si, createKuaishouRoutes as sn, KuaishouValidationSchemas as sr, createRichTextDocument as st, kkkUpdate as t, emitLogError as ti, createAmagiClient as tn, KuaishouCommentParamsSchema as tr, createLinkCardNode as tt, testPush as u, getBilibiliData as ui, douyinUtils as un, DouyinCommentReplyParamsSchema as ur, createTopicNode as ut, douyinPushList as v, handleError as vn, DouyinQrcodeParamsSchema as vr, SOFT_ERROR_CODES as vt, help as w, qtparam as wn, BilibiliApplyCaptchaParamsSchema as wr, CreateApp as wt, setbiliPush as x, parseDmSegMobileReply as xn, DouyinUserParamsSchema as xr, kuaishouFetcher as xt, forcePush as y, bilibiliErrorCodeMap as yn, DouyinSearchParamsSchema as yr, bilibiliFetcher as yt, initAllDatabases as z, douyinFetcher$1 as zn, BilibiliLoginParamsSchema as zr, BilibiliMethodToFetcher as zt };
|