jishushell 0.4.10 → 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 (248) hide show
  1. package/Dockerfile.hermes-slim +193 -0
  2. package/INSTALL-NOTICE +10 -12
  3. package/apps/hermes-container.yaml +35 -0
  4. package/apps/ollama-binary.yaml +200 -0
  5. package/apps/ollama-cpu-container.yaml +37 -0
  6. package/apps/ollama-with-hollama-binary.yaml +195 -0
  7. package/apps/openclaw-binary.yaml +69 -0
  8. package/apps/openclaw-container.yaml +37 -0
  9. package/apps/openclaw-with-ollama-container.yaml +42 -0
  10. package/apps/openclaw-with-searxng-container.yaml +136 -0
  11. package/apps/openwebui-container.yaml +53 -0
  12. package/apps/playwright-container.yaml +120 -0
  13. package/apps/searxng-container.yaml +115 -0
  14. package/dist/auth.d.ts +1 -0
  15. package/dist/auth.js +15 -14
  16. package/dist/auth.js.map +1 -1
  17. package/dist/cli/app.d.ts +4 -0
  18. package/dist/cli/app.js +814 -0
  19. package/dist/cli/app.js.map +1 -0
  20. package/dist/cli/backup.d.ts +3 -0
  21. package/dist/cli/backup.js +434 -0
  22. package/dist/cli/backup.js.map +1 -0
  23. package/dist/{doctor.d.ts → cli/doctor.d.ts} +7 -1
  24. package/dist/{doctor.js → cli/doctor.js} +377 -22
  25. package/dist/cli/doctor.js.map +1 -0
  26. package/dist/cli/helpers.d.ts +4 -0
  27. package/dist/cli/helpers.js +32 -0
  28. package/dist/cli/helpers.js.map +1 -0
  29. package/dist/cli/job.d.ts +4 -0
  30. package/dist/cli/job.js +198 -0
  31. package/dist/cli/job.js.map +1 -0
  32. package/dist/cli/llm.d.ts +25 -0
  33. package/dist/cli/llm.js +599 -0
  34. package/dist/cli/llm.js.map +1 -0
  35. package/dist/cli/managed-list.d.ts +30 -0
  36. package/dist/cli/managed-list.js +129 -0
  37. package/dist/cli/managed-list.js.map +1 -0
  38. package/dist/cli/panel.d.ts +26 -0
  39. package/dist/cli/panel.js +804 -0
  40. package/dist/cli/panel.js.map +1 -0
  41. package/dist/cli/version.d.ts +1 -0
  42. package/dist/cli/version.js +12 -0
  43. package/dist/cli/version.js.map +1 -0
  44. package/dist/cli.js +48 -776
  45. package/dist/cli.js.map +1 -1
  46. package/dist/config.d.ts +69 -0
  47. package/dist/config.js +268 -7
  48. package/dist/config.js.map +1 -1
  49. package/dist/control.d.ts +17 -41
  50. package/dist/control.js +61 -1323
  51. package/dist/control.js.map +1 -1
  52. package/dist/install.d.ts +16 -0
  53. package/dist/install.js +75 -26
  54. package/dist/install.js.map +1 -1
  55. package/dist/routes/agent-apps.d.ts +15 -0
  56. package/dist/routes/agent-apps.js +78 -0
  57. package/dist/routes/agent-apps.js.map +1 -0
  58. package/dist/routes/apps.d.ts +3 -0
  59. package/dist/routes/apps.js +278 -0
  60. package/dist/routes/apps.js.map +1 -0
  61. package/dist/routes/backup.js +3 -3
  62. package/dist/routes/backup.js.map +1 -1
  63. package/dist/routes/instances.d.ts +6 -0
  64. package/dist/routes/instances.js +863 -874
  65. package/dist/routes/instances.js.map +1 -1
  66. package/dist/routes/llm.d.ts +15 -0
  67. package/dist/routes/llm.js +247 -0
  68. package/dist/routes/llm.js.map +1 -0
  69. package/dist/routes/runtime.d.ts +15 -0
  70. package/dist/routes/runtime.js +69 -0
  71. package/dist/routes/runtime.js.map +1 -0
  72. package/dist/routes/setup.js +131 -9
  73. package/dist/routes/setup.js.map +1 -1
  74. package/dist/routes/system.js +56 -9
  75. package/dist/routes/system.js.map +1 -1
  76. package/dist/server.js +107 -7
  77. package/dist/server.js.map +1 -1
  78. package/dist/services/agent-apps/catalog.d.ts +30 -0
  79. package/dist/services/agent-apps/catalog.js +60 -0
  80. package/dist/services/agent-apps/catalog.js.map +1 -0
  81. package/dist/services/agent-apps/index.d.ts +36 -0
  82. package/dist/services/agent-apps/index.js +171 -0
  83. package/dist/services/agent-apps/index.js.map +1 -0
  84. package/dist/services/agent-apps/installers/adapter-probes.d.ts +49 -0
  85. package/dist/services/agent-apps/installers/adapter-probes.js +223 -0
  86. package/dist/services/agent-apps/installers/adapter-probes.js.map +1 -0
  87. package/dist/services/agent-apps/installers/adapter.d.ts +30 -0
  88. package/dist/services/agent-apps/installers/adapter.js +171 -0
  89. package/dist/services/agent-apps/installers/adapter.js.map +1 -0
  90. package/dist/services/agent-apps/installers/registry-probe.d.ts +38 -0
  91. package/dist/services/agent-apps/installers/registry-probe.js +183 -0
  92. package/dist/services/agent-apps/installers/registry-probe.js.map +1 -0
  93. package/dist/services/agent-apps/installers/shell-script.d.ts +47 -0
  94. package/dist/services/agent-apps/installers/shell-script.js +471 -0
  95. package/dist/services/agent-apps/installers/shell-script.js.map +1 -0
  96. package/dist/services/agent-apps/types.d.ts +125 -0
  97. package/dist/services/agent-apps/types.js +17 -0
  98. package/dist/services/agent-apps/types.js.map +1 -0
  99. package/dist/services/app/app-compiler.d.ts +15 -0
  100. package/dist/services/app/app-compiler.js +172 -0
  101. package/dist/services/app/app-compiler.js.map +1 -0
  102. package/dist/services/app/app-manager.d.ts +142 -0
  103. package/dist/services/app/app-manager.js +1988 -0
  104. package/dist/services/app/app-manager.js.map +1 -0
  105. package/dist/services/app/custom-manager.d.ts +27 -0
  106. package/dist/services/app/custom-manager.js +285 -0
  107. package/dist/services/app/custom-manager.js.map +1 -0
  108. package/dist/services/app/hermes-agent-manager.d.ts +20 -0
  109. package/dist/services/app/hermes-agent-manager.js +289 -0
  110. package/dist/services/app/hermes-agent-manager.js.map +1 -0
  111. package/dist/services/app/id-normalizer.d.ts +27 -0
  112. package/dist/services/app/id-normalizer.js +77 -0
  113. package/dist/services/app/id-normalizer.js.map +1 -0
  114. package/dist/services/app/ollama-manager.d.ts +18 -0
  115. package/dist/services/app/ollama-manager.js +207 -0
  116. package/dist/services/app/ollama-manager.js.map +1 -0
  117. package/dist/services/app/openclaw-manager.d.ts +63 -0
  118. package/dist/services/app/openclaw-manager.js +1178 -0
  119. package/dist/services/app/openclaw-manager.js.map +1 -0
  120. package/dist/services/app/paths.d.ts +47 -0
  121. package/dist/services/app/paths.js +68 -0
  122. package/dist/services/app/paths.js.map +1 -0
  123. package/dist/services/app/registry.d.ts +17 -0
  124. package/dist/services/app/registry.js +31 -0
  125. package/dist/services/app/registry.js.map +1 -0
  126. package/dist/services/app/remote-spec.d.ts +14 -0
  127. package/dist/services/app/remote-spec.js +58 -0
  128. package/dist/services/app/remote-spec.js.map +1 -0
  129. package/dist/services/app/terminal-session-manager.d.ts +27 -0
  130. package/dist/services/app/terminal-session-manager.js +157 -0
  131. package/dist/services/app/terminal-session-manager.js.map +1 -0
  132. package/dist/services/app/types.d.ts +72 -0
  133. package/dist/services/app/types.js +16 -0
  134. package/dist/services/app/types.js.map +1 -0
  135. package/dist/services/backup-manager.js +60 -22
  136. package/dist/services/backup-manager.js.map +1 -1
  137. package/dist/services/instance-manager.d.ts +125 -34
  138. package/dist/services/instance-manager.js +679 -1043
  139. package/dist/services/instance-manager.js.map +1 -1
  140. package/dist/services/llm-proxy/adapters.js +5 -1
  141. package/dist/services/llm-proxy/adapters.js.map +1 -1
  142. package/dist/services/llm-proxy/circuit-breaker.js +10 -2
  143. package/dist/services/llm-proxy/circuit-breaker.js.map +1 -1
  144. package/dist/services/llm-proxy/index.d.ts +43 -0
  145. package/dist/services/llm-proxy/index.js +120 -5
  146. package/dist/services/llm-proxy/index.js.map +1 -1
  147. package/dist/services/llm-proxy/ssrf.js +1 -1
  148. package/dist/services/llm-proxy/ssrf.js.map +1 -1
  149. package/dist/services/nomad-manager.d.ts +260 -3
  150. package/dist/services/nomad-manager.js +2921 -341
  151. package/dist/services/nomad-manager.js.map +1 -1
  152. package/dist/services/panel-manager.d.ts +50 -0
  153. package/dist/services/panel-manager.js +443 -0
  154. package/dist/services/panel-manager.js.map +1 -0
  155. package/dist/services/plugin-installer.js +28 -2
  156. package/dist/services/plugin-installer.js.map +1 -1
  157. package/dist/services/process-manager.js +42 -7
  158. package/dist/services/process-manager.js.map +1 -1
  159. package/dist/services/runtime/adapters/custom.d.ts +20 -0
  160. package/dist/services/runtime/adapters/custom.js +90 -0
  161. package/dist/services/runtime/adapters/custom.js.map +1 -0
  162. package/dist/services/runtime/adapters/hermes.d.ts +174 -0
  163. package/dist/services/runtime/adapters/hermes.js +1316 -0
  164. package/dist/services/runtime/adapters/hermes.js.map +1 -0
  165. package/dist/services/runtime/adapters/openclaw-routes.d.ts +17 -0
  166. package/dist/services/runtime/adapters/openclaw-routes.js +946 -0
  167. package/dist/services/runtime/adapters/openclaw-routes.js.map +1 -0
  168. package/dist/services/runtime/adapters/openclaw.d.ts +188 -0
  169. package/dist/services/runtime/adapters/openclaw.js +2195 -0
  170. package/dist/services/runtime/adapters/openclaw.js.map +1 -0
  171. package/dist/services/runtime/errors.d.ts +28 -0
  172. package/dist/services/runtime/errors.js +31 -0
  173. package/dist/services/runtime/errors.js.map +1 -0
  174. package/dist/services/runtime/index.d.ts +34 -0
  175. package/dist/services/runtime/index.js +51 -0
  176. package/dist/services/runtime/index.js.map +1 -0
  177. package/dist/services/runtime/instance.d.ts +24 -0
  178. package/dist/services/runtime/instance.js +143 -0
  179. package/dist/services/runtime/instance.js.map +1 -0
  180. package/dist/services/runtime/migrations.d.ts +15 -0
  181. package/dist/services/runtime/migrations.js +25 -0
  182. package/dist/services/runtime/migrations.js.map +1 -0
  183. package/dist/services/runtime/registry.d.ts +13 -0
  184. package/dist/services/runtime/registry.js +32 -0
  185. package/dist/services/runtime/registry.js.map +1 -0
  186. package/dist/services/runtime/types.d.ts +545 -0
  187. package/dist/services/runtime/types.js +14 -0
  188. package/dist/services/runtime/types.js.map +1 -0
  189. package/dist/services/setup-manager.d.ts +70 -29
  190. package/dist/services/setup-manager.js +591 -625
  191. package/dist/services/setup-manager.js.map +1 -1
  192. package/dist/services/task-registry.d.ts +44 -0
  193. package/dist/services/task-registry.js +74 -0
  194. package/dist/services/task-registry.js.map +1 -0
  195. package/dist/services/telemetry/heartbeat.d.ts +6 -6
  196. package/dist/services/telemetry/heartbeat.js +29 -30
  197. package/dist/services/telemetry/heartbeat.js.map +1 -1
  198. package/dist/services/update-manager.d.ts +47 -0
  199. package/dist/services/update-manager.js +305 -0
  200. package/dist/services/update-manager.js.map +1 -0
  201. package/dist/types.d.ts +222 -0
  202. package/dist/utils/docker-host.d.ts +15 -0
  203. package/dist/utils/docker-host.js +64 -0
  204. package/dist/utils/docker-host.js.map +1 -0
  205. package/install/jishu-install.sh +303 -37
  206. package/install/post-install.sh +64 -5
  207. package/package.json +19 -5
  208. package/public/assets/Dashboard-B-JoOjBQ.js +1 -0
  209. package/public/assets/HermesChatPanel-mFSureyc.js +1 -0
  210. package/public/assets/HermesConfigForm-DvR05LK1.js +4 -0
  211. package/public/assets/InitPassword-CVA8wQA6.js +1 -0
  212. package/public/assets/InstanceDetail-DcZW2QGO.js +91 -0
  213. package/public/assets/{Login-CUoEZOWR.js → Login-BWsZH2mu.js} +1 -1
  214. package/public/assets/NewInstance-BCIrAd86.js +1 -0
  215. package/public/assets/Settings-xkDcduFz.js +1 -0
  216. package/public/assets/Setup-Cfuwj4gV.js +1 -0
  217. package/public/assets/WeixinLoginPanel-CnjR8xMu.js +9 -0
  218. package/public/assets/index-CPhVFEsx.css +1 -0
  219. package/public/assets/index-DQsM6Joa.js +19 -0
  220. package/public/assets/input-paste-CrNVAyOy.js +1 -0
  221. package/public/assets/{providers-lBSOjUWy.js → providers-V-vwrExZ.js} +1 -1
  222. package/public/assets/registry-B4UFJdpA.js +2 -0
  223. package/public/assets/{usePolling-CK0DfI4h.js → usePolling-Do5Erqm_.js} +1 -1
  224. package/public/assets/vendor-i18n-ucpM0OR0.js +9 -0
  225. package/public/assets/{vendor-react-B1-3Yrt-.js → vendor-react-Bk1hRGiY.js} +1 -1
  226. package/public/favicon.png +0 -0
  227. package/public/index.html +9 -4
  228. package/public/logos/hermes.png +0 -0
  229. package/public/logos/ollama.png +0 -0
  230. package/public/logos/openclaw.svg +60 -0
  231. package/scripts/build-hermes-image.sh +21 -0
  232. package/scripts/build-local.sh +54 -0
  233. package/scripts/check-adapter-isolation.ts +293 -0
  234. package/scripts/fixtures/instances/hermes-sample/instance.json +37 -0
  235. package/scripts/fixtures/instances/legacy-openclaw-sample/instance.json +7 -0
  236. package/scripts/smoke/hermes-bootstrap.sh +195 -0
  237. package/templates/hermes-entrypoint.sh +154 -0
  238. package/dist/doctor.js.map +0 -1
  239. package/install/jishu-install-china.sh +0 -3092
  240. package/public/assets/Dashboard-DhsrzJ4F.js +0 -1
  241. package/public/assets/InitPassword-BjubiVdd.js +0 -1
  242. package/public/assets/InstanceDetail-DMcywsof.js +0 -17
  243. package/public/assets/NewInstance-Bk0G4EiJ.js +0 -1
  244. package/public/assets/Settings-D5tHL_h5.js +0 -1
  245. package/public/assets/Setup-4t6E3Rut.js +0 -1
  246. package/public/assets/index-BJ47MWpF.css +0 -1
  247. package/public/assets/index-DbX85irc.js +0 -16
  248. package/public/assets/vendor-i18n-CfW0RvgE.js +0 -9
@@ -0,0 +1,193 @@
1
+ # syntax=docker/dockerfile:1.7
2
+
3
+ ARG BASE_IMAGE=node:22-bookworm-slim
4
+
5
+ FROM ${BASE_IMAGE} AS builder
6
+
7
+ ARG HERMES_REPO=https://github.com/NousResearch/hermes-agent.git
8
+ ARG HERMES_REF=main
9
+
10
+ ENV DEBIAN_FRONTEND=noninteractive \
11
+ PIP_DISABLE_PIP_VERSION_CHECK=1 \
12
+ PYTHONDONTWRITEBYTECODE=1 \
13
+ UV_LINK_MODE=copy
14
+
15
+ RUN apt-get update && apt-get install -y --no-install-recommends \
16
+ bash \
17
+ build-essential \
18
+ ca-certificates \
19
+ curl \
20
+ ffmpeg \
21
+ git \
22
+ pkg-config \
23
+ python3 \
24
+ python3-dev \
25
+ python3-venv \
26
+ ripgrep && \
27
+ rm -rf /var/lib/apt/lists/*
28
+
29
+ RUN curl -LsSf https://astral.sh/uv/install.sh | sh
30
+
31
+ ENV PATH=/root/.local/bin:${PATH}
32
+
33
+ WORKDIR /opt
34
+ RUN git clone --recurse-submodules "${HERMES_REPO}" hermes && \
35
+ cd /opt/hermes && \
36
+ git checkout "${HERMES_REF}" && \
37
+ git submodule update --init --recursive
38
+
39
+ #
40
+ # Skip the `tinker-atropos` submodule install. It brings in the RL
41
+ # training stack (transformers, datasets, wandb, gymnasium, polars,
42
+ # pyarrow, safetensors, …) — ~300 MB of deps used only by
43
+ # `tools/rl_training_tool.py` and `environments/*.py`, both of which
44
+ # are lazy-imported and only exercised during model training runs.
45
+ # JishuShell targets inference on edge devices (Pi / RK3588 / CIX), no
46
+ # RL training happens here, so we match the upstream
47
+ # `nousresearch/hermes-agent` image's choice to omit it.
48
+ #
49
+ WORKDIR /opt/hermes
50
+ RUN uv venv .venv --python 3.11 && \
51
+ uv pip install --python .venv/bin/python -e ".[all]"
52
+
53
+ #
54
+ # Small extras the upstream image bundles but `[all]` doesn't pull.
55
+ # Both are tiny (~0.3 MB each) so we match the upstream image rather
56
+ # than leave users `pip install`-ing them by hand.
57
+ # - apscheduler: cron-style scheduler used by the agent's job tools
58
+ # - qrcode + pypng: QR image generation using pure-Python PNG
59
+ # backend (avoids dragging Pillow in)
60
+ #
61
+ RUN uv pip install --python .venv/bin/python apscheduler qrcode pypng
62
+
63
+ #
64
+ # Three things happen here:
65
+ #
66
+ # 1. `npm install --omit=dev` vendors agent-browser + its transitive
67
+ # deps (playwright-core, better-sqlite3, impit, zod, lodash, …)
68
+ # into /opt/hermes/node_modules (~171 MB). This is what
69
+ # `hermes's browser_tool.py` resolves when it runs `npx
70
+ # agent-browser` — without pre-installing we'd pay a ~15 s npm
71
+ # download on the first browser_navigate call of every fresh
72
+ # container.
73
+ #
74
+ # 2. `playwright install chromium --only-shell` drops the headless
75
+ # Chromium renderer (~330 MB) under $PLAYWRIGHT_BROWSERS_PATH.
76
+ # agent-browser auto-discovers it via that env var, so we don't
77
+ # need an apt `chromium` in the final image — just the shared
78
+ # libs headless_shell links against (installed in the final
79
+ # stage). `--package=playwright` borrows the Playwright CLI
80
+ # without persisting its own node_modules.
81
+ #
82
+ # 3. The native web UI (`hermes web`, served on port 9119) is built
83
+ # and its build-time node_modules removed; only the ~8 MB dist
84
+ # bundle ships.
85
+ #
86
+ ENV PLAYWRIGHT_BROWSERS_PATH=/opt/hermes/.playwright
87
+ RUN if [ -f package.json ]; then \
88
+ npm install --omit=dev --prefer-offline --no-audit --no-fund ; \
89
+ fi && \
90
+ npx --yes --package=playwright playwright install chromium --only-shell && \
91
+ if [ -f web/package.json ]; then \
92
+ (cd web && npm install --prefer-offline --no-audit --no-fund && npm run build) && \
93
+ rm -rf web/node_modules ; \
94
+ fi && \
95
+ npm cache clean --force
96
+
97
+ RUN rm -rf /root/.cache /tmp/* .git .github website tests .pytest_cache .mypy_cache .ruff_cache && \
98
+ find /opt/hermes -type d -name "__pycache__" -prune -exec rm -rf {} + && \
99
+ find /opt/hermes -type f \( -name "*.pyc" -o -name "*.pyo" \) -delete
100
+
101
+ FROM ${BASE_IMAGE}
102
+
103
+ ENV DEBIAN_FRONTEND=noninteractive \
104
+ HERMES_HOME=/opt/data \
105
+ PATH=/opt/hermes/.venv/bin:${PATH} \
106
+ PIP_DISABLE_PIP_VERSION_CHECK=1 \
107
+ PLAYWRIGHT_BROWSERS_PATH=/opt/hermes/.playwright \
108
+ PYTHONDONTWRITEBYTECODE=1
109
+
110
+ #
111
+ # The headless Chromium binary itself rides in from the builder stage
112
+ # (see PLAYWRIGHT_BROWSERS_PATH above). What the final stage adds is:
113
+ #
114
+ # • Chromium runtime libs: the 17 .so dependencies headless_shell
115
+ # dynamically links against. Same set that
116
+ # `playwright install --with-deps chromium` would pull in on
117
+ # Debian 12 — explicit here so the diff is auditable.
118
+ # • curl: `hermes auth login` device-code OAuth flow + ad-hoc HTTP.
119
+ # • poppler-utils: pdftotext / pdfinfo back Hermes's PDF readers.
120
+ #
121
+ # Note: capability-specific Python packages (python-pptx, weasyprint,
122
+ # pillow, xlsxwriter, qrcode, dingtalk SDK, …) are NOT baked in —
123
+ # users `pip install --user` them on demand via the `terminal` tool.
124
+ # Same for `whatsapp-bridge`, which our panel's channel plugins don't
125
+ # rely on.
126
+ #
127
+ RUN apt-get update && apt-get install -y --no-install-recommends \
128
+ bash \
129
+ ca-certificates \
130
+ curl \
131
+ ffmpeg \
132
+ fonts-liberation \
133
+ git \
134
+ gosu \
135
+ libasound2 \
136
+ libatk1.0-0 \
137
+ libatk-bridge2.0-0 \
138
+ libatspi2.0-0 \
139
+ libcairo2 \
140
+ libcups2 \
141
+ libdbus-1-3 \
142
+ libdrm2 \
143
+ libgbm1 \
144
+ libnspr4 \
145
+ libnss3 \
146
+ libpango-1.0-0 \
147
+ libx11-6 \
148
+ libxcb1 \
149
+ libxcomposite1 \
150
+ libxdamage1 \
151
+ libxext6 \
152
+ libxfixes3 \
153
+ libxkbcommon0 \
154
+ libxrandr2 \
155
+ poppler-utils \
156
+ procps \
157
+ python3 \
158
+ python3-venv \
159
+ ripgrep && \
160
+ ln -sf /usr/bin/python3 /usr/local/bin/python && \
161
+ rm -rf /var/lib/apt/lists/*
162
+
163
+ RUN usermod -l hermes -d /home/hermes -m node && \
164
+ groupmod -n hermes node
165
+
166
+ COPY --chown=hermes:hermes --from=builder /opt/hermes /opt/hermes
167
+
168
+ WORKDIR /opt/hermes
169
+
170
+ RUN mkdir -p /opt/data && \
171
+ chown -R hermes:hermes /opt/data /home/hermes
172
+
173
+ # Bake the jishushell orchestration shim into the image. The panel used
174
+ # to bind-mount this from ~/.jishushell/runtimes/hermes/ but that coupled
175
+ # instance startup to a host file outside the instance dir. Baking it in
176
+ # keeps all runtime-critical assets inside the image, and the LABEL below
177
+ # lets the panel detect whether a pulled image actually has it.
178
+ COPY templates/hermes-entrypoint.sh /usr/local/bin/jishushell-hermes-entry.sh
179
+ RUN chmod 0755 /usr/local/bin/jishushell-hermes-entry.sh
180
+
181
+ # Advertise the protocol contract this image satisfies. The panel reads
182
+ # this label via `docker inspect` before launching an instance; a panel
183
+ # that only knows protocol version N refuses to start an image that
184
+ # declares N+1, which is how we gate rolling upgrades without silent
185
+ # behavioral drift.
186
+ LABEL runtime.protocol.version="1"
187
+
188
+ # Zombie reaping is handled by Nomad's `init: true` flag (docker-init
189
+ # becomes PID 1 regardless of this image's entrypoint — see the hermes
190
+ # adapter's docker Config). We deliberately leave ENTRYPOINT unset so
191
+ # anyone running this image directly with `docker run --init` gets the
192
+ # same guarantee without surprise.
193
+ CMD ["hermes", "--help"]
package/INSTALL-NOTICE CHANGED
@@ -32,16 +32,14 @@ software bundled with or installed by this product.
32
32
  https://github.com/abiosoft/colima/blob/main/LICENSE
33
33
  Author : Abiola Ibrahim
34
34
 
35
- Nomad v1.11.3+ (>= 1.7.0)
36
- URL : https://github.com/hashicorp/nomad
37
- License : Business Source License 1.1 (BSL 1.1)
38
- https://github.com/hashicorp/nomad/blob/main/LICENSE
39
- Licensor: International Business Machines Corporation (IBM)
40
- Work : Nomad Version 1.7.0 or later. (c) 2024 IBM Corp.
41
-
42
- You, as the operator deploying this software, are the end user of
43
- Nomad and are solely responsible for ensuring your use complies with
44
- the BSL 1.1 terms, including any restrictions on competitive or
45
- commercial use. For licensing details and FAQ, see:
46
- https://www.hashicorp.com/license-faq
35
+ Nomad v1.6.5 (last MPL 2.0 release in the 1.6.x line)
36
+ URL : https://github.com/hashicorp/nomad/tree/v1.6.5
37
+ License : Mozilla Public License 2.0
38
+ https://github.com/hashicorp/nomad/blob/v1.6.5/LICENSE
39
+ Author : HashiCorp, Inc.
40
+
41
+ JishuShell pins Nomad to v1.6.5, the final release in the 1.6.x series
42
+ distributed under MPL 2.0. Nomad 1.6.6 and later (including 1.7.0+) are
43
+ licensed under the Business Source License 1.1 (BSL 1.1) and are not
44
+ used by JishuShell.
47
45
 
@@ -0,0 +1,35 @@
1
+ id: hermes-container
2
+ name: Hermes Agent
3
+ version: "1.0.0"
4
+ jishushell:
5
+ min_version: "0.4.24"
6
+ agentType: hermes
7
+ description: "Hermes Agent 容器运行时,使用 apps 目录作为统一安装根"
8
+ singleInstance: false
9
+
10
+ tasks:
11
+ - name: gateway
12
+ role: service
13
+ runtime: container
14
+ image: "ghcr.io/x-aijishu/hermes-runtime:latest"
15
+ command: "/bin/bash"
16
+ args: ["/usr/local/bin/jishushell-hermes-entry.sh", "gateway", "run"]
17
+ env:
18
+ API_SERVER_ENABLED: "true"
19
+ API_SERVER_HOST: "0.0.0.0"
20
+ API_SERVER_PORT: "8642"
21
+ resources:
22
+ cpu: "1000m"
23
+ memory: "1024Mi"
24
+ ports:
25
+ - name: gateway
26
+ port: 8642
27
+ visibility: external
28
+ health:
29
+ http:
30
+ path: /health
31
+ port: 8642
32
+ interval: "15s"
33
+ timeout: "5s"
34
+ retries: 3
35
+ start_period: "30s"
@@ -0,0 +1,200 @@
1
+ id: ollama-binary
2
+ name: Ollama
3
+ version: "1.0.0"
4
+ jishushell:
5
+ min_version: "0.4.24"
6
+ description: "通过官方脚本,安装并运行Ollama"
7
+ singleInstance: true
8
+
9
+ tasks:
10
+ - name: gateway
11
+ role: service
12
+ runtime: process
13
+ command: /usr/local/bin/ollama
14
+ args: ["serve"]
15
+ env:
16
+ OLLAMA_HOST: "0.0.0.0:11434"
17
+ resources:
18
+ cpu: "2000m"
19
+ memory: "4096Mi"
20
+ ports:
21
+ - name: gateway
22
+ port: 11434
23
+ visibility: external
24
+ health:
25
+ http:
26
+ path: /api/version
27
+ port: 11434
28
+ interval: "15s"
29
+ timeout: "5s"
30
+ retries: 3
31
+ start_period: "30s"
32
+
33
+ provides:
34
+ - capability: "ollama-terminal"
35
+ protocol: "terminal"
36
+ description: "Ollama快速终端,可直接执行 ollama 命令"
37
+ terminal:
38
+ command: ["ollama"]
39
+ task: "gateway"
40
+ prompt: "ollama"
41
+ welcome: "输入 list / ps / pull / run 等命令开始;终端会自动补齐前缀 ollama。"
42
+ commands:
43
+ recommend:
44
+ - "pull qwen3.5:0.8b"
45
+ - "pull qwen3.6:35b"
46
+ - "pull gemma4:26b"
47
+ - "pull gemma4:e4b"
48
+ - "pull gemma4:e2b"
49
+ others:
50
+ - cmd: "show"
51
+ description: "Show information for a model"
52
+ - cmd: "stop"
53
+ description: "Stop a running model"
54
+ - cmd: "pull"
55
+ description: "Pull a model from a registry"
56
+ - cmd: "list"
57
+ description: "List models"
58
+ - cmd: "ps"
59
+ description: "List running models"
60
+ - cmd: "rm"
61
+ description: "Remove a model"
62
+ - cmd: "help"
63
+ description: "Help about any command"
64
+ - capability: "ollama-api"
65
+ port: 11434
66
+ description: "Ollama HTTP API,兼容 OpenAI /v1/chat/completions 端点"
67
+
68
+ lifecycle:
69
+ pre_install:
70
+ - run: >-
71
+ if ! command -v ollama >/dev/null 2>&1; then
72
+ echo "未检测到 ollama 命令,将通过官方脚本安装 Ollama..." >&2;
73
+ else
74
+ echo "检测到系统中已安装 ollama,跳过安装步骤,直接使用系统版本。" >&2;
75
+ fi;
76
+ install:
77
+ - run: >-
78
+ if ! command -v ollama >/dev/null 2>&1; then
79
+ echo "未检测到 ollama,开始安装..." >&2;
80
+ if [ "$(id -u)" -ne 0 ]; then
81
+ if ! command -v sudo >/dev/null 2>&1; then
82
+ echo "未检测到 sudo,当前环境无法自动安装 Ollama。请以 root 身份重试。" >&2;
83
+ exit 1;
84
+ fi;
85
+ if [ -n "${JISHUSHELL_SUDO_ASKPASS:-}" ]; then
86
+ sudo_probe_output="$(sudo -k -A true 2>&1)" || {
87
+ if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
88
+ echo "当前运行环境禁止 sudo 提权(no new privileges),无法自动安装 Ollama。请在系统终端手动安装,或调整容器/服务配置后重试。" >&2;
89
+ else
90
+ echo "提供的 sudo 密码无效,无法安装 Ollama。" >&2;
91
+ fi;
92
+ exit 1;
93
+ };
94
+ run_as_root() { sudo -A "$@"; };
95
+ else
96
+ sudo_probe_output="$(sudo -n true 2>&1)" || {
97
+ if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
98
+ echo "当前运行环境禁止 sudo 提权(no new privileges),无法自动安装 Ollama。请在系统终端手动安装,或调整容器/服务配置后重试。" >&2;
99
+ else
100
+ echo "安装 Ollama 需要 sudo 密码;请在页面弹窗中输入后重试。" >&2;
101
+ fi;
102
+ exit 1;
103
+ };
104
+ run_as_root() { sudo -n "$@"; };
105
+ fi;
106
+ else
107
+ run_as_root() { "$@"; };
108
+ fi;
109
+ for BINDIR in /usr/local/bin /usr/bin /bin; do
110
+ echo "$PATH" | grep -q "$BINDIR" && break || continue;
111
+ done;
112
+ OLLAMA_INSTALL_DIR="$(dirname "${BINDIR:-/usr/local/bin}")";
113
+ if [ -d "$OLLAMA_INSTALL_DIR/lib/ollama" ]; then
114
+ old_dir="$OLLAMA_INSTALL_DIR/lib/ollama.jishushell-old-$(date +%s)";
115
+ echo "检测到旧版 Ollama 目录,先移动到 $old_dir 以避免长时间卡在清理步骤..." >&2;
116
+ run_as_root mv "$OLLAMA_INSTALL_DIR/lib/ollama" "$old_dir";
117
+ ( run_as_root rm -rf "$old_dir" >/dev/null 2>&1 || true ) &
118
+ fi;
119
+ curl -fsSL https://ollama.com/install.sh | run_as_root sh;
120
+ else
121
+ echo "检测到系统中已安装 ollama,跳过二进制安装。" >&2;
122
+ fi
123
+ timeout_ms: 900000
124
+ successIfCommandExists: "ollama"
125
+ - run: >-
126
+ case "$(uname -s)" in
127
+ Linux)
128
+ if command -v systemctl >/dev/null 2>&1 && systemctl list-unit-files ollama.service >/dev/null 2>&1; then
129
+ echo "停止并禁用 ollama.service,后续交由 Nomad 管理..." >&2;
130
+ if [ "$(id -u)" -eq 0 ]; then
131
+ run_as_root() { "$@"; };
132
+ elif [ -n "${JISHUSHELL_SUDO_ASKPASS:-}" ]; then
133
+ sudo_probe_output="$(sudo -k -A true 2>&1)" || {
134
+ if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
135
+ echo "当前运行环境禁止 sudo 提权(no new privileges),无法清理 ollama.service。请在系统终端手动执行后重试。" >&2;
136
+ else
137
+ echo "提供的 sudo 密码无效,无法清理 ollama.service。" >&2;
138
+ fi;
139
+ exit 1;
140
+ };
141
+ run_as_root() { sudo -A "$@"; };
142
+ elif command -v sudo >/dev/null 2>&1; then
143
+ run_as_root() { sudo -n "$@"; };
144
+ else
145
+ run_as_root() { "$@"; };
146
+ fi;
147
+ run_as_root systemctl disable --now ollama;
148
+ else
149
+ echo "Linux 环境未检测到 ollama.service,跳过 systemd 清理。" >&2;
150
+ fi
151
+ ;;
152
+ Darwin)
153
+ echo "macOS 环境尝试关闭 Ollama 自启与正在运行的进程..." >&2;
154
+ if command -v launchctl >/dev/null 2>&1; then
155
+ launchctl bootout "gui/$(id -u)"/com.ollama.ollama 2>/dev/null || true;
156
+ launchctl disable "gui/$(id -u)/com.ollama.ollama" 2>/dev/null || true;
157
+ fi;
158
+ osascript -e 'tell application "Ollama" to quit' >/dev/null 2>&1 || true;
159
+ pkill -TERM -x ollama 2>/dev/null || true;
160
+ pkill -TERM -x Ollama 2>/dev/null || true
161
+ ;;
162
+ *)
163
+ echo "当前平台不支持自动清理 Ollama 自启,跳过。" >&2
164
+ ;;
165
+ esac
166
+
167
+ uninstall:
168
+ - run: >-
169
+ if [ "$(id -u)" -ne 0 ]; then
170
+ if ! command -v sudo >/dev/null 2>&1; then
171
+ echo "当前环境未检测到 sudo,无法卸载 Ollama。请以 root 身份重试。" >&2;
172
+ exit 1;
173
+ fi;
174
+ if [ -n "${JISHUSHELL_SUDO_ASKPASS:-}" ]; then
175
+ sudo_probe_output="$(sudo -k -A true 2>&1)" || {
176
+ if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
177
+ echo "当前运行环境禁止 sudo 提权(no new privileges),无法卸载 Ollama。请在系统终端手动执行,或调整容器/服务配置后重试。" >&2;
178
+ else
179
+ echo "提供的 sudo 密码无效,无法卸载 Ollama。" >&2;
180
+ fi;
181
+ exit 1;
182
+ };
183
+ run_as_root() { sudo -A "$@"; };
184
+ else
185
+ sudo_probe_output="$(sudo -n true 2>&1)" || {
186
+ if printf '%s\n' "$sudo_probe_output" | grep -qi "no new privileges"; then
187
+ echo "当前运行环境禁止 sudo 提权(no new privileges),无法卸载 Ollama。请在系统终端手动执行,或调整容器/服务配置后重试。" >&2;
188
+ else
189
+ echo "卸载 Ollama 需要 sudo 密码;请在页面弹窗中输入后重试。" >&2;
190
+ fi;
191
+ exit 1;
192
+ };
193
+ run_as_root() { sudo -n "$@"; };
194
+ fi;
195
+ else
196
+ run_as_root() { "$@"; };
197
+ fi;
198
+ run_as_root rm -f /usr/local/bin/ollama /usr/bin/ollama /bin/ollama;
199
+ run_as_root rm -rf /usr/local/lib/ollama /usr/lib/ollama /usr/share/ollama 2>/dev/null || true
200
+
@@ -0,0 +1,37 @@
1
+ id: ollama-cpu-docker
2
+ name: Ollama CPU(Docker)
3
+ version: "1.0.0"
4
+ jishushell:
5
+ min_version: "0.4.24"
6
+ description: "使用 alpine/ollama 镜像运行的纯 CPU 版 Ollama"
7
+ singleInstance: true
8
+
9
+ tasks:
10
+ - name: gateway
11
+ role: service
12
+ runtime: container
13
+ image: "alpine/ollama:latest"
14
+ env:
15
+ OLLAMA_HOST: "0.0.0.0:11434"
16
+ volumes:
17
+ - source: "~/.ollama"
18
+ target: "/root/.ollama"
19
+ resources:
20
+ cpu: "2000m"
21
+ memory: "4096Mi"
22
+ ports:
23
+ - name: gateway
24
+ port: 11434
25
+ health:
26
+ http:
27
+ path: /api/version
28
+ port: 11434
29
+ interval: "15s"
30
+ timeout: "5s"
31
+ retries: 3
32
+ start_period: "30s"
33
+
34
+ provides:
35
+ - capability: "ollama-api"
36
+ port: 11434
37
+ description: "Ollama HTTP API,兼容 OpenAI /v1/chat/completions 端点"