jishushell 0.4.17 → 0.4.24

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 (241) hide show
  1. package/Dockerfile.hermes-slim +193 -0
  2. package/apps/hermes-container.yaml +35 -0
  3. package/apps/ollama-binary.yaml +200 -0
  4. package/apps/ollama-cpu-container.yaml +37 -0
  5. package/apps/ollama-with-hollama-binary.yaml +195 -0
  6. package/apps/openclaw-binary.yaml +69 -0
  7. package/apps/openclaw-container.yaml +37 -0
  8. package/apps/openclaw-with-ollama-container.yaml +42 -0
  9. package/apps/openclaw-with-searxng-container.yaml +136 -0
  10. package/apps/openwebui-container.yaml +53 -0
  11. package/apps/playwright-container.yaml +120 -0
  12. package/apps/searxng-container.yaml +115 -0
  13. package/dist/auth.d.ts +1 -0
  14. package/dist/auth.js +15 -14
  15. package/dist/auth.js.map +1 -1
  16. package/dist/cli/app.d.ts +1 -0
  17. package/dist/cli/app.js +710 -52
  18. package/dist/cli/app.js.map +1 -1
  19. package/dist/cli/backup.d.ts +3 -0
  20. package/dist/cli/backup.js +434 -0
  21. package/dist/cli/backup.js.map +1 -0
  22. package/dist/cli/doctor.d.ts +1 -0
  23. package/dist/cli/doctor.js +61 -35
  24. package/dist/cli/doctor.js.map +1 -1
  25. package/dist/cli/job.d.ts +1 -0
  26. package/dist/cli/job.js +37 -99
  27. package/dist/cli/job.js.map +1 -1
  28. package/dist/cli/llm.d.ts +1 -0
  29. package/dist/cli/llm.js +20 -14
  30. package/dist/cli/llm.js.map +1 -1
  31. package/dist/cli/managed-list.d.ts +30 -0
  32. package/dist/cli/managed-list.js +129 -0
  33. package/dist/cli/managed-list.js.map +1 -0
  34. package/dist/cli/panel.d.ts +4 -3
  35. package/dist/cli/panel.js +94 -24
  36. package/dist/cli/panel.js.map +1 -1
  37. package/dist/cli/version.d.ts +1 -0
  38. package/dist/cli/version.js +12 -0
  39. package/dist/cli/version.js.map +1 -0
  40. package/dist/cli.js +47 -516
  41. package/dist/cli.js.map +1 -1
  42. package/dist/config.d.ts +68 -0
  43. package/dist/config.js +266 -12
  44. package/dist/config.js.map +1 -1
  45. package/dist/control.d.ts +10 -6
  46. package/dist/control.js +87 -6
  47. package/dist/control.js.map +1 -1
  48. package/dist/install.d.ts +16 -0
  49. package/dist/install.js +75 -26
  50. package/dist/install.js.map +1 -1
  51. package/dist/routes/agent-apps.d.ts +15 -0
  52. package/dist/routes/agent-apps.js +78 -0
  53. package/dist/routes/agent-apps.js.map +1 -0
  54. package/dist/routes/apps.js +186 -7
  55. package/dist/routes/apps.js.map +1 -1
  56. package/dist/routes/backup.js +3 -3
  57. package/dist/routes/backup.js.map +1 -1
  58. package/dist/routes/instances.d.ts +6 -0
  59. package/dist/routes/instances.js +862 -879
  60. package/dist/routes/instances.js.map +1 -1
  61. package/dist/routes/llm.js +9 -8
  62. package/dist/routes/llm.js.map +1 -1
  63. package/dist/routes/runtime.d.ts +15 -0
  64. package/dist/routes/runtime.js +69 -0
  65. package/dist/routes/runtime.js.map +1 -0
  66. package/dist/routes/setup.js +103 -8
  67. package/dist/routes/setup.js.map +1 -1
  68. package/dist/routes/system.js +25 -3
  69. package/dist/routes/system.js.map +1 -1
  70. package/dist/server.js +71 -7
  71. package/dist/server.js.map +1 -1
  72. package/dist/services/agent-apps/catalog.d.ts +30 -0
  73. package/dist/services/agent-apps/catalog.js +60 -0
  74. package/dist/services/agent-apps/catalog.js.map +1 -0
  75. package/dist/services/agent-apps/index.d.ts +36 -0
  76. package/dist/services/agent-apps/index.js +171 -0
  77. package/dist/services/agent-apps/index.js.map +1 -0
  78. package/dist/services/agent-apps/installers/adapter-probes.d.ts +49 -0
  79. package/dist/services/agent-apps/installers/adapter-probes.js +223 -0
  80. package/dist/services/agent-apps/installers/adapter-probes.js.map +1 -0
  81. package/dist/services/agent-apps/installers/adapter.d.ts +30 -0
  82. package/dist/services/agent-apps/installers/adapter.js +171 -0
  83. package/dist/services/agent-apps/installers/adapter.js.map +1 -0
  84. package/dist/services/agent-apps/installers/registry-probe.d.ts +38 -0
  85. package/dist/services/agent-apps/installers/registry-probe.js +183 -0
  86. package/dist/services/agent-apps/installers/registry-probe.js.map +1 -0
  87. package/dist/services/agent-apps/installers/shell-script.d.ts +47 -0
  88. package/dist/services/agent-apps/installers/shell-script.js +471 -0
  89. package/dist/services/agent-apps/installers/shell-script.js.map +1 -0
  90. package/dist/services/agent-apps/types.d.ts +125 -0
  91. package/dist/services/agent-apps/types.js +17 -0
  92. package/dist/services/agent-apps/types.js.map +1 -0
  93. package/dist/services/{app-compiler.d.ts → app/app-compiler.d.ts} +3 -3
  94. package/dist/services/{app-compiler.js → app/app-compiler.js} +10 -7
  95. package/dist/services/app/app-compiler.js.map +1 -0
  96. package/dist/services/app/app-manager.d.ts +142 -0
  97. package/dist/services/app/app-manager.js +1988 -0
  98. package/dist/services/app/app-manager.js.map +1 -0
  99. package/dist/services/app/custom-manager.d.ts +27 -0
  100. package/dist/services/app/custom-manager.js +285 -0
  101. package/dist/services/app/custom-manager.js.map +1 -0
  102. package/dist/services/app/hermes-agent-manager.d.ts +20 -0
  103. package/dist/services/app/hermes-agent-manager.js +289 -0
  104. package/dist/services/app/hermes-agent-manager.js.map +1 -0
  105. package/dist/services/app/id-normalizer.d.ts +27 -0
  106. package/dist/services/app/id-normalizer.js +77 -0
  107. package/dist/services/app/id-normalizer.js.map +1 -0
  108. package/dist/services/app/ollama-manager.d.ts +18 -0
  109. package/dist/services/app/ollama-manager.js +207 -0
  110. package/dist/services/app/ollama-manager.js.map +1 -0
  111. package/dist/services/app/openclaw-manager.d.ts +63 -0
  112. package/dist/services/app/openclaw-manager.js +1178 -0
  113. package/dist/services/app/openclaw-manager.js.map +1 -0
  114. package/dist/services/app/paths.d.ts +47 -0
  115. package/dist/services/app/paths.js +68 -0
  116. package/dist/services/app/paths.js.map +1 -0
  117. package/dist/services/app/registry.d.ts +17 -0
  118. package/dist/services/app/registry.js +31 -0
  119. package/dist/services/app/registry.js.map +1 -0
  120. package/dist/services/app/remote-spec.d.ts +14 -0
  121. package/dist/services/app/remote-spec.js +58 -0
  122. package/dist/services/app/remote-spec.js.map +1 -0
  123. package/dist/services/app/terminal-session-manager.d.ts +27 -0
  124. package/dist/services/app/terminal-session-manager.js +157 -0
  125. package/dist/services/app/terminal-session-manager.js.map +1 -0
  126. package/dist/services/app/types.d.ts +72 -0
  127. package/dist/services/app/types.js +16 -0
  128. package/dist/services/app/types.js.map +1 -0
  129. package/dist/services/backup-manager.js +60 -22
  130. package/dist/services/backup-manager.js.map +1 -1
  131. package/dist/services/instance-manager.d.ts +82 -39
  132. package/dist/services/instance-manager.js +575 -1142
  133. package/dist/services/instance-manager.js.map +1 -1
  134. package/dist/services/llm-proxy/circuit-breaker.js +10 -2
  135. package/dist/services/llm-proxy/circuit-breaker.js.map +1 -1
  136. package/dist/services/llm-proxy/index.d.ts +14 -1
  137. package/dist/services/llm-proxy/index.js +51 -6
  138. package/dist/services/llm-proxy/index.js.map +1 -1
  139. package/dist/services/nomad-manager.d.ts +260 -3
  140. package/dist/services/nomad-manager.js +2866 -449
  141. package/dist/services/nomad-manager.js.map +1 -1
  142. package/dist/services/panel-manager.d.ts +10 -0
  143. package/dist/services/panel-manager.js +97 -0
  144. package/dist/services/panel-manager.js.map +1 -1
  145. package/dist/services/plugin-installer.js +28 -2
  146. package/dist/services/plugin-installer.js.map +1 -1
  147. package/dist/services/process-manager.js +22 -0
  148. package/dist/services/process-manager.js.map +1 -1
  149. package/dist/services/runtime/adapters/custom.d.ts +20 -0
  150. package/dist/services/runtime/adapters/custom.js +90 -0
  151. package/dist/services/runtime/adapters/custom.js.map +1 -0
  152. package/dist/services/runtime/adapters/hermes.d.ts +174 -0
  153. package/dist/services/runtime/adapters/hermes.js +1316 -0
  154. package/dist/services/runtime/adapters/hermes.js.map +1 -0
  155. package/dist/services/runtime/adapters/openclaw-routes.d.ts +17 -0
  156. package/dist/services/runtime/adapters/openclaw-routes.js +946 -0
  157. package/dist/services/runtime/adapters/openclaw-routes.js.map +1 -0
  158. package/dist/services/runtime/adapters/openclaw.d.ts +188 -0
  159. package/dist/services/runtime/adapters/openclaw.js +2195 -0
  160. package/dist/services/runtime/adapters/openclaw.js.map +1 -0
  161. package/dist/services/runtime/errors.d.ts +28 -0
  162. package/dist/services/runtime/errors.js +31 -0
  163. package/dist/services/runtime/errors.js.map +1 -0
  164. package/dist/services/runtime/index.d.ts +34 -0
  165. package/dist/services/runtime/index.js +51 -0
  166. package/dist/services/runtime/index.js.map +1 -0
  167. package/dist/services/runtime/instance.d.ts +24 -0
  168. package/dist/services/runtime/instance.js +143 -0
  169. package/dist/services/runtime/instance.js.map +1 -0
  170. package/dist/services/runtime/migrations.d.ts +15 -0
  171. package/dist/services/runtime/migrations.js +25 -0
  172. package/dist/services/runtime/migrations.js.map +1 -0
  173. package/dist/services/runtime/registry.d.ts +13 -0
  174. package/dist/services/runtime/registry.js +32 -0
  175. package/dist/services/runtime/registry.js.map +1 -0
  176. package/dist/services/runtime/types.d.ts +545 -0
  177. package/dist/services/runtime/types.js +14 -0
  178. package/dist/services/runtime/types.js.map +1 -0
  179. package/dist/services/setup-manager.d.ts +70 -29
  180. package/dist/services/setup-manager.js +278 -597
  181. package/dist/services/setup-manager.js.map +1 -1
  182. package/dist/services/task-registry.d.ts +44 -0
  183. package/dist/services/task-registry.js +74 -0
  184. package/dist/services/task-registry.js.map +1 -0
  185. package/dist/services/telemetry/heartbeat.d.ts +6 -6
  186. package/dist/services/telemetry/heartbeat.js +29 -30
  187. package/dist/services/telemetry/heartbeat.js.map +1 -1
  188. package/dist/types.d.ts +162 -2
  189. package/dist/utils/docker-host.d.ts +15 -0
  190. package/dist/utils/docker-host.js +64 -0
  191. package/dist/utils/docker-host.js.map +1 -0
  192. package/install/jishu-install.sh +25 -1
  193. package/package.json +14 -4
  194. package/public/assets/Dashboard-B-JoOjBQ.js +1 -0
  195. package/public/assets/HermesChatPanel-mFSureyc.js +1 -0
  196. package/public/assets/HermesConfigForm-DvR05LK1.js +4 -0
  197. package/public/assets/InitPassword-CVA8wQA6.js +1 -0
  198. package/public/assets/InstanceDetail-DcZW2QGO.js +91 -0
  199. package/public/assets/{Login-D1Bt-Lyk.js → Login-BWsZH2mu.js} +1 -1
  200. package/public/assets/NewInstance-BCIrAd86.js +1 -0
  201. package/public/assets/Settings-xkDcduFz.js +1 -0
  202. package/public/assets/Setup-Cfuwj4gV.js +1 -0
  203. package/public/assets/WeixinLoginPanel-CnjR8xMu.js +9 -0
  204. package/public/assets/index-CPhVFEsx.css +1 -0
  205. package/public/assets/index-DQsM6Joa.js +19 -0
  206. package/public/assets/input-paste-CrNVAyOy.js +1 -0
  207. package/public/assets/registry-B4UFJdpA.js +2 -0
  208. package/public/assets/{usePolling-CK0DfI4h.js → usePolling-Do5Erqm_.js} +1 -1
  209. package/public/assets/vendor-i18n-ucpM0OR0.js +9 -0
  210. package/public/assets/{vendor-react-B1-3Yrt-.js → vendor-react-Bk1hRGiY.js} +1 -1
  211. package/public/favicon.png +0 -0
  212. package/public/index.html +9 -4
  213. package/public/logos/hermes.png +0 -0
  214. package/public/logos/ollama.png +0 -0
  215. package/public/logos/openclaw.svg +60 -0
  216. package/scripts/build-hermes-image.sh +21 -0
  217. package/scripts/build-local.sh +54 -0
  218. package/scripts/check-adapter-isolation.ts +293 -0
  219. package/scripts/fixtures/instances/hermes-sample/instance.json +37 -0
  220. package/scripts/fixtures/instances/legacy-openclaw-sample/instance.json +7 -0
  221. package/scripts/smoke/hermes-bootstrap.sh +195 -0
  222. package/templates/hermes-entrypoint.sh +154 -0
  223. package/dist/cli/openclaw.d.ts +0 -12
  224. package/dist/cli/openclaw.js +0 -156
  225. package/dist/cli/openclaw.js.map +0 -1
  226. package/dist/services/app-compiler.js.map +0 -1
  227. package/dist/services/app-manager.d.ts +0 -17
  228. package/dist/services/app-manager.js +0 -168
  229. package/dist/services/app-manager.js.map +0 -1
  230. package/dist/services/job-manager.d.ts +0 -22
  231. package/dist/services/job-manager.js +0 -102
  232. package/dist/services/job-manager.js.map +0 -1
  233. package/public/assets/Dashboard-CQsp1Mr9.js +0 -1
  234. package/public/assets/InitPassword-BEC8SE4A.js +0 -1
  235. package/public/assets/InstanceDetail-B5wTgNEg.js +0 -17
  236. package/public/assets/NewInstance-GQzm3K9D.js +0 -1
  237. package/public/assets/Settings-ByjGlqhP.js +0 -1
  238. package/public/assets/Setup-cMF21Y-8.js +0 -1
  239. package/public/assets/index-B6qQP4mH.css +0 -1
  240. package/public/assets/index-BuTQtuNy.js +0 -16
  241. package/public/assets/vendor-i18n-CfW0RvgE.js +0 -9
@@ -0,0 +1,195 @@
1
+ #!/bin/bash
2
+ #
3
+ # End-to-end smoke for Hermes default onboarding.
4
+ #
5
+ # Drives the complete lifecycle against a running jishushell panel:
6
+ # 1. install Hermes runtime (docker pull + shim + panel.json catalog)
7
+ # 2. create a Hermes instance via POST /api/instances {"agentType":"hermes"}
8
+ # 3. start the instance
9
+ # 4. poll /health until 200 OK (or timeout)
10
+ # 5. stop + delete the instance
11
+ # 6. verify instance dir is cleaned up
12
+ #
13
+ # Usage:
14
+ # JISHUSHELL_URL=http://pi2:8090 JISHUSHELL_TOKEN=... ./scripts/smoke/hermes-bootstrap.sh
15
+ # (or run on the same host with defaults)
16
+ #
17
+ # Per docs/feedback_validate_before_commit.md, this script MUST be run on a
18
+ # real Pi2 box before the Hermes onboarding work is considered complete.
19
+
20
+ set -eo pipefail
21
+
22
+ PANEL_URL="${JISHUSHELL_URL:-http://127.0.0.1:8090}"
23
+ AUTH_TOKEN="${JISHUSHELL_TOKEN:-}"
24
+ INSTANCE_ID="${INSTANCE_ID:-hermes-smoke}"
25
+ INSTANCE_NAME="${INSTANCE_NAME:-Hermes Smoke Test}"
26
+ HEALTH_TIMEOUT="${HEALTH_TIMEOUT:-180}" # seconds; first docker pull can take a while
27
+ INSTALL_TIMEOUT="${INSTALL_TIMEOUT:-1800}" # 30 min for 2.4 GB image on slow links
28
+
29
+ red() { printf '\033[31m%s\033[0m\n' "$*"; }
30
+ green() { printf '\033[32m%s\033[0m\n' "$*"; }
31
+ blue() { printf '\033[34m%s\033[0m\n' "$*"; }
32
+ yellow(){ printf '\033[33m%s\033[0m\n' "$*"; }
33
+
34
+ log() { blue "[hermes-smoke] $*"; }
35
+ ok() { green "[hermes-smoke] ✔ $*"; }
36
+ fail() { red "[hermes-smoke] ✘ $*"; exit 1; }
37
+
38
+ CURL_AUTH=()
39
+ if [ -n "$AUTH_TOKEN" ]; then
40
+ CURL_AUTH=(-H "Authorization: Bearer $AUTH_TOKEN")
41
+ fi
42
+
43
+ api() {
44
+ local method="$1"; shift
45
+ local path="$1"; shift
46
+ curl -fsS -X "$method" "${PANEL_URL}${path}" \
47
+ "${CURL_AUTH[@]}" \
48
+ -H "Content-Type: application/json" \
49
+ "$@"
50
+ }
51
+
52
+ # ── 0. Preflight ──────────────────────────────────────────────────────
53
+
54
+ log "panel: $PANEL_URL"
55
+ log "instance: $INSTANCE_ID"
56
+
57
+ if ! curl -fsS "$PANEL_URL/api/setup/status" "${CURL_AUTH[@]}" >/dev/null 2>&1; then
58
+ fail "panel not reachable at $PANEL_URL"
59
+ fi
60
+ ok "panel reachable"
61
+
62
+ # Ensure any stale instance from a prior run is gone
63
+ if curl -fsS "$PANEL_URL/api/instances/$INSTANCE_ID" "${CURL_AUTH[@]}" >/dev/null 2>&1; then
64
+ yellow "stale $INSTANCE_ID found, cleaning up first"
65
+ api DELETE "/api/instances/$INSTANCE_ID?purge_backups=true" >/dev/null || true
66
+ sleep 2
67
+ fi
68
+
69
+ # ── 1. Install Hermes runtime ────────────────────────────────────────
70
+
71
+ log "installing Hermes runtime (this pulls ~2.4 GB on first run)..."
72
+ INSTALL_RESP=$(api POST "/api/setup/install/hermes" -d '{}')
73
+ TASK_ID=$(printf '%s' "$INSTALL_RESP" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('taskId',''))" 2>/dev/null || echo "")
74
+ if [ -z "$TASK_ID" ]; then
75
+ fail "installHermes did not return a taskId. Response: $INSTALL_RESP"
76
+ fi
77
+ log "install task: $TASK_ID — polling..."
78
+
79
+ START_TS=$(date +%s)
80
+ while : ; do
81
+ STATUS_RESP=$(curl -fsS "$PANEL_URL/api/setup/tasks/$TASK_ID" "${CURL_AUTH[@]}")
82
+ STATUS=$(printf '%s' "$STATUS_RESP" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('status',''))" 2>/dev/null || echo "")
83
+ LAST_MSG=$(printf '%s' "$STATUS_RESP" | python3 -c "import json,sys; d=json.load(sys.stdin); ev=d.get('events') or []; print(ev[-1].get('message','')) if ev else print('')" 2>/dev/null || echo "")
84
+ ELAPSED=$(( $(date +%s) - START_TS ))
85
+ printf '\r [%ds] %-60s' "$ELAPSED" "$LAST_MSG"
86
+ if [ "$STATUS" = "done" ]; then
87
+ printf '\n'
88
+ ok "Hermes installed"
89
+ break
90
+ fi
91
+ if [ "$STATUS" = "error" ]; then
92
+ printf '\n'
93
+ fail "Hermes install failed: $LAST_MSG"
94
+ fi
95
+ if [ "$ELAPSED" -gt "$INSTALL_TIMEOUT" ]; then
96
+ printf '\n'
97
+ fail "Hermes install timeout after ${INSTALL_TIMEOUT}s"
98
+ fi
99
+ sleep 3
100
+ done
101
+
102
+ # ── 2. Create Hermes instance ────────────────────────────────────────
103
+
104
+ log "creating instance $INSTANCE_ID..."
105
+ CREATE_BODY=$(printf '{"id":"%s","name":"%s","agentType":"hermes"}' "$INSTANCE_ID" "$INSTANCE_NAME")
106
+ CREATE_RESP=$(api POST "/api/instances" -d "$CREATE_BODY")
107
+ AGENT_TYPE=$(printf '%s' "$CREATE_RESP" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('agentType',''))" 2>/dev/null || echo "")
108
+ if [ "$AGENT_TYPE" != "hermes" ]; then
109
+ fail "created instance has wrong agentType: expected 'hermes', got '$AGENT_TYPE'. Response: $CREATE_RESP"
110
+ fi
111
+ ok "instance created"
112
+
113
+ # ── 3. Start (may already be auto-started if default_provider is set) ─
114
+
115
+ log "starting instance..."
116
+ api POST "/api/instances/$INSTANCE_ID/service/start" -d '{}' >/dev/null || yellow "service/start returned non-2xx (may already be running)"
117
+
118
+ # ── 4. Poll /health ──────────────────────────────────────────────────
119
+
120
+ log "resolving allocated host port..."
121
+ sleep 3
122
+ GW_INFO=$(api GET "/api/instances/$INSTANCE_ID/gateway-launch" 2>/dev/null || echo "")
123
+ GW_PORT=$(printf '%s' "$GW_INFO" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('port',''))" 2>/dev/null || echo "")
124
+ if [ -z "$GW_PORT" ]; then
125
+ # Fallback: read port from instance.json via /api/instances/:id
126
+ INST_INFO=$(api GET "/api/instances/$INSTANCE_ID")
127
+ GW_PORT=$(printf '%s' "$INST_INFO" | python3 -c "
128
+ import json, sys
129
+ d = json.load(sys.stdin)
130
+ rt = d.get('runtime', {}) or {}
131
+ ports = rt.get('ports') or []
132
+ for p in ports:
133
+ if p.get('name') == 'gateway':
134
+ print(p.get('hostPort', ''))
135
+ break
136
+ else:
137
+ print('')
138
+ " 2>/dev/null || echo "")
139
+ fi
140
+ if [ -z "$GW_PORT" ] || [ "$GW_PORT" = "0" ]; then
141
+ fail "could not resolve allocated gateway port"
142
+ fi
143
+ log "gateway port: $GW_PORT"
144
+
145
+ # Determine health target — assume panel host for Pi deploy
146
+ HEALTH_HOST=$(printf '%s' "$PANEL_URL" | sed -E 's#https?://([^:/]+).*#\1#')
147
+ HEALTH_URL="http://${HEALTH_HOST}:${GW_PORT}/health"
148
+ log "probing $HEALTH_URL (timeout ${HEALTH_TIMEOUT}s)..."
149
+
150
+ START_TS=$(date +%s)
151
+ while : ; do
152
+ if BODY=$(curl -fsS --max-time 5 "$HEALTH_URL" 2>/dev/null); then
153
+ STATUS_FIELD=$(printf '%s' "$BODY" | python3 -c "import json,sys; print(json.load(sys.stdin).get('status',''))" 2>/dev/null || echo "")
154
+ PLATFORM=$(printf '%s' "$BODY" | python3 -c "import json,sys; print(json.load(sys.stdin).get('platform',''))" 2>/dev/null || echo "")
155
+ if [ "$STATUS_FIELD" = "ok" ] && [ "$PLATFORM" = "hermes-agent" ]; then
156
+ ok "health OK — ${BODY}"
157
+ break
158
+ fi
159
+ fi
160
+ ELAPSED=$(( $(date +%s) - START_TS ))
161
+ if [ "$ELAPSED" -gt "$HEALTH_TIMEOUT" ]; then
162
+ red " last body: $BODY"
163
+ fail "health check timeout after ${HEALTH_TIMEOUT}s"
164
+ fi
165
+ printf '\r [%ds] waiting for /health ... ' "$ELAPSED"
166
+ sleep 3
167
+ done
168
+
169
+ # ── 5. Stop + delete ─────────────────────────────────────────────────
170
+
171
+ log "stopping instance..."
172
+ api POST "/api/instances/$INSTANCE_ID/service/stop" -d '{}' >/dev/null
173
+ ok "stopped"
174
+
175
+ log "deleting instance..."
176
+ api DELETE "/api/instances/$INSTANCE_ID?purge_backups=true" >/dev/null
177
+ ok "deleted"
178
+
179
+ # ── 6. Verify cleanup ────────────────────────────────────────────────
180
+
181
+ # Via API — should 404
182
+ if curl -fsS "$PANEL_URL/api/instances/$INSTANCE_ID" "${CURL_AUTH[@]}" >/dev/null 2>&1; then
183
+ fail "instance still exists after delete"
184
+ fi
185
+ ok "instance removed from panel"
186
+
187
+ # Via filesystem — optional local verification (works when running on same host)
188
+ if [ -d "$HOME/.jishushell/instances/$INSTANCE_ID" ]; then
189
+ fail "instance directory still exists at $HOME/.jishushell/instances/$INSTANCE_ID"
190
+ fi
191
+
192
+ green ""
193
+ green "════════════════════════════════════════════"
194
+ green " Hermes default onboarding smoke: PASSED"
195
+ green "════════════════════════════════════════════"
@@ -0,0 +1,154 @@
1
+ #!/bin/bash
2
+ # JishuShell Hermes entrypoint shim.
3
+ # Wraps ghcr.io/x-aijishu/hermes-runtime:latest for per-instance upgrades.
4
+ #
5
+ # Business logic mirrors OpenClaw's update-seed pattern
6
+ # (src/services/runtime/adapters/openclaw.ts:ensureOpenclawUpdateSeed):
7
+ # 1. Baseline runtime is baked into the image (/opt/hermes).
8
+ # 2. A persistent venv lives on the bind-mounted agent-home
9
+ # (${HERMES_HOME}/.venv) and is seeded from the image on first boot.
10
+ # 3. In-container `uv pip install --upgrade ...` writes to the persistent
11
+ # venv, so after `docker restart` the instance boots the upgraded
12
+ # version — exactly like `npm install openclaw@latest` on OpenClaw.
13
+ #
14
+ # Implements §32.1 decisions from docs/multi-agent-runtime-generalization-plan.md:
15
+ # §32.1.2 — incomplete venv recovery via .installed-ref sentinel
16
+ # §32.1.3 — baseline mode detected by ABSENCE of JISHUSHELL_HERMES_SOURCE_REF env,
17
+ # not by any literal "image-baseline" string
18
+ set -e
19
+
20
+ IMAGE_INSTALL_DIR=/opt/hermes
21
+ IMAGE_VENV_DIR=/opt/hermes/.venv
22
+ HERMES_HOME=/opt/data
23
+ PERSISTENT_VENV_DIR=/opt/data/.venv
24
+ OVERLAY_DIR=/opt/data/hermes-overlay
25
+
26
+ # ── UID/GID remap (keep bind-mount permissions controllable) ──────────────────
27
+ if [ "$(id -u)" = "0" ]; then
28
+ if [ -n "$HERMES_UID" ] && [ "$HERMES_UID" != "$(id -u hermes)" ]; then
29
+ echo "[jishushell-shim] remapping hermes uid → $HERMES_UID"
30
+ usermod -u "$HERMES_UID" hermes
31
+ fi
32
+ if [ -n "$HERMES_GID" ] && [ "$HERMES_GID" != "$(id -g hermes)" ]; then
33
+ echo "[jishushell-shim] remapping hermes gid → $HERMES_GID"
34
+ groupmod -g "$HERMES_GID" hermes
35
+ fi
36
+ chown -R hermes:hermes "$HERMES_HOME"
37
+ # Re-exec under hermes user. Use `bash "$0"` instead of `"$0"` directly —
38
+ # Nomad/Docker bind-mounts sometimes drop the exec bit, so execve on the
39
+ # shim file fails with EACCES. Invoking bash as the interpreter bypasses
40
+ # that check entirely (bash reads the file, no execve on the script).
41
+ exec gosu hermes bash "$0" "$@"
42
+ fi
43
+
44
+ # ── Mode selection (§32.1.3): overlay requires BOTH non-empty SOURCE_REF AND
45
+ # the overlay source pyproject.toml to exist; no "image-baseline" sentinel ──
46
+ if [ -n "$JISHUSHELL_HERMES_SOURCE_REF" ] && [ -f "$OVERLAY_DIR/source/pyproject.toml" ]; then
47
+ # ── overlay mode: use per-instance upgraded version ──────────────────────
48
+ echo "[jishushell-shim] overlay mode (ref=$JISHUSHELL_HERMES_SOURCE_REF)"
49
+ INSTALL_DIR="$OVERLAY_DIR/source"
50
+ VENV_DIR="$OVERLAY_DIR/.venv"
51
+
52
+ # §32.1.2: incomplete venv recovery — venv dir exists but sentinel missing
53
+ if [ -d "$VENV_DIR" ] && [ ! -f "$VENV_DIR/.installed-ref" ]; then
54
+ echo "[jishushell-shim] incomplete venv detected, rebuilding"
55
+ rm -rf "$VENV_DIR"
56
+ fi
57
+
58
+ INSTALLED_REF=$(cat "$VENV_DIR/.installed-ref" 2>/dev/null || echo "")
59
+
60
+ if [ ! -f "$VENV_DIR/bin/activate" ] || [ "$JISHUSHELL_HERMES_SOURCE_REF" != "$INSTALLED_REF" ]; then
61
+ echo "[jishushell-shim] building overlay venv from source @ $JISHUSHELL_HERMES_SOURCE_REF (one-time per upgrade, ~1-3 min)..."
62
+ rm -rf "$VENV_DIR"
63
+ cd "$INSTALL_DIR"
64
+ uv venv "$VENV_DIR"
65
+ uv pip install --no-cache-dir --python "$VENV_DIR/bin/python" -e ".[all]"
66
+ echo "$JISHUSHELL_HERMES_SOURCE_REF" > "$VENV_DIR/.installed-ref"
67
+ echo "[jishushell-shim] overlay venv ready."
68
+ fi
69
+ else
70
+ # ── baseline mode: image venv (fast first boot) → persistent venv on upgrade ──
71
+ #
72
+ # Mirrors OpenClaw's update-seed model:
73
+ # - First boot: $PERSISTENT_VENV_DIR is missing, activate image venv
74
+ # directly (zero-overhead startup — no copy, no rebuild).
75
+ # - After user runs the in-container upgrade helper below, the
76
+ # persistent venv lives on the bind-mounted agent-home, so future
77
+ # boots pick it up and the user's upgraded packages survive
78
+ # container restart.
79
+ INSTALL_DIR="$IMAGE_INSTALL_DIR"
80
+ if [ -d "$PERSISTENT_VENV_DIR" ]; then
81
+ VENV_DIR="$PERSISTENT_VENV_DIR"
82
+ echo "[jishushell-shim] baseline (persistent venv — in-container upgrades active)"
83
+ else
84
+ VENV_DIR="$IMAGE_VENV_DIR"
85
+ echo "[jishushell-shim] baseline (image venv — fast first boot)"
86
+ fi
87
+ fi
88
+
89
+ # ── Deploy the upgrade helper (idempotent) ──────────────────────────────────
90
+ # Gives users a one-command upgrade path:
91
+ # docker exec -it <container> /opt/data/jishushell-hermes-upgrade [pkg-spec]
92
+ # mirroring OpenClaw's "Update now" button. Writes into the bind-mounted
93
+ # agent-home so it persists without touching the image.
94
+ UPGRADE_HELPER="$HERMES_HOME/jishushell-hermes-upgrade"
95
+ cat > "$UPGRADE_HELPER" <<'HELPER'
96
+ #!/bin/bash
97
+ # In-container Hermes upgrade helper (auto-generated by jishushell shim).
98
+ #
99
+ # Privilege model — never escalate:
100
+ # - If invoked as root (e.g. plain `docker exec`), re-exec under the
101
+ # hermes service account via gosu. All writes go through the unprivileged
102
+ # user so files on the mounted volume end up with hermes:hermes
103
+ # ownership, matching the service that actually runs the agent.
104
+ # - All filesystem writes stay inside the bind-mounted /opt/data volume.
105
+ # The read-only image layers at /opt/hermes are never touched.
106
+ #
107
+ # First run: seeds persistent venv from image baseline (~5-10s cp + sed).
108
+ # Subsequent runs: fast (venv already persistent).
109
+ # Restart the container after running to load the upgraded version.
110
+ set -e
111
+
112
+ if [ "$(id -u)" = "0" ]; then
113
+ exec gosu hermes bash "$0" "$@"
114
+ fi
115
+
116
+ TARGET="${1:-hermes-agent}"
117
+ IMAGE_VENV=/opt/hermes/.venv
118
+ PERSISTENT_VENV=/opt/data/.venv
119
+
120
+ if [ ! -d "$PERSISTENT_VENV" ]; then
121
+ echo "[jishushell-upgrade] seeding persistent venv from image baseline ..."
122
+ cp -r "$IMAGE_VENV" "$PERSISTENT_VENV"
123
+ # Rewrite hardcoded paths so the copied venv's entrypoints resolve to
124
+ # the persistent location, not back to the read-only image path.
125
+ find "$PERSISTENT_VENV/bin" -type f -exec \
126
+ sed -i "s|$IMAGE_VENV|$PERSISTENT_VENV|g" {} + 2>/dev/null || true
127
+ [ -f "$PERSISTENT_VENV/pyvenv.cfg" ] && \
128
+ sed -i "s|$IMAGE_VENV|$PERSISTENT_VENV|g" "$PERSISTENT_VENV/pyvenv.cfg" || true
129
+ echo "[jishushell-upgrade] seed complete."
130
+ fi
131
+
132
+ source "$PERSISTENT_VENV/bin/activate"
133
+ # uv-created venvs don't ship pip; bootstrap it on demand. ensurepip is a
134
+ # stdlib module so this works on every Python >= 3.4 without network.
135
+ python -m ensurepip --upgrade >/dev/null 2>&1 || true
136
+ echo "[jishushell-upgrade] python -m pip install --upgrade $TARGET ..."
137
+ python -m pip install --upgrade "$TARGET"
138
+ echo "[jishushell-upgrade] done. Restart the container to load the upgraded version:"
139
+ echo " docker restart <container-id> (or panel: Restart button)"
140
+ HELPER
141
+ chmod 755 "$UPGRADE_HELPER"
142
+
143
+ # ── Config bootstrap (both modes): mkdir + copy examples when missing ────────
144
+ mkdir -p "$HERMES_HOME"/{cron,sessions,logs,hooks,memories,skills,skins,plans,workspace,home,weixin,weixin/accounts,hermes-overlay}
145
+ [ -f "$HERMES_HOME/.env" ] || cp "$INSTALL_DIR/.env.example" "$HERMES_HOME/.env"
146
+ [ -f "$HERMES_HOME/config.yaml" ] || cp "$INSTALL_DIR/cli-config.yaml.example" "$HERMES_HOME/config.yaml"
147
+ [ -f "$HERMES_HOME/SOUL.md" ] || cp "$INSTALL_DIR/docker/SOUL.md" "$HERMES_HOME/SOUL.md"
148
+
149
+ # ── Skills sync (best-effort, upstream behavior) ─────────────────────────────
150
+ python3 "$INSTALL_DIR/tools/skills_sync.py" || true
151
+
152
+ # ── Activate venv and hand off to hermes ─────────────────────────────────────
153
+ source "$VENV_DIR/bin/activate"
154
+ exec hermes "$@"
@@ -1,12 +0,0 @@
1
- /**
2
- * src/cli/openclaw.ts
3
- * OpenClaw 实例管理子命令
4
- *
5
- * jishushell openclaw pairing list
6
- * jishushell openclaw pairing approve <channel> <code>
7
- *
8
- * 后续可在此扩展: logs、shell、config-show 等
9
- */
10
- export declare function run(rest: string[]): Promise<void>;
11
- export declare function brief(): string;
12
- export declare function printHelp(): void;
@@ -1,156 +0,0 @@
1
- /**
2
- * src/cli/openclaw.ts
3
- * OpenClaw 实例管理子命令
4
- *
5
- * jishushell openclaw pairing list
6
- * jishushell openclaw pairing approve <channel> <code>
7
- *
8
- * 后续可在此扩展: logs、shell、config-show 等
9
- */
10
- import { getSvc, resolveInstanceForPairing } from "../services/job-manager.js";
11
- import { loadNomadToken } from "../services/setup-manager.js";
12
- const isTTY = process.stdout.isTTY ?? false;
13
- const c = {
14
- bold: (s) => isTTY ? `\x1b[1m${s}\x1b[0m` : s,
15
- green: (s) => isTTY ? `\x1b[32m${s}\x1b[0m` : s,
16
- red: (s) => isTTY ? `\x1b[31m${s}\x1b[0m` : s,
17
- cyan: (s) => isTTY ? `\x1b[36m${s}\x1b[0m` : s,
18
- dim: (s) => isTTY ? `\x1b[2m${s}\x1b[0m` : s,
19
- };
20
- function log(msg) { process.stdout.write(msg + "\n"); }
21
- async function runPairing(rest) {
22
- const action = rest[0];
23
- let instanceId;
24
- const instIdx = rest.indexOf("--instance");
25
- if (instIdx !== -1 && rest[instIdx + 1])
26
- instanceId = rest[instIdx + 1];
27
- if (action === "list") {
28
- loadNomadToken();
29
- let targetId;
30
- try {
31
- targetId = await resolveInstanceForPairing(instanceId);
32
- }
33
- catch (e) {
34
- log(c.red(` ✗ ${e.message}`));
35
- process.exit(1);
36
- }
37
- log("");
38
- log(c.bold(c.cyan(` Pairing requests for instance: ${targetId}`)));
39
- log(c.dim(" ─────────────────────────────────────────────────────"));
40
- const svc = await getSvc();
41
- try {
42
- const result = await svc.exec(targetId, ["openclaw", "pairing", "list"], 15_000);
43
- const output = (result.stdout + result.stderr).trim();
44
- log(output || " (no pending requests)");
45
- if (result.exitCode !== 0)
46
- process.exit(1);
47
- }
48
- catch (e) {
49
- log(c.red(` ✗ ${e.message || "Failed to list pairing requests."}`));
50
- process.exit(1);
51
- }
52
- log("");
53
- }
54
- else if (action === "approve") {
55
- loadNomadToken();
56
- const actionArgs = rest.slice(1).filter((a) => !a.startsWith("--") && a !== instanceId);
57
- let channel;
58
- let code;
59
- if (actionArgs.length >= 2) {
60
- [channel, code] = actionArgs;
61
- }
62
- else if (actionArgs.length === 1) {
63
- channel = "feishu";
64
- code = actionArgs[0];
65
- }
66
- else {
67
- console.error("Usage: jishushell openclaw pairing approve <channel> <code> [--instance <id>]");
68
- process.exit(1);
69
- }
70
- let targetId;
71
- try {
72
- targetId = await resolveInstanceForPairing(instanceId);
73
- }
74
- catch (e) {
75
- log(c.red(` ✗ ${e.message}`));
76
- process.exit(1);
77
- }
78
- const notify = rest.includes("--notify");
79
- const cmd = ["openclaw", "pairing", "approve", channel, code];
80
- if (notify)
81
- cmd.push("--notify");
82
- log("");
83
- log(c.bold(` Approving pairing code ${c.cyan(code)} on channel ${c.cyan(channel)}…`));
84
- const svc = await getSvc();
85
- try {
86
- const result = await svc.exec(targetId, cmd, 15_000);
87
- const output = (result.stdout + result.stderr).trim();
88
- if (result.exitCode === 0) {
89
- log(c.green(` ✓ ${output}`));
90
- }
91
- else {
92
- log(c.red(` ✗ ${output || "Approval failed"}`));
93
- process.exit(1);
94
- }
95
- }
96
- catch (e) {
97
- log(c.red(` ✗ ${e.message || "Approval failed"}`));
98
- process.exit(1);
99
- }
100
- log("");
101
- }
102
- else {
103
- console.log(`
104
- Usage: jishushell openclaw pairing <command> [options]
105
-
106
- Commands:
107
- list 列出等待审批的配对请求
108
- approve <channel> <code> 审批配对码(例: feishu LVU7PNYK)
109
- approve <code> 默认 channel=feishu 简写形式
110
-
111
- Options:
112
- --instance <id> 指定实例 ID(只有一个实例时可省略)
113
- --notify 审批后通知申请方
114
-
115
- Examples:
116
- jishushell openclaw pairing list
117
- jishushell openclaw pairing approve feishu LVU7PNYK
118
- jishushell openclaw pairing approve LVU7PNYK --instance my-inst
119
- `);
120
- process.exit(action ? 1 : 0);
121
- }
122
- }
123
- export async function run(rest) {
124
- const cmd = rest[0];
125
- const args = rest.slice(1);
126
- if (cmd === "pairing") {
127
- await runPairing(args);
128
- }
129
- else if (cmd === "help" || cmd === "--help" || cmd === "-h") {
130
- printHelp();
131
- }
132
- else {
133
- printHelp();
134
- if (cmd)
135
- process.exit(1);
136
- }
137
- }
138
- export function brief() {
139
- return " openclaw <pairing> OpenClaw 实例管理";
140
- }
141
- export function printHelp() {
142
- console.log(`
143
- Usage: jishushell openclaw <command> [options]
144
-
145
- Commands:
146
- pairing list 列出等待审批的配对请求
147
- pairing approve <channel> <code> 审批配对码(例: feishu LVU7PNYK)
148
- help 显示此帮助
149
-
150
- Examples:
151
- jishushell openclaw pairing list
152
- jishushell openclaw pairing approve feishu LVU7PNYK
153
- jishushell openclaw pairing approve LVU7PNYK --instance my-inst
154
- `);
155
- }
156
- //# sourceMappingURL=openclaw.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/cli/openclaw.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"app-compiler.js","sourceRoot":"","sources":["../../src/services/app-compiler.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- import type { AppManifest, AppSpec } from "../types.js";
2
- export declare function installApp(specYaml: string): Promise<{
3
- spec: AppSpec;
4
- manifest: AppManifest;
5
- }>;
6
- export declare function listApps(): Array<{
7
- spec: AppSpec;
8
- manifest: AppManifest;
9
- }>;
10
- export declare function getApp(id: string): {
11
- spec: AppSpec;
12
- manifest: AppManifest;
13
- } | null;
14
- export declare function uninstallApp(id: string): void;
15
- export declare function registerCapabilities(instanceId: string, spec: AppSpec, port: number): void;
16
- export declare function unregisterCapabilities(instanceId: string): void;
17
- export declare function resolveRequires(spec: AppSpec): Record<string, string>;