jishushell 0.4.24-beta.2 → 0.4.30

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 (167) hide show
  1. package/INSTALL-NOTICE +11 -0
  2. package/apps/browserless-chromium-container.yaml +78 -0
  3. package/apps/hermes-container.yaml +36 -2
  4. package/apps/ollama-binary.yaml +45 -8
  5. package/apps/ollama-cpu-container.yaml +8 -1
  6. package/apps/ollama-with-hollama-binary.yaml +45 -8
  7. package/apps/openclaw-binary.yaml +30 -1
  8. package/apps/openclaw-container.yaml +37 -2
  9. package/apps/openclaw-with-ollama-container.yaml +11 -2
  10. package/apps/openclaw-with-searxng-container.yaml +22 -2
  11. package/apps/openwebui-container.yaml +45 -1
  12. package/apps/playwright-container.yaml +7 -1
  13. package/apps/searxng-container.yaml +54 -4
  14. package/dist/cli/app.js +12 -2
  15. package/dist/cli/app.js.map +1 -1
  16. package/dist/cli/doctor.d.ts +12 -12
  17. package/dist/cli/doctor.js +242 -55
  18. package/dist/cli/doctor.js.map +1 -1
  19. package/dist/cli/llm.d.ts +4 -3
  20. package/dist/cli/llm.js +4 -3
  21. package/dist/cli/llm.js.map +1 -1
  22. package/dist/cli/panel.d.ts +6 -5
  23. package/dist/cli/panel.js +10 -9
  24. package/dist/cli/panel.js.map +1 -1
  25. package/dist/control.d.ts +7 -6
  26. package/dist/control.js +7 -6
  27. package/dist/control.js.map +1 -1
  28. package/dist/routes/agent-apps.d.ts +1 -1
  29. package/dist/routes/agent-apps.js +1 -1
  30. package/dist/routes/apps.js +44 -11
  31. package/dist/routes/apps.js.map +1 -1
  32. package/dist/routes/auth.js +3 -0
  33. package/dist/routes/auth.js.map +1 -1
  34. package/dist/routes/instances.js +787 -16
  35. package/dist/routes/instances.js.map +1 -1
  36. package/dist/routes/llm.js +24 -35
  37. package/dist/routes/llm.js.map +1 -1
  38. package/dist/routes/setup.js +1 -1
  39. package/dist/routes/setup.js.map +1 -1
  40. package/dist/server.d.ts +9 -0
  41. package/dist/server.js +410 -17
  42. package/dist/server.js.map +1 -1
  43. package/dist/services/agent-apps/catalog.js +4 -3
  44. package/dist/services/agent-apps/catalog.js.map +1 -1
  45. package/dist/services/agent-apps/index.d.ts +1 -1
  46. package/dist/services/agent-apps/index.js +1 -1
  47. package/dist/services/agent-apps/installers/adapter.d.ts +1 -1
  48. package/dist/services/agent-apps/installers/adapter.js +1 -1
  49. package/dist/services/agent-apps/installers/shell-script.d.ts +1 -1
  50. package/dist/services/agent-apps/installers/shell-script.js +3 -3
  51. package/dist/services/agent-apps/installers/shell-script.js.map +1 -1
  52. package/dist/services/agent-apps/types.d.ts +2 -2
  53. package/dist/services/agent-apps/types.js +1 -1
  54. package/dist/services/app/app-manager.d.ts +24 -1
  55. package/dist/services/app/app-manager.js +490 -102
  56. package/dist/services/app/app-manager.js.map +1 -1
  57. package/dist/services/app/hermes-agent-manager.js +6 -4
  58. package/dist/services/app/hermes-agent-manager.js.map +1 -1
  59. package/dist/services/app/provide-resolver.d.ts +29 -0
  60. package/dist/services/app/provide-resolver.js +112 -0
  61. package/dist/services/app/provide-resolver.js.map +1 -0
  62. package/dist/services/capability-endpoint-validator.d.ts +41 -0
  63. package/dist/services/capability-endpoint-validator.js +104 -0
  64. package/dist/services/capability-endpoint-validator.js.map +1 -0
  65. package/dist/services/capability-health.d.ts +16 -0
  66. package/dist/services/capability-health.js +121 -0
  67. package/dist/services/capability-health.js.map +1 -0
  68. package/dist/services/capability-registry.d.ts +106 -0
  69. package/dist/services/capability-registry.js +313 -0
  70. package/dist/services/capability-registry.js.map +1 -0
  71. package/dist/services/connection-apply.d.ts +89 -0
  72. package/dist/services/connection-apply.js +421 -0
  73. package/dist/services/connection-apply.js.map +1 -0
  74. package/dist/services/connection-resolver.d.ts +65 -0
  75. package/dist/services/connection-resolver.js +281 -0
  76. package/dist/services/connection-resolver.js.map +1 -0
  77. package/dist/services/connection-transactor.d.ts +37 -0
  78. package/dist/services/connection-transactor.js +341 -0
  79. package/dist/services/connection-transactor.js.map +1 -0
  80. package/dist/services/instance-manager.d.ts +13 -0
  81. package/dist/services/instance-manager.js +137 -23
  82. package/dist/services/instance-manager.js.map +1 -1
  83. package/dist/services/llm-proxy/index.d.ts +16 -2
  84. package/dist/services/llm-proxy/index.js +48 -44
  85. package/dist/services/llm-proxy/index.js.map +1 -1
  86. package/dist/services/llm-proxy/probe.d.ts +6 -0
  87. package/dist/services/llm-proxy/probe.js +85 -0
  88. package/dist/services/llm-proxy/probe.js.map +1 -0
  89. package/dist/services/llm-proxy/ssrf.d.ts +1 -0
  90. package/dist/services/llm-proxy/ssrf.js +18 -7
  91. package/dist/services/llm-proxy/ssrf.js.map +1 -1
  92. package/dist/services/nomad-manager.js +375 -16
  93. package/dist/services/nomad-manager.js.map +1 -1
  94. package/dist/services/process-manager.js +1 -1
  95. package/dist/services/process-manager.js.map +1 -1
  96. package/dist/services/runtime/adapters/hermes.d.ts +30 -1
  97. package/dist/services/runtime/adapters/hermes.js +218 -5
  98. package/dist/services/runtime/adapters/hermes.js.map +1 -1
  99. package/dist/services/runtime/adapters/openclaw-mcporter.d.ts +45 -0
  100. package/dist/services/runtime/adapters/openclaw-mcporter.js +108 -0
  101. package/dist/services/runtime/adapters/openclaw-mcporter.js.map +1 -0
  102. package/dist/services/runtime/adapters/openclaw.d.ts +87 -0
  103. package/dist/services/runtime/adapters/openclaw.js +250 -2
  104. package/dist/services/runtime/adapters/openclaw.js.map +1 -1
  105. package/dist/services/runtime/mcp-shims/firewall.d.ts +26 -0
  106. package/dist/services/runtime/mcp-shims/firewall.js +129 -0
  107. package/dist/services/runtime/mcp-shims/firewall.js.map +1 -0
  108. package/dist/services/runtime/mcp-shims/searxng-shim.d.ts +27 -0
  109. package/dist/services/runtime/mcp-shims/searxng-shim.js +125 -0
  110. package/dist/services/runtime/mcp-shims/searxng-shim.js.map +1 -0
  111. package/dist/services/runtime/mcp-shims/write-mcp-entry.d.ts +83 -0
  112. package/dist/services/runtime/mcp-shims/write-mcp-entry.js +127 -0
  113. package/dist/services/runtime/mcp-shims/write-mcp-entry.js.map +1 -0
  114. package/dist/services/runtime/migrations.d.ts +8 -0
  115. package/dist/services/runtime/migrations.js +100 -0
  116. package/dist/services/runtime/migrations.js.map +1 -1
  117. package/dist/services/runtime/types.d.ts +15 -0
  118. package/dist/services/setup-manager.js +6 -6
  119. package/dist/services/setup-manager.js.map +1 -1
  120. package/dist/services/suggestions.d.ts +27 -0
  121. package/dist/services/suggestions.js +133 -0
  122. package/dist/services/suggestions.js.map +1 -0
  123. package/dist/services/task-registry.js +4 -2
  124. package/dist/services/task-registry.js.map +1 -1
  125. package/dist/services/telemetry/device-fingerprint.d.ts +1 -1
  126. package/dist/services/telemetry/device-fingerprint.js +1 -1
  127. package/dist/services/types-shim.d.ts +16 -0
  128. package/dist/services/types-shim.js +2 -0
  129. package/dist/services/types-shim.js.map +1 -0
  130. package/dist/types.d.ts +169 -1
  131. package/dist/utils/instance-lock.d.ts +22 -0
  132. package/dist/utils/instance-lock.js +48 -0
  133. package/dist/utils/instance-lock.js.map +1 -0
  134. package/dist/utils/safe-json.js +55 -22
  135. package/dist/utils/safe-json.js.map +1 -1
  136. package/install/jishu-install.sh +323 -26
  137. package/install/jishu-uninstall.sh +353 -20
  138. package/package.json +3 -1
  139. package/public/assets/Dashboard-rkWp-CXd.js +1 -0
  140. package/public/assets/{HermesChatPanel-D6JI6lLY.js → HermesChatPanel-_GHoklgo.js} +1 -1
  141. package/public/assets/HermesConfigForm-anDnwUp_.js +4 -0
  142. package/public/assets/{InitPassword-CFTKsED4.js → InitPassword-ZU9_-hDr.js} +1 -1
  143. package/public/assets/InstanceDetail-CN0FH1aw.js +92 -0
  144. package/public/assets/{Login-KB9qrtM0.js → Login-BItXqYAJ.js} +1 -1
  145. package/public/assets/NewInstance-BousE6kY.js +1 -0
  146. package/public/assets/ProviderRecommendations-DFYj7Fb6.js +1 -0
  147. package/public/assets/Settings-Bttc6QmM.js +1 -0
  148. package/public/assets/Setup-Bsxx1zgj.js +1 -0
  149. package/public/assets/{WeixinLoginPanel-gca0QTic.js → WeixinLoginPanel-DPZpAKgO.js} +2 -2
  150. package/public/assets/index-8xZy1z5k.css +1 -0
  151. package/public/assets/index-Dw3HhUYE.js +19 -0
  152. package/public/assets/providers-DtNXh9JD.js +1 -0
  153. package/public/assets/registry-5s2UB6is.js +2 -0
  154. package/public/index.html +2 -2
  155. package/scripts/check-app-spec.mjs +443 -0
  156. package/scripts/check-i18n.mjs +154 -0
  157. package/scripts/run.sh +4 -4
  158. package/public/assets/Dashboard-rh9qpYRR.js +0 -1
  159. package/public/assets/HermesConfigForm-DcbSemaj.js +0 -4
  160. package/public/assets/InstanceDetail-BhNIKA6Z.js +0 -91
  161. package/public/assets/NewInstance-CxkO8Hlq.js +0 -1
  162. package/public/assets/Settings-BVWJvOkU.js +0 -1
  163. package/public/assets/Setup-X-lzuaUT.js +0 -1
  164. package/public/assets/index-C8B0cFJM.js +0 -19
  165. package/public/assets/index-CPhVFEsx.css +0 -1
  166. package/public/assets/providers-V-vwrExZ.js +0 -1
  167. package/public/assets/registry-fVUSujib.js +0 -2
package/INSTALL-NOTICE CHANGED
@@ -20,6 +20,17 @@ software bundled with or installed by this product.
20
20
  with its respective license terms, including any restrictions on
21
21
  commercial use, competitive offerings, or redistribution.
22
22
 
23
+ Xcode Command Line Tools (build tools for macOS)
24
+ URL : https://www.apple.com/legal/sla/docs/xcode.pdf
25
+ License : Apple Xcode and Apple SDKs Agreement
26
+ Author : Apple Inc.
27
+
28
+ Homebrew (package manager for macOS)
29
+ URL : https://github.com/Homebrew/brew
30
+ License : BSD 2-Clause License
31
+ https://github.com/Homebrew/brew/blob/HEAD/LICENSE.txt
32
+ Author : Homebrew contributors
33
+
23
34
  Docker Engine
24
35
  URL : https://github.com/moby/moby
25
36
  License : Apache License, Version 2.0
@@ -0,0 +1,78 @@
1
+ id: browserless-chromium-container
2
+ name: Browserless Chromium
3
+ version: "1.0.0"
4
+ jishushell:
5
+ min_version: "0.4.30"
6
+ description: "运行 browserless/chromium 服务,提供可嵌入实例页的浏览器调试画面与自动化连接端点"
7
+ singleInstance: true
8
+
9
+ tasks:
10
+ - name: browserless
11
+ role: service
12
+ runtime: container
13
+ image: "ghcr.io/browserless/chromium:latest"
14
+ env:
15
+ HOST: "0.0.0.0"
16
+ PORT: "3000"
17
+ TOKEN: ""
18
+ CONCURRENT: "5"
19
+ QUEUED: "10"
20
+ TIMEOUT: "120000"
21
+ # 防反爬虫配置
22
+ DEFAULT_USER_AGENT: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
23
+ FUNCTION_ENABLE_INCOGNITO: "true"
24
+ NAVIGATION_TIMEOUT: "30000"
25
+ # 减少自动化检测特征
26
+ DEFAULT_LAUNCH_ARGS: "--disable-blink-features=AutomationControlled --disable-infobars --window-size=1920,1080 --start-maximized"
27
+ DEFAULT_HEADLESS: "new"
28
+ # 持久化用户数据(cookies/localStorage/session),登录后会话保持
29
+ DATA_DIR: "/tmp/browserless-data"
30
+ volumes:
31
+ - source: "~/.jishushell/apps/${app_id}/data"
32
+ target: "/tmp/browserless-data"
33
+ resources:
34
+ cpu: "1000m"
35
+ memory: "2048Mi"
36
+ ports:
37
+ - name: http
38
+ port: 3000
39
+ visibility: external
40
+ health:
41
+ http:
42
+ path: /docs
43
+ port: 3000
44
+ interval: "15s"
45
+ timeout: "5s"
46
+ retries: 6
47
+ start_period: "35s"
48
+
49
+ provides:
50
+ - capability: "browserless-debugger"
51
+ port: 3000
52
+ path: "/debugger/"
53
+ protocol: "http"
54
+ description: "Browserless Debug Viewer,可在实例页中嵌入浏览器画面"
55
+ - capability: "browserless-api"
56
+ port: 3000
57
+ path: "/"
58
+ protocol: "http"
59
+ description: "Browserless 根 API(供调试器页面连接 ws 与 sessions 接口)"
60
+ - capability: "browserless-docs"
61
+ port: 3000
62
+ path: "/docs/"
63
+ protocol: "http"
64
+ description: "Browserless API 文档页"
65
+ - capability: "browser-ws"
66
+ task: "browserless"
67
+ port: 3000
68
+ protocol: "ws"
69
+ description: "Browserless CDP/WebSocket 连接端点(ws://host:3000),用于 browser 类 require 自动绑定(命名遵循 <category>-<vendor> 约定)"
70
+
71
+ lifecycle:
72
+ install:
73
+ - downloadImage: "ghcr.io/browserless/chromium:latest"
74
+ - mkdir: "~/.jishushell/apps/${app_id}/data"
75
+ pre_start:
76
+ - mkdir: "~/.jishushell/apps/${app_id}/data"
77
+ uninstall:
78
+ - deleteImage: "ghcr.io/browserless/chromium:latest"
@@ -2,7 +2,7 @@ id: hermes-container
2
2
  name: Hermes Agent
3
3
  version: "1.0.0"
4
4
  jishushell:
5
- min_version: "0.4.24"
5
+ min_version: "0.4.30"
6
6
  agentType: hermes
7
7
  description: "Hermes Agent 容器运行时,使用 apps 目录作为统一安装根"
8
8
  singleInstance: false
@@ -32,4 +32,38 @@ tasks:
32
32
  interval: "15s"
33
33
  timeout: "5s"
34
34
  retries: 3
35
- start_period: "30s"
35
+ start_period: "30s"
36
+
37
+ provides:
38
+ - capability: "web-hermes"
39
+ task: "gateway"
40
+ port: 8642
41
+ protocol: "http"
42
+ description: "Hermes Agent Web UI"
43
+ - capability: "llm-agent"
44
+ task: "gateway"
45
+ port: 8642
46
+ protocol: "http"
47
+ path: "/v1"
48
+ auth:
49
+ kind: "bearer"
50
+ tokenSource: "instance.env.API_SERVER_KEY"
51
+ description: "OpenAI-compatible chat endpoint (verified on Pi: GET /v1/models returns hermes-agent model)"
52
+
53
+ requires:
54
+ - capability: "llm"
55
+ inject_as: "LLM_ENDPOINT"
56
+ required: false
57
+ cardinality: "one"
58
+ - capability: "search"
59
+ inject_as: "SEARCH_API_BASE_URL"
60
+ required: false
61
+ cardinality: "one"
62
+ - capability: "browser"
63
+ inject_as: "BROWSER_CDP_URL"
64
+ required: false
65
+ cardinality: "one"
66
+ - capability: "mcp"
67
+ inject_as: "MCP_SERVERS"
68
+ required: false
69
+ cardinality: "many"
@@ -2,7 +2,7 @@ id: ollama-binary
2
2
  name: Ollama
3
3
  version: "1.0.0"
4
4
  jishushell:
5
- min_version: "0.4.24"
5
+ min_version: "0.4.30"
6
6
  description: "通过官方脚本,安装并运行Ollama"
7
7
  singleInstance: true
8
8
 
@@ -62,8 +62,15 @@ provides:
62
62
  - cmd: "help"
63
63
  description: "Help about any command"
64
64
  - capability: "ollama-api"
65
+ task: "gateway"
65
66
  port: 11434
67
+ protocol: "http"
66
68
  description: "Ollama HTTP API,兼容 OpenAI /v1/chat/completions 端点"
69
+ - capability: "llm-ollama"
70
+ task: "gateway"
71
+ port: 11434
72
+ protocol: "http"
73
+ description: "Ollama OpenAI-compatible LLM endpoint (Connections 主推命名)"
67
74
 
68
75
  lifecycle:
69
76
  pre_install:
@@ -76,22 +83,29 @@ lifecycle:
76
83
  install:
77
84
  - run: >-
78
85
  install_marker="$HOME/.jishushell/apps/${app_id}/.ollama-install-needed";
79
- owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
86
+ owner_marker="$HOME/.jishushell/.ollama-installed-by-jishushell-${app_id}";
87
+ legacy_owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
88
+ system_install_marker="$HOME/.jishushell/.ollama-system-install-${app_id}";
80
89
  rm -f "$install_marker";
81
90
  if command -v ollama >/dev/null 2>&1; then
82
- if [ -f "$owner_marker" ]; then
91
+ if [ -f "$owner_marker" ] || [ -f "$legacy_owner_marker" ]; then
83
92
  echo "检测到由 JishuShell 安装的 ollama,复用现有二进制。" >&2;
93
+ rm -f "$system_install_marker";
84
94
  else
85
95
  echo "检测到系统中已安装 ollama,跳过二进制安装。" >&2;
96
+ rm -f "$owner_marker" "$legacy_owner_marker";
97
+ : > "$system_install_marker";
86
98
  fi;
87
99
  else
88
100
  echo "未检测到 ollama,开始安装..." >&2;
89
- rm -f "$owner_marker";
101
+ rm -f "$owner_marker" "$legacy_owner_marker" "$system_install_marker";
90
102
  : > "$install_marker";
91
103
  fi
92
104
  - run: >-
93
105
  install_marker="$HOME/.jishushell/apps/${app_id}/.ollama-install-needed";
94
- owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
106
+ owner_marker="$HOME/.jishushell/.ollama-installed-by-jishushell-${app_id}";
107
+ legacy_owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
108
+ system_install_marker="$HOME/.jishushell/.ollama-system-install-${app_id}";
95
109
  for BINDIR in /usr/local/bin /usr/bin /bin; do
96
110
  echo "$PATH" | grep -q "$BINDIR" && break || continue;
97
111
  done;
@@ -104,6 +118,8 @@ lifecycle:
104
118
  fi;
105
119
  curl -fsSL https://ollama.com/install.sh | sh;
106
120
  rm -f "$install_marker";
121
+ rm -f "$legacy_owner_marker";
122
+ rm -f "$system_install_marker";
107
123
  : > "$owner_marker"
108
124
  sudo: true
109
125
  ifFileExists: "~/.jishushell/apps/${app_id}/.ollama-install-needed"
@@ -111,10 +127,14 @@ lifecycle:
111
127
  successIfCommandExists: "ollama"
112
128
  - run: >-
113
129
  install_marker="$HOME/.jishushell/apps/${app_id}/.ollama-install-needed";
114
- owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
130
+ owner_marker="$HOME/.jishushell/.ollama-installed-by-jishushell-${app_id}";
131
+ legacy_owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
132
+ system_install_marker="$HOME/.jishushell/.ollama-system-install-${app_id}";
115
133
  if [ -f "$install_marker" ] && command -v ollama >/dev/null 2>&1; then
116
134
  echo "检测到 ollama 已可用,补记为由 JishuShell 安装。" >&2;
117
135
  rm -f "$install_marker";
136
+ rm -f "$legacy_owner_marker";
137
+ rm -f "$system_install_marker";
118
138
  : > "$owner_marker";
119
139
  fi
120
140
  ifFileExists: "~/.jishushell/apps/${app_id}/.ollama-install-needed"
@@ -156,9 +176,26 @@ lifecycle:
156
176
 
157
177
  uninstall:
158
178
  - run: >-
179
+ owner_marker="$HOME/.jishushell/.ollama-installed-by-jishushell-${app_id}";
180
+ legacy_owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
181
+ system_install_marker="$HOME/.jishushell/.ollama-system-install-${app_id}";
182
+ uninstall_marker="$HOME/.jishushell/.ollama-uninstall-needed-${app_id}";
183
+ rm -f "$uninstall_marker";
184
+ if [ -f "$system_install_marker" ]; then
185
+ echo "检测到复用的是系统已有 ollama,卸载时保留系统安装。" >&2;
186
+ rm -f "$system_install_marker";
187
+ elif [ -f "$owner_marker" ] || [ -f "$legacy_owner_marker" ]; then
188
+ : > "$uninstall_marker";
189
+ fi
190
+ - run: >-
191
+ owner_marker="$HOME/.jishushell/.ollama-installed-by-jishushell-${app_id}";
192
+ legacy_owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
193
+ system_install_marker="$HOME/.jishushell/.ollama-system-install-${app_id}";
194
+ uninstall_marker="$HOME/.jishushell/.ollama-uninstall-needed-${app_id}";
159
195
  rm -f /usr/local/bin/ollama /usr/bin/ollama /bin/ollama;
160
196
  rm -rf /usr/local/lib/ollama /usr/lib/ollama /usr/share/ollama 2>/dev/null || true;
161
- rm -f "$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell"
197
+ rm -rf /Applications/Ollama.app "$HOME/Applications/Ollama.app" 2>/dev/null || true;
198
+ rm -f "$owner_marker" "$legacy_owner_marker" "$system_install_marker" "$uninstall_marker"
162
199
  sudo: true
163
- ifFileExists: "~/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell"
200
+ ifFileExists: "~/.jishushell/.ollama-uninstall-needed-${app_id}"
164
201
 
@@ -2,7 +2,7 @@ id: ollama-cpu-docker
2
2
  name: Ollama CPU(Docker)
3
3
  version: "1.0.0"
4
4
  jishushell:
5
- min_version: "0.4.24"
5
+ min_version: "0.4.30"
6
6
  description: "使用 alpine/ollama 镜像运行的纯 CPU 版 Ollama"
7
7
  singleInstance: true
8
8
 
@@ -33,5 +33,12 @@ tasks:
33
33
 
34
34
  provides:
35
35
  - capability: "ollama-api"
36
+ task: "gateway"
36
37
  port: 11434
38
+ protocol: "http"
37
39
  description: "Ollama HTTP API,兼容 OpenAI /v1/chat/completions 端点"
40
+ - capability: "llm-ollama"
41
+ task: "gateway"
42
+ port: 11434
43
+ protocol: "http"
44
+ description: "Ollama OpenAI-compatible LLM endpoint (Connections 主推命名)"
@@ -2,7 +2,7 @@ id: ollama-with-hollama-binary
2
2
  name: Ollama
3
3
  version: "1.0.0"
4
4
  jishushell:
5
- min_version: "0.4.24"
5
+ min_version: "0.4.30"
6
6
  description: "通过官方脚本安装并运行 Ollama,同时提供 Hollama Web UI。"
7
7
  singleInstance: true
8
8
 
@@ -52,13 +52,20 @@ tasks:
52
52
 
53
53
  provides:
54
54
  - capability: "hollama-web"
55
+ task: "hollama"
55
56
  port: 4173
56
57
  protocol: "http"
57
58
  description: "Hollama Web 界面"
58
59
  - capability: "ollama-api"
60
+ task: "gateway"
59
61
  port: 11434
60
62
  protocol: "http"
61
63
  description: "Ollama HTTP API,兼容 OpenAI /v1/chat/completions 端点"
64
+ - capability: "llm-ollama"
65
+ task: "gateway"
66
+ port: 11434
67
+ protocol: "http"
68
+ description: "Ollama OpenAI-compatible LLM endpoint (Connections 主推命名)"
62
69
 
63
70
  lifecycle:
64
71
  pre_install:
@@ -72,22 +79,29 @@ lifecycle:
72
79
  - downloadImage: "ghcr.io/fmaclen/hollama:latest"
73
80
  - run: >-
74
81
  install_marker="$HOME/.jishushell/apps/${app_id}/.ollama-install-needed";
75
- owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
82
+ owner_marker="$HOME/.jishushell/.ollama-installed-by-jishushell-${app_id}";
83
+ legacy_owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
84
+ system_install_marker="$HOME/.jishushell/.ollama-system-install-${app_id}";
76
85
  rm -f "$install_marker";
77
86
  if command -v ollama >/dev/null 2>&1; then
78
- if [ -f "$owner_marker" ]; then
87
+ if [ -f "$owner_marker" ] || [ -f "$legacy_owner_marker" ]; then
79
88
  echo "检测到由 JishuShell 安装的 ollama,复用现有二进制。" >&2;
89
+ rm -f "$system_install_marker";
80
90
  else
81
91
  echo "检测到系统中已安装 ollama,跳过二进制安装。" >&2;
92
+ rm -f "$owner_marker" "$legacy_owner_marker";
93
+ : > "$system_install_marker";
82
94
  fi;
83
95
  else
84
96
  echo "未检测到 ollama,开始安装..." >&2;
85
- rm -f "$owner_marker";
97
+ rm -f "$owner_marker" "$legacy_owner_marker" "$system_install_marker";
86
98
  : > "$install_marker";
87
99
  fi
88
100
  - run: >-
89
101
  install_marker="$HOME/.jishushell/apps/${app_id}/.ollama-install-needed";
90
- owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
102
+ owner_marker="$HOME/.jishushell/.ollama-installed-by-jishushell-${app_id}";
103
+ legacy_owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
104
+ system_install_marker="$HOME/.jishushell/.ollama-system-install-${app_id}";
91
105
  for BINDIR in /usr/local/bin /usr/bin /bin; do
92
106
  echo "$PATH" | grep -q "$BINDIR" && break || continue;
93
107
  done;
@@ -100,6 +114,8 @@ lifecycle:
100
114
  fi;
101
115
  curl -fsSL https://ollama.com/install.sh | sh;
102
116
  rm -f "$install_marker";
117
+ rm -f "$legacy_owner_marker";
118
+ rm -f "$system_install_marker";
103
119
  : > "$owner_marker"
104
120
  sudo: true
105
121
  ifFileExists: "~/.jishushell/apps/${app_id}/.ollama-install-needed"
@@ -107,10 +123,14 @@ lifecycle:
107
123
  successIfCommandExists: "ollama"
108
124
  - run: >-
109
125
  install_marker="$HOME/.jishushell/apps/${app_id}/.ollama-install-needed";
110
- owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
126
+ owner_marker="$HOME/.jishushell/.ollama-installed-by-jishushell-${app_id}";
127
+ legacy_owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
128
+ system_install_marker="$HOME/.jishushell/.ollama-system-install-${app_id}";
111
129
  if [ -f "$install_marker" ] && command -v ollama >/dev/null 2>&1; then
112
130
  echo "检测到 ollama 已可用,补记为由 JishuShell 安装。" >&2;
113
131
  rm -f "$install_marker";
132
+ rm -f "$legacy_owner_marker";
133
+ rm -f "$system_install_marker";
114
134
  : > "$owner_marker";
115
135
  fi
116
136
  ifFileExists: "~/.jishushell/apps/${app_id}/.ollama-install-needed"
@@ -152,8 +172,25 @@ lifecycle:
152
172
 
153
173
  uninstall:
154
174
  - run: >-
175
+ owner_marker="$HOME/.jishushell/.ollama-installed-by-jishushell-${app_id}";
176
+ legacy_owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
177
+ system_install_marker="$HOME/.jishushell/.ollama-system-install-${app_id}";
178
+ uninstall_marker="$HOME/.jishushell/.ollama-uninstall-needed-${app_id}";
179
+ rm -f "$uninstall_marker";
180
+ if [ -f "$system_install_marker" ]; then
181
+ echo "检测到复用的是系统已有 ollama,卸载时保留系统安装。" >&2;
182
+ rm -f "$system_install_marker";
183
+ elif [ -f "$owner_marker" ] || [ -f "$legacy_owner_marker" ]; then
184
+ : > "$uninstall_marker";
185
+ fi
186
+ - run: >-
187
+ owner_marker="$HOME/.jishushell/.ollama-installed-by-jishushell-${app_id}";
188
+ legacy_owner_marker="$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell";
189
+ system_install_marker="$HOME/.jishushell/.ollama-system-install-${app_id}";
190
+ uninstall_marker="$HOME/.jishushell/.ollama-uninstall-needed-${app_id}";
155
191
  rm -f /usr/local/bin/ollama /usr/bin/ollama /bin/ollama;
156
192
  rm -rf /usr/local/lib/ollama /usr/lib/ollama /usr/share/ollama 2>/dev/null || true;
157
- rm -f "$HOME/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell"
193
+ rm -rf /Applications/Ollama.app "$HOME/Applications/Ollama.app" 2>/dev/null || true;
194
+ rm -f "$owner_marker" "$legacy_owner_marker" "$system_install_marker" "$uninstall_marker"
158
195
  sudo: true
159
- ifFileExists: "~/.jishushell/apps/${app_id}/.ollama-installed-by-jishushell"
196
+ ifFileExists: "~/.jishushell/.ollama-uninstall-needed-${app_id}"
@@ -2,7 +2,7 @@ id: openclaw-binary
2
2
  name: OpenClaw Binary
3
3
  version: "1.0.0"
4
4
  jishushell:
5
- min_version: "0.4.24"
5
+ min_version: "0.4.30"
6
6
  agentType: openclaw
7
7
  description: "将 OpenClaw 安装到应用目录内的 npm prefix,并以 process runtime 运行网关"
8
8
  singleInstance: false
@@ -33,8 +33,37 @@ tasks:
33
33
 
34
34
  provides:
35
35
  - capability: "openclaw-dashboard"
36
+ task: "gateway"
36
37
  port: 18789
38
+ protocol: "http"
37
39
  description: "OpenClaw Dashboard"
40
+ - capability: "llm-agent"
41
+ task: "gateway"
42
+ port: 18789
43
+ protocol: "http"
44
+ path: "/v1"
45
+ description: "OpenAI-compatible agent endpoint backed by OpenClaw"
46
+ auth:
47
+ kind: "bearer"
48
+ tokenSource: "instance.config.gateway.auth.token"
49
+
50
+ requires:
51
+ - capability: "llm"
52
+ inject_as: "LLM_ENDPOINT"
53
+ required: false
54
+ cardinality: "one"
55
+ - capability: "search"
56
+ inject_as: "SEARCH_API_BASE_URL"
57
+ required: false
58
+ cardinality: "one"
59
+ - capability: "browser"
60
+ inject_as: "BROWSER_CDP_URL"
61
+ required: false
62
+ cardinality: "one"
63
+ - capability: "mcp"
64
+ inject_as: "MCP_SERVERS"
65
+ required: false
66
+ cardinality: "many"
38
67
 
39
68
  lifecycle:
40
69
  install:
@@ -2,7 +2,7 @@ id: openclaw-container
2
2
  name: OpenClaw Container
3
3
  version: "1.0.0"
4
4
  jishushell:
5
- min_version: "0.4.24"
5
+ min_version: "0.4.30"
6
6
  agentType: openclaw
7
7
  description: "基于 openclaw-runtime 容器运行的 OpenClaw 网关"
8
8
  singleInstance: false
@@ -33,5 +33,40 @@ tasks:
33
33
 
34
34
  provides:
35
35
  - capability: "openclaw-dashboard"
36
+ task: "gateway"
36
37
  port: 18789
37
- description: "OpenClaw Dashboard"
38
+ protocol: "http"
39
+ description: "OpenClaw Dashboard"
40
+ # OpenClaw exposes OpenAI-compatible chat/completions when its config has
41
+ # `gateway.http.endpoints.chatCompletions.enabled = true`. The runtime
42
+ # adapter's startInstance hook patches openclaw.json on every start to
43
+ # ensure that flag is on, so any consumer binding this provider gets a
44
+ # working /v1/chat/completions endpoint regardless of when the instance
45
+ # was originally created. Auth uses the gateway token from openclaw.json.
46
+ - capability: "llm-agent"
47
+ task: "gateway"
48
+ port: 18789
49
+ protocol: "http"
50
+ path: "/v1"
51
+ description: "OpenAI-compatible agent endpoint backed by OpenClaw"
52
+ auth:
53
+ kind: "bearer"
54
+ tokenSource: "instance.config.gateway.auth.token"
55
+
56
+ requires:
57
+ - capability: "llm"
58
+ inject_as: "LLM_ENDPOINT"
59
+ required: false
60
+ cardinality: "one"
61
+ - capability: "search"
62
+ inject_as: "SEARCH_API_BASE_URL"
63
+ required: false
64
+ cardinality: "one"
65
+ - capability: "browser"
66
+ inject_as: "BROWSER_CDP_URL"
67
+ required: false
68
+ cardinality: "one"
69
+ - capability: "mcp"
70
+ inject_as: "MCP_SERVERS"
71
+ required: false
72
+ cardinality: "many"
@@ -2,7 +2,7 @@ id: openclaw-with-ollama-container
2
2
  name: OpenClaw With Ollama
3
3
  version: "1.0.0"
4
4
  jishushell:
5
- min_version: "0.4.24"
5
+ min_version: "0.4.30"
6
6
  agentType: openclaw
7
7
  description: "通过 requires 消费 ollama-api 能力,并将解析地址注入 OpenClaw 运行环境"
8
8
  singleInstance: false
@@ -39,4 +39,13 @@ tasks:
39
39
  provides:
40
40
  - capability: "openclaw-dashboard"
41
41
  port: 18789
42
- description: "OpenClaw Dashboard"
42
+ description: "OpenClaw Dashboard"
43
+ - capability: "llm-agent"
44
+ task: "gateway"
45
+ port: 18789
46
+ protocol: "http"
47
+ path: "/v1"
48
+ description: "OpenAI-compatible agent endpoint backed by OpenClaw"
49
+ auth:
50
+ kind: "bearer"
51
+ tokenSource: "instance.config.gateway.auth.token"
@@ -2,7 +2,7 @@ id: openclaw-with-searxng-container
2
2
  name: OpenClaw With SearXNG Container
3
3
  version: "1.0.0"
4
4
  jishushell:
5
- min_version: "0.4.24"
5
+ min_version: "0.4.30"
6
6
  agentType: openclaw
7
7
  description: "将 SearXNG 作为 sidecar 子 task 安装并运行,并注入 OpenClaw 搜索环境"
8
8
  singleInstance: false
@@ -46,7 +46,11 @@ tasks:
46
46
  args: ["gateway", "run", "--port", "18789", "--allow-unconfigured"]
47
47
  env:
48
48
  NODE_ENV: production
49
- SEARCH_API_BASE_URL: "http://127.0.0.1:8080/search"
49
+ # SEARCH_API_BASE_URL injected by Connection apply hook (search category, §13).
50
+ # Single-candidate fallback (`requires: search-searxng`) auto-binds the
51
+ # sidecar SearXNG below on first start, so meta-app UX stays "open the
52
+ # box and it works".
53
+ SEARCH_API_BASE_URL: "${requires.SEARCH_API_BASE_URL}"
50
54
  resources:
51
55
  cpu: "1000m"
52
56
  memory: "1024Mi"
@@ -65,8 +69,24 @@ tasks:
65
69
 
66
70
  provides:
67
71
  - capability: "openclaw-dashboard"
72
+ task: "gateway"
68
73
  port: 18789
74
+ protocol: "http"
69
75
  description: "OpenClaw Dashboard"
76
+ - capability: "llm-agent"
77
+ task: "gateway"
78
+ port: 18789
79
+ protocol: "http"
80
+ path: "/v1"
81
+ description: "OpenAI-compatible agent endpoint backed by OpenClaw"
82
+ auth:
83
+ kind: "bearer"
84
+ tokenSource: "instance.config.gateway.auth.token"
85
+
86
+ requires:
87
+ - capability: "search-searxng"
88
+ inject_as: "SEARCH_API_BASE_URL"
89
+ required: false
70
90
 
71
91
  lifecycle:
72
92
  install:
@@ -2,7 +2,7 @@ id: openwebui-container
2
2
  name: Open WebUI
3
3
  version: "1.0.0"
4
4
  jishushell:
5
- min_version: "0.4.24"
5
+ min_version: "0.4.30"
6
6
  description: "使用 Open WebUI 提供自托管的大模型 Web 界面,容器模式由 Nomad 管理生命周期"
7
7
  singleInstance: false
8
8
 
@@ -11,6 +11,11 @@ tasks:
11
11
  role: service
12
12
  runtime: container
13
13
  image: "ghcr.io/open-webui/open-webui:main"
14
+ # Run as the panel user's uid:gid (typically pi=1000:1000). Bind-mount
15
+ # source `~/.jishushell/apps/${app_id}/data` is owned by the panel user,
16
+ # so the container can read/write it directly — no chown, no
17
+ # CAP_DAC_OVERRIDE, no DB readonly errors. Mirrors hermes / openclaw.
18
+ user: "host"
14
19
  env:
15
20
  HOME: "/app/backend/data"
16
21
  PORT: "8080"
@@ -19,6 +24,32 @@ tasks:
19
24
  HF_HOME: "/app/backend/data/.cache/huggingface"
20
25
  TRANSFORMERS_CACHE: "/app/backend/data/.cache/huggingface/transformers"
21
26
  SENTENCE_TRANSFORMERS_HOME: "/app/backend/data/.cache/sentence-transformers"
27
+ # OpenWebUI's start.sh writes a generated WEBUI_SECRET_KEY to a key
28
+ # file. The default path is `.webui_secret_key` in the image's
29
+ # /app/backend WORKDIR, which is owned by root and unwritable when
30
+ # running as uid 1000. Redirect to the bind-mounted (and writable)
31
+ # data dir so the key persists across restarts and survives image
32
+ # upgrades.
33
+ WEBUI_SECRET_KEY_FILE: "/app/backend/data/.webui_secret_key"
34
+ # Open WebUI marks OPENAI_API_BASE_URL / OPENAI_API_KEY as PersistentConfig:
35
+ # without this flag, the first start writes them to the internal DB and
36
+ # subsequent restarts ignore env, defeating Connections "Save & Restart"
37
+ # rebinds. Disabling persistent config means the Admin UI's manual
38
+ # OpenAI config doesn't survive restarts — that's the trade-off
39
+ # JishuShell takes to own LLM configuration via Connections (§13.3.2.1).
40
+ ENABLE_PERSISTENT_CONFIG: "False"
41
+ # JishuShell ships Open WebUI as a chat front-end only — RAG /
42
+ # reranker / Whisper STT all need ML model downloads from
43
+ # HuggingFace at first boot (~500 MB – 1.5 GB). On slow outbound
44
+ # networks (Raspberry Pi behind throttled NAT) this blocks
45
+ # health checks for hours. Bypassing them keeps the boot path
46
+ # to "FastAPI up in <30s". Users who want RAG/STT can flip these
47
+ # back from Admin UI and accept the one-time download.
48
+ BYPASS_EMBEDDING_AND_RETRIEVAL: "True"
49
+ RAG_EMBEDDING_MODEL: ""
50
+ RAG_RERANKING_MODEL: ""
51
+ WHISPER_MODEL: ""
52
+ AUDIO_STT_ENGINE: ""
22
53
  resources:
23
54
  cpu: "1000m"
24
55
  memory: "1024Mi"
@@ -41,10 +72,23 @@ tasks:
41
72
 
42
73
  provides:
43
74
  - capability: "openwebui-web"
75
+ task: "openwebui"
76
+ port: 3000
77
+ protocol: "http"
78
+ description: "Open WebUI Web 界面(legacy capability,请改用 web-openwebui)"
79
+ - capability: "web-openwebui"
80
+ task: "openwebui"
44
81
  port: 3000
45
82
  protocol: "http"
46
83
  description: "Open WebUI Web 界面"
47
84
 
85
+ requires:
86
+ - capability: "llm"
87
+ inject_as: "OPENAI_API_BASE_URL"
88
+ apply: "openai-env"
89
+ cardinality: "one"
90
+ required: false
91
+
48
92
  lifecycle:
49
93
  install:
50
94
  - downloadImage: "ghcr.io/open-webui/open-webui:main"
@@ -2,7 +2,7 @@ id: playwright-container
2
2
  name: Playwright
3
3
  version: "1.0.0"
4
4
  jishushell:
5
- min_version: "0.4.24"
5
+ min_version: "0.4.30"
6
6
  description: "在容器中启动 Playwright UI,通过浏览器查看和管理测试运行"
7
7
  singleInstance: false
8
8
 
@@ -52,9 +52,15 @@ tasks:
52
52
 
53
53
  provides:
54
54
  - capability: "playwright-ui"
55
+ task: "playwright-ui"
55
56
  port: 14567
56
57
  protocol: "http"
57
58
  description: "Playwright UI Web 界面"
59
+ # browser-playwright (CDP endpoint) is TODO — needs a sidecar task that runs
60
+ # `npx playwright launch-server --browser chromium --hostname 0.0.0.0`,
61
+ # captures the token-bearing ws URL into a file/env, and registers it as a
62
+ # capability with protocol=ws. Until the sidecar lands, OpenClaw / Hermes
63
+ # browser slots cannot bind to this app via the Connections UI.
58
64
 
59
65
  lifecycle:
60
66
  install: