jishushell 0.4.17 → 0.4.24-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/Dockerfile.hermes-slim +193 -0
  2. package/apps/hermes-container.yaml +35 -0
  3. package/apps/ollama-binary.yaml +164 -0
  4. package/apps/ollama-cpu-container.yaml +37 -0
  5. package/apps/ollama-with-hollama-binary.yaml +159 -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 +770 -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 +2148 -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 +164 -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 -2
  193. package/package.json +14 -4
  194. package/public/assets/Dashboard-rh9qpYRR.js +1 -0
  195. package/public/assets/HermesChatPanel-D6JI6lLY.js +1 -0
  196. package/public/assets/HermesConfigForm-DcbSemaj.js +4 -0
  197. package/public/assets/InitPassword-CFTKsED4.js +1 -0
  198. package/public/assets/InstanceDetail-BhNIKA6Z.js +91 -0
  199. package/public/assets/{Login-D1Bt-Lyk.js → Login-KB9qrtM0.js} +1 -1
  200. package/public/assets/NewInstance-CxkO8Hlq.js +1 -0
  201. package/public/assets/Settings-BVWJvOkU.js +1 -0
  202. package/public/assets/Setup-X-lzuaUT.js +1 -0
  203. package/public/assets/WeixinLoginPanel-gca0QTic.js +9 -0
  204. package/public/assets/index-C8B0cFJM.js +19 -0
  205. package/public/assets/index-CPhVFEsx.css +1 -0
  206. package/public/assets/input-paste-CrNVAyOy.js +1 -0
  207. package/public/assets/registry-fVUSujib.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,37 @@
1
+ id: openclaw-container
2
+ name: OpenClaw Container
3
+ version: "1.0.0"
4
+ jishushell:
5
+ min_version: "0.4.24"
6
+ agentType: openclaw
7
+ description: "基于 openclaw-runtime 容器运行的 OpenClaw 网关"
8
+ singleInstance: false
9
+
10
+ tasks:
11
+ - name: gateway
12
+ role: service
13
+ runtime: container
14
+ image: "ghcr.io/x-aijishu/openclaw-runtime:latest"
15
+ args: ["gateway", "run", "--port", "18789", "--allow-unconfigured"]
16
+ env:
17
+ NODE_ENV: production
18
+ resources:
19
+ cpu: "1000m"
20
+ memory: "2024Mi"
21
+ ports:
22
+ - name: http
23
+ port: 18789
24
+ visibility: external
25
+ health:
26
+ http:
27
+ path: /health
28
+ port: 18789
29
+ interval: "15s"
30
+ timeout: "5s"
31
+ retries: 3
32
+ start_period: "30s"
33
+
34
+ provides:
35
+ - capability: "openclaw-dashboard"
36
+ port: 18789
37
+ description: "OpenClaw Dashboard"
@@ -0,0 +1,42 @@
1
+ id: openclaw-with-ollama-container
2
+ name: OpenClaw With Ollama
3
+ version: "1.0.0"
4
+ jishushell:
5
+ min_version: "0.4.24"
6
+ agentType: openclaw
7
+ description: "通过 requires 消费 ollama-api 能力,并将解析地址注入 OpenClaw 运行环境"
8
+ singleInstance: false
9
+
10
+ requires:
11
+ - capability: "ollama-api"
12
+ inject_as: OLLAMA_API_ADDR
13
+
14
+ tasks:
15
+ - name: gateway
16
+ role: service
17
+ runtime: container
18
+ image: "ghcr.io/x-aijishu/openclaw-runtime:latest"
19
+ args: ["gateway", "run", "--port", "18789", "--allow-unconfigured"]
20
+ env:
21
+ NODE_ENV: production
22
+ OLLAMA_BASE_URL: "http://${requires.OLLAMA_API_ADDR}"
23
+ resources:
24
+ cpu: "1000m"
25
+ memory: "1024Mi"
26
+ ports:
27
+ - name: http
28
+ port: 18789
29
+ visibility: external
30
+ health:
31
+ http:
32
+ path: /health
33
+ port: 18789
34
+ interval: "15s"
35
+ timeout: "5s"
36
+ retries: 3
37
+ start_period: "30s"
38
+
39
+ provides:
40
+ - capability: "openclaw-dashboard"
41
+ port: 18789
42
+ description: "OpenClaw Dashboard"
@@ -0,0 +1,136 @@
1
+ id: openclaw-with-searxng-container
2
+ name: OpenClaw With SearXNG Container
3
+ version: "1.0.0"
4
+ jishushell:
5
+ min_version: "0.4.24"
6
+ agentType: openclaw
7
+ description: "将 SearXNG 作为 sidecar 子 task 安装并运行,并注入 OpenClaw 搜索环境"
8
+ singleInstance: false
9
+
10
+ tasks:
11
+ - name: searxng
12
+ role: sidecar
13
+ runtime: container
14
+ image: "searxng/searxng:latest"
15
+ env:
16
+ SEARXNG_PORT: "8080"
17
+ SEARXNG_BASE_URL: "http://localhost:8080/"
18
+ FORCE_OWNERSHIP: "false"
19
+ resources:
20
+ cpu: "500m"
21
+ memory: "512Mi"
22
+ ports:
23
+ - name: http
24
+ port: 8080
25
+ visibility: internal
26
+ volumes:
27
+ - source: "~/.jishushell/apps/${app_id}/settings/settings.yml"
28
+ target: "/etc/searxng/settings.yml"
29
+ readonly: true
30
+ - source: "~/.jishushell/apps/${app_id}/settings/limiter.toml"
31
+ target: "/etc/searxng/limiter.toml"
32
+ readonly: true
33
+ health:
34
+ http:
35
+ path: /healthz
36
+ port: 8080
37
+ interval: "15s"
38
+ timeout: "5s"
39
+ retries: 3
40
+ start_period: "30s"
41
+
42
+ - name: gateway
43
+ role: service
44
+ runtime: container
45
+ image: "ghcr.io/x-aijishu/openclaw-runtime:latest"
46
+ args: ["gateway", "run", "--port", "18789", "--allow-unconfigured"]
47
+ env:
48
+ NODE_ENV: production
49
+ SEARCH_API_BASE_URL: "http://127.0.0.1:8080/search"
50
+ resources:
51
+ cpu: "1000m"
52
+ memory: "1024Mi"
53
+ ports:
54
+ - name: http
55
+ port: 18789
56
+ visibility: external
57
+ health:
58
+ http:
59
+ path: /health
60
+ port: 18789
61
+ interval: "15s"
62
+ timeout: "5s"
63
+ retries: 3
64
+ start_period: "30s"
65
+
66
+ provides:
67
+ - capability: "openclaw-dashboard"
68
+ port: 18789
69
+ description: "OpenClaw Dashboard"
70
+
71
+ lifecycle:
72
+ install:
73
+ - downloadImage: "searxng/searxng:latest"
74
+ - mkdir: "~/.jishushell/apps/${app_id}/settings"
75
+ - run: |
76
+ SETTINGS_DIR="$HOME/.jishushell/apps/${app_id}/settings"
77
+ SECRET_KEY="$(head -c 48 /dev/urandom | base64 | tr -dc 'A-Za-z0-9' | head -c 32)"
78
+
79
+ export SETTINGS_DIR SECRET_KEY
80
+ python3 <<'PY'
81
+ from pathlib import Path
82
+ import os
83
+ from textwrap import dedent
84
+
85
+ settings_dir = Path(os.environ["SETTINGS_DIR"])
86
+ secret = os.environ["SECRET_KEY"]
87
+
88
+ (settings_dir / "settings.yml").write_text(
89
+ dedent(
90
+ f'''
91
+ use_default_settings:
92
+ engines:
93
+ remove:
94
+ - ahmia
95
+ - torch
96
+ - wikidata
97
+ server:
98
+ secret_key: "{secret}"
99
+ port: 8080
100
+ bind_address: "0.0.0.0"
101
+ limiter: false
102
+ search:
103
+ formats:
104
+ - html
105
+ - json
106
+ '''
107
+ ).lstrip(),
108
+ encoding="utf-8",
109
+ )
110
+
111
+ (settings_dir / "limiter.toml").write_text(
112
+ dedent(
113
+ '''
114
+ [botdetection]
115
+ ipv4_prefix = 32
116
+ ipv6_prefix = 48
117
+ trusted_proxies = [
118
+ "127.0.0.0/8",
119
+ "::1",
120
+ ]
121
+
122
+ [botdetection.ip_limit]
123
+ filter_link_local = false
124
+ link_token = false
125
+
126
+ [botdetection.ip_lists]
127
+ block_ip = []
128
+ pass_ip = []
129
+ pass_searxng_org = true
130
+ '''
131
+ ).lstrip(),
132
+ encoding="utf-8",
133
+ )
134
+ PY
135
+
136
+ chmod 644 "$SETTINGS_DIR/settings.yml" "$SETTINGS_DIR/limiter.toml"
@@ -0,0 +1,53 @@
1
+ id: openwebui-container
2
+ name: Open WebUI
3
+ version: "1.0.0"
4
+ jishushell:
5
+ min_version: "0.4.24"
6
+ description: "使用 Open WebUI 提供自托管的大模型 Web 界面,容器模式由 Nomad 管理生命周期"
7
+ singleInstance: false
8
+
9
+ tasks:
10
+ - name: openwebui
11
+ role: service
12
+ runtime: container
13
+ image: "ghcr.io/open-webui/open-webui:main"
14
+ env:
15
+ HOME: "/app/backend/data"
16
+ PORT: "8080"
17
+ TMPDIR: "/app/backend/data/tmp"
18
+ XDG_CACHE_HOME: "/app/backend/data/.cache"
19
+ HF_HOME: "/app/backend/data/.cache/huggingface"
20
+ TRANSFORMERS_CACHE: "/app/backend/data/.cache/huggingface/transformers"
21
+ SENTENCE_TRANSFORMERS_HOME: "/app/backend/data/.cache/sentence-transformers"
22
+ resources:
23
+ cpu: "1000m"
24
+ memory: "1024Mi"
25
+ ports:
26
+ - name: http
27
+ port: 3000
28
+ container_port: 8080
29
+ visibility: external
30
+ volumes:
31
+ - source: "~/.jishushell/apps/${app_id}/data"
32
+ target: "/app/backend/data"
33
+ health:
34
+ http:
35
+ path: /
36
+ port: 8080
37
+ interval: "15s"
38
+ timeout: "5s"
39
+ retries: 6
40
+ start_period: "40s"
41
+
42
+ provides:
43
+ - capability: "openwebui-web"
44
+ port: 3000
45
+ protocol: "http"
46
+ description: "Open WebUI Web 界面"
47
+
48
+ lifecycle:
49
+ install:
50
+ - downloadImage: "ghcr.io/open-webui/open-webui:main"
51
+ - mkdir: "~/.jishushell/apps/${app_id}/data"
52
+ - mkdir: "~/.jishushell/apps/${app_id}/data/tmp"
53
+ - mkdir: "~/.jishushell/apps/${app_id}/data/.cache"
@@ -0,0 +1,120 @@
1
+ id: playwright-container
2
+ name: Playwright
3
+ version: "1.0.0"
4
+ jishushell:
5
+ min_version: "0.4.24"
6
+ description: "在容器中启动 Playwright UI,通过浏览器查看和管理测试运行"
7
+ singleInstance: false
8
+
9
+ tasks:
10
+ - name: playwright-ui
11
+ role: service
12
+ runtime: container
13
+ image: "mcr.microsoft.com/playwright:v1.55.0-noble"
14
+ env:
15
+ HOME: "/tmp/playwright-home"
16
+ NPM_CONFIG_CACHE: "/tmp/playwright-home/.npm"
17
+ command: /bin/sh
18
+ args:
19
+ - -lc
20
+ # 1. Stub xdg-open so playwright UI's auto-browser-open attempt doesn't
21
+ # throw "spawn xdg-open ENOENT" on a headless container (unhandled
22
+ # error kills the Node process before the UI server is reachable).
23
+ # 2. Invoke cli.js via `node` directly: `npx --no-install playwright`
24
+ # resolves to node_modules/.bin/playwright -> ../@playwright/test/cli.js,
25
+ # and a host-side `npm install --prefix` sometimes skips the +x bit
26
+ # on that target. Going through node sidesteps the exec-bit dance.
27
+ # 3. `--ui` makes the intent explicit; `--ui-host`/`--ui-port` alone
28
+ # leave behaviour at the mercy of playwright CLI detection.
29
+ - >-
30
+ ln -sf /bin/true /usr/local/bin/xdg-open 2>/dev/null;
31
+ cd /workspace &&
32
+ exec node ./node_modules/@playwright/test/cli.js test
33
+ --ui --ui-host=0.0.0.0 --ui-port=14567
34
+ resources:
35
+ cpu: "1000m"
36
+ memory: "1024Mi"
37
+ ports:
38
+ - name: http
39
+ port: 14567
40
+ visibility: external
41
+ volumes:
42
+ - source: "~/.jishushell/apps/${app_id}/workspace"
43
+ target: "/workspace"
44
+ health:
45
+ http:
46
+ path: /
47
+ port: 14567
48
+ interval: "15s"
49
+ timeout: "5s"
50
+ retries: 6
51
+ start_period: "30s"
52
+
53
+ provides:
54
+ - capability: "playwright-ui"
55
+ port: 14567
56
+ protocol: "http"
57
+ description: "Playwright UI Web 界面"
58
+
59
+ lifecycle:
60
+ install:
61
+ - downloadImage: "mcr.microsoft.com/playwright:v1.55.0-noble"
62
+ - mkdir: "~/.jishushell/apps/${app_id}/workspace"
63
+ - mkdir: "~/.jishushell/apps/${app_id}/workspace/tests"
64
+ - run: |
65
+ WORKSPACE="$HOME/.jishushell/apps/${app_id}/workspace"
66
+
67
+ if [ ! -f "$WORKSPACE/package.json" ]; then
68
+ cat > "$WORKSPACE/package.json" <<'EOF'
69
+ {
70
+ "name": "playwright-ui-workspace",
71
+ "private": true
72
+ }
73
+ EOF
74
+ fi
75
+
76
+ if [ ! -f "$WORKSPACE/playwright.config.ts" ]; then
77
+ cat > "$WORKSPACE/playwright.config.ts" <<'EOF'
78
+ import { defineConfig } from '@playwright/test';
79
+
80
+ export default defineConfig({
81
+ testDir: './tests',
82
+ use: {
83
+ headless: true,
84
+ },
85
+ });
86
+ EOF
87
+ fi
88
+
89
+ if [ ! -f "$WORKSPACE/tests/example.spec.ts" ]; then
90
+ cat > "$WORKSPACE/tests/example.spec.ts" <<'EOF'
91
+ import { test, expect } from '@playwright/test';
92
+
93
+ test('homepage smoke', async ({ page }) => {
94
+ await page.goto('https://example.com');
95
+ await expect(page).toHaveTitle(/Example Domain/);
96
+ });
97
+ EOF
98
+ fi
99
+ - run: |
100
+ WORKSPACE="$HOME/.jishushell/apps/${app_id}/workspace"
101
+ PLAYWRIGHT_HOME="/tmp/playwright-home"
102
+
103
+ if [ ! -d "$WORKSPACE/node_modules/@playwright/test" ]; then
104
+ mkdir -p "$PLAYWRIGHT_HOME"
105
+ export HOME="$PLAYWRIGHT_HOME"
106
+ export NPM_CONFIG_CACHE="$PLAYWRIGHT_HOME/.npm"
107
+ npm install --prefix "$WORKSPACE" @playwright/test
108
+ fi
109
+
110
+ # npm install --prefix on the host side occasionally leaves the
111
+ # playwright CLI targets without +x (the bin symlink exists, but
112
+ # kernel exec on the target file fails). Re-assert here so both
113
+ # `npx playwright` and the bin-direct path work.
114
+ for cli in \
115
+ "$WORKSPACE/node_modules/@playwright/test/cli.js" \
116
+ "$WORKSPACE/node_modules/playwright-core/cli.js" \
117
+ "$WORKSPACE/node_modules/playwright/cli.js"; do
118
+ [ -f "$cli" ] && chmod +x "$cli"
119
+ done
120
+ timeout_ms: 900000
@@ -0,0 +1,115 @@
1
+ id: searxng-container
2
+ name: SearXNG
3
+ version: "1.0.0"
4
+ jishushell:
5
+ min_version: "0.4.24"
6
+ description: "隐私优先的元搜索引擎,Docker 容器模式由 Nomad 管理生命周期"
7
+ singleInstance: false
8
+
9
+ tasks:
10
+ - name: searxng
11
+ role: service
12
+ runtime: container
13
+ image: "searxng/searxng:latest"
14
+ env:
15
+ SEARXNG_PORT: "8080"
16
+ SEARXNG_BASE_URL: "http://localhost:8080/"
17
+ FORCE_OWNERSHIP: "false"
18
+ resources:
19
+ cpu: "500m"
20
+ memory: "512Mi"
21
+ ports:
22
+ - name: http
23
+ port: 8080
24
+ visibility: external
25
+ volumes:
26
+ - source: "~/.jishushell/apps/${app_id}/settings/settings.yml"
27
+ target: "/etc/searxng/settings.yml"
28
+ readonly: true
29
+ - source: "~/.jishushell/apps/${app_id}/settings/limiter.toml"
30
+ target: "/etc/searxng/limiter.toml"
31
+ readonly: true
32
+ health:
33
+ http:
34
+ path: /healthz
35
+ port: 8080
36
+ interval: "15s"
37
+ timeout: "5s"
38
+ retries: 3
39
+ start_period: "30s"
40
+
41
+ provides:
42
+ - capability: "web-ui"
43
+ port: 8080
44
+ description: "SearXNG Web UI"
45
+ - capability: "search-api"
46
+ port: 8080
47
+ path: "/search"
48
+ description: "SearXNG 搜索 API,支持 JSON 格式 (/search?q=xxx&format=json)"
49
+
50
+ lifecycle:
51
+ install:
52
+ - downloadImage: "searxng/searxng:latest"
53
+ - mkdir: "~/.jishushell/apps/${app_id}/settings"
54
+ - run: |
55
+ SETTINGS_DIR="$HOME/.jishushell/apps/${app_id}/settings"
56
+ SECRET_KEY="$(head -c 48 /dev/urandom | base64 | tr -dc 'A-Za-z0-9' | head -c 32)"
57
+
58
+ export SETTINGS_DIR SECRET_KEY
59
+ python3 <<'PY'
60
+ from pathlib import Path
61
+ import os
62
+ from textwrap import dedent
63
+
64
+ settings_dir = Path(os.environ["SETTINGS_DIR"])
65
+ secret = os.environ["SECRET_KEY"]
66
+
67
+ (settings_dir / "settings.yml").write_text(
68
+ dedent(
69
+ f'''
70
+ use_default_settings:
71
+ engines:
72
+ remove:
73
+ - ahmia
74
+ - torch
75
+ - wikidata
76
+ server:
77
+ secret_key: "{secret}"
78
+ port: 8080
79
+ bind_address: "0.0.0.0"
80
+ limiter: false
81
+ search:
82
+ formats:
83
+ - html
84
+ - json
85
+ '''
86
+ ).lstrip(),
87
+ encoding="utf-8",
88
+ )
89
+
90
+ (settings_dir / "limiter.toml").write_text(
91
+ dedent(
92
+ '''
93
+ [botdetection]
94
+ ipv4_prefix = 32
95
+ ipv6_prefix = 48
96
+ trusted_proxies = [
97
+ "127.0.0.0/8",
98
+ "::1",
99
+ ]
100
+
101
+ [botdetection.ip_limit]
102
+ filter_link_local = false
103
+ link_token = false
104
+
105
+ [botdetection.ip_lists]
106
+ block_ip = []
107
+ pass_ip = []
108
+ pass_searxng_org = true
109
+ '''
110
+ ).lstrip(),
111
+ encoding="utf-8",
112
+ )
113
+ PY
114
+
115
+ chmod 644 "$SETTINGS_DIR/settings.yml" "$SETTINGS_DIR/limiter.toml"
package/dist/auth.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export declare function isInitialized(): boolean;
2
2
  export declare function initPassword(password: string): Promise<boolean>;
3
+ export declare function resetPassword(password: string): Promise<void>;
3
4
  export declare function verifyPassword(password: string): Promise<boolean>;
4
5
  export declare function changePassword(oldPassword: string, newPassword: string): Promise<boolean>;
5
6
  export declare function createToken(): string;
package/dist/auth.js CHANGED
@@ -8,6 +8,16 @@ let _authCache = null;
8
8
  // seeing isInitialized()=false and then racing to write the password file.
9
9
  let _initInProgress = false;
10
10
  function invalidateAuthCache() { _authCache = null; }
11
+ async function persistPassword(password) {
12
+ const hashed = await bcrypt.hash(password, 10);
13
+ let passwordVersion = Date.now();
14
+ const existing = readAuthData();
15
+ const previousVersion = existing?.password_version || 0;
16
+ if (passwordVersion <= previousVersion)
17
+ passwordVersion = previousVersion + 1;
18
+ writeAuthData({ password_hash: hashed, password_version: passwordVersion });
19
+ invalidateAuthCache();
20
+ }
11
21
  function readAuthData() {
12
22
  return safeReadSecretJson(AUTH_FILE, "auth");
13
23
  }
@@ -27,16 +37,16 @@ export async function initPassword(password) {
27
37
  // Double-check after the flag is set — in case two calls raced to the check above.
28
38
  if (readAuthData() !== null)
29
39
  return false;
30
- const hashed = await bcrypt.hash(password, 10);
31
- const version = Date.now();
32
- writeAuthData({ password_hash: hashed, password_version: version });
33
- invalidateAuthCache();
40
+ await persistPassword(password);
34
41
  return true;
35
42
  }
36
43
  finally {
37
44
  _initInProgress = false;
38
45
  }
39
46
  }
47
+ export async function resetPassword(password) {
48
+ await persistPassword(password);
49
+ }
40
50
  export async function verifyPassword(password) {
41
51
  const data = readAuthData();
42
52
  if (!data)
@@ -46,16 +56,7 @@ export async function verifyPassword(password) {
46
56
  export async function changePassword(oldPassword, newPassword) {
47
57
  if (!await verifyPassword(oldPassword))
48
58
  return false;
49
- const hashed = await bcrypt.hash(newPassword, 10);
50
- let currentVersion = Date.now();
51
- const data = readAuthData();
52
- if (data) {
53
- const prev = data.password_version || 0;
54
- if (currentVersion <= prev)
55
- currentVersion = prev + 1;
56
- }
57
- writeAuthData({ password_hash: hashed, password_version: currentVersion });
58
- invalidateAuthCache();
59
+ await persistPassword(newPassword);
59
60
  return true;
60
61
  }
61
62
  export function createToken() {
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/cli/app.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export declare function run(rest: string[]): Promise<void>;
2
+ export declare function dispatch(argv: string[]): Promise<boolean>;
2
3
  export declare function brief(): string;
3
4
  export declare function printHelp(): void;