jishushell 0.4.2 → 0.4.10
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/Dockerfile.openclaw-slim +58 -0
- package/INSTALL-NOTICE +47 -0
- package/dist/auth.js +3 -3
- package/dist/auth.js.map +1 -1
- package/dist/cli.js +517 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +21 -4
- package/dist/config.js +88 -54
- package/dist/config.js.map +1 -1
- package/dist/control.js +5 -5
- package/dist/control.js.map +1 -1
- package/dist/doctor.js +47 -14
- package/dist/doctor.js.map +1 -1
- package/dist/install.d.ts +1 -1
- package/dist/install.js +15 -29
- package/dist/install.js.map +1 -1
- package/dist/routes/backup.d.ts +2 -0
- package/dist/routes/backup.js +370 -0
- package/dist/routes/backup.js.map +1 -0
- package/dist/routes/instances.d.ts +1 -0
- package/dist/routes/instances.js +51 -11
- package/dist/routes/instances.js.map +1 -1
- package/dist/routes/setup.js +3 -5
- package/dist/routes/setup.js.map +1 -1
- package/dist/server.js +29 -1
- package/dist/server.js.map +1 -1
- package/dist/services/backup-manager.d.ts +253 -0
- package/dist/services/backup-manager.js +2014 -0
- package/dist/services/backup-manager.js.map +1 -0
- package/dist/services/backup-verify.d.ts +26 -0
- package/dist/services/backup-verify.js +240 -0
- package/dist/services/backup-verify.js.map +1 -0
- package/dist/services/instance-manager.d.ts +24 -4
- package/dist/services/instance-manager.js +218 -49
- package/dist/services/instance-manager.js.map +1 -1
- package/dist/services/nomad-manager.js +72 -131
- package/dist/services/nomad-manager.js.map +1 -1
- package/dist/services/process-manager.js +4 -3
- package/dist/services/process-manager.js.map +1 -1
- package/dist/services/setup-manager.d.ts +4 -2
- package/dist/services/setup-manager.js +268 -129
- package/dist/services/setup-manager.js.map +1 -1
- package/dist/services/telemetry/activation.js +10 -7
- package/dist/services/telemetry/activation.js.map +1 -1
- package/dist/services/telemetry/client.js +7 -18
- package/dist/services/telemetry/client.js.map +1 -1
- package/dist/services/telemetry/heartbeat.js +12 -6
- package/dist/services/telemetry/heartbeat.js.map +1 -1
- package/dist/utils/fs.d.ts +85 -0
- package/dist/utils/fs.js +111 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/safe-json.d.ts +2 -0
- package/dist/utils/safe-json.js +22 -16
- package/dist/utils/safe-json.js.map +1 -1
- package/install/jishu-install-china.sh +3092 -0
- package/install/jishu-install.sh +310 -108
- package/install/jishu-uninstall.sh +276 -391
- package/install/post-install.sh +23 -0
- package/openclaw-entry.sh +15 -0
- package/package.json +7 -4
- package/public/assets/Dashboard-DhsrzJ4F.js +1 -0
- package/public/assets/{InitPassword-CkehIkJG.js → InitPassword-BjubiVdd.js} +1 -1
- package/public/assets/InstanceDetail-DMcywsof.js +17 -0
- package/public/assets/{Login-RkjzTNWg.js → Login-CUoEZOWR.js} +1 -1
- package/public/assets/NewInstance-Bk0G4EiJ.js +1 -0
- package/public/assets/Settings-D5tHL_h5.js +1 -0
- package/public/assets/Setup-4t6E3Rut.js +1 -0
- package/public/assets/index-BJ47MWpF.css +1 -0
- package/public/assets/index-DbX85irc.js +16 -0
- package/public/assets/logo-black-theme-DywLAtFy.png +0 -0
- package/public/assets/logo-white-theme-DXffFAWw.png +0 -0
- package/public/assets/{usePolling-CqQ8hrNc.js → usePolling-CK0DfI4h.js} +1 -1
- package/public/assets/{vendor-i18n-Bvxxh8Di.js → vendor-i18n-CfW0RvgE.js} +1 -1
- package/public/assets/vendor-react-B1-3Yrt-.js +59 -0
- package/public/index.html +4 -4
- package/public/assets/Dashboard-CAOQDYDR.js +0 -1
- package/public/assets/InstanceDetail-CzW2S95J.js +0 -14
- package/public/assets/NewInstance-DdbErdjA.js +0 -1
- package/public/assets/Settings-BUD7zwv9.js +0 -1
- package/public/assets/Setup-RRTIERGG.js +0 -1
- package/public/assets/index-77Ug7feY.css +0 -1
- package/public/assets/index-DfRnVUQR.js +0 -16
- package/public/assets/vendor-react-DONn7uBV.js +0 -59
package/dist/utils/fs.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Semantic file-system primitives for JishuShell.
|
|
3
|
+
*
|
|
4
|
+
* Every file write in the codebase should go through one of these functions.
|
|
5
|
+
* The function name describes the *kind* of file being written; the correct
|
|
6
|
+
* permissions follow from that classification — callers never touch raw mode
|
|
7
|
+
* numbers.
|
|
8
|
+
*
|
|
9
|
+
* Classification:
|
|
10
|
+
*
|
|
11
|
+
* writeConfigFile 0o644 Config / state files (openclaw.json, instance.json, …)
|
|
12
|
+
* writeSecretFile 0o600 Cryptographic keys, tokens, hashes (jwt-secret, …)
|
|
13
|
+
* writeExecutableFile 0o755 Shell scripts and binary wrappers
|
|
14
|
+
* writeSystemTmpFile 0o600 Temp files for privileged hand-off (sudo cp)
|
|
15
|
+
*
|
|
16
|
+
* ensureDirHost 0o755 Host-only directories never bind-mounted into
|
|
17
|
+
* (Linux) containers (JISHUSHELL_HOME, bin/, nomad/,
|
|
18
|
+
* 0o755 packages/). 0o755 on both platforms: Linux
|
|
19
|
+
* (macOS) Docker daemon (root) bypasses DAC so tighter
|
|
20
|
+
* modes would only inconvenience the host user;
|
|
21
|
+
* on macOS, VirtioFS requires the execute bit on
|
|
22
|
+
* every ancestor of a bind-mount. The write bit
|
|
23
|
+
* is withheld from group/other on both platforms,
|
|
24
|
+
* so containers cannot create files in host dirs.
|
|
25
|
+
*
|
|
26
|
+
* ensureDirContainer 0o755 Directories bind-mounted into Docker containers.
|
|
27
|
+
* (Linux) Docker Desktop's VirtioFS uses virtiofsd in
|
|
28
|
+
* 0o755 passthrough mode: macOS host uid numbers are
|
|
29
|
+
* (macOS) exposed verbatim inside the Linux VM and the
|
|
30
|
+
* container, so a process running as --user 502
|
|
31
|
+
* sees files owned by host uid 502 as "owner".
|
|
32
|
+
* 0o755 therefore suffices on macOS just as on
|
|
33
|
+
* Linux — the container process hits owner bits,
|
|
34
|
+
* not "other" bits. (Confirmed by lima-vm/lima
|
|
35
|
+
* #4053: Docker Desktop correctly shows uid=501
|
|
36
|
+
* from host as uid=501 in the container, unlike
|
|
37
|
+
* Lima's VirtioFS which squashes to root.)
|
|
38
|
+
*/
|
|
39
|
+
import { chmodSync, mkdirSync, writeFileSync } from "fs";
|
|
40
|
+
import { dirname } from "path";
|
|
41
|
+
// ── Directories ────────────────────────────────────────────────────────────
|
|
42
|
+
/**
|
|
43
|
+
* Create a host-only directory (never bind-mounted into containers).
|
|
44
|
+
* 0o755 on both Linux and macOS: on Linux the Docker daemon runs as root and
|
|
45
|
+
* bypasses DAC, so stricter modes only inconvenience the local user; on macOS,
|
|
46
|
+
* VirtioFS requires the execute bit on every ancestor of a bind-mounted path.
|
|
47
|
+
* Write is withheld from group/other on both platforms, so containers cannot
|
|
48
|
+
* create files inside host directories.
|
|
49
|
+
*/
|
|
50
|
+
export function ensureDirHost(path) {
|
|
51
|
+
mkdirSync(path, { recursive: true, mode: 0o755 });
|
|
52
|
+
chmodSync(path, 0o755);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a directory bind-mounted into Docker containers.
|
|
56
|
+
*
|
|
57
|
+
* Docker Desktop's VirtioFS runs virtiofsd in passthrough mode: the macOS host
|
|
58
|
+
* uid is exposed verbatim inside the Linux VM, so a container process running
|
|
59
|
+
* as --user 502 sees bind-mounted files owned by host uid 502 as "owner" and
|
|
60
|
+
* gets owner-class permission bits. 0o755 (rwxr-xr-x) is therefore sufficient
|
|
61
|
+
* on macOS, same as on Linux.
|
|
62
|
+
*
|
|
63
|
+
* chmodSync is called after mkdirSync so that the mode is applied
|
|
64
|
+
* unconditionally regardless of the process umask (mkdirSync mode is masked by
|
|
65
|
+
* umask; chmodSync / chmod(2) is not). This is safe on already-existing
|
|
66
|
+
* directories — it only updates the mode bits, it does not fail.
|
|
67
|
+
*/
|
|
68
|
+
export function ensureDirContainer(path) {
|
|
69
|
+
mkdirSync(path, { recursive: true, mode: 0o755 });
|
|
70
|
+
chmodSync(path, 0o755);
|
|
71
|
+
}
|
|
72
|
+
// ── Files ──────────────────────────────────────────────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* Write a config/state file with 0o644.
|
|
75
|
+
* Creates parent directories if they do not yet exist, but does NOT chmod an
|
|
76
|
+
* already-existing parent — the caller owns the directory lifecycle.
|
|
77
|
+
*/
|
|
78
|
+
export function writeConfigFile(path, content) {
|
|
79
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
80
|
+
writeFileSync(path, content, { mode: 0o644 });
|
|
81
|
+
chmodSync(path, 0o644);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Write a secret file with 0o600.
|
|
85
|
+
* Creates parent directories if they do not yet exist, but does NOT chmod an
|
|
86
|
+
* already-existing parent.
|
|
87
|
+
*/
|
|
88
|
+
export function writeSecretFile(path, content) {
|
|
89
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
90
|
+
writeFileSync(path, content, { mode: 0o600 });
|
|
91
|
+
chmodSync(path, 0o600);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Write an executable file (script or binary wrapper) with 0o755.
|
|
95
|
+
* Creates parent directories if they do not yet exist, but does NOT chmod an
|
|
96
|
+
* already-existing parent.
|
|
97
|
+
*/
|
|
98
|
+
export function writeExecutableFile(path, content) {
|
|
99
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
100
|
+
writeFileSync(path, content, { mode: 0o755 });
|
|
101
|
+
chmodSync(path, 0o755);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Write a temporary file to /tmp with 0o600 for privileged hand-off (sudo cp).
|
|
105
|
+
* /tmp already exists; no directory creation needed.
|
|
106
|
+
*/
|
|
107
|
+
export function writeSystemTmpFile(path, content) {
|
|
108
|
+
writeFileSync(path, content, { mode: 0o600 });
|
|
109
|
+
chmodSync(path, 0o600);
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClD,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,OAAwB;IACpE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9C,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,OAAwB;IACpE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9C,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,OAAe;IAC/D,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9C,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAAe;IAC9D,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9C,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export declare function safeReadJson<T = Record<string, any>>(path: string, label: string): T | null;
|
|
2
|
+
export declare function safeReadSecretJson<T = Record<string, any>>(path: string, label: string): T | null;
|
|
2
3
|
export declare function safeWriteJson(path: string, data: any, fsync?: boolean): void;
|
|
4
|
+
export declare function safeWriteSecretJson(path: string, data: any, fsync?: boolean): void;
|
package/dist/utils/safe-json.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync,
|
|
1
|
+
import { chmodSync, existsSync, readFileSync, writeFileSync, renameSync, copyFileSync, openSync, fdatasyncSync, closeSync, mkdirSync } from "fs";
|
|
2
2
|
import { dirname } from "path";
|
|
3
3
|
const BACKUP_SUFFIXES = [".bak", ".bak.1", ".bak.2"];
|
|
4
|
-
|
|
4
|
+
function recoverJson(path, label, mode) {
|
|
5
5
|
for (const f of [path, ...BACKUP_SUFFIXES.map(s => path + s)]) {
|
|
6
6
|
if (!existsSync(f))
|
|
7
7
|
continue;
|
|
@@ -10,7 +10,8 @@ export function safeReadJson(path, label) {
|
|
|
10
10
|
if (f !== path) {
|
|
11
11
|
console.warn(`[${label}] ${path} corrupted, recovered from ${f}`);
|
|
12
12
|
const tmp = path + ".tmp";
|
|
13
|
-
writeFileSync(tmp, JSON.stringify(data), { mode
|
|
13
|
+
writeFileSync(tmp, JSON.stringify(data), { mode });
|
|
14
|
+
chmodSync(tmp, mode);
|
|
14
15
|
renameSync(tmp, path);
|
|
15
16
|
}
|
|
16
17
|
return data;
|
|
@@ -21,13 +22,16 @@ export function safeReadJson(path, label) {
|
|
|
21
22
|
}
|
|
22
23
|
return null;
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
export function safeReadJson(path, label) {
|
|
26
|
+
return recoverJson(path, label, 0o644);
|
|
27
|
+
}
|
|
28
|
+
export function safeReadSecretJson(path, label) {
|
|
29
|
+
return recoverJson(path, label, 0o600);
|
|
30
|
+
}
|
|
26
31
|
const _activeWrites = new Map();
|
|
27
|
-
|
|
32
|
+
function withWriteLock(path, fn) {
|
|
28
33
|
const existing = _activeWrites.get(path);
|
|
29
34
|
if (existing !== undefined) {
|
|
30
|
-
// If a write has been "active" for over 60s, it's stale from a previous crash
|
|
31
35
|
if (Date.now() - existing > 60_000) {
|
|
32
36
|
_activeWrites.delete(path);
|
|
33
37
|
}
|
|
@@ -35,23 +39,21 @@ export function safeWriteJson(path, data, fsync = false) {
|
|
|
35
39
|
console.warn(`[safe-json] Concurrent write detected for ${path}, serializing`);
|
|
36
40
|
}
|
|
37
41
|
}
|
|
38
|
-
// In Node.js single-threaded model, synchronous code can't truly interleave,
|
|
39
|
-
// but this guard catches programming errors where safeWriteJson is called
|
|
40
|
-
// from within a safeWriteJson callback (re-entrancy).
|
|
41
42
|
_activeWrites.set(path, Date.now());
|
|
42
43
|
try {
|
|
43
|
-
|
|
44
|
+
fn();
|
|
44
45
|
}
|
|
45
46
|
finally {
|
|
46
47
|
_activeWrites.delete(path);
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
|
-
function
|
|
50
|
+
function atomicWriteJson(path, data, fsync, mode) {
|
|
50
51
|
mkdirSync(dirname(path), { recursive: true });
|
|
51
52
|
const tmp = path + ".tmp";
|
|
52
53
|
const json = typeof data === "string" ? data : JSON.stringify(data);
|
|
53
|
-
writeFileSync(tmp, json, { mode
|
|
54
|
-
|
|
54
|
+
writeFileSync(tmp, json, { mode });
|
|
55
|
+
chmodSync(tmp, mode);
|
|
56
|
+
JSON.parse(readFileSync(tmp, "utf-8"));
|
|
55
57
|
if (fsync) {
|
|
56
58
|
try {
|
|
57
59
|
const fd = openSync(tmp, "r");
|
|
@@ -60,8 +62,6 @@ function _safeWriteJsonImpl(path, data, fsync) {
|
|
|
60
62
|
}
|
|
61
63
|
catch { }
|
|
62
64
|
}
|
|
63
|
-
// Rolling backup: rotate .bak → .bak.1 → .bak.2 (keep 3 versions)
|
|
64
|
-
// Copy (not rename) so the original stays in place until the atomic rename below.
|
|
65
65
|
if (existsSync(path)) {
|
|
66
66
|
try {
|
|
67
67
|
if (existsSync(path + ".bak.1"))
|
|
@@ -77,4 +77,10 @@ function _safeWriteJsonImpl(path, data, fsync) {
|
|
|
77
77
|
}
|
|
78
78
|
renameSync(tmp, path);
|
|
79
79
|
}
|
|
80
|
+
export function safeWriteJson(path, data, fsync = false) {
|
|
81
|
+
withWriteLock(path, () => atomicWriteJson(path, data, fsync, 0o644));
|
|
82
|
+
}
|
|
83
|
+
export function safeWriteSecretJson(path, data, fsync = false) {
|
|
84
|
+
withWriteLock(path, () => atomicWriteJson(path, data, fsync, 0o600));
|
|
85
|
+
}
|
|
80
86
|
//# sourceMappingURL=safe-json.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-json.js","sourceRoot":"","sources":["../../src/utils/safe-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"safe-json.js","sourceRoot":"","sources":["../../src/utils/safe-json.ts"],"names":[],"mappings":"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"}
|