rssany 0.2.0 → 0.3.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/README.md +22 -22
- package/app/plugins/builtin/agi-eval-evaluation.rssany.js +6 -7
- package/app/plugins/builtin/amii-research-talent.rssany.js +6 -7
- package/app/plugins/builtin/anthropic-research.rssany.js +6 -8
- package/app/plugins/builtin/appen-resources.rssany.js +6 -7
- package/app/plugins/builtin/baai-wudao-paper-article.rssany.js +9 -10
- package/app/plugins/builtin/baaidata-csdn.rssany.js +6 -7
- package/app/plugins/builtin/baidu-research.rssany.js +5 -8
- package/app/plugins/builtin/brightdata-blog.rssany.js +6 -11
- package/app/plugins/builtin/bytedance-seed-research.rssany.js +5 -7
- package/app/plugins/builtin/email.rssany.js +9 -9
- package/app/plugins/builtin/five-radar.rssany.js +9 -11
- package/app/plugins/builtin/flageval-news.rssany.js +5 -7
- package/app/plugins/builtin/google-deepmind-research.rssany.js +6 -8
- package/app/plugins/builtin/google-research-datasets.rssany.js +6 -8
- package/app/plugins/builtin/google-research.rssany.js +6 -8
- package/app/plugins/builtin/hacker-news-newest.rssany.js +7 -9
- package/app/plugins/builtin/harvard-dataverse.rssany.js +6 -8
- package/app/plugins/builtin/huaweicloud-bbs-blogs.rssany.js +7 -9
- package/app/plugins/builtin/lingowhale.rssany.js +7 -9
- package/app/plugins/builtin/meituan-tech.rssany.js +7 -10
- package/app/plugins/builtin/meta-ai-publications.rssany.js +6 -11
- package/app/plugins/builtin/mila-quebec.rssany.js +6 -8
- package/app/plugins/builtin/mit-csail-research.rssany.js +7 -9
- package/app/plugins/builtin/moonshot.rssany.js +6 -8
- package/app/plugins/builtin/opendatalab-news.rssany.js +6 -7
- package/app/plugins/builtin/opendatalab.rssany.js +5 -6
- package/app/plugins/builtin/opendrivelab-autonomous-driving.rssany.js +6 -7
- package/app/plugins/builtin/opendrivelab-embodiedai.rssany.js +7 -8
- package/app/plugins/builtin/opendrivelab-publications.rssany.js +6 -8
- package/app/plugins/builtin/opendrivelab.rssany.js +7 -8
- package/app/plugins/builtin/paperswithcode.rssany.js +6 -8
- package/app/plugins/builtin/pjlab-adg-publications.rssany.js +7 -9
- package/app/plugins/builtin/rss.rssany.js +11 -12
- package/app/plugins/builtin/selectdataset.rssany.js +6 -8
- package/app/plugins/builtin/sensetime-tech-achievements.rssany.js +7 -8
- package/app/plugins/builtin/supervisely-blog.rssany.js +6 -8
- package/app/plugins/builtin/theinformation-briefings.rssany.js +7 -13
- package/app/plugins/builtin/uci-ml-repository.rssany.js +6 -7
- package/app/plugins/builtin/venturebeat.rssany.js +7 -9
- package/app/plugins/builtin/worldlabs.rssany.js +6 -8
- package/app/plugins/builtin/x.rssany.js +7 -9
- package/app/plugins/builtin/xiaohongshu.rssany.js +119 -56
- package/app/plugins/builtin/zhipu-research.rssany.js +5 -8
- package/app/plugins/site.rssany.js +25 -26
- package/{statics → app/statics}/README.md +7 -7
- package/app/webui/build/200.html +51 -0
- package/{webui/build/_app/immutable/assets/0.BB88QFoe.css → app/webui/build/_app/immutable/assets/0.DsKls1SN.css} +1 -1
- package/app/webui/build/_app/immutable/assets/13.Qu_tY6H9.css +1 -0
- package/app/webui/build/_app/immutable/assets/14.DfMfOrS3.css +1 -0
- package/app/webui/build/_app/immutable/assets/16.Cw9oSkcO.css +1 -0
- package/app/webui/build/_app/immutable/assets/4.Di6rvlY-.css +1 -0
- package/{webui/build/_app/immutable/assets/SourcesList.yTBBi3_m.css → app/webui/build/_app/immutable/assets/SourcesList.D5Lso0bo.css} +1 -1
- package/{webui/build/_app/immutable/assets/homeFeedPanelStore.CSvlNcpm.css → app/webui/build/_app/immutable/assets/homeFeedPanelStore.CE6xTfsa.css} +1 -1
- package/app/webui/build/_app/immutable/chunks/6prdYIKP.js +1 -0
- package/{webui/build/_app/immutable/chunks/Xy_fhzQq.js → app/webui/build/_app/immutable/chunks/B-CeeY89.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/B2cyTHdf.js +2 -0
- package/{webui/build/_app/immutable/chunks/DjNLq3TF.js → app/webui/build/_app/immutable/chunks/B6WG2Sd3.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/BA4Gucnq.js +1 -0
- package/{webui/build/_app/immutable/chunks/xtNWTdbD.js → app/webui/build/_app/immutable/chunks/BAJAS8BI.js} +1 -1
- package/{webui/build/_app/immutable/chunks/Dt2CddFe.js → app/webui/build/_app/immutable/chunks/BkD3yAYe.js} +1 -1
- package/{webui/build/_app/immutable/chunks/DFuhmi31.js → app/webui/build/_app/immutable/chunks/C4uF_YIK.js} +1 -1
- package/{webui/build/_app/immutable/chunks/Dw782Tjs.js → app/webui/build/_app/immutable/chunks/C8umpVpB.js} +1 -1
- package/{webui/build/_app/immutable/chunks/BQqoDzLx.js → app/webui/build/_app/immutable/chunks/CFwxUBGi.js} +1 -1
- package/{webui/build/_app/immutable/chunks/tB7QMF3U.js → app/webui/build/_app/immutable/chunks/CGCMIfh3.js} +1 -1
- package/{webui/build/_app/immutable/chunks/BK3WtZwv.js → app/webui/build/_app/immutable/chunks/CS53ooo0.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/CVW0ymE1.js +1 -0
- package/{webui/build/_app/immutable/chunks/B-OsL1Ct.js → app/webui/build/_app/immutable/chunks/ChUctqXA.js} +1 -1
- package/{webui/build/_app/immutable/chunks/D5GvRCv7.js → app/webui/build/_app/immutable/chunks/ClknbeNl.js} +1 -1
- package/{webui/build/_app/immutable/chunks/Bu9HsS-V.js → app/webui/build/_app/immutable/chunks/CqYSO3Dx.js} +1 -1
- package/{webui/build/_app/immutable/chunks/CWNeClHp.js → app/webui/build/_app/immutable/chunks/D6kzEN_P.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/DAdOEnFb.js +1 -0
- package/{webui/build/_app/immutable/chunks/Cihqbfi5.js → app/webui/build/_app/immutable/chunks/DCEayuDt.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/DJ2e04vK.js +36 -0
- package/{webui/build/_app/immutable/chunks/DEDI7Ecm.js → app/webui/build/_app/immutable/chunks/DL3Q5sfb.js} +1 -1
- package/{webui/build/_app/immutable/chunks/CVzlFH44.js → app/webui/build/_app/immutable/chunks/DVa8Y-mQ.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/DkamXS6W.js +36 -0
- package/app/webui/build/_app/immutable/chunks/DoRPmqLn.js +2 -0
- package/app/webui/build/_app/immutable/chunks/DsxvjlCC.js +13 -0
- package/{webui/build/_app/immutable/chunks/Bp63qm3L.js → app/webui/build/_app/immutable/chunks/Dyvi1wBH.js} +1 -1
- package/{webui/build/_app/immutable/chunks/CmjOpds-.js → app/webui/build/_app/immutable/chunks/_qj9U-za.js} +1 -1
- package/app/webui/build/_app/immutable/chunks/vtBo8kBV.js +1 -0
- package/app/webui/build/_app/immutable/entry/app.RFfWi3_i.js +2 -0
- package/app/webui/build/_app/immutable/entry/start.DU_kyeGS.js +1 -0
- package/{webui/build/_app/immutable/nodes/0.I1lQdWMl.js → app/webui/build/_app/immutable/nodes/0.DK_mcVDm.js} +1 -1
- package/app/webui/build/_app/immutable/nodes/1.0PRrU2uQ.js +1 -0
- package/{webui/build/_app/immutable/nodes/10.CvfUsqsw.js → app/webui/build/_app/immutable/nodes/10.CsxzlUER.js} +1 -1
- package/app/webui/build/_app/immutable/nodes/11.D-PkhIRW.js +1 -0
- package/{webui/build/_app/immutable/nodes/12.DVFJuIWI.js → app/webui/build/_app/immutable/nodes/12.GGf-JLUY.js} +1 -1
- package/app/webui/build/_app/immutable/nodes/13.DWWcH27k.js +6 -0
- package/app/webui/build/_app/immutable/nodes/14.COwSLwDN.js +1 -0
- package/app/webui/build/_app/immutable/nodes/15.nDN_AHrs.js +1 -0
- package/app/webui/build/_app/immutable/nodes/16.zfSe93Ab.js +24 -0
- package/app/webui/build/_app/immutable/nodes/2.AJd2163d.js +1 -0
- package/app/webui/build/_app/immutable/nodes/3.CEVEHuaH.js +1 -0
- package/app/webui/build/_app/immutable/nodes/4.BT_N8pCh.js +2 -0
- package/{webui/build/_app/immutable/nodes/5.B6fR3n6J.js → app/webui/build/_app/immutable/nodes/5.BZScQ2CH.js} +1 -1
- package/{webui/build/_app/immutable/nodes/6.j2O5Mwjv.js → app/webui/build/_app/immutable/nodes/6.CkFk8X--.js} +1 -1
- package/app/webui/build/_app/immutable/nodes/7.CuQJk7te.js +1 -0
- package/{webui/build/_app/immutable/nodes/8.Bw_d63B_.js → app/webui/build/_app/immutable/nodes/8.DIavWJnU.js} +1 -1
- package/{webui/build/_app/immutable/nodes/9.pMMi5PP6.js → app/webui/build/_app/immutable/nodes/9.Db30M8x0.js} +1 -1
- package/app/webui/build/_app/version.json +1 -0
- package/app/webui/build/apple-touch-icon.png +0 -0
- package/app/webui/build/favicon.ico +0 -0
- package/app/webui/build/favicon.png +0 -0
- package/bin/rssany.js +226 -6
- package/dist/index.js +209 -152
- package/dist/index.js.map +1 -1
- package/package.json +22 -16
- package/scripts/dev.mjs +114 -0
- package/scripts/reset.mjs +1 -1
- package/init/config.json +0 -17
- package/init/sources.json +0 -353
- package/statics/401.html +0 -56
- package/statics/404.html +0 -12
- package/statics/image.png +0 -0
- package/webui/build/200.html +0 -49
- package/webui/build/_app/immutable/assets/13.BhO9zvFi.css +0 -1
- package/webui/build/_app/immutable/assets/14.CujIhjQK.css +0 -1
- package/webui/build/_app/immutable/assets/16.PP9XLDf7.css +0 -1
- package/webui/build/_app/immutable/assets/4.9wPHhVwv.css +0 -1
- package/webui/build/_app/immutable/chunks/5LVkDJzw.js +0 -1
- package/webui/build/_app/immutable/chunks/B2Q1a1-H.js +0 -2
- package/webui/build/_app/immutable/chunks/BbWUOQ_m.js +0 -1
- package/webui/build/_app/immutable/chunks/Bns1MuyM.js +0 -36
- package/webui/build/_app/immutable/chunks/DMWEh-Ek.js +0 -2
- package/webui/build/_app/immutable/chunks/bvuf_jZd.js +0 -36
- package/webui/build/_app/immutable/chunks/lk5LaiqA.js +0 -1
- package/webui/build/_app/immutable/chunks/mW5RwvnK.js +0 -13
- package/webui/build/_app/immutable/entry/app.BVkrDt5l.js +0 -2
- package/webui/build/_app/immutable/entry/start.D3Q-BMMd.js +0 -1
- package/webui/build/_app/immutable/nodes/1.BiQQfx2j.js +0 -1
- package/webui/build/_app/immutable/nodes/11.B4LHPNL6.js +0 -1
- package/webui/build/_app/immutable/nodes/13.nT3SOzEB.js +0 -1
- package/webui/build/_app/immutable/nodes/14.DfaAf0f8.js +0 -1
- package/webui/build/_app/immutable/nodes/15.CMzkX9OK.js +0 -1
- package/webui/build/_app/immutable/nodes/16.zPgTQNze.js +0 -24
- package/webui/build/_app/immutable/nodes/2.BYWOpaxy.js +0 -1
- package/webui/build/_app/immutable/nodes/3.B8Viux9S.js +0 -1
- package/webui/build/_app/immutable/nodes/4.DTSxpKm7.js +0 -2
- package/webui/build/_app/immutable/nodes/7.Bd2USIrl.js +0 -1
- package/webui/build/_app/version.json +0 -1
- /package/{webui → app/webui}/build/_app/env.js +0 -0
- /package/{webui → app/webui}/build/_app/immutable/assets/10.Dj8_pmut.css +0 -0
- /package/{webui → app/webui}/build/_app/immutable/assets/11.qYZMiTb0.css +0 -0
- /package/{webui → app/webui}/build/_app/immutable/assets/12.DfJcfUWl.css +0 -0
- /package/{webui → app/webui}/build/_app/immutable/assets/15.nNGjXhCQ.css +0 -0
- /package/{webui → app/webui}/build/_app/immutable/assets/5.B-dPiwB7.css +0 -0
- /package/{webui → app/webui}/build/_app/immutable/assets/6.B27N7pdA.css +0 -0
- /package/{webui → app/webui}/build/_app/immutable/assets/7.CrNxmd8B.css +0 -0
- /package/{webui → app/webui}/build/_app/immutable/assets/8.Cgji2b15.css +0 -0
- /package/{webui → app/webui}/build/_app/immutable/assets/9.BsCIAvn3.css +0 -0
- /package/{webui → app/webui}/build/_app/immutable/assets/BackToParentRoute.DGk-X5ow.css +0 -0
- /package/{webui → app/webui}/build/_app/immutable/chunks/BUApaBEI.js +0 -0
- /package/{webui → app/webui}/build/_app/immutable/chunks/Bfc47y5P.js +0 -0
- /package/{webui → app/webui}/build/_app/immutable/chunks/CBY2biv-.js +0 -0
- /package/{webui → app/webui}/build/_app/immutable/chunks/hp4PFHFv.js +0 -0
- /package/{webui → app/webui}/build/_app/immutable/nodes/17.BtYZF6FM.js +0 -0
- /package/{webui → app/webui}/build/_app/immutable/nodes/18.BIzqhTqv.js +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rssany",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Universal RSS/Atom/JSON Feed pipeline — fetches, extracts, parses and converts any web content into consumable feeds with plugin support",
|
|
5
5
|
"author": "Joo",
|
|
6
6
|
"type": "module",
|
|
@@ -17,18 +17,19 @@
|
|
|
17
17
|
"app/plugins/builtin",
|
|
18
18
|
"app/plugins/site.rssany.js",
|
|
19
19
|
"statics",
|
|
20
|
-
"webui/build",
|
|
20
|
+
"app/webui/build",
|
|
21
21
|
".env.example",
|
|
22
22
|
"README.md",
|
|
23
23
|
"init",
|
|
24
|
-
"scripts/reset.mjs"
|
|
24
|
+
"scripts/reset.mjs",
|
|
25
|
+
"scripts/dev.mjs"
|
|
25
26
|
],
|
|
26
27
|
"engines": {
|
|
27
28
|
"node": ">=20 <24"
|
|
28
29
|
},
|
|
29
30
|
"scripts": {
|
|
30
31
|
"build": "vite build",
|
|
31
|
-
"dev": "
|
|
32
|
+
"dev": "node scripts/dev.mjs",
|
|
32
33
|
"dev:backend": "cross-env PORT=3999 tsx app/index.ts",
|
|
33
34
|
"start": "node dist/index.js",
|
|
34
35
|
"serve:route": "node scripts/serve-route.mjs",
|
|
@@ -40,15 +41,20 @@
|
|
|
40
41
|
"typecheck": "tsc --noEmit",
|
|
41
42
|
"reset": "node scripts/reset.mjs",
|
|
42
43
|
"proxy-browser": "tsx scripts/proxy-browser.ts",
|
|
43
|
-
"webui:install": "cd webui && npm install",
|
|
44
|
-
"webui:dev": "cd webui && npm run
|
|
45
|
-
"webui:build": "cd webui && npm run build",
|
|
46
|
-
"webui:watch": "cd webui && npm run build:watch",
|
|
47
|
-
"dev:all": "
|
|
44
|
+
"webui:install": "cd app/webui && npm install",
|
|
45
|
+
"webui:dev": "cd app/webui && npm run build:watch",
|
|
46
|
+
"webui:build": "cd app/webui && npm run build",
|
|
47
|
+
"webui:watch": "cd app/webui && npm run build:watch",
|
|
48
|
+
"dev:all": "npm run dev",
|
|
48
49
|
"build:all": "npm run build && npm run webui:build",
|
|
49
50
|
"prepublishOnly": "npm run build:all",
|
|
50
51
|
"docker:build": "bash scripts/docker-build.sh",
|
|
51
|
-
"docker:build:tag": "bash scripts/docker-build.sh"
|
|
52
|
+
"docker:build:tag": "bash scripts/docker-build.sh",
|
|
53
|
+
"landing:install": "cd landing && npm install",
|
|
54
|
+
"landing:dev": "cd landing && npm run dev",
|
|
55
|
+
"landing:build": "cd landing && npm run build",
|
|
56
|
+
"deploy": "node scripts/deploy-landing.mjs",
|
|
57
|
+
"deploy:landing": "node scripts/deploy-landing.mjs"
|
|
52
58
|
},
|
|
53
59
|
"keywords": [
|
|
54
60
|
"rss",
|
|
@@ -60,7 +66,7 @@
|
|
|
60
66
|
"license": "MIT",
|
|
61
67
|
"devDependencies": {
|
|
62
68
|
"@eslint/js": "^9.15.0",
|
|
63
|
-
"@types/jsdom": "^
|
|
69
|
+
"@types/jsdom": "^28.0.3",
|
|
64
70
|
"@types/mailparser": "^3.4.6",
|
|
65
71
|
"@types/node": "^25.2.0",
|
|
66
72
|
"@types/node-cron": "^3.0.11",
|
|
@@ -69,6 +75,7 @@
|
|
|
69
75
|
"cross-env": "^7.0.3",
|
|
70
76
|
"eslint": "^9.15.0",
|
|
71
77
|
"globals": "^15.12.0",
|
|
78
|
+
"ssh2": "^1.17.0",
|
|
72
79
|
"tsx": "^4.19.0",
|
|
73
80
|
"typescript": "~5.6.0",
|
|
74
81
|
"typescript-eslint": "^8.15.0",
|
|
@@ -83,15 +90,14 @@
|
|
|
83
90
|
"hono": "^4.12.12",
|
|
84
91
|
"https-proxy-agent": "^7.0.6",
|
|
85
92
|
"imapflow": "^1.2.10",
|
|
86
|
-
"jsdom": "^
|
|
93
|
+
"jsdom": "^29.1.1",
|
|
87
94
|
"mailparser": "^3.9.3",
|
|
88
95
|
"marked": "^17.0.3",
|
|
89
|
-
"node-cron": "^
|
|
96
|
+
"node-cron": "^4.2.1",
|
|
90
97
|
"node-html-parser": "^7.0.2",
|
|
91
98
|
"nodemailer": "^8.0.2",
|
|
92
|
-
"openai": "^
|
|
99
|
+
"openai": "^6.42.0",
|
|
93
100
|
"puppeteer-core": "^24.36.0",
|
|
94
|
-
"rss-parser": "^3.13.0"
|
|
95
|
-
"zod": "^4.3.6"
|
|
101
|
+
"rss-parser": "^3.13.0"
|
|
96
102
|
}
|
|
97
103
|
}
|
package/scripts/dev.mjs
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn, execFileSync } from "node:child_process";
|
|
3
|
+
import { existsSync, statSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
|
|
6
|
+
const root = join(import.meta.dirname, "..");
|
|
7
|
+
const npmCmd = "npm";
|
|
8
|
+
const webuiMarker = join(root, "app", "webui", "build", "200.html");
|
|
9
|
+
const initialMarkerMtime = existsSync(webuiMarker) ? statSync(webuiMarker).mtimeMs : 0;
|
|
10
|
+
|
|
11
|
+
const children = new Set();
|
|
12
|
+
let shuttingDown = false;
|
|
13
|
+
|
|
14
|
+
function spawnNpm(args, opts = {}) {
|
|
15
|
+
const child = spawn(npmCmd, args, {
|
|
16
|
+
cwd: root,
|
|
17
|
+
env: process.env,
|
|
18
|
+
stdio: opts.stdio ?? ["ignore", "pipe", "pipe"],
|
|
19
|
+
// Windows: Node 20.12+ / 22+ reject spawning .cmd without shell (CVE-2024-27980).
|
|
20
|
+
shell: process.platform === "win32",
|
|
21
|
+
});
|
|
22
|
+
children.add(child);
|
|
23
|
+
child.once("exit", () => children.delete(child));
|
|
24
|
+
return child;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function stopProcessTree(child) {
|
|
28
|
+
if (!child || child.killed) return;
|
|
29
|
+
if (process.platform === "win32") {
|
|
30
|
+
try {
|
|
31
|
+
execFileSync("taskkill.exe", ["/pid", String(child.pid), "/t", "/f"], { stdio: "ignore" });
|
|
32
|
+
return;
|
|
33
|
+
} catch {
|
|
34
|
+
// Fall through to plain kill.
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
child.kill("SIGTERM");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function shutdown(code = 0) {
|
|
41
|
+
if (shuttingDown) return;
|
|
42
|
+
shuttingDown = true;
|
|
43
|
+
for (const child of Array.from(children)) stopProcessTree(child);
|
|
44
|
+
process.exitCode = code;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function pipeOutput(child, label) {
|
|
48
|
+
child.stdout?.on("data", (chunk) => process.stdout.write(`[${label}] ${chunk}`));
|
|
49
|
+
child.stderr?.on("data", (chunk) => process.stderr.write(`[${label}] ${chunk}`));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function waitForInitialWebuiBuild(child) {
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
let done = false;
|
|
55
|
+
const finish = () => {
|
|
56
|
+
if (done) return;
|
|
57
|
+
done = true;
|
|
58
|
+
clearInterval(poll);
|
|
59
|
+
resolve();
|
|
60
|
+
};
|
|
61
|
+
const fail = (err) => {
|
|
62
|
+
if (done) return;
|
|
63
|
+
done = true;
|
|
64
|
+
clearInterval(poll);
|
|
65
|
+
reject(err);
|
|
66
|
+
};
|
|
67
|
+
const hasFreshMarker = () => {
|
|
68
|
+
if (!existsSync(webuiMarker)) return false;
|
|
69
|
+
return statSync(webuiMarker).mtimeMs > initialMarkerMtime;
|
|
70
|
+
};
|
|
71
|
+
const poll = setInterval(() => {
|
|
72
|
+
if (hasFreshMarker()) finish();
|
|
73
|
+
}, 500);
|
|
74
|
+
child.stdout?.on("data", (chunk) => {
|
|
75
|
+
const text = chunk.toString();
|
|
76
|
+
if (text.includes('Wrote site to "build"') || text.includes("Wrote site to 'build'")) {
|
|
77
|
+
finish();
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
child.once("exit", (code) => {
|
|
81
|
+
if (!done) fail(new Error(`webui watch exited before initial build completed (code ${code ?? "unknown"})`));
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
process.on("SIGINT", () => shutdown(0));
|
|
87
|
+
process.on("SIGTERM", () => shutdown(0));
|
|
88
|
+
|
|
89
|
+
console.log("Starting WebUI static build watcher...");
|
|
90
|
+
const webui = spawnNpm(["run", "webui:watch"]);
|
|
91
|
+
pipeOutput(webui, "webui");
|
|
92
|
+
|
|
93
|
+
try {
|
|
94
|
+
await waitForInitialWebuiBuild(webui);
|
|
95
|
+
console.log("WebUI initial build is ready. Starting backend server...");
|
|
96
|
+
const backend = spawnNpm(["run", "dev:backend"]);
|
|
97
|
+
pipeOutput(backend, "backend");
|
|
98
|
+
|
|
99
|
+
backend.once("exit", (code) => {
|
|
100
|
+
if (!shuttingDown) {
|
|
101
|
+
console.log(`Backend exited (code ${code ?? "unknown"}). Stopping WebUI watcher...`);
|
|
102
|
+
shutdown(code ?? 0);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
webui.once("exit", (code) => {
|
|
106
|
+
if (!shuttingDown) {
|
|
107
|
+
console.log(`WebUI watcher exited (code ${code ?? "unknown"}). Stopping backend...`);
|
|
108
|
+
shutdown(code ?? 0);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
} catch (err) {
|
|
112
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
113
|
+
shutdown(1);
|
|
114
|
+
}
|
package/scripts/reset.mjs
CHANGED
package/init/config.json
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"globalProxy": "",
|
|
3
|
-
"pipeline": {
|
|
4
|
-
"steps": [
|
|
5
|
-
{ "id": "tagger", "enabled": false },
|
|
6
|
-
{ "id": "translator", "enabled": false }
|
|
7
|
-
]
|
|
8
|
-
},
|
|
9
|
-
"deliver": {
|
|
10
|
-
"gateway": "",
|
|
11
|
-
"token": ""
|
|
12
|
-
},
|
|
13
|
-
"llm": {
|
|
14
|
-
"baseUrl": "https://api.openai.com/v1",
|
|
15
|
-
"model": "gpt-4o-mini"
|
|
16
|
-
}
|
|
17
|
-
}
|
package/init/sources.json
DELETED
|
@@ -1,353 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"sources": [
|
|
3
|
-
{
|
|
4
|
-
"ref": "https://www.theinformation.com/",
|
|
5
|
-
"label": "The Information",
|
|
6
|
-
"description": "科技商业深度报道",
|
|
7
|
-
"refresh": "1h",
|
|
8
|
-
"weight": 0.95
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
"ref": "https://techcrunch.com/feed/",
|
|
12
|
-
"label": "TechCrunch AI",
|
|
13
|
-
"description": "创业与产品资讯",
|
|
14
|
-
"refresh": "1h",
|
|
15
|
-
"weight": 0.95
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
"ref": "https://www.technologyreview.com/feed/",
|
|
19
|
-
"label": "MIT Technology Review",
|
|
20
|
-
"description": "MIT 科技评论",
|
|
21
|
-
"refresh": "1h",
|
|
22
|
-
"weight": 0.94
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
"ref": "https://venturebeat.com/category/ai/feed/",
|
|
26
|
-
"label": "VentureBeat AI频道",
|
|
27
|
-
"description": "VentureBeat AI频道",
|
|
28
|
-
"refresh": "1h",
|
|
29
|
-
"weight": 0.82
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
"ref": "https://rss.slashdot.org/Slashdot/slashdotDevelopers",
|
|
33
|
-
"label": "Slashdot开发者频道",
|
|
34
|
-
"description": "科技新闻聚合",
|
|
35
|
-
"refresh": "1h",
|
|
36
|
-
"weight": 0.62
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"ref": "https://news.ycombinator.com/rss",
|
|
40
|
-
"label": "HN newest",
|
|
41
|
-
"description": "Hacker News 最新",
|
|
42
|
-
"refresh": "6h",
|
|
43
|
-
"weight": 0.92
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"ref": "https://x.com/elonmusk",
|
|
47
|
-
"label": "elonmusk",
|
|
48
|
-
"description": "Elon Musk 推文",
|
|
49
|
-
"refresh": "1h",
|
|
50
|
-
"weight": 0.88
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
"ref": "https://x.com/AIatMeta",
|
|
54
|
-
"label": "Meta AI",
|
|
55
|
-
"description": "Meta AI 官方",
|
|
56
|
-
"refresh": "1h",
|
|
57
|
-
"weight": 0.88
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
"ref": "https://x.com/OpenAI",
|
|
61
|
-
"label": "OpenAI",
|
|
62
|
-
"description": "OpenAI 官方推特",
|
|
63
|
-
"refresh": "1h",
|
|
64
|
-
"weight": 0.94
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
"ref": "https://x.com/GoogleAI",
|
|
68
|
-
"label": "Google",
|
|
69
|
-
"description": "Google AI 官方",
|
|
70
|
-
"refresh": "1h",
|
|
71
|
-
"weight": 0.9
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
"ref": "https://x.com/Microsoft",
|
|
75
|
-
"label": "Microsoft",
|
|
76
|
-
"description": "微软官方",
|
|
77
|
-
"refresh": "1h",
|
|
78
|
-
"weight": 0.84
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
"ref": "https://x.com/NVIDIA",
|
|
82
|
-
"label": "NVIDIA",
|
|
83
|
-
"description": "英伟达官方",
|
|
84
|
-
"refresh": "1h",
|
|
85
|
-
"weight": 0.9
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
"ref": "https://x.com/NVIDIARobotics",
|
|
89
|
-
"label": "NVIDIA Robotics",
|
|
90
|
-
"description": "NVIDIA 机器人",
|
|
91
|
-
"refresh": "1h",
|
|
92
|
-
"weight": 0.8
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
"ref": "https://x.com/xai",
|
|
96
|
-
"label": "xAI",
|
|
97
|
-
"description": "xAI 官方",
|
|
98
|
-
"refresh": "1h",
|
|
99
|
-
"weight": 0.88
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
"ref": "https://x.com/Figure_robot",
|
|
103
|
-
"label": "Figure AI",
|
|
104
|
-
"description": "Figure 人形机器人",
|
|
105
|
-
"refresh": "1h",
|
|
106
|
-
"weight": 0.78
|
|
107
|
-
},
|
|
108
|
-
{
|
|
109
|
-
"ref": "https://rss.arxiv.org/rss/cs.CL",
|
|
110
|
-
"label": "arxiv cs.CL (NLP/LLM)",
|
|
111
|
-
"description": "NLP/大模型论文",
|
|
112
|
-
"refresh": "1day",
|
|
113
|
-
"weight": 0.96
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
"ref": "https://rss.arxiv.org/rss/cs.LG",
|
|
117
|
-
"label": "arxiv cs.LG (Machine Learning)",
|
|
118
|
-
"description": "机器学习论文",
|
|
119
|
-
"refresh": "1day",
|
|
120
|
-
"weight": 0.93
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
"ref": "https://x.com/turingcom",
|
|
124
|
-
"label": "Turing",
|
|
125
|
-
"description": "Turing 数据标注",
|
|
126
|
-
"refresh": "1h",
|
|
127
|
-
"weight": 0.52
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
"ref": "https://x.com/scale_ai",
|
|
131
|
-
"label": "Scale AI 博客",
|
|
132
|
-
"description": "Scale AI 数据标注",
|
|
133
|
-
"refresh": "1h",
|
|
134
|
-
"weight": 0.72
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
"ref": "https://x.com/labelbox",
|
|
138
|
-
"label": "Labelbox",
|
|
139
|
-
"description": "Labelbox 数据标注平台",
|
|
140
|
-
"refresh": "1h",
|
|
141
|
-
"weight": 0.54
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
"ref": "https://www.kognic.com/articles",
|
|
145
|
-
"label": "Kognic",
|
|
146
|
-
"description": "自动驾驶数据标注",
|
|
147
|
-
"refresh": "1h",
|
|
148
|
-
"weight": 0.56
|
|
149
|
-
},
|
|
150
|
-
{
|
|
151
|
-
"ref": "https://x.com/geoffreyhinton",
|
|
152
|
-
"label": "Geoffrey Hinton",
|
|
153
|
-
"description": "图灵奖得主,深度学习教父",
|
|
154
|
-
"refresh": "1h",
|
|
155
|
-
"weight": 0.9
|
|
156
|
-
},
|
|
157
|
-
{
|
|
158
|
-
"ref": "https://x.com/AndrewYNg",
|
|
159
|
-
"label": "Andrew Ng",
|
|
160
|
-
"description": "Coursera 创始人,AI 教育",
|
|
161
|
-
"refresh": "1h",
|
|
162
|
-
"weight": 0.9
|
|
163
|
-
},
|
|
164
|
-
{
|
|
165
|
-
"ref": "https://x.com/drfeifei",
|
|
166
|
-
"label": "李飞飞",
|
|
167
|
-
"description": "斯坦福 AI 实验室主任",
|
|
168
|
-
"refresh": "6h",
|
|
169
|
-
"proxy": "http://192.168.34.247:30002",
|
|
170
|
-
"weight": 0.95
|
|
171
|
-
},
|
|
172
|
-
{
|
|
173
|
-
"ref": "https://x.com/percyliang",
|
|
174
|
-
"label": "Percy Liang",
|
|
175
|
-
"description": "斯坦福 CRFM 主任",
|
|
176
|
-
"refresh": "1h",
|
|
177
|
-
"weight": 0.86
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
"ref": "https://x.com/ilyasut",
|
|
181
|
-
"label": "Ilya Sutskever",
|
|
182
|
-
"description": "OpenAI 联合创始人",
|
|
183
|
-
"refresh": "1h",
|
|
184
|
-
"weight": 0.9
|
|
185
|
-
},
|
|
186
|
-
{
|
|
187
|
-
"ref": "https://www.moonshot.ai/",
|
|
188
|
-
"label": "Moonshot",
|
|
189
|
-
"description": "月之暗面",
|
|
190
|
-
"refresh": "1day",
|
|
191
|
-
"weight": 0.85
|
|
192
|
-
},
|
|
193
|
-
{
|
|
194
|
-
"ref": "https://www.microsoft.com/en-us/research/blog/",
|
|
195
|
-
"label": "Microsoft Research",
|
|
196
|
-
"description": "微软研究院博客",
|
|
197
|
-
"refresh": "1day",
|
|
198
|
-
"weight": 0.88
|
|
199
|
-
},
|
|
200
|
-
{
|
|
201
|
-
"ref": "https://www.csail.mit.edu/research",
|
|
202
|
-
"label": "MIT CSAIL",
|
|
203
|
-
"description": "MIT 计算机与 AI 实验室",
|
|
204
|
-
"refresh": "1day",
|
|
205
|
-
"weight": 0.84
|
|
206
|
-
},
|
|
207
|
-
{
|
|
208
|
-
"ref": "https://www.anthropic.com/research",
|
|
209
|
-
"label": "Anthropic Research",
|
|
210
|
-
"description": "Anthropic 研究论文",
|
|
211
|
-
"refresh": "1day",
|
|
212
|
-
"weight": 0.95
|
|
213
|
-
},
|
|
214
|
-
{
|
|
215
|
-
"ref": "https://trendshift.io/github-trending-repositories?trending-range=1",
|
|
216
|
-
"label": "Trendshift热门仓库",
|
|
217
|
-
"description": "AI 趋势追踪",
|
|
218
|
-
"refresh": "1h",
|
|
219
|
-
"weight": 0.74
|
|
220
|
-
},
|
|
221
|
-
{
|
|
222
|
-
"ref": "https://tech.meituan.com/feed/",
|
|
223
|
-
"label": "美团技术",
|
|
224
|
-
"description": "美团技术博客",
|
|
225
|
-
"refresh": "1day",
|
|
226
|
-
"weight": 0.68
|
|
227
|
-
},
|
|
228
|
-
{
|
|
229
|
-
"ref": "https://research.google/",
|
|
230
|
-
"label": "Google Research",
|
|
231
|
-
"description": "Google 研究院",
|
|
232
|
-
"refresh": "1day",
|
|
233
|
-
"weight": 0.9
|
|
234
|
-
},
|
|
235
|
-
{
|
|
236
|
-
"ref": "https://research.google/resources/datasets/",
|
|
237
|
-
"label": "Google Datasets",
|
|
238
|
-
"description": "Google 公开数据集",
|
|
239
|
-
"refresh": "1day",
|
|
240
|
-
"weight": 0.76
|
|
241
|
-
},
|
|
242
|
-
{
|
|
243
|
-
"ref": "https://paperswithcode.co/",
|
|
244
|
-
"label": "Papers with Code",
|
|
245
|
-
"description": "论文与代码检索",
|
|
246
|
-
"refresh": "1day",
|
|
247
|
-
"weight": 0.88
|
|
248
|
-
},
|
|
249
|
-
{
|
|
250
|
-
"ref": "https://opendrivelab.com/EmbodiedAI",
|
|
251
|
-
"label": "OpenDriveLab Embodied",
|
|
252
|
-
"description": "具身智能与自动驾驶",
|
|
253
|
-
"refresh": "1day",
|
|
254
|
-
"weight": 0.8
|
|
255
|
-
},
|
|
256
|
-
{
|
|
257
|
-
"ref": "https://opendatalab.org.cn",
|
|
258
|
-
"label": "OpenDataLab",
|
|
259
|
-
"description": "开放数据平台",
|
|
260
|
-
"refresh": "1day",
|
|
261
|
-
"weight": 0.74
|
|
262
|
-
},
|
|
263
|
-
{
|
|
264
|
-
"ref": "https://mlcommons.org/research/",
|
|
265
|
-
"label": "MLCommons",
|
|
266
|
-
"description": "MLCommons 基准与研究",
|
|
267
|
-
"refresh": "1day",
|
|
268
|
-
"weight": 0.76
|
|
269
|
-
},
|
|
270
|
-
{
|
|
271
|
-
"ref": "https://mila.quebec/en",
|
|
272
|
-
"label": "Mila Quebec",
|
|
273
|
-
"description": "蒙特利尔 AI 研究所",
|
|
274
|
-
"refresh": "1day",
|
|
275
|
-
"weight": 0.82
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
"ref": "https://lmsys.org/projects/",
|
|
279
|
-
"label": "LMSys",
|
|
280
|
-
"description": "大模型排行榜",
|
|
281
|
-
"refresh": "1day",
|
|
282
|
-
"weight": 0.85
|
|
283
|
-
},
|
|
284
|
-
{
|
|
285
|
-
"ref": "https://huggingface.co/blog",
|
|
286
|
-
"label": "Hugging Face Blog",
|
|
287
|
-
"description": "Hugging Face 官方博客",
|
|
288
|
-
"refresh": "1day",
|
|
289
|
-
"weight": 0.9
|
|
290
|
-
},
|
|
291
|
-
{
|
|
292
|
-
"ref": "https://flageval.baai.ac.cn/#/news",
|
|
293
|
-
"label": "FlagEval",
|
|
294
|
-
"description": "智源大模型评测",
|
|
295
|
-
"refresh": "1day",
|
|
296
|
-
"weight": 0.7
|
|
297
|
-
},
|
|
298
|
-
{
|
|
299
|
-
"ref": "https://deepmind.google/blog/rss.xml",
|
|
300
|
-
"label": "DeepMind Research",
|
|
301
|
-
"description": "DeepMind 官方RSS",
|
|
302
|
-
"refresh": "1day",
|
|
303
|
-
"weight": 0.95
|
|
304
|
-
},
|
|
305
|
-
{
|
|
306
|
-
"ref": "https://dataverse.harvard.edu",
|
|
307
|
-
"label": "Harvard Dataverse",
|
|
308
|
-
"description": "哈佛学术数据集",
|
|
309
|
-
"refresh": "1day",
|
|
310
|
-
"weight": 0.68
|
|
311
|
-
},
|
|
312
|
-
{
|
|
313
|
-
"ref": "https://bair.berkeley.edu/blog/feed.xml",
|
|
314
|
-
"label": "Berkeley BAIR",
|
|
315
|
-
"description": "伯克利 AI 研究院",
|
|
316
|
-
"refresh": "1day",
|
|
317
|
-
"weight": 0.88
|
|
318
|
-
},
|
|
319
|
-
{
|
|
320
|
-
"ref": "https://ai.meta.com/results/?content_types%5B0%5D=publication",
|
|
321
|
-
"label": "Meta AI Publications",
|
|
322
|
-
"description": "Meta AI 论文",
|
|
323
|
-
"refresh": "1day",
|
|
324
|
-
"weight": 0.88
|
|
325
|
-
},
|
|
326
|
-
{
|
|
327
|
-
"ref": "https://rss.arxiv.org/rss/cs.AI",
|
|
328
|
-
"label": "arXiv cs.AI",
|
|
329
|
-
"description": "arXiv cs.AI",
|
|
330
|
-
"refresh": "1day",
|
|
331
|
-
"weight": 0.95
|
|
332
|
-
},
|
|
333
|
-
{
|
|
334
|
-
"ref": "https://openai.com/news/rss.xml",
|
|
335
|
-
"label": "OpenAI 博客",
|
|
336
|
-
"description": "OpenAI 官方博客",
|
|
337
|
-
"refresh": "1day",
|
|
338
|
-
"weight": 0.97
|
|
339
|
-
},
|
|
340
|
-
{
|
|
341
|
-
"ref": "https://www.reddit.com/r/LocalLLaMA.rss",
|
|
342
|
-
"label": "Reddit 开源大模型板块",
|
|
343
|
-
"refresh": "1day",
|
|
344
|
-
"weight": 0.82
|
|
345
|
-
},
|
|
346
|
-
{
|
|
347
|
-
"ref": "https://datahub.com/feed",
|
|
348
|
-
"label": "Datahub",
|
|
349
|
-
"refresh": "1day",
|
|
350
|
-
"weight": 0.94
|
|
351
|
-
}
|
|
352
|
-
]
|
|
353
|
-
}
|
package/statics/401.html
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="zh-CN">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<title>401 需要登录</title>
|
|
7
|
-
<style>
|
|
8
|
-
body { font-family: system-ui, sans-serif; max-width: 560px; margin: 2rem auto; padding: 0 1rem; }
|
|
9
|
-
h1 { font-size: 1.25rem; margin-bottom: 1rem; }
|
|
10
|
-
.url { word-break: break-all; background: #f5f5f5; padding: 0.5rem 0.75rem; border-radius: 4px; margin: 0.5rem 0 1rem; font-size: 0.875rem; }
|
|
11
|
-
.btn { padding: 0.5rem 1rem; background: #333; color: #fff; border: none; border-radius: 4px; cursor: pointer; font-size: 1rem; }
|
|
12
|
-
.btn:hover { background: #555; }
|
|
13
|
-
.btn:disabled { opacity: 0.6; cursor: not-allowed; }
|
|
14
|
-
.msg { margin-top: 1rem; font-size: 0.875rem; color: #666; }
|
|
15
|
-
.links { margin-top: 1.5rem; font-size: 0.875rem; }
|
|
16
|
-
.links a { color: #0969da; text-decoration: none; }
|
|
17
|
-
.links a:hover { text-decoration: underline; }
|
|
18
|
-
</style>
|
|
19
|
-
</head>
|
|
20
|
-
<body>
|
|
21
|
-
<h1>401 需要登录</h1>
|
|
22
|
-
<p>当前请求的订阅地址需要登录后才能拉取:</p>
|
|
23
|
-
<div class="url" id="failed-url">{{listUrl}}</div>
|
|
24
|
-
<p>请点击下方按钮,在<strong>弹出的有头浏览器窗口</strong>中完成该站点的登录,完成后关闭窗口并刷新本页或 RSS 地址即可。</p>
|
|
25
|
-
<button type="button" class="btn" id="btn-login" data-list-url="{{listUrl}}">打开有头登录页</button>
|
|
26
|
-
<p class="msg" id="api-msg"></p>
|
|
27
|
-
<p class="links"><a href="/">首页</a> · <a href="/plugins">已生效插件</a>(可对需登录站点批量打开登录页)</p>
|
|
28
|
-
<script>
|
|
29
|
-
(function(){
|
|
30
|
-
var btn = document.getElementById('btn-login');
|
|
31
|
-
var urlEl = document.getElementById('failed-url');
|
|
32
|
-
var msgEl = document.getElementById('api-msg');
|
|
33
|
-
var listUrl = btn.getAttribute('data-list-url');
|
|
34
|
-
if (!listUrl) {
|
|
35
|
-
urlEl.textContent = '(未知地址)';
|
|
36
|
-
btn.disabled = true;
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
btn.onclick = function(){
|
|
40
|
-
btn.disabled = true;
|
|
41
|
-
msgEl.textContent = '正在打开登录窗口…';
|
|
42
|
-
fetch('/auth/ensure?url=' + encodeURIComponent(listUrl), { method: 'POST' })
|
|
43
|
-
.then(function(r){ return r.json(); })
|
|
44
|
-
.then(function(d){
|
|
45
|
-
msgEl.textContent = d.message || (d.ok ? '已打开登录窗口。' : '请求失败');
|
|
46
|
-
if (!d.ok) btn.disabled = false;
|
|
47
|
-
})
|
|
48
|
-
.catch(function(){
|
|
49
|
-
msgEl.textContent = '请求失败,请重试';
|
|
50
|
-
btn.disabled = false;
|
|
51
|
-
});
|
|
52
|
-
};
|
|
53
|
-
})();
|
|
54
|
-
</script>
|
|
55
|
-
</body>
|
|
56
|
-
</html>
|
package/statics/404.html
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="zh-CN">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8">
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<title>404 未找到</title>
|
|
7
|
-
</head>
|
|
8
|
-
<body>
|
|
9
|
-
<h1>404 未找到</h1>
|
|
10
|
-
<p>请求的 URL 无匹配的站点规则,请检查 URL 或添加对应插件。</p>
|
|
11
|
-
</body>
|
|
12
|
-
</html>
|
package/statics/image.png
DELETED
|
Binary file
|