jishushell 0.0.1 → 0.4.2-beta2
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/INSTALL-NOTICE +41 -0
- package/LICENSE +202 -0
- package/README.md +36 -0
- package/THIRD-PARTY-NOTICES +387 -0
- package/dist/auth.d.ts +6 -0
- package/dist/auth.js +88 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +290 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.js +226 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.js +15 -0
- package/dist/constants.js.map +1 -0
- package/dist/control.d.ts +44 -0
- package/dist/control.js +1359 -0
- package/dist/control.js.map +1 -0
- package/dist/crypto-shim.d.ts +1 -0
- package/dist/crypto-shim.js +2 -0
- package/dist/crypto-shim.js.map +1 -0
- package/dist/doctor.d.ts +46 -0
- package/dist/doctor.js +937 -0
- package/dist/doctor.js.map +1 -0
- package/dist/install.d.ts +27 -0
- package/dist/install.js +570 -0
- package/dist/install.js.map +1 -0
- package/dist/routes/auth.d.ts +4 -0
- package/dist/routes/auth.js +151 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/instances.d.ts +2 -0
- package/dist/routes/instances.js +1303 -0
- package/dist/routes/instances.js.map +1 -0
- package/dist/routes/setup.d.ts +2 -0
- package/dist/routes/setup.js +139 -0
- package/dist/routes/setup.js.map +1 -0
- package/dist/routes/system.d.ts +2 -0
- package/dist/routes/system.js +102 -0
- package/dist/routes/system.js.map +1 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.js +392 -0
- package/dist/server.js.map +1 -0
- package/dist/services/instance-manager.d.ts +67 -0
- package/dist/services/instance-manager.js +1319 -0
- package/dist/services/instance-manager.js.map +1 -0
- package/dist/services/llm-proxy/adapters.d.ts +3 -0
- package/dist/services/llm-proxy/adapters.js +309 -0
- package/dist/services/llm-proxy/adapters.js.map +1 -0
- package/dist/services/llm-proxy/circuit-breaker.d.ts +9 -0
- package/dist/services/llm-proxy/circuit-breaker.js +73 -0
- package/dist/services/llm-proxy/circuit-breaker.js.map +1 -0
- package/dist/services/llm-proxy/encryption.d.ts +6 -0
- package/dist/services/llm-proxy/encryption.js +61 -0
- package/dist/services/llm-proxy/encryption.js.map +1 -0
- package/dist/services/llm-proxy/index.d.ts +24 -0
- package/dist/services/llm-proxy/index.js +708 -0
- package/dist/services/llm-proxy/index.js.map +1 -0
- package/dist/services/llm-proxy/rate-limiter.d.ts +1 -0
- package/dist/services/llm-proxy/rate-limiter.js +39 -0
- package/dist/services/llm-proxy/rate-limiter.js.map +1 -0
- package/dist/services/llm-proxy/sse.d.ts +10 -0
- package/dist/services/llm-proxy/sse.js +378 -0
- package/dist/services/llm-proxy/sse.js.map +1 -0
- package/dist/services/llm-proxy/ssrf.d.ts +16 -0
- package/dist/services/llm-proxy/ssrf.js +185 -0
- package/dist/services/llm-proxy/ssrf.js.map +1 -0
- package/dist/services/llm-proxy/types.d.ts +52 -0
- package/dist/services/llm-proxy/types.js +2 -0
- package/dist/services/llm-proxy/types.js.map +1 -0
- package/dist/services/llm-proxy/usage.d.ts +12 -0
- package/dist/services/llm-proxy/usage.js +108 -0
- package/dist/services/llm-proxy/usage.js.map +1 -0
- package/dist/services/nomad-manager.d.ts +22 -0
- package/dist/services/nomad-manager.js +828 -0
- package/dist/services/nomad-manager.js.map +1 -0
- package/dist/services/plugin-installer.d.ts +22 -0
- package/dist/services/plugin-installer.js +102 -0
- package/dist/services/plugin-installer.js.map +1 -0
- package/dist/services/process-manager.d.ts +25 -0
- package/dist/services/process-manager.js +531 -0
- package/dist/services/process-manager.js.map +1 -0
- package/dist/services/setup-manager.d.ts +93 -0
- package/dist/services/setup-manager.js +1922 -0
- package/dist/services/setup-manager.js.map +1 -0
- package/dist/services/system-monitor.d.ts +1 -0
- package/dist/services/system-monitor.js +79 -0
- package/dist/services/system-monitor.js.map +1 -0
- package/dist/services/telemetry/activation.d.ts +12 -0
- package/dist/services/telemetry/activation.js +78 -0
- package/dist/services/telemetry/activation.js.map +1 -0
- package/dist/services/telemetry/client.d.ts +21 -0
- package/dist/services/telemetry/client.js +36 -0
- package/dist/services/telemetry/client.js.map +1 -0
- package/dist/services/telemetry/device-fingerprint.d.ts +18 -0
- package/dist/services/telemetry/device-fingerprint.js +123 -0
- package/dist/services/telemetry/device-fingerprint.js.map +1 -0
- package/dist/services/telemetry/heartbeat.d.ts +13 -0
- package/dist/services/telemetry/heartbeat.js +87 -0
- package/dist/services/telemetry/heartbeat.js.map +1 -0
- package/dist/services/telemetry/index.d.ts +3 -0
- package/dist/services/telemetry/index.js +4 -0
- package/dist/services/telemetry/index.js.map +1 -0
- package/dist/types.d.ts +51 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/safe-json.d.ts +2 -0
- package/dist/utils/safe-json.js +80 -0
- package/dist/utils/safe-json.js.map +1 -0
- package/dist/utils/ttl-cache.d.ts +29 -0
- package/dist/utils/ttl-cache.js +77 -0
- package/dist/utils/ttl-cache.js.map +1 -0
- package/install/jishu-install.sh +2920 -0
- package/install/jishu-uninstall.sh +811 -0
- package/install/post-install.sh +124 -0
- package/install/post-uninstall.sh +46 -0
- package/package.json +57 -8
- package/public/assets/Dashboard-Dxsq690N.js +1 -0
- package/public/assets/InitPassword-CslWYy8G.js +1 -0
- package/public/assets/InstanceDetail-DmEkMj-t.js +14 -0
- package/public/assets/Login-d45wtgVA.js +1 -0
- package/public/assets/NewInstance-Czp5-AJe.js +1 -0
- package/public/assets/Settings-BKMGck05.js +1 -0
- package/public/assets/Setup-D3rfLWjZ.js +1 -0
- package/public/assets/index-77Ug7feY.css +1 -0
- package/public/assets/index-DkDnIohs.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/providers-lBSOjUWy.js +1 -0
- package/public/assets/usePolling-CqQ8hrNc.js +1 -0
- package/public/assets/vendor-i18n-Bvxxh8Di.js +9 -0
- package/public/assets/vendor-react-DONn7uBV.js +59 -0
- package/public/index.html +15 -0
- package/scripts/build-image.sh +55 -0
- package/scripts/run.sh +310 -0
- package/scripts/setup-pi.sh +80 -0
- package/scripts/start-feishu1.js +46 -0
- package/index.js +0 -0
- package/jishushell-0.0.1.tgz +0 -0
package/scripts/run.sh
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
|
6
|
+
|
|
7
|
+
PORT="${JISHUSHELL_PORT:-8090}"
|
|
8
|
+
HOST="${JISHUSHELL_HOST:-0.0.0.0}"
|
|
9
|
+
MODE="${1:-}"
|
|
10
|
+
|
|
11
|
+
# ─── Colors ───────────────────────────────────────────────────────────────────
|
|
12
|
+
BOLD='\033[1m'
|
|
13
|
+
GREEN='\033[0;32m'
|
|
14
|
+
YELLOW='\033[0;33m'
|
|
15
|
+
RED='\033[0;31m'
|
|
16
|
+
CYAN='\033[0;36m'
|
|
17
|
+
NC='\033[0m'
|
|
18
|
+
|
|
19
|
+
info() { echo -e "${CYAN}·${NC} $*"; }
|
|
20
|
+
success() { echo -e "${GREEN}✓${NC} $*"; }
|
|
21
|
+
warn() { echo -e "${YELLOW}!${NC} $*"; }
|
|
22
|
+
error() { echo -e "${RED}✗${NC} $*" >&2; }
|
|
23
|
+
|
|
24
|
+
# ─── Usage ────────────────────────────────────────────────────────────────────
|
|
25
|
+
usage() {
|
|
26
|
+
cat <<EOF
|
|
27
|
+
Usage: bash scripts/run.sh [mode]
|
|
28
|
+
|
|
29
|
+
Modes:
|
|
30
|
+
(default) Build backend (if needed) + start server
|
|
31
|
+
dev Start backend in watch mode + frontend dev server (both in foreground)
|
|
32
|
+
build Build backend TypeScript + frontend
|
|
33
|
+
frontend Start frontend dev server only (Vite)
|
|
34
|
+
server Start backend server only (no build)
|
|
35
|
+
|
|
36
|
+
Environment variables:
|
|
37
|
+
JISHUSHELL_PORT Server port (default: 8090)
|
|
38
|
+
JISHUSHELL_HOST Server host (default: 0.0.0.0)
|
|
39
|
+
|
|
40
|
+
Examples:
|
|
41
|
+
bash scripts/run.sh # production-like start
|
|
42
|
+
bash scripts/run.sh dev # full dev mode with hot reload
|
|
43
|
+
bash scripts/run.sh build # compile everything
|
|
44
|
+
EOF
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
# ─── Checks ───────────────────────────────────────────────────────────────────
|
|
48
|
+
check_node() {
|
|
49
|
+
if ! command -v node &>/dev/null; then
|
|
50
|
+
error "Node.js is not installed or not in PATH"
|
|
51
|
+
exit 1
|
|
52
|
+
fi
|
|
53
|
+
local ver
|
|
54
|
+
ver="$(node --version 2>/dev/null | sed 's/^v//')"
|
|
55
|
+
local major="${ver%%.*}"
|
|
56
|
+
if [[ "$major" -lt 18 ]]; then
|
|
57
|
+
error "Node.js >= 18 required (found v${ver})"
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
# Kill any process occupying a given TCP port
|
|
63
|
+
kill_port() {
|
|
64
|
+
local port="$1"
|
|
65
|
+
local pids
|
|
66
|
+
pids="$(lsof -ti tcp:"$port" 2>/dev/null || true)"
|
|
67
|
+
if [[ -n "$pids" ]]; then
|
|
68
|
+
warn "Port ${port} is in use (PID(s): ${pids}) — killing..."
|
|
69
|
+
echo "$pids" | xargs kill -TERM 2>/dev/null || true
|
|
70
|
+
local waited=0
|
|
71
|
+
while lsof -ti tcp:"$port" &>/dev/null 2>&1 && [[ $waited -lt 5 ]]; do
|
|
72
|
+
sleep 0.5
|
|
73
|
+
waited=$((waited + 1))
|
|
74
|
+
done
|
|
75
|
+
if lsof -ti tcp:"$port" &>/dev/null 2>&1; then
|
|
76
|
+
echo "$pids" | xargs kill -KILL 2>/dev/null || true
|
|
77
|
+
fi
|
|
78
|
+
success "Port ${port} freed"
|
|
79
|
+
fi
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
# ─── Nomad ────────────────────────────────────────────────────────────────────
|
|
83
|
+
ensure_nomad() {
|
|
84
|
+
# 如果 Nomad 相关端口有任何进程,全部 kill(确保干净重启)
|
|
85
|
+
local nomad_ports_pids
|
|
86
|
+
nomad_ports_pids="$(sudo lsof -ti tcp:4646,4647,4648 2>/dev/null || lsof -ti tcp:4646,4647,4648 2>/dev/null || true)"
|
|
87
|
+
if [[ -n "$nomad_ports_pids" ]]; then
|
|
88
|
+
warn "Found existing Nomad process(es) — killing..."
|
|
89
|
+
echo "$nomad_ports_pids" | sort -u | xargs kill -TERM 2>/dev/null || true
|
|
90
|
+
local waited=0
|
|
91
|
+
while [[ $waited -lt 6 ]]; do
|
|
92
|
+
sleep 0.5
|
|
93
|
+
waited=$((waited + 1))
|
|
94
|
+
local remaining
|
|
95
|
+
remaining="$(sudo lsof -ti tcp:4646,4647,4648 2>/dev/null || lsof -ti tcp:4646,4647,4648 2>/dev/null || true)"
|
|
96
|
+
[[ -z "$remaining" ]] && break
|
|
97
|
+
done
|
|
98
|
+
# SIGKILL any stragglers
|
|
99
|
+
local remaining
|
|
100
|
+
remaining="$(sudo lsof -ti tcp:4646,4647,4648 2>/dev/null || lsof -ti tcp:4646,4647,4648 2>/dev/null || true)"
|
|
101
|
+
if [[ -n "$remaining" ]]; then
|
|
102
|
+
echo "$remaining" | sort -u | xargs kill -KILL 2>/dev/null || true
|
|
103
|
+
sleep 1
|
|
104
|
+
fi
|
|
105
|
+
success "Nomad ports 4646/4647/4648 freed"
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
# 查找 nomad 二进制:优先用 jishushell 自带的
|
|
109
|
+
local nomad_bin="${HOME}/.jishushell/bin/nomad"
|
|
110
|
+
if [[ ! -x "$nomad_bin" ]]; then
|
|
111
|
+
nomad_bin="$(command -v nomad 2>/dev/null || true)"
|
|
112
|
+
fi
|
|
113
|
+
if [[ -z "$nomad_bin" ]]; then
|
|
114
|
+
warn "Nomad not found — skipping (instances will not start)"
|
|
115
|
+
return 0
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
local config_path="${HOME}/.jishushell/nomad/nomad.hcl"
|
|
119
|
+
local log_path="${HOME}/.jishushell/nomad/nomad.log"
|
|
120
|
+
mkdir -p "${HOME}/.jishushell/nomad"
|
|
121
|
+
|
|
122
|
+
if [[ -f "$config_path" ]]; then
|
|
123
|
+
info "Starting Nomad agent (config: $config_path)..."
|
|
124
|
+
if [[ $EUID -eq 0 ]]; then
|
|
125
|
+
nohup "$nomad_bin" agent -config="$config_path" > "$log_path" 2>&1 &
|
|
126
|
+
elif sudo -n true 2>/dev/null; then
|
|
127
|
+
sudo nohup "$nomad_bin" agent -config="$config_path" > "$log_path" 2>&1 &
|
|
128
|
+
else
|
|
129
|
+
nohup "$nomad_bin" agent -config="$config_path" > "$log_path" 2>&1 &
|
|
130
|
+
fi
|
|
131
|
+
else
|
|
132
|
+
info "No nomad.hcl found — starting Nomad in dev mode..."
|
|
133
|
+
nohup "$nomad_bin" agent -dev -bind=127.0.0.1 > "$log_path" 2>&1 &
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
# 等待 Nomad 就绪(最多 15 秒)
|
|
137
|
+
local tries=0
|
|
138
|
+
while ! lsof -ti tcp:4646 &>/dev/null && [[ $tries -lt 15 ]]; do
|
|
139
|
+
sleep 1
|
|
140
|
+
tries=$((tries + 1))
|
|
141
|
+
done
|
|
142
|
+
|
|
143
|
+
if lsof -ti tcp:4646 &>/dev/null; then
|
|
144
|
+
success "Nomad started on port 4646 (log: $log_path)"
|
|
145
|
+
else
|
|
146
|
+
warn "Nomad did not come up within 15s — check $log_path"
|
|
147
|
+
fi
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
check_deps() {
|
|
151
|
+
if [[ ! -d "$PROJECT_ROOT/node_modules" ]]; then
|
|
152
|
+
info "Backend dependencies not installed — running npm install..."
|
|
153
|
+
(cd "$PROJECT_ROOT" && npm install)
|
|
154
|
+
fi
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
check_frontend_deps() {
|
|
158
|
+
if [[ ! -d "$PROJECT_ROOT/frontend/node_modules" ]]; then
|
|
159
|
+
info "Frontend dependencies not installed — running npm install..."
|
|
160
|
+
(cd "$PROJECT_ROOT/frontend" && npm install)
|
|
161
|
+
fi
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
# ─── Build ────────────────────────────────────────────────────────────────────
|
|
165
|
+
build_backend() {
|
|
166
|
+
info "Compiling TypeScript..."
|
|
167
|
+
(cd "$PROJECT_ROOT" && npm run build)
|
|
168
|
+
success "Backend compiled → dist/"
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
build_frontend() {
|
|
172
|
+
check_frontend_deps
|
|
173
|
+
info "Building frontend..."
|
|
174
|
+
(cd "$PROJECT_ROOT/frontend" && npm run build)
|
|
175
|
+
success "Frontend built → frontend/dist/"
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
needs_build() {
|
|
179
|
+
# Build if dist/ doesn't exist or any src/ file is newer than dist/server.js
|
|
180
|
+
if [[ ! -f "$PROJECT_ROOT/dist/server.js" ]]; then
|
|
181
|
+
return 0
|
|
182
|
+
fi
|
|
183
|
+
if find "$PROJECT_ROOT/src" -name "*.ts" -newer "$PROJECT_ROOT/dist/server.js" 2>/dev/null | grep -q .; then
|
|
184
|
+
return 0
|
|
185
|
+
fi
|
|
186
|
+
return 1
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
needs_frontend_build() {
|
|
190
|
+
[[ ! -f "$PROJECT_ROOT/frontend/dist/index.html" ]]
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
# ─── Modes ────────────────────────────────────────────────────────────────────
|
|
194
|
+
mode_default() {
|
|
195
|
+
echo -e "\n${BOLD}${CYAN}JishuShell${NC} — starting server on port ${PORT}\n"
|
|
196
|
+
|
|
197
|
+
kill_port "$PORT"
|
|
198
|
+
check_deps
|
|
199
|
+
|
|
200
|
+
if needs_build; then
|
|
201
|
+
warn "dist/ is missing or outdated — building..."
|
|
202
|
+
build_backend
|
|
203
|
+
else
|
|
204
|
+
info "Backend already up to date (skip build)"
|
|
205
|
+
fi
|
|
206
|
+
|
|
207
|
+
if needs_frontend_build; then
|
|
208
|
+
warn "frontend/dist/ not found — building frontend..."
|
|
209
|
+
check_frontend_deps
|
|
210
|
+
build_frontend
|
|
211
|
+
else
|
|
212
|
+
info "Frontend already built (skip build)"
|
|
213
|
+
fi
|
|
214
|
+
|
|
215
|
+
success "Launching JishuShell on http://${HOST}:${PORT}"
|
|
216
|
+
exec node "$PROJECT_ROOT/dist/cli.js" --port "$PORT" --host "$HOST"
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
mode_dev() {
|
|
220
|
+
echo -e "\n${BOLD}${CYAN}JishuShell${NC} — development mode\n"
|
|
221
|
+
|
|
222
|
+
kill_port "$PORT"
|
|
223
|
+
kill_port 5173
|
|
224
|
+
check_deps
|
|
225
|
+
check_frontend_deps
|
|
226
|
+
|
|
227
|
+
# Start TSC in watch mode (background)
|
|
228
|
+
info "Starting TypeScript compiler in watch mode..."
|
|
229
|
+
(cd "$PROJECT_ROOT" && npm run dev) &
|
|
230
|
+
TSC_PID=$!
|
|
231
|
+
|
|
232
|
+
# Give tsc a moment to produce initial output
|
|
233
|
+
sleep 2
|
|
234
|
+
|
|
235
|
+
# Start Vite frontend dev server (background)
|
|
236
|
+
info "Starting Vite frontend dev server..."
|
|
237
|
+
(cd "$PROJECT_ROOT/frontend" && npm run dev) &
|
|
238
|
+
VITE_PID=$!
|
|
239
|
+
|
|
240
|
+
# Wait for initial build before starting server
|
|
241
|
+
local tries=0
|
|
242
|
+
while [[ ! -f "$PROJECT_ROOT/dist/server.js" && $tries -lt 15 ]]; do
|
|
243
|
+
sleep 1
|
|
244
|
+
tries=$((tries + 1))
|
|
245
|
+
done
|
|
246
|
+
|
|
247
|
+
if [[ ! -f "$PROJECT_ROOT/dist/server.js" ]]; then
|
|
248
|
+
error "TypeScript compile timed out — dist/server.js not found"
|
|
249
|
+
kill $TSC_PID $VITE_PID 2>/dev/null || true
|
|
250
|
+
exit 1
|
|
251
|
+
fi
|
|
252
|
+
|
|
253
|
+
# Start backend server (foreground, restart on crash)
|
|
254
|
+
info "Starting backend server on port ${PORT}..."
|
|
255
|
+
success "Backend: http://${HOST}:${PORT}"
|
|
256
|
+
success "Frontend: http://localhost:5173 (Vite dev server)"
|
|
257
|
+
echo ""
|
|
258
|
+
|
|
259
|
+
# Trap Ctrl+C to kill child processes
|
|
260
|
+
trap 'echo ""; info "Shutting down..."; kill $TSC_PID $VITE_PID 2>/dev/null; exit 0' INT TERM
|
|
261
|
+
|
|
262
|
+
node "$PROJECT_ROOT/dist/cli.js" --port "$PORT" --host "$HOST"
|
|
263
|
+
|
|
264
|
+
# Cleanup on exit
|
|
265
|
+
kill $TSC_PID $VITE_PID 2>/dev/null || true
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
mode_build() {
|
|
269
|
+
echo -e "\n${BOLD}${CYAN}JishuShell${NC} — build\n"
|
|
270
|
+
check_deps
|
|
271
|
+
build_backend
|
|
272
|
+
build_frontend
|
|
273
|
+
success "Build complete"
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
mode_frontend() {
|
|
277
|
+
echo -e "\n${BOLD}${CYAN}JishuShell${NC} — frontend dev server\n"
|
|
278
|
+
check_frontend_deps
|
|
279
|
+
info "Starting Vite at http://localhost:5173 (proxy → http://localhost:${PORT})"
|
|
280
|
+
exec sh -c "cd \"$PROJECT_ROOT/frontend\" && npm run dev"
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
mode_server() {
|
|
284
|
+
echo -e "\n${BOLD}${CYAN}JishuShell${NC} — server only\n"
|
|
285
|
+
if [[ ! -f "$PROJECT_ROOT/dist/server.js" ]]; then
|
|
286
|
+
error "dist/server.js not found — run 'bash scripts/run.sh build' first"
|
|
287
|
+
exit 1
|
|
288
|
+
fi
|
|
289
|
+
kill_port "$PORT"
|
|
290
|
+
success "Launching on http://${HOST}:${PORT}"
|
|
291
|
+
exec node "$PROJECT_ROOT/dist/cli.js" --port "$PORT" --host "$HOST"
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
# ─── Entry point ──────────────────────────────────────────────────────────────
|
|
295
|
+
check_node
|
|
296
|
+
|
|
297
|
+
# Nomad 最先启动(build/frontend/help 模式不需要)
|
|
298
|
+
case "$MODE" in
|
|
299
|
+
""|dev|server) ensure_nomad ;;
|
|
300
|
+
esac
|
|
301
|
+
|
|
302
|
+
case "$MODE" in
|
|
303
|
+
"" ) mode_default ;;
|
|
304
|
+
dev ) mode_dev ;;
|
|
305
|
+
build ) mode_build ;;
|
|
306
|
+
frontend ) mode_frontend ;;
|
|
307
|
+
server ) mode_server ;;
|
|
308
|
+
--help|-h ) usage ;;
|
|
309
|
+
* ) error "Unknown mode: $MODE"; echo ""; usage; exit 1 ;;
|
|
310
|
+
esac
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -e
|
|
3
|
+
|
|
4
|
+
# JishuShell - Raspberry Pi setup script
|
|
5
|
+
# Usage: bash scripts/setup-pi.sh [--port PORT]
|
|
6
|
+
|
|
7
|
+
INSTALL_DIR="${INSTALL_DIR:-$(cd "$(dirname "$0")/.." && pwd)}"
|
|
8
|
+
SERVICE_PORT="${SERVICE_PORT:-8090}"
|
|
9
|
+
|
|
10
|
+
# Parse optional --port arg
|
|
11
|
+
while [[ $# -gt 0 ]]; do
|
|
12
|
+
case "$1" in
|
|
13
|
+
--port) SERVICE_PORT="$2"; shift 2 ;;
|
|
14
|
+
*) shift ;;
|
|
15
|
+
esac
|
|
16
|
+
done
|
|
17
|
+
|
|
18
|
+
echo "=== JishuShell Setup ==="
|
|
19
|
+
echo "Install dir: $INSTALL_DIR"
|
|
20
|
+
|
|
21
|
+
cd "$INSTALL_DIR"
|
|
22
|
+
|
|
23
|
+
# --- 1. Check / install Node.js >= 22 ---
|
|
24
|
+
echo "[1/3] Checking Node.js..."
|
|
25
|
+
NODE_OK=false
|
|
26
|
+
if command -v node &>/dev/null; then
|
|
27
|
+
NODE_MAJOR=$(node -e "process.exit(parseInt(process.versions.node) >= 22 ? 0 : 1)" 2>/dev/null && echo ok || echo no)
|
|
28
|
+
[ "$NODE_MAJOR" = "ok" ] && NODE_OK=true
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
if [ "$NODE_OK" = "false" ]; then
|
|
32
|
+
echo " Installing Node.js 22 via NodeSource..."
|
|
33
|
+
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - > /dev/null 2>&1
|
|
34
|
+
sudo apt-get install -y nodejs > /dev/null 2>&1
|
|
35
|
+
fi
|
|
36
|
+
echo " Node.js: $(node --version)"
|
|
37
|
+
|
|
38
|
+
# --- 2. npm ci (production deps only) ---
|
|
39
|
+
echo "[2/3] Installing npm dependencies..."
|
|
40
|
+
npm ci --omit=dev --silent 2>/dev/null || npm install --omit=dev --silent
|
|
41
|
+
|
|
42
|
+
# --- 3. Register systemd service (best-effort) ---
|
|
43
|
+
echo "[3/3] Registering jishushell as a systemd service..."
|
|
44
|
+
NODE_BIN=$(which node)
|
|
45
|
+
CLI_BIN="$INSTALL_DIR/dist/cli.js"
|
|
46
|
+
CURRENT_USER=$(whoami)
|
|
47
|
+
|
|
48
|
+
SERVICE_FILE="/tmp/jishushell.service"
|
|
49
|
+
cat > "$SERVICE_FILE" << EOF
|
|
50
|
+
[Unit]
|
|
51
|
+
Description=JishuShell Panel
|
|
52
|
+
After=network-online.target
|
|
53
|
+
Wants=network-online.target
|
|
54
|
+
|
|
55
|
+
[Service]
|
|
56
|
+
Type=simple
|
|
57
|
+
User=$CURRENT_USER
|
|
58
|
+
WorkingDirectory=$INSTALL_DIR
|
|
59
|
+
ExecStart=$NODE_BIN $CLI_BIN --port $SERVICE_PORT
|
|
60
|
+
Restart=on-failure
|
|
61
|
+
RestartSec=5
|
|
62
|
+
Environment=NODE_ENV=production
|
|
63
|
+
|
|
64
|
+
[Install]
|
|
65
|
+
WantedBy=multi-user.target
|
|
66
|
+
EOF
|
|
67
|
+
|
|
68
|
+
if sudo cp "$SERVICE_FILE" /etc/systemd/system/jishushell.service 2>/dev/null; then
|
|
69
|
+
sudo systemctl daemon-reload
|
|
70
|
+
sudo systemctl enable jishushell
|
|
71
|
+
sudo systemctl restart jishushell
|
|
72
|
+
echo " systemd service enabled (auto-start on boot)."
|
|
73
|
+
else
|
|
74
|
+
echo " (no sudo) Starting manually..."
|
|
75
|
+
nohup node "$CLI_BIN" --port "$SERVICE_PORT" > "$HOME/.jishushell/panel.log" 2>&1 &
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
echo ""
|
|
79
|
+
echo "=== Setup complete! ==="
|
|
80
|
+
echo "JishuShell running on http://$(hostname -I | awk '{print $1}' 2>/dev/null || echo localhost):$SERVICE_PORT"
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
|
|
3
|
+
const m = JSON.parse(readFileSync('/home/pi/.jishushell/instances/feishu-1/instance.json', 'utf-8'));
|
|
4
|
+
const r = m.runtime;
|
|
5
|
+
|
|
6
|
+
// Get datacenter from Nomad nodes API
|
|
7
|
+
const nodesResp = await fetch('http://127.0.0.1:4646/v1/nodes');
|
|
8
|
+
const nodes = await nodesResp.json();
|
|
9
|
+
const datacenter = nodes?.[0]?.Datacenter || 'jishushell-raspberrypi';
|
|
10
|
+
console.error('Using datacenter:', datacenter);
|
|
11
|
+
|
|
12
|
+
const job = {
|
|
13
|
+
Job: {
|
|
14
|
+
ID: 'openclaw-feishu-1',
|
|
15
|
+
Name: 'openclaw-feishu-1',
|
|
16
|
+
Type: 'service',
|
|
17
|
+
Datacenters: [datacenter],
|
|
18
|
+
TaskGroups: [{
|
|
19
|
+
Name: 'openclaw',
|
|
20
|
+
Count: 1,
|
|
21
|
+
RestartPolicy: { Attempts: 3, Interval: 300000000000, Delay: 15000000000, Mode: 'delay' },
|
|
22
|
+
Tasks: [{
|
|
23
|
+
Name: 'openclaw',
|
|
24
|
+
Driver: 'raw_exec',
|
|
25
|
+
Config: { command: r.command, args: r.args },
|
|
26
|
+
Env: {
|
|
27
|
+
HOME: '/home/pi',
|
|
28
|
+
TMPDIR: '/tmp',
|
|
29
|
+
PATH: '/home/pi/.local/bin:/home/pi/.npm-global/bin:/usr/local/bin:/usr/bin:/bin',
|
|
30
|
+
...r.env,
|
|
31
|
+
OPENCLAW_HOME: m.openclaw_home,
|
|
32
|
+
OPENCLAW_INSTANCE_ID: m.id,
|
|
33
|
+
},
|
|
34
|
+
Resources: { CPU: 1000, MemoryMB: 3072 },
|
|
35
|
+
}],
|
|
36
|
+
}],
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const resp = await fetch('http://127.0.0.1:4646/v1/jobs', {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers: { 'Content-Type': 'application/json' },
|
|
43
|
+
body: JSON.stringify(job),
|
|
44
|
+
});
|
|
45
|
+
const result = await resp.json();
|
|
46
|
+
console.log(JSON.stringify(result, null, 2));
|
package/index.js
DELETED
|
File without changes
|
package/jishushell-0.0.1.tgz
DELETED
|
Binary file
|