luckytri 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/SECURITY.md +4 -4
- package/README.en.md +252 -250
- package/README.md +252 -250
- package/bin/luckytri.js +5 -1
- package/docs/en/CHANGELOG.md +8 -0
- package/docs/en/connect.md +18 -18
- package/docs/en/guide.md +202 -216
- package/docs/en/npm-release.md +25 -25
- package/docs/zh/CHANGELOG.md +8 -0
- package/docs/zh/connect.md +17 -17
- package/docs/zh/guide.md +202 -216
- package/docs/zh/npm-release.md +33 -33
- package/package.json +110 -108
- package/plugins/sdk/index.d.ts +155 -155
- package/plugins/sdk/testing.js +58 -58
- package/plugins/weather/index.js +82 -82
- package/plugins/weather/luckytri-plugin.json +29 -29
- package/public/app/assets/ChatsPage-BhlJHseG.js +3 -0
- package/public/app/assets/Empty-DP6WMGHi.js +2 -0
- package/public/app/assets/Field-CtbdqaiB.js +1 -0
- package/public/app/assets/HeartPage-32BeTPn2.js +1 -0
- package/public/app/assets/LifePage-CxSm0XKI.js +1 -0
- package/public/app/assets/MemoryPage-BeKBcPCY.js +1 -0
- package/public/app/assets/NaturePage-NEPYl2HS.js +3 -0
- package/public/app/assets/PeoplePage-DxtpekwM.js +1 -0
- package/public/app/assets/PluginsPage-CVVQwEBI.css +1 -0
- package/public/app/assets/PluginsPage-DksEZbUU.js +2 -0
- package/public/app/assets/{SystemPage-CAMPoYqM.css → SystemPage-BkRu0Rvx.css} +1 -1
- package/public/app/assets/SystemPage-BvzJlHuY.js +1 -0
- package/public/app/assets/TimePage-7-awH5XL.js +3 -0
- package/public/app/assets/index-4rItIkD-.js +4 -0
- package/public/app/assets/{index-YDz1ree1.css → index-DY4e15Kh.css} +1 -1
- package/public/app/assets/{knowledge-DG0e0uKw.js → knowledge-C6_HvoyB.js} +1 -1
- package/public/app/assets/media-SMfTT-yc.js +1 -0
- package/public/app/index.html +3 -3
- package/public/guide.en.html +72 -99
- package/public/guide.html +44 -86
- package/public/tutorial.en.md +25 -39
- package/public/tutorial.md +25 -39
- package/scripts/backup.js +311 -311
- package/scripts/browser.js +41 -41
- package/scripts/import-data.js +128 -0
- package/scripts/launch.js +101 -94
- package/scripts/plugin.js +150 -150
- package/scripts/reset-password.js +22 -0
- package/scripts/runtime.js +25 -25
- package/scripts/service.js +56 -47
- package/scripts/setup.js +50 -50
- package/scripts/start-server.js +41 -41
- package/scripts/stop.js +36 -36
- package/server/app.js +112 -96
- package/server/auth.js +217 -0
- package/server/channels/contract.js +57 -57
- package/server/channels/hub.js +165 -165
- package/server/channels/index.js +28 -25
- package/server/channels/onebot/index.js +335 -336
- package/server/channels/onebot/token.js +22 -3
- package/server/core/capabilities.js +208 -208
- package/server/core/events.js +64 -60
- package/server/core/image-preprocessor.js +208 -208
- package/server/core/model-manager.js +1213 -1213
- package/server/core/net-guard.js +49 -49
- package/server/core/orchestrator.js +569 -569
- package/server/core/perceivers.js +91 -91
- package/server/core/persona-manager.js +243 -243
- package/server/core/repository.js +293 -293
- package/server/core/response-validator.js +508 -508
- package/server/core/turn-processor.js +630 -630
- package/server/core/turn.js +236 -236
- package/server/core/vision-manager.js +633 -633
- package/server/i18n/errors.js +548 -497
- package/server/i18n/labels.js +649 -653
- package/server/index.js +151 -102
- package/server/knowledge/manager.js +386 -386
- package/server/knowledge/schema.js +12 -8
- package/server/local-access.js +32 -0
- package/server/mind/anticipations.js +507 -507
- package/server/mind/api.js +703 -703
- package/server/mind/budget.js +152 -152
- package/server/mind/context-selection.js +61 -61
- package/server/mind/day-planner.js +324 -324
- package/server/mind/evidence.js +148 -148
- package/server/mind/index.js +445 -445
- package/server/mind/life/diary.js +786 -786
- package/server/mind/life/index.js +1049 -1049
- package/server/mind/observations.js +84 -84
- package/server/mind/own-day.js +324 -324
- package/server/mind/own-voice.js +318 -318
- package/server/mind/senses.js +53 -53
- package/server/mind/time/activity-clock.js +196 -196
- package/server/mind/time/availability.js +69 -69
- package/server/mind/time/commitment-review.js +198 -198
- package/server/mind/time/executor.js +512 -512
- package/server/mind/time/experiences.js +128 -128
- package/server/mind/time/games.js +562 -562
- package/server/mind/time/index.js +739 -739
- package/server/mind/time/intent.js +166 -166
- package/server/mind/time/kinds.js +171 -171
- package/server/mind/time/plugin-activity.js +207 -207
- package/server/mind/time/tasks.js +587 -587
- package/server/mind/util.js +110 -110
- package/server/mind/view.js +273 -273
- package/server/paths.js +102 -102
- package/server/plugins/api.js +204 -204
- package/server/plugins/host.js +967 -967
- package/server/plugins/install.js +295 -295
- package/server/plugins/manifest.js +201 -201
- package/server/plugins/permissions.js +42 -42
- package/server/plugins/runner/guard.mjs +36 -36
- package/server/plugins/runner/worker.mjs +250 -250
- package/server/plugins/schema.js +91 -91
- package/server/plugins/zip.js +112 -112
- package/server/startup-lock.js +118 -118
- package/server/storage/archive.js +242 -241
- package/server/storage/backup-cleanup-worker.js +8 -8
- package/server/storage/backup-cleanup.js +415 -414
- package/server/storage/backup-lock.js +76 -76
- package/server/storage/backup-scheduler.js +131 -131
- package/server/storage/data-package.js +298 -0
- package/server/storage/data-transfer-api.js +50 -0
- package/server/storage/data-transfer-worker.js +18 -0
- package/server/storage/data-transfer.js +415 -0
- package/server/storage/store.js +202 -199
- package/server/studio/readiness.js +181 -190
- package/server/studio/settings.js +236 -236
- package/public/app/assets/ChatsPage-C-FcRapR.js +0 -3
- package/public/app/assets/Empty-CpP5kQHH.js +0 -2
- package/public/app/assets/Field-D4gY-INU.js +0 -1
- package/public/app/assets/HeartPage-CPy_thQd.js +0 -1
- package/public/app/assets/LifePage-CxWvwmSf.js +0 -1
- package/public/app/assets/MemoryPage-DC4rhQ68.js +0 -1
- package/public/app/assets/NaturePage-IvYw04Zq.js +0 -3
- package/public/app/assets/PeoplePage-Cqefm9-q.js +0 -1
- package/public/app/assets/PluginsPage-DKSaKvXb.js +0 -2
- package/public/app/assets/PluginsPage-HyBe5D8w.css +0 -1
- package/public/app/assets/SystemPage-CJmtJkrK.js +0 -1
- package/public/app/assets/TimePage-Cw44inM4.js +0 -3
- package/public/app/assets/index-BheRW-1t.js +0 -4
- package/public/app/assets/media-BzPDBm7e.js +0 -1
package/server/core/net-guard.js
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
import { isIP } from "node:net";
|
|
2
|
-
|
|
3
|
-
// Addresses a plugin or a downloaded image must never reach: the machine
|
|
4
|
-
// itself, the local network, and the cloud metadata range. Shared so a
|
|
5
|
-
// plugin's fetch and a picture download refuse the same places.
|
|
6
|
-
export function blockedAddress(address) {
|
|
7
|
-
const raw = String(address || "")
|
|
8
|
-
.toLowerCase()
|
|
9
|
-
.replace(/^\[|\]$/g, "");
|
|
10
|
-
const mapped = raw.startsWith("::ffff:") ? raw.slice(7) : raw;
|
|
11
|
-
if (mapped === "::1" || mapped === "::" || raw === "::1" || raw === "::")
|
|
12
|
-
return true;
|
|
13
|
-
if (raw.startsWith("fe80:") || raw.startsWith("fc") || raw.startsWith("fd"))
|
|
14
|
-
return true;
|
|
15
|
-
const ip = isIP(mapped) === 4 ? mapped : isIP(raw) === 4 ? raw : "";
|
|
16
|
-
if (!ip) return isIP(raw) !== 6;
|
|
17
|
-
const [a, b] = ip.split(".").map(Number);
|
|
18
|
-
return (
|
|
19
|
-
a === 0 ||
|
|
20
|
-
a === 10 ||
|
|
21
|
-
a === 127 ||
|
|
22
|
-
(a === 169 && b === 254) ||
|
|
23
|
-
(a === 172 && b >= 16 && b <= 31) ||
|
|
24
|
-
(a === 192 && b === 168) ||
|
|
25
|
-
(a === 100 && b >= 64 && b <= 127)
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export async function assertPublicHost(
|
|
30
|
-
hostname,
|
|
31
|
-
lookupHost,
|
|
32
|
-
deny = "地址不可访问",
|
|
33
|
-
) {
|
|
34
|
-
const host = String(hostname || "").replace(/^\[|\]$/g, "");
|
|
35
|
-
if (!host) throw Error(deny);
|
|
36
|
-
if (isIP(host)) {
|
|
37
|
-
if (blockedAddress(host)) throw Error(deny);
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
let records;
|
|
41
|
-
try {
|
|
42
|
-
records = await lookupHost(host, { all: true });
|
|
43
|
-
} catch {
|
|
44
|
-
throw Error(deny);
|
|
45
|
-
}
|
|
46
|
-
const list = Array.isArray(records) ? records : [records];
|
|
47
|
-
if (!list.length || list.some((item) => blockedAddress(item?.address)))
|
|
48
|
-
throw Error(deny);
|
|
49
|
-
}
|
|
1
|
+
import { isIP } from "node:net";
|
|
2
|
+
|
|
3
|
+
// Addresses a plugin or a downloaded image must never reach: the machine
|
|
4
|
+
// itself, the local network, and the cloud metadata range. Shared so a
|
|
5
|
+
// plugin's fetch and a picture download refuse the same places.
|
|
6
|
+
export function blockedAddress(address) {
|
|
7
|
+
const raw = String(address || "")
|
|
8
|
+
.toLowerCase()
|
|
9
|
+
.replace(/^\[|\]$/g, "");
|
|
10
|
+
const mapped = raw.startsWith("::ffff:") ? raw.slice(7) : raw;
|
|
11
|
+
if (mapped === "::1" || mapped === "::" || raw === "::1" || raw === "::")
|
|
12
|
+
return true;
|
|
13
|
+
if (raw.startsWith("fe80:") || raw.startsWith("fc") || raw.startsWith("fd"))
|
|
14
|
+
return true;
|
|
15
|
+
const ip = isIP(mapped) === 4 ? mapped : isIP(raw) === 4 ? raw : "";
|
|
16
|
+
if (!ip) return isIP(raw) !== 6;
|
|
17
|
+
const [a, b] = ip.split(".").map(Number);
|
|
18
|
+
return (
|
|
19
|
+
a === 0 ||
|
|
20
|
+
a === 10 ||
|
|
21
|
+
a === 127 ||
|
|
22
|
+
(a === 169 && b === 254) ||
|
|
23
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
24
|
+
(a === 192 && b === 168) ||
|
|
25
|
+
(a === 100 && b >= 64 && b <= 127)
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export async function assertPublicHost(
|
|
30
|
+
hostname,
|
|
31
|
+
lookupHost,
|
|
32
|
+
deny = "地址不可访问",
|
|
33
|
+
) {
|
|
34
|
+
const host = String(hostname || "").replace(/^\[|\]$/g, "");
|
|
35
|
+
if (!host) throw Error(deny);
|
|
36
|
+
if (isIP(host)) {
|
|
37
|
+
if (blockedAddress(host)) throw Error(deny);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
let records;
|
|
41
|
+
try {
|
|
42
|
+
records = await lookupHost(host, { all: true });
|
|
43
|
+
} catch {
|
|
44
|
+
throw Error(deny);
|
|
45
|
+
}
|
|
46
|
+
const list = Array.isArray(records) ? records : [records];
|
|
47
|
+
if (!list.length || list.some((item) => blockedAddress(item?.address)))
|
|
48
|
+
throw Error(deny);
|
|
49
|
+
}
|