jishushell 0.6.5 → 0.6.18

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 (998) hide show
  1. package/apps/anythingllm-container.yaml +15 -170
  2. package/apps/browserless-chromium-container.yaml +15 -10
  3. package/apps/filebrowser-container.yaml +14 -9
  4. package/apps/hermes-container.yaml +23 -2
  5. package/apps/jishu-kb-container.yaml +29 -161
  6. package/apps/ollama-binary.yaml +32 -28
  7. package/apps/ollama-cpu-container.yaml +5 -0
  8. package/apps/ollama-with-hollama-binary.yaml +33 -28
  9. package/apps/openclaw-binary.yaml +34 -10
  10. package/apps/openclaw-container.yaml +31 -7
  11. package/apps/openclaw-with-ollama-container.yaml +8 -2
  12. package/apps/openclaw-with-searxng-container.yaml +18 -6
  13. package/apps/searxng-container.yaml +11 -6
  14. package/apps/weknora-container.yaml +21 -21
  15. package/dependencies/jishushell-panel-0.6.18.tgz +0 -0
  16. package/dist/cli/app.js +244 -213
  17. package/dist/cli/app.js.map +1 -1
  18. package/dist/cli/backup.js +15 -12
  19. package/dist/cli/backup.js.map +1 -1
  20. package/dist/cli/core.d.ts +4 -3
  21. package/dist/cli/core.js +392 -227
  22. package/dist/cli/core.js.map +1 -1
  23. package/dist/cli/doctor.d.ts +1 -1
  24. package/dist/cli/doctor.js +17 -10
  25. package/dist/cli/doctor.js.map +1 -1
  26. package/dist/cli/job.js +62 -14
  27. package/dist/cli/job.js.map +1 -1
  28. package/dist/cli/llm.js +80 -11
  29. package/dist/cli/llm.js.map +1 -1
  30. package/dist/cli/managed-list.d.ts +1 -3
  31. package/dist/cli/managed-list.js +18 -16
  32. package/dist/cli/managed-list.js.map +1 -1
  33. package/dist/cli/migrate.d.ts +2 -0
  34. package/dist/cli/migrate.js +160 -0
  35. package/dist/cli/migrate.js.map +1 -0
  36. package/dist/cli.js +1 -0
  37. package/dist/cli.js.map +1 -1
  38. package/dist/config.d.ts +23 -19
  39. package/dist/config.js +60 -49
  40. package/dist/config.js.map +1 -1
  41. package/dist/control.d.ts +6 -6
  42. package/dist/control.js +31 -23
  43. package/dist/control.js.map +1 -1
  44. package/dist/core.d.ts +5 -5
  45. package/dist/core.js +5 -5
  46. package/dist/core.js.map +1 -1
  47. package/dist/install.d.ts +2 -2
  48. package/dist/install.js +18 -18
  49. package/dist/install.js.map +1 -1
  50. package/dist/routes/apps.d.ts +1 -1
  51. package/dist/routes/apps.js +101 -193
  52. package/dist/routes/apps.js.map +1 -1
  53. package/dist/routes/auth.js +1 -1
  54. package/dist/routes/auth.js.map +1 -1
  55. package/dist/routes/backup.js +1 -1
  56. package/dist/routes/backup.js.map +1 -1
  57. package/dist/routes/external-mounts.d.ts +1 -1
  58. package/dist/routes/external-mounts.js +1 -1
  59. package/dist/routes/external-mounts.js.map +1 -1
  60. package/dist/routes/file-mounts.d.ts +4 -3
  61. package/dist/routes/file-mounts.js +51 -30
  62. package/dist/routes/file-mounts.js.map +1 -1
  63. package/dist/routes/files-organize.d.ts +2 -2
  64. package/dist/routes/files-organize.js +5 -5
  65. package/dist/routes/files-organize.js.map +1 -1
  66. package/dist/routes/files.d.ts +1 -1
  67. package/dist/routes/files.js +1 -1
  68. package/dist/routes/files.js.map +1 -1
  69. package/dist/routes/instances.d.ts +10 -4
  70. package/dist/routes/instances.js +323 -541
  71. package/dist/routes/instances.js.map +1 -1
  72. package/dist/routes/integration-apps.d.ts +14 -0
  73. package/dist/routes/integration-apps.js +81 -0
  74. package/dist/routes/integration-apps.js.map +1 -0
  75. package/dist/routes/integrations.d.ts +9 -0
  76. package/dist/routes/integrations.js +12 -0
  77. package/dist/routes/integrations.js.map +1 -0
  78. package/dist/routes/llm-proxy.js +26 -3
  79. package/dist/routes/llm-proxy.js.map +1 -1
  80. package/dist/routes/setup.js +53 -38
  81. package/dist/routes/setup.js.map +1 -1
  82. package/dist/routes/system.js +108 -68
  83. package/dist/routes/system.js.map +1 -1
  84. package/dist/routes/webdav.d.ts +1 -1
  85. package/dist/routes/webdav.js +2 -2
  86. package/dist/routes/webdav.js.map +1 -1
  87. package/dist/server.js +315 -213
  88. package/dist/server.js.map +1 -1
  89. package/dist/services/app-common/app-compiler.js +186 -0
  90. package/dist/services/app-common/app-compiler.js.map +1 -0
  91. package/dist/services/app-common/app-shared.d.ts +15 -0
  92. package/dist/services/app-common/app-shared.js +64 -0
  93. package/dist/services/app-common/app-shared.js.map +1 -0
  94. package/dist/services/app-common/capability-service.d.ts +45 -0
  95. package/dist/services/app-common/capability-service.js +331 -0
  96. package/dist/services/app-common/capability-service.js.map +1 -0
  97. package/dist/services/app-common/catalog-service.d.ts +59 -0
  98. package/dist/services/app-common/catalog-service.js +308 -0
  99. package/dist/services/app-common/catalog-service.js.map +1 -0
  100. package/dist/services/app-common/create-pipeline.d.ts +26 -0
  101. package/dist/services/app-common/create-pipeline.js +298 -0
  102. package/dist/services/app-common/create-pipeline.js.map +1 -0
  103. package/dist/services/app-common/delete-service.d.ts +5 -0
  104. package/dist/services/app-common/delete-service.js +104 -0
  105. package/dist/services/app-common/delete-service.js.map +1 -0
  106. package/dist/services/app-common/execution-owner.d.ts +23 -0
  107. package/dist/services/app-common/execution-owner.js +124 -0
  108. package/dist/services/app-common/execution-owner.js.map +1 -0
  109. package/dist/services/app-common/execution-service.d.ts +23 -0
  110. package/dist/services/app-common/execution-service.js +105 -0
  111. package/dist/services/app-common/execution-service.js.map +1 -0
  112. package/dist/services/app-common/id-normalizer.d.ts +31 -0
  113. package/dist/services/app-common/id-normalizer.js +83 -0
  114. package/dist/services/app-common/id-normalizer.js.map +1 -0
  115. package/dist/services/app-common/install-store.d.ts +34 -0
  116. package/dist/services/app-common/install-store.js +261 -0
  117. package/dist/services/app-common/install-store.js.map +1 -0
  118. package/dist/services/app-common/instance-store.d.ts +78 -0
  119. package/dist/services/app-common/instance-store.js +495 -0
  120. package/dist/services/app-common/instance-store.js.map +1 -0
  121. package/dist/services/app-common/integration-refs.d.ts +17 -0
  122. package/dist/services/app-common/integration-refs.js +47 -0
  123. package/dist/services/app-common/integration-refs.js.map +1 -0
  124. package/dist/services/app-common/lifecycle-pipeline.d.ts +62 -0
  125. package/dist/services/app-common/lifecycle-pipeline.js +317 -0
  126. package/dist/services/app-common/lifecycle-pipeline.js.map +1 -0
  127. package/dist/services/app-common/lifecycle-scripts.d.ts +38 -0
  128. package/dist/services/app-common/lifecycle-scripts.js +935 -0
  129. package/dist/services/app-common/lifecycle-scripts.js.map +1 -0
  130. package/dist/services/app-common/lifecycle-service.d.ts +68 -0
  131. package/dist/services/app-common/lifecycle-service.js +467 -0
  132. package/dist/services/app-common/lifecycle-service.js.map +1 -0
  133. package/dist/services/app-common/paths.d.ts +29 -0
  134. package/dist/services/app-common/paths.js +34 -0
  135. package/dist/services/app-common/paths.js.map +1 -0
  136. package/dist/services/app-common/platform-transform.d.ts +32 -0
  137. package/dist/services/app-common/platform-transform.js +65 -0
  138. package/dist/services/app-common/platform-transform.js.map +1 -0
  139. package/dist/services/app-common/provide-resolver.d.ts +29 -0
  140. package/dist/services/app-common/provide-resolver.js +129 -0
  141. package/dist/services/app-common/provide-resolver.js.map +1 -0
  142. package/dist/services/app-common/remote-spec.d.ts +14 -0
  143. package/dist/services/app-common/remote-spec.js +58 -0
  144. package/dist/services/app-common/remote-spec.js.map +1 -0
  145. package/dist/services/app-common/runtime-builder.d.ts +1 -0
  146. package/dist/services/app-common/runtime-builder.js +2 -0
  147. package/dist/services/app-common/runtime-builder.js.map +1 -0
  148. package/dist/services/app-common/runtime-facts.d.ts +19 -0
  149. package/dist/services/app-common/runtime-facts.js +126 -0
  150. package/dist/services/app-common/runtime-facts.js.map +1 -0
  151. package/dist/services/app-common/service.d.ts +9 -0
  152. package/dist/services/app-common/service.js +10 -0
  153. package/dist/services/app-common/service.js.map +1 -0
  154. package/dist/services/app-common/spec-materializer.d.ts +9 -0
  155. package/dist/services/app-common/spec-materializer.js +361 -0
  156. package/dist/services/app-common/spec-materializer.js.map +1 -0
  157. package/dist/services/app-common/status-refresh.d.ts +33 -0
  158. package/dist/services/app-common/status-refresh.js +759 -0
  159. package/dist/services/app-common/status-refresh.js.map +1 -0
  160. package/dist/services/app-common/task-service.d.ts +29 -0
  161. package/dist/services/app-common/task-service.js +93 -0
  162. package/dist/services/app-common/task-service.js.map +1 -0
  163. package/dist/services/app-common/terminal-session-manager.js +157 -0
  164. package/dist/services/app-common/terminal-session-manager.js.map +1 -0
  165. package/dist/services/app-modules/browserless/routes.d.ts +9 -0
  166. package/dist/services/app-modules/browserless/routes.js +517 -0
  167. package/dist/services/app-modules/browserless/routes.js.map +1 -0
  168. package/dist/services/app-modules/routes.d.ts +2 -0
  169. package/dist/services/app-modules/routes.js +5 -0
  170. package/dist/services/app-modules/routes.js.map +1 -0
  171. package/dist/services/backup/backup-admin.d.ts +95 -0
  172. package/dist/services/backup/backup-admin.js +246 -0
  173. package/dist/services/backup/backup-admin.js.map +1 -0
  174. package/dist/services/backup/backup-manager.d.ts +264 -0
  175. package/dist/services/backup/backup-manager.js +2318 -0
  176. package/dist/services/backup/backup-manager.js.map +1 -0
  177. package/dist/services/backup/backup-verify.js +240 -0
  178. package/dist/services/backup/backup-verify.js.map +1 -0
  179. package/dist/services/capabilities/browser-policy.d.ts +14 -0
  180. package/dist/services/capabilities/browser-policy.js +141 -0
  181. package/dist/services/capabilities/browser-policy.js.map +1 -0
  182. package/dist/services/capabilities/contract.d.ts +50 -0
  183. package/dist/services/capabilities/contract.js +129 -0
  184. package/dist/services/capabilities/contract.js.map +1 -0
  185. package/dist/services/capabilities/endpoint-validator.d.ts +42 -0
  186. package/dist/services/capabilities/endpoint-validator.js +114 -0
  187. package/dist/services/capabilities/endpoint-validator.js.map +1 -0
  188. package/dist/services/capabilities/health.d.ts +16 -0
  189. package/dist/services/capabilities/health.js +121 -0
  190. package/dist/services/capabilities/health.js.map +1 -0
  191. package/dist/services/capabilities/registry.d.ts +56 -0
  192. package/dist/services/capabilities/registry.js +222 -0
  193. package/dist/services/capabilities/registry.js.map +1 -0
  194. package/dist/services/capabilities/sync.d.ts +7 -0
  195. package/dist/services/capabilities/sync.js +223 -0
  196. package/dist/services/capabilities/sync.js.map +1 -0
  197. package/dist/services/capability-proxy/html-rewriters/browserless.d.ts +1 -0
  198. package/dist/services/capability-proxy/html-rewriters/browserless.js +83 -0
  199. package/dist/services/capability-proxy/html-rewriters/browserless.js.map +1 -0
  200. package/dist/services/capability-proxy/html-rewriters/index.d.ts +12 -0
  201. package/dist/services/capability-proxy/html-rewriters/index.js +25 -0
  202. package/dist/services/capability-proxy/html-rewriters/index.js.map +1 -0
  203. package/dist/services/capability-proxy/html-rewriters/jishukb.d.ts +1 -0
  204. package/dist/services/capability-proxy/html-rewriters/jishukb.js +161 -0
  205. package/dist/services/capability-proxy/html-rewriters/jishukb.js.map +1 -0
  206. package/dist/services/connections/admin.d.ts +80 -0
  207. package/dist/services/connections/admin.js +327 -0
  208. package/dist/services/connections/admin.js.map +1 -0
  209. package/dist/services/connections/apply.d.ts +110 -0
  210. package/dist/services/connections/apply.js +444 -0
  211. package/dist/services/connections/apply.js.map +1 -0
  212. package/dist/services/connections/resolver.d.ts +82 -0
  213. package/dist/services/connections/resolver.js +289 -0
  214. package/dist/services/connections/resolver.js.map +1 -0
  215. package/dist/services/connections/suggestions.d.ts +27 -0
  216. package/dist/services/connections/suggestions.js +124 -0
  217. package/dist/services/connections/suggestions.js.map +1 -0
  218. package/dist/services/connections/transactor.d.ts +39 -0
  219. package/dist/services/connections/transactor.js +307 -0
  220. package/dist/services/connections/transactor.js.map +1 -0
  221. package/dist/services/files/external-mounts.js +187 -0
  222. package/dist/services/files/external-mounts.js.map +1 -0
  223. package/dist/services/files/files-manager.d.ts +265 -0
  224. package/dist/services/files/files-manager.js +1189 -0
  225. package/dist/services/files/files-manager.js.map +1 -0
  226. package/dist/services/files/files-mounts.d.ts +42 -0
  227. package/dist/services/files/files-mounts.js +207 -0
  228. package/dist/services/files/files-mounts.js.map +1 -0
  229. package/dist/services/files/organize/applier.js +218 -0
  230. package/dist/services/files/organize/applier.js.map +1 -0
  231. package/dist/services/files/organize/rules.js +286 -0
  232. package/dist/services/files/organize/rules.js.map +1 -0
  233. package/dist/services/files/organize/scanner.js +366 -0
  234. package/dist/services/files/organize/scanner.js.map +1 -0
  235. package/dist/services/files/organize/store.js +82 -0
  236. package/dist/services/files/organize/store.js.map +1 -0
  237. package/dist/services/files/webdav/server.d.ts +47 -0
  238. package/dist/services/files/webdav/server.js +329 -0
  239. package/dist/services/files/webdav/server.js.map +1 -0
  240. package/dist/services/files/webdav/xml-builder.js.map +1 -0
  241. package/dist/services/instances/admin.d.ts +23 -0
  242. package/dist/services/instances/admin.js +218 -0
  243. package/dist/services/instances/admin.js.map +1 -0
  244. package/dist/services/instances/clone.d.ts +26 -0
  245. package/dist/services/instances/clone.js +78 -0
  246. package/dist/services/instances/clone.js.map +1 -0
  247. package/dist/services/instances/config-admin.d.ts +17 -0
  248. package/dist/services/instances/config-admin.js +181 -0
  249. package/dist/services/instances/config-admin.js.map +1 -0
  250. package/dist/services/instances/manager.d.ts +231 -0
  251. package/dist/services/instances/manager.js +1348 -0
  252. package/dist/services/instances/manager.js.map +1 -0
  253. package/dist/services/instances/passwords.js +173 -0
  254. package/dist/services/instances/passwords.js.map +1 -0
  255. package/dist/services/instances/types.d.ts +21 -0
  256. package/dist/services/instances/types.js +2 -0
  257. package/dist/services/instances/types.js.map +1 -0
  258. package/dist/services/integrations/anythingllm/integration.d.ts +25 -0
  259. package/dist/services/integrations/anythingllm/integration.js +251 -0
  260. package/dist/services/integrations/anythingllm/integration.js.map +1 -0
  261. package/dist/services/integrations/catalog.d.ts +3 -0
  262. package/dist/services/integrations/catalog.js +73 -0
  263. package/dist/services/integrations/catalog.js.map +1 -0
  264. package/dist/services/integrations/custom/integration.d.ts +28 -0
  265. package/dist/services/integrations/custom/integration.js +179 -0
  266. package/dist/services/integrations/custom/integration.js.map +1 -0
  267. package/dist/services/integrations/hermes/integration.d.ts +194 -0
  268. package/dist/services/integrations/hermes/integration.js +1669 -0
  269. package/dist/services/integrations/hermes/integration.js.map +1 -0
  270. package/dist/services/integrations/index.d.ts +40 -0
  271. package/dist/services/integrations/index.js +59 -0
  272. package/dist/services/integrations/index.js.map +1 -0
  273. package/dist/services/integrations/installable/catalog.d.ts +33 -0
  274. package/dist/services/integrations/installable/catalog.js +88 -0
  275. package/dist/services/integrations/installable/catalog.js.map +1 -0
  276. package/dist/services/integrations/installable/index.d.ts +35 -0
  277. package/dist/services/integrations/installable/index.js +170 -0
  278. package/dist/services/integrations/installable/index.js.map +1 -0
  279. package/dist/services/integrations/installable/installers/integration-probes.d.ts +50 -0
  280. package/dist/services/integrations/installable/installers/integration-probes.js +231 -0
  281. package/dist/services/integrations/installable/installers/integration-probes.js.map +1 -0
  282. package/dist/services/integrations/installable/installers/integration.d.ts +30 -0
  283. package/dist/services/integrations/installable/installers/integration.js +177 -0
  284. package/dist/services/integrations/installable/installers/integration.js.map +1 -0
  285. package/dist/services/integrations/installable/installers/registry-probe.js.map +1 -0
  286. package/dist/services/integrations/installable/installers/shell-script.d.ts +46 -0
  287. package/dist/services/integrations/installable/installers/shell-script.js +487 -0
  288. package/dist/services/integrations/installable/installers/shell-script.js.map +1 -0
  289. package/dist/services/integrations/installable/types.d.ts +130 -0
  290. package/dist/services/integrations/installable/types.js +19 -0
  291. package/dist/services/integrations/installable/types.js.map +1 -0
  292. package/dist/services/integrations/jishukb/integration.d.ts +22 -0
  293. package/dist/services/integrations/jishukb/integration.js +189 -0
  294. package/dist/services/integrations/jishukb/integration.js.map +1 -0
  295. package/dist/services/integrations/openclaw/anythingllm-shim.d.ts +46 -0
  296. package/dist/services/integrations/openclaw/anythingllm-shim.js +281 -0
  297. package/dist/services/integrations/openclaw/anythingllm-shim.js.map +1 -0
  298. package/dist/services/integrations/openclaw/drive-shim.js +490 -0
  299. package/dist/services/integrations/openclaw/drive-shim.js.map +1 -0
  300. package/dist/services/integrations/openclaw/integration.d.ts +424 -0
  301. package/dist/services/integrations/openclaw/integration.js +4402 -0
  302. package/dist/services/integrations/openclaw/integration.js.map +1 -0
  303. package/dist/services/integrations/openclaw/jishukb-shim.d.ts +48 -0
  304. package/dist/services/integrations/openclaw/jishukb-shim.js +750 -0
  305. package/dist/services/integrations/openclaw/jishukb-shim.js.map +1 -0
  306. package/dist/services/integrations/openclaw/mcporter-lite.js +276 -0
  307. package/dist/services/integrations/openclaw/mcporter-lite.js.map +1 -0
  308. package/dist/services/integrations/openclaw/mcporter.d.ts +46 -0
  309. package/dist/services/integrations/openclaw/mcporter.js +112 -0
  310. package/dist/services/integrations/openclaw/mcporter.js.map +1 -0
  311. package/dist/services/integrations/openclaw/routes.d.ts +21 -0
  312. package/dist/services/integrations/openclaw/routes.js +1191 -0
  313. package/dist/services/integrations/openclaw/routes.js.map +1 -0
  314. package/dist/services/integrations/registry.d.ts +17 -0
  315. package/dist/services/integrations/registry.js +36 -0
  316. package/dist/services/integrations/registry.js.map +1 -0
  317. package/dist/services/integrations/routes.d.ts +2 -0
  318. package/dist/services/integrations/routes.js +9 -0
  319. package/dist/services/integrations/routes.js.map +1 -0
  320. package/dist/services/integrations/types.d.ts +469 -0
  321. package/dist/services/integrations/types.js +2 -0
  322. package/dist/services/integrations/types.js.map +1 -0
  323. package/dist/services/legacy-migrator/classifier.d.ts +44 -0
  324. package/dist/services/legacy-migrator/classifier.js +309 -0
  325. package/dist/services/legacy-migrator/classifier.js.map +1 -0
  326. package/dist/services/legacy-migrator/executor.d.ts +42 -0
  327. package/dist/services/legacy-migrator/executor.js +637 -0
  328. package/dist/services/legacy-migrator/executor.js.map +1 -0
  329. package/dist/services/legacy-migrator/index.d.ts +31 -0
  330. package/dist/services/legacy-migrator/index.js +34 -0
  331. package/dist/services/legacy-migrator/index.js.map +1 -0
  332. package/dist/services/legacy-migrator/planner.d.ts +8 -0
  333. package/dist/services/legacy-migrator/planner.js +154 -0
  334. package/dist/services/legacy-migrator/planner.js.map +1 -0
  335. package/dist/services/legacy-migrator/provider-settings.d.ts +6 -0
  336. package/dist/services/legacy-migrator/provider-settings.js +72 -0
  337. package/dist/services/legacy-migrator/provider-settings.js.map +1 -0
  338. package/dist/services/legacy-migrator/report.d.ts +9 -0
  339. package/dist/services/legacy-migrator/report.js +99 -0
  340. package/dist/services/legacy-migrator/report.js.map +1 -0
  341. package/dist/services/legacy-migrator/scanner.d.ts +13 -0
  342. package/dist/services/legacy-migrator/scanner.js +157 -0
  343. package/dist/services/legacy-migrator/scanner.js.map +1 -0
  344. package/dist/services/legacy-migrator/types.d.ts +97 -0
  345. package/dist/services/legacy-migrator/types.js +23 -0
  346. package/dist/services/legacy-migrator/types.js.map +1 -0
  347. package/dist/services/llm-proxy/instance-proxy.d.ts +17 -1
  348. package/dist/services/llm-proxy/instance-proxy.js +171 -44
  349. package/dist/services/llm-proxy/instance-proxy.js.map +1 -1
  350. package/dist/services/llm-proxy/probe.js +5 -14
  351. package/dist/services/llm-proxy/probe.js.map +1 -1
  352. package/dist/services/llm-proxy/providers.js +23 -31
  353. package/dist/services/llm-proxy/providers.js.map +1 -1
  354. package/dist/services/llm-proxy/ssrf.d.ts +11 -4
  355. package/dist/services/llm-proxy/ssrf.js +45 -7
  356. package/dist/services/llm-proxy/ssrf.js.map +1 -1
  357. package/dist/services/llm-proxy/validate-key.js +16 -37
  358. package/dist/services/llm-proxy/validate-key.js.map +1 -1
  359. package/dist/services/repair/runtime-repair.d.ts +22 -0
  360. package/dist/services/repair/runtime-repair.js +307 -0
  361. package/dist/services/repair/runtime-repair.js.map +1 -0
  362. package/dist/services/runtime/driver-registry.d.ts +21 -0
  363. package/dist/services/runtime/driver-registry.js +22 -0
  364. package/dist/services/runtime/driver-registry.js.map +1 -0
  365. package/dist/services/runtime/drivers/nomad.d.ts +260 -0
  366. package/dist/services/runtime/drivers/nomad.js +3092 -0
  367. package/dist/services/runtime/drivers/nomad.js.map +1 -0
  368. package/dist/services/runtime/errors.d.ts +3 -3
  369. package/dist/services/runtime/errors.js +3 -3
  370. package/dist/services/runtime/instance.d.ts +14 -16
  371. package/dist/services/runtime/instance.js +93 -123
  372. package/dist/services/runtime/instance.js.map +1 -1
  373. package/dist/services/runtime/job-id.d.ts +1 -1
  374. package/dist/services/runtime/job-id.js +1 -1
  375. package/dist/services/runtime/mcp-shims/firewall.d.ts +2 -2
  376. package/dist/services/runtime/mcp-shims/firewall.js +2 -2
  377. package/dist/services/runtime/mcp-shims/searxng-shim.d.ts +3 -5
  378. package/dist/services/runtime/mcp-shims/searxng-shim.js +3 -5
  379. package/dist/services/runtime/mcp-shims/searxng-shim.js.map +1 -1
  380. package/dist/services/runtime/mcp-shims/write-mcp-entry.d.ts +20 -20
  381. package/dist/services/runtime/mcp-shims/write-mcp-entry.js +16 -16
  382. package/dist/services/runtime/mcp-shims/write-mcp-entry.js.map +1 -1
  383. package/dist/services/runtime/ownership-marker.d.ts +83 -0
  384. package/dist/services/runtime/ownership-marker.js +109 -0
  385. package/dist/services/runtime/ownership-marker.js.map +1 -0
  386. package/dist/services/runtime/types.d.ts +22 -501
  387. package/dist/services/runtime/types.js +0 -12
  388. package/dist/services/runtime/types.js.map +1 -1
  389. package/dist/services/runtime/workload-compiler.d.ts +17 -0
  390. package/dist/services/runtime/workload-compiler.js +525 -0
  391. package/dist/services/runtime/workload-compiler.js.map +1 -0
  392. package/dist/services/runtime/workload-types.d.ts +11 -0
  393. package/dist/services/runtime/workload-types.js +2 -0
  394. package/dist/services/runtime/workload-types.js.map +1 -0
  395. package/dist/services/setup/core-manager.d.ts +50 -0
  396. package/dist/services/setup/core-manager.js +456 -0
  397. package/dist/services/setup/core-manager.js.map +1 -0
  398. package/dist/services/setup/plugin-installer.js +136 -0
  399. package/dist/services/setup/plugin-installer.js.map +1 -0
  400. package/dist/services/setup/setup-manager.d.ts +158 -0
  401. package/dist/services/setup/setup-manager.js +2768 -0
  402. package/dist/services/setup/setup-manager.js.map +1 -0
  403. package/dist/services/system/cli-command.d.ts +5 -0
  404. package/dist/services/system/cli-command.js +18 -0
  405. package/dist/services/system/cli-command.js.map +1 -0
  406. package/dist/services/system/macos-launchd.js +312 -0
  407. package/dist/services/system/macos-launchd.js.map +1 -0
  408. package/dist/services/system/repair-orchestrator.d.ts +71 -0
  409. package/dist/services/system/repair-orchestrator.js +412 -0
  410. package/dist/services/system/repair-orchestrator.js.map +1 -0
  411. package/dist/services/system/system-monitor.js +96 -0
  412. package/dist/services/system/system-monitor.js.map +1 -0
  413. package/dist/services/system/system-ollama-provider.d.ts +14 -0
  414. package/dist/services/system/system-ollama-provider.js +129 -0
  415. package/dist/services/system/system-ollama-provider.js.map +1 -0
  416. package/dist/services/system/system-reconciler.d.ts +59 -0
  417. package/dist/services/system/system-reconciler.js +710 -0
  418. package/dist/services/system/system-reconciler.js.map +1 -0
  419. package/dist/services/system/update-manager.d.ts +43 -0
  420. package/dist/services/system/update-manager.js +315 -0
  421. package/dist/services/system/update-manager.js.map +1 -0
  422. package/dist/services/system/upgrade-finalize.d.ts +80 -0
  423. package/dist/services/system/upgrade-finalize.js +507 -0
  424. package/dist/services/system/upgrade-finalize.js.map +1 -0
  425. package/dist/services/tasks/registry.d.ts +44 -0
  426. package/dist/services/tasks/registry.js +90 -0
  427. package/dist/services/tasks/registry.js.map +1 -0
  428. package/dist/services/telemetry/activation.d.ts +6 -2
  429. package/dist/services/telemetry/activation.js +6 -2
  430. package/dist/services/telemetry/activation.js.map +1 -1
  431. package/dist/services/telemetry/heartbeat.d.ts +6 -2
  432. package/dist/services/telemetry/heartbeat.js +6 -2
  433. package/dist/services/telemetry/heartbeat.js.map +1 -1
  434. package/dist/services/workspaces/builder.d.ts +29 -0
  435. package/dist/services/workspaces/builder.js +186 -0
  436. package/dist/services/workspaces/builder.js.map +1 -0
  437. package/dist/types.d.ts +331 -45
  438. package/dist/utils/instance-lock.d.ts +2 -2
  439. package/dist/utils/instance-lock.js +2 -2
  440. package/install/jishu-install.sh +107 -26
  441. package/install/jishu-uninstall.sh +8 -0
  442. package/install/post-install.sh +162 -185
  443. package/install/post-uninstall.sh +6 -0
  444. package/node_modules/@fastify/static/.github/workflows/ci.yml +1 -1
  445. package/node_modules/@fastify/static/.github/workflows/lock-threads.yml +19 -0
  446. package/node_modules/@fastify/static/LICENSE +1 -3
  447. package/node_modules/@fastify/static/example/server-benchmark.js +39 -0
  448. package/node_modules/@fastify/static/index.js +169 -23
  449. package/node_modules/@fastify/static/lib/dirList.js +20 -6
  450. package/node_modules/@fastify/static/package.json +10 -8
  451. package/node_modules/@fastify/static/test/dir-list.test.js +82 -0
  452. package/node_modules/@fastify/static/test/static.test.js +326 -4
  453. package/node_modules/@fastify/static/types/index.d.ts +0 -4
  454. package/node_modules/@fastify/static/types/index.test-d.ts +1 -1
  455. package/node_modules/content-disposition/README.md +21 -22
  456. package/node_modules/content-disposition/index.js +122 -44
  457. package/node_modules/content-disposition/package.json +16 -20
  458. package/node_modules/glob/README.md +39 -130
  459. package/node_modules/glob/dist/commonjs/glob.d.ts +8 -0
  460. package/node_modules/glob/dist/commonjs/glob.d.ts.map +1 -1
  461. package/node_modules/glob/dist/commonjs/glob.js +2 -1
  462. package/node_modules/glob/dist/commonjs/glob.js.map +1 -1
  463. package/node_modules/glob/dist/commonjs/index.min.js +4 -0
  464. package/node_modules/glob/dist/commonjs/index.min.js.map +7 -0
  465. package/node_modules/glob/dist/commonjs/pattern.d.ts +3 -0
  466. package/node_modules/glob/dist/commonjs/pattern.d.ts.map +1 -1
  467. package/node_modules/glob/dist/commonjs/pattern.js +4 -0
  468. package/node_modules/glob/dist/commonjs/pattern.js.map +1 -1
  469. package/node_modules/glob/dist/esm/glob.d.ts +8 -0
  470. package/node_modules/glob/dist/esm/glob.d.ts.map +1 -1
  471. package/node_modules/glob/dist/esm/glob.js +2 -1
  472. package/node_modules/glob/dist/esm/glob.js.map +1 -1
  473. package/node_modules/glob/dist/esm/index.min.js +4 -0
  474. package/node_modules/glob/dist/esm/index.min.js.map +7 -0
  475. package/node_modules/glob/dist/esm/pattern.d.ts +3 -0
  476. package/node_modules/glob/dist/esm/pattern.d.ts.map +1 -1
  477. package/node_modules/glob/dist/esm/pattern.js +4 -0
  478. package/node_modules/glob/dist/esm/pattern.js.map +1 -1
  479. package/node_modules/glob/package.json +38 -37
  480. package/node_modules/jishushell-panel/README.md +4 -4
  481. package/node_modules/jishushell-panel/output/dist/server.js +17 -6
  482. package/node_modules/jishushell-panel/output/dist/server.js.map +1 -1
  483. package/node_modules/jishushell-panel/output/public/assets/ApiKeyField-NKcbHjNz.js +1 -0
  484. package/node_modules/jishushell-panel/output/public/assets/Dashboard-Da1fL38t.js +1 -0
  485. package/node_modules/jishushell-panel/output/public/assets/HermesChatPanel-DZvmYsoh.js +1 -0
  486. package/node_modules/jishushell-panel/output/public/assets/HermesConfigForm-BLUWlKwm.js +4 -0
  487. package/node_modules/jishushell-panel/output/public/assets/InitPassword-BAKsshzk.js +1 -0
  488. package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-Dgyc_TX5.js +14 -0
  489. package/node_modules/jishushell-panel/output/public/assets/Login-DHeOmwI8.js +1 -0
  490. package/node_modules/jishushell-panel/output/public/assets/NewInstance-CIy0cYtp.js +1 -0
  491. package/node_modules/jishushell-panel/output/public/assets/ProviderRecommendations-H0ByEYF0.js +1 -0
  492. package/node_modules/jishushell-panel/output/public/assets/Settings-DAT-UMfP.js +1 -0
  493. package/node_modules/jishushell-panel/output/public/assets/Setup-g3uckFYR.js +1 -0
  494. package/node_modules/jishushell-panel/output/public/assets/WeixinLoginPanel-D-T6BxkQ.js +1 -0
  495. package/node_modules/jishushell-panel/output/public/assets/api-C70Gt678.js +4 -0
  496. package/node_modules/jishushell-panel/output/public/assets/index-DnnqTf7s.css +1 -0
  497. package/node_modules/jishushell-panel/output/public/assets/index-ERt6_ngA.js +23 -0
  498. package/node_modules/jishushell-panel/output/public/assets/registry-DF93EzIb.js +2 -0
  499. package/node_modules/jishushell-panel/output/public/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  500. package/node_modules/jishushell-panel/output/public/assets/setup-task-q21GnI0E.js +1 -0
  501. package/node_modules/jishushell-panel/output/public/assets/usePolling-DeoThIQn.js +1 -0
  502. package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-CS8DFbkQ.js +1 -0
  503. package/node_modules/jishushell-panel/output/public/assets/vendor-react-Cc84NArf.js +8 -0
  504. package/node_modules/jishushell-panel/output/public/index.html +6 -4
  505. package/node_modules/jishushell-panel/package.json +2 -2
  506. package/node_modules/semver/classes/range.js +11 -2
  507. package/node_modules/semver/package.json +2 -2
  508. package/package.json +12 -64
  509. package/scripts/check-app-path-boundaries.mjs +121 -0
  510. package/scripts/check-app-spec.mjs +127 -25
  511. package/scripts/check-colima-launchd.mjs +10 -8
  512. package/scripts/check-integration-isolation.ts +541 -0
  513. package/scripts/check-new-file-tests.mjs +11 -3
  514. package/scripts/check-open-core-boundaries.mjs +60 -10
  515. package/scripts/check-test-layering.sh +1 -1
  516. package/scripts/fixtures/instances/hermes-sample/instance.json +3 -2
  517. package/scripts/fixtures/instances/legacy-openclaw-sample/instance.json +1 -1
  518. package/scripts/local-web-upgrade-test.README +4 -3
  519. package/scripts/local-web-upgrade-test.example.env +2 -2
  520. package/scripts/local-web-upgrade-test.sh +14 -1
  521. package/scripts/pack-gui-and-send-pi.sh +41 -0
  522. package/scripts/perf/instances.js +1 -1
  523. package/scripts/prune-open-core-dist.mjs +89 -2
  524. package/scripts/smoke/hermes-bootstrap.sh +5 -5
  525. package/templates/hermes-entrypoint.sh +19 -29
  526. package/apps/openwebui-container.yaml +0 -97
  527. package/apps/playwright-container.yaml +0 -126
  528. package/dependencies/jishushell-panel-0.6.5.tgz +0 -0
  529. package/dist/crypto-shim.d.ts +0 -1
  530. package/dist/crypto-shim.js +0 -2
  531. package/dist/crypto-shim.js.map +0 -1
  532. package/dist/routes/agent-apps.d.ts +0 -14
  533. package/dist/routes/agent-apps.js +0 -77
  534. package/dist/routes/agent-apps.js.map +0 -1
  535. package/dist/routes/internal.d.ts +0 -2
  536. package/dist/routes/internal.js +0 -55
  537. package/dist/routes/internal.js.map +0 -1
  538. package/dist/routes/openclaw-routes.d.ts +0 -22
  539. package/dist/routes/openclaw-routes.js +0 -1020
  540. package/dist/routes/openclaw-routes.js.map +0 -1
  541. package/dist/routes/runtime.d.ts +0 -15
  542. package/dist/routes/runtime.js +0 -76
  543. package/dist/routes/runtime.js.map +0 -1
  544. package/dist/services/agent-apps/catalog.d.ts +0 -33
  545. package/dist/services/agent-apps/catalog.js +0 -88
  546. package/dist/services/agent-apps/catalog.js.map +0 -1
  547. package/dist/services/agent-apps/index.d.ts +0 -36
  548. package/dist/services/agent-apps/index.js +0 -171
  549. package/dist/services/agent-apps/index.js.map +0 -1
  550. package/dist/services/agent-apps/installers/adapter-probes.d.ts +0 -49
  551. package/dist/services/agent-apps/installers/adapter-probes.js +0 -230
  552. package/dist/services/agent-apps/installers/adapter-probes.js.map +0 -1
  553. package/dist/services/agent-apps/installers/adapter.d.ts +0 -30
  554. package/dist/services/agent-apps/installers/adapter.js +0 -171
  555. package/dist/services/agent-apps/installers/adapter.js.map +0 -1
  556. package/dist/services/agent-apps/installers/registry-probe.js.map +0 -1
  557. package/dist/services/agent-apps/installers/shell-script.d.ts +0 -47
  558. package/dist/services/agent-apps/installers/shell-script.js +0 -488
  559. package/dist/services/agent-apps/installers/shell-script.js.map +0 -1
  560. package/dist/services/agent-apps/types.d.ts +0 -128
  561. package/dist/services/agent-apps/types.js +0 -17
  562. package/dist/services/agent-apps/types.js.map +0 -1
  563. package/dist/services/app/app-compiler.js +0 -185
  564. package/dist/services/app/app-compiler.js.map +0 -1
  565. package/dist/services/app/app-manager.d.ts +0 -184
  566. package/dist/services/app/app-manager.js +0 -2933
  567. package/dist/services/app/app-manager.js.map +0 -1
  568. package/dist/services/app/custom-manager.d.ts +0 -27
  569. package/dist/services/app/custom-manager.js +0 -382
  570. package/dist/services/app/custom-manager.js.map +0 -1
  571. package/dist/services/app/hermes-agent-manager.d.ts +0 -20
  572. package/dist/services/app/hermes-agent-manager.js +0 -299
  573. package/dist/services/app/hermes-agent-manager.js.map +0 -1
  574. package/dist/services/app/id-normalizer.d.ts +0 -27
  575. package/dist/services/app/id-normalizer.js +0 -77
  576. package/dist/services/app/id-normalizer.js.map +0 -1
  577. package/dist/services/app/ollama-manager.d.ts +0 -18
  578. package/dist/services/app/ollama-manager.js +0 -224
  579. package/dist/services/app/ollama-manager.js.map +0 -1
  580. package/dist/services/app/openclaw-manager.d.ts +0 -63
  581. package/dist/services/app/openclaw-manager.js +0 -1215
  582. package/dist/services/app/openclaw-manager.js.map +0 -1
  583. package/dist/services/app/paths.d.ts +0 -27
  584. package/dist/services/app/paths.js +0 -40
  585. package/dist/services/app/paths.js.map +0 -1
  586. package/dist/services/app/platform-transform.d.ts +0 -32
  587. package/dist/services/app/platform-transform.js +0 -65
  588. package/dist/services/app/platform-transform.js.map +0 -1
  589. package/dist/services/app/provide-resolver.d.ts +0 -29
  590. package/dist/services/app/provide-resolver.js +0 -135
  591. package/dist/services/app/provide-resolver.js.map +0 -1
  592. package/dist/services/app/registry.d.ts +0 -17
  593. package/dist/services/app/registry.js +0 -31
  594. package/dist/services/app/registry.js.map +0 -1
  595. package/dist/services/app/remote-spec.d.ts +0 -14
  596. package/dist/services/app/remote-spec.js +0 -58
  597. package/dist/services/app/remote-spec.js.map +0 -1
  598. package/dist/services/app/terminal-session-manager.js +0 -157
  599. package/dist/services/app/terminal-session-manager.js.map +0 -1
  600. package/dist/services/app/types.d.ts +0 -74
  601. package/dist/services/app/types.js +0 -16
  602. package/dist/services/app/types.js.map +0 -1
  603. package/dist/services/app-config-admin.d.ts +0 -17
  604. package/dist/services/app-config-admin.js +0 -177
  605. package/dist/services/app-config-admin.js.map +0 -1
  606. package/dist/services/app-create-from-installed.d.ts +0 -23
  607. package/dist/services/app-create-from-installed.js +0 -75
  608. package/dist/services/app-create-from-installed.js.map +0 -1
  609. package/dist/services/app-passwords.js +0 -173
  610. package/dist/services/app-passwords.js.map +0 -1
  611. package/dist/services/backup-admin.d.ts +0 -101
  612. package/dist/services/backup-admin.js +0 -259
  613. package/dist/services/backup-admin.js.map +0 -1
  614. package/dist/services/backup-manager.d.ts +0 -264
  615. package/dist/services/backup-manager.js +0 -2263
  616. package/dist/services/backup-manager.js.map +0 -1
  617. package/dist/services/backup-verify.js +0 -240
  618. package/dist/services/backup-verify.js.map +0 -1
  619. package/dist/services/capability-endpoint-validator.d.ts +0 -41
  620. package/dist/services/capability-endpoint-validator.js +0 -114
  621. package/dist/services/capability-endpoint-validator.js.map +0 -1
  622. package/dist/services/capability-health.d.ts +0 -16
  623. package/dist/services/capability-health.js +0 -121
  624. package/dist/services/capability-health.js.map +0 -1
  625. package/dist/services/capability-registry.d.ts +0 -29
  626. package/dist/services/capability-registry.js +0 -176
  627. package/dist/services/capability-registry.js.map +0 -1
  628. package/dist/services/capability-sync.d.ts +0 -4
  629. package/dist/services/capability-sync.js +0 -220
  630. package/dist/services/capability-sync.js.map +0 -1
  631. package/dist/services/connection-admin.d.ts +0 -74
  632. package/dist/services/connection-admin.js +0 -287
  633. package/dist/services/connection-admin.js.map +0 -1
  634. package/dist/services/connection-apply.d.ts +0 -91
  635. package/dist/services/connection-apply.js +0 -471
  636. package/dist/services/connection-apply.js.map +0 -1
  637. package/dist/services/connection-resolver.d.ts +0 -65
  638. package/dist/services/connection-resolver.js +0 -281
  639. package/dist/services/connection-resolver.js.map +0 -1
  640. package/dist/services/connection-transactor.d.ts +0 -39
  641. package/dist/services/connection-transactor.js +0 -354
  642. package/dist/services/connection-transactor.js.map +0 -1
  643. package/dist/services/core-manager.d.ts +0 -50
  644. package/dist/services/core-manager.js +0 -411
  645. package/dist/services/core-manager.js.map +0 -1
  646. package/dist/services/external-mounts.js +0 -187
  647. package/dist/services/external-mounts.js.map +0 -1
  648. package/dist/services/files-manager.d.ts +0 -252
  649. package/dist/services/files-manager.js +0 -1156
  650. package/dist/services/files-manager.js.map +0 -1
  651. package/dist/services/files-mounts.d.ts +0 -42
  652. package/dist/services/files-mounts.js +0 -207
  653. package/dist/services/files-mounts.js.map +0 -1
  654. package/dist/services/instance-admin.d.ts +0 -26
  655. package/dist/services/instance-admin.js +0 -218
  656. package/dist/services/instance-admin.js.map +0 -1
  657. package/dist/services/instance-manager.d.ts +0 -192
  658. package/dist/services/instance-manager.js +0 -1289
  659. package/dist/services/instance-manager.js.map +0 -1
  660. package/dist/services/macos-launchd.js +0 -312
  661. package/dist/services/macos-launchd.js.map +0 -1
  662. package/dist/services/nomad-manager.d.ts +0 -307
  663. package/dist/services/nomad-manager.js +0 -3958
  664. package/dist/services/nomad-manager.js.map +0 -1
  665. package/dist/services/organize/applier.js +0 -218
  666. package/dist/services/organize/applier.js.map +0 -1
  667. package/dist/services/organize/rules.js +0 -286
  668. package/dist/services/organize/rules.js.map +0 -1
  669. package/dist/services/organize/scanner.js +0 -366
  670. package/dist/services/organize/scanner.js.map +0 -1
  671. package/dist/services/organize/store.js +0 -82
  672. package/dist/services/organize/store.js.map +0 -1
  673. package/dist/services/plugin-installer.js +0 -128
  674. package/dist/services/plugin-installer.js.map +0 -1
  675. package/dist/services/process-manager.d.ts +0 -25
  676. package/dist/services/process-manager.js +0 -568
  677. package/dist/services/process-manager.js.map +0 -1
  678. package/dist/services/runtime/adapters/custom.d.ts +0 -20
  679. package/dist/services/runtime/adapters/custom.js +0 -188
  680. package/dist/services/runtime/adapters/custom.js.map +0 -1
  681. package/dist/services/runtime/adapters/hermes.d.ts +0 -204
  682. package/dist/services/runtime/adapters/hermes.js +0 -1684
  683. package/dist/services/runtime/adapters/hermes.js.map +0 -1
  684. package/dist/services/runtime/adapters/openclaw-mcporter.d.ts +0 -45
  685. package/dist/services/runtime/adapters/openclaw-mcporter.js +0 -108
  686. package/dist/services/runtime/adapters/openclaw-mcporter.js.map +0 -1
  687. package/dist/services/runtime/adapters/openclaw.d.ts +0 -426
  688. package/dist/services/runtime/adapters/openclaw.js +0 -3975
  689. package/dist/services/runtime/adapters/openclaw.js.map +0 -1
  690. package/dist/services/runtime/index.d.ts +0 -34
  691. package/dist/services/runtime/index.js +0 -51
  692. package/dist/services/runtime/index.js.map +0 -1
  693. package/dist/services/runtime/mcp-shims/anythingllm-shim.d.ts +0 -46
  694. package/dist/services/runtime/mcp-shims/anythingllm-shim.js +0 -281
  695. package/dist/services/runtime/mcp-shims/anythingllm-shim.js.map +0 -1
  696. package/dist/services/runtime/mcp-shims/drive-shim.js +0 -490
  697. package/dist/services/runtime/mcp-shims/drive-shim.js.map +0 -1
  698. package/dist/services/runtime/mcp-shims/jishukb-shim.d.ts +0 -48
  699. package/dist/services/runtime/mcp-shims/jishukb-shim.js +0 -723
  700. package/dist/services/runtime/mcp-shims/jishukb-shim.js.map +0 -1
  701. package/dist/services/runtime/mcp-shims/mcporter-lite.js +0 -276
  702. package/dist/services/runtime/mcp-shims/mcporter-lite.js.map +0 -1
  703. package/dist/services/runtime/migrations.d.ts +0 -23
  704. package/dist/services/runtime/migrations.js +0 -125
  705. package/dist/services/runtime/migrations.js.map +0 -1
  706. package/dist/services/runtime/registry.d.ts +0 -13
  707. package/dist/services/runtime/registry.js +0 -32
  708. package/dist/services/runtime/registry.js.map +0 -1
  709. package/dist/services/runtime-identity.d.ts +0 -13
  710. package/dist/services/runtime-identity.js +0 -166
  711. package/dist/services/runtime-identity.js.map +0 -1
  712. package/dist/services/runtime-repair.d.ts +0 -52
  713. package/dist/services/runtime-repair.js +0 -352
  714. package/dist/services/runtime-repair.js.map +0 -1
  715. package/dist/services/setup-manager.d.ts +0 -158
  716. package/dist/services/setup-manager.js +0 -2740
  717. package/dist/services/setup-manager.js.map +0 -1
  718. package/dist/services/suggestions.d.ts +0 -27
  719. package/dist/services/suggestions.js +0 -133
  720. package/dist/services/suggestions.js.map +0 -1
  721. package/dist/services/system-monitor.js +0 -79
  722. package/dist/services/system-monitor.js.map +0 -1
  723. package/dist/services/system-ollama-provider.d.ts +0 -14
  724. package/dist/services/system-ollama-provider.js +0 -125
  725. package/dist/services/system-ollama-provider.js.map +0 -1
  726. package/dist/services/system-reconciler.d.ts +0 -72
  727. package/dist/services/system-reconciler.js +0 -600
  728. package/dist/services/system-reconciler.js.map +0 -1
  729. package/dist/services/task-registry.d.ts +0 -44
  730. package/dist/services/task-registry.js +0 -76
  731. package/dist/services/task-registry.js.map +0 -1
  732. package/dist/services/types-shim.d.ts +0 -16
  733. package/dist/services/types-shim.js +0 -2
  734. package/dist/services/types-shim.js.map +0 -1
  735. package/dist/services/update-manager.d.ts +0 -47
  736. package/dist/services/update-manager.js +0 -351
  737. package/dist/services/update-manager.js.map +0 -1
  738. package/dist/services/webdav/server.d.ts +0 -24
  739. package/dist/services/webdav/server.js +0 -420
  740. package/dist/services/webdav/server.js.map +0 -1
  741. package/dist/services/webdav/xml-builder.js.map +0 -1
  742. package/dist/services/workspace-builder.d.ts +0 -29
  743. package/dist/services/workspace-builder.js +0 -188
  744. package/dist/services/workspace-builder.js.map +0 -1
  745. package/node_modules/@fastify/static/.github/stale.yml +0 -21
  746. package/node_modules/@isaacs/cliui/LICENSE.md +0 -63
  747. package/node_modules/@isaacs/cliui/README.md +0 -151
  748. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.d.ts +0 -4
  749. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.d.ts.map +0 -1
  750. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.js +0 -16
  751. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.js.map +0 -1
  752. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.d.ts +0 -34
  753. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.d.ts.map +0 -1
  754. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.js +0 -170
  755. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.js.map +0 -1
  756. package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.d.ts +0 -6
  757. package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.d.ts.map +0 -1
  758. package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.js +0 -307
  759. package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.js.map +0 -1
  760. package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.d.ts +0 -2
  761. package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.d.ts.map +0 -1
  762. package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.js +0 -7
  763. package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.js.map +0 -1
  764. package/node_modules/@isaacs/cliui/dist/commonjs/index.d.ts +0 -41
  765. package/node_modules/@isaacs/cliui/dist/commonjs/index.d.ts.map +0 -1
  766. package/node_modules/@isaacs/cliui/dist/commonjs/index.js +0 -322
  767. package/node_modules/@isaacs/cliui/dist/commonjs/index.js.map +0 -1
  768. package/node_modules/@isaacs/cliui/dist/commonjs/index.min.js +0 -12
  769. package/node_modules/@isaacs/cliui/dist/commonjs/index.min.js.map +0 -7
  770. package/node_modules/@isaacs/cliui/dist/commonjs/package.json +0 -3
  771. package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.d.ts +0 -5
  772. package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.d.ts.map +0 -1
  773. package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.js +0 -49
  774. package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.js.map +0 -1
  775. package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.d.ts +0 -2
  776. package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.d.ts.map +0 -1
  777. package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.js +0 -8
  778. package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.js.map +0 -1
  779. package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.d.ts +0 -7
  780. package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.d.ts.map +0 -1
  781. package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.js +0 -176
  782. package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.js.map +0 -1
  783. package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.d.ts +0 -4
  784. package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.d.ts.map +0 -1
  785. package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.js +0 -12
  786. package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.js.map +0 -1
  787. package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.d.ts +0 -34
  788. package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.d.ts.map +0 -1
  789. package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.js +0 -167
  790. package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.js.map +0 -1
  791. package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.d.ts +0 -6
  792. package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.d.ts.map +0 -1
  793. package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.js +0 -299
  794. package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.js.map +0 -1
  795. package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.d.ts +0 -2
  796. package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.d.ts.map +0 -1
  797. package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.js +0 -3
  798. package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.js.map +0 -1
  799. package/node_modules/@isaacs/cliui/dist/esm/index.d.ts +0 -41
  800. package/node_modules/@isaacs/cliui/dist/esm/index.d.ts.map +0 -1
  801. package/node_modules/@isaacs/cliui/dist/esm/index.js +0 -317
  802. package/node_modules/@isaacs/cliui/dist/esm/index.js.map +0 -1
  803. package/node_modules/@isaacs/cliui/dist/esm/index.min.js +0 -12
  804. package/node_modules/@isaacs/cliui/dist/esm/index.min.js.map +0 -7
  805. package/node_modules/@isaacs/cliui/dist/esm/package.json +0 -3
  806. package/node_modules/@isaacs/cliui/dist/esm/string-width/index.d.ts +0 -5
  807. package/node_modules/@isaacs/cliui/dist/esm/string-width/index.d.ts.map +0 -1
  808. package/node_modules/@isaacs/cliui/dist/esm/string-width/index.js +0 -46
  809. package/node_modules/@isaacs/cliui/dist/esm/string-width/index.js.map +0 -1
  810. package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.d.ts +0 -2
  811. package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.d.ts.map +0 -1
  812. package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.js +0 -4
  813. package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.js.map +0 -1
  814. package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.d.ts +0 -7
  815. package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.d.ts.map +0 -1
  816. package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.js +0 -172
  817. package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.js.map +0 -1
  818. package/node_modules/@isaacs/cliui/package.json +0 -163
  819. package/node_modules/content-disposition/HISTORY.md +0 -60
  820. package/node_modules/cross-spawn/LICENSE +0 -21
  821. package/node_modules/cross-spawn/README.md +0 -89
  822. package/node_modules/cross-spawn/index.js +0 -39
  823. package/node_modules/cross-spawn/lib/enoent.js +0 -59
  824. package/node_modules/cross-spawn/lib/parse.js +0 -91
  825. package/node_modules/cross-spawn/lib/util/escape.js +0 -47
  826. package/node_modules/cross-spawn/lib/util/readShebang.js +0 -23
  827. package/node_modules/cross-spawn/lib/util/resolveCommand.js +0 -52
  828. package/node_modules/cross-spawn/package.json +0 -73
  829. package/node_modules/foreground-child/LICENSE +0 -15
  830. package/node_modules/foreground-child/README.md +0 -128
  831. package/node_modules/foreground-child/dist/commonjs/all-signals.d.ts +0 -2
  832. package/node_modules/foreground-child/dist/commonjs/all-signals.d.ts.map +0 -1
  833. package/node_modules/foreground-child/dist/commonjs/all-signals.js +0 -58
  834. package/node_modules/foreground-child/dist/commonjs/all-signals.js.map +0 -1
  835. package/node_modules/foreground-child/dist/commonjs/index.d.ts +0 -58
  836. package/node_modules/foreground-child/dist/commonjs/index.d.ts.map +0 -1
  837. package/node_modules/foreground-child/dist/commonjs/index.js +0 -123
  838. package/node_modules/foreground-child/dist/commonjs/index.js.map +0 -1
  839. package/node_modules/foreground-child/dist/commonjs/package.json +0 -3
  840. package/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts +0 -6
  841. package/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts.map +0 -1
  842. package/node_modules/foreground-child/dist/commonjs/proxy-signals.js +0 -38
  843. package/node_modules/foreground-child/dist/commonjs/proxy-signals.js.map +0 -1
  844. package/node_modules/foreground-child/dist/commonjs/watchdog.d.ts +0 -10
  845. package/node_modules/foreground-child/dist/commonjs/watchdog.d.ts.map +0 -1
  846. package/node_modules/foreground-child/dist/commonjs/watchdog.js +0 -50
  847. package/node_modules/foreground-child/dist/commonjs/watchdog.js.map +0 -1
  848. package/node_modules/foreground-child/dist/esm/all-signals.d.ts +0 -2
  849. package/node_modules/foreground-child/dist/esm/all-signals.d.ts.map +0 -1
  850. package/node_modules/foreground-child/dist/esm/all-signals.js +0 -52
  851. package/node_modules/foreground-child/dist/esm/all-signals.js.map +0 -1
  852. package/node_modules/foreground-child/dist/esm/index.d.ts +0 -58
  853. package/node_modules/foreground-child/dist/esm/index.d.ts.map +0 -1
  854. package/node_modules/foreground-child/dist/esm/index.js +0 -115
  855. package/node_modules/foreground-child/dist/esm/index.js.map +0 -1
  856. package/node_modules/foreground-child/dist/esm/package.json +0 -3
  857. package/node_modules/foreground-child/dist/esm/proxy-signals.d.ts +0 -6
  858. package/node_modules/foreground-child/dist/esm/proxy-signals.d.ts.map +0 -1
  859. package/node_modules/foreground-child/dist/esm/proxy-signals.js +0 -34
  860. package/node_modules/foreground-child/dist/esm/proxy-signals.js.map +0 -1
  861. package/node_modules/foreground-child/dist/esm/watchdog.d.ts +0 -10
  862. package/node_modules/foreground-child/dist/esm/watchdog.d.ts.map +0 -1
  863. package/node_modules/foreground-child/dist/esm/watchdog.js +0 -46
  864. package/node_modules/foreground-child/dist/esm/watchdog.js.map +0 -1
  865. package/node_modules/foreground-child/package.json +0 -106
  866. package/node_modules/glob/dist/esm/bin.d.mts +0 -3
  867. package/node_modules/glob/dist/esm/bin.d.mts.map +0 -1
  868. package/node_modules/glob/dist/esm/bin.mjs +0 -346
  869. package/node_modules/glob/dist/esm/bin.mjs.map +0 -1
  870. package/node_modules/isexe/.npmignore +0 -2
  871. package/node_modules/isexe/LICENSE +0 -15
  872. package/node_modules/isexe/README.md +0 -51
  873. package/node_modules/isexe/index.js +0 -57
  874. package/node_modules/isexe/mode.js +0 -41
  875. package/node_modules/isexe/package.json +0 -31
  876. package/node_modules/isexe/test/basic.js +0 -221
  877. package/node_modules/isexe/windows.js +0 -42
  878. package/node_modules/jackspeak/LICENSE.md +0 -55
  879. package/node_modules/jackspeak/README.md +0 -394
  880. package/node_modules/jackspeak/dist/commonjs/index.d.ts +0 -323
  881. package/node_modules/jackspeak/dist/commonjs/index.d.ts.map +0 -1
  882. package/node_modules/jackspeak/dist/commonjs/index.js +0 -944
  883. package/node_modules/jackspeak/dist/commonjs/index.js.map +0 -1
  884. package/node_modules/jackspeak/dist/commonjs/index.min.js +0 -33
  885. package/node_modules/jackspeak/dist/commonjs/index.min.js.map +0 -7
  886. package/node_modules/jackspeak/dist/commonjs/package.json +0 -3
  887. package/node_modules/jackspeak/dist/esm/index.d.ts +0 -323
  888. package/node_modules/jackspeak/dist/esm/index.d.ts.map +0 -1
  889. package/node_modules/jackspeak/dist/esm/index.js +0 -936
  890. package/node_modules/jackspeak/dist/esm/index.js.map +0 -1
  891. package/node_modules/jackspeak/dist/esm/index.min.js +0 -33
  892. package/node_modules/jackspeak/dist/esm/index.min.js.map +0 -7
  893. package/node_modules/jackspeak/dist/esm/package.json +0 -3
  894. package/node_modules/jackspeak/package.json +0 -115
  895. package/node_modules/jishushell-panel/output/public/assets/ApiKeyField-D1i7zWXR.js +0 -1
  896. package/node_modules/jishushell-panel/output/public/assets/Dashboard-sWIvL43F.js +0 -1
  897. package/node_modules/jishushell-panel/output/public/assets/HermesChatPanel-DQ8RyvQY.js +0 -1
  898. package/node_modules/jishushell-panel/output/public/assets/HermesConfigForm-tIbPP1sB.js +0 -4
  899. package/node_modules/jishushell-panel/output/public/assets/InitPassword-C3Slq3Dd.js +0 -1
  900. package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-7JqY9tq4.js +0 -92
  901. package/node_modules/jishushell-panel/output/public/assets/Login-BXLDJlQN.js +0 -1
  902. package/node_modules/jishushell-panel/output/public/assets/NewInstance-dLc5Xrpx.js +0 -1
  903. package/node_modules/jishushell-panel/output/public/assets/ProviderRecommendations-DIAXxesl.js +0 -1
  904. package/node_modules/jishushell-panel/output/public/assets/Settings-Bd5utbBh.js +0 -1
  905. package/node_modules/jishushell-panel/output/public/assets/Setup-Yn9_20FL.js +0 -1
  906. package/node_modules/jishushell-panel/output/public/assets/WeixinLoginPanel-C21doQTJ.js +0 -9
  907. package/node_modules/jishushell-panel/output/public/assets/index-CCkaIEjn.js +0 -20
  908. package/node_modules/jishushell-panel/output/public/assets/index-D7qxy-Vh.css +0 -1
  909. package/node_modules/jishushell-panel/output/public/assets/registry-B2ZQZXWL.js +0 -2
  910. package/node_modules/jishushell-panel/output/public/assets/usePolling-BFZm4do_.js +0 -1
  911. package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-DqPtOicc.js +0 -9
  912. package/node_modules/jishushell-panel/output/public/assets/vendor-react-DW5juQin.js +0 -59
  913. package/node_modules/package-json-from-dist/LICENSE.md +0 -63
  914. package/node_modules/package-json-from-dist/README.md +0 -110
  915. package/node_modules/package-json-from-dist/dist/commonjs/index.d.ts +0 -89
  916. package/node_modules/package-json-from-dist/dist/commonjs/index.d.ts.map +0 -1
  917. package/node_modules/package-json-from-dist/dist/commonjs/index.js +0 -134
  918. package/node_modules/package-json-from-dist/dist/commonjs/index.js.map +0 -1
  919. package/node_modules/package-json-from-dist/dist/commonjs/package.json +0 -3
  920. package/node_modules/package-json-from-dist/dist/esm/index.d.ts +0 -89
  921. package/node_modules/package-json-from-dist/dist/esm/index.d.ts.map +0 -1
  922. package/node_modules/package-json-from-dist/dist/esm/index.js +0 -129
  923. package/node_modules/package-json-from-dist/dist/esm/index.js.map +0 -1
  924. package/node_modules/package-json-from-dist/dist/esm/package.json +0 -3
  925. package/node_modules/package-json-from-dist/package.json +0 -68
  926. package/node_modules/path-key/index.d.ts +0 -40
  927. package/node_modules/path-key/index.js +0 -16
  928. package/node_modules/path-key/license +0 -9
  929. package/node_modules/path-key/package.json +0 -39
  930. package/node_modules/path-key/readme.md +0 -61
  931. package/node_modules/safe-buffer/LICENSE +0 -21
  932. package/node_modules/safe-buffer/README.md +0 -584
  933. package/node_modules/safe-buffer/index.d.ts +0 -187
  934. package/node_modules/safe-buffer/index.js +0 -65
  935. package/node_modules/safe-buffer/package.json +0 -51
  936. package/node_modules/shebang-command/index.js +0 -19
  937. package/node_modules/shebang-command/license +0 -9
  938. package/node_modules/shebang-command/package.json +0 -34
  939. package/node_modules/shebang-command/readme.md +0 -34
  940. package/node_modules/shebang-regex/index.d.ts +0 -22
  941. package/node_modules/shebang-regex/index.js +0 -2
  942. package/node_modules/shebang-regex/license +0 -9
  943. package/node_modules/shebang-regex/package.json +0 -35
  944. package/node_modules/shebang-regex/readme.md +0 -33
  945. package/node_modules/signal-exit/LICENSE.txt +0 -16
  946. package/node_modules/signal-exit/README.md +0 -74
  947. package/node_modules/signal-exit/dist/cjs/browser.d.ts +0 -12
  948. package/node_modules/signal-exit/dist/cjs/browser.d.ts.map +0 -1
  949. package/node_modules/signal-exit/dist/cjs/browser.js +0 -10
  950. package/node_modules/signal-exit/dist/cjs/browser.js.map +0 -1
  951. package/node_modules/signal-exit/dist/cjs/index.d.ts +0 -48
  952. package/node_modules/signal-exit/dist/cjs/index.d.ts.map +0 -1
  953. package/node_modules/signal-exit/dist/cjs/index.js +0 -279
  954. package/node_modules/signal-exit/dist/cjs/index.js.map +0 -1
  955. package/node_modules/signal-exit/dist/cjs/package.json +0 -3
  956. package/node_modules/signal-exit/dist/cjs/signals.d.ts +0 -29
  957. package/node_modules/signal-exit/dist/cjs/signals.d.ts.map +0 -1
  958. package/node_modules/signal-exit/dist/cjs/signals.js +0 -42
  959. package/node_modules/signal-exit/dist/cjs/signals.js.map +0 -1
  960. package/node_modules/signal-exit/dist/mjs/browser.d.ts +0 -12
  961. package/node_modules/signal-exit/dist/mjs/browser.d.ts.map +0 -1
  962. package/node_modules/signal-exit/dist/mjs/browser.js +0 -4
  963. package/node_modules/signal-exit/dist/mjs/browser.js.map +0 -1
  964. package/node_modules/signal-exit/dist/mjs/index.d.ts +0 -48
  965. package/node_modules/signal-exit/dist/mjs/index.d.ts.map +0 -1
  966. package/node_modules/signal-exit/dist/mjs/index.js +0 -275
  967. package/node_modules/signal-exit/dist/mjs/index.js.map +0 -1
  968. package/node_modules/signal-exit/dist/mjs/package.json +0 -3
  969. package/node_modules/signal-exit/dist/mjs/signals.d.ts +0 -29
  970. package/node_modules/signal-exit/dist/mjs/signals.d.ts.map +0 -1
  971. package/node_modules/signal-exit/dist/mjs/signals.js +0 -39
  972. package/node_modules/signal-exit/dist/mjs/signals.js.map +0 -1
  973. package/node_modules/signal-exit/package.json +0 -106
  974. package/node_modules/which/CHANGELOG.md +0 -166
  975. package/node_modules/which/LICENSE +0 -15
  976. package/node_modules/which/README.md +0 -54
  977. package/node_modules/which/bin/node-which +0 -52
  978. package/node_modules/which/package.json +0 -43
  979. package/node_modules/which/which.js +0 -125
  980. package/scripts/check-adapter-isolation.ts +0 -293
  981. /package/dist/services/{app → app-common}/app-compiler.d.ts +0 -0
  982. /package/dist/services/{app → app-common}/terminal-session-manager.d.ts +0 -0
  983. /package/dist/services/{backup-verify.d.ts → backup/backup-verify.d.ts} +0 -0
  984. /package/dist/services/{external-mounts.d.ts → files/external-mounts.d.ts} +0 -0
  985. /package/dist/services/{organize → files/organize}/applier.d.ts +0 -0
  986. /package/dist/services/{organize → files/organize}/rules.d.ts +0 -0
  987. /package/dist/services/{organize → files/organize}/scanner.d.ts +0 -0
  988. /package/dist/services/{organize → files/organize}/store.d.ts +0 -0
  989. /package/dist/services/{webdav → files/webdav}/xml-builder.d.ts +0 -0
  990. /package/dist/services/{webdav → files/webdav}/xml-builder.js +0 -0
  991. /package/dist/services/{app-passwords.d.ts → instances/passwords.d.ts} +0 -0
  992. /package/dist/services/{agent-apps → integrations/installable}/installers/registry-probe.d.ts +0 -0
  993. /package/dist/services/{agent-apps → integrations/installable}/installers/registry-probe.js +0 -0
  994. /package/dist/services/{runtime/mcp-shims → integrations/openclaw}/drive-shim.d.ts +0 -0
  995. /package/dist/services/{runtime/mcp-shims → integrations/openclaw}/mcporter-lite.d.ts +0 -0
  996. /package/dist/services/{plugin-installer.d.ts → setup/plugin-installer.d.ts} +0 -0
  997. /package/dist/services/{macos-launchd.d.ts → system/macos-launchd.d.ts} +0 -0
  998. /package/dist/services/{system-monitor.d.ts → system/system-monitor.d.ts} +0 -0
@@ -1,1289 +0,0 @@
1
- import { execFileSync } from "child_process";
2
- import { chownSync, closeSync, existsSync, openSync, readFileSync, readdirSync, renameSync, statSync, } from "fs";
3
- import { rm as rmAsync } from "fs/promises";
4
- import { createServer as netCreateServer } from "net";
5
- import { networkInterfaces, userInfo } from "os";
6
- import { dirname, join, resolve } from "path";
7
- import * as config from "../config.js";
8
- import { safeReadJson, safeWriteJson } from "../utils/safe-json.js";
9
- import { ensureDirContainer, writeSecretFile } from "../utils/fs.js";
10
- // runtime/index.ts gets imported only for framework-level adapter lookups
11
- // (defaultGatewayPort fallback). Adapters statically import BACK into this
12
- // file for primitives; that static cycle is safe because no top-level code
13
- // in adapters references instance-manager exports.
14
- import { getAdapter, resolveAgentType } from "./runtime/index.js";
15
- import { backfillInstanceMeta } from "./runtime/migrations.js";
16
- function getConfigValue(name) {
17
- return name in config ? config[name] : undefined;
18
- }
19
- function resolveConfigPath(value, fallback) {
20
- return typeof value === "string" && value.trim() ? value : fallback;
21
- }
22
- const JISHUSHELL_HOME = resolveConfigPath(getConfigValue("JISHUSHELL_HOME"), resolve(process.env.HOME ?? userInfo().homedir, ".jishushell"));
23
- const APPS_DIR = resolveConfigPath(getConfigValue("APPS_DIR"), join(JISHUSHELL_HOME, "apps"));
24
- const BACKUPS_DIR = resolveConfigPath(getConfigValue("BACKUPS_DIR"), join(JISHUSHELL_HOME, "backups"));
25
- const INSTANCES_DIR = resolveConfigPath(getConfigValue("INSTANCES_DIR"), join(JISHUSHELL_HOME, "instances"));
26
- const getCoreConfigValue = getConfigValue("getCoreConfig");
27
- const _getCoreConfig = typeof getCoreConfigValue === "function"
28
- ? getCoreConfigValue
29
- : () => ({});
30
- const _configChangeListeners = [];
31
- export function onConfigChange(listener) {
32
- _configChangeListeners.push(listener);
33
- return () => {
34
- const idx = _configChangeListeners.indexOf(listener);
35
- if (idx >= 0)
36
- _configChangeListeners.splice(idx, 1);
37
- };
38
- }
39
- /**
40
- * Fire the config-change listener fan-out. Adapters call this after
41
- * `saveNativeConfig()` so LLM proxy / config editors pick up the change.
42
- */
43
- export function notifyConfigChange(instanceId) {
44
- for (const listener of _configChangeListeners) {
45
- try {
46
- listener(instanceId);
47
- }
48
- catch { /* ignore listener errors */ }
49
- }
50
- }
51
- const ENV_KEY_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;
52
- // ── Path helpers (framework-level) ──
53
- //
54
- // Physical definitions live in config.ts alongside INSTANCES_DIR so
55
- // tests that mock instance-manager.js don't lose path resolution. The
56
- // re-exports below preserve the existing import surface.
57
- function appInstanceDir(instanceId) {
58
- return join(APPS_DIR, instanceId);
59
- }
60
- function hasAppInstallMarkers(dir) {
61
- return existsSync(join(dir, "manifest.json")) && existsSync(join(dir, "app-spec.yaml"));
62
- }
63
- function hasIncompleteAppInstallShadow(dir) {
64
- const hasManifest = existsSync(join(dir, "manifest.json"));
65
- const hasSpec = existsSync(join(dir, "app-spec.yaml"));
66
- return (hasManifest || hasSpec) && !(hasManifest && hasSpec);
67
- }
68
- function resolveInstanceRoot(instanceId) {
69
- return appInstanceDir(instanceId);
70
- }
71
- export function instanceDir(instanceId) {
72
- return resolveInstanceRoot(instanceId);
73
- }
74
- export function instanceMetaPath(instanceId) {
75
- return join(instanceDir(instanceId), "instance.json");
76
- }
77
- // §32.2 / §32.8: `defaultOpenclawHome` / `openclawStateDir` /
78
- // `openclawConfigPathInternal` / `legacyOpenclawConfigPath` /
79
- // `getOpenclawHomeInternal` / `defaultModelEnvFile` physically migrated
80
- // into `src/services/runtime/adapters/openclaw.ts`. Callers reach them
81
- // through `getAdapter("openclaw").resolve*()` methods.
82
- // Re-export `defaultModelEnvFile` as a dispatch wrapper for any
83
- // remaining framework callers that need an env file path.
84
- export function defaultModelEnvFile(instanceId) {
85
- return join(instanceDir(instanceId), "model.env");
86
- }
87
- export function normalizePath(p) {
88
- return resolve(p.replace(/^~/, userInfo().homedir));
89
- }
90
- // ── Gateway port helpers ──
91
- // Track in-flight port allocations to prevent race conditions
92
- // between concurrent createInstance() calls.
93
- const _pendingPorts = new Set();
94
- /**
95
- * Read the gateway port out of a persisted runtime record. Tries
96
- * `runtime.ports[]` first (generic framework contract); on miss,
97
- * asks the runtime adapter for its runtime-specific fallback (e.g. OpenClaw's
98
- * `env.OPENCLAW_GATEWAY_PORT` / `args --port N`).
99
- */
100
- export function extractGatewayPort(runtime, agentType) {
101
- if (!runtime)
102
- return null;
103
- // Primary: RuntimeSpec.ports[] declaration. Prefer a port literally named
104
- // "gateway" (the convention OpenClaw / Hermes templates use); otherwise
105
- // fall back to the first declared port. This makes the helper work for
106
- // generic V2 apps (SearXNG = "http", Open WebUI = "http", Ollama =
107
- // "ollama", etc.) without forcing every template to rename its port.
108
- const ports = Array.isArray(runtime.ports) ? runtime.ports : [];
109
- for (const port of ports) {
110
- if (port?.name === "gateway" && Number.isInteger(port.hostPort) && port.hostPort > 0) {
111
- return port.hostPort;
112
- }
113
- }
114
- for (const port of ports) {
115
- if (Number.isInteger(port?.hostPort) && port.hostPort > 0) {
116
- return port.hostPort;
117
- }
118
- }
119
- // Fall back to the adapter's legacy reader. Default agentType "openclaw".
120
- try {
121
- const adapter = getAdapter(agentType || "openclaw");
122
- if (typeof adapter.readLegacyGatewayPort === "function") {
123
- return adapter.readLegacyGatewayPort(runtime);
124
- }
125
- }
126
- catch {
127
- /* adapter not registered — no fallback */
128
- }
129
- return null;
130
- }
131
- function usedGatewayPorts(excludeId) {
132
- const ports = new Set();
133
- for (const inst of listInstances()) {
134
- if (inst.id === excludeId)
135
- continue;
136
- const port = extractGatewayPort(inst.runtime);
137
- if (port)
138
- ports.add(port);
139
- }
140
- return ports;
141
- }
142
- function safePort(port) {
143
- if (!Number.isInteger(port) || port < 1 || port > 65535)
144
- throw new Error(`Invalid port: ${port}`);
145
- return String(port);
146
- }
147
- /**
148
- * Probes whether a port is currently held by any process on the host.
149
- *
150
- * Binds four addresses concurrently — `0.0.0.0`, `127.0.0.1`, `::` (v6-only),
151
- * and `::1` — and treats the port as busy if any probe returns EADDRINUSE.
152
- * The single-`0.0.0.0` probe used by the earlier revision was sufficient on
153
- * Linux (where binding `0.0.0.0` conflicts with any pre-existing loopback
154
- * listener on the same port) but silently passed on macOS, where BSD socket
155
- * semantics let a wildcard v4 bind coexist with a `127.0.0.1` listener. A
156
- * user running a natively-installed openclaw bound to `127.0.0.1:18789`
157
- * would then be invisible to jishushell, so port allocation would assign
158
- * 18789 to a new instance and the gateway would silently fail to bind at
159
- * start time. Probing the loopback addresses directly closes that gap.
160
- */
161
- export function isPortInUse(port) {
162
- if (!Number.isInteger(port) || port < 1 || port > 65535)
163
- return Promise.resolve(false);
164
- const probeAt = (host, opts = {}) => new Promise((resolve) => {
165
- const server = netCreateServer();
166
- server.once("error", (err) => {
167
- if (err?.code === "EADDRINUSE")
168
- return resolve(true);
169
- // EACCES / EADDRNOTAVAIL / ENOTSUP / EINVAL mean we could not even
170
- // attempt the bind (restricted port, address family unsupported on
171
- // this host, etc). Report "not busy" from this probe so one bad
172
- // locus doesn't falsely block the whole port — the other probes
173
- // still cover their respective loci.
174
- if (err?.code && err.code !== "EACCES" && err.code !== "EADDRNOTAVAIL"
175
- && err.code !== "ENOTSUP" && err.code !== "EINVAL" && err.code !== "EAFNOSUPPORT") {
176
- console.warn(`[port-probe] bind ${host}:${port} failed with ${err.code}: ${err.message}; treating locus as free`);
177
- }
178
- resolve(false);
179
- });
180
- server.once("listening", () => {
181
- server.close(() => resolve(false));
182
- });
183
- server.listen({ port, host, ...opts });
184
- });
185
- // Run probes sequentially, not in parallel: two probes on the same port
186
- // collide with each other (the first bind on 0.0.0.0 makes the second
187
- // bind on 127.0.0.1 hit EADDRINUSE), which would make every port look
188
- // busy. Short-circuit on the first busy locus to keep the common case
189
- // (port free) close to single-probe latency.
190
- return (async () => {
191
- const loci = [
192
- ["0.0.0.0", {}],
193
- ["127.0.0.1", {}],
194
- ["::", { ipv6Only: true }],
195
- ["::1", {}],
196
- ];
197
- for (const [host, opts] of loci) {
198
- if (await probeAt(host, opts))
199
- return true;
200
- }
201
- return false;
202
- })();
203
- }
204
- /**
205
- * Kind-agnostic gateway port allocator. Callers (adapters) pass their own
206
- * `defaultPort` — the framework no longer hardcodes OpenClaw / Hermes base
207
- * ports here. Walks upward from `defaultPort` until a free port is found
208
- * that is neither held by an existing instance nor by any process on the
209
- * host. Concurrent callers coordinate via `_pendingPorts`.
210
- *
211
- * Caller must release the allocated port via {@link releasePendingPort}
212
- * after persisting it into instance metadata (or on failure).
213
- */
214
- export async function allocateGatewayPort(instanceId, defaultPort) {
215
- const used = usedGatewayPorts(instanceId);
216
- const skipped = [];
217
- let port = defaultPort;
218
- while (true) {
219
- if (port > 65535) {
220
- throw new Error(`No available gateway port found (all ports ${defaultPort}-65535 in use)`);
221
- }
222
- if (used.has(port) || _pendingPorts.has(port)) {
223
- skipped.push(port);
224
- port++;
225
- continue;
226
- }
227
- // Reserve BEFORE the async isPortInUse check to prevent concurrent callers
228
- // from selecting the same port during the await gap.
229
- _pendingPorts.add(port);
230
- try {
231
- if (await isPortInUse(port)) {
232
- _pendingPorts.delete(port);
233
- skipped.push(port);
234
- port++;
235
- continue;
236
- }
237
- return { port, skipped };
238
- }
239
- catch {
240
- _pendingPorts.delete(port);
241
- // Skip this port on a transient OS error rather than failing the entire
242
- // allocation — a single bad port check should not prevent instance creation.
243
- console.warn(`[instance] Port ${port} availability check failed, trying next port`);
244
- skipped.push(port);
245
- port++;
246
- continue;
247
- }
248
- }
249
- }
250
- /** Release a port previously reserved by {@link allocateGatewayPort}. */
251
- export function releasePendingPort(port) {
252
- _pendingPorts.delete(port);
253
- }
254
- // ── Runtime / config builders ──
255
- export function getResolvedOpenclawBin() {
256
- try {
257
- const a = getAdapter("openclaw");
258
- return typeof a.resolveBin === "function"
259
- ? a.resolveBin()
260
- : "/usr/local/bin/openclaw";
261
- }
262
- catch {
263
- return "/usr/local/bin/openclaw";
264
- }
265
- }
266
- /**
267
- * When jishushell runs as root (e.g. systemd service), returns the actual
268
- * non-root user that should own instance files and run openclaw processes.
269
- * Returns null when not running as root or when no suitable non-root user is found.
270
- */
271
- export function resolveServiceUser() {
272
- if (typeof process.getuid !== "function" || process.getuid() !== 0)
273
- return null;
274
- // SUDO_USER is set when launched via `sudo`
275
- const sudoUser = process.env.SUDO_USER;
276
- if (sudoUser && sudoUser !== "root") {
277
- try {
278
- const uid = parseInt(execFileSync("id", ["-u", sudoUser], { encoding: "utf-8" }).trim(), 10);
279
- const gid = parseInt(execFileSync("id", ["-g", sudoUser], { encoding: "utf-8" }).trim(), 10);
280
- if (!isNaN(uid) && !isNaN(gid))
281
- return { username: sudoUser, uid, gid };
282
- }
283
- catch { /* fall through */ }
284
- }
285
- // Fall back to owner of INSTANCES_DIR or JISHUSHELL_HOME
286
- try {
287
- const target = existsSync(INSTANCES_DIR) ? INSTANCES_DIR : JISHUSHELL_HOME;
288
- const uid = statSync(target).uid;
289
- if (uid !== 0) {
290
- const username = execFileSync("id", ["-un", String(uid)], { encoding: "utf-8" }).trim();
291
- const gid = parseInt(execFileSync("id", ["-g", username], { encoding: "utf-8" }).trim(), 10);
292
- if (!isNaN(gid))
293
- return { username, uid, gid };
294
- }
295
- }
296
- catch { /* fall through */ }
297
- return null;
298
- }
299
- /**
300
- * When running as root, chown a file (and its .bak) to the service user so the
301
- * openclaw process (running as that user) can read/write its own data files.
302
- * No-op when not running as root.
303
- */
304
- export function chownToServiceUser(...paths) {
305
- const svc = resolveServiceUser();
306
- if (!svc)
307
- return;
308
- for (const p of paths) {
309
- for (const f of [p, p + ".bak", p + ".bak.1", p + ".bak.2"]) {
310
- try {
311
- if (existsSync(f))
312
- chownSync(f, svc.uid, svc.gid);
313
- }
314
- catch { /* best effort */ }
315
- }
316
- }
317
- }
318
- // §32.2 / §32.8: buildDefaultRuntime + starterConfig physically migrated
319
- // into src/services/runtime/adapters/openclaw.ts. Framework layer no
320
- // longer owns OpenClaw runtime templates or default config shape.
321
- // ── Env file helpers ──
322
- export function parseEnvFile(path) {
323
- const env = {};
324
- if (!existsSync(path))
325
- return env;
326
- for (let line of readFileSync(path, "utf-8").split("\n")) {
327
- line = line.trim();
328
- if (!line || line.startsWith("#"))
329
- continue;
330
- if (line.startsWith("export "))
331
- line = line.slice(7).trimStart();
332
- if (!line.includes("="))
333
- continue;
334
- const eqIdx = line.indexOf("=");
335
- const key = line.slice(0, eqIdx).trim();
336
- let value = line.slice(eqIdx + 1).trim();
337
- if (!ENV_KEY_RE.test(key))
338
- continue;
339
- if (value.length >= 2 && value[0] === value[value.length - 1] && (value[0] === "'" || value[0] === '"')) {
340
- value = value.slice(1, -1);
341
- }
342
- env[key] = value;
343
- }
344
- return env;
345
- }
346
- function quoteEnvValue(value) {
347
- if (/^[A-Za-z0-9_./:@%+=,-]+$/.test(value))
348
- return value;
349
- return JSON.stringify(value);
350
- }
351
- export function updateEnvFile(path, updates) {
352
- ensureDirContainer(dirname(path));
353
- const existing = existsSync(path) ? readFileSync(path, "utf-8").split("\n") : [];
354
- const remaining = { ...updates };
355
- const newLines = [];
356
- for (const rawLine of existing) {
357
- const stripped = rawLine.trim();
358
- const candidate = stripped.startsWith("export ") ? stripped.slice(7).trimStart() : stripped;
359
- if (!candidate || candidate.startsWith("#") || !candidate.includes("=")) {
360
- newLines.push(rawLine);
361
- continue;
362
- }
363
- const key = candidate.slice(0, candidate.indexOf("=")).trim();
364
- if (!ENV_KEY_RE.test(key) || !(key in remaining)) {
365
- newLines.push(rawLine);
366
- continue;
367
- }
368
- const value = remaining[key];
369
- delete remaining[key];
370
- if (value === "")
371
- continue;
372
- const prefix = stripped.startsWith("export ") ? "export " : "";
373
- newLines.push(`${prefix}${key}=${quoteEnvValue(value)}`);
374
- }
375
- for (const [key, value] of Object.entries(remaining)) {
376
- if (!ENV_KEY_RE.test(key) || value === "")
377
- continue;
378
- newLines.push(`${key}=${quoteEnvValue(value)}`);
379
- }
380
- const output = newLines.join("\n").trimEnd();
381
- const content = output ? output + "\n" : "";
382
- // Atomic write: tmp then rename to protect against RPi power loss
383
- const tmp = path + ".tmp";
384
- writeSecretFile(tmp, content);
385
- renameSync(tmp, path);
386
- chownToServiceUser(path);
387
- }
388
- // ── Provider key helpers ──
389
- export function inferProviderApiKeyEnvName(providerId) {
390
- let normalized = providerId.replace(/[^A-Za-z0-9]+/g, "_").replace(/^_|_$/g, "").toUpperCase();
391
- if (!normalized)
392
- normalized = "OPENCLAW_PROVIDER";
393
- return `${normalized}_API_KEY`;
394
- }
395
- // §32.2 / §32.8: hasConfiguredValue / injectProviderApiKeys /
396
- // applyFeishuDebugAccessDefaults / prepareConfigForSave physically
397
- // migrated into `src/services/runtime/adapters/openclaw.ts`.
398
- // §32.2 / §32.8: Channel plugin helpers (CHANNEL_PLUGIN_MAP,
399
- // installChannelPlugin, stripImBindings, etc.) physically migrated
400
- // into `src/services/runtime/adapters/openclaw.ts`.
401
- // ── Public API ──
402
- /**
403
- * Probe whether a file is readable by the current process. Used to
404
- * distinguish "primary missing / corrupted" (recoverable via safeReadJson's
405
- * .bak chain) from "primary exists but permission denied" (EACCES — the
406
- * common sudo-script footgun that leaves root-owned files). safeReadJson
407
- * swallows every read error internally and returns null, so without this
408
- * probe an unreadable primary looks identical to a truly-gone instance.
409
- */
410
- function probeReadable(path) {
411
- if (!existsSync(path))
412
- return null;
413
- try {
414
- const fd = openSync(path, "r");
415
- closeSync(fd);
416
- return null;
417
- }
418
- catch (e) {
419
- return e;
420
- }
421
- }
422
- export function listInstances() {
423
- const deduped = new Map();
424
- for (const rootDir of [APPS_DIR]) {
425
- if (!existsSync(rootDir))
426
- continue;
427
- const entries = readdirSync(rootDir).sort();
428
- for (const name of entries) {
429
- if (deduped.has(name))
430
- continue;
431
- const metaPath = join(rootDir, name, "instance.json");
432
- const dirPath = join(rootDir, name);
433
- try {
434
- if (!statSync(dirPath).isDirectory())
435
- continue;
436
- if (rootDir === APPS_DIR && hasIncompleteAppInstallShadow(dirPath))
437
- continue;
438
- if (!existsSync(metaPath))
439
- continue;
440
- // Use safeReadJson so primary instance.json that was corrupted or
441
- // deleted mid-rename falls back to the .bak chain maintained by
442
- // safeWriteJson. Without this, an interrupted safeWriteJson call
443
- // would silently drop the instance from every list/get hot path
444
- // even though the backup chain still holds valid content on disk.
445
- const meta = safeReadJson(metaPath, `instance:${name}`);
446
- if (meta) {
447
- const normalised = backfillInstanceMeta(meta);
448
- deduped.set(name, normalised);
449
- continue;
450
- }
451
- // safeReadJson → null can mean any of (a) primary missing + no
452
- // backups, (b) all candidates unparseable, (c) permission denied.
453
- // (a) and (b) are legitimate "drop from list" cases; (c) is the
454
- // sudo-script footgun and must be logged loudly so the operator
455
- // doesn't just see an empty instance list with no hint why.
456
- const readErr = probeReadable(metaPath);
457
- if (readErr && readErr.code === "EACCES") {
458
- console.error(`[instance-manager] cannot read instance '${name}': ${readErr.message}. ` +
459
- `Check file ownership with: ls -la ${metaPath}`);
460
- }
461
- }
462
- catch (e) {
463
- // Fallback for failures before the safeReadJson call (e.g. statSync
464
- // on a directory we can't enter). Still log instead of silently
465
- // dropping the entry.
466
- console.error(`[instance-manager] cannot read instance '${name}': ${e.message}`);
467
- }
468
- }
469
- }
470
- return [...deduped.values()];
471
- }
472
- export function getInstance(instanceId) {
473
- const metaPath = instanceMetaPath(instanceId);
474
- // Go through safeReadJson so primary missing/corrupted instance.json
475
- // is still served from the .bak chain. Returning null on "truly gone"
476
- // (no primary, no backups) keeps the existing 404 behavior intact.
477
- const meta = safeReadJson(metaPath, `instance:${instanceId}`);
478
- if (meta) {
479
- const normalised = backfillInstanceMeta(meta);
480
- return normalised;
481
- }
482
- // safeReadJson swallows every read error internally, which is exactly
483
- // wrong for the EACCES case — a root-owned primary would silently
484
- // return null and callers would report "Instance not found" instead
485
- // of the actionable "check file ownership" message. Re-probe to
486
- // distinguish and throw on permission denial. Missing/corrupted with
487
- // no backup still returns null (→ 404 upstream).
488
- const readErr = probeReadable(metaPath);
489
- if (readErr && readErr.code === "EACCES") {
490
- throw new Error(`Cannot read instance '${instanceId}' metadata: ${readErr.message}. ` +
491
- `Check file ownership with: ls -la ${metaPath}`);
492
- }
493
- return null;
494
- }
495
- // §32.2 / §32.8: `createInstance` physically migrated into
496
- // `src/services/runtime/adapters/openclaw.ts:OpenClawAdapter.createInstance`.
497
- // Framework callers now dispatch via `getAdapter(agentType).createInstance(args)`.
498
- export function updateInstance(instanceId, name, description) {
499
- const meta = getInstance(instanceId);
500
- if (!meta)
501
- return null;
502
- if (name != null)
503
- meta.name = name;
504
- if (description != null)
505
- meta.description = description;
506
- safeWriteJson(instanceMetaPath(instanceId), meta);
507
- chownToServiceUser(instanceMetaPath(instanceId));
508
- return meta;
509
- }
510
- // §32.2 / §32.8: `createHermesInstance` + `InstanceCreationRejected`
511
- // physically migrated into `src/services/runtime/adapters/hermes.ts`
512
- // and `src/services/runtime/errors.ts`. Framework callers dispatch via
513
- // `getAdapter(agentType).createInstance(args)` uniformly.
514
- export function updateInstanceMeta(instanceId, patch) {
515
- const metaPath = instanceMetaPath(instanceId);
516
- const meta = safeReadJson(metaPath, "instance-meta") || {};
517
- Object.assign(meta, patch);
518
- safeWriteJson(metaPath, meta);
519
- chownToServiceUser(metaPath);
520
- }
521
- export async function deleteInstance(instanceId, purgeBackups = false) {
522
- const d = instanceDir(instanceId);
523
- if (!existsSync(d))
524
- return { ok: false, warnings: ["Instance directory not found"] };
525
- const warnings = [];
526
- // Cancel auto-backup timer and any queued jobs for this instance
527
- import("./backup-manager.js").then(({ cancelAutoBackup, getQueueStatus, cancelJob }) => {
528
- cancelAutoBackup(instanceId);
529
- // Cancel queued (not yet running) jobs for this instance
530
- const q = getQueueStatus();
531
- for (const job of q.queued) {
532
- if (job.instanceId === instanceId)
533
- cancelJob(job.id);
534
- }
535
- }).catch(() => { });
536
- // Cache metadata BEFORE deletion so adapters can inspect it after rm.
537
- const meta = getInstance(instanceId);
538
- const agentType = resolveAgentType(meta);
539
- // Adapter-owned pre-delete hook. Adapters use this to emit advisories
540
- // for resources that live outside the instance dir (legacy
541
- // `openclaw_home`, named docker volumes, etc). Errors are collected
542
- // into the response so one adapter misbehaving can't block removal.
543
- try {
544
- const legacyAppType = typeof meta?.app_type === "string" ? meta.app_type.trim() : "";
545
- if ((legacyAppType === "custom" || legacyAppType === "ollama") && meta) {
546
- const { getAppManager } = await import("./app/registry.js");
547
- const manager = getAppManager(legacyAppType);
548
- if (manager.onDelete) {
549
- await manager.onDelete(instanceId);
550
- }
551
- }
552
- else {
553
- const adapter = getAdapter(agentType);
554
- if (adapter.hooks?.onDelete && meta) {
555
- const hookResult = await adapter.hooks.onDelete({ instanceId, meta });
556
- if (hookResult && Array.isArray(hookResult.warnings)) {
557
- warnings.push(...hookResult.warnings);
558
- }
559
- }
560
- }
561
- }
562
- catch (e) {
563
- warnings.push(`adapter onDelete hook failed: ${e.message}`);
564
- }
565
- // Clean up Nomad Variables (async, best-effort)
566
- import("./nomad-manager.js").then((nm) => {
567
- nm.purgeInstanceVariables(instanceId).catch((e) => {
568
- console.warn(`[instance] Failed to purge Nomad variables for ${instanceId}:`, e.message);
569
- });
570
- }).catch((e) => {
571
- console.warn(`[instance] Could not load nomad-manager for cleanup:`, e.message);
572
- });
573
- // Async rm so the Node event loop stays responsive during large deletes:
574
- // a fresh instance with a just-installed openclaw package can be 1+ GB
575
- // with hundreds of nested dirs, which takes 30-60s to unlink on SD storage.
576
- // rmSync would block every other HTTP request for that whole window.
577
- let dirDeleted = false;
578
- try {
579
- await rmAsync(d, { recursive: true, force: true });
580
- dirDeleted = true;
581
- }
582
- catch {
583
- try {
584
- execFileSync("sudo", ["rm", "-rf", d], { timeout: 300000 });
585
- dirDeleted = true;
586
- }
587
- catch (e) {
588
- warnings.push(`Failed to delete instance directory: ${e.message}`);
589
- }
590
- }
591
- // (Custom openclaw_home orphan warning emitted by OpenClawAdapter.hooks.onDelete.)
592
- // Handle backups (stored in separate directory, not affected by the
593
- // instance rm above). Backups can be hundreds of MB each and accumulate
594
- // across retention windows, so use the same async rm path to keep the
595
- // event loop responsive.
596
- const backupDir = join(BACKUPS_DIR, instanceId);
597
- if (purgeBackups && existsSync(backupDir)) {
598
- try {
599
- await rmAsync(backupDir, { recursive: true, force: true });
600
- }
601
- catch (e) {
602
- warnings.push(`Failed to delete backups: ${e.message}`);
603
- }
604
- }
605
- else if (existsSync(backupDir)) {
606
- warnings.push(`Backups preserved at ${backupDir}`);
607
- }
608
- return { ok: dirDeleted, warnings: warnings.length ? warnings : undefined };
609
- }
610
- // §32.2 / §32.8: getConfig / getStoredConfig / saveConfig
611
- // physically migrated into OpenClawAdapter. Framework callers now
612
- // dispatch via `getAdapter(agentType).saveNativeConfig / .getNativeConfig`.
613
- // Adapter dispatch helpers below preserve the public sync API shape for
614
- // existing call sites (llm-proxy, routes, backup-manager).
615
- export function getConfig(instanceId) {
616
- const meta = getInstance(instanceId);
617
- const agentType = resolveAgentType(meta);
618
- try {
619
- const adapter = getAdapter(agentType);
620
- return typeof adapter.getNativeConfig === "function"
621
- ? adapter.getNativeConfig(instanceId)
622
- : null;
623
- }
624
- catch {
625
- return null;
626
- }
627
- }
628
- export function getStoredConfig(instanceId) {
629
- const meta = getInstance(instanceId);
630
- const agentType = resolveAgentType(meta);
631
- try {
632
- const adapter = getAdapter(agentType);
633
- return typeof adapter.getStoredNativeConfig === "function"
634
- ? adapter.getStoredNativeConfig(instanceId)
635
- : null;
636
- }
637
- catch {
638
- return null;
639
- }
640
- }
641
- export async function saveConfig(instanceId, config) {
642
- const meta = getInstance(instanceId);
643
- const agentType = resolveAgentType(meta);
644
- try {
645
- const adapter = getAdapter(agentType);
646
- if (typeof adapter.saveNativeConfig !== "function")
647
- return false;
648
- // Adapters may return boolean or Promise<boolean>. Awaiting a plain
649
- // boolean is a no-op, so this handles both. Previously we stripped the
650
- // Promise and always reported success for async adapters — that masked
651
- // failures and left callers unable to detect dirty state.
652
- const result = await adapter.saveNativeConfig(instanceId, config);
653
- return typeof result === "boolean" ? result : true;
654
- }
655
- catch (e) {
656
- console.warn(`[instance-manager] saveConfig dispatch failed for ${instanceId}: ${e.message}`);
657
- return false;
658
- }
659
- }
660
- // ── OpenClaw adapter dispatch helpers ─────────────────────────────────
661
- //
662
- // The real implementations live in `OpenClawAdapter`. New code should
663
- // use `getAdapter(agentType).X(...)` directly.
664
- /**
665
- * @deprecated Use `getAdapter("openclaw").channelPluginMap` instead.
666
- * Provides the OpenClaw channel-plugin map via a Proxy for direct
667
- * property reads (e.g. `CHANNEL_PLUGIN_MAP.feishu`).
668
- */
669
- export const CHANNEL_PLUGIN_MAP = new Proxy({}, {
670
- get(_target, key) {
671
- if (typeof key !== "string")
672
- return undefined;
673
- try {
674
- return getAdapter("openclaw").channelPluginMap?.[key];
675
- }
676
- catch {
677
- return undefined;
678
- }
679
- },
680
- ownKeys() {
681
- try {
682
- return Reflect.ownKeys(getAdapter("openclaw").channelPluginMap ?? {});
683
- }
684
- catch {
685
- return [];
686
- }
687
- },
688
- has(_target, key) {
689
- if (typeof key !== "string")
690
- return false;
691
- try {
692
- return key in (getAdapter("openclaw").channelPluginMap ?? {});
693
- }
694
- catch {
695
- return false;
696
- }
697
- },
698
- getOwnPropertyDescriptor(_target, key) {
699
- if (typeof key !== "string")
700
- return undefined;
701
- let value;
702
- try {
703
- value = getAdapter("openclaw").channelPluginMap?.[key];
704
- }
705
- catch {
706
- return undefined;
707
- }
708
- return value !== undefined
709
- ? { configurable: true, enumerable: true, writable: false, value }
710
- : undefined;
711
- },
712
- });
713
- /**
714
- * @deprecated Use `getAdapter(agentType).isChannelPluginInstalled(id, channelId)` instead.
715
- */
716
- export function isChannelPluginInstalled(instanceId, channelId) {
717
- try {
718
- const meta = getInstance(instanceId);
719
- const agentType = resolveAgentType(meta);
720
- const adapter = getAdapter(agentType);
721
- return typeof adapter.isChannelPluginInstalled === "function"
722
- ? adapter.isChannelPluginInstalled(instanceId, channelId)
723
- : false;
724
- }
725
- catch {
726
- return false;
727
- }
728
- }
729
- /**
730
- * @deprecated Use `getAdapter(agentType).createInstance({ instanceId, name, description, ... })` instead.
731
- * Forwards to the OpenClawAdapter's `createInstance` method.
732
- */
733
- export async function createInstance(instanceId, name, description, cloneFrom, agentHome, cloneOptions) {
734
- const adapter = getAdapter("openclaw");
735
- if (typeof adapter.createInstance !== "function") {
736
- throw new Error("OpenClawAdapter.createInstance is not available");
737
- }
738
- return adapter.createInstance({
739
- instanceId,
740
- name,
741
- description,
742
- cloneFrom,
743
- agentHome,
744
- cloneOptions,
745
- });
746
- }
747
- // §32.2 / §32.8: saveFeishuCredentials / saveWeixinCredentials /
748
- // getWeixinAccounts / getOpenclawHome physically migrated into
749
- // `src/services/runtime/adapters/openclaw.ts`. Dispatch helpers below keep
750
- // existing callers adapter-agnostic.
751
- export function getOpenclawHome(instanceId) {
752
- const meta = getInstance(instanceId);
753
- const agentType = resolveAgentType(meta);
754
- try {
755
- const a = getAdapter(agentType);
756
- return typeof a.resolveAgentHome === "function"
757
- ? a.resolveAgentHome(instanceId)
758
- : meta?.openclaw_home || join(INSTANCES_DIR, instanceId, "openclaw-home");
759
- }
760
- catch {
761
- return meta?.openclaw_home || join(INSTANCES_DIR, instanceId, "openclaw-home");
762
- }
763
- }
764
- export function saveFeishuCredentials(instanceId, creds) {
765
- const meta = getInstance(instanceId);
766
- const agentType = resolveAgentType(meta);
767
- const a = getAdapter(agentType);
768
- if (typeof a.saveFeishuCredentials !== "function") {
769
- throw new Error(`Runtime "${agentType}" does not support Feishu credentials`);
770
- }
771
- a.saveFeishuCredentials(instanceId, creds);
772
- }
773
- export function saveWeixinCredentials(instanceId, creds) {
774
- const meta = getInstance(instanceId);
775
- const agentType = resolveAgentType(meta);
776
- const a = getAdapter(agentType);
777
- if (typeof a.saveWeixinCredentials !== "function") {
778
- throw new Error(`Runtime "${agentType}" does not support WeChat credentials`);
779
- }
780
- a.saveWeixinCredentials(instanceId, creds);
781
- }
782
- export function getWeixinAccounts(instanceId) {
783
- const meta = getInstance(instanceId);
784
- const agentType = resolveAgentType(meta);
785
- try {
786
- const a = getAdapter(agentType);
787
- return typeof a.getWeixinAccounts === "function"
788
- ? a.getWeixinAccounts(instanceId)
789
- : [];
790
- }
791
- catch {
792
- return [];
793
- }
794
- }
795
- export function getOpenclawConfigPath(instanceId) {
796
- const meta = getInstance(instanceId);
797
- const agentType = resolveAgentType(meta);
798
- const a = getAdapter(agentType);
799
- if (typeof a.resolveConfigPath === "function")
800
- return a.resolveConfigPath(instanceId);
801
- return join(getOpenclawHome(instanceId), ".openclaw", "openclaw.json");
802
- }
803
- export function getLegacyOpenclawConfigPath(instanceId) {
804
- const meta = getInstance(instanceId);
805
- const agentType = resolveAgentType(meta);
806
- const a = getAdapter(agentType);
807
- if (typeof a.resolveLegacyConfigPath === "function")
808
- return a.resolveLegacyConfigPath(instanceId);
809
- return join(getOpenclawHome(instanceId), "openclaw.json");
810
- }
811
- export function getInstanceRuntime(instanceId) {
812
- const meta = getInstance(instanceId);
813
- if (!meta)
814
- return {};
815
- return structuredClone(meta.runtime || {});
816
- }
817
- export function getRuntimeEnvFiles(instanceId) {
818
- const runtime = getInstanceRuntime(instanceId);
819
- const rawEnvFiles = Array.isArray(runtime.env_files)
820
- ? runtime.env_files
821
- : Array.isArray(runtime.envFiles)
822
- ? runtime.envFiles
823
- : [];
824
- const envFiles = rawEnvFiles.map((p) => normalizePath(p)).filter(Boolean);
825
- return envFiles.length ? envFiles : [defaultModelEnvFile(instanceId)];
826
- }
827
- export function getGatewayPort(instanceId) {
828
- const recorded = extractGatewayPort(getInstanceRuntime(instanceId));
829
- if (recorded)
830
- return recorded;
831
- // Fallback: look up the adapter's canonical base port. Framework does
832
- // not hardcode per-kind defaults.
833
- const meta = getInstance(instanceId);
834
- const agentType = resolveAgentType(meta);
835
- try {
836
- return getAdapter(agentType).defaultGatewayPort ?? 18789;
837
- }
838
- catch {
839
- return 18789;
840
- }
841
- }
842
- /**
843
- * Detect the host address where the gateway port is actually listening.
844
- *
845
- * Strategy by driver:
846
- * - raw_exec (Linux/Pi): use `ss` to read the listening address directly.
847
- * - docker (macOS/bridge): Nomad publishes the port on the Nomad client's
848
- * interface IP (e.g. 10.x.x.x), NOT 127.0.0.1. Query the Nomad allocation
849
- * for `AllocatedResources.Shared.Ports[label=gateway].HostIP`.
850
- *
851
- * Result is cached for 30 s to avoid an API call on every proxy request.
852
- */
853
- const _gwHostCache = new Map();
854
- const GW_HOST_CACHE_TTL = 30000;
855
- export function getListeningHostForPort(port) {
856
- // Linux: ss is universal and parses cleanly. macOS/BSD ships lsof but
857
- // not ss, so without this fallback execFileSync throws ENOENT, the
858
- // catch block silently returns 127.0.0.1, and any caller that fans
859
- // out to the wrong host fails (the capability HTTP proxy in
860
- // `proxyProvidedCapability`, the gateway-host fallback for raw_exec
861
- // instances, etc.). On macOS docker driver mode the actual published
862
- // host can be e.g. 10.188.0.21 via `host_network = "external"`, never
863
- // loopback — so silently picking 127.0.0.1 leaves the panel fetching
864
- // a host nothing is listening on.
865
- const safe = safePort(port);
866
- const fromSs = () => {
867
- const hosts = [];
868
- try {
869
- const out = execFileSync("ss", ["-tlnH", "sport", "=", ":" + safe], {
870
- encoding: "utf-8",
871
- timeout: 3000,
872
- stdio: ["pipe", "pipe", "pipe"],
873
- });
874
- for (const line of out.split("\n")) {
875
- let match = line.match(/\s([\d.]+):(\d+)\s/);
876
- if (!match)
877
- match = line.match(/\s\[([0-9a-fA-F:]+)\]:(\d+)\s/);
878
- if (match && match[2] === String(port))
879
- hosts.push(match[1]);
880
- }
881
- }
882
- catch { /* ss not available or no match */ }
883
- return hosts;
884
- };
885
- const fromLsof = () => {
886
- const hosts = [];
887
- try {
888
- // `-FnP` keeps numeric output (no name resolution, no /etc/services).
889
- // Lines beginning with `n` carry the bind address: e.g. `n10.188.0.21:8080`,
890
- // `n127.0.0.1:8080`, `n[::1]:8080`, or `n*:8080` for wildcard binds.
891
- const out = execFileSync("lsof", ["-nP", "-iTCP:" + safe, "-sTCP:LISTEN", "-FnP"], {
892
- encoding: "utf-8",
893
- timeout: 3000,
894
- stdio: ["pipe", "pipe", "pipe"],
895
- });
896
- for (const line of out.split("\n")) {
897
- if (!line.startsWith("n"))
898
- continue;
899
- const body = line.slice(1);
900
- // IPv6 form: [::1]:8080 → strip brackets
901
- const v6 = body.match(/^\[([0-9a-fA-F:]+)\]:(\d+)$/);
902
- if (v6 && v6[2] === String(port)) {
903
- hosts.push(v6[1]);
904
- continue;
905
- }
906
- const idx = body.lastIndexOf(":");
907
- if (idx <= 0)
908
- continue;
909
- const addr = body.slice(0, idx);
910
- const portPart = body.slice(idx + 1);
911
- if (portPart === String(port))
912
- hosts.push(addr === "*" ? "0.0.0.0" : addr);
913
- }
914
- }
915
- catch { /* lsof unavailable or no match */ }
916
- return hosts;
917
- };
918
- const detected = process.platform === "linux"
919
- ? [...fromSs(), ...fromLsof()]
920
- : [...fromLsof(), ...fromSs()];
921
- const unique = [...new Set(detected)];
922
- if (unique.length === 0)
923
- return "127.0.0.1";
924
- return unique[0] === "0.0.0.0" ? "127.0.0.1" : unique[0];
925
- }
926
- function getExclusiveLoopbackListenerForPort(port) {
927
- const safe = safePort(port);
928
- const hosts = new Set();
929
- try {
930
- const out = execFileSync("lsof", ["-nP", "-iTCP:" + safe, "-sTCP:LISTEN", "-FnP"], {
931
- encoding: "utf-8",
932
- timeout: 3000,
933
- stdio: ["pipe", "pipe", "pipe"],
934
- });
935
- for (const line of out.split("\n")) {
936
- if (!line.startsWith("n"))
937
- continue;
938
- const body = line.slice(1);
939
- if (body === `127.0.0.1:${safe}`) {
940
- hosts.add("127.0.0.1");
941
- continue;
942
- }
943
- if (body === `[::1]:${safe}`) {
944
- hosts.add("::1");
945
- continue;
946
- }
947
- if (!body.endsWith(`:${safe}`))
948
- continue;
949
- const addr = body.startsWith("[")
950
- ? body.slice(1, body.lastIndexOf("]"))
951
- : body.slice(0, body.lastIndexOf(":"));
952
- hosts.add(addr === "*" ? "0.0.0.0" : addr);
953
- }
954
- }
955
- catch { /* lsof unavailable or no match */ }
956
- try {
957
- const out = execFileSync("ss", ["-tlnH", "sport", "=", ":" + safe], {
958
- encoding: "utf-8",
959
- timeout: 3000,
960
- stdio: ["pipe", "pipe", "pipe"],
961
- });
962
- for (const line of out.split("\n")) {
963
- const ipv4 = line.match(/\s([\d.]+):(\d+)\s/);
964
- if (ipv4 && ipv4[2] === String(safe))
965
- hosts.add(ipv4[1]);
966
- const ipv6 = line.match(/\s\[([0-9a-fA-F:]+)\]:(\d+)\s/);
967
- if (ipv6 && ipv6[2] === String(safe))
968
- hosts.add(ipv6[1]);
969
- }
970
- }
971
- catch { /* ss unavailable or no match */ }
972
- if (hosts.size === 0)
973
- return null;
974
- let hasIpv4Loopback = false;
975
- let hasIpv6Loopback = false;
976
- for (const host of hosts) {
977
- if (host === "127.0.0.1") {
978
- hasIpv4Loopback = true;
979
- continue;
980
- }
981
- if (host === "::1") {
982
- hasIpv6Loopback = true;
983
- continue;
984
- }
985
- if (host === "0.0.0.0" || host === "::")
986
- return null;
987
- return null;
988
- }
989
- if (hasIpv4Loopback)
990
- return "127.0.0.1";
991
- if (hasIpv6Loopback)
992
- return "::1";
993
- return null;
994
- }
995
- export function getPrimaryIpv4Address() {
996
- try {
997
- for (const list of Object.values(networkInterfaces())) {
998
- for (const iface of list ?? []) {
999
- if (!iface.internal && iface.family === "IPv4")
1000
- return iface.address;
1001
- }
1002
- }
1003
- }
1004
- catch { /* fall through */ }
1005
- return "127.0.0.1";
1006
- }
1007
- export function getAdvertisedHostForPort(port) {
1008
- const host = getListeningHostForPort(port);
1009
- if (host && host !== "127.0.0.1" && host !== "0.0.0.0" && host !== "::1" && host !== "::") {
1010
- return host;
1011
- }
1012
- return getPrimaryIpv4Address();
1013
- }
1014
- export function getConnectHostForPort(port) {
1015
- const host = getListeningHostForPort(port);
1016
- if (!host || host === "0.0.0.0" || host === "::")
1017
- return "127.0.0.1";
1018
- return host;
1019
- }
1020
- export async function getGatewayHost(instanceId) {
1021
- const cached = _gwHostCache.get(instanceId);
1022
- if (cached && Date.now() - cached.ts < GW_HOST_CACHE_TTL)
1023
- return cached.host;
1024
- const port = getGatewayPort(instanceId);
1025
- let result = "127.0.0.1";
1026
- try {
1027
- const { getNomadDriver } = await import("../config.js");
1028
- if (getNomadDriver() === "docker") {
1029
- const { getNomadAddr, getNomadToken } = await import("../config.js");
1030
- // Dispatch job-id construction through the adapter so every runtime
1031
- // owns its own Nomad job namespace (hermes-<id>, openclaw-<id>, …).
1032
- // Falls back to a generic `jishushell-` prefix only when the adapter
1033
- // lookup fails — that branch should never fire for a registered
1034
- // agent type.
1035
- const meta = getInstance(instanceId);
1036
- const agentType = resolveAgentType(meta);
1037
- let prefix = "jishushell-";
1038
- try {
1039
- const a = getAdapter(agentType);
1040
- if (typeof a.nomadJobPrefix === "string" && a.nomadJobPrefix.length) {
1041
- prefix = a.nomadJobPrefix;
1042
- }
1043
- }
1044
- catch { /* use fallback prefix */ }
1045
- // Avoid double-prefix when the instance ID already carries the
1046
- // adapter prefix (e.g. apps stored as `openclaw-c1` whose Nomad
1047
- // job name is also `openclaw-c1`). Without this guard we'd ask
1048
- // Nomad for `openclaw-openclaw-c1`, get 0 allocs, and fall back
1049
- // to the 127.0.0.1 default — which silently breaks the gateway
1050
- // proxy on docker driver where the real HostIP differs.
1051
- const jid = instanceId.startsWith(prefix) ? instanceId : `${prefix}${instanceId}`;
1052
- const headers = { "Content-Type": "application/json" };
1053
- const token = getNomadToken();
1054
- if (token)
1055
- headers["X-Nomad-Token"] = token;
1056
- const resp = await fetch(`${getNomadAddr()}/v1/job/${encodeURIComponent(jid)}/allocations`, {
1057
- headers,
1058
- signal: AbortSignal.timeout(5000),
1059
- });
1060
- if (resp.ok) {
1061
- const allocs = await resp.json();
1062
- const alloc = allocs.find((a) => a.ClientStatus === "running")
1063
- ?? allocs.find((a) => a.ClientStatus === "pending");
1064
- if (alloc) {
1065
- const detail = await fetch(`${getNomadAddr()}/v1/allocation/${encodeURIComponent(alloc.ID)}`, { headers, signal: AbortSignal.timeout(5000) });
1066
- if (detail.ok) {
1067
- const d = await detail.json();
1068
- // Preferred source: AllocatedResources.Shared.Ports (bridge mode).
1069
- const sharedPorts = d?.AllocatedResources?.Shared?.Ports ?? [];
1070
- const gwPort = sharedPorts.find((p) => p.Label === "gateway");
1071
- if (gwPort?.HostIP && gwPort.HostIP !== "0.0.0.0") {
1072
- result = gwPort.HostIP;
1073
- }
1074
- else {
1075
- // Host mode / task-level reservation: address lives under
1076
- // AllocatedResources.Tasks.<task>.Networks[*].IP. On Nomad
1077
- // 1.6.5 with `network_interface = "lo"`, the IP is whichever
1078
- // address the OS enumerates first — which can be IPv6 `::1`
1079
- // on systems where lo has both `127.0.0.1/8` and `::1/128`
1080
- // (the default on most modern Linux distros). Reading it from
1081
- // here is the authoritative source and matches what nomad
1082
- // configures the docker-proxy bind to use.
1083
- //
1084
- // Scan every task instead of indexing a hardcoded "gateway"
1085
- // task — adapters are free to name the task whatever they
1086
- // like, we only require the reserved port carry the
1087
- // framework-level `gateway` label.
1088
- const tasksMap = d?.AllocatedResources?.Tasks ?? {};
1089
- for (const taskName of Object.keys(tasksMap)) {
1090
- const taskNets = tasksMap[taskName]?.Networks ?? [];
1091
- const net = taskNets.find((n) => {
1092
- const rps = n?.ReservedPorts ?? [];
1093
- return rps.some((p) => p.Label === "gateway");
1094
- });
1095
- if (net?.IP && net.IP !== "0.0.0.0") {
1096
- result = net.IP;
1097
- break;
1098
- }
1099
- }
1100
- }
1101
- }
1102
- }
1103
- }
1104
- // If Nomad API resolved a non-default host, cache and return it
1105
- if (result !== "127.0.0.1") {
1106
- const localLoopbackHost = getExclusiveLoopbackListenerForPort(port);
1107
- if (localLoopbackHost) {
1108
- result = localLoopbackHost;
1109
- }
1110
- _gwHostCache.set(instanceId, { host: result, ts: Date.now() });
1111
- return result;
1112
- }
1113
- // Otherwise fall through to ss-based detection
1114
- }
1115
- }
1116
- catch { /* fall through */ }
1117
- result = getListeningHostForPort(port);
1118
- _gwHostCache.set(instanceId, { host: result, ts: Date.now() });
1119
- return result;
1120
- }
1121
- const _appPortHostCache = new Map();
1122
- const APP_PORT_HOST_CACHE_TTL = 30000;
1123
- /**
1124
- * Resolve the host IP for a specific port belonging to an app's Nomad job.
1125
- *
1126
- * On macOS with Colima + docker driver the container port is bound *inside*
1127
- * the VM, not on the host. `ss` (or `netstat`) run on the macOS host see
1128
- * nothing on that port, so `getListeningHostForPort` returns 127.0.0.1 and
1129
- * the core proxy gets a 502.
1130
- *
1131
- * This function mirrors the logic of `getGatewayHost` but matches by port
1132
- * *value* rather than by the "gateway" label, making it suitable for
1133
- * arbitrary capability ports exposed by app tasks.
1134
- */
1135
- export async function getHostForAppPort(appId, port) {
1136
- const cacheKey = `${appId}:${port}`;
1137
- const cached = _appPortHostCache.get(cacheKey);
1138
- if (cached && Date.now() - cached.ts < APP_PORT_HOST_CACHE_TTL)
1139
- return cached.host;
1140
- let result = "127.0.0.1";
1141
- try {
1142
- const { getNomadDriver, getNomadAddr, getNomadToken } = await import("../config.js");
1143
- if (getNomadDriver() === "docker") {
1144
- const headers = { "Content-Type": "application/json" };
1145
- const token = getNomadToken();
1146
- if (token)
1147
- headers["X-Nomad-Token"] = token;
1148
- const resp = await fetch(`${getNomadAddr()}/v1/job/${encodeURIComponent(appId)}/allocations`, { headers, signal: AbortSignal.timeout(5000) });
1149
- if (resp.ok) {
1150
- const allocs = await resp.json();
1151
- const alloc = allocs.find((a) => a.ClientStatus === "running")
1152
- ?? allocs.find((a) => a.ClientStatus === "pending");
1153
- if (alloc) {
1154
- const detail = await fetch(`${getNomadAddr()}/v1/allocation/${encodeURIComponent(alloc.ID)}`, { headers, signal: AbortSignal.timeout(5000) });
1155
- if (detail.ok) {
1156
- const d = await detail.json();
1157
- // Bridge / host-network mode: ports listed under Shared.Ports
1158
- const sharedPorts = d?.AllocatedResources?.Shared?.Ports ?? [];
1159
- const matched = sharedPorts.find((p) => p.Value === port || p.To === port);
1160
- if (matched?.HostIP && matched.HostIP !== "0.0.0.0") {
1161
- result = matched.HostIP;
1162
- }
1163
- }
1164
- }
1165
- }
1166
- }
1167
- }
1168
- catch { /* fall through to ss-based detection */ }
1169
- if (result === "127.0.0.1") {
1170
- result = getListeningHostForPort(port);
1171
- }
1172
- _appPortHostCache.set(cacheKey, { host: result, ts: Date.now() });
1173
- return result;
1174
- }
1175
- /**
1176
- * Wrap an IPv6 literal in brackets for safe URL host-component / Host-header
1177
- * use. Bare names ("gateway.local") and IPv4 ("127.0.0.1") contain no colon
1178
- * and pass through unchanged; anything with a colon is an IPv6 literal and
1179
- * MUST be bracketed before being concatenated with a port, otherwise
1180
- * `http://::1:18789/` is unparseable.
1181
- */
1182
- export function urlHost(host) {
1183
- return host.includes(":") ? `[${host}]` : host;
1184
- }
1185
- export function findInstancesSharingOpenclawHome(instanceId) {
1186
- const meta = getInstance(instanceId);
1187
- const agentType = resolveAgentType(meta);
1188
- try {
1189
- const a = getAdapter(agentType);
1190
- return typeof a.findInstancesSharingHome === "function"
1191
- ? a.findInstancesSharingHome(instanceId)
1192
- : [];
1193
- }
1194
- catch {
1195
- return [];
1196
- }
1197
- }
1198
- /**
1199
- * Re-pick a gateway port for an existing instance and rewrite its persisted
1200
- * runtime metadata (`runtime.args` and `runtime.env.OPENCLAW_GATEWAY_PORT`).
1201
- *
1202
- * Used when {@link isPortInUse} reports that the previously-assigned port has
1203
- * been taken by something else between create-time and start-time (e.g. a
1204
- * host-side openclaw started by the user, an unrelated service that grabbed
1205
- * the port at boot, or a Docker race on the next allocation). The Nomad job
1206
- * spec is rebuilt from instance metadata on every submit, so updating
1207
- * `instance.json` here is sufficient — no other files need patching.
1208
- */
1209
- export async function reallocateGatewayPort(instanceId) {
1210
- const meta = safeReadJson(instanceMetaPath(instanceId), "instance-meta");
1211
- if (!meta)
1212
- throw new Error(`Cannot reallocate port for unknown instance '${instanceId}'`);
1213
- const agentType = resolveAgentType(meta);
1214
- let adapter;
1215
- try {
1216
- adapter = getAdapter(agentType);
1217
- }
1218
- catch {
1219
- throw new Error(`Unknown runtime agentType "${agentType}" for instance ${instanceId}`);
1220
- }
1221
- const defaultPort = adapter.defaultGatewayPort ?? 18789;
1222
- const fromPort = extractGatewayPort(meta.runtime, agentType) ?? defaultPort;
1223
- const alloc = await allocateGatewayPort(instanceId, defaultPort);
1224
- try {
1225
- const runtime = (meta.runtime ?? {});
1226
- // Delegate the kind-specific runtime rewrite to the adapter.
1227
- if (typeof adapter.reallocateRuntimePort === "function") {
1228
- adapter.reallocateRuntimePort(runtime, alloc.port);
1229
- }
1230
- meta.runtime = runtime;
1231
- safeWriteJson(instanceMetaPath(instanceId), meta);
1232
- chownToServiceUser(instanceMetaPath(instanceId));
1233
- console.log(`[instance] ${instanceId}: gateway port reallocated ${fromPort} -> ${alloc.port}`);
1234
- return { from: fromPort, to: alloc.port, skipped: alloc.skipped };
1235
- }
1236
- finally {
1237
- _pendingPorts.delete(alloc.port);
1238
- }
1239
- }
1240
- export function findInstancesSharingGatewayPort(instanceId) {
1241
- const targetPort = getGatewayPort(instanceId);
1242
- return listInstances()
1243
- .filter((inst) => inst.id !== instanceId)
1244
- .filter((inst) => extractGatewayPort(inst.runtime) === targetPort)
1245
- .map((inst) => inst.id);
1246
- }
1247
- export function getRuntimeEnv(instanceId) {
1248
- const runtime = getInstanceRuntime(instanceId);
1249
- const env = {};
1250
- for (const envFile of getRuntimeEnvFiles(instanceId)) {
1251
- Object.assign(env, parseEnvFile(envFile));
1252
- }
1253
- for (const [key, value] of Object.entries(runtime.env || {})) {
1254
- if (value != null)
1255
- env[key] = String(value);
1256
- }
1257
- return env;
1258
- }
1259
- // Re-export instanceDir for nomad-manager under its getInstanceDir alias.
1260
- export { instanceDir as getInstanceDir };
1261
- // ── Compatibility exports for app-type managers (src/services/app/) ──────────
1262
- // `instanceMetaPath`, `chownToServiceUser`, `notifyConfigChange` already
1263
- // exported above; §32.2/§32.8 migration kept the originals in place so the
1264
- // app-manager layer can still depend on them. The shims below add the
1265
- // naming aliases the cli branch's app managers import.
1266
- /**
1267
- * Compatibility shim: allocate a gateway port for a new instance and return
1268
- * just the port number. Wraps `allocateGatewayPort`, which takes a seed port
1269
- * and returns `{ port, skipped }`. Non-OpenClaw app managers don't have an
1270
- * agentType-specific default port yet, so we seed with 18789 (OpenClaw's
1271
- * default) — the allocator walks upward until it finds a free slot so the
1272
- * actual port chosen is independent of the seed.
1273
- */
1274
- export async function defaultGatewayPort(instanceId) {
1275
- const result = await allocateGatewayPort(instanceId, 18789);
1276
- return result.port;
1277
- }
1278
- /**
1279
- * Compatibility shim: release a pending port reservation.
1280
- * Mirrors the cli-branch `releasePort(port)` helper on top of the framework's
1281
- * existing `releasePendingPort`.
1282
- */
1283
- export function releasePort(port) {
1284
- releasePendingPort(port);
1285
- }
1286
- // `resolveExistingConfigPath` is owned by the OpenClaw adapter after §32.2 —
1287
- // callers that still need it live inside `src/services/runtime/adapters/` or
1288
- // `src/services/app/openclaw-manager.ts` (which defines its own copy).
1289
- //# sourceMappingURL=instance-manager.js.map