jishushell 0.6.5 → 0.7.3

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 (1207) hide show
  1. package/apps/anythingllm-container.yaml +16 -170
  2. package/apps/browserless-chromium-container.yaml +16 -10
  3. package/apps/filebrowser-container.yaml +15 -9
  4. package/apps/hermes-container.yaml +20 -5
  5. package/apps/immich-container-lite.yaml +337 -0
  6. package/apps/immich-container.yaml +371 -0
  7. package/apps/jishu-kb-container.yaml +50 -177
  8. package/apps/ollama-binary.yaml +33 -28
  9. package/apps/ollama-cpu-container.yaml +6 -0
  10. package/apps/ollama-with-hollama-binary.yaml +35 -28
  11. package/apps/openclaw-binary.yaml +35 -15
  12. package/apps/openclaw-container.yaml +29 -11
  13. package/apps/openclaw-with-ollama-container.yaml +9 -2
  14. package/apps/openclaw-with-searxng-container.yaml +38 -6
  15. package/apps/searxng-container.yaml +31 -6
  16. package/apps/weknora-container.yaml +26 -21
  17. package/dependencies/jishushell-panel-0.7.3.tgz +0 -0
  18. package/dist/cli/app.js +244 -213
  19. package/dist/cli/app.js.map +1 -1
  20. package/dist/cli/backup.js +15 -12
  21. package/dist/cli/backup.js.map +1 -1
  22. package/dist/cli/core.d.ts +4 -3
  23. package/dist/cli/core.js +392 -227
  24. package/dist/cli/core.js.map +1 -1
  25. package/dist/cli/doctor.d.ts +1 -1
  26. package/dist/cli/doctor.js +113 -10
  27. package/dist/cli/doctor.js.map +1 -1
  28. package/dist/cli/job.js +62 -14
  29. package/dist/cli/job.js.map +1 -1
  30. package/dist/cli/llm.js +80 -11
  31. package/dist/cli/llm.js.map +1 -1
  32. package/dist/cli/managed-list.d.ts +1 -3
  33. package/dist/cli/managed-list.js +18 -16
  34. package/dist/cli/managed-list.js.map +1 -1
  35. package/dist/cli/migrate.d.ts +2 -0
  36. package/dist/cli/migrate.js +160 -0
  37. package/dist/cli/migrate.js.map +1 -0
  38. package/dist/cli.js +1 -0
  39. package/dist/cli.js.map +1 -1
  40. package/dist/config.d.ts +32 -20
  41. package/dist/config.js +132 -51
  42. package/dist/config.js.map +1 -1
  43. package/dist/control.d.ts +6 -6
  44. package/dist/control.js +31 -23
  45. package/dist/control.js.map +1 -1
  46. package/dist/core.d.ts +5 -5
  47. package/dist/core.js +5 -5
  48. package/dist/core.js.map +1 -1
  49. package/dist/install.d.ts +2 -2
  50. package/dist/install.js +78 -37
  51. package/dist/install.js.map +1 -1
  52. package/dist/routes/admin.d.ts +2 -0
  53. package/dist/routes/admin.js +72 -0
  54. package/dist/routes/admin.js.map +1 -0
  55. package/dist/routes/apps.d.ts +1 -1
  56. package/dist/routes/apps.js +101 -193
  57. package/dist/routes/apps.js.map +1 -1
  58. package/dist/routes/auth.js +1 -1
  59. package/dist/routes/auth.js.map +1 -1
  60. package/dist/routes/backup.js +1 -1
  61. package/dist/routes/backup.js.map +1 -1
  62. package/dist/routes/docker.d.ts +2 -0
  63. package/dist/routes/docker.js +58 -0
  64. package/dist/routes/docker.js.map +1 -0
  65. package/dist/routes/external-mounts.d.ts +1 -1
  66. package/dist/routes/external-mounts.js +1 -1
  67. package/dist/routes/external-mounts.js.map +1 -1
  68. package/dist/routes/file-mounts.d.ts +4 -3
  69. package/dist/routes/file-mounts.js +49 -31
  70. package/dist/routes/file-mounts.js.map +1 -1
  71. package/dist/routes/files-organize.d.ts +2 -2
  72. package/dist/routes/files-organize.js +5 -5
  73. package/dist/routes/files-organize.js.map +1 -1
  74. package/dist/routes/files.d.ts +1 -1
  75. package/dist/routes/files.js +1 -1
  76. package/dist/routes/files.js.map +1 -1
  77. package/dist/routes/instances.d.ts +0 -8
  78. package/dist/routes/instances.js +202 -1560
  79. package/dist/routes/instances.js.map +1 -1
  80. package/dist/routes/integration-apps.d.ts +14 -0
  81. package/dist/routes/integration-apps.js +81 -0
  82. package/dist/routes/integration-apps.js.map +1 -0
  83. package/dist/routes/integrations.d.ts +9 -0
  84. package/dist/routes/integrations.js +12 -0
  85. package/dist/routes/integrations.js.map +1 -0
  86. package/dist/routes/llm-proxy.js +26 -3
  87. package/dist/routes/llm-proxy.js.map +1 -1
  88. package/dist/routes/setup.js +53 -38
  89. package/dist/routes/setup.js.map +1 -1
  90. package/dist/routes/system.js +108 -68
  91. package/dist/routes/system.js.map +1 -1
  92. package/dist/routes/webdav.d.ts +1 -1
  93. package/dist/routes/webdav.js +2 -2
  94. package/dist/routes/webdav.js.map +1 -1
  95. package/dist/server.d.ts +6 -0
  96. package/dist/server.js +368 -233
  97. package/dist/server.js.map +1 -1
  98. package/dist/services/app-common/app-compiler.js +186 -0
  99. package/dist/services/app-common/app-compiler.js.map +1 -0
  100. package/dist/services/app-common/app-shared.d.ts +15 -0
  101. package/dist/services/app-common/app-shared.js +64 -0
  102. package/dist/services/app-common/app-shared.js.map +1 -0
  103. package/dist/services/app-common/capability-service.d.ts +45 -0
  104. package/dist/services/app-common/capability-service.js +331 -0
  105. package/dist/services/app-common/capability-service.js.map +1 -0
  106. package/dist/services/app-common/catalog-service.d.ts +59 -0
  107. package/dist/services/app-common/catalog-service.js +318 -0
  108. package/dist/services/app-common/catalog-service.js.map +1 -0
  109. package/dist/services/app-common/create-pipeline.d.ts +26 -0
  110. package/dist/services/app-common/create-pipeline.js +298 -0
  111. package/dist/services/app-common/create-pipeline.js.map +1 -0
  112. package/dist/services/app-common/delete-service.d.ts +5 -0
  113. package/dist/services/app-common/delete-service.js +109 -0
  114. package/dist/services/app-common/delete-service.js.map +1 -0
  115. package/dist/services/app-common/execution-owner.d.ts +23 -0
  116. package/dist/services/app-common/execution-owner.js +124 -0
  117. package/dist/services/app-common/execution-owner.js.map +1 -0
  118. package/dist/services/app-common/execution-service.d.ts +23 -0
  119. package/dist/services/app-common/execution-service.js +105 -0
  120. package/dist/services/app-common/execution-service.js.map +1 -0
  121. package/dist/services/app-common/id-normalizer.d.ts +31 -0
  122. package/dist/services/app-common/id-normalizer.js +83 -0
  123. package/dist/services/app-common/id-normalizer.js.map +1 -0
  124. package/dist/services/app-common/install-store.d.ts +34 -0
  125. package/dist/services/app-common/install-store.js +261 -0
  126. package/dist/services/app-common/install-store.js.map +1 -0
  127. package/dist/services/app-common/instance-store.d.ts +78 -0
  128. package/dist/services/app-common/instance-store.js +498 -0
  129. package/dist/services/app-common/instance-store.js.map +1 -0
  130. package/dist/services/app-common/integration-refs.d.ts +17 -0
  131. package/dist/services/app-common/integration-refs.js +47 -0
  132. package/dist/services/app-common/integration-refs.js.map +1 -0
  133. package/dist/services/app-common/lifecycle-pipeline.d.ts +62 -0
  134. package/dist/services/app-common/lifecycle-pipeline.js +317 -0
  135. package/dist/services/app-common/lifecycle-pipeline.js.map +1 -0
  136. package/dist/services/app-common/lifecycle-scripts.d.ts +38 -0
  137. package/dist/services/app-common/lifecycle-scripts.js +935 -0
  138. package/dist/services/app-common/lifecycle-scripts.js.map +1 -0
  139. package/dist/services/app-common/lifecycle-service.d.ts +68 -0
  140. package/dist/services/app-common/lifecycle-service.js +475 -0
  141. package/dist/services/app-common/lifecycle-service.js.map +1 -0
  142. package/dist/services/app-common/ownership.d.ts +3 -0
  143. package/dist/services/app-common/ownership.js +11 -0
  144. package/dist/services/app-common/ownership.js.map +1 -0
  145. package/dist/services/app-common/paths.d.ts +29 -0
  146. package/dist/services/app-common/paths.js +34 -0
  147. package/dist/services/app-common/paths.js.map +1 -0
  148. package/dist/services/app-common/platform-transform.d.ts +32 -0
  149. package/dist/services/app-common/platform-transform.js +65 -0
  150. package/dist/services/app-common/platform-transform.js.map +1 -0
  151. package/dist/services/app-common/provide-resolver.d.ts +29 -0
  152. package/dist/services/app-common/provide-resolver.js +129 -0
  153. package/dist/services/app-common/provide-resolver.js.map +1 -0
  154. package/dist/services/app-common/remote-spec.d.ts +14 -0
  155. package/dist/services/app-common/remote-spec.js +58 -0
  156. package/dist/services/app-common/remote-spec.js.map +1 -0
  157. package/dist/services/app-common/runtime-builder.d.ts +1 -0
  158. package/dist/services/app-common/runtime-builder.js +2 -0
  159. package/dist/services/app-common/runtime-builder.js.map +1 -0
  160. package/dist/services/app-common/runtime-facts.d.ts +19 -0
  161. package/dist/services/app-common/runtime-facts.js +128 -0
  162. package/dist/services/app-common/runtime-facts.js.map +1 -0
  163. package/dist/services/app-common/service.d.ts +9 -0
  164. package/dist/services/app-common/service.js +10 -0
  165. package/dist/services/app-common/service.js.map +1 -0
  166. package/dist/services/app-common/spec-materializer.d.ts +8 -0
  167. package/dist/services/app-common/spec-materializer.js +295 -0
  168. package/dist/services/app-common/spec-materializer.js.map +1 -0
  169. package/dist/services/app-common/status-refresh.d.ts +33 -0
  170. package/dist/services/app-common/status-refresh.js +771 -0
  171. package/dist/services/app-common/status-refresh.js.map +1 -0
  172. package/dist/services/app-common/task-service.d.ts +29 -0
  173. package/dist/services/app-common/task-service.js +93 -0
  174. package/dist/services/app-common/task-service.js.map +1 -0
  175. package/dist/services/app-common/terminal-session-manager.js +157 -0
  176. package/dist/services/app-common/terminal-session-manager.js.map +1 -0
  177. package/dist/services/app-modules/browserless/routes.d.ts +9 -0
  178. package/dist/services/app-modules/browserless/routes.js +519 -0
  179. package/dist/services/app-modules/browserless/routes.js.map +1 -0
  180. package/dist/services/app-modules/routes.d.ts +2 -0
  181. package/dist/services/app-modules/routes.js +5 -0
  182. package/dist/services/app-modules/routes.js.map +1 -0
  183. package/dist/services/backup/backup-admin.d.ts +95 -0
  184. package/dist/services/backup/backup-admin.js +246 -0
  185. package/dist/services/backup/backup-admin.js.map +1 -0
  186. package/dist/services/backup/backup-manager.d.ts +264 -0
  187. package/dist/services/backup/backup-manager.js +2318 -0
  188. package/dist/services/backup/backup-manager.js.map +1 -0
  189. package/dist/services/backup/backup-verify.js +240 -0
  190. package/dist/services/backup/backup-verify.js.map +1 -0
  191. package/dist/services/capabilities/browser-policy.d.ts +14 -0
  192. package/dist/services/capabilities/browser-policy.js +141 -0
  193. package/dist/services/capabilities/browser-policy.js.map +1 -0
  194. package/dist/services/capabilities/contract.d.ts +49 -0
  195. package/dist/services/capabilities/contract.js +119 -0
  196. package/dist/services/capabilities/contract.js.map +1 -0
  197. package/dist/services/capabilities/endpoint-validator.d.ts +42 -0
  198. package/dist/services/capabilities/endpoint-validator.js +113 -0
  199. package/dist/services/capabilities/endpoint-validator.js.map +1 -0
  200. package/dist/services/capabilities/health.d.ts +16 -0
  201. package/dist/services/capabilities/health.js +121 -0
  202. package/dist/services/capabilities/health.js.map +1 -0
  203. package/dist/services/capabilities/registry.d.ts +56 -0
  204. package/dist/services/capabilities/registry.js +222 -0
  205. package/dist/services/capabilities/registry.js.map +1 -0
  206. package/dist/services/capabilities/sync.d.ts +7 -0
  207. package/dist/services/capabilities/sync.js +223 -0
  208. package/dist/services/capabilities/sync.js.map +1 -0
  209. package/dist/services/capability-proxy/html-rewriters/browserless.d.ts +1 -0
  210. package/dist/services/capability-proxy/html-rewriters/browserless.js +83 -0
  211. package/dist/services/capability-proxy/html-rewriters/browserless.js.map +1 -0
  212. package/dist/services/capability-proxy/html-rewriters/index.d.ts +12 -0
  213. package/dist/services/capability-proxy/html-rewriters/index.js +25 -0
  214. package/dist/services/capability-proxy/html-rewriters/index.js.map +1 -0
  215. package/dist/services/capability-proxy/html-rewriters/jishukb.d.ts +1 -0
  216. package/dist/services/capability-proxy/html-rewriters/jishukb.js +161 -0
  217. package/dist/services/capability-proxy/html-rewriters/jishukb.js.map +1 -0
  218. package/dist/services/capability-proxy/http.d.ts +7 -0
  219. package/dist/services/capability-proxy/http.js +555 -0
  220. package/dist/services/capability-proxy/http.js.map +1 -0
  221. package/dist/services/capability-proxy/terminal.d.ts +4 -0
  222. package/dist/services/capability-proxy/terminal.js +179 -0
  223. package/dist/services/capability-proxy/terminal.js.map +1 -0
  224. package/dist/services/connections/admin.d.ts +80 -0
  225. package/dist/services/connections/admin.js +337 -0
  226. package/dist/services/connections/admin.js.map +1 -0
  227. package/dist/services/connections/apply.d.ts +104 -0
  228. package/dist/services/connections/apply.js +415 -0
  229. package/dist/services/connections/apply.js.map +1 -0
  230. package/dist/services/connections/resolver.d.ts +82 -0
  231. package/dist/services/connections/resolver.js +289 -0
  232. package/dist/services/connections/resolver.js.map +1 -0
  233. package/dist/services/connections/transactor.d.ts +39 -0
  234. package/dist/services/connections/transactor.js +307 -0
  235. package/dist/services/connections/transactor.js.map +1 -0
  236. package/dist/services/files/bootstrap.d.ts +7 -0
  237. package/dist/services/files/bootstrap.js +16 -0
  238. package/dist/services/files/bootstrap.js.map +1 -0
  239. package/dist/services/files/external-mounts.js +187 -0
  240. package/dist/services/files/external-mounts.js.map +1 -0
  241. package/dist/services/files/files-manager.d.ts +265 -0
  242. package/dist/services/files/files-manager.js +1189 -0
  243. package/dist/services/files/files-manager.js.map +1 -0
  244. package/dist/services/files/files-mounts.d.ts +42 -0
  245. package/dist/services/files/files-mounts.js +207 -0
  246. package/dist/services/files/files-mounts.js.map +1 -0
  247. package/dist/services/files/organize/applier.js +218 -0
  248. package/dist/services/files/organize/applier.js.map +1 -0
  249. package/dist/services/files/organize/rules.js +286 -0
  250. package/dist/services/files/organize/rules.js.map +1 -0
  251. package/dist/services/files/organize/scanner.js +366 -0
  252. package/dist/services/files/organize/scanner.js.map +1 -0
  253. package/dist/services/files/organize/store.js +82 -0
  254. package/dist/services/files/organize/store.js.map +1 -0
  255. package/dist/services/files/photos/upload-page.d.ts +2 -0
  256. package/dist/services/files/photos/upload-page.js +248 -0
  257. package/dist/services/files/photos/upload-page.js.map +1 -0
  258. package/dist/services/files/photos/upload-store.d.ts +74 -0
  259. package/dist/services/files/photos/upload-store.js +432 -0
  260. package/dist/services/files/photos/upload-store.js.map +1 -0
  261. package/dist/services/files/webdav/server.d.ts +47 -0
  262. package/dist/services/files/webdav/server.js +329 -0
  263. package/dist/services/files/webdav/server.js.map +1 -0
  264. package/dist/services/files/webdav/xml-builder.js.map +1 -0
  265. package/dist/services/http/proxy-utils.d.ts +7 -0
  266. package/dist/services/http/proxy-utils.js +29 -0
  267. package/dist/services/http/proxy-utils.js.map +1 -0
  268. package/dist/services/http/request-utils.d.ts +3 -0
  269. package/dist/services/http/request-utils.js +23 -0
  270. package/dist/services/http/request-utils.js.map +1 -0
  271. package/dist/services/instances/admin.d.ts +23 -0
  272. package/dist/services/instances/admin.js +218 -0
  273. package/dist/services/instances/admin.js.map +1 -0
  274. package/dist/services/instances/clone.d.ts +26 -0
  275. package/dist/services/instances/clone.js +78 -0
  276. package/dist/services/instances/clone.js.map +1 -0
  277. package/dist/services/instances/config-admin.d.ts +17 -0
  278. package/dist/services/instances/config-admin.js +181 -0
  279. package/dist/services/instances/config-admin.js.map +1 -0
  280. package/dist/services/instances/manager.d.ts +232 -0
  281. package/dist/services/instances/manager.js +1342 -0
  282. package/dist/services/instances/manager.js.map +1 -0
  283. package/dist/services/instances/pairing.d.ts +17 -0
  284. package/dist/services/instances/pairing.js +53 -0
  285. package/dist/services/instances/pairing.js.map +1 -0
  286. package/dist/services/instances/passwords.js +173 -0
  287. package/dist/services/instances/passwords.js.map +1 -0
  288. package/dist/services/instances/status.d.ts +2 -0
  289. package/dist/services/instances/status.js +11 -0
  290. package/dist/services/instances/status.js.map +1 -0
  291. package/dist/services/instances/types.d.ts +21 -0
  292. package/dist/services/instances/types.js +2 -0
  293. package/dist/services/instances/types.js.map +1 -0
  294. package/dist/services/integrations/anythingllm/integration.d.ts +25 -0
  295. package/dist/services/integrations/anythingllm/integration.js +251 -0
  296. package/dist/services/integrations/anythingllm/integration.js.map +1 -0
  297. package/dist/services/integrations/catalog.d.ts +3 -0
  298. package/dist/services/integrations/catalog.js +73 -0
  299. package/dist/services/integrations/catalog.js.map +1 -0
  300. package/dist/services/integrations/custom/integration.d.ts +28 -0
  301. package/dist/services/integrations/custom/integration.js +179 -0
  302. package/dist/services/integrations/custom/integration.js.map +1 -0
  303. package/dist/services/integrations/hermes/integration.d.ts +194 -0
  304. package/dist/services/integrations/hermes/integration.js +1668 -0
  305. package/dist/services/integrations/hermes/integration.js.map +1 -0
  306. package/dist/services/integrations/immich/client.d.ts +93 -0
  307. package/dist/services/integrations/immich/client.js +458 -0
  308. package/dist/services/integrations/immich/client.js.map +1 -0
  309. package/dist/services/integrations/immich/config.d.ts +15 -0
  310. package/dist/services/integrations/immich/config.js +178 -0
  311. package/dist/services/integrations/immich/config.js.map +1 -0
  312. package/dist/services/integrations/immich/discovery.d.ts +9 -0
  313. package/dist/services/integrations/immich/discovery.js +101 -0
  314. package/dist/services/integrations/immich/discovery.js.map +1 -0
  315. package/dist/services/integrations/immich/gallery-renderer.d.ts +5 -0
  316. package/dist/services/integrations/immich/gallery-renderer.js +150 -0
  317. package/dist/services/integrations/immich/gallery-renderer.js.map +1 -0
  318. package/dist/services/integrations/immich/immich-shim.d.ts +11 -0
  319. package/dist/services/integrations/immich/immich-shim.js +439 -0
  320. package/dist/services/integrations/immich/immich-shim.js.map +1 -0
  321. package/dist/services/integrations/immich/integration.d.ts +18 -0
  322. package/dist/services/integrations/immich/integration.js +64 -0
  323. package/dist/services/integrations/immich/integration.js.map +1 -0
  324. package/dist/services/integrations/immich/photo-library.d.ts +4 -0
  325. package/dist/services/integrations/immich/photo-library.js +63 -0
  326. package/dist/services/integrations/immich/photo-library.js.map +1 -0
  327. package/dist/services/integrations/immich/review-executor.d.ts +3 -0
  328. package/dist/services/integrations/immich/review-executor.js +41 -0
  329. package/dist/services/integrations/immich/review-executor.js.map +1 -0
  330. package/dist/services/integrations/immich/review-session-service.d.ts +27 -0
  331. package/dist/services/integrations/immich/review-session-service.js +206 -0
  332. package/dist/services/integrations/immich/review-session-service.js.map +1 -0
  333. package/dist/services/integrations/immich/review-store.d.ts +47 -0
  334. package/dist/services/integrations/immich/review-store.js +347 -0
  335. package/dist/services/integrations/immich/review-store.js.map +1 -0
  336. package/dist/services/integrations/immich/routes.d.ts +7 -0
  337. package/dist/services/integrations/immich/routes.js +363 -0
  338. package/dist/services/integrations/immich/routes.js.map +1 -0
  339. package/dist/services/integrations/immich/types.d.ts +186 -0
  340. package/dist/services/integrations/immich/types.js +2 -0
  341. package/dist/services/integrations/immich/types.js.map +1 -0
  342. package/dist/services/integrations/index.d.ts +41 -0
  343. package/dist/services/integrations/index.js +60 -0
  344. package/dist/services/integrations/index.js.map +1 -0
  345. package/dist/services/integrations/installable/catalog.d.ts +33 -0
  346. package/dist/services/integrations/installable/catalog.js +88 -0
  347. package/dist/services/integrations/installable/catalog.js.map +1 -0
  348. package/dist/services/integrations/installable/index.d.ts +35 -0
  349. package/dist/services/integrations/installable/index.js +170 -0
  350. package/dist/services/integrations/installable/index.js.map +1 -0
  351. package/dist/services/integrations/installable/installers/integration-probes.d.ts +50 -0
  352. package/dist/services/integrations/installable/installers/integration-probes.js +231 -0
  353. package/dist/services/integrations/installable/installers/integration-probes.js.map +1 -0
  354. package/dist/services/integrations/installable/installers/integration.d.ts +30 -0
  355. package/dist/services/integrations/installable/installers/integration.js +283 -0
  356. package/dist/services/integrations/installable/installers/integration.js.map +1 -0
  357. package/dist/services/integrations/installable/installers/registry-probe.js.map +1 -0
  358. package/dist/services/integrations/installable/installers/shell-script.d.ts +46 -0
  359. package/dist/services/integrations/installable/installers/shell-script.js +487 -0
  360. package/dist/services/integrations/installable/installers/shell-script.js.map +1 -0
  361. package/dist/services/integrations/installable/types.d.ts +130 -0
  362. package/dist/services/integrations/installable/types.js +19 -0
  363. package/dist/services/integrations/installable/types.js.map +1 -0
  364. package/dist/services/integrations/jishukb/integration.d.ts +24 -0
  365. package/dist/services/integrations/jishukb/integration.js +300 -0
  366. package/dist/services/integrations/jishukb/integration.js.map +1 -0
  367. package/dist/services/integrations/openclaw/anythingllm-shim.d.ts +46 -0
  368. package/dist/services/integrations/openclaw/anythingllm-shim.js +281 -0
  369. package/dist/services/integrations/openclaw/anythingllm-shim.js.map +1 -0
  370. package/dist/services/integrations/openclaw/drive-shim.js +490 -0
  371. package/dist/services/integrations/openclaw/drive-shim.js.map +1 -0
  372. package/dist/services/integrations/openclaw/integration.d.ts +438 -0
  373. package/dist/services/integrations/openclaw/integration.js +4629 -0
  374. package/dist/services/integrations/openclaw/integration.js.map +1 -0
  375. package/dist/services/integrations/openclaw/jishukb-native-mcp.d.ts +58 -0
  376. package/dist/services/integrations/openclaw/jishukb-native-mcp.js +373 -0
  377. package/dist/services/integrations/openclaw/jishukb-native-mcp.js.map +1 -0
  378. package/dist/services/integrations/openclaw/jishukb-shim.d.ts +52 -0
  379. package/dist/services/integrations/openclaw/jishukb-shim.js +1357 -0
  380. package/dist/services/integrations/openclaw/jishukb-shim.js.map +1 -0
  381. package/dist/services/integrations/openclaw/mcporter-lite.js +276 -0
  382. package/dist/services/integrations/openclaw/mcporter-lite.js.map +1 -0
  383. package/dist/services/integrations/openclaw/mcporter.d.ts +59 -0
  384. package/dist/services/integrations/openclaw/mcporter.js +143 -0
  385. package/dist/services/integrations/openclaw/mcporter.js.map +1 -0
  386. package/dist/services/integrations/openclaw/native-mcp.d.ts +48 -0
  387. package/dist/services/integrations/openclaw/native-mcp.js +125 -0
  388. package/dist/services/integrations/openclaw/native-mcp.js.map +1 -0
  389. package/dist/services/integrations/openclaw/routes.d.ts +21 -0
  390. package/dist/services/integrations/openclaw/routes.js +1194 -0
  391. package/dist/services/integrations/openclaw/routes.js.map +1 -0
  392. package/dist/services/integrations/registry.d.ts +17 -0
  393. package/dist/services/integrations/registry.js +36 -0
  394. package/dist/services/integrations/registry.js.map +1 -0
  395. package/dist/services/integrations/routes.d.ts +2 -0
  396. package/dist/services/integrations/routes.js +9 -0
  397. package/dist/services/integrations/routes.js.map +1 -0
  398. package/dist/services/integrations/types.d.ts +457 -0
  399. package/dist/services/integrations/types.js +2 -0
  400. package/dist/services/integrations/types.js.map +1 -0
  401. package/dist/services/legacy-migrator/classifier.d.ts +44 -0
  402. package/dist/services/legacy-migrator/classifier.js +309 -0
  403. package/dist/services/legacy-migrator/classifier.js.map +1 -0
  404. package/dist/services/legacy-migrator/executor.d.ts +42 -0
  405. package/dist/services/legacy-migrator/executor.js +637 -0
  406. package/dist/services/legacy-migrator/executor.js.map +1 -0
  407. package/dist/services/legacy-migrator/index.d.ts +31 -0
  408. package/dist/services/legacy-migrator/index.js +34 -0
  409. package/dist/services/legacy-migrator/index.js.map +1 -0
  410. package/dist/services/legacy-migrator/planner.d.ts +8 -0
  411. package/dist/services/legacy-migrator/planner.js +154 -0
  412. package/dist/services/legacy-migrator/planner.js.map +1 -0
  413. package/dist/services/legacy-migrator/provider-settings.d.ts +6 -0
  414. package/dist/services/legacy-migrator/provider-settings.js +72 -0
  415. package/dist/services/legacy-migrator/provider-settings.js.map +1 -0
  416. package/dist/services/legacy-migrator/report.d.ts +9 -0
  417. package/dist/services/legacy-migrator/report.js +99 -0
  418. package/dist/services/legacy-migrator/report.js.map +1 -0
  419. package/dist/services/legacy-migrator/scanner.d.ts +13 -0
  420. package/dist/services/legacy-migrator/scanner.js +157 -0
  421. package/dist/services/legacy-migrator/scanner.js.map +1 -0
  422. package/dist/services/legacy-migrator/types.d.ts +97 -0
  423. package/dist/services/legacy-migrator/types.js +23 -0
  424. package/dist/services/legacy-migrator/types.js.map +1 -0
  425. package/dist/services/llm-proxy/instance-proxy.d.ts +17 -1
  426. package/dist/services/llm-proxy/instance-proxy.js +171 -44
  427. package/dist/services/llm-proxy/instance-proxy.js.map +1 -1
  428. package/dist/services/llm-proxy/probe.js +5 -14
  429. package/dist/services/llm-proxy/probe.js.map +1 -1
  430. package/dist/services/llm-proxy/providers.js +23 -31
  431. package/dist/services/llm-proxy/providers.js.map +1 -1
  432. package/dist/services/llm-proxy/ssrf.d.ts +11 -4
  433. package/dist/services/llm-proxy/ssrf.js +45 -7
  434. package/dist/services/llm-proxy/ssrf.js.map +1 -1
  435. package/dist/services/llm-proxy/validate-key.js +16 -37
  436. package/dist/services/llm-proxy/validate-key.js.map +1 -1
  437. package/dist/services/repair/runtime-repair.d.ts +22 -0
  438. package/dist/services/repair/runtime-repair.js +374 -0
  439. package/dist/services/repair/runtime-repair.js.map +1 -0
  440. package/dist/services/runtime/docker-network.d.ts +8 -0
  441. package/dist/services/runtime/docker-network.js +123 -0
  442. package/dist/services/runtime/docker-network.js.map +1 -0
  443. package/dist/services/runtime/driver-registry.d.ts +25 -0
  444. package/dist/services/runtime/driver-registry.js +22 -0
  445. package/dist/services/runtime/driver-registry.js.map +1 -0
  446. package/dist/services/runtime/drivers/nomad.d.ts +261 -0
  447. package/dist/services/runtime/drivers/nomad.js +3122 -0
  448. package/dist/services/runtime/drivers/nomad.js.map +1 -0
  449. package/dist/services/runtime/errors.d.ts +3 -3
  450. package/dist/services/runtime/errors.js +3 -3
  451. package/dist/services/runtime/instance.d.ts +14 -16
  452. package/dist/services/runtime/instance.js +93 -123
  453. package/dist/services/runtime/instance.js.map +1 -1
  454. package/dist/services/runtime/job-id.d.ts +1 -1
  455. package/dist/services/runtime/job-id.js +1 -1
  456. package/dist/services/runtime/mcp-shims/firewall.d.ts +2 -2
  457. package/dist/services/runtime/mcp-shims/firewall.js +2 -2
  458. package/dist/services/runtime/mcp-shims/searxng-shim.d.ts +3 -5
  459. package/dist/services/runtime/mcp-shims/searxng-shim.js +3 -5
  460. package/dist/services/runtime/mcp-shims/searxng-shim.js.map +1 -1
  461. package/dist/services/runtime/mcp-shims/write-mcp-entry.d.ts +20 -20
  462. package/dist/services/runtime/mcp-shims/write-mcp-entry.js +16 -16
  463. package/dist/services/runtime/mcp-shims/write-mcp-entry.js.map +1 -1
  464. package/dist/services/runtime/ownership-marker.d.ts +83 -0
  465. package/dist/services/runtime/ownership-marker.js +109 -0
  466. package/dist/services/runtime/ownership-marker.js.map +1 -0
  467. package/dist/services/runtime/service-manager.d.ts +2 -0
  468. package/dist/services/runtime/service-manager.js +18 -0
  469. package/dist/services/runtime/service-manager.js.map +1 -0
  470. package/dist/services/runtime/types.d.ts +23 -501
  471. package/dist/services/runtime/types.js +0 -12
  472. package/dist/services/runtime/types.js.map +1 -1
  473. package/dist/services/runtime/workload-compiler.d.ts +17 -0
  474. package/dist/services/runtime/workload-compiler.js +550 -0
  475. package/dist/services/runtime/workload-compiler.js.map +1 -0
  476. package/dist/services/runtime/workload-types.d.ts +11 -0
  477. package/dist/services/runtime/workload-types.js +2 -0
  478. package/dist/services/runtime/workload-types.js.map +1 -0
  479. package/dist/services/setup/core-manager.d.ts +50 -0
  480. package/dist/services/setup/core-manager.js +456 -0
  481. package/dist/services/setup/core-manager.js.map +1 -0
  482. package/dist/services/setup/plugin-installer.js +136 -0
  483. package/dist/services/setup/plugin-installer.js.map +1 -0
  484. package/dist/services/setup/setup-manager.d.ts +158 -0
  485. package/dist/services/setup/setup-manager.js +2724 -0
  486. package/dist/services/setup/setup-manager.js.map +1 -0
  487. package/dist/services/system/cli-command.d.ts +5 -0
  488. package/dist/services/system/cli-command.js +18 -0
  489. package/dist/services/system/cli-command.js.map +1 -0
  490. package/dist/services/system/macos-launchd.js +312 -0
  491. package/dist/services/system/macos-launchd.js.map +1 -0
  492. package/dist/services/system/repair-orchestrator.d.ts +71 -0
  493. package/dist/services/system/repair-orchestrator.js +412 -0
  494. package/dist/services/system/repair-orchestrator.js.map +1 -0
  495. package/dist/services/system/runtime-ownership.d.ts +36 -0
  496. package/dist/services/system/runtime-ownership.js +250 -0
  497. package/dist/services/system/runtime-ownership.js.map +1 -0
  498. package/dist/services/system/system-monitor.js +96 -0
  499. package/dist/services/system/system-monitor.js.map +1 -0
  500. package/dist/services/system/system-ollama-provider.d.ts +14 -0
  501. package/dist/services/system/system-ollama-provider.js +129 -0
  502. package/dist/services/system/system-ollama-provider.js.map +1 -0
  503. package/dist/services/system/system-reconciler.d.ts +59 -0
  504. package/dist/services/system/system-reconciler.js +763 -0
  505. package/dist/services/system/system-reconciler.js.map +1 -0
  506. package/dist/services/system/update-manager.d.ts +43 -0
  507. package/dist/services/system/update-manager.js +315 -0
  508. package/dist/services/system/update-manager.js.map +1 -0
  509. package/dist/services/system/upgrade-finalize.d.ts +80 -0
  510. package/dist/services/system/upgrade-finalize.js +507 -0
  511. package/dist/services/system/upgrade-finalize.js.map +1 -0
  512. package/dist/services/tasks/registry.d.ts +44 -0
  513. package/dist/services/tasks/registry.js +90 -0
  514. package/dist/services/tasks/registry.js.map +1 -0
  515. package/dist/services/telemetry/activation.d.ts +6 -2
  516. package/dist/services/telemetry/activation.js +6 -2
  517. package/dist/services/telemetry/activation.js.map +1 -1
  518. package/dist/services/telemetry/heartbeat.d.ts +6 -2
  519. package/dist/services/telemetry/heartbeat.js +6 -2
  520. package/dist/services/telemetry/heartbeat.js.map +1 -1
  521. package/dist/services/workspaces/builder.d.ts +29 -0
  522. package/dist/services/workspaces/builder.js +186 -0
  523. package/dist/services/workspaces/builder.js.map +1 -0
  524. package/dist/types.d.ts +350 -48
  525. package/dist/utils/instance-lock.d.ts +2 -2
  526. package/dist/utils/instance-lock.js +2 -2
  527. package/dist/utils/path-safety.js +1 -1
  528. package/dist/utils/service-user.d.ts +13 -0
  529. package/dist/utils/service-user.js +129 -0
  530. package/dist/utils/service-user.js.map +1 -0
  531. package/install/jishu-install.sh +107 -27
  532. package/install/jishu-uninstall.sh +8 -0
  533. package/install/post-install.sh +162 -185
  534. package/install/post-uninstall.sh +6 -0
  535. package/node_modules/@fastify/static/.github/workflows/ci.yml +1 -1
  536. package/node_modules/@fastify/static/.github/workflows/lock-threads.yml +19 -0
  537. package/node_modules/@fastify/static/LICENSE +1 -3
  538. package/node_modules/@fastify/static/example/server-benchmark.js +39 -0
  539. package/node_modules/@fastify/static/index.js +169 -23
  540. package/node_modules/@fastify/static/lib/dirList.js +20 -6
  541. package/node_modules/@fastify/static/package.json +10 -8
  542. package/node_modules/@fastify/static/test/dir-list.test.js +82 -0
  543. package/node_modules/@fastify/static/test/static.test.js +326 -4
  544. package/node_modules/@fastify/static/types/index.d.ts +0 -4
  545. package/node_modules/@fastify/static/types/index.test-d.ts +1 -1
  546. package/node_modules/brace-expansion/dist/commonjs/index.js +24 -14
  547. package/node_modules/brace-expansion/dist/commonjs/index.js.map +1 -1
  548. package/node_modules/brace-expansion/dist/esm/index.js +24 -14
  549. package/node_modules/brace-expansion/dist/esm/index.js.map +1 -1
  550. package/node_modules/brace-expansion/package.json +2 -2
  551. package/node_modules/content-disposition/README.md +21 -22
  552. package/node_modules/content-disposition/index.js +122 -44
  553. package/node_modules/content-disposition/package.json +16 -20
  554. package/node_modules/fast-uri/index.js +1 -1
  555. package/node_modules/fast-uri/package.json +1 -1
  556. package/node_modules/fast-uri/test/security.test.js +28 -0
  557. package/node_modules/fastify/SECURITY.md +1 -1
  558. package/node_modules/fastify/SPONSORS.md +6 -4
  559. package/node_modules/fastify/docs/Guides/Database.md +0 -28
  560. package/node_modules/fastify/docs/Guides/Ecosystem.md +13 -2
  561. package/node_modules/fastify/docs/Guides/Serverless.md +2 -2
  562. package/node_modules/fastify/docs/Guides/Write-Plugin.md +1 -1
  563. package/node_modules/fastify/docs/Reference/Encapsulation.md +27 -26
  564. package/node_modules/fastify/docs/Reference/Errors.md +10 -4
  565. package/node_modules/fastify/docs/Reference/HTTP2.md +10 -10
  566. package/node_modules/fastify/docs/Reference/Hooks.md +4 -4
  567. package/node_modules/fastify/docs/Reference/Index.md +14 -16
  568. package/node_modules/fastify/docs/Reference/LTS.md +12 -13
  569. package/node_modules/fastify/docs/Reference/Lifecycle.md +9 -8
  570. package/node_modules/fastify/docs/Reference/Logging.md +44 -39
  571. package/node_modules/fastify/docs/Reference/Middleware.md +21 -25
  572. package/node_modules/fastify/docs/Reference/Principles.md +2 -2
  573. package/node_modules/fastify/docs/Reference/Reply.md +6 -1
  574. package/node_modules/fastify/docs/Reference/Request.md +27 -16
  575. package/node_modules/fastify/docs/Reference/Routes.md +5 -2
  576. package/node_modules/fastify/docs/Reference/Server.md +31 -3
  577. package/node_modules/fastify/docs/Reference/Type-Providers.md +29 -5
  578. package/node_modules/fastify/docs/Reference/Validation-and-Serialization.md +15 -2
  579. package/node_modules/fastify/docs/Reference/Warnings.md +7 -6
  580. package/node_modules/fastify/eslint.config.js +7 -2
  581. package/node_modules/fastify/fastify.d.ts +8 -3
  582. package/node_modules/fastify/fastify.js +43 -14
  583. package/node_modules/fastify/lib/content-type-parser.js +13 -1
  584. package/node_modules/fastify/lib/decorate.js +11 -3
  585. package/node_modules/fastify/lib/error-handler.js +4 -3
  586. package/node_modules/fastify/lib/error-serializer.js +59 -59
  587. package/node_modules/fastify/lib/errors.js +16 -1
  588. package/node_modules/fastify/lib/four-oh-four.js +14 -9
  589. package/node_modules/fastify/lib/handle-request.js +11 -5
  590. package/node_modules/fastify/lib/plugin-override.js +2 -1
  591. package/node_modules/fastify/lib/plugin-utils.js +5 -5
  592. package/node_modules/fastify/lib/reply.js +63 -8
  593. package/node_modules/fastify/lib/request.js +14 -4
  594. package/node_modules/fastify/lib/route.js +20 -6
  595. package/node_modules/fastify/lib/schema-controller.js +1 -1
  596. package/node_modules/fastify/lib/schemas.js +37 -30
  597. package/node_modules/fastify/lib/symbols.js +3 -1
  598. package/node_modules/fastify/lib/validation.js +1 -13
  599. package/node_modules/fastify/lib/warnings.js +3 -3
  600. package/node_modules/fastify/package.json +13 -15
  601. package/node_modules/fastify/scripts/validate-ecosystem-links.js +1 -0
  602. package/node_modules/fastify/test/bundler/esbuild/package.json +1 -1
  603. package/node_modules/fastify/test/close-pipelining.test.js +1 -2
  604. package/node_modules/fastify/test/custom-http-server.test.js +38 -0
  605. package/node_modules/fastify/test/decorator-instance-properties.test.js +63 -0
  606. package/node_modules/fastify/test/diagnostics-channel/async-error-handler.test.js +74 -0
  607. package/node_modules/fastify/test/hooks.test.js +23 -0
  608. package/node_modules/fastify/test/http-methods/get.test.js +1 -1
  609. package/node_modules/fastify/test/http2/plain.test.js +135 -0
  610. package/node_modules/fastify/test/http2/secure-with-fallback.test.js +1 -1
  611. package/node_modules/fastify/test/https/https.test.js +1 -2
  612. package/node_modules/fastify/test/internals/errors.test.js +31 -1
  613. package/node_modules/fastify/test/internals/plugin.test.js +3 -1
  614. package/node_modules/fastify/test/internals/request.test.js +27 -3
  615. package/node_modules/fastify/test/internals/schema-controller-perf.test.js +33 -0
  616. package/node_modules/fastify/test/logger/logging.test.js +18 -1
  617. package/node_modules/fastify/test/logger/options.test.js +38 -1
  618. package/node_modules/fastify/test/reply-error.test.js +1 -1
  619. package/node_modules/fastify/test/reply-trailers.test.js +70 -0
  620. package/node_modules/fastify/test/request-media-type.test.js +105 -0
  621. package/node_modules/fastify/test/route-prefix.test.js +34 -0
  622. package/node_modules/fastify/test/router-options.test.js +222 -11
  623. package/node_modules/fastify/test/schema-serialization.test.js +108 -0
  624. package/node_modules/fastify/test/schema-validation.test.js +24 -0
  625. package/node_modules/fastify/test/scripts/validate-ecosystem-links.test.js +40 -57
  626. package/node_modules/fastify/test/throw.test.js +14 -0
  627. package/node_modules/fastify/test/trust-proxy.test.js +21 -0
  628. package/node_modules/fastify/test/types/content-type-parser.tst.ts +70 -0
  629. package/node_modules/fastify/test/types/decorate-request-reply.tst.ts +18 -0
  630. package/node_modules/fastify/test/types/dummy-plugin.mts +9 -0
  631. package/node_modules/fastify/test/types/errors.tst.ts +91 -0
  632. package/node_modules/fastify/test/types/fastify.tst.ts +351 -0
  633. package/node_modules/fastify/test/types/hooks.tst.ts +578 -0
  634. package/node_modules/fastify/test/types/instance.tst.ts +597 -0
  635. package/node_modules/fastify/test/types/logger.tst.ts +276 -0
  636. package/node_modules/fastify/test/types/plugin.tst.ts +96 -0
  637. package/node_modules/fastify/test/types/register.tst.ts +245 -0
  638. package/node_modules/fastify/test/types/reply.tst.ts +297 -0
  639. package/node_modules/fastify/test/types/request.tst.ts +199 -0
  640. package/node_modules/fastify/test/types/route.tst.ts +576 -0
  641. package/node_modules/fastify/test/types/schema.tst.ts +135 -0
  642. package/node_modules/fastify/test/types/serverFactory.tst.ts +37 -0
  643. package/node_modules/fastify/test/types/tsconfig.json +9 -0
  644. package/node_modules/fastify/test/types/type-provider.tst.ts +1219 -0
  645. package/node_modules/fastify/test/types/using.tst.ts +14 -0
  646. package/node_modules/fastify/types/errors.d.ts +3 -0
  647. package/node_modules/fastify/types/request.d.ts +23 -2
  648. package/node_modules/glob/README.md +39 -130
  649. package/node_modules/glob/dist/commonjs/glob.d.ts +8 -0
  650. package/node_modules/glob/dist/commonjs/glob.d.ts.map +1 -1
  651. package/node_modules/glob/dist/commonjs/glob.js +2 -1
  652. package/node_modules/glob/dist/commonjs/glob.js.map +1 -1
  653. package/node_modules/glob/dist/commonjs/index.min.js +4 -0
  654. package/node_modules/glob/dist/commonjs/index.min.js.map +7 -0
  655. package/node_modules/glob/dist/commonjs/pattern.d.ts +3 -0
  656. package/node_modules/glob/dist/commonjs/pattern.d.ts.map +1 -1
  657. package/node_modules/glob/dist/commonjs/pattern.js +4 -0
  658. package/node_modules/glob/dist/commonjs/pattern.js.map +1 -1
  659. package/node_modules/glob/dist/esm/glob.d.ts +8 -0
  660. package/node_modules/glob/dist/esm/glob.d.ts.map +1 -1
  661. package/node_modules/glob/dist/esm/glob.js +2 -1
  662. package/node_modules/glob/dist/esm/glob.js.map +1 -1
  663. package/node_modules/glob/dist/esm/index.min.js +4 -0
  664. package/node_modules/glob/dist/esm/index.min.js.map +7 -0
  665. package/node_modules/glob/dist/esm/pattern.d.ts +3 -0
  666. package/node_modules/glob/dist/esm/pattern.d.ts.map +1 -1
  667. package/node_modules/glob/dist/esm/pattern.js +4 -0
  668. package/node_modules/glob/dist/esm/pattern.js.map +1 -1
  669. package/node_modules/glob/package.json +38 -37
  670. package/node_modules/jishushell-panel/README.md +4 -4
  671. package/node_modules/jishushell-panel/output/dist/server.js +17 -6
  672. package/node_modules/jishushell-panel/output/dist/server.js.map +1 -1
  673. package/node_modules/jishushell-panel/output/public/assets/ApiKeyField-Ce5d1xna.js +1 -0
  674. package/node_modules/jishushell-panel/output/public/assets/Dashboard-BXame3yg.js +1 -0
  675. package/node_modules/jishushell-panel/output/public/assets/HermesChatPanel-BHZtPCJd.js +1 -0
  676. package/node_modules/jishushell-panel/output/public/assets/HermesConfigForm-CB3GbNX9.js +4 -0
  677. package/node_modules/jishushell-panel/output/public/assets/InitPassword-Boab9F6g.js +1 -0
  678. package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-DrIWCqo-.js +14 -0
  679. package/node_modules/jishushell-panel/output/public/assets/Login-CzpOkNau.js +1 -0
  680. package/node_modules/jishushell-panel/output/public/assets/NewInstance-CANXyCcL.js +1 -0
  681. package/node_modules/jishushell-panel/output/public/assets/ProviderRecommendations-BABo9VOC.js +1 -0
  682. package/node_modules/jishushell-panel/output/public/assets/Settings-CKp5XxFh.js +1 -0
  683. package/node_modules/jishushell-panel/output/public/assets/Setup-C7xVDPow.js +1 -0
  684. package/node_modules/jishushell-panel/output/public/assets/WeixinLoginPanel-B765Xz4C.js +1 -0
  685. package/node_modules/jishushell-panel/output/public/assets/api-C70Gt678.js +4 -0
  686. package/node_modules/jishushell-panel/output/public/assets/index-Bs6DSbiR.js +23 -0
  687. package/node_modules/jishushell-panel/output/public/assets/index-DnnqTf7s.css +1 -0
  688. package/node_modules/jishushell-panel/output/public/assets/registry-sWIZsIEF.js +2 -0
  689. package/node_modules/jishushell-panel/output/public/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  690. package/node_modules/jishushell-panel/output/public/assets/setup-task-q21GnI0E.js +1 -0
  691. package/node_modules/jishushell-panel/output/public/assets/usePolling-D4IDOQd_.js +1 -0
  692. package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-Df8aUdv8.js +1 -0
  693. package/node_modules/jishushell-panel/output/public/assets/vendor-react-0L0rjmYG.js +8 -0
  694. package/node_modules/jishushell-panel/output/public/index.html +6 -4
  695. package/node_modules/jishushell-panel/package.json +2 -2
  696. package/node_modules/semver/classes/range.js +17 -4
  697. package/node_modules/semver/package.json +2 -2
  698. package/package.json +12 -64
  699. package/scripts/check-app-path-boundaries.mjs +121 -0
  700. package/scripts/check-app-spec.mjs +123 -29
  701. package/scripts/check-architecture-boundaries.mjs +178 -0
  702. package/scripts/check-colima-launchd.mjs +10 -8
  703. package/scripts/check-integration-isolation.ts +541 -0
  704. package/scripts/check-new-file-tests.mjs +11 -3
  705. package/scripts/check-open-core-boundaries.mjs +60 -10
  706. package/scripts/check-test-layering.sh +1 -1
  707. package/scripts/fixtures/instances/hermes-sample/instance.json +3 -2
  708. package/scripts/fixtures/instances/legacy-openclaw-sample/instance.json +1 -1
  709. package/scripts/local-web-upgrade-test.README +4 -3
  710. package/scripts/local-web-upgrade-test.example.env +2 -2
  711. package/scripts/local-web-upgrade-test.sh +14 -1
  712. package/scripts/pack-gui-and-send-pi.sh +43 -0
  713. package/scripts/perf/instances.js +1 -1
  714. package/scripts/prune-open-core-dist.mjs +89 -2
  715. package/scripts/smoke/hermes-bootstrap.sh +5 -5
  716. package/templates/hermes-entrypoint.sh +19 -29
  717. package/apps/openwebui-container.yaml +0 -97
  718. package/apps/playwright-container.yaml +0 -126
  719. package/dependencies/jishushell-panel-0.6.5.tgz +0 -0
  720. package/dist/crypto-shim.d.ts +0 -1
  721. package/dist/crypto-shim.js +0 -2
  722. package/dist/crypto-shim.js.map +0 -1
  723. package/dist/routes/agent-apps.d.ts +0 -14
  724. package/dist/routes/agent-apps.js +0 -77
  725. package/dist/routes/agent-apps.js.map +0 -1
  726. package/dist/routes/internal.d.ts +0 -2
  727. package/dist/routes/internal.js +0 -55
  728. package/dist/routes/internal.js.map +0 -1
  729. package/dist/routes/openclaw-routes.d.ts +0 -22
  730. package/dist/routes/openclaw-routes.js +0 -1020
  731. package/dist/routes/openclaw-routes.js.map +0 -1
  732. package/dist/routes/runtime.d.ts +0 -15
  733. package/dist/routes/runtime.js +0 -76
  734. package/dist/routes/runtime.js.map +0 -1
  735. package/dist/services/agent-apps/catalog.d.ts +0 -33
  736. package/dist/services/agent-apps/catalog.js +0 -88
  737. package/dist/services/agent-apps/catalog.js.map +0 -1
  738. package/dist/services/agent-apps/index.d.ts +0 -36
  739. package/dist/services/agent-apps/index.js +0 -171
  740. package/dist/services/agent-apps/index.js.map +0 -1
  741. package/dist/services/agent-apps/installers/adapter-probes.d.ts +0 -49
  742. package/dist/services/agent-apps/installers/adapter-probes.js +0 -230
  743. package/dist/services/agent-apps/installers/adapter-probes.js.map +0 -1
  744. package/dist/services/agent-apps/installers/adapter.d.ts +0 -30
  745. package/dist/services/agent-apps/installers/adapter.js +0 -171
  746. package/dist/services/agent-apps/installers/adapter.js.map +0 -1
  747. package/dist/services/agent-apps/installers/registry-probe.js.map +0 -1
  748. package/dist/services/agent-apps/installers/shell-script.d.ts +0 -47
  749. package/dist/services/agent-apps/installers/shell-script.js +0 -488
  750. package/dist/services/agent-apps/installers/shell-script.js.map +0 -1
  751. package/dist/services/agent-apps/types.d.ts +0 -128
  752. package/dist/services/agent-apps/types.js +0 -17
  753. package/dist/services/agent-apps/types.js.map +0 -1
  754. package/dist/services/app/app-compiler.js +0 -185
  755. package/dist/services/app/app-compiler.js.map +0 -1
  756. package/dist/services/app/app-manager.d.ts +0 -184
  757. package/dist/services/app/app-manager.js +0 -2933
  758. package/dist/services/app/app-manager.js.map +0 -1
  759. package/dist/services/app/custom-manager.d.ts +0 -27
  760. package/dist/services/app/custom-manager.js +0 -382
  761. package/dist/services/app/custom-manager.js.map +0 -1
  762. package/dist/services/app/hermes-agent-manager.d.ts +0 -20
  763. package/dist/services/app/hermes-agent-manager.js +0 -299
  764. package/dist/services/app/hermes-agent-manager.js.map +0 -1
  765. package/dist/services/app/id-normalizer.d.ts +0 -27
  766. package/dist/services/app/id-normalizer.js +0 -77
  767. package/dist/services/app/id-normalizer.js.map +0 -1
  768. package/dist/services/app/ollama-manager.d.ts +0 -18
  769. package/dist/services/app/ollama-manager.js +0 -224
  770. package/dist/services/app/ollama-manager.js.map +0 -1
  771. package/dist/services/app/openclaw-manager.d.ts +0 -63
  772. package/dist/services/app/openclaw-manager.js +0 -1215
  773. package/dist/services/app/openclaw-manager.js.map +0 -1
  774. package/dist/services/app/paths.d.ts +0 -27
  775. package/dist/services/app/paths.js +0 -40
  776. package/dist/services/app/paths.js.map +0 -1
  777. package/dist/services/app/platform-transform.d.ts +0 -32
  778. package/dist/services/app/platform-transform.js +0 -65
  779. package/dist/services/app/platform-transform.js.map +0 -1
  780. package/dist/services/app/provide-resolver.d.ts +0 -29
  781. package/dist/services/app/provide-resolver.js +0 -135
  782. package/dist/services/app/provide-resolver.js.map +0 -1
  783. package/dist/services/app/registry.d.ts +0 -17
  784. package/dist/services/app/registry.js +0 -31
  785. package/dist/services/app/registry.js.map +0 -1
  786. package/dist/services/app/remote-spec.d.ts +0 -14
  787. package/dist/services/app/remote-spec.js +0 -58
  788. package/dist/services/app/remote-spec.js.map +0 -1
  789. package/dist/services/app/terminal-session-manager.js +0 -157
  790. package/dist/services/app/terminal-session-manager.js.map +0 -1
  791. package/dist/services/app/types.d.ts +0 -74
  792. package/dist/services/app/types.js +0 -16
  793. package/dist/services/app/types.js.map +0 -1
  794. package/dist/services/app-config-admin.d.ts +0 -17
  795. package/dist/services/app-config-admin.js +0 -177
  796. package/dist/services/app-config-admin.js.map +0 -1
  797. package/dist/services/app-create-from-installed.d.ts +0 -23
  798. package/dist/services/app-create-from-installed.js +0 -75
  799. package/dist/services/app-create-from-installed.js.map +0 -1
  800. package/dist/services/app-passwords.js +0 -173
  801. package/dist/services/app-passwords.js.map +0 -1
  802. package/dist/services/backup-admin.d.ts +0 -101
  803. package/dist/services/backup-admin.js +0 -259
  804. package/dist/services/backup-admin.js.map +0 -1
  805. package/dist/services/backup-manager.d.ts +0 -264
  806. package/dist/services/backup-manager.js +0 -2263
  807. package/dist/services/backup-manager.js.map +0 -1
  808. package/dist/services/backup-verify.js +0 -240
  809. package/dist/services/backup-verify.js.map +0 -1
  810. package/dist/services/capability-endpoint-validator.d.ts +0 -41
  811. package/dist/services/capability-endpoint-validator.js +0 -114
  812. package/dist/services/capability-endpoint-validator.js.map +0 -1
  813. package/dist/services/capability-health.d.ts +0 -16
  814. package/dist/services/capability-health.js +0 -121
  815. package/dist/services/capability-health.js.map +0 -1
  816. package/dist/services/capability-registry.d.ts +0 -29
  817. package/dist/services/capability-registry.js +0 -176
  818. package/dist/services/capability-registry.js.map +0 -1
  819. package/dist/services/capability-sync.d.ts +0 -4
  820. package/dist/services/capability-sync.js +0 -220
  821. package/dist/services/capability-sync.js.map +0 -1
  822. package/dist/services/connection-admin.d.ts +0 -74
  823. package/dist/services/connection-admin.js +0 -287
  824. package/dist/services/connection-admin.js.map +0 -1
  825. package/dist/services/connection-apply.d.ts +0 -91
  826. package/dist/services/connection-apply.js +0 -471
  827. package/dist/services/connection-apply.js.map +0 -1
  828. package/dist/services/connection-resolver.d.ts +0 -65
  829. package/dist/services/connection-resolver.js +0 -281
  830. package/dist/services/connection-resolver.js.map +0 -1
  831. package/dist/services/connection-transactor.d.ts +0 -39
  832. package/dist/services/connection-transactor.js +0 -354
  833. package/dist/services/connection-transactor.js.map +0 -1
  834. package/dist/services/core-manager.d.ts +0 -50
  835. package/dist/services/core-manager.js +0 -411
  836. package/dist/services/core-manager.js.map +0 -1
  837. package/dist/services/external-mounts.js +0 -187
  838. package/dist/services/external-mounts.js.map +0 -1
  839. package/dist/services/files-manager.d.ts +0 -252
  840. package/dist/services/files-manager.js +0 -1156
  841. package/dist/services/files-manager.js.map +0 -1
  842. package/dist/services/files-mounts.d.ts +0 -42
  843. package/dist/services/files-mounts.js +0 -207
  844. package/dist/services/files-mounts.js.map +0 -1
  845. package/dist/services/instance-admin.d.ts +0 -26
  846. package/dist/services/instance-admin.js +0 -218
  847. package/dist/services/instance-admin.js.map +0 -1
  848. package/dist/services/instance-manager.d.ts +0 -192
  849. package/dist/services/instance-manager.js +0 -1289
  850. package/dist/services/instance-manager.js.map +0 -1
  851. package/dist/services/macos-launchd.js +0 -312
  852. package/dist/services/macos-launchd.js.map +0 -1
  853. package/dist/services/nomad-manager.d.ts +0 -307
  854. package/dist/services/nomad-manager.js +0 -3958
  855. package/dist/services/nomad-manager.js.map +0 -1
  856. package/dist/services/organize/applier.js +0 -218
  857. package/dist/services/organize/applier.js.map +0 -1
  858. package/dist/services/organize/rules.js +0 -286
  859. package/dist/services/organize/rules.js.map +0 -1
  860. package/dist/services/organize/scanner.js +0 -366
  861. package/dist/services/organize/scanner.js.map +0 -1
  862. package/dist/services/organize/store.js +0 -82
  863. package/dist/services/organize/store.js.map +0 -1
  864. package/dist/services/plugin-installer.js +0 -128
  865. package/dist/services/plugin-installer.js.map +0 -1
  866. package/dist/services/process-manager.d.ts +0 -25
  867. package/dist/services/process-manager.js +0 -568
  868. package/dist/services/process-manager.js.map +0 -1
  869. package/dist/services/runtime/adapters/custom.d.ts +0 -20
  870. package/dist/services/runtime/adapters/custom.js +0 -188
  871. package/dist/services/runtime/adapters/custom.js.map +0 -1
  872. package/dist/services/runtime/adapters/hermes.d.ts +0 -204
  873. package/dist/services/runtime/adapters/hermes.js +0 -1684
  874. package/dist/services/runtime/adapters/hermes.js.map +0 -1
  875. package/dist/services/runtime/adapters/openclaw-mcporter.d.ts +0 -45
  876. package/dist/services/runtime/adapters/openclaw-mcporter.js +0 -108
  877. package/dist/services/runtime/adapters/openclaw-mcporter.js.map +0 -1
  878. package/dist/services/runtime/adapters/openclaw.d.ts +0 -426
  879. package/dist/services/runtime/adapters/openclaw.js +0 -3975
  880. package/dist/services/runtime/adapters/openclaw.js.map +0 -1
  881. package/dist/services/runtime/index.d.ts +0 -34
  882. package/dist/services/runtime/index.js +0 -51
  883. package/dist/services/runtime/index.js.map +0 -1
  884. package/dist/services/runtime/mcp-shims/anythingllm-shim.d.ts +0 -46
  885. package/dist/services/runtime/mcp-shims/anythingllm-shim.js +0 -281
  886. package/dist/services/runtime/mcp-shims/anythingllm-shim.js.map +0 -1
  887. package/dist/services/runtime/mcp-shims/drive-shim.js +0 -490
  888. package/dist/services/runtime/mcp-shims/drive-shim.js.map +0 -1
  889. package/dist/services/runtime/mcp-shims/jishukb-shim.d.ts +0 -48
  890. package/dist/services/runtime/mcp-shims/jishukb-shim.js +0 -723
  891. package/dist/services/runtime/mcp-shims/jishukb-shim.js.map +0 -1
  892. package/dist/services/runtime/mcp-shims/mcporter-lite.js +0 -276
  893. package/dist/services/runtime/mcp-shims/mcporter-lite.js.map +0 -1
  894. package/dist/services/runtime/migrations.d.ts +0 -23
  895. package/dist/services/runtime/migrations.js +0 -125
  896. package/dist/services/runtime/migrations.js.map +0 -1
  897. package/dist/services/runtime/registry.d.ts +0 -13
  898. package/dist/services/runtime/registry.js +0 -32
  899. package/dist/services/runtime/registry.js.map +0 -1
  900. package/dist/services/runtime-identity.d.ts +0 -13
  901. package/dist/services/runtime-identity.js +0 -166
  902. package/dist/services/runtime-identity.js.map +0 -1
  903. package/dist/services/runtime-repair.d.ts +0 -52
  904. package/dist/services/runtime-repair.js +0 -352
  905. package/dist/services/runtime-repair.js.map +0 -1
  906. package/dist/services/setup-manager.d.ts +0 -158
  907. package/dist/services/setup-manager.js +0 -2740
  908. package/dist/services/setup-manager.js.map +0 -1
  909. package/dist/services/suggestions.d.ts +0 -27
  910. package/dist/services/suggestions.js +0 -133
  911. package/dist/services/suggestions.js.map +0 -1
  912. package/dist/services/system-monitor.js +0 -79
  913. package/dist/services/system-monitor.js.map +0 -1
  914. package/dist/services/system-ollama-provider.d.ts +0 -14
  915. package/dist/services/system-ollama-provider.js +0 -125
  916. package/dist/services/system-ollama-provider.js.map +0 -1
  917. package/dist/services/system-reconciler.d.ts +0 -72
  918. package/dist/services/system-reconciler.js +0 -600
  919. package/dist/services/system-reconciler.js.map +0 -1
  920. package/dist/services/task-registry.d.ts +0 -44
  921. package/dist/services/task-registry.js +0 -76
  922. package/dist/services/task-registry.js.map +0 -1
  923. package/dist/services/types-shim.d.ts +0 -16
  924. package/dist/services/types-shim.js +0 -2
  925. package/dist/services/types-shim.js.map +0 -1
  926. package/dist/services/update-manager.d.ts +0 -47
  927. package/dist/services/update-manager.js +0 -351
  928. package/dist/services/update-manager.js.map +0 -1
  929. package/dist/services/webdav/server.d.ts +0 -24
  930. package/dist/services/webdav/server.js +0 -420
  931. package/dist/services/webdav/server.js.map +0 -1
  932. package/dist/services/webdav/xml-builder.js.map +0 -1
  933. package/dist/services/workspace-builder.d.ts +0 -29
  934. package/dist/services/workspace-builder.js +0 -188
  935. package/dist/services/workspace-builder.js.map +0 -1
  936. package/node_modules/@fastify/static/.github/stale.yml +0 -21
  937. package/node_modules/@isaacs/cliui/LICENSE.md +0 -63
  938. package/node_modules/@isaacs/cliui/README.md +0 -151
  939. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.d.ts +0 -4
  940. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.d.ts.map +0 -1
  941. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.js +0 -16
  942. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.js.map +0 -1
  943. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.d.ts +0 -34
  944. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.d.ts.map +0 -1
  945. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.js +0 -170
  946. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.js.map +0 -1
  947. package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.d.ts +0 -6
  948. package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.d.ts.map +0 -1
  949. package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.js +0 -307
  950. package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.js.map +0 -1
  951. package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.d.ts +0 -2
  952. package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.d.ts.map +0 -1
  953. package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.js +0 -7
  954. package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.js.map +0 -1
  955. package/node_modules/@isaacs/cliui/dist/commonjs/index.d.ts +0 -41
  956. package/node_modules/@isaacs/cliui/dist/commonjs/index.d.ts.map +0 -1
  957. package/node_modules/@isaacs/cliui/dist/commonjs/index.js +0 -322
  958. package/node_modules/@isaacs/cliui/dist/commonjs/index.js.map +0 -1
  959. package/node_modules/@isaacs/cliui/dist/commonjs/index.min.js +0 -12
  960. package/node_modules/@isaacs/cliui/dist/commonjs/index.min.js.map +0 -7
  961. package/node_modules/@isaacs/cliui/dist/commonjs/package.json +0 -3
  962. package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.d.ts +0 -5
  963. package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.d.ts.map +0 -1
  964. package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.js +0 -49
  965. package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.js.map +0 -1
  966. package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.d.ts +0 -2
  967. package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.d.ts.map +0 -1
  968. package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.js +0 -8
  969. package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.js.map +0 -1
  970. package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.d.ts +0 -7
  971. package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.d.ts.map +0 -1
  972. package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.js +0 -176
  973. package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.js.map +0 -1
  974. package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.d.ts +0 -4
  975. package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.d.ts.map +0 -1
  976. package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.js +0 -12
  977. package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.js.map +0 -1
  978. package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.d.ts +0 -34
  979. package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.d.ts.map +0 -1
  980. package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.js +0 -167
  981. package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.js.map +0 -1
  982. package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.d.ts +0 -6
  983. package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.d.ts.map +0 -1
  984. package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.js +0 -299
  985. package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.js.map +0 -1
  986. package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.d.ts +0 -2
  987. package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.d.ts.map +0 -1
  988. package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.js +0 -3
  989. package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.js.map +0 -1
  990. package/node_modules/@isaacs/cliui/dist/esm/index.d.ts +0 -41
  991. package/node_modules/@isaacs/cliui/dist/esm/index.d.ts.map +0 -1
  992. package/node_modules/@isaacs/cliui/dist/esm/index.js +0 -317
  993. package/node_modules/@isaacs/cliui/dist/esm/index.js.map +0 -1
  994. package/node_modules/@isaacs/cliui/dist/esm/index.min.js +0 -12
  995. package/node_modules/@isaacs/cliui/dist/esm/index.min.js.map +0 -7
  996. package/node_modules/@isaacs/cliui/dist/esm/package.json +0 -3
  997. package/node_modules/@isaacs/cliui/dist/esm/string-width/index.d.ts +0 -5
  998. package/node_modules/@isaacs/cliui/dist/esm/string-width/index.d.ts.map +0 -1
  999. package/node_modules/@isaacs/cliui/dist/esm/string-width/index.js +0 -46
  1000. package/node_modules/@isaacs/cliui/dist/esm/string-width/index.js.map +0 -1
  1001. package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.d.ts +0 -2
  1002. package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.d.ts.map +0 -1
  1003. package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.js +0 -4
  1004. package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.js.map +0 -1
  1005. package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.d.ts +0 -7
  1006. package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.d.ts.map +0 -1
  1007. package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.js +0 -172
  1008. package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.js.map +0 -1
  1009. package/node_modules/@isaacs/cliui/package.json +0 -163
  1010. package/node_modules/content-disposition/HISTORY.md +0 -60
  1011. package/node_modules/cross-spawn/LICENSE +0 -21
  1012. package/node_modules/cross-spawn/README.md +0 -89
  1013. package/node_modules/cross-spawn/index.js +0 -39
  1014. package/node_modules/cross-spawn/lib/enoent.js +0 -59
  1015. package/node_modules/cross-spawn/lib/parse.js +0 -91
  1016. package/node_modules/cross-spawn/lib/util/escape.js +0 -47
  1017. package/node_modules/cross-spawn/lib/util/readShebang.js +0 -23
  1018. package/node_modules/cross-spawn/lib/util/resolveCommand.js +0 -52
  1019. package/node_modules/cross-spawn/package.json +0 -73
  1020. package/node_modules/fastify/test/types/content-type-parser.test-d.ts +0 -72
  1021. package/node_modules/fastify/test/types/decorate-request-reply.test-d.ts +0 -18
  1022. package/node_modules/fastify/test/types/dummy-plugin.ts +0 -9
  1023. package/node_modules/fastify/test/types/errors.test-d.ts +0 -90
  1024. package/node_modules/fastify/test/types/fastify.test-d.ts +0 -352
  1025. package/node_modules/fastify/test/types/hooks.test-d.ts +0 -550
  1026. package/node_modules/fastify/test/types/import.ts +0 -2
  1027. package/node_modules/fastify/test/types/instance.test-d.ts +0 -588
  1028. package/node_modules/fastify/test/types/logger.test-d.ts +0 -277
  1029. package/node_modules/fastify/test/types/plugin.test-d.ts +0 -97
  1030. package/node_modules/fastify/test/types/register.test-d.ts +0 -237
  1031. package/node_modules/fastify/test/types/reply.test-d.ts +0 -254
  1032. package/node_modules/fastify/test/types/request.test-d.ts +0 -188
  1033. package/node_modules/fastify/test/types/route.test-d.ts +0 -553
  1034. package/node_modules/fastify/test/types/schema.test-d.ts +0 -135
  1035. package/node_modules/fastify/test/types/serverFactory.test-d.ts +0 -37
  1036. package/node_modules/fastify/test/types/type-provider.test-d.ts +0 -1213
  1037. package/node_modules/fastify/test/types/using.test-d.ts +0 -17
  1038. package/node_modules/foreground-child/LICENSE +0 -15
  1039. package/node_modules/foreground-child/README.md +0 -128
  1040. package/node_modules/foreground-child/dist/commonjs/all-signals.d.ts +0 -2
  1041. package/node_modules/foreground-child/dist/commonjs/all-signals.d.ts.map +0 -1
  1042. package/node_modules/foreground-child/dist/commonjs/all-signals.js +0 -58
  1043. package/node_modules/foreground-child/dist/commonjs/all-signals.js.map +0 -1
  1044. package/node_modules/foreground-child/dist/commonjs/index.d.ts +0 -58
  1045. package/node_modules/foreground-child/dist/commonjs/index.d.ts.map +0 -1
  1046. package/node_modules/foreground-child/dist/commonjs/index.js +0 -123
  1047. package/node_modules/foreground-child/dist/commonjs/index.js.map +0 -1
  1048. package/node_modules/foreground-child/dist/commonjs/package.json +0 -3
  1049. package/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts +0 -6
  1050. package/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts.map +0 -1
  1051. package/node_modules/foreground-child/dist/commonjs/proxy-signals.js +0 -38
  1052. package/node_modules/foreground-child/dist/commonjs/proxy-signals.js.map +0 -1
  1053. package/node_modules/foreground-child/dist/commonjs/watchdog.d.ts +0 -10
  1054. package/node_modules/foreground-child/dist/commonjs/watchdog.d.ts.map +0 -1
  1055. package/node_modules/foreground-child/dist/commonjs/watchdog.js +0 -50
  1056. package/node_modules/foreground-child/dist/commonjs/watchdog.js.map +0 -1
  1057. package/node_modules/foreground-child/dist/esm/all-signals.d.ts +0 -2
  1058. package/node_modules/foreground-child/dist/esm/all-signals.d.ts.map +0 -1
  1059. package/node_modules/foreground-child/dist/esm/all-signals.js +0 -52
  1060. package/node_modules/foreground-child/dist/esm/all-signals.js.map +0 -1
  1061. package/node_modules/foreground-child/dist/esm/index.d.ts +0 -58
  1062. package/node_modules/foreground-child/dist/esm/index.d.ts.map +0 -1
  1063. package/node_modules/foreground-child/dist/esm/index.js +0 -115
  1064. package/node_modules/foreground-child/dist/esm/index.js.map +0 -1
  1065. package/node_modules/foreground-child/dist/esm/package.json +0 -3
  1066. package/node_modules/foreground-child/dist/esm/proxy-signals.d.ts +0 -6
  1067. package/node_modules/foreground-child/dist/esm/proxy-signals.d.ts.map +0 -1
  1068. package/node_modules/foreground-child/dist/esm/proxy-signals.js +0 -34
  1069. package/node_modules/foreground-child/dist/esm/proxy-signals.js.map +0 -1
  1070. package/node_modules/foreground-child/dist/esm/watchdog.d.ts +0 -10
  1071. package/node_modules/foreground-child/dist/esm/watchdog.d.ts.map +0 -1
  1072. package/node_modules/foreground-child/dist/esm/watchdog.js +0 -46
  1073. package/node_modules/foreground-child/dist/esm/watchdog.js.map +0 -1
  1074. package/node_modules/foreground-child/package.json +0 -106
  1075. package/node_modules/glob/dist/esm/bin.d.mts +0 -3
  1076. package/node_modules/glob/dist/esm/bin.d.mts.map +0 -1
  1077. package/node_modules/glob/dist/esm/bin.mjs +0 -346
  1078. package/node_modules/glob/dist/esm/bin.mjs.map +0 -1
  1079. package/node_modules/isexe/.npmignore +0 -2
  1080. package/node_modules/isexe/LICENSE +0 -15
  1081. package/node_modules/isexe/README.md +0 -51
  1082. package/node_modules/isexe/index.js +0 -57
  1083. package/node_modules/isexe/mode.js +0 -41
  1084. package/node_modules/isexe/package.json +0 -31
  1085. package/node_modules/isexe/test/basic.js +0 -221
  1086. package/node_modules/isexe/windows.js +0 -42
  1087. package/node_modules/jackspeak/LICENSE.md +0 -55
  1088. package/node_modules/jackspeak/README.md +0 -394
  1089. package/node_modules/jackspeak/dist/commonjs/index.d.ts +0 -323
  1090. package/node_modules/jackspeak/dist/commonjs/index.d.ts.map +0 -1
  1091. package/node_modules/jackspeak/dist/commonjs/index.js +0 -944
  1092. package/node_modules/jackspeak/dist/commonjs/index.js.map +0 -1
  1093. package/node_modules/jackspeak/dist/commonjs/index.min.js +0 -33
  1094. package/node_modules/jackspeak/dist/commonjs/index.min.js.map +0 -7
  1095. package/node_modules/jackspeak/dist/commonjs/package.json +0 -3
  1096. package/node_modules/jackspeak/dist/esm/index.d.ts +0 -323
  1097. package/node_modules/jackspeak/dist/esm/index.d.ts.map +0 -1
  1098. package/node_modules/jackspeak/dist/esm/index.js +0 -936
  1099. package/node_modules/jackspeak/dist/esm/index.js.map +0 -1
  1100. package/node_modules/jackspeak/dist/esm/index.min.js +0 -33
  1101. package/node_modules/jackspeak/dist/esm/index.min.js.map +0 -7
  1102. package/node_modules/jackspeak/dist/esm/package.json +0 -3
  1103. package/node_modules/jackspeak/package.json +0 -115
  1104. package/node_modules/jishushell-panel/output/public/assets/ApiKeyField-D1i7zWXR.js +0 -1
  1105. package/node_modules/jishushell-panel/output/public/assets/Dashboard-sWIvL43F.js +0 -1
  1106. package/node_modules/jishushell-panel/output/public/assets/HermesChatPanel-DQ8RyvQY.js +0 -1
  1107. package/node_modules/jishushell-panel/output/public/assets/HermesConfigForm-tIbPP1sB.js +0 -4
  1108. package/node_modules/jishushell-panel/output/public/assets/InitPassword-C3Slq3Dd.js +0 -1
  1109. package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-7JqY9tq4.js +0 -92
  1110. package/node_modules/jishushell-panel/output/public/assets/Login-BXLDJlQN.js +0 -1
  1111. package/node_modules/jishushell-panel/output/public/assets/NewInstance-dLc5Xrpx.js +0 -1
  1112. package/node_modules/jishushell-panel/output/public/assets/ProviderRecommendations-DIAXxesl.js +0 -1
  1113. package/node_modules/jishushell-panel/output/public/assets/Settings-Bd5utbBh.js +0 -1
  1114. package/node_modules/jishushell-panel/output/public/assets/Setup-Yn9_20FL.js +0 -1
  1115. package/node_modules/jishushell-panel/output/public/assets/WeixinLoginPanel-C21doQTJ.js +0 -9
  1116. package/node_modules/jishushell-panel/output/public/assets/index-CCkaIEjn.js +0 -20
  1117. package/node_modules/jishushell-panel/output/public/assets/index-D7qxy-Vh.css +0 -1
  1118. package/node_modules/jishushell-panel/output/public/assets/registry-B2ZQZXWL.js +0 -2
  1119. package/node_modules/jishushell-panel/output/public/assets/usePolling-BFZm4do_.js +0 -1
  1120. package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-DqPtOicc.js +0 -9
  1121. package/node_modules/jishushell-panel/output/public/assets/vendor-react-DW5juQin.js +0 -59
  1122. package/node_modules/package-json-from-dist/LICENSE.md +0 -63
  1123. package/node_modules/package-json-from-dist/README.md +0 -110
  1124. package/node_modules/package-json-from-dist/dist/commonjs/index.d.ts +0 -89
  1125. package/node_modules/package-json-from-dist/dist/commonjs/index.d.ts.map +0 -1
  1126. package/node_modules/package-json-from-dist/dist/commonjs/index.js +0 -134
  1127. package/node_modules/package-json-from-dist/dist/commonjs/index.js.map +0 -1
  1128. package/node_modules/package-json-from-dist/dist/commonjs/package.json +0 -3
  1129. package/node_modules/package-json-from-dist/dist/esm/index.d.ts +0 -89
  1130. package/node_modules/package-json-from-dist/dist/esm/index.d.ts.map +0 -1
  1131. package/node_modules/package-json-from-dist/dist/esm/index.js +0 -129
  1132. package/node_modules/package-json-from-dist/dist/esm/index.js.map +0 -1
  1133. package/node_modules/package-json-from-dist/dist/esm/package.json +0 -3
  1134. package/node_modules/package-json-from-dist/package.json +0 -68
  1135. package/node_modules/path-key/index.d.ts +0 -40
  1136. package/node_modules/path-key/index.js +0 -16
  1137. package/node_modules/path-key/license +0 -9
  1138. package/node_modules/path-key/package.json +0 -39
  1139. package/node_modules/path-key/readme.md +0 -61
  1140. package/node_modules/safe-buffer/LICENSE +0 -21
  1141. package/node_modules/safe-buffer/README.md +0 -584
  1142. package/node_modules/safe-buffer/index.d.ts +0 -187
  1143. package/node_modules/safe-buffer/index.js +0 -65
  1144. package/node_modules/safe-buffer/package.json +0 -51
  1145. package/node_modules/shebang-command/index.js +0 -19
  1146. package/node_modules/shebang-command/license +0 -9
  1147. package/node_modules/shebang-command/package.json +0 -34
  1148. package/node_modules/shebang-command/readme.md +0 -34
  1149. package/node_modules/shebang-regex/index.d.ts +0 -22
  1150. package/node_modules/shebang-regex/index.js +0 -2
  1151. package/node_modules/shebang-regex/license +0 -9
  1152. package/node_modules/shebang-regex/package.json +0 -35
  1153. package/node_modules/shebang-regex/readme.md +0 -33
  1154. package/node_modules/signal-exit/LICENSE.txt +0 -16
  1155. package/node_modules/signal-exit/README.md +0 -74
  1156. package/node_modules/signal-exit/dist/cjs/browser.d.ts +0 -12
  1157. package/node_modules/signal-exit/dist/cjs/browser.d.ts.map +0 -1
  1158. package/node_modules/signal-exit/dist/cjs/browser.js +0 -10
  1159. package/node_modules/signal-exit/dist/cjs/browser.js.map +0 -1
  1160. package/node_modules/signal-exit/dist/cjs/index.d.ts +0 -48
  1161. package/node_modules/signal-exit/dist/cjs/index.d.ts.map +0 -1
  1162. package/node_modules/signal-exit/dist/cjs/index.js +0 -279
  1163. package/node_modules/signal-exit/dist/cjs/index.js.map +0 -1
  1164. package/node_modules/signal-exit/dist/cjs/package.json +0 -3
  1165. package/node_modules/signal-exit/dist/cjs/signals.d.ts +0 -29
  1166. package/node_modules/signal-exit/dist/cjs/signals.d.ts.map +0 -1
  1167. package/node_modules/signal-exit/dist/cjs/signals.js +0 -42
  1168. package/node_modules/signal-exit/dist/cjs/signals.js.map +0 -1
  1169. package/node_modules/signal-exit/dist/mjs/browser.d.ts +0 -12
  1170. package/node_modules/signal-exit/dist/mjs/browser.d.ts.map +0 -1
  1171. package/node_modules/signal-exit/dist/mjs/browser.js +0 -4
  1172. package/node_modules/signal-exit/dist/mjs/browser.js.map +0 -1
  1173. package/node_modules/signal-exit/dist/mjs/index.d.ts +0 -48
  1174. package/node_modules/signal-exit/dist/mjs/index.d.ts.map +0 -1
  1175. package/node_modules/signal-exit/dist/mjs/index.js +0 -275
  1176. package/node_modules/signal-exit/dist/mjs/index.js.map +0 -1
  1177. package/node_modules/signal-exit/dist/mjs/package.json +0 -3
  1178. package/node_modules/signal-exit/dist/mjs/signals.d.ts +0 -29
  1179. package/node_modules/signal-exit/dist/mjs/signals.d.ts.map +0 -1
  1180. package/node_modules/signal-exit/dist/mjs/signals.js +0 -39
  1181. package/node_modules/signal-exit/dist/mjs/signals.js.map +0 -1
  1182. package/node_modules/signal-exit/package.json +0 -106
  1183. package/node_modules/which/CHANGELOG.md +0 -166
  1184. package/node_modules/which/LICENSE +0 -15
  1185. package/node_modules/which/README.md +0 -54
  1186. package/node_modules/which/bin/node-which +0 -52
  1187. package/node_modules/which/package.json +0 -43
  1188. package/node_modules/which/which.js +0 -125
  1189. package/scripts/check-adapter-isolation.ts +0 -293
  1190. /package/dist/services/{app → app-common}/app-compiler.d.ts +0 -0
  1191. /package/dist/services/{app → app-common}/terminal-session-manager.d.ts +0 -0
  1192. /package/dist/services/{backup-verify.d.ts → backup/backup-verify.d.ts} +0 -0
  1193. /package/dist/services/{external-mounts.d.ts → files/external-mounts.d.ts} +0 -0
  1194. /package/dist/services/{organize → files/organize}/applier.d.ts +0 -0
  1195. /package/dist/services/{organize → files/organize}/rules.d.ts +0 -0
  1196. /package/dist/services/{organize → files/organize}/scanner.d.ts +0 -0
  1197. /package/dist/services/{organize → files/organize}/store.d.ts +0 -0
  1198. /package/dist/services/{webdav → files/webdav}/xml-builder.d.ts +0 -0
  1199. /package/dist/services/{webdav → files/webdav}/xml-builder.js +0 -0
  1200. /package/dist/services/{app-passwords.d.ts → instances/passwords.d.ts} +0 -0
  1201. /package/dist/services/{agent-apps → integrations/installable}/installers/registry-probe.d.ts +0 -0
  1202. /package/dist/services/{agent-apps → integrations/installable}/installers/registry-probe.js +0 -0
  1203. /package/dist/services/{runtime/mcp-shims → integrations/openclaw}/drive-shim.d.ts +0 -0
  1204. /package/dist/services/{runtime/mcp-shims → integrations/openclaw}/mcporter-lite.d.ts +0 -0
  1205. /package/dist/services/{plugin-installer.d.ts → setup/plugin-installer.d.ts} +0 -0
  1206. /package/dist/services/{macos-launchd.d.ts → system/macos-launchd.d.ts} +0 -0
  1207. /package/dist/services/{system-monitor.d.ts → system/system-monitor.d.ts} +0 -0
@@ -0,0 +1,1194 @@
1
+ /**
2
+ * OpenClaw-specific HTTP routes — private Panel route integration.
3
+ *
4
+ * These endpoints know about the OpenClaw workspace layout (mcporter.json,
5
+ * .openclaw/workspace/skills/, sessions.json), OpenClaw's Feishu/WeChat
6
+ * channel plugins, and the OpenClaw control-UI HTML that needs
7
+ * boot-script injection. The OpenClaw integration registers them through the
8
+ * AppIntegration route hook; the framework only dispatches that hook.
9
+ */
10
+ import { createHash } from "crypto";
11
+ import { existsSync, realpathSync } from "fs";
12
+ import { readFile, stat } from "fs/promises";
13
+ import { request as httpRequest } from "http";
14
+ import { join } from "path";
15
+ import { PROXY_IDENTITY_HEADERS } from "../../../constants.js";
16
+ import * as appLifecycle from "../../app-common/lifecycle-service.js";
17
+ import * as appService from "../../app-common/service.js";
18
+ import { invalidateExecutionOwner } from "../../app-common/execution-owner.js";
19
+ import { readAppConfig, writeAppConfig } from "../../instances/config-admin.js";
20
+ import { assertNotLocked } from "../../backup/backup-manager.js";
21
+ import * as instanceManager from "../../instances/manager.js";
22
+ import { markRuntimeRepairRestartApplied } from "../../repair/runtime-repair.js";
23
+ import * as pluginInstaller from "../../setup/plugin-installer.js";
24
+ import { supportsChatPanelUi } from "../../runtime/instance.js";
25
+ import { getIntegration, resolvePrimaryIntegrationKind } from "../index.js";
26
+ import { addTemporaryBrowserAllowedHostname, DEFAULT_BROWSER_ALLOWED_HOSTNAMES, mergeBrowserAllowedHostnames, normalizeBrowserAllowedHostname, readTemporaryBrowserAllowedHostnames, removeTemporaryBrowserAllowedHostname, } from "../../capabilities/browser-policy.js";
27
+ import { writeConfigFile, ensureDirContainer } from "../../../utils/fs.js";
28
+ import { validateId } from "../../instances/admin.js";
29
+ import { inferRequestOrigin } from "../../http/request-utils.js";
30
+ import { HOP_BY_HOP } from "../../http/proxy-utils.js";
31
+ import { getSvc } from "../../runtime/service-manager.js";
32
+ import { ensureOpenclawControlUiAllowedOrigin } from "./integration.js";
33
+ /**
34
+ * Register all OpenClaw-specific HTTP endpoints on the given Fastify app.
35
+ * Called by the Panel route composition at server startup.
36
+ */
37
+ const REFERER_INSTANCE_ID_RE = /\/api\/integrations\/openclaw\/instances\/([a-z0-9][a-z0-9-]*)\/control-ui(?:\/|$|\?|#)/i;
38
+ function resolveOpenclawHome(instanceId) {
39
+ const integration = getIntegration("openclaw");
40
+ if (typeof integration.resolveAgentHome !== "function") {
41
+ throw new Error("OpenClaw integration does not expose its canonical home path");
42
+ }
43
+ return integration.resolveAgentHome(instanceId);
44
+ }
45
+ function normalizeBrowserHostCandidate(value) {
46
+ return normalizeBrowserAllowedHostname(value);
47
+ }
48
+ function mergeHostnames(...lists) {
49
+ return lists.reduce((acc, list) => mergeBrowserAllowedHostnames(acc, list), []);
50
+ }
51
+ /**
52
+ * Extract the instance id from an iframe Referer header that points at the
53
+ * control-UI proxy (`/api/integrations/openclaw/instances/<id>/control-ui/...`). Used by the
54
+ * referer-forwarded proxy to recover routing context for OpenClaw chat
55
+ * messages that embed jishushell-absolute URLs (e.g. screenshot media).
56
+ *
57
+ * Returns null when the Referer is missing, malformed, or doesn't match a
58
+ * control UI URL — caller should fall through to a 404.
59
+ */
60
+ export function extractRefererInstanceId(refererHeader) {
61
+ const ref = typeof refererHeader === "string"
62
+ ? refererHeader
63
+ : Array.isArray(refererHeader)
64
+ ? String(refererHeader[0] ?? "")
65
+ : "";
66
+ if (!ref)
67
+ return null;
68
+ const m = ref.match(REFERER_INSTANCE_ID_RE);
69
+ return m ? m[1] : null;
70
+ }
71
+ export function registerOpenclawRoutes(app) {
72
+ app.post("/api/integrations/openclaw/instances/:id/browser-allowlist", async (req, reply) => {
73
+ const idErr = validateId(req.params.id);
74
+ if (idErr)
75
+ return reply.status(400).send({ detail: idErr });
76
+ try {
77
+ assertNotLocked(req.params.id);
78
+ }
79
+ catch (e) {
80
+ return reply.status(e.statusCode || 409).send({ detail: e.message });
81
+ }
82
+ const instance = appService.getInstance(req.params.id);
83
+ if (!instance)
84
+ return reply.status(404).send({ detail: "Instance not found" });
85
+ if (resolvePrimaryIntegrationKind(instance) !== "openclaw") {
86
+ return reply.status(400).send({ detail: "Browser allowlist actions are only supported for OpenClaw instances" });
87
+ }
88
+ const host = normalizeBrowserHostCandidate(req.body?.host);
89
+ if (!host)
90
+ return reply.status(400).send({ detail: "A valid hostname is required" });
91
+ const scope = req.body?.scope;
92
+ if (scope !== "temporary" && scope !== "persistent") {
93
+ return reply.status(400).send({ detail: "scope must be 'temporary' or 'persistent'" });
94
+ }
95
+ const current = await readAppConfig(req.params.id);
96
+ if (!current || typeof current !== "object" || Array.isArray(current)) {
97
+ return reply.status(400).send({ detail: "Config must be a JSON object" });
98
+ }
99
+ const next = structuredClone(current);
100
+ next.browser ??= {};
101
+ next.browser.ssrfPolicy ??= {};
102
+ const existing = Array.isArray(next.browser.ssrfPolicy.allowedHostnames)
103
+ ? next.browser.ssrfPolicy.allowedHostnames.map((entry) => String(entry))
104
+ : [];
105
+ next.browser.ssrfPolicy.allowedHostnames = mergeHostnames(existing, [host]);
106
+ const alreadyPersistent = existing.some((entry) => normalizeBrowserHostCandidate(entry) === host);
107
+ const addedTemporary = scope === "temporary" && !alreadyPersistent;
108
+ try {
109
+ if (addedTemporary) {
110
+ addTemporaryBrowserAllowedHostname(req.params.id, host);
111
+ }
112
+ else if (scope === "persistent") {
113
+ removeTemporaryBrowserAllowedHostname(req.params.id, host);
114
+ }
115
+ await writeAppConfig(req.params.id, next);
116
+ const controlUiOrigin = inferRequestOrigin(req);
117
+ const restart = controlUiOrigin
118
+ ? await appLifecycle.restartInstance(req.params.id, { controlUiOrigin })
119
+ : await appLifecycle.restartInstance(req.params.id);
120
+ invalidateExecutionOwner(req.params.id);
121
+ if (!restart.ok) {
122
+ return reply.status(400).send({ detail: restart.error || "Failed to restart instance after updating the browser allowlist" });
123
+ }
124
+ markRuntimeRepairRestartApplied(req.params.id);
125
+ const temporaryAllowedHostnames = readTemporaryBrowserAllowedHostnames(req.params.id);
126
+ const persistentAllowedHostnames = mergeHostnames(next.browser.ssrfPolicy.allowedHostnames, [])
127
+ .filter((entry) => !temporaryAllowedHostnames.includes(entry));
128
+ return {
129
+ ok: true,
130
+ host,
131
+ scope,
132
+ temporaryAllowedHostnames,
133
+ persistentAllowedHostnames,
134
+ effectiveAllowedHostnames: mergeHostnames(persistentAllowedHostnames, temporaryAllowedHostnames),
135
+ restart,
136
+ };
137
+ }
138
+ catch (error) {
139
+ if (addedTemporary)
140
+ removeTemporaryBrowserAllowedHostname(req.params.id, host);
141
+ throw error;
142
+ }
143
+ });
144
+ app.post("/api/integrations/openclaw/instances/:id/browser-allow-all", async (req, reply) => {
145
+ const idErr = validateId(req.params.id);
146
+ if (idErr)
147
+ return reply.status(400).send({ detail: idErr });
148
+ try {
149
+ assertNotLocked(req.params.id);
150
+ }
151
+ catch (e) {
152
+ return reply.status(e.statusCode || 409).send({ detail: e.message });
153
+ }
154
+ const instance = appService.getInstance(req.params.id);
155
+ if (!instance)
156
+ return reply.status(404).send({ detail: "Instance not found" });
157
+ if (resolvePrimaryIntegrationKind(instance) !== "openclaw") {
158
+ return reply.status(400).send({ detail: "Browser allow-all is only supported for OpenClaw instances" });
159
+ }
160
+ if (typeof req.body?.allowAll !== "boolean") {
161
+ return reply.status(400).send({ detail: "allowAll must be a boolean" });
162
+ }
163
+ const current = await readAppConfig(req.params.id);
164
+ if (!current || typeof current !== "object" || Array.isArray(current)) {
165
+ return reply.status(400).send({ detail: "Config must be a JSON object" });
166
+ }
167
+ const next = structuredClone(current);
168
+ next.browser ??= {};
169
+ if (req.body.allowAll) {
170
+ next.meta ??= {};
171
+ next.meta._js_allowAll = true;
172
+ delete next.browser.ssrfPolicy;
173
+ }
174
+ else {
175
+ if (next.meta)
176
+ delete next.meta._js_allowAll;
177
+ next.browser.ssrfPolicy = { allowedHostnames: [...DEFAULT_BROWSER_ALLOWED_HOSTNAMES] };
178
+ }
179
+ const tempHosts = readTemporaryBrowserAllowedHostnames(req.params.id);
180
+ for (const tempHost of tempHosts) {
181
+ removeTemporaryBrowserAllowedHostname(req.params.id, tempHost);
182
+ }
183
+ await writeAppConfig(req.params.id, next);
184
+ const controlUiOrigin = inferRequestOrigin(req);
185
+ const restart = controlUiOrigin
186
+ ? await appLifecycle.restartInstance(req.params.id, { controlUiOrigin })
187
+ : await appLifecycle.restartInstance(req.params.id);
188
+ invalidateExecutionOwner(req.params.id);
189
+ if (!restart.ok) {
190
+ return reply.status(400).send({ detail: restart.error || "Failed to restart instance after updating the browser allowlist" });
191
+ }
192
+ markRuntimeRepairRestartApplied(req.params.id);
193
+ return {
194
+ ok: true,
195
+ allowAll: req.body.allowAll,
196
+ allowedHostnames: next.browser.ssrfPolicy?.allowedHostnames ?? [],
197
+ restart,
198
+ };
199
+ });
200
+ // ── Plugin check & install — host-side, no container dependency ────
201
+ app.get("/api/integrations/openclaw/instances/:id/plugins/check/:channelId", async (req, reply) => {
202
+ const idErr = validateId(req.params.id);
203
+ if (idErr)
204
+ return reply.status(400).send({ detail: idErr });
205
+ if (!instanceManager.getInstance(req.params.id)) {
206
+ return reply.status(404).send({ detail: "Instance not found" });
207
+ }
208
+ const inst = instanceManager.getInstance(req.params.id);
209
+ const integrationKind = resolvePrimaryIntegrationKind(inst);
210
+ if (!integrationKind) {
211
+ return reply.status(501).send({ detail: "Plugin check is not supported for this runtime" });
212
+ }
213
+ const integration = getIntegration(integrationKind);
214
+ const installed = typeof integration.isChannelPluginInstalled === "function"
215
+ ? integration.isChannelPluginInstalled(req.params.id, req.params.channelId)
216
+ : false;
217
+ return { channelId: req.params.channelId, installed };
218
+ });
219
+ app.get("/api/integrations/openclaw/instances/:id/plugins/status", async (req, reply) => {
220
+ const idErr = validateId(req.params.id);
221
+ if (idErr)
222
+ return reply.status(400).send({ detail: idErr });
223
+ if (!instanceManager.getInstance(req.params.id)) {
224
+ return reply.status(404).send({ detail: "Instance not found" });
225
+ }
226
+ return { plugins: pluginInstaller.getAllPluginStatuses(req.params.id) };
227
+ });
228
+ app.get("/api/integrations/openclaw/instances/:id/quick-status", async (req, reply) => {
229
+ const idErr = validateId(req.params.id);
230
+ if (idErr)
231
+ return reply.status(400).send({ detail: idErr });
232
+ if (!instanceManager.getInstance(req.params.id)) {
233
+ return reply.status(404).send({ detail: "Instance not found" });
234
+ }
235
+ const id = req.params.id;
236
+ const cfg = instanceManager.getConfig(id) ?? {};
237
+ const channels = cfg.channels ?? {};
238
+ const feishuCh = channels["feishu"] ?? channels["lark"] ?? {};
239
+ const weixinCh = channels["openclaw-weixin"] ?? {};
240
+ const feishuBound = !!(feishuCh.enabled &&
241
+ (feishuCh.appId || feishuCh.token || feishuCh.deviceToken || feishuCh.accessToken));
242
+ const weixinBound = !!(weixinCh.enabled &&
243
+ weixinCh.accounts &&
244
+ Object.keys(weixinCh.accounts).length > 0);
245
+ const { readdirSync: fsReaddir, readFileSync: fsRead } = await import("fs");
246
+ const { join: fsJoin } = await import("path");
247
+ const workspaceDir = fsJoin(resolveOpenclawHome(id), ".openclaw", "workspace");
248
+ const stateDir = fsJoin(workspaceDir, "skills");
249
+ let installedSkillDirs = [];
250
+ try {
251
+ installedSkillDirs = fsReaddir(stateDir, { withFileTypes: true })
252
+ .filter((e) => e.isDirectory())
253
+ .map((e) => e.name);
254
+ }
255
+ catch {
256
+ /* no skills dir */
257
+ }
258
+ const mcporterInstalled = installedSkillDirs.some((d) => d.toLowerCase() === "mcporter");
259
+ let mcporterServers = {};
260
+ const mcporterCfgPath = fsJoin(workspaceDir, "config", "mcporter.json");
261
+ try {
262
+ const raw = JSON.parse(fsRead(mcporterCfgPath, "utf8"));
263
+ mcporterServers = raw.mcpServers ?? {};
264
+ }
265
+ catch {
266
+ /* no mcporter config */
267
+ }
268
+ return {
269
+ im: { feishu: feishuBound, weixin: weixinBound },
270
+ installedSkillDirs,
271
+ mcporterInstalled,
272
+ mcporterServers,
273
+ };
274
+ });
275
+ // ── MCPorter server CRUD ──────────────────────────────────────────
276
+ app.get("/api/integrations/openclaw/instances/:id/mcporter/list", async (req, reply) => {
277
+ const idErr = validateId(req.params.id);
278
+ if (idErr)
279
+ return reply.status(400).send({ detail: idErr });
280
+ if (!instanceManager.getInstance(req.params.id)) {
281
+ return reply.status(404).send({ detail: "Instance not found" });
282
+ }
283
+ const id = req.params.id;
284
+ const openclawHome = resolveOpenclawHome(id);
285
+ const workspaceDir = join(openclawHome, ".openclaw", "workspace");
286
+ const mcporterBinPath = join(openclawHome, ".npm-global", "bin", "mcporter");
287
+ const mcporterFallbackPath = join(openclawHome, ".npm-global", "bin", "jishushell-mcporter");
288
+ const mcporterCfg = join(workspaceDir, "config", "mcporter.json");
289
+ const binPath = existsSync(mcporterBinPath)
290
+ ? mcporterBinPath
291
+ : existsSync(mcporterFallbackPath)
292
+ ? mcporterFallbackPath
293
+ : "";
294
+ if (!binPath) {
295
+ return { servers: [], installed: false };
296
+ }
297
+ const { execFile } = await import("child_process");
298
+ const { promisify } = await import("util");
299
+ const execFileAsync = promisify(execFile);
300
+ try {
301
+ const useNodeLauncher = binPath === mcporterFallbackPath;
302
+ const { stdout } = await execFileAsync(useNodeLauncher ? process.execPath : binPath, useNodeLauncher ? [binPath, "list", "--json"] : ["list", "--json"], {
303
+ env: { ...process.env, HOME: openclawHome, MCPORTER_CONFIG: mcporterCfg },
304
+ timeout: 60_000,
305
+ });
306
+ const parsed = JSON.parse(stdout);
307
+ return { servers: parsed.servers ?? [], installed: true };
308
+ }
309
+ catch (err) {
310
+ const raw = err?.stdout ?? "";
311
+ try {
312
+ const parsed = JSON.parse(raw);
313
+ return { servers: parsed.servers ?? [], installed: true };
314
+ }
315
+ catch {
316
+ /* fall through */
317
+ }
318
+ return { servers: [], installed: true, error: err?.message ?? "unknown" };
319
+ }
320
+ });
321
+ app.post("/api/integrations/openclaw/instances/:id/mcporter/add", async (req, reply) => {
322
+ const idErr = validateId(req.params.id);
323
+ if (idErr)
324
+ return reply.status(400).send({ detail: idErr });
325
+ if (!instanceManager.getInstance(req.params.id)) {
326
+ return reply.status(404).send({ detail: "Instance not found" });
327
+ }
328
+ const { servers } = req.body;
329
+ if (!servers || typeof servers !== "object" || Array.isArray(servers)) {
330
+ return reply.status(400).send({ detail: "servers must be an object" });
331
+ }
332
+ const openclawHome = resolveOpenclawHome(req.params.id);
333
+ const workspaceDir = join(openclawHome, ".openclaw", "workspace");
334
+ const mcporterCfgPath = join(workspaceDir, "config", "mcporter.json");
335
+ const { readFileSync } = await import("fs");
336
+ let cfg = { mcpServers: {}, imports: [] };
337
+ try {
338
+ cfg = JSON.parse(readFileSync(mcporterCfgPath, "utf8"));
339
+ }
340
+ catch {
341
+ /* start fresh */
342
+ }
343
+ if (!cfg.mcpServers)
344
+ cfg.mcpServers = {};
345
+ // Prototype-pollution guard.
346
+ const PROTO_KEYS = new Set(["__proto__", "constructor", "prototype"]);
347
+ for (const [k, v] of Object.entries(servers)) {
348
+ if (!PROTO_KEYS.has(k))
349
+ cfg.mcpServers[k] = v;
350
+ }
351
+ try {
352
+ ensureDirContainer(join(workspaceDir, "config"));
353
+ writeConfigFile(mcporterCfgPath, JSON.stringify(cfg, null, 2));
354
+ }
355
+ catch (err) {
356
+ return reply.status(500).send({ detail: `Write failed: ${err.message}` });
357
+ }
358
+ return { ok: true, mcpServers: cfg.mcpServers };
359
+ });
360
+ app.delete("/api/integrations/openclaw/instances/:id/mcporter/:serverName", async (req, reply) => {
361
+ const idErr = validateId(req.params.id);
362
+ if (idErr)
363
+ return reply.status(400).send({ detail: idErr });
364
+ if (!instanceManager.getInstance(req.params.id)) {
365
+ return reply.status(404).send({ detail: "Instance not found" });
366
+ }
367
+ const { serverName } = req.params;
368
+ if (!serverName || typeof serverName !== "string") {
369
+ return reply.status(400).send({ detail: "serverName is required" });
370
+ }
371
+ const openclawHome = resolveOpenclawHome(req.params.id);
372
+ const workspaceDir = join(openclawHome, ".openclaw", "workspace");
373
+ const mcporterCfgPath = join(workspaceDir, "config", "mcporter.json");
374
+ const { readFileSync } = await import("fs");
375
+ let cfg = { mcpServers: {}, imports: [] };
376
+ try {
377
+ cfg = JSON.parse(readFileSync(mcporterCfgPath, "utf8"));
378
+ }
379
+ catch {
380
+ /* start fresh */
381
+ }
382
+ if (!cfg.mcpServers || !(serverName in cfg.mcpServers)) {
383
+ return reply.status(404).send({ detail: `Server '${serverName}' not found` });
384
+ }
385
+ delete cfg.mcpServers[serverName];
386
+ try {
387
+ writeConfigFile(mcporterCfgPath, JSON.stringify(cfg, null, 2));
388
+ }
389
+ catch (err) {
390
+ return reply.status(500).send({ detail: `Write failed: ${err.message}` });
391
+ }
392
+ return { ok: true, mcpServers: cfg.mcpServers };
393
+ });
394
+ // ── Skills CRUD ───────────────────────────────────────────────────
395
+ app.delete("/api/integrations/openclaw/instances/:id/skills/:skillDir", async (req, reply) => {
396
+ const idErr = validateId(req.params.id);
397
+ if (idErr)
398
+ return reply.status(400).send({ detail: idErr });
399
+ if (!instanceManager.getInstance(req.params.id)) {
400
+ return reply.status(404).send({ detail: "Instance not found" });
401
+ }
402
+ const { skillDir } = req.params;
403
+ if (!skillDir || skillDir.includes("/") || skillDir.includes("..") || skillDir.startsWith(".")) {
404
+ return reply.status(400).send({ detail: "Invalid skill directory name" });
405
+ }
406
+ const openclawHome = resolveOpenclawHome(req.params.id);
407
+ const skillPath = join(openclawHome, ".openclaw", "workspace", "skills", skillDir);
408
+ const { existsSync: fsEx, rmSync } = await import("fs");
409
+ if (!fsEx(skillPath)) {
410
+ return reply.status(404).send({ detail: `Skill '${skillDir}' not found` });
411
+ }
412
+ try {
413
+ rmSync(skillPath, { recursive: true, force: true });
414
+ }
415
+ catch (err) {
416
+ return reply.status(500).send({ detail: `Delete failed: ${err.message}` });
417
+ }
418
+ return { ok: true };
419
+ });
420
+ // ── Plugin install ────────────────────────────────────────────────
421
+ app.post("/api/integrations/openclaw/instances/:id/plugins/install", async (req, reply) => {
422
+ const idErr = validateId(req.params.id);
423
+ if (idErr)
424
+ return reply.status(400).send({ detail: idErr });
425
+ if (!instanceManager.getInstance(req.params.id)) {
426
+ return reply.status(404).send({ detail: "Instance not found" });
427
+ }
428
+ try {
429
+ assertNotLocked(req.params.id);
430
+ }
431
+ catch (e) {
432
+ return reply.status(e.statusCode || 409).send({ detail: e.message });
433
+ }
434
+ const { channelId } = req.body;
435
+ if (!channelId || typeof channelId !== "string") {
436
+ return reply.status(400).send({ detail: "channelId is required" });
437
+ }
438
+ const inst2 = instanceManager.getInstance(req.params.id);
439
+ const integrationKind2 = resolvePrimaryIntegrationKind(inst2);
440
+ if (!integrationKind2) {
441
+ return reply.status(501).send({ detail: "Plugin install is not supported for this runtime" });
442
+ }
443
+ const pkg = getIntegration(integrationKind2).channelPluginMap?.[channelId];
444
+ if (!pkg) {
445
+ return reply.status(400).send({ detail: `Unknown channel: ${channelId}` });
446
+ }
447
+ const pStatus = pluginInstaller.getPluginStatus(req.params.id, channelId);
448
+ if (pStatus.status === "installed")
449
+ return { ok: true, status: "already_installed" };
450
+ if (pStatus.status === "installing")
451
+ return { ok: true, status: "installing" };
452
+ pluginInstaller.enqueueInstall(req.params.id, channelId);
453
+ return { ok: true, status: "queued" };
454
+ });
455
+ // Check-only helper; throws if the plugin needed by an IM login is missing.
456
+ async function ensurePluginInstalled(instanceId, channelId) {
457
+ const inst = instanceManager.getInstance(instanceId);
458
+ const integrationKind = resolvePrimaryIntegrationKind(inst);
459
+ // Non-integrated generic instances cannot have channel plugins — return silently so
460
+ // IM login on such an instance fails on its own check (channel not bound),
461
+ // not on a "plugin missing" error that does not make sense for it.
462
+ if (!integrationKind)
463
+ return;
464
+ const integration = getIntegration(integrationKind);
465
+ if (!integration.channelPluginMap?.[channelId])
466
+ return;
467
+ const installed = typeof integration.isChannelPluginInstalled === "function"
468
+ ? integration.isChannelPluginInstalled(instanceId, channelId)
469
+ : false;
470
+ if (!installed) {
471
+ throw new Error(`Plugin ${channelId} is not installed. Please install it from the config page.`);
472
+ }
473
+ }
474
+ // ── Feishu/Lark OAuth Device Code Login ───────────────────────────
475
+ const FEISHU_AUTH_URL = "https://accounts.feishu.cn";
476
+ const MAX_LOGIN_SESSIONS = 100;
477
+ const feishuLogins = new Map();
478
+ app.post("/api/integrations/openclaw/instances/:id/feishu/login", async (req, reply) => {
479
+ const channelKey = req.body?.channelKey || "feishu";
480
+ const idErr = validateId(req.params.id);
481
+ if (idErr)
482
+ return reply.status(400).send({ detail: idErr });
483
+ if (!instanceManager.getInstance(req.params.id)) {
484
+ return reply.status(404).send({ detail: "Instance not found" });
485
+ }
486
+ const svc = await getSvc();
487
+ const svcStatus = await svc.getStatus(req.params.id);
488
+ if (svcStatus.status !== "running") {
489
+ return reply.status(400).send({ detail: "Instance must be running first" });
490
+ }
491
+ try {
492
+ await ensurePluginInstalled(req.params.id, channelKey);
493
+ }
494
+ catch (e) {
495
+ return reply.status(400).send({ detail: e.message });
496
+ }
497
+ try {
498
+ await fetch(`${FEISHU_AUTH_URL}/oauth/v1/app/registration`, {
499
+ method: "POST",
500
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
501
+ body: "action=init",
502
+ signal: AbortSignal.timeout(30_000),
503
+ });
504
+ const beginResp = await fetch(`${FEISHU_AUTH_URL}/oauth/v1/app/registration`, {
505
+ method: "POST",
506
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
507
+ body: "action=begin&archetype=PersonalAgent&auth_method=client_secret&request_user_info=open_id",
508
+ signal: AbortSignal.timeout(30_000),
509
+ });
510
+ if (!beginResp.ok)
511
+ throw new Error(`Feishu API error: ${beginResp.status}`);
512
+ const beginData = (await beginResp.json());
513
+ const sessionKey = `${req.params.id}-${channelKey}-${Date.now()}`;
514
+ feishuLogins.set(sessionKey, {
515
+ instanceId: req.params.id,
516
+ deviceCode: beginData.device_code,
517
+ startedAt: Date.now(),
518
+ interval: beginData.interval || 5,
519
+ expireIn: beginData.expire_in || 600,
520
+ channelKey,
521
+ });
522
+ for (const [k, v] of feishuLogins) {
523
+ if (Date.now() - v.startedAt > v.expireIn * 1000)
524
+ feishuLogins.delete(k);
525
+ }
526
+ while (feishuLogins.size > MAX_LOGIN_SESSIONS) {
527
+ feishuLogins.delete(feishuLogins.keys().next().value);
528
+ }
529
+ return { qrcodeUrl: beginData.verification_uri_complete, sessionKey };
530
+ }
531
+ catch (e) {
532
+ return reply.status(502).send({ detail: e.message || "Failed to start Feishu login" });
533
+ }
534
+ });
535
+ app.get("/api/integrations/openclaw/instances/:id/feishu/login/:sessionKey", async (req, reply) => {
536
+ const idErr = validateId(req.params.id);
537
+ if (idErr)
538
+ return reply.status(400).send({ detail: idErr });
539
+ const login = feishuLogins.get(req.params.sessionKey);
540
+ if (!login)
541
+ return reply.status(404).send({ detail: "Login session not found or expired" });
542
+ if (login.instanceId !== req.params.id) {
543
+ return reply.status(403).send({ detail: "Session belongs to a different instance" });
544
+ }
545
+ if (Date.now() - login.startedAt > login.expireIn * 1000) {
546
+ feishuLogins.delete(req.params.sessionKey);
547
+ return { status: "expired", connected: false, message: "QR code expired, please regenerate." };
548
+ }
549
+ try {
550
+ const resp = await fetch(`${FEISHU_AUTH_URL}/oauth/v1/app/registration`, {
551
+ method: "POST",
552
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
553
+ body: `action=poll&device_code=${encodeURIComponent(login.deviceCode)}`,
554
+ signal: AbortSignal.timeout(10_000),
555
+ });
556
+ const data = (await resp.json());
557
+ if (data.client_id && data.client_secret) {
558
+ const storedChannelKey = login.channelKey || "feishu";
559
+ feishuLogins.delete(req.params.sessionKey);
560
+ const domain = data.user_info?.tenant_brand === "lark" ? "lark" : "feishu";
561
+ instanceManager.saveFeishuCredentials(req.params.id, {
562
+ appId: data.client_id,
563
+ appSecret: data.client_secret,
564
+ domain,
565
+ channelKey: storedChannelKey,
566
+ });
567
+ return {
568
+ status: "confirmed",
569
+ connected: true,
570
+ domain,
571
+ message: domain === "lark" ? "Lark bot configured!" : "Feishu bot configured!",
572
+ };
573
+ }
574
+ if (data.error === "authorization_pending") {
575
+ return { status: "waiting", connected: false, message: "Waiting for scan..." };
576
+ }
577
+ if (data.error === "expired_token") {
578
+ feishuLogins.delete(req.params.sessionKey);
579
+ return { status: "expired", connected: false, message: "QR code expired, please regenerate." };
580
+ }
581
+ return { status: "waiting", connected: false, message: "Waiting for scan..." };
582
+ }
583
+ catch (e) {
584
+ return reply.status(502).send({ detail: e.message || "Poll failed" });
585
+ }
586
+ });
587
+ // ── WeChat accounts + QR Login ────────────────────────────────────
588
+ app.get("/api/integrations/openclaw/instances/:id/weixin/accounts", async (req, reply) => {
589
+ const idErr = validateId(req.params.id);
590
+ if (idErr)
591
+ return reply.status(400).send({ detail: idErr });
592
+ if (!instanceManager.getInstance(req.params.id)) {
593
+ return reply.status(404).send({ detail: "Instance not found" });
594
+ }
595
+ return { accounts: instanceManager.getWeixinAccounts(req.params.id) };
596
+ });
597
+ const WEIXIN_API_BASE = "https://ilinkai.weixin.qq.com";
598
+ const WEIXIN_BOT_TYPE = "3";
599
+ const weixinLogins = new Map();
600
+ app.post("/api/integrations/openclaw/instances/:id/weixin/login", async (req, reply) => {
601
+ const idErr = validateId(req.params.id);
602
+ if (idErr)
603
+ return reply.status(400).send({ detail: idErr });
604
+ if (!instanceManager.getInstance(req.params.id)) {
605
+ return reply.status(404).send({ detail: "Instance not found" });
606
+ }
607
+ const svc = await getSvc();
608
+ const svcStatus = await svc.getStatus(req.params.id);
609
+ if (svcStatus.status !== "running") {
610
+ return reply.status(400).send({ detail: "Instance must be running first" });
611
+ }
612
+ try {
613
+ await ensurePluginInstalled(req.params.id, "openclaw-weixin");
614
+ }
615
+ catch (e) {
616
+ return reply.status(400).send({ detail: e.message });
617
+ }
618
+ try {
619
+ const resp = await fetch(`${WEIXIN_API_BASE}/ilink/bot/get_bot_qrcode?bot_type=${WEIXIN_BOT_TYPE}`, { signal: AbortSignal.timeout(30_000) });
620
+ if (!resp.ok)
621
+ throw new Error(`WeChat API error: ${resp.status}`);
622
+ const data = (await resp.json());
623
+ const sessionKey = `${req.params.id}-${Date.now()}`;
624
+ weixinLogins.set(sessionKey, {
625
+ instanceId: req.params.id,
626
+ qrcode: data.qrcode,
627
+ qrcodeUrl: data.qrcode_img_content,
628
+ startedAt: Date.now(),
629
+ });
630
+ for (const [k, v] of weixinLogins) {
631
+ if (Date.now() - v.startedAt > 5 * 60_000)
632
+ weixinLogins.delete(k);
633
+ }
634
+ while (weixinLogins.size > MAX_LOGIN_SESSIONS) {
635
+ weixinLogins.delete(weixinLogins.keys().next().value);
636
+ }
637
+ return { qrcodeUrl: data.qrcode_img_content, sessionKey };
638
+ }
639
+ catch (e) {
640
+ return reply.status(502).send({ detail: e.message || "Failed to get QR code" });
641
+ }
642
+ });
643
+ app.get("/api/integrations/openclaw/instances/:id/weixin/login/:sessionKey", async (req, reply) => {
644
+ const idErr = validateId(req.params.id);
645
+ if (idErr)
646
+ return reply.status(400).send({ detail: idErr });
647
+ const login = weixinLogins.get(req.params.sessionKey);
648
+ if (!login)
649
+ return reply.status(404).send({ detail: "Login session not found or expired" });
650
+ if (login.instanceId !== req.params.id) {
651
+ return reply.status(403).send({ detail: "Session belongs to a different instance" });
652
+ }
653
+ if (Date.now() - login.startedAt > 5 * 60_000) {
654
+ weixinLogins.delete(req.params.sessionKey);
655
+ return { status: "expired", connected: false, message: "QR code expired, please regenerate." };
656
+ }
657
+ try {
658
+ const resp = await fetch(`${WEIXIN_API_BASE}/ilink/bot/get_qrcode_status?qrcode=${encodeURIComponent(login.qrcode)}`, { headers: { "iLink-App-ClientVersion": "1" }, signal: AbortSignal.timeout(35_000) });
659
+ if (!resp.ok)
660
+ throw new Error(`Status poll failed: ${resp.status}`);
661
+ const data = (await resp.json());
662
+ if (data.status === "confirmed") {
663
+ // iLink occasionally returns `confirmed` with an empty payload
664
+ // (seen when the upstream QR session raced an internal refresh
665
+ // on their side). Without all four fields the runtime can't
666
+ // actually pair — write it anyway and the next `docker pull` of
667
+ // updates 401s with a cryptic "token missing" error. Reject at
668
+ // the route layer so the UI surfaces a clear failure instead.
669
+ if (!data.ilink_bot_id || !data.bot_token) {
670
+ console.error(`[weixin-login] iLink returned confirmed but payload incomplete: ` +
671
+ `bot_id=${data.ilink_bot_id ? "<present>" : "<missing>"}, ` +
672
+ `bot_token=${data.bot_token ? "<present>" : "<missing>"}`);
673
+ weixinLogins.delete(req.params.sessionKey);
674
+ return reply.status(502).send({
675
+ status: "error",
676
+ connected: false,
677
+ detail: "WeChat confirmed the scan but returned an incomplete credential payload. " +
678
+ "Please retry the QR login.",
679
+ });
680
+ }
681
+ weixinLogins.delete(req.params.sessionKey);
682
+ try {
683
+ instanceManager.saveWeixinCredentials(req.params.id, {
684
+ accountId: data.ilink_bot_id,
685
+ token: data.bot_token,
686
+ baseUrl: data.baseurl || WEIXIN_API_BASE,
687
+ userId: data.ilink_user_id || "",
688
+ });
689
+ }
690
+ catch (e) {
691
+ console.error(`[weixin-login] Failed to save credentials: ${e.message}`);
692
+ return reply.status(500).send({
693
+ status: "confirmed",
694
+ connected: false,
695
+ detail: "WeChat authenticated but failed to save credentials: " + e.message,
696
+ });
697
+ }
698
+ return {
699
+ status: "confirmed",
700
+ connected: true,
701
+ accountId: data.ilink_bot_id,
702
+ message: "WeChat connected!",
703
+ };
704
+ }
705
+ if (data.status === "expired") {
706
+ try {
707
+ const refreshResp = await fetch(`${WEIXIN_API_BASE}/ilink/bot/get_bot_qrcode?bot_type=${WEIXIN_BOT_TYPE}`, { signal: AbortSignal.timeout(30_000) });
708
+ if (refreshResp.ok) {
709
+ const refreshData = (await refreshResp.json());
710
+ login.qrcode = refreshData.qrcode;
711
+ login.qrcodeUrl = refreshData.qrcode_img_content;
712
+ login.startedAt = Date.now();
713
+ return {
714
+ status: "refreshed",
715
+ connected: false,
716
+ qrcodeUrl: refreshData.qrcode_img_content,
717
+ message: "QR code refreshed, please scan again.",
718
+ };
719
+ }
720
+ }
721
+ catch {
722
+ /* fall through */
723
+ }
724
+ weixinLogins.delete(req.params.sessionKey);
725
+ return { status: "expired", connected: false, message: "QR code expired, please regenerate." };
726
+ }
727
+ return {
728
+ status: data.status,
729
+ connected: false,
730
+ message: data.status === "scaned" ? "Scanned, please confirm on WeChat..." : "Waiting for scan...",
731
+ };
732
+ }
733
+ catch (e) {
734
+ return reply.status(502).send({ detail: e.message || "Status poll failed" });
735
+ }
736
+ });
737
+ // ── Usage (reads OpenClaw sessions.json) ──────────────────────────
738
+ app.get("/api/integrations/openclaw/instances/:id/usage", async (req, reply) => {
739
+ const idErr = validateId(req.params.id);
740
+ if (idErr)
741
+ return reply.status(400).send({ detail: idErr });
742
+ const inst = instanceManager.getInstance(req.params.id);
743
+ if (!inst)
744
+ return reply.status(404).send({ detail: "Instance not found" });
745
+ const openclawHome = resolveOpenclawHome(req.params.id);
746
+ const sessionsIndex = join(openclawHome, ".openclaw", "agents", "main", "sessions", "sessions.json");
747
+ const emptyTotals = {
748
+ input: 0,
749
+ output: 0,
750
+ cacheRead: 0,
751
+ cacheWrite: 0,
752
+ totalTokens: 0,
753
+ costTotal: 0,
754
+ messages: 0,
755
+ };
756
+ if (!existsSync(sessionsIndex))
757
+ return { sessions: [], totals: emptyTotals };
758
+ const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
759
+ const indexStat = await stat(sessionsIndex);
760
+ if (indexStat.size > MAX_FILE_SIZE) {
761
+ return reply.status(400).send({ detail: "sessions.json exceeds 10MB size limit" });
762
+ }
763
+ let sessionsMap;
764
+ try {
765
+ const raw = await readFile(sessionsIndex, "utf-8");
766
+ sessionsMap = JSON.parse(raw);
767
+ }
768
+ catch {
769
+ return reply.status(500).send({ detail: "Failed to parse sessions.json" });
770
+ }
771
+ const sessions = [];
772
+ const totals = { ...emptyTotals };
773
+ for (const [sessionKey, sessionMeta] of Object.entries(sessionsMap)) {
774
+ const sessionFile = sessionMeta?.sessionFile;
775
+ if (!sessionFile || !existsSync(sessionFile))
776
+ continue;
777
+ try {
778
+ const resolvedSession = realpathSync(sessionFile);
779
+ const resolvedHome = realpathSync(openclawHome);
780
+ if (!resolvedSession.startsWith(resolvedHome + "/") && resolvedSession !== resolvedHome)
781
+ continue;
782
+ }
783
+ catch {
784
+ continue;
785
+ }
786
+ let sessionStat;
787
+ try {
788
+ sessionStat = await stat(sessionFile);
789
+ }
790
+ catch {
791
+ continue;
792
+ }
793
+ if (sessionStat.size > MAX_FILE_SIZE)
794
+ continue;
795
+ const sessionUsage = {
796
+ input: 0,
797
+ output: 0,
798
+ cacheRead: 0,
799
+ cacheWrite: 0,
800
+ totalTokens: 0,
801
+ costTotal: 0,
802
+ messages: 0,
803
+ };
804
+ let model = "";
805
+ let firstTs = "";
806
+ let lastTs = "";
807
+ const originLabel = sessionMeta?.origin?.label || "";
808
+ const channel = sessionMeta?.origin?.provider || "";
809
+ let sessionContent;
810
+ try {
811
+ sessionContent = await readFile(sessionFile, "utf-8");
812
+ }
813
+ catch {
814
+ continue;
815
+ }
816
+ for (const line of sessionContent.split("\n")) {
817
+ let entry;
818
+ try {
819
+ entry = JSON.parse(line.trim());
820
+ }
821
+ catch {
822
+ continue;
823
+ }
824
+ if (entry.type !== "message")
825
+ continue;
826
+ const msg = entry.message || {};
827
+ const ts = entry.timestamp || "";
828
+ if (ts && !firstTs)
829
+ firstTs = ts;
830
+ if (ts)
831
+ lastTs = ts;
832
+ if (msg.role === "assistant") {
833
+ if (!model && msg.model)
834
+ model = msg.model;
835
+ const usage = msg.usage;
836
+ if (usage) {
837
+ sessionUsage.input += usage.input || 0;
838
+ sessionUsage.output += usage.output || 0;
839
+ sessionUsage.cacheRead += usage.cacheRead || 0;
840
+ sessionUsage.cacheWrite += usage.cacheWrite || 0;
841
+ sessionUsage.totalTokens += usage.totalTokens || 0;
842
+ if (typeof usage.cost === "object")
843
+ sessionUsage.costTotal += usage.cost.total || 0;
844
+ }
845
+ sessionUsage.messages++;
846
+ }
847
+ else if (msg.role === "user") {
848
+ sessionUsage.messages++;
849
+ }
850
+ }
851
+ sessions.push({
852
+ key: sessionKey,
853
+ model,
854
+ channel,
855
+ origin: originLabel,
856
+ firstMessage: firstTs,
857
+ lastMessage: lastTs,
858
+ usage: sessionUsage,
859
+ });
860
+ for (const k of ["input", "output", "cacheRead", "cacheWrite", "totalTokens", "messages"]) {
861
+ totals[k] += sessionUsage[k];
862
+ }
863
+ totals.costTotal += sessionUsage.costTotal;
864
+ }
865
+ sessions.sort((a, b) => (b.lastMessage || "").localeCompare(a.lastMessage || ""));
866
+ return { sessions, totals };
867
+ });
868
+ // ── Control UI launch (OpenClaw iframe boot) ──────────────
869
+ app.get("/api/integrations/openclaw/instances/:id/control-ui/launch", async (req, reply) => {
870
+ const idErr = validateId(req.params.id);
871
+ if (idErr)
872
+ return reply.status(400).send({ detail: idErr });
873
+ const inst = instanceManager.getInstance(req.params.id);
874
+ if (!inst)
875
+ return reply.status(404).send({ detail: "Instance not found" });
876
+ if (!(await supportsChatPanelUi(req.params.id, inst))) {
877
+ return reply
878
+ .status(501)
879
+ .send({ detail: "Control UI chat panel is not supported for this runtime" });
880
+ }
881
+ const panelOrigin = inferRequestOrigin(req);
882
+ let controlUiOriginAdded = false;
883
+ if (panelOrigin) {
884
+ try {
885
+ controlUiOriginAdded = await ensureOpenclawControlUiAllowedOrigin(req.params.id, panelOrigin);
886
+ if (controlUiOriginAdded) {
887
+ console.log(`[openclaw-control-ui-launch] added allowed origin for ${req.params.id} origin=${panelOrigin}; restart required if already running`);
888
+ }
889
+ }
890
+ catch (err) {
891
+ console.warn(`[openclaw-control-ui-launch] failed to add allowed origin for ${req.params.id}:`, err.message || err);
892
+ }
893
+ }
894
+ const baseUrl = `/api/integrations/openclaw/instances/${req.params.id}/control-ui/`;
895
+ const cfg = instanceManager.getStoredConfig(req.params.id);
896
+ const token = cfg?.gateway?.auth?.token;
897
+ const payload = { url: baseUrl };
898
+ if (controlUiOriginAdded)
899
+ payload.controlUiOriginAdded = true;
900
+ if (controlUiOriginAdded)
901
+ payload.restartRequired = true;
902
+ if (typeof token !== "string" || !token.trim()) {
903
+ return payload;
904
+ }
905
+ payload.url = `${baseUrl}#token=${encodeURIComponent(token.trim())}`;
906
+ return payload;
907
+ });
908
+ // ── Control UI HTTP proxy (with HTML injection) ───────────
909
+ const controlUiProxy = async (request, reply) => {
910
+ const { id } = request.params;
911
+ const idErr = validateId(id);
912
+ if (idErr)
913
+ return reply.status(400).send({ detail: idErr });
914
+ const inst = instanceManager.getInstance(id);
915
+ if (!inst)
916
+ return reply.status(404).send({ detail: "Instance not found" });
917
+ if (!(await supportsChatPanelUi(id, inst))) {
918
+ return reply.status(501).send({ detail: "Control UI proxy is not supported for this runtime" });
919
+ }
920
+ let port = 0;
921
+ let gwHost = "127.0.0.1";
922
+ try {
923
+ port = instanceManager.getPrimaryHostPort(id);
924
+ gwHost = await instanceManager.getPrimaryHostForInstance(id);
925
+ }
926
+ catch (error) {
927
+ if (instanceManager.isCanonicalRuntimePortRequiredError(error)) {
928
+ return reply.status(error.statusCode || 409).send({ detail: error.message, code: error.code });
929
+ }
930
+ throw error;
931
+ }
932
+ const suffix = request.params["*"] || "";
933
+ const qs = request.url.includes("?") ? request.url.slice(request.url.indexOf("?")) : "";
934
+ const urlGwHost = instanceManager.urlHost(gwHost);
935
+ const targetUrl = `http://${urlGwHost}:${port}/${suffix}${qs}`;
936
+ try {
937
+ const fwdHeaders = {};
938
+ const rawHeaders = request.raw.headers;
939
+ for (const [k, v] of Object.entries(rawHeaders)) {
940
+ if (v === undefined)
941
+ continue;
942
+ const lk = k.toLowerCase();
943
+ if (HOP_BY_HOP.has(lk) ||
944
+ PROXY_IDENTITY_HEADERS.has(lk) ||
945
+ lk === "host" ||
946
+ lk === "cookie" ||
947
+ lk === "authorization")
948
+ continue;
949
+ fwdHeaders[k] = Array.isArray(v) ? v.join(", ") : v;
950
+ }
951
+ fwdHeaders["host"] = `${urlGwHost}:${port}`;
952
+ // Forward the browser's real Origin/Referer. OpenClaw validates the
953
+ // control UI against gateway.controlUi.allowedOrigins, which Core
954
+ // prepares before explicit lifecycle start/restart and best-effort in
955
+ // control-ui launch without hidden lifecycle actions.
956
+ fwdHeaders["accept-encoding"] = "identity";
957
+ // Inject the per-instance gateway auth token so plain HTTP requests
958
+ // from the iframe (notably `<img src="/api/chat/media/...">` for
959
+ // server-emitted screenshot/upload URLs) authenticate against
960
+ // OpenClaw. The browser-supplied Authorization/Cookie are stripped
961
+ // above to avoid leaking panel auth into OpenClaw; without this
962
+ // injection chat-embedded media renders as 401 broken-image.
963
+ // The token is per-instance and only valid for this gateway, so
964
+ // attaching it on every proxied request is safe.
965
+ try {
966
+ const cfg = instanceManager.getStoredConfig(id);
967
+ const token = cfg?.gateway?.auth?.token;
968
+ if (typeof token === "string" && token.trim()) {
969
+ fwdHeaders["authorization"] = `Bearer ${token.trim()}`;
970
+ }
971
+ }
972
+ catch { /* best-effort: a missing config means no auth, request will get the same 401 it does today */ }
973
+ const upstreamRes = await new Promise((resolve, reject) => {
974
+ const proxyReq = httpRequest(targetUrl, { method: request.method, headers: fwdHeaders }, resolve);
975
+ proxyReq.on("error", reject);
976
+ if (request.method !== "GET" && request.method !== "HEAD") {
977
+ request.raw.pipe(proxyReq);
978
+ }
979
+ else {
980
+ proxyReq.end();
981
+ }
982
+ });
983
+ reply.status(upstreamRes.statusCode || 502);
984
+ for (const [k, v] of Object.entries(upstreamRes.headers)) {
985
+ if (v === undefined)
986
+ continue;
987
+ const lk = k.toLowerCase();
988
+ if (HOP_BY_HOP.has(lk))
989
+ continue;
990
+ if (lk === "x-frame-options") {
991
+ reply.header("x-frame-options", "SAMEORIGIN");
992
+ continue;
993
+ }
994
+ if (lk === "content-security-policy") {
995
+ const csp = Array.isArray(v) ? v.join(", ") : v;
996
+ const rewritten = csp.replace(/frame-ancestors\s+[^;]*/i, "frame-ancestors 'self'");
997
+ reply.header("content-security-policy", rewritten === csp ? `${csp}; frame-ancestors 'self'` : rewritten);
998
+ continue;
999
+ }
1000
+ reply.header(k, Array.isArray(v) ? v.join(", ") : v);
1001
+ }
1002
+ const respCt = upstreamRes.headers["content-type"] || "";
1003
+ if (suffix === "__openclaw/control-ui-config.json" && respCt.includes("application/json")) {
1004
+ const chunks = [];
1005
+ for await (const chunk of upstreamRes)
1006
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
1007
+ try {
1008
+ const config = JSON.parse(Buffer.concat(chunks).toString("utf-8"));
1009
+ config.basePath = `/api/integrations/openclaw/instances/${id}/control-ui`;
1010
+ const buf = Buffer.from(JSON.stringify(config));
1011
+ reply.header("content-length", buf.length);
1012
+ reply.removeHeader("content-encoding");
1013
+ return reply.send(buf);
1014
+ }
1015
+ catch {
1016
+ /* fall through to stream */
1017
+ }
1018
+ }
1019
+ if (respCt.includes("text/html")) {
1020
+ const chunks = [];
1021
+ for await (const chunk of upstreamRes)
1022
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
1023
+ let html = Buffer.concat(chunks).toString("utf-8");
1024
+ const basePath = `/api/integrations/openclaw/instances/${id}/control-ui`;
1025
+ const injectScript = [
1026
+ `window.__OPENCLAW_CONTROL_UI_BASE_PATH__=${JSON.stringify(basePath)};`,
1027
+ `(()=>{`,
1028
+ ` try {`,
1029
+ ` const settingsKey='openclaw.control.settings.v1';`,
1030
+ ` const tokenStoragePrefix='openclaw.control.token.v1:';`,
1031
+ ` const normalizeGatewayScope=(gatewayUrl)=>{`,
1032
+ ` const raw=(gatewayUrl||'').trim();`,
1033
+ ` if(!raw) return 'default';`,
1034
+ ` try {`,
1035
+ ` const base=\`\${window.location.protocol}//\${window.location.host}\${window.location.pathname||'/'}\`;`,
1036
+ ` const parsed=new URL(raw, base);`,
1037
+ ` const pathname=parsed.pathname==='/'?'':(parsed.pathname.replace(/\\/+$/,'')||parsed.pathname);`,
1038
+ ` return \`\${parsed.protocol}//\${parsed.host}\${pathname}\`;`,
1039
+ ` } catch {`,
1040
+ ` return raw;`,
1041
+ ` }`,
1042
+ ` };`,
1043
+ ` const proto=window.location.protocol==='https:'?'wss':'ws';`,
1044
+ ` const gatewayUrl=\`\${proto}://\${window.location.host}${basePath}\`;`,
1045
+ ` const tokenSessionKey=\`\${tokenStoragePrefix}\${normalizeGatewayScope(gatewayUrl)}\`;`,
1046
+ ` const raw=window.localStorage.getItem(settingsKey);`,
1047
+ ` let next={};`,
1048
+ ` try { next=raw ? JSON.parse(raw) : {}; } catch { next={}; }`,
1049
+ ` next.gatewayUrl=gatewayUrl;`,
1050
+ ` if('token' in next) delete next.token;`,
1051
+ ` const hashParams=new URLSearchParams(window.location.hash.startsWith('#')?window.location.hash.slice(1):window.location.hash);`,
1052
+ ` const searchParams=new URLSearchParams(window.location.search);`,
1053
+ ` const launchToken=(hashParams.get('token')||searchParams.get('token')||'').trim();`,
1054
+ ` if(launchToken){`,
1055
+ ` window.sessionStorage.setItem(tokenSessionKey, launchToken);`,
1056
+ ` }`,
1057
+ ` window.localStorage.setItem(settingsKey, JSON.stringify(next));`,
1058
+ ` const autoConnect=()=>{`,
1059
+ ` const attempt=()=>{`,
1060
+ ` const app=document.querySelector('openclaw-app');`,
1061
+ ` if(!app||typeof app.connect!=='function'||typeof app.applySettings!=='function'||!app.settings||typeof app.settings!=='object') return false;`,
1062
+ ` const sessionToken=(window.sessionStorage.getItem(tokenSessionKey)||'').trim();`,
1063
+ ` const token=(sessionToken||launchToken||app.settings.token||'').trim();`,
1064
+ ` if(!token) return false;`,
1065
+ ` const nextSettings={...app.settings, gatewayUrl, token};`,
1066
+ ` if(nextSettings.gatewayUrl!==app.settings.gatewayUrl||nextSettings.token!==app.settings.token){`,
1067
+ ` app.applySettings(nextSettings);`,
1068
+ ` }`,
1069
+ ` if(app.connected) return true;`,
1070
+ ` const wsState=app.client&&app.client.ws?app.client.ws.readyState:null;`,
1071
+ ` const connecting=wsState===0||wsState===1;`,
1072
+ ` if(!connecting){`,
1073
+ ` window.setTimeout(()=>{`,
1074
+ ` try { if(!app.connected) app.connect(); } catch {}`,
1075
+ ` }, 0);`,
1076
+ ` }`,
1077
+ ` return false;`,
1078
+ ` };`,
1079
+ ` const start=()=>{`,
1080
+ ` let tries=0;`,
1081
+ ` let timer=0;`,
1082
+ ` const tick=()=>{`,
1083
+ ` tries+=1;`,
1084
+ ` if(attempt()||tries>=120){`,
1085
+ ` window.clearInterval(timer);`,
1086
+ ` }`,
1087
+ ` };`,
1088
+ ` tick();`,
1089
+ ` timer=window.setInterval(()=>{`,
1090
+ ` tick();`,
1091
+ ` },500);`,
1092
+ ` };`,
1093
+ ` if(window.customElements&&typeof window.customElements.whenDefined==='function'){`,
1094
+ ` window.customElements.whenDefined('openclaw-app').then(start).catch(()=>{});`,
1095
+ ` }else{`,
1096
+ ` start();`,
1097
+ ` }`,
1098
+ ` };`,
1099
+ ` autoConnect();`,
1100
+ ` } catch {}`,
1101
+ `})();`,
1102
+ ].join("");
1103
+ const inject = `<script>${injectScript}</script>`;
1104
+ const injectCmdScript = [
1105
+ `(function(){`,
1106
+ ` var _jishuInject=function(cmd,send){`,
1107
+ ` var app=document.querySelector('openclaw-app');`,
1108
+ ` if(!app)return false;`,
1109
+ ` if(send){`,
1110
+ ` if(!app.connected)return false;`,
1111
+ ` try{app.handleSendChat(cmd);return true;}catch(e){}`,
1112
+ ` return false;`,
1113
+ ` }else{`,
1114
+ ` try{app.chatMessage=cmd;return true;}catch(e){}`,
1115
+ ` return false;`,
1116
+ ` }`,
1117
+ ` };`,
1118
+ ` window.addEventListener('message',function(e){`,
1119
+ ` if(!e.data||e.data.type!=='jishu:inject-cmd')return;`,
1120
+ ` var cmd=e.data.cmd,send=!!e.data.send,tries=0;`,
1121
+ ` var poll=function(){if(_jishuInject(cmd,send)||++tries>=50)return;setTimeout(poll,200);};`,
1122
+ ` poll();`,
1123
+ ` },false);`,
1124
+ `})();`,
1125
+ ].join("");
1126
+ const injectCmdScriptHash = createHash("sha256").update(injectCmdScript, "utf8").digest("base64");
1127
+ const fullHtmlInject = `${inject}<script>${injectCmdScript}</script>`;
1128
+ html = html.replace(/<head\b[^>]*>/i, (match) => `${match}${fullHtmlInject}`);
1129
+ const inlineScriptHash = createHash("sha256").update(injectScript, "utf8").digest("base64");
1130
+ const cspHeader = reply.getHeader("content-security-policy");
1131
+ if (typeof cspHeader === "string" && cspHeader) {
1132
+ const hashToken = `'sha256-${inlineScriptHash}'`;
1133
+ const hashToken2 = `'sha256-${injectCmdScriptHash}'`;
1134
+ const addHashes = (src) => {
1135
+ let s = src;
1136
+ if (!s.includes(hashToken))
1137
+ s = s + ` ${hashToken}`;
1138
+ if (!s.includes(hashToken2))
1139
+ s = s + ` ${hashToken2}`;
1140
+ return s;
1141
+ };
1142
+ const nextCsp = /\bscript-src\b/i.test(cspHeader)
1143
+ ? cspHeader.replace(/\bscript-src\b([^;]*)/i, (_m, value) => `script-src${addHashes(value)}`)
1144
+ : `${cspHeader}; script-src 'self' ${hashToken} ${hashToken2}`;
1145
+ reply.header("content-security-policy", nextCsp);
1146
+ }
1147
+ const buf = Buffer.from(html, "utf-8");
1148
+ reply.header("cache-control", "no-store");
1149
+ reply.header("content-length", buf.length);
1150
+ reply.removeHeader("content-encoding");
1151
+ return reply.send(buf);
1152
+ }
1153
+ return reply.send(upstreamRes);
1154
+ }
1155
+ catch (err) {
1156
+ console.error(`[openclaw-control-ui-proxy] ${id}:`, err.message || err);
1157
+ return reply.status(502).send({ detail: "Cannot reach OpenClaw control UI" });
1158
+ }
1159
+ };
1160
+ app.all("/api/integrations/openclaw/instances/:id/control-ui/*", controlUiProxy);
1161
+ app.all("/api/integrations/openclaw/instances/:id/control-ui", controlUiProxy);
1162
+ // ── Referer-forwarded control UI proxy for OpenClaw internal URLs ─
1163
+ //
1164
+ // Some OpenClaw chat messages embed server-generated absolute URLs that
1165
+ // ignore `gateway.basePath` (e.g. screenshot/upload media references emitted
1166
+ // as `{type:"image", url:"/api/chat/media/outgoing/..."}` — `basePath` is
1167
+ // the client-side override for outgoing requests, but server-rendered
1168
+ // message URLs are baked at emit time without it). Inside the iframe the
1169
+ // browser resolves those against the panel origin and they land here on
1170
+ // jishushell instead of the instance's gateway.
1171
+ //
1172
+ // Handle this by recovering the instance id from the iframe Referer
1173
+ // (`/api/integrations/openclaw/instances/<id>/control-ui/...`) and replaying the request through
1174
+ // controlUiProxy. Limited to a narrow allowlist of OpenClaw-owned prefixes
1175
+ // to avoid colliding with jishushell's own routes.
1176
+ const refererForwardedProxy = async (request, reply) => {
1177
+ const id = extractRefererInstanceId(request.headers.referer);
1178
+ if (!id)
1179
+ return reply.status(404).send({ detail: "Not found" });
1180
+ const idErr = validateId(id);
1181
+ if (idErr)
1182
+ return reply.status(400).send({ detail: idErr });
1183
+ const path = String(request.url ?? "").split("?")[0];
1184
+ const suffix = path.replace(/^\/+/, "");
1185
+ Object.assign(request.params, { id, "*": suffix });
1186
+ return controlUiProxy(request, reply);
1187
+ };
1188
+ // /api/chat/* covers the screenshot/upload media that the runtime emits
1189
+ // as message-embedded absolute URLs. Add other OpenClaw-internal prefixes
1190
+ // here as they surface — keep the list narrow so jishushell-owned routes
1191
+ // (auth/instances/system/setup) stay unambiguous.
1192
+ app.all("/api/chat/*", refererForwardedProxy);
1193
+ }
1194
+ //# sourceMappingURL=routes.js.map