jishushell 0.0.1 → 0.4.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.
Files changed (136) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +36 -0
  3. package/THIRD-PARTY-NOTICES +387 -0
  4. package/dist/auth.d.ts +6 -0
  5. package/dist/auth.js +88 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +290 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +24 -0
  11. package/dist/config.js +226 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/constants.d.ts +3 -0
  14. package/dist/constants.js +15 -0
  15. package/dist/constants.js.map +1 -0
  16. package/dist/control.d.ts +44 -0
  17. package/dist/control.js +1359 -0
  18. package/dist/control.js.map +1 -0
  19. package/dist/crypto-shim.d.ts +1 -0
  20. package/dist/crypto-shim.js +2 -0
  21. package/dist/crypto-shim.js.map +1 -0
  22. package/dist/doctor.d.ts +46 -0
  23. package/dist/doctor.js +937 -0
  24. package/dist/doctor.js.map +1 -0
  25. package/dist/install.d.ts +27 -0
  26. package/dist/install.js +570 -0
  27. package/dist/install.js.map +1 -0
  28. package/dist/routes/auth.d.ts +4 -0
  29. package/dist/routes/auth.js +151 -0
  30. package/dist/routes/auth.js.map +1 -0
  31. package/dist/routes/instances.d.ts +2 -0
  32. package/dist/routes/instances.js +1303 -0
  33. package/dist/routes/instances.js.map +1 -0
  34. package/dist/routes/setup.d.ts +2 -0
  35. package/dist/routes/setup.js +139 -0
  36. package/dist/routes/setup.js.map +1 -0
  37. package/dist/routes/system.d.ts +2 -0
  38. package/dist/routes/system.js +102 -0
  39. package/dist/routes/system.js.map +1 -0
  40. package/dist/server.d.ts +6 -0
  41. package/dist/server.js +392 -0
  42. package/dist/server.js.map +1 -0
  43. package/dist/services/instance-manager.d.ts +67 -0
  44. package/dist/services/instance-manager.js +1319 -0
  45. package/dist/services/instance-manager.js.map +1 -0
  46. package/dist/services/llm-proxy/adapters.d.ts +3 -0
  47. package/dist/services/llm-proxy/adapters.js +309 -0
  48. package/dist/services/llm-proxy/adapters.js.map +1 -0
  49. package/dist/services/llm-proxy/circuit-breaker.d.ts +9 -0
  50. package/dist/services/llm-proxy/circuit-breaker.js +73 -0
  51. package/dist/services/llm-proxy/circuit-breaker.js.map +1 -0
  52. package/dist/services/llm-proxy/encryption.d.ts +6 -0
  53. package/dist/services/llm-proxy/encryption.js +61 -0
  54. package/dist/services/llm-proxy/encryption.js.map +1 -0
  55. package/dist/services/llm-proxy/index.d.ts +24 -0
  56. package/dist/services/llm-proxy/index.js +708 -0
  57. package/dist/services/llm-proxy/index.js.map +1 -0
  58. package/dist/services/llm-proxy/rate-limiter.d.ts +1 -0
  59. package/dist/services/llm-proxy/rate-limiter.js +39 -0
  60. package/dist/services/llm-proxy/rate-limiter.js.map +1 -0
  61. package/dist/services/llm-proxy/sse.d.ts +10 -0
  62. package/dist/services/llm-proxy/sse.js +378 -0
  63. package/dist/services/llm-proxy/sse.js.map +1 -0
  64. package/dist/services/llm-proxy/ssrf.d.ts +16 -0
  65. package/dist/services/llm-proxy/ssrf.js +185 -0
  66. package/dist/services/llm-proxy/ssrf.js.map +1 -0
  67. package/dist/services/llm-proxy/types.d.ts +52 -0
  68. package/dist/services/llm-proxy/types.js +2 -0
  69. package/dist/services/llm-proxy/types.js.map +1 -0
  70. package/dist/services/llm-proxy/usage.d.ts +12 -0
  71. package/dist/services/llm-proxy/usage.js +108 -0
  72. package/dist/services/llm-proxy/usage.js.map +1 -0
  73. package/dist/services/nomad-manager.d.ts +22 -0
  74. package/dist/services/nomad-manager.js +828 -0
  75. package/dist/services/nomad-manager.js.map +1 -0
  76. package/dist/services/plugin-installer.d.ts +22 -0
  77. package/dist/services/plugin-installer.js +102 -0
  78. package/dist/services/plugin-installer.js.map +1 -0
  79. package/dist/services/process-manager.d.ts +25 -0
  80. package/dist/services/process-manager.js +531 -0
  81. package/dist/services/process-manager.js.map +1 -0
  82. package/dist/services/setup-manager.d.ts +93 -0
  83. package/dist/services/setup-manager.js +1922 -0
  84. package/dist/services/setup-manager.js.map +1 -0
  85. package/dist/services/system-monitor.d.ts +1 -0
  86. package/dist/services/system-monitor.js +79 -0
  87. package/dist/services/system-monitor.js.map +1 -0
  88. package/dist/services/telemetry/activation.d.ts +12 -0
  89. package/dist/services/telemetry/activation.js +75 -0
  90. package/dist/services/telemetry/activation.js.map +1 -0
  91. package/dist/services/telemetry/client.d.ts +21 -0
  92. package/dist/services/telemetry/client.js +47 -0
  93. package/dist/services/telemetry/client.js.map +1 -0
  94. package/dist/services/telemetry/device-fingerprint.d.ts +18 -0
  95. package/dist/services/telemetry/device-fingerprint.js +123 -0
  96. package/dist/services/telemetry/device-fingerprint.js.map +1 -0
  97. package/dist/services/telemetry/heartbeat.d.ts +13 -0
  98. package/dist/services/telemetry/heartbeat.js +81 -0
  99. package/dist/services/telemetry/heartbeat.js.map +1 -0
  100. package/dist/services/telemetry/index.d.ts +3 -0
  101. package/dist/services/telemetry/index.js +4 -0
  102. package/dist/services/telemetry/index.js.map +1 -0
  103. package/dist/types.d.ts +51 -0
  104. package/dist/types.js +2 -0
  105. package/dist/types.js.map +1 -0
  106. package/dist/utils/safe-json.d.ts +2 -0
  107. package/dist/utils/safe-json.js +80 -0
  108. package/dist/utils/safe-json.js.map +1 -0
  109. package/dist/utils/ttl-cache.d.ts +29 -0
  110. package/dist/utils/ttl-cache.js +77 -0
  111. package/dist/utils/ttl-cache.js.map +1 -0
  112. package/install/jishu-install.sh +2920 -0
  113. package/install/jishu-uninstall.sh +811 -0
  114. package/install/post-install.sh +110 -0
  115. package/install/post-uninstall.sh +46 -0
  116. package/package.json +57 -8
  117. package/public/assets/Dashboard-CAOQDYDR.js +1 -0
  118. package/public/assets/InitPassword-CkehIkJG.js +1 -0
  119. package/public/assets/InstanceDetail-CzW2S95J.js +14 -0
  120. package/public/assets/Login-RkjzTNWg.js +1 -0
  121. package/public/assets/NewInstance-DdbErdjA.js +1 -0
  122. package/public/assets/Settings-BUD7zwv9.js +1 -0
  123. package/public/assets/Setup-RRTIERGG.js +1 -0
  124. package/public/assets/index-77Ug7feY.css +1 -0
  125. package/public/assets/index-DfRnVUQR.js +16 -0
  126. package/public/assets/providers-lBSOjUWy.js +1 -0
  127. package/public/assets/usePolling-CqQ8hrNc.js +1 -0
  128. package/public/assets/vendor-i18n-Bvxxh8Di.js +9 -0
  129. package/public/assets/vendor-react-DONn7uBV.js +59 -0
  130. package/public/index.html +15 -0
  131. package/scripts/build-image.sh +55 -0
  132. package/scripts/run.sh +310 -0
  133. package/scripts/setup-pi.sh +80 -0
  134. package/scripts/start-feishu1.js +46 -0
  135. package/index.js +0 -0
  136. 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
Binary file