jishushell 0.4.10 → 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 (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 +164 -0
  5. package/apps/ollama-cpu-container.yaml +37 -0
  6. package/apps/ollama-with-hollama-binary.yaml +159 -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 +874 -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 +2148 -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 +224 -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 -38
  206. package/install/post-install.sh +64 -5
  207. package/package.json +19 -5
  208. package/public/assets/Dashboard-rh9qpYRR.js +1 -0
  209. package/public/assets/HermesChatPanel-D6JI6lLY.js +1 -0
  210. package/public/assets/HermesConfigForm-DcbSemaj.js +4 -0
  211. package/public/assets/InitPassword-CFTKsED4.js +1 -0
  212. package/public/assets/InstanceDetail-BhNIKA6Z.js +91 -0
  213. package/public/assets/{Login-CUoEZOWR.js → Login-KB9qrtM0.js} +1 -1
  214. package/public/assets/NewInstance-CxkO8Hlq.js +1 -0
  215. package/public/assets/Settings-BVWJvOkU.js +1 -0
  216. package/public/assets/Setup-X-lzuaUT.js +1 -0
  217. package/public/assets/WeixinLoginPanel-gca0QTic.js +9 -0
  218. package/public/assets/index-C8B0cFJM.js +19 -0
  219. package/public/assets/index-CPhVFEsx.css +1 -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-fVUSujib.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,183 @@
1
+ /**
2
+ * OCI / Docker Registry v2 digest lookups via curl.
3
+ *
4
+ * We shell out to curl instead of using Node's built-in `fetch` because:
5
+ * - Node's fetch (undici) ships a 10 s TCP connect timeout that isn't
6
+ * configurable without pulling undici in as a direct dep, and the TLS
7
+ * handshake to ghcr.io from edge devices on slow international links
8
+ * routinely exceeds that (9–15 s measured from a Pi in mainland China).
9
+ * - curl's `--max-time` is wall-clock and reliable.
10
+ * - curl is already present on every target platform.
11
+ *
12
+ * The call chain implements the standard OCI distribution bearer-token flow:
13
+ * 1. GET <realm>?service=...&scope=... → bearer token
14
+ * 2. HEAD /v2/<repository>/manifests/<reference> → docker-content-digest
15
+ *
16
+ * Well-known public registries (GHCR, Docker Hub, Quay) always require a
17
+ * token, so we skip the throwaway unauthenticated probe for them — that
18
+ * alone saves ~10 s per image on slow WAN links.
19
+ */
20
+ import { execFile } from "child_process";
21
+ import { promisify } from "util";
22
+ const execFileAsync = promisify(execFile);
23
+ const KNOWN_BEARER_REGISTRIES = new Set([
24
+ "ghcr.io",
25
+ "registry-1.docker.io",
26
+ "docker.io",
27
+ "quay.io",
28
+ ]);
29
+ /** Accept header covering all manifest / index media types. */
30
+ const MANIFEST_ACCEPT = [
31
+ "application/vnd.oci.image.index.v1+json",
32
+ "application/vnd.oci.image.manifest.v1+json",
33
+ "application/vnd.docker.distribution.manifest.list.v2+json",
34
+ "application/vnd.docker.distribution.manifest.v2+json",
35
+ ].join(", ");
36
+ /**
37
+ * Parse a docker image reference into `{ registry, repository, reference }`.
38
+ * Handles: "ghcr.io/owner/name:tag", "owner/name:tag" (defaults to Docker
39
+ * Hub), "name" (defaults to "library/<name>:latest"). Returns null for
40
+ * digest-pinned refs (no lookup is needed) or malformed strings.
41
+ */
42
+ export function parseImageRef(image) {
43
+ if (image.includes("@"))
44
+ return null;
45
+ const trimmed = image.trim();
46
+ if (!trimmed)
47
+ return null;
48
+ const firstSlash = trimmed.indexOf("/");
49
+ const firstSegment = firstSlash === -1 ? "" : trimmed.slice(0, firstSlash);
50
+ const hasRegistry = firstSegment.includes(".") ||
51
+ firstSegment.includes(":") ||
52
+ firstSegment === "localhost";
53
+ let registry;
54
+ let rest;
55
+ if (hasRegistry) {
56
+ registry = firstSegment;
57
+ rest = trimmed.slice(firstSlash + 1);
58
+ }
59
+ else {
60
+ registry = "registry-1.docker.io";
61
+ rest = trimmed.includes("/") ? trimmed : `library/${trimmed}`;
62
+ }
63
+ const colon = rest.lastIndexOf(":");
64
+ let repository;
65
+ let reference;
66
+ if (colon === -1 || rest.indexOf("/", colon) !== -1) {
67
+ repository = rest;
68
+ reference = "latest";
69
+ }
70
+ else {
71
+ repository = rest.slice(0, colon);
72
+ reference = rest.slice(colon + 1);
73
+ }
74
+ if (!/^[a-z0-9][a-z0-9._\-/]{0,254}$/.test(repository))
75
+ return null;
76
+ if (!/^[A-Za-z0-9._\-]{1,128}$/.test(reference))
77
+ return null;
78
+ return { registry, repository, reference };
79
+ }
80
+ /**
81
+ * Fetch the current remote digest (sha256 hex, without the "sha256:" prefix)
82
+ * for a fully-resolved image reference. Returns null when the registry is
83
+ * unreachable, the image is private without an auth token we can obtain, or
84
+ * any other probe failure.
85
+ */
86
+ export async function fetchRemoteDigest(ref) {
87
+ const manifestUrl = `https://${ref.registry}/v2/${ref.repository}/manifests/${ref.reference}`;
88
+ if (KNOWN_BEARER_REGISTRIES.has(ref.registry)) {
89
+ const token = await fetchBearerToken(`https://${ref.registry}/token`, ref.registry, `repository:${ref.repository}:pull`);
90
+ if (!token)
91
+ return null;
92
+ return headDigestWithAuth(manifestUrl, token);
93
+ }
94
+ // Unknown registry: try unauthenticated first, then follow the challenge.
95
+ const unauth = await curlHead(manifestUrl, { Accept: MANIFEST_ACCEPT });
96
+ if (unauth.ok) {
97
+ const d = extractDigest(unauth.headers);
98
+ if (d)
99
+ return d;
100
+ }
101
+ const challenge = unauth.headers["www-authenticate"] || "";
102
+ const parsed = parseBearerChallenge(challenge);
103
+ if (!parsed)
104
+ return null;
105
+ const token = await fetchBearerToken(parsed.realm, parsed.service || "", parsed.scope || `repository:${ref.repository}:pull`);
106
+ if (!token)
107
+ return null;
108
+ return headDigestWithAuth(manifestUrl, token);
109
+ }
110
+ async function headDigestWithAuth(manifestUrl, token) {
111
+ const resp = await curlHead(manifestUrl, {
112
+ Accept: MANIFEST_ACCEPT,
113
+ Authorization: `Bearer ${token}`,
114
+ });
115
+ return resp.ok ? extractDigest(resp.headers) : null;
116
+ }
117
+ async function fetchBearerToken(realm, service, scope) {
118
+ const url = new URL(realm);
119
+ url.searchParams.set("service", service);
120
+ url.searchParams.set("scope", scope);
121
+ try {
122
+ const { stdout } = await execFileAsync("curl", [
123
+ "--silent", "--fail-with-body", "--show-error",
124
+ "--max-time", "20",
125
+ url.toString(),
126
+ ], { timeout: 25_000, encoding: "utf-8" });
127
+ const body = JSON.parse(stdout);
128
+ return body.token || body.access_token || null;
129
+ }
130
+ catch {
131
+ return null;
132
+ }
133
+ }
134
+ async function curlHead(url, headers) {
135
+ const args = [
136
+ "--silent", "--show-error", "--head",
137
+ "--max-time", "20",
138
+ "--write-out", "\n__STATUS__%{http_code}\n",
139
+ ];
140
+ for (const [k, v] of Object.entries(headers)) {
141
+ args.push("-H", `${k}: ${v}`);
142
+ }
143
+ args.push(url);
144
+ try {
145
+ const { stdout } = await execFileAsync("curl", args, {
146
+ timeout: 25_000,
147
+ encoding: "utf-8",
148
+ maxBuffer: 1 * 1024 * 1024,
149
+ });
150
+ const statusMatch = stdout.match(/__STATUS__(\d{3})/);
151
+ const statusCode = statusMatch ? parseInt(statusMatch[1], 10) : 0;
152
+ const parsed = {};
153
+ for (const raw of stdout.split(/\r?\n/)) {
154
+ if (!raw || raw.startsWith("HTTP/") || raw.startsWith("__STATUS__"))
155
+ continue;
156
+ const idx = raw.indexOf(":");
157
+ if (idx > 0) {
158
+ parsed[raw.slice(0, idx).trim().toLowerCase()] = raw.slice(idx + 1).trim();
159
+ }
160
+ }
161
+ return { ok: statusCode >= 200 && statusCode < 400, statusCode, headers: parsed };
162
+ }
163
+ catch {
164
+ return { ok: false, statusCode: 0, headers: {} };
165
+ }
166
+ }
167
+ function extractDigest(headers) {
168
+ const m = headers["docker-content-digest"]?.match(/^sha256:([a-f0-9]{64})$/);
169
+ return m ? m[1] : null;
170
+ }
171
+ function parseBearerChallenge(header) {
172
+ if (!/^\s*Bearer\b/i.test(header))
173
+ return null;
174
+ const realm = /realm="([^"]+)"/i.exec(header)?.[1];
175
+ if (!realm)
176
+ return null;
177
+ return {
178
+ realm,
179
+ service: /service="([^"]+)"/i.exec(header)?.[1],
180
+ scope: /scope="([^"]+)"/i.exec(header)?.[1],
181
+ };
182
+ }
183
+ //# sourceMappingURL=registry-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-probe.js","sourceRoot":"","sources":["../../../../src/services/agent-apps/installers/registry-probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Installer strategy for shell-script-driven agent apps (Ollama and any other
3
+ * system tool shipped as a `curl | bash` installer).
4
+ *
5
+ * Responsibilities:
6
+ * - probe installed version + binary size via `probeCommand`
7
+ * - probe update availability via GitHub Releases (when `githubRepo` set)
8
+ * - install: fetch script → optional sha256 verify → `sudo -n bash`
9
+ * - uninstall: stop+disable systemd unit + rm binary + rm extraCleanup
10
+ *
11
+ * Heavy ops stream progress through the shared task-registry so the UI
12
+ * picks them up via `/api/setup/tasks/:id`, identical to adapter installs.
13
+ */
14
+ import type { AgentAppSource, InstallStartResult } from "../types.js";
15
+ type ShellScriptSource = Extract<AgentAppSource, {
16
+ kind: "shell-script";
17
+ }>;
18
+ export declare function probeShellScriptStatus(source: ShellScriptSource): Promise<{
19
+ installed: boolean;
20
+ version?: string;
21
+ } | null>;
22
+ export declare function probeShellScriptSizeMB(source: ShellScriptSource): Promise<number | null>;
23
+ /**
24
+ * Read-only cache lookup used by `buildCardView`. Returns null (UI stays
25
+ * neutral) until the user clicks "检查更新" at least once, which kicks off
26
+ * the network probe via `refreshShellScriptUpdateCache`.
27
+ *
28
+ * Intentionally NOT falling back to an on-demand probe here — the catalog
29
+ * endpoint is polled every 5 s and the GitHub Releases API is slow + rate-
30
+ * limited. See docs/agent-apps-design.md "update checks only on explicit
31
+ * click".
32
+ */
33
+ export declare function readShellScriptUpdateAvailable(appId: string): boolean | null;
34
+ export declare function getShellScriptUpdateCacheLastCheckedAt(): number | null;
35
+ /**
36
+ * Compare installed version vs GitHub Releases latest tag. Writes the
37
+ * result to the cache and returns it. Called by `checkAllAgentAppUpdates`;
38
+ * not called from the catalog hot path.
39
+ */
40
+ export declare function refreshShellScriptUpdateCache(appId: string, source: ShellScriptSource): Promise<boolean | null>;
41
+ export declare function findRunningShellScriptTask(appId: string): {
42
+ id: string;
43
+ kind: "install" | "uninstall";
44
+ } | undefined;
45
+ export declare function startShellScriptInstall(appId: string, source: ShellScriptSource): Promise<InstallStartResult>;
46
+ export declare function startShellScriptUninstall(appId: string, source: ShellScriptSource): Promise<InstallStartResult>;
47
+ export {};