jishushell 0.4.17 → 0.4.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/Dockerfile.hermes-slim +193 -0
  2. package/apps/hermes-container.yaml +35 -0
  3. package/apps/ollama-binary.yaml +200 -0
  4. package/apps/ollama-cpu-container.yaml +37 -0
  5. package/apps/ollama-with-hollama-binary.yaml +195 -0
  6. package/apps/openclaw-binary.yaml +69 -0
  7. package/apps/openclaw-container.yaml +37 -0
  8. package/apps/openclaw-with-ollama-container.yaml +42 -0
  9. package/apps/openclaw-with-searxng-container.yaml +136 -0
  10. package/apps/openwebui-container.yaml +53 -0
  11. package/apps/playwright-container.yaml +120 -0
  12. package/apps/searxng-container.yaml +115 -0
  13. package/dist/auth.d.ts +1 -0
  14. package/dist/auth.js +15 -14
  15. package/dist/auth.js.map +1 -1
  16. package/dist/cli/app.d.ts +1 -0
  17. package/dist/cli/app.js +710 -52
  18. package/dist/cli/app.js.map +1 -1
  19. package/dist/cli/backup.d.ts +3 -0
  20. package/dist/cli/backup.js +434 -0
  21. package/dist/cli/backup.js.map +1 -0
  22. package/dist/cli/doctor.d.ts +1 -0
  23. package/dist/cli/doctor.js +61 -35
  24. package/dist/cli/doctor.js.map +1 -1
  25. package/dist/cli/job.d.ts +1 -0
  26. package/dist/cli/job.js +37 -99
  27. package/dist/cli/job.js.map +1 -1
  28. package/dist/cli/llm.d.ts +1 -0
  29. package/dist/cli/llm.js +20 -14
  30. package/dist/cli/llm.js.map +1 -1
  31. package/dist/cli/managed-list.d.ts +30 -0
  32. package/dist/cli/managed-list.js +129 -0
  33. package/dist/cli/managed-list.js.map +1 -0
  34. package/dist/cli/panel.d.ts +4 -3
  35. package/dist/cli/panel.js +94 -24
  36. package/dist/cli/panel.js.map +1 -1
  37. package/dist/cli/version.d.ts +1 -0
  38. package/dist/cli/version.js +12 -0
  39. package/dist/cli/version.js.map +1 -0
  40. package/dist/cli.js +47 -516
  41. package/dist/cli.js.map +1 -1
  42. package/dist/config.d.ts +68 -0
  43. package/dist/config.js +266 -12
  44. package/dist/config.js.map +1 -1
  45. package/dist/control.d.ts +10 -6
  46. package/dist/control.js +87 -6
  47. package/dist/control.js.map +1 -1
  48. package/dist/install.d.ts +16 -0
  49. package/dist/install.js +75 -26
  50. package/dist/install.js.map +1 -1
  51. package/dist/routes/agent-apps.d.ts +15 -0
  52. package/dist/routes/agent-apps.js +78 -0
  53. package/dist/routes/agent-apps.js.map +1 -0
  54. package/dist/routes/apps.js +186 -7
  55. package/dist/routes/apps.js.map +1 -1
  56. package/dist/routes/backup.js +3 -3
  57. package/dist/routes/backup.js.map +1 -1
  58. package/dist/routes/instances.d.ts +6 -0
  59. package/dist/routes/instances.js +862 -879
  60. package/dist/routes/instances.js.map +1 -1
  61. package/dist/routes/llm.js +9 -8
  62. package/dist/routes/llm.js.map +1 -1
  63. package/dist/routes/runtime.d.ts +15 -0
  64. package/dist/routes/runtime.js +69 -0
  65. package/dist/routes/runtime.js.map +1 -0
  66. package/dist/routes/setup.js +103 -8
  67. package/dist/routes/setup.js.map +1 -1
  68. package/dist/routes/system.js +25 -3
  69. package/dist/routes/system.js.map +1 -1
  70. package/dist/server.js +71 -7
  71. package/dist/server.js.map +1 -1
  72. package/dist/services/agent-apps/catalog.d.ts +30 -0
  73. package/dist/services/agent-apps/catalog.js +60 -0
  74. package/dist/services/agent-apps/catalog.js.map +1 -0
  75. package/dist/services/agent-apps/index.d.ts +36 -0
  76. package/dist/services/agent-apps/index.js +171 -0
  77. package/dist/services/agent-apps/index.js.map +1 -0
  78. package/dist/services/agent-apps/installers/adapter-probes.d.ts +49 -0
  79. package/dist/services/agent-apps/installers/adapter-probes.js +223 -0
  80. package/dist/services/agent-apps/installers/adapter-probes.js.map +1 -0
  81. package/dist/services/agent-apps/installers/adapter.d.ts +30 -0
  82. package/dist/services/agent-apps/installers/adapter.js +171 -0
  83. package/dist/services/agent-apps/installers/adapter.js.map +1 -0
  84. package/dist/services/agent-apps/installers/registry-probe.d.ts +38 -0
  85. package/dist/services/agent-apps/installers/registry-probe.js +183 -0
  86. package/dist/services/agent-apps/installers/registry-probe.js.map +1 -0
  87. package/dist/services/agent-apps/installers/shell-script.d.ts +47 -0
  88. package/dist/services/agent-apps/installers/shell-script.js +471 -0
  89. package/dist/services/agent-apps/installers/shell-script.js.map +1 -0
  90. package/dist/services/agent-apps/types.d.ts +125 -0
  91. package/dist/services/agent-apps/types.js +17 -0
  92. package/dist/services/agent-apps/types.js.map +1 -0
  93. package/dist/services/{app-compiler.d.ts → app/app-compiler.d.ts} +3 -3
  94. package/dist/services/{app-compiler.js → app/app-compiler.js} +10 -7
  95. package/dist/services/app/app-compiler.js.map +1 -0
  96. package/dist/services/app/app-manager.d.ts +142 -0
  97. package/dist/services/app/app-manager.js +1988 -0
  98. package/dist/services/app/app-manager.js.map +1 -0
  99. package/dist/services/app/custom-manager.d.ts +27 -0
  100. package/dist/services/app/custom-manager.js +285 -0
  101. package/dist/services/app/custom-manager.js.map +1 -0
  102. package/dist/services/app/hermes-agent-manager.d.ts +20 -0
  103. package/dist/services/app/hermes-agent-manager.js +289 -0
  104. package/dist/services/app/hermes-agent-manager.js.map +1 -0
  105. package/dist/services/app/id-normalizer.d.ts +27 -0
  106. package/dist/services/app/id-normalizer.js +77 -0
  107. package/dist/services/app/id-normalizer.js.map +1 -0
  108. package/dist/services/app/ollama-manager.d.ts +18 -0
  109. package/dist/services/app/ollama-manager.js +207 -0
  110. package/dist/services/app/ollama-manager.js.map +1 -0
  111. package/dist/services/app/openclaw-manager.d.ts +63 -0
  112. package/dist/services/app/openclaw-manager.js +1178 -0
  113. package/dist/services/app/openclaw-manager.js.map +1 -0
  114. package/dist/services/app/paths.d.ts +47 -0
  115. package/dist/services/app/paths.js +68 -0
  116. package/dist/services/app/paths.js.map +1 -0
  117. package/dist/services/app/registry.d.ts +17 -0
  118. package/dist/services/app/registry.js +31 -0
  119. package/dist/services/app/registry.js.map +1 -0
  120. package/dist/services/app/remote-spec.d.ts +14 -0
  121. package/dist/services/app/remote-spec.js +58 -0
  122. package/dist/services/app/remote-spec.js.map +1 -0
  123. package/dist/services/app/terminal-session-manager.d.ts +27 -0
  124. package/dist/services/app/terminal-session-manager.js +157 -0
  125. package/dist/services/app/terminal-session-manager.js.map +1 -0
  126. package/dist/services/app/types.d.ts +72 -0
  127. package/dist/services/app/types.js +16 -0
  128. package/dist/services/app/types.js.map +1 -0
  129. package/dist/services/backup-manager.js +60 -22
  130. package/dist/services/backup-manager.js.map +1 -1
  131. package/dist/services/instance-manager.d.ts +82 -39
  132. package/dist/services/instance-manager.js +575 -1142
  133. package/dist/services/instance-manager.js.map +1 -1
  134. package/dist/services/llm-proxy/circuit-breaker.js +10 -2
  135. package/dist/services/llm-proxy/circuit-breaker.js.map +1 -1
  136. package/dist/services/llm-proxy/index.d.ts +14 -1
  137. package/dist/services/llm-proxy/index.js +51 -6
  138. package/dist/services/llm-proxy/index.js.map +1 -1
  139. package/dist/services/nomad-manager.d.ts +260 -3
  140. package/dist/services/nomad-manager.js +2866 -449
  141. package/dist/services/nomad-manager.js.map +1 -1
  142. package/dist/services/panel-manager.d.ts +10 -0
  143. package/dist/services/panel-manager.js +97 -0
  144. package/dist/services/panel-manager.js.map +1 -1
  145. package/dist/services/plugin-installer.js +28 -2
  146. package/dist/services/plugin-installer.js.map +1 -1
  147. package/dist/services/process-manager.js +22 -0
  148. package/dist/services/process-manager.js.map +1 -1
  149. package/dist/services/runtime/adapters/custom.d.ts +20 -0
  150. package/dist/services/runtime/adapters/custom.js +90 -0
  151. package/dist/services/runtime/adapters/custom.js.map +1 -0
  152. package/dist/services/runtime/adapters/hermes.d.ts +174 -0
  153. package/dist/services/runtime/adapters/hermes.js +1316 -0
  154. package/dist/services/runtime/adapters/hermes.js.map +1 -0
  155. package/dist/services/runtime/adapters/openclaw-routes.d.ts +17 -0
  156. package/dist/services/runtime/adapters/openclaw-routes.js +946 -0
  157. package/dist/services/runtime/adapters/openclaw-routes.js.map +1 -0
  158. package/dist/services/runtime/adapters/openclaw.d.ts +188 -0
  159. package/dist/services/runtime/adapters/openclaw.js +2195 -0
  160. package/dist/services/runtime/adapters/openclaw.js.map +1 -0
  161. package/dist/services/runtime/errors.d.ts +28 -0
  162. package/dist/services/runtime/errors.js +31 -0
  163. package/dist/services/runtime/errors.js.map +1 -0
  164. package/dist/services/runtime/index.d.ts +34 -0
  165. package/dist/services/runtime/index.js +51 -0
  166. package/dist/services/runtime/index.js.map +1 -0
  167. package/dist/services/runtime/instance.d.ts +24 -0
  168. package/dist/services/runtime/instance.js +143 -0
  169. package/dist/services/runtime/instance.js.map +1 -0
  170. package/dist/services/runtime/migrations.d.ts +15 -0
  171. package/dist/services/runtime/migrations.js +25 -0
  172. package/dist/services/runtime/migrations.js.map +1 -0
  173. package/dist/services/runtime/registry.d.ts +13 -0
  174. package/dist/services/runtime/registry.js +32 -0
  175. package/dist/services/runtime/registry.js.map +1 -0
  176. package/dist/services/runtime/types.d.ts +545 -0
  177. package/dist/services/runtime/types.js +14 -0
  178. package/dist/services/runtime/types.js.map +1 -0
  179. package/dist/services/setup-manager.d.ts +70 -29
  180. package/dist/services/setup-manager.js +278 -597
  181. package/dist/services/setup-manager.js.map +1 -1
  182. package/dist/services/task-registry.d.ts +44 -0
  183. package/dist/services/task-registry.js +74 -0
  184. package/dist/services/task-registry.js.map +1 -0
  185. package/dist/services/telemetry/heartbeat.d.ts +6 -6
  186. package/dist/services/telemetry/heartbeat.js +29 -30
  187. package/dist/services/telemetry/heartbeat.js.map +1 -1
  188. package/dist/types.d.ts +162 -2
  189. package/dist/utils/docker-host.d.ts +15 -0
  190. package/dist/utils/docker-host.js +64 -0
  191. package/dist/utils/docker-host.js.map +1 -0
  192. package/install/jishu-install.sh +25 -1
  193. package/package.json +14 -4
  194. package/public/assets/Dashboard-B-JoOjBQ.js +1 -0
  195. package/public/assets/HermesChatPanel-mFSureyc.js +1 -0
  196. package/public/assets/HermesConfigForm-DvR05LK1.js +4 -0
  197. package/public/assets/InitPassword-CVA8wQA6.js +1 -0
  198. package/public/assets/InstanceDetail-DcZW2QGO.js +91 -0
  199. package/public/assets/{Login-D1Bt-Lyk.js → Login-BWsZH2mu.js} +1 -1
  200. package/public/assets/NewInstance-BCIrAd86.js +1 -0
  201. package/public/assets/Settings-xkDcduFz.js +1 -0
  202. package/public/assets/Setup-Cfuwj4gV.js +1 -0
  203. package/public/assets/WeixinLoginPanel-CnjR8xMu.js +9 -0
  204. package/public/assets/index-CPhVFEsx.css +1 -0
  205. package/public/assets/index-DQsM6Joa.js +19 -0
  206. package/public/assets/input-paste-CrNVAyOy.js +1 -0
  207. package/public/assets/registry-B4UFJdpA.js +2 -0
  208. package/public/assets/{usePolling-CK0DfI4h.js → usePolling-Do5Erqm_.js} +1 -1
  209. package/public/assets/vendor-i18n-ucpM0OR0.js +9 -0
  210. package/public/assets/{vendor-react-B1-3Yrt-.js → vendor-react-Bk1hRGiY.js} +1 -1
  211. package/public/favicon.png +0 -0
  212. package/public/index.html +9 -4
  213. package/public/logos/hermes.png +0 -0
  214. package/public/logos/ollama.png +0 -0
  215. package/public/logos/openclaw.svg +60 -0
  216. package/scripts/build-hermes-image.sh +21 -0
  217. package/scripts/build-local.sh +54 -0
  218. package/scripts/check-adapter-isolation.ts +293 -0
  219. package/scripts/fixtures/instances/hermes-sample/instance.json +37 -0
  220. package/scripts/fixtures/instances/legacy-openclaw-sample/instance.json +7 -0
  221. package/scripts/smoke/hermes-bootstrap.sh +195 -0
  222. package/templates/hermes-entrypoint.sh +154 -0
  223. package/dist/cli/openclaw.d.ts +0 -12
  224. package/dist/cli/openclaw.js +0 -156
  225. package/dist/cli/openclaw.js.map +0 -1
  226. package/dist/services/app-compiler.js.map +0 -1
  227. package/dist/services/app-manager.d.ts +0 -17
  228. package/dist/services/app-manager.js +0 -168
  229. package/dist/services/app-manager.js.map +0 -1
  230. package/dist/services/job-manager.d.ts +0 -22
  231. package/dist/services/job-manager.js +0 -102
  232. package/dist/services/job-manager.js.map +0 -1
  233. package/public/assets/Dashboard-CQsp1Mr9.js +0 -1
  234. package/public/assets/InitPassword-BEC8SE4A.js +0 -1
  235. package/public/assets/InstanceDetail-B5wTgNEg.js +0 -17
  236. package/public/assets/NewInstance-GQzm3K9D.js +0 -1
  237. package/public/assets/Settings-ByjGlqhP.js +0 -1
  238. package/public/assets/Setup-cMF21Y-8.js +0 -1
  239. package/public/assets/index-B6qQP4mH.css +0 -1
  240. package/public/assets/index-BuTQtuNy.js +0 -16
  241. package/public/assets/vendor-i18n-CfW0RvgE.js +0 -9
@@ -1,16 +1,79 @@
1
1
  /**
2
- * Nomad-based service manager for OpenClaw instances.
3
- * Communicates with Nomad via its HTTP API.
2
+ * Nomad-based service manager kind-agnostic scheduler layer.
3
+ *
4
+ * §32.2 / §32.8: this file contains ZERO knowledge of specific agent kinds.
5
+ * Runtime-specific task assembly (`buildNomadTask`), pre-start patches
6
+ * (`hooks.onBeforeStart`), and capability profiles live inside
7
+ * `src/services/runtime/adapters/<agentType>.ts`. Framework dispatch is:
8
+ *
9
+ * const agentType = resolveAgentType(getInstance(id));
10
+ * const adapter = getAdapter(agentType);
11
+ * await adapter.hooks?.onBeforeStart?.({ instanceId });
12
+ * const task = await adapter.buildNomadTask(instanceId);
4
13
  */
14
+ import type { AppSpec, ExecResult, InstanceStatus, ServiceResult } from "../types.js";
5
15
  export declare const DOCKER_IMAGE_RE: RegExp;
16
+ /**
17
+ * Linux username validation regex. Shared by adapter Nomad task builders
18
+ * (OpenClaw / Hermes) and re-exported here as a neutral framework constant
19
+ * so security-regression tests can assert on it without depending on a
20
+ * specific adapter file.
21
+ *
22
+ * Strict form: lowercase letters/digits/dot/dash/underscore only, 1..32 chars.
23
+ * Rejects uppercase, shell metacharacters, paths, and empty strings.
24
+ */
25
+ export declare const VALID_USER_RE: RegExp;
6
26
  export declare const MAX_DOCKER_IMAGE_NAME_LEN = 256;
7
27
  export declare function setPanelPort(port: number): void;
8
28
  export declare const VALID_LOG_TYPES: Set<string>;
29
+ export interface ExecStreamHandlers {
30
+ onStdout?: (text: string) => void;
31
+ onStderr?: (text: string) => void;
32
+ }
33
+ declare function jobId(instanceId: string): string;
34
+ /** Exported only for unit tests — not part of the public API. */
35
+ export declare function __jobIdForTests(instanceId: string): string;
9
36
  export declare const NOMAD_TEMPLATE_UNSAFE_RE: RegExp;
37
+ declare function assertSafeTemplateId(id: string): void;
38
+ declare function nomadGet(path: string): Promise<any>;
39
+ declare function nomadPut(path: string, body: any): Promise<Response>;
40
+ export declare function writeInstanceVariables(instanceId: string): Promise<void>;
10
41
  export declare function purgeInstanceVariables(instanceId: string): Promise<void>;
11
- export declare const VALID_USER_RE: RegExp;
42
+ /**
43
+ * Resolve the numeric uid:gid for a given username by reading /etc/passwd.
44
+ * Falls back to process.getuid!():process.getgid!() when the lookup fails.
45
+ * Still used here by the kind-agnostic `exec()` helper below (for docker
46
+ * exec user resolution); adapters carry their own copies for task build.
47
+ */
48
+ declare function resolveUidGid(username: string): string;
12
49
  export declare function shouldAutoStart(instanceId: string): Promise<boolean>;
13
50
  export declare function getStatus(instanceId: string): Promise<Record<string, any>>;
51
+ /**
52
+ * startInstance phase tags. Returned on every error result so callers and
53
+ * tests can distinguish *where* the failure happened without parsing the
54
+ * message string. Backward-compatible: legacy callers that only read
55
+ * `result.ok` / `result.error` continue to work unchanged.
56
+ */
57
+ export type StartPhase = "running_check" | "home_conflict" | "port_alloc" | "pre_start_hook" | "submit";
58
+ /**
59
+ * §32.2 / §32.8: pure adapter dispatch. Framework owns five generic
60
+ * responsibilities delegated to `phase*` helpers above; every kind-
61
+ * specific concern lives in `adapter.hooks.onBeforeStart()`.
62
+ *
63
+ * Phase ordering:
64
+ * running_check → home_conflict → pre_start_hook → port_alloc → submit
65
+ *
66
+ * `pre_start_hook` intentionally runs BEFORE `port_alloc` so deterministic
67
+ * errors (missing config, missing image, variables-write failure) surface
68
+ * ahead of port-reallocation noise. A port reallocation failure after a
69
+ * successful hook means the environment is genuinely contended; a hook
70
+ * failure after a reallocation would waste the allocation and bury the
71
+ * real cause under an incidental port change.
72
+ *
73
+ * Error returns carry a `phase` tag so callers and logs can distinguish
74
+ * *where* the failure happened. The shape stays backward-compatible: old
75
+ * callers that only read `ok`/`error` continue to work.
76
+ */
14
77
  export declare function startInstance(instanceId: string): Promise<Record<string, any>>;
15
78
  export declare function stopInstance(instanceId: string, purge?: boolean): Promise<Record<string, any>>;
16
79
  export declare function restartInstance(instanceId: string): Promise<Record<string, any>>;
@@ -20,3 +83,197 @@ export declare function exec(instanceId: string, command: string[], timeoutMs?:
20
83
  stderr: string;
21
84
  exitCode: number;
22
85
  }>;
86
+ export declare const DEFAULT_PIDS_LIMIT = 512;
87
+ export declare const DEFAULT_ARGS: string[];
88
+ export declare const DEFAULT_USER: string;
89
+ export declare const DEFAULT_CWD: string;
90
+ export declare const DEFAULT_ENV: Record<string, string>;
91
+ export declare const DEFAULT_RESOURCES: {
92
+ CPU: number;
93
+ MemoryMB: number;
94
+ };
95
+ export declare const MAX_CPU_MHZ = 4000;
96
+ export declare const MAX_MEMORY_MB = 4096;
97
+ export declare const MAX_MEMORY_MAX_MB = 4096;
98
+ /**
99
+ * Clamp container memory reservation/limit to the framework ceilings and
100
+ * ensure `MemoryMaxMB >= MemoryMB`. Shared by every container-runtime app
101
+ * manager (openclaw / custom / ollama / hermes) so they apply the same
102
+ * guard-rails before handing a task spec to Nomad.
103
+ */
104
+ export declare function normalizeDockerResources(instanceId: string, runtime: Record<string, any>): Record<string, any>;
105
+ export { jobId, resolveUidGid, nomadGet, nomadPut, assertSafeTemplateId, };
106
+ declare namespace UnifiedNomadJobs {
107
+ const DOCKER_IMAGE_RE: RegExp;
108
+ const MAX_DOCKER_IMAGE_NAME_LEN = 256;
109
+ const VALID_LOG_TYPES: Set<string>;
110
+ const NOMAD_TEMPLATE_UNSAFE_RE: RegExp;
111
+ function isAppJob(id: string): boolean;
112
+ interface AppJobStatus {
113
+ status: string;
114
+ alloc_id?: string;
115
+ /** Per-task status map; key is task name. */
116
+ tasks: Record<string, {
117
+ state: string;
118
+ restarts: number;
119
+ started_at?: string;
120
+ health_status?: string;
121
+ health_checks?: Array<{
122
+ name: string;
123
+ status: string;
124
+ service?: string;
125
+ output?: string;
126
+ }>;
127
+ }>;
128
+ pid: null;
129
+ uptime: number | null;
130
+ memory_mb: number | null;
131
+ cpu_percent: number | null;
132
+ restarts: number;
133
+ error?: string;
134
+ }
135
+ /**
136
+ * Parse a CPU resource string to Nomad MHz integer.
137
+ * "500m" → 500 (millicores treated as MHz for simplicity)
138
+ * "1" → 1000 (1 core → 1000 MHz)
139
+ * "1000" → 1000 (bare integer treated as MHz already)
140
+ *
141
+ * Nomad doesn't have a concept of "cores"; it schedules by MHz.
142
+ * We treat 1 core = 1000 MHz as a reasonable proxy for a Pi-class host.
143
+ */
144
+ function parseCpuMHz(cpu: string | number | undefined): number;
145
+ /**
146
+ * Parse a memory resource string to Nomad MB integer.
147
+ * "512Mi" or "512MiB" → 512 MB
148
+ * "1Gi" or "1GiB" → 1024 MB
149
+ * "512M" or "512MB" → 512 MB
150
+ * "1G" or "1GB" → 1024 MB
151
+ * "1024" → 1024 MB (bare integer = MB)
152
+ */
153
+ function parseMemoryMB(memory: string | number | undefined): number;
154
+ /**
155
+ * Check whether a binary process is already running on the host OS by
156
+ * matching its command path via pgrep -f.
157
+ *
158
+ * Used by startAppJob to skip Nomad submission when the binary is already
159
+ * running (e.g. started outside of Nomad or when raw_exec driver is unavailable).
160
+ */
161
+ function isBinaryRunning(command: string): Promise<boolean>;
162
+ /**
163
+ * Returns true if this app job exists in Nomad and was NOT explicitly stopped.
164
+ * Used at JishuShell startup to auto-restart apps that were running before reboot.
165
+ */
166
+ function shouldAutoStart(appId: string): Promise<boolean>;
167
+ /**
168
+ * Get the aggregated status of an app job.
169
+ *
170
+ * @param appId App instance ID.
171
+ * @param primaryTask Task name to use for uptime/restarts summary.
172
+ * Defaults to the first service task in the spec.
173
+ * If omitted, the first task state found is used.
174
+ */
175
+ function getAppStatus(appId: string, primaryTask?: string): Promise<AppJobStatus>;
176
+ /**
177
+ * Submit a Nomad job for an app.
178
+ *
179
+ * @param spec Validated AppSpec.
180
+ * @param appId Unique instance ID (job name suffix).
181
+ * @param extraEnv Env vars injected into every task (e.g. resolved capability addresses).
182
+ */
183
+ function startAppJob(spec: AppSpec, appId: string, extraEnv?: Record<string, string>): Promise<{
184
+ ok: boolean;
185
+ error?: string;
186
+ eval_id?: string;
187
+ }>;
188
+ /**
189
+ * Poll until the app job reaches "running" status or times out.
190
+ * Returns true if the job is running, false if timed out.
191
+ */
192
+ function waitForRunning(appId: string, timeoutMs?: number, pollIntervalMs?: number): Promise<boolean>;
193
+ function checkDependencies(spec: AppSpec): Promise<{
194
+ ok: boolean;
195
+ errors: string[];
196
+ }>;
197
+ /**
198
+ * Stop (and optionally purge) a Nomad app job.
199
+ */
200
+ function stopAppJob(appId: string, purge?: boolean): Promise<{
201
+ ok: boolean;
202
+ error?: string;
203
+ }>;
204
+ /**
205
+ * Restart a running app job.
206
+ * Prefers native Nomad allocation restart to preserve alloc history.
207
+ * Falls back to stop + re-submit when no AppSpec is available for re-submit.
208
+ *
209
+ * @param appId App instance ID.
210
+ * @param primaryTask Task name to restart. Defaults to the first task.
211
+ */
212
+ function restartAppJob(appId: string, primaryTask?: string): Promise<{
213
+ ok: boolean;
214
+ error?: string;
215
+ }>;
216
+ /**
217
+ * Fetch recent log lines for a task in an app job.
218
+ *
219
+ * @param appId App instance ID.
220
+ * @param taskName Nomad task name (task.name from AppSpec).
221
+ * @param lines Number of lines to return (default 200).
222
+ * @param logType "stdout" | "stderr" (default "stderr").
223
+ */
224
+ function getAppLogs(appId: string, taskName?: string, lines?: number, logType?: string): Promise<string[]>;
225
+ /**
226
+ * Execute a command inside a running app task.
227
+ *
228
+ * Strategy:
229
+ * 1. Try `docker exec` (fast path for docker-driver tasks, no Nomad dependency).
230
+ * 2. If the container is not found, fall back to the Nomad WebSocket exec API
231
+ * which works for both `docker` and `raw_exec` tasks.
232
+ *
233
+ * @param appId App instance ID.
234
+ * @param taskName Task name from AppSpec.
235
+ * @param command Command + args array.
236
+ * @param timeoutMs Execution timeout in ms (default 120 s).
237
+ */
238
+ function execInApp(appId: string, taskName: string | undefined, command: string[], timeoutMs?: number): Promise<ExecResult>;
239
+ function streamExecInApp(appId: string, taskName: string | undefined, command: string[], handlers?: ExecStreamHandlers, timeoutMs?: number): Promise<ExecResult>;
240
+ function listInstanceIds(): Promise<string[]>;
241
+ function readInstanceMeta(nomadJobId: string): Record<string, any> | null;
242
+ function resolveInstanceId(id?: string): Promise<string>;
243
+ function resolveInstanceForPairing(instanceId?: string): Promise<string>;
244
+ function ensureNomadToken(): void;
245
+ function getInstanceStatus(nomadJobId: string): Promise<InstanceStatus>;
246
+ function startInstance(nomadJobId: string): Promise<ServiceResult>;
247
+ function stopInstance(nomadJobId: string, purge?: boolean): Promise<ServiceResult>;
248
+ function restartInstance(nomadJobId: string): Promise<ServiceResult>;
249
+ function getInstanceLogs(nomadJobId: string, lines?: number, logType?: string): Promise<string[]>;
250
+ function execInInstance(nomadJobId: string, command: string[], timeoutMs?: number): Promise<ExecResult>;
251
+ function streamExecInInstance(nomadJobId: string, command: string[], handlers?: ExecStreamHandlers, timeoutMs?: number, taskName?: string): Promise<ExecResult>;
252
+ }
253
+ export declare const isAppJob: typeof UnifiedNomadJobs.isAppJob;
254
+ export declare const parseCpuMHz: typeof UnifiedNomadJobs.parseCpuMHz;
255
+ export declare const parseMemoryMB: typeof UnifiedNomadJobs.parseMemoryMB;
256
+ export declare const isBinaryRunning: typeof UnifiedNomadJobs.isBinaryRunning;
257
+ export declare const getAppStatus: typeof UnifiedNomadJobs.getAppStatus;
258
+ export declare const startAppJob: typeof UnifiedNomadJobs.startAppJob;
259
+ export declare const waitForRunning: typeof UnifiedNomadJobs.waitForRunning;
260
+ export declare const checkDependencies: typeof UnifiedNomadJobs.checkDependencies;
261
+ export declare const stopAppJob: typeof UnifiedNomadJobs.stopAppJob;
262
+ export declare const restartAppJob: typeof UnifiedNomadJobs.restartAppJob;
263
+ export declare const getAppLogs: typeof UnifiedNomadJobs.getAppLogs;
264
+ export declare const execInApp: typeof UnifiedNomadJobs.execInApp;
265
+ export declare const streamExecInApp: typeof UnifiedNomadJobs.streamExecInApp;
266
+ export declare const listInstanceIds: typeof UnifiedNomadJobs.listInstanceIds;
267
+ export declare const readInstanceMeta: typeof UnifiedNomadJobs.readInstanceMeta;
268
+ export declare const resolveInstanceId: typeof UnifiedNomadJobs.resolveInstanceId;
269
+ export declare const resolveInstanceForPairing: typeof UnifiedNomadJobs.resolveInstanceForPairing;
270
+ export declare const ensureNomadToken: typeof UnifiedNomadJobs.ensureNomadToken;
271
+ export declare const getInstanceStatus: typeof UnifiedNomadJobs.getInstanceStatus;
272
+ export declare const getInstanceLogs: typeof UnifiedNomadJobs.getInstanceLogs;
273
+ export declare const execInInstance: typeof UnifiedNomadJobs.execInInstance;
274
+ export declare const streamExecInInstance: typeof UnifiedNomadJobs.streamExecInInstance;
275
+ export declare const shouldAutoStartNomadJob: typeof UnifiedNomadJobs.shouldAutoStart;
276
+ export declare const startNomadJobInstance: typeof UnifiedNomadJobs.startInstance;
277
+ export declare const stopNomadJobInstance: typeof UnifiedNomadJobs.stopInstance;
278
+ export declare const restartNomadJobInstance: typeof UnifiedNomadJobs.restartInstance;
279
+ export type AppJobStatus = UnifiedNomadJobs.AppJobStatus;