jishushell 0.6.5 → 0.6.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (998) hide show
  1. package/apps/anythingllm-container.yaml +15 -170
  2. package/apps/browserless-chromium-container.yaml +15 -10
  3. package/apps/filebrowser-container.yaml +14 -9
  4. package/apps/hermes-container.yaml +23 -2
  5. package/apps/jishu-kb-container.yaml +29 -161
  6. package/apps/ollama-binary.yaml +32 -28
  7. package/apps/ollama-cpu-container.yaml +5 -0
  8. package/apps/ollama-with-hollama-binary.yaml +33 -28
  9. package/apps/openclaw-binary.yaml +34 -10
  10. package/apps/openclaw-container.yaml +31 -7
  11. package/apps/openclaw-with-ollama-container.yaml +8 -2
  12. package/apps/openclaw-with-searxng-container.yaml +18 -6
  13. package/apps/searxng-container.yaml +11 -6
  14. package/apps/weknora-container.yaml +21 -21
  15. package/dependencies/jishushell-panel-0.6.18.tgz +0 -0
  16. package/dist/cli/app.js +244 -213
  17. package/dist/cli/app.js.map +1 -1
  18. package/dist/cli/backup.js +15 -12
  19. package/dist/cli/backup.js.map +1 -1
  20. package/dist/cli/core.d.ts +4 -3
  21. package/dist/cli/core.js +392 -227
  22. package/dist/cli/core.js.map +1 -1
  23. package/dist/cli/doctor.d.ts +1 -1
  24. package/dist/cli/doctor.js +17 -10
  25. package/dist/cli/doctor.js.map +1 -1
  26. package/dist/cli/job.js +62 -14
  27. package/dist/cli/job.js.map +1 -1
  28. package/dist/cli/llm.js +80 -11
  29. package/dist/cli/llm.js.map +1 -1
  30. package/dist/cli/managed-list.d.ts +1 -3
  31. package/dist/cli/managed-list.js +18 -16
  32. package/dist/cli/managed-list.js.map +1 -1
  33. package/dist/cli/migrate.d.ts +2 -0
  34. package/dist/cli/migrate.js +160 -0
  35. package/dist/cli/migrate.js.map +1 -0
  36. package/dist/cli.js +1 -0
  37. package/dist/cli.js.map +1 -1
  38. package/dist/config.d.ts +23 -19
  39. package/dist/config.js +60 -49
  40. package/dist/config.js.map +1 -1
  41. package/dist/control.d.ts +6 -6
  42. package/dist/control.js +31 -23
  43. package/dist/control.js.map +1 -1
  44. package/dist/core.d.ts +5 -5
  45. package/dist/core.js +5 -5
  46. package/dist/core.js.map +1 -1
  47. package/dist/install.d.ts +2 -2
  48. package/dist/install.js +18 -18
  49. package/dist/install.js.map +1 -1
  50. package/dist/routes/apps.d.ts +1 -1
  51. package/dist/routes/apps.js +101 -193
  52. package/dist/routes/apps.js.map +1 -1
  53. package/dist/routes/auth.js +1 -1
  54. package/dist/routes/auth.js.map +1 -1
  55. package/dist/routes/backup.js +1 -1
  56. package/dist/routes/backup.js.map +1 -1
  57. package/dist/routes/external-mounts.d.ts +1 -1
  58. package/dist/routes/external-mounts.js +1 -1
  59. package/dist/routes/external-mounts.js.map +1 -1
  60. package/dist/routes/file-mounts.d.ts +4 -3
  61. package/dist/routes/file-mounts.js +51 -30
  62. package/dist/routes/file-mounts.js.map +1 -1
  63. package/dist/routes/files-organize.d.ts +2 -2
  64. package/dist/routes/files-organize.js +5 -5
  65. package/dist/routes/files-organize.js.map +1 -1
  66. package/dist/routes/files.d.ts +1 -1
  67. package/dist/routes/files.js +1 -1
  68. package/dist/routes/files.js.map +1 -1
  69. package/dist/routes/instances.d.ts +10 -4
  70. package/dist/routes/instances.js +323 -541
  71. package/dist/routes/instances.js.map +1 -1
  72. package/dist/routes/integration-apps.d.ts +14 -0
  73. package/dist/routes/integration-apps.js +81 -0
  74. package/dist/routes/integration-apps.js.map +1 -0
  75. package/dist/routes/integrations.d.ts +9 -0
  76. package/dist/routes/integrations.js +12 -0
  77. package/dist/routes/integrations.js.map +1 -0
  78. package/dist/routes/llm-proxy.js +26 -3
  79. package/dist/routes/llm-proxy.js.map +1 -1
  80. package/dist/routes/setup.js +53 -38
  81. package/dist/routes/setup.js.map +1 -1
  82. package/dist/routes/system.js +108 -68
  83. package/dist/routes/system.js.map +1 -1
  84. package/dist/routes/webdav.d.ts +1 -1
  85. package/dist/routes/webdav.js +2 -2
  86. package/dist/routes/webdav.js.map +1 -1
  87. package/dist/server.js +315 -213
  88. package/dist/server.js.map +1 -1
  89. package/dist/services/app-common/app-compiler.js +186 -0
  90. package/dist/services/app-common/app-compiler.js.map +1 -0
  91. package/dist/services/app-common/app-shared.d.ts +15 -0
  92. package/dist/services/app-common/app-shared.js +64 -0
  93. package/dist/services/app-common/app-shared.js.map +1 -0
  94. package/dist/services/app-common/capability-service.d.ts +45 -0
  95. package/dist/services/app-common/capability-service.js +331 -0
  96. package/dist/services/app-common/capability-service.js.map +1 -0
  97. package/dist/services/app-common/catalog-service.d.ts +59 -0
  98. package/dist/services/app-common/catalog-service.js +308 -0
  99. package/dist/services/app-common/catalog-service.js.map +1 -0
  100. package/dist/services/app-common/create-pipeline.d.ts +26 -0
  101. package/dist/services/app-common/create-pipeline.js +298 -0
  102. package/dist/services/app-common/create-pipeline.js.map +1 -0
  103. package/dist/services/app-common/delete-service.d.ts +5 -0
  104. package/dist/services/app-common/delete-service.js +104 -0
  105. package/dist/services/app-common/delete-service.js.map +1 -0
  106. package/dist/services/app-common/execution-owner.d.ts +23 -0
  107. package/dist/services/app-common/execution-owner.js +124 -0
  108. package/dist/services/app-common/execution-owner.js.map +1 -0
  109. package/dist/services/app-common/execution-service.d.ts +23 -0
  110. package/dist/services/app-common/execution-service.js +105 -0
  111. package/dist/services/app-common/execution-service.js.map +1 -0
  112. package/dist/services/app-common/id-normalizer.d.ts +31 -0
  113. package/dist/services/app-common/id-normalizer.js +83 -0
  114. package/dist/services/app-common/id-normalizer.js.map +1 -0
  115. package/dist/services/app-common/install-store.d.ts +34 -0
  116. package/dist/services/app-common/install-store.js +261 -0
  117. package/dist/services/app-common/install-store.js.map +1 -0
  118. package/dist/services/app-common/instance-store.d.ts +78 -0
  119. package/dist/services/app-common/instance-store.js +495 -0
  120. package/dist/services/app-common/instance-store.js.map +1 -0
  121. package/dist/services/app-common/integration-refs.d.ts +17 -0
  122. package/dist/services/app-common/integration-refs.js +47 -0
  123. package/dist/services/app-common/integration-refs.js.map +1 -0
  124. package/dist/services/app-common/lifecycle-pipeline.d.ts +62 -0
  125. package/dist/services/app-common/lifecycle-pipeline.js +317 -0
  126. package/dist/services/app-common/lifecycle-pipeline.js.map +1 -0
  127. package/dist/services/app-common/lifecycle-scripts.d.ts +38 -0
  128. package/dist/services/app-common/lifecycle-scripts.js +935 -0
  129. package/dist/services/app-common/lifecycle-scripts.js.map +1 -0
  130. package/dist/services/app-common/lifecycle-service.d.ts +68 -0
  131. package/dist/services/app-common/lifecycle-service.js +467 -0
  132. package/dist/services/app-common/lifecycle-service.js.map +1 -0
  133. package/dist/services/app-common/paths.d.ts +29 -0
  134. package/dist/services/app-common/paths.js +34 -0
  135. package/dist/services/app-common/paths.js.map +1 -0
  136. package/dist/services/app-common/platform-transform.d.ts +32 -0
  137. package/dist/services/app-common/platform-transform.js +65 -0
  138. package/dist/services/app-common/platform-transform.js.map +1 -0
  139. package/dist/services/app-common/provide-resolver.d.ts +29 -0
  140. package/dist/services/app-common/provide-resolver.js +129 -0
  141. package/dist/services/app-common/provide-resolver.js.map +1 -0
  142. package/dist/services/app-common/remote-spec.d.ts +14 -0
  143. package/dist/services/app-common/remote-spec.js +58 -0
  144. package/dist/services/app-common/remote-spec.js.map +1 -0
  145. package/dist/services/app-common/runtime-builder.d.ts +1 -0
  146. package/dist/services/app-common/runtime-builder.js +2 -0
  147. package/dist/services/app-common/runtime-builder.js.map +1 -0
  148. package/dist/services/app-common/runtime-facts.d.ts +19 -0
  149. package/dist/services/app-common/runtime-facts.js +126 -0
  150. package/dist/services/app-common/runtime-facts.js.map +1 -0
  151. package/dist/services/app-common/service.d.ts +9 -0
  152. package/dist/services/app-common/service.js +10 -0
  153. package/dist/services/app-common/service.js.map +1 -0
  154. package/dist/services/app-common/spec-materializer.d.ts +9 -0
  155. package/dist/services/app-common/spec-materializer.js +361 -0
  156. package/dist/services/app-common/spec-materializer.js.map +1 -0
  157. package/dist/services/app-common/status-refresh.d.ts +33 -0
  158. package/dist/services/app-common/status-refresh.js +759 -0
  159. package/dist/services/app-common/status-refresh.js.map +1 -0
  160. package/dist/services/app-common/task-service.d.ts +29 -0
  161. package/dist/services/app-common/task-service.js +93 -0
  162. package/dist/services/app-common/task-service.js.map +1 -0
  163. package/dist/services/app-common/terminal-session-manager.js +157 -0
  164. package/dist/services/app-common/terminal-session-manager.js.map +1 -0
  165. package/dist/services/app-modules/browserless/routes.d.ts +9 -0
  166. package/dist/services/app-modules/browserless/routes.js +517 -0
  167. package/dist/services/app-modules/browserless/routes.js.map +1 -0
  168. package/dist/services/app-modules/routes.d.ts +2 -0
  169. package/dist/services/app-modules/routes.js +5 -0
  170. package/dist/services/app-modules/routes.js.map +1 -0
  171. package/dist/services/backup/backup-admin.d.ts +95 -0
  172. package/dist/services/backup/backup-admin.js +246 -0
  173. package/dist/services/backup/backup-admin.js.map +1 -0
  174. package/dist/services/backup/backup-manager.d.ts +264 -0
  175. package/dist/services/backup/backup-manager.js +2318 -0
  176. package/dist/services/backup/backup-manager.js.map +1 -0
  177. package/dist/services/backup/backup-verify.js +240 -0
  178. package/dist/services/backup/backup-verify.js.map +1 -0
  179. package/dist/services/capabilities/browser-policy.d.ts +14 -0
  180. package/dist/services/capabilities/browser-policy.js +141 -0
  181. package/dist/services/capabilities/browser-policy.js.map +1 -0
  182. package/dist/services/capabilities/contract.d.ts +50 -0
  183. package/dist/services/capabilities/contract.js +129 -0
  184. package/dist/services/capabilities/contract.js.map +1 -0
  185. package/dist/services/capabilities/endpoint-validator.d.ts +42 -0
  186. package/dist/services/capabilities/endpoint-validator.js +114 -0
  187. package/dist/services/capabilities/endpoint-validator.js.map +1 -0
  188. package/dist/services/capabilities/health.d.ts +16 -0
  189. package/dist/services/capabilities/health.js +121 -0
  190. package/dist/services/capabilities/health.js.map +1 -0
  191. package/dist/services/capabilities/registry.d.ts +56 -0
  192. package/dist/services/capabilities/registry.js +222 -0
  193. package/dist/services/capabilities/registry.js.map +1 -0
  194. package/dist/services/capabilities/sync.d.ts +7 -0
  195. package/dist/services/capabilities/sync.js +223 -0
  196. package/dist/services/capabilities/sync.js.map +1 -0
  197. package/dist/services/capability-proxy/html-rewriters/browserless.d.ts +1 -0
  198. package/dist/services/capability-proxy/html-rewriters/browserless.js +83 -0
  199. package/dist/services/capability-proxy/html-rewriters/browserless.js.map +1 -0
  200. package/dist/services/capability-proxy/html-rewriters/index.d.ts +12 -0
  201. package/dist/services/capability-proxy/html-rewriters/index.js +25 -0
  202. package/dist/services/capability-proxy/html-rewriters/index.js.map +1 -0
  203. package/dist/services/capability-proxy/html-rewriters/jishukb.d.ts +1 -0
  204. package/dist/services/capability-proxy/html-rewriters/jishukb.js +161 -0
  205. package/dist/services/capability-proxy/html-rewriters/jishukb.js.map +1 -0
  206. package/dist/services/connections/admin.d.ts +80 -0
  207. package/dist/services/connections/admin.js +327 -0
  208. package/dist/services/connections/admin.js.map +1 -0
  209. package/dist/services/connections/apply.d.ts +110 -0
  210. package/dist/services/connections/apply.js +444 -0
  211. package/dist/services/connections/apply.js.map +1 -0
  212. package/dist/services/connections/resolver.d.ts +82 -0
  213. package/dist/services/connections/resolver.js +289 -0
  214. package/dist/services/connections/resolver.js.map +1 -0
  215. package/dist/services/connections/suggestions.d.ts +27 -0
  216. package/dist/services/connections/suggestions.js +124 -0
  217. package/dist/services/connections/suggestions.js.map +1 -0
  218. package/dist/services/connections/transactor.d.ts +39 -0
  219. package/dist/services/connections/transactor.js +307 -0
  220. package/dist/services/connections/transactor.js.map +1 -0
  221. package/dist/services/files/external-mounts.js +187 -0
  222. package/dist/services/files/external-mounts.js.map +1 -0
  223. package/dist/services/files/files-manager.d.ts +265 -0
  224. package/dist/services/files/files-manager.js +1189 -0
  225. package/dist/services/files/files-manager.js.map +1 -0
  226. package/dist/services/files/files-mounts.d.ts +42 -0
  227. package/dist/services/files/files-mounts.js +207 -0
  228. package/dist/services/files/files-mounts.js.map +1 -0
  229. package/dist/services/files/organize/applier.js +218 -0
  230. package/dist/services/files/organize/applier.js.map +1 -0
  231. package/dist/services/files/organize/rules.js +286 -0
  232. package/dist/services/files/organize/rules.js.map +1 -0
  233. package/dist/services/files/organize/scanner.js +366 -0
  234. package/dist/services/files/organize/scanner.js.map +1 -0
  235. package/dist/services/files/organize/store.js +82 -0
  236. package/dist/services/files/organize/store.js.map +1 -0
  237. package/dist/services/files/webdav/server.d.ts +47 -0
  238. package/dist/services/files/webdav/server.js +329 -0
  239. package/dist/services/files/webdav/server.js.map +1 -0
  240. package/dist/services/files/webdav/xml-builder.js.map +1 -0
  241. package/dist/services/instances/admin.d.ts +23 -0
  242. package/dist/services/instances/admin.js +218 -0
  243. package/dist/services/instances/admin.js.map +1 -0
  244. package/dist/services/instances/clone.d.ts +26 -0
  245. package/dist/services/instances/clone.js +78 -0
  246. package/dist/services/instances/clone.js.map +1 -0
  247. package/dist/services/instances/config-admin.d.ts +17 -0
  248. package/dist/services/instances/config-admin.js +181 -0
  249. package/dist/services/instances/config-admin.js.map +1 -0
  250. package/dist/services/instances/manager.d.ts +231 -0
  251. package/dist/services/instances/manager.js +1348 -0
  252. package/dist/services/instances/manager.js.map +1 -0
  253. package/dist/services/instances/passwords.js +173 -0
  254. package/dist/services/instances/passwords.js.map +1 -0
  255. package/dist/services/instances/types.d.ts +21 -0
  256. package/dist/services/instances/types.js +2 -0
  257. package/dist/services/instances/types.js.map +1 -0
  258. package/dist/services/integrations/anythingllm/integration.d.ts +25 -0
  259. package/dist/services/integrations/anythingllm/integration.js +251 -0
  260. package/dist/services/integrations/anythingllm/integration.js.map +1 -0
  261. package/dist/services/integrations/catalog.d.ts +3 -0
  262. package/dist/services/integrations/catalog.js +73 -0
  263. package/dist/services/integrations/catalog.js.map +1 -0
  264. package/dist/services/integrations/custom/integration.d.ts +28 -0
  265. package/dist/services/integrations/custom/integration.js +179 -0
  266. package/dist/services/integrations/custom/integration.js.map +1 -0
  267. package/dist/services/integrations/hermes/integration.d.ts +194 -0
  268. package/dist/services/integrations/hermes/integration.js +1669 -0
  269. package/dist/services/integrations/hermes/integration.js.map +1 -0
  270. package/dist/services/integrations/index.d.ts +40 -0
  271. package/dist/services/integrations/index.js +59 -0
  272. package/dist/services/integrations/index.js.map +1 -0
  273. package/dist/services/integrations/installable/catalog.d.ts +33 -0
  274. package/dist/services/integrations/installable/catalog.js +88 -0
  275. package/dist/services/integrations/installable/catalog.js.map +1 -0
  276. package/dist/services/integrations/installable/index.d.ts +35 -0
  277. package/dist/services/integrations/installable/index.js +170 -0
  278. package/dist/services/integrations/installable/index.js.map +1 -0
  279. package/dist/services/integrations/installable/installers/integration-probes.d.ts +50 -0
  280. package/dist/services/integrations/installable/installers/integration-probes.js +231 -0
  281. package/dist/services/integrations/installable/installers/integration-probes.js.map +1 -0
  282. package/dist/services/integrations/installable/installers/integration.d.ts +30 -0
  283. package/dist/services/integrations/installable/installers/integration.js +177 -0
  284. package/dist/services/integrations/installable/installers/integration.js.map +1 -0
  285. package/dist/services/integrations/installable/installers/registry-probe.js.map +1 -0
  286. package/dist/services/integrations/installable/installers/shell-script.d.ts +46 -0
  287. package/dist/services/integrations/installable/installers/shell-script.js +487 -0
  288. package/dist/services/integrations/installable/installers/shell-script.js.map +1 -0
  289. package/dist/services/integrations/installable/types.d.ts +130 -0
  290. package/dist/services/integrations/installable/types.js +19 -0
  291. package/dist/services/integrations/installable/types.js.map +1 -0
  292. package/dist/services/integrations/jishukb/integration.d.ts +22 -0
  293. package/dist/services/integrations/jishukb/integration.js +189 -0
  294. package/dist/services/integrations/jishukb/integration.js.map +1 -0
  295. package/dist/services/integrations/openclaw/anythingllm-shim.d.ts +46 -0
  296. package/dist/services/integrations/openclaw/anythingllm-shim.js +281 -0
  297. package/dist/services/integrations/openclaw/anythingllm-shim.js.map +1 -0
  298. package/dist/services/integrations/openclaw/drive-shim.js +490 -0
  299. package/dist/services/integrations/openclaw/drive-shim.js.map +1 -0
  300. package/dist/services/integrations/openclaw/integration.d.ts +424 -0
  301. package/dist/services/integrations/openclaw/integration.js +4402 -0
  302. package/dist/services/integrations/openclaw/integration.js.map +1 -0
  303. package/dist/services/integrations/openclaw/jishukb-shim.d.ts +48 -0
  304. package/dist/services/integrations/openclaw/jishukb-shim.js +750 -0
  305. package/dist/services/integrations/openclaw/jishukb-shim.js.map +1 -0
  306. package/dist/services/integrations/openclaw/mcporter-lite.js +276 -0
  307. package/dist/services/integrations/openclaw/mcporter-lite.js.map +1 -0
  308. package/dist/services/integrations/openclaw/mcporter.d.ts +46 -0
  309. package/dist/services/integrations/openclaw/mcporter.js +112 -0
  310. package/dist/services/integrations/openclaw/mcporter.js.map +1 -0
  311. package/dist/services/integrations/openclaw/routes.d.ts +21 -0
  312. package/dist/services/integrations/openclaw/routes.js +1191 -0
  313. package/dist/services/integrations/openclaw/routes.js.map +1 -0
  314. package/dist/services/integrations/registry.d.ts +17 -0
  315. package/dist/services/integrations/registry.js +36 -0
  316. package/dist/services/integrations/registry.js.map +1 -0
  317. package/dist/services/integrations/routes.d.ts +2 -0
  318. package/dist/services/integrations/routes.js +9 -0
  319. package/dist/services/integrations/routes.js.map +1 -0
  320. package/dist/services/integrations/types.d.ts +469 -0
  321. package/dist/services/integrations/types.js +2 -0
  322. package/dist/services/integrations/types.js.map +1 -0
  323. package/dist/services/legacy-migrator/classifier.d.ts +44 -0
  324. package/dist/services/legacy-migrator/classifier.js +309 -0
  325. package/dist/services/legacy-migrator/classifier.js.map +1 -0
  326. package/dist/services/legacy-migrator/executor.d.ts +42 -0
  327. package/dist/services/legacy-migrator/executor.js +637 -0
  328. package/dist/services/legacy-migrator/executor.js.map +1 -0
  329. package/dist/services/legacy-migrator/index.d.ts +31 -0
  330. package/dist/services/legacy-migrator/index.js +34 -0
  331. package/dist/services/legacy-migrator/index.js.map +1 -0
  332. package/dist/services/legacy-migrator/planner.d.ts +8 -0
  333. package/dist/services/legacy-migrator/planner.js +154 -0
  334. package/dist/services/legacy-migrator/planner.js.map +1 -0
  335. package/dist/services/legacy-migrator/provider-settings.d.ts +6 -0
  336. package/dist/services/legacy-migrator/provider-settings.js +72 -0
  337. package/dist/services/legacy-migrator/provider-settings.js.map +1 -0
  338. package/dist/services/legacy-migrator/report.d.ts +9 -0
  339. package/dist/services/legacy-migrator/report.js +99 -0
  340. package/dist/services/legacy-migrator/report.js.map +1 -0
  341. package/dist/services/legacy-migrator/scanner.d.ts +13 -0
  342. package/dist/services/legacy-migrator/scanner.js +157 -0
  343. package/dist/services/legacy-migrator/scanner.js.map +1 -0
  344. package/dist/services/legacy-migrator/types.d.ts +97 -0
  345. package/dist/services/legacy-migrator/types.js +23 -0
  346. package/dist/services/legacy-migrator/types.js.map +1 -0
  347. package/dist/services/llm-proxy/instance-proxy.d.ts +17 -1
  348. package/dist/services/llm-proxy/instance-proxy.js +171 -44
  349. package/dist/services/llm-proxy/instance-proxy.js.map +1 -1
  350. package/dist/services/llm-proxy/probe.js +5 -14
  351. package/dist/services/llm-proxy/probe.js.map +1 -1
  352. package/dist/services/llm-proxy/providers.js +23 -31
  353. package/dist/services/llm-proxy/providers.js.map +1 -1
  354. package/dist/services/llm-proxy/ssrf.d.ts +11 -4
  355. package/dist/services/llm-proxy/ssrf.js +45 -7
  356. package/dist/services/llm-proxy/ssrf.js.map +1 -1
  357. package/dist/services/llm-proxy/validate-key.js +16 -37
  358. package/dist/services/llm-proxy/validate-key.js.map +1 -1
  359. package/dist/services/repair/runtime-repair.d.ts +22 -0
  360. package/dist/services/repair/runtime-repair.js +307 -0
  361. package/dist/services/repair/runtime-repair.js.map +1 -0
  362. package/dist/services/runtime/driver-registry.d.ts +21 -0
  363. package/dist/services/runtime/driver-registry.js +22 -0
  364. package/dist/services/runtime/driver-registry.js.map +1 -0
  365. package/dist/services/runtime/drivers/nomad.d.ts +260 -0
  366. package/dist/services/runtime/drivers/nomad.js +3092 -0
  367. package/dist/services/runtime/drivers/nomad.js.map +1 -0
  368. package/dist/services/runtime/errors.d.ts +3 -3
  369. package/dist/services/runtime/errors.js +3 -3
  370. package/dist/services/runtime/instance.d.ts +14 -16
  371. package/dist/services/runtime/instance.js +93 -123
  372. package/dist/services/runtime/instance.js.map +1 -1
  373. package/dist/services/runtime/job-id.d.ts +1 -1
  374. package/dist/services/runtime/job-id.js +1 -1
  375. package/dist/services/runtime/mcp-shims/firewall.d.ts +2 -2
  376. package/dist/services/runtime/mcp-shims/firewall.js +2 -2
  377. package/dist/services/runtime/mcp-shims/searxng-shim.d.ts +3 -5
  378. package/dist/services/runtime/mcp-shims/searxng-shim.js +3 -5
  379. package/dist/services/runtime/mcp-shims/searxng-shim.js.map +1 -1
  380. package/dist/services/runtime/mcp-shims/write-mcp-entry.d.ts +20 -20
  381. package/dist/services/runtime/mcp-shims/write-mcp-entry.js +16 -16
  382. package/dist/services/runtime/mcp-shims/write-mcp-entry.js.map +1 -1
  383. package/dist/services/runtime/ownership-marker.d.ts +83 -0
  384. package/dist/services/runtime/ownership-marker.js +109 -0
  385. package/dist/services/runtime/ownership-marker.js.map +1 -0
  386. package/dist/services/runtime/types.d.ts +22 -501
  387. package/dist/services/runtime/types.js +0 -12
  388. package/dist/services/runtime/types.js.map +1 -1
  389. package/dist/services/runtime/workload-compiler.d.ts +17 -0
  390. package/dist/services/runtime/workload-compiler.js +525 -0
  391. package/dist/services/runtime/workload-compiler.js.map +1 -0
  392. package/dist/services/runtime/workload-types.d.ts +11 -0
  393. package/dist/services/runtime/workload-types.js +2 -0
  394. package/dist/services/runtime/workload-types.js.map +1 -0
  395. package/dist/services/setup/core-manager.d.ts +50 -0
  396. package/dist/services/setup/core-manager.js +456 -0
  397. package/dist/services/setup/core-manager.js.map +1 -0
  398. package/dist/services/setup/plugin-installer.js +136 -0
  399. package/dist/services/setup/plugin-installer.js.map +1 -0
  400. package/dist/services/setup/setup-manager.d.ts +158 -0
  401. package/dist/services/setup/setup-manager.js +2768 -0
  402. package/dist/services/setup/setup-manager.js.map +1 -0
  403. package/dist/services/system/cli-command.d.ts +5 -0
  404. package/dist/services/system/cli-command.js +18 -0
  405. package/dist/services/system/cli-command.js.map +1 -0
  406. package/dist/services/system/macos-launchd.js +312 -0
  407. package/dist/services/system/macos-launchd.js.map +1 -0
  408. package/dist/services/system/repair-orchestrator.d.ts +71 -0
  409. package/dist/services/system/repair-orchestrator.js +412 -0
  410. package/dist/services/system/repair-orchestrator.js.map +1 -0
  411. package/dist/services/system/system-monitor.js +96 -0
  412. package/dist/services/system/system-monitor.js.map +1 -0
  413. package/dist/services/system/system-ollama-provider.d.ts +14 -0
  414. package/dist/services/system/system-ollama-provider.js +129 -0
  415. package/dist/services/system/system-ollama-provider.js.map +1 -0
  416. package/dist/services/system/system-reconciler.d.ts +59 -0
  417. package/dist/services/system/system-reconciler.js +710 -0
  418. package/dist/services/system/system-reconciler.js.map +1 -0
  419. package/dist/services/system/update-manager.d.ts +43 -0
  420. package/dist/services/system/update-manager.js +315 -0
  421. package/dist/services/system/update-manager.js.map +1 -0
  422. package/dist/services/system/upgrade-finalize.d.ts +80 -0
  423. package/dist/services/system/upgrade-finalize.js +507 -0
  424. package/dist/services/system/upgrade-finalize.js.map +1 -0
  425. package/dist/services/tasks/registry.d.ts +44 -0
  426. package/dist/services/tasks/registry.js +90 -0
  427. package/dist/services/tasks/registry.js.map +1 -0
  428. package/dist/services/telemetry/activation.d.ts +6 -2
  429. package/dist/services/telemetry/activation.js +6 -2
  430. package/dist/services/telemetry/activation.js.map +1 -1
  431. package/dist/services/telemetry/heartbeat.d.ts +6 -2
  432. package/dist/services/telemetry/heartbeat.js +6 -2
  433. package/dist/services/telemetry/heartbeat.js.map +1 -1
  434. package/dist/services/workspaces/builder.d.ts +29 -0
  435. package/dist/services/workspaces/builder.js +186 -0
  436. package/dist/services/workspaces/builder.js.map +1 -0
  437. package/dist/types.d.ts +331 -45
  438. package/dist/utils/instance-lock.d.ts +2 -2
  439. package/dist/utils/instance-lock.js +2 -2
  440. package/install/jishu-install.sh +107 -26
  441. package/install/jishu-uninstall.sh +8 -0
  442. package/install/post-install.sh +162 -185
  443. package/install/post-uninstall.sh +6 -0
  444. package/node_modules/@fastify/static/.github/workflows/ci.yml +1 -1
  445. package/node_modules/@fastify/static/.github/workflows/lock-threads.yml +19 -0
  446. package/node_modules/@fastify/static/LICENSE +1 -3
  447. package/node_modules/@fastify/static/example/server-benchmark.js +39 -0
  448. package/node_modules/@fastify/static/index.js +169 -23
  449. package/node_modules/@fastify/static/lib/dirList.js +20 -6
  450. package/node_modules/@fastify/static/package.json +10 -8
  451. package/node_modules/@fastify/static/test/dir-list.test.js +82 -0
  452. package/node_modules/@fastify/static/test/static.test.js +326 -4
  453. package/node_modules/@fastify/static/types/index.d.ts +0 -4
  454. package/node_modules/@fastify/static/types/index.test-d.ts +1 -1
  455. package/node_modules/content-disposition/README.md +21 -22
  456. package/node_modules/content-disposition/index.js +122 -44
  457. package/node_modules/content-disposition/package.json +16 -20
  458. package/node_modules/glob/README.md +39 -130
  459. package/node_modules/glob/dist/commonjs/glob.d.ts +8 -0
  460. package/node_modules/glob/dist/commonjs/glob.d.ts.map +1 -1
  461. package/node_modules/glob/dist/commonjs/glob.js +2 -1
  462. package/node_modules/glob/dist/commonjs/glob.js.map +1 -1
  463. package/node_modules/glob/dist/commonjs/index.min.js +4 -0
  464. package/node_modules/glob/dist/commonjs/index.min.js.map +7 -0
  465. package/node_modules/glob/dist/commonjs/pattern.d.ts +3 -0
  466. package/node_modules/glob/dist/commonjs/pattern.d.ts.map +1 -1
  467. package/node_modules/glob/dist/commonjs/pattern.js +4 -0
  468. package/node_modules/glob/dist/commonjs/pattern.js.map +1 -1
  469. package/node_modules/glob/dist/esm/glob.d.ts +8 -0
  470. package/node_modules/glob/dist/esm/glob.d.ts.map +1 -1
  471. package/node_modules/glob/dist/esm/glob.js +2 -1
  472. package/node_modules/glob/dist/esm/glob.js.map +1 -1
  473. package/node_modules/glob/dist/esm/index.min.js +4 -0
  474. package/node_modules/glob/dist/esm/index.min.js.map +7 -0
  475. package/node_modules/glob/dist/esm/pattern.d.ts +3 -0
  476. package/node_modules/glob/dist/esm/pattern.d.ts.map +1 -1
  477. package/node_modules/glob/dist/esm/pattern.js +4 -0
  478. package/node_modules/glob/dist/esm/pattern.js.map +1 -1
  479. package/node_modules/glob/package.json +38 -37
  480. package/node_modules/jishushell-panel/README.md +4 -4
  481. package/node_modules/jishushell-panel/output/dist/server.js +17 -6
  482. package/node_modules/jishushell-panel/output/dist/server.js.map +1 -1
  483. package/node_modules/jishushell-panel/output/public/assets/ApiKeyField-NKcbHjNz.js +1 -0
  484. package/node_modules/jishushell-panel/output/public/assets/Dashboard-Da1fL38t.js +1 -0
  485. package/node_modules/jishushell-panel/output/public/assets/HermesChatPanel-DZvmYsoh.js +1 -0
  486. package/node_modules/jishushell-panel/output/public/assets/HermesConfigForm-BLUWlKwm.js +4 -0
  487. package/node_modules/jishushell-panel/output/public/assets/InitPassword-BAKsshzk.js +1 -0
  488. package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-Dgyc_TX5.js +14 -0
  489. package/node_modules/jishushell-panel/output/public/assets/Login-DHeOmwI8.js +1 -0
  490. package/node_modules/jishushell-panel/output/public/assets/NewInstance-CIy0cYtp.js +1 -0
  491. package/node_modules/jishushell-panel/output/public/assets/ProviderRecommendations-H0ByEYF0.js +1 -0
  492. package/node_modules/jishushell-panel/output/public/assets/Settings-DAT-UMfP.js +1 -0
  493. package/node_modules/jishushell-panel/output/public/assets/Setup-g3uckFYR.js +1 -0
  494. package/node_modules/jishushell-panel/output/public/assets/WeixinLoginPanel-D-T6BxkQ.js +1 -0
  495. package/node_modules/jishushell-panel/output/public/assets/api-C70Gt678.js +4 -0
  496. package/node_modules/jishushell-panel/output/public/assets/index-DnnqTf7s.css +1 -0
  497. package/node_modules/jishushell-panel/output/public/assets/index-ERt6_ngA.js +23 -0
  498. package/node_modules/jishushell-panel/output/public/assets/registry-DF93EzIb.js +2 -0
  499. package/node_modules/jishushell-panel/output/public/assets/rolldown-runtime-QTnfLwEv.js +1 -0
  500. package/node_modules/jishushell-panel/output/public/assets/setup-task-q21GnI0E.js +1 -0
  501. package/node_modules/jishushell-panel/output/public/assets/usePolling-DeoThIQn.js +1 -0
  502. package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-CS8DFbkQ.js +1 -0
  503. package/node_modules/jishushell-panel/output/public/assets/vendor-react-Cc84NArf.js +8 -0
  504. package/node_modules/jishushell-panel/output/public/index.html +6 -4
  505. package/node_modules/jishushell-panel/package.json +2 -2
  506. package/node_modules/semver/classes/range.js +11 -2
  507. package/node_modules/semver/package.json +2 -2
  508. package/package.json +12 -64
  509. package/scripts/check-app-path-boundaries.mjs +121 -0
  510. package/scripts/check-app-spec.mjs +127 -25
  511. package/scripts/check-colima-launchd.mjs +10 -8
  512. package/scripts/check-integration-isolation.ts +541 -0
  513. package/scripts/check-new-file-tests.mjs +11 -3
  514. package/scripts/check-open-core-boundaries.mjs +60 -10
  515. package/scripts/check-test-layering.sh +1 -1
  516. package/scripts/fixtures/instances/hermes-sample/instance.json +3 -2
  517. package/scripts/fixtures/instances/legacy-openclaw-sample/instance.json +1 -1
  518. package/scripts/local-web-upgrade-test.README +4 -3
  519. package/scripts/local-web-upgrade-test.example.env +2 -2
  520. package/scripts/local-web-upgrade-test.sh +14 -1
  521. package/scripts/pack-gui-and-send-pi.sh +41 -0
  522. package/scripts/perf/instances.js +1 -1
  523. package/scripts/prune-open-core-dist.mjs +89 -2
  524. package/scripts/smoke/hermes-bootstrap.sh +5 -5
  525. package/templates/hermes-entrypoint.sh +19 -29
  526. package/apps/openwebui-container.yaml +0 -97
  527. package/apps/playwright-container.yaml +0 -126
  528. package/dependencies/jishushell-panel-0.6.5.tgz +0 -0
  529. package/dist/crypto-shim.d.ts +0 -1
  530. package/dist/crypto-shim.js +0 -2
  531. package/dist/crypto-shim.js.map +0 -1
  532. package/dist/routes/agent-apps.d.ts +0 -14
  533. package/dist/routes/agent-apps.js +0 -77
  534. package/dist/routes/agent-apps.js.map +0 -1
  535. package/dist/routes/internal.d.ts +0 -2
  536. package/dist/routes/internal.js +0 -55
  537. package/dist/routes/internal.js.map +0 -1
  538. package/dist/routes/openclaw-routes.d.ts +0 -22
  539. package/dist/routes/openclaw-routes.js +0 -1020
  540. package/dist/routes/openclaw-routes.js.map +0 -1
  541. package/dist/routes/runtime.d.ts +0 -15
  542. package/dist/routes/runtime.js +0 -76
  543. package/dist/routes/runtime.js.map +0 -1
  544. package/dist/services/agent-apps/catalog.d.ts +0 -33
  545. package/dist/services/agent-apps/catalog.js +0 -88
  546. package/dist/services/agent-apps/catalog.js.map +0 -1
  547. package/dist/services/agent-apps/index.d.ts +0 -36
  548. package/dist/services/agent-apps/index.js +0 -171
  549. package/dist/services/agent-apps/index.js.map +0 -1
  550. package/dist/services/agent-apps/installers/adapter-probes.d.ts +0 -49
  551. package/dist/services/agent-apps/installers/adapter-probes.js +0 -230
  552. package/dist/services/agent-apps/installers/adapter-probes.js.map +0 -1
  553. package/dist/services/agent-apps/installers/adapter.d.ts +0 -30
  554. package/dist/services/agent-apps/installers/adapter.js +0 -171
  555. package/dist/services/agent-apps/installers/adapter.js.map +0 -1
  556. package/dist/services/agent-apps/installers/registry-probe.js.map +0 -1
  557. package/dist/services/agent-apps/installers/shell-script.d.ts +0 -47
  558. package/dist/services/agent-apps/installers/shell-script.js +0 -488
  559. package/dist/services/agent-apps/installers/shell-script.js.map +0 -1
  560. package/dist/services/agent-apps/types.d.ts +0 -128
  561. package/dist/services/agent-apps/types.js +0 -17
  562. package/dist/services/agent-apps/types.js.map +0 -1
  563. package/dist/services/app/app-compiler.js +0 -185
  564. package/dist/services/app/app-compiler.js.map +0 -1
  565. package/dist/services/app/app-manager.d.ts +0 -184
  566. package/dist/services/app/app-manager.js +0 -2933
  567. package/dist/services/app/app-manager.js.map +0 -1
  568. package/dist/services/app/custom-manager.d.ts +0 -27
  569. package/dist/services/app/custom-manager.js +0 -382
  570. package/dist/services/app/custom-manager.js.map +0 -1
  571. package/dist/services/app/hermes-agent-manager.d.ts +0 -20
  572. package/dist/services/app/hermes-agent-manager.js +0 -299
  573. package/dist/services/app/hermes-agent-manager.js.map +0 -1
  574. package/dist/services/app/id-normalizer.d.ts +0 -27
  575. package/dist/services/app/id-normalizer.js +0 -77
  576. package/dist/services/app/id-normalizer.js.map +0 -1
  577. package/dist/services/app/ollama-manager.d.ts +0 -18
  578. package/dist/services/app/ollama-manager.js +0 -224
  579. package/dist/services/app/ollama-manager.js.map +0 -1
  580. package/dist/services/app/openclaw-manager.d.ts +0 -63
  581. package/dist/services/app/openclaw-manager.js +0 -1215
  582. package/dist/services/app/openclaw-manager.js.map +0 -1
  583. package/dist/services/app/paths.d.ts +0 -27
  584. package/dist/services/app/paths.js +0 -40
  585. package/dist/services/app/paths.js.map +0 -1
  586. package/dist/services/app/platform-transform.d.ts +0 -32
  587. package/dist/services/app/platform-transform.js +0 -65
  588. package/dist/services/app/platform-transform.js.map +0 -1
  589. package/dist/services/app/provide-resolver.d.ts +0 -29
  590. package/dist/services/app/provide-resolver.js +0 -135
  591. package/dist/services/app/provide-resolver.js.map +0 -1
  592. package/dist/services/app/registry.d.ts +0 -17
  593. package/dist/services/app/registry.js +0 -31
  594. package/dist/services/app/registry.js.map +0 -1
  595. package/dist/services/app/remote-spec.d.ts +0 -14
  596. package/dist/services/app/remote-spec.js +0 -58
  597. package/dist/services/app/remote-spec.js.map +0 -1
  598. package/dist/services/app/terminal-session-manager.js +0 -157
  599. package/dist/services/app/terminal-session-manager.js.map +0 -1
  600. package/dist/services/app/types.d.ts +0 -74
  601. package/dist/services/app/types.js +0 -16
  602. package/dist/services/app/types.js.map +0 -1
  603. package/dist/services/app-config-admin.d.ts +0 -17
  604. package/dist/services/app-config-admin.js +0 -177
  605. package/dist/services/app-config-admin.js.map +0 -1
  606. package/dist/services/app-create-from-installed.d.ts +0 -23
  607. package/dist/services/app-create-from-installed.js +0 -75
  608. package/dist/services/app-create-from-installed.js.map +0 -1
  609. package/dist/services/app-passwords.js +0 -173
  610. package/dist/services/app-passwords.js.map +0 -1
  611. package/dist/services/backup-admin.d.ts +0 -101
  612. package/dist/services/backup-admin.js +0 -259
  613. package/dist/services/backup-admin.js.map +0 -1
  614. package/dist/services/backup-manager.d.ts +0 -264
  615. package/dist/services/backup-manager.js +0 -2263
  616. package/dist/services/backup-manager.js.map +0 -1
  617. package/dist/services/backup-verify.js +0 -240
  618. package/dist/services/backup-verify.js.map +0 -1
  619. package/dist/services/capability-endpoint-validator.d.ts +0 -41
  620. package/dist/services/capability-endpoint-validator.js +0 -114
  621. package/dist/services/capability-endpoint-validator.js.map +0 -1
  622. package/dist/services/capability-health.d.ts +0 -16
  623. package/dist/services/capability-health.js +0 -121
  624. package/dist/services/capability-health.js.map +0 -1
  625. package/dist/services/capability-registry.d.ts +0 -29
  626. package/dist/services/capability-registry.js +0 -176
  627. package/dist/services/capability-registry.js.map +0 -1
  628. package/dist/services/capability-sync.d.ts +0 -4
  629. package/dist/services/capability-sync.js +0 -220
  630. package/dist/services/capability-sync.js.map +0 -1
  631. package/dist/services/connection-admin.d.ts +0 -74
  632. package/dist/services/connection-admin.js +0 -287
  633. package/dist/services/connection-admin.js.map +0 -1
  634. package/dist/services/connection-apply.d.ts +0 -91
  635. package/dist/services/connection-apply.js +0 -471
  636. package/dist/services/connection-apply.js.map +0 -1
  637. package/dist/services/connection-resolver.d.ts +0 -65
  638. package/dist/services/connection-resolver.js +0 -281
  639. package/dist/services/connection-resolver.js.map +0 -1
  640. package/dist/services/connection-transactor.d.ts +0 -39
  641. package/dist/services/connection-transactor.js +0 -354
  642. package/dist/services/connection-transactor.js.map +0 -1
  643. package/dist/services/core-manager.d.ts +0 -50
  644. package/dist/services/core-manager.js +0 -411
  645. package/dist/services/core-manager.js.map +0 -1
  646. package/dist/services/external-mounts.js +0 -187
  647. package/dist/services/external-mounts.js.map +0 -1
  648. package/dist/services/files-manager.d.ts +0 -252
  649. package/dist/services/files-manager.js +0 -1156
  650. package/dist/services/files-manager.js.map +0 -1
  651. package/dist/services/files-mounts.d.ts +0 -42
  652. package/dist/services/files-mounts.js +0 -207
  653. package/dist/services/files-mounts.js.map +0 -1
  654. package/dist/services/instance-admin.d.ts +0 -26
  655. package/dist/services/instance-admin.js +0 -218
  656. package/dist/services/instance-admin.js.map +0 -1
  657. package/dist/services/instance-manager.d.ts +0 -192
  658. package/dist/services/instance-manager.js +0 -1289
  659. package/dist/services/instance-manager.js.map +0 -1
  660. package/dist/services/macos-launchd.js +0 -312
  661. package/dist/services/macos-launchd.js.map +0 -1
  662. package/dist/services/nomad-manager.d.ts +0 -307
  663. package/dist/services/nomad-manager.js +0 -3958
  664. package/dist/services/nomad-manager.js.map +0 -1
  665. package/dist/services/organize/applier.js +0 -218
  666. package/dist/services/organize/applier.js.map +0 -1
  667. package/dist/services/organize/rules.js +0 -286
  668. package/dist/services/organize/rules.js.map +0 -1
  669. package/dist/services/organize/scanner.js +0 -366
  670. package/dist/services/organize/scanner.js.map +0 -1
  671. package/dist/services/organize/store.js +0 -82
  672. package/dist/services/organize/store.js.map +0 -1
  673. package/dist/services/plugin-installer.js +0 -128
  674. package/dist/services/plugin-installer.js.map +0 -1
  675. package/dist/services/process-manager.d.ts +0 -25
  676. package/dist/services/process-manager.js +0 -568
  677. package/dist/services/process-manager.js.map +0 -1
  678. package/dist/services/runtime/adapters/custom.d.ts +0 -20
  679. package/dist/services/runtime/adapters/custom.js +0 -188
  680. package/dist/services/runtime/adapters/custom.js.map +0 -1
  681. package/dist/services/runtime/adapters/hermes.d.ts +0 -204
  682. package/dist/services/runtime/adapters/hermes.js +0 -1684
  683. package/dist/services/runtime/adapters/hermes.js.map +0 -1
  684. package/dist/services/runtime/adapters/openclaw-mcporter.d.ts +0 -45
  685. package/dist/services/runtime/adapters/openclaw-mcporter.js +0 -108
  686. package/dist/services/runtime/adapters/openclaw-mcporter.js.map +0 -1
  687. package/dist/services/runtime/adapters/openclaw.d.ts +0 -426
  688. package/dist/services/runtime/adapters/openclaw.js +0 -3975
  689. package/dist/services/runtime/adapters/openclaw.js.map +0 -1
  690. package/dist/services/runtime/index.d.ts +0 -34
  691. package/dist/services/runtime/index.js +0 -51
  692. package/dist/services/runtime/index.js.map +0 -1
  693. package/dist/services/runtime/mcp-shims/anythingllm-shim.d.ts +0 -46
  694. package/dist/services/runtime/mcp-shims/anythingllm-shim.js +0 -281
  695. package/dist/services/runtime/mcp-shims/anythingllm-shim.js.map +0 -1
  696. package/dist/services/runtime/mcp-shims/drive-shim.js +0 -490
  697. package/dist/services/runtime/mcp-shims/drive-shim.js.map +0 -1
  698. package/dist/services/runtime/mcp-shims/jishukb-shim.d.ts +0 -48
  699. package/dist/services/runtime/mcp-shims/jishukb-shim.js +0 -723
  700. package/dist/services/runtime/mcp-shims/jishukb-shim.js.map +0 -1
  701. package/dist/services/runtime/mcp-shims/mcporter-lite.js +0 -276
  702. package/dist/services/runtime/mcp-shims/mcporter-lite.js.map +0 -1
  703. package/dist/services/runtime/migrations.d.ts +0 -23
  704. package/dist/services/runtime/migrations.js +0 -125
  705. package/dist/services/runtime/migrations.js.map +0 -1
  706. package/dist/services/runtime/registry.d.ts +0 -13
  707. package/dist/services/runtime/registry.js +0 -32
  708. package/dist/services/runtime/registry.js.map +0 -1
  709. package/dist/services/runtime-identity.d.ts +0 -13
  710. package/dist/services/runtime-identity.js +0 -166
  711. package/dist/services/runtime-identity.js.map +0 -1
  712. package/dist/services/runtime-repair.d.ts +0 -52
  713. package/dist/services/runtime-repair.js +0 -352
  714. package/dist/services/runtime-repair.js.map +0 -1
  715. package/dist/services/setup-manager.d.ts +0 -158
  716. package/dist/services/setup-manager.js +0 -2740
  717. package/dist/services/setup-manager.js.map +0 -1
  718. package/dist/services/suggestions.d.ts +0 -27
  719. package/dist/services/suggestions.js +0 -133
  720. package/dist/services/suggestions.js.map +0 -1
  721. package/dist/services/system-monitor.js +0 -79
  722. package/dist/services/system-monitor.js.map +0 -1
  723. package/dist/services/system-ollama-provider.d.ts +0 -14
  724. package/dist/services/system-ollama-provider.js +0 -125
  725. package/dist/services/system-ollama-provider.js.map +0 -1
  726. package/dist/services/system-reconciler.d.ts +0 -72
  727. package/dist/services/system-reconciler.js +0 -600
  728. package/dist/services/system-reconciler.js.map +0 -1
  729. package/dist/services/task-registry.d.ts +0 -44
  730. package/dist/services/task-registry.js +0 -76
  731. package/dist/services/task-registry.js.map +0 -1
  732. package/dist/services/types-shim.d.ts +0 -16
  733. package/dist/services/types-shim.js +0 -2
  734. package/dist/services/types-shim.js.map +0 -1
  735. package/dist/services/update-manager.d.ts +0 -47
  736. package/dist/services/update-manager.js +0 -351
  737. package/dist/services/update-manager.js.map +0 -1
  738. package/dist/services/webdav/server.d.ts +0 -24
  739. package/dist/services/webdav/server.js +0 -420
  740. package/dist/services/webdav/server.js.map +0 -1
  741. package/dist/services/webdav/xml-builder.js.map +0 -1
  742. package/dist/services/workspace-builder.d.ts +0 -29
  743. package/dist/services/workspace-builder.js +0 -188
  744. package/dist/services/workspace-builder.js.map +0 -1
  745. package/node_modules/@fastify/static/.github/stale.yml +0 -21
  746. package/node_modules/@isaacs/cliui/LICENSE.md +0 -63
  747. package/node_modules/@isaacs/cliui/README.md +0 -151
  748. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.d.ts +0 -4
  749. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.d.ts.map +0 -1
  750. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.js +0 -16
  751. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-regex/index.js.map +0 -1
  752. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.d.ts +0 -34
  753. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.d.ts.map +0 -1
  754. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.js +0 -170
  755. package/node_modules/@isaacs/cliui/dist/commonjs/ansi-styles/index.js.map +0 -1
  756. package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.d.ts +0 -6
  757. package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.d.ts.map +0 -1
  758. package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.js +0 -307
  759. package/node_modules/@isaacs/cliui/dist/commonjs/eastasianwidth/index.js.map +0 -1
  760. package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.d.ts +0 -2
  761. package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.d.ts.map +0 -1
  762. package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.js +0 -7
  763. package/node_modules/@isaacs/cliui/dist/commonjs/emoji-regex/index.js.map +0 -1
  764. package/node_modules/@isaacs/cliui/dist/commonjs/index.d.ts +0 -41
  765. package/node_modules/@isaacs/cliui/dist/commonjs/index.d.ts.map +0 -1
  766. package/node_modules/@isaacs/cliui/dist/commonjs/index.js +0 -322
  767. package/node_modules/@isaacs/cliui/dist/commonjs/index.js.map +0 -1
  768. package/node_modules/@isaacs/cliui/dist/commonjs/index.min.js +0 -12
  769. package/node_modules/@isaacs/cliui/dist/commonjs/index.min.js.map +0 -7
  770. package/node_modules/@isaacs/cliui/dist/commonjs/package.json +0 -3
  771. package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.d.ts +0 -5
  772. package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.d.ts.map +0 -1
  773. package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.js +0 -49
  774. package/node_modules/@isaacs/cliui/dist/commonjs/string-width/index.js.map +0 -1
  775. package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.d.ts +0 -2
  776. package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.d.ts.map +0 -1
  777. package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.js +0 -8
  778. package/node_modules/@isaacs/cliui/dist/commonjs/strip-ansi/index.js.map +0 -1
  779. package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.d.ts +0 -7
  780. package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.d.ts.map +0 -1
  781. package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.js +0 -176
  782. package/node_modules/@isaacs/cliui/dist/commonjs/wrap-ansi/index.js.map +0 -1
  783. package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.d.ts +0 -4
  784. package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.d.ts.map +0 -1
  785. package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.js +0 -12
  786. package/node_modules/@isaacs/cliui/dist/esm/ansi-regex/index.js.map +0 -1
  787. package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.d.ts +0 -34
  788. package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.d.ts.map +0 -1
  789. package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.js +0 -167
  790. package/node_modules/@isaacs/cliui/dist/esm/ansi-styles/index.js.map +0 -1
  791. package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.d.ts +0 -6
  792. package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.d.ts.map +0 -1
  793. package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.js +0 -299
  794. package/node_modules/@isaacs/cliui/dist/esm/eastasianwidth/index.js.map +0 -1
  795. package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.d.ts +0 -2
  796. package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.d.ts.map +0 -1
  797. package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.js +0 -3
  798. package/node_modules/@isaacs/cliui/dist/esm/emoji-regex/index.js.map +0 -1
  799. package/node_modules/@isaacs/cliui/dist/esm/index.d.ts +0 -41
  800. package/node_modules/@isaacs/cliui/dist/esm/index.d.ts.map +0 -1
  801. package/node_modules/@isaacs/cliui/dist/esm/index.js +0 -317
  802. package/node_modules/@isaacs/cliui/dist/esm/index.js.map +0 -1
  803. package/node_modules/@isaacs/cliui/dist/esm/index.min.js +0 -12
  804. package/node_modules/@isaacs/cliui/dist/esm/index.min.js.map +0 -7
  805. package/node_modules/@isaacs/cliui/dist/esm/package.json +0 -3
  806. package/node_modules/@isaacs/cliui/dist/esm/string-width/index.d.ts +0 -5
  807. package/node_modules/@isaacs/cliui/dist/esm/string-width/index.d.ts.map +0 -1
  808. package/node_modules/@isaacs/cliui/dist/esm/string-width/index.js +0 -46
  809. package/node_modules/@isaacs/cliui/dist/esm/string-width/index.js.map +0 -1
  810. package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.d.ts +0 -2
  811. package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.d.ts.map +0 -1
  812. package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.js +0 -4
  813. package/node_modules/@isaacs/cliui/dist/esm/strip-ansi/index.js.map +0 -1
  814. package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.d.ts +0 -7
  815. package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.d.ts.map +0 -1
  816. package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.js +0 -172
  817. package/node_modules/@isaacs/cliui/dist/esm/wrap-ansi/index.js.map +0 -1
  818. package/node_modules/@isaacs/cliui/package.json +0 -163
  819. package/node_modules/content-disposition/HISTORY.md +0 -60
  820. package/node_modules/cross-spawn/LICENSE +0 -21
  821. package/node_modules/cross-spawn/README.md +0 -89
  822. package/node_modules/cross-spawn/index.js +0 -39
  823. package/node_modules/cross-spawn/lib/enoent.js +0 -59
  824. package/node_modules/cross-spawn/lib/parse.js +0 -91
  825. package/node_modules/cross-spawn/lib/util/escape.js +0 -47
  826. package/node_modules/cross-spawn/lib/util/readShebang.js +0 -23
  827. package/node_modules/cross-spawn/lib/util/resolveCommand.js +0 -52
  828. package/node_modules/cross-spawn/package.json +0 -73
  829. package/node_modules/foreground-child/LICENSE +0 -15
  830. package/node_modules/foreground-child/README.md +0 -128
  831. package/node_modules/foreground-child/dist/commonjs/all-signals.d.ts +0 -2
  832. package/node_modules/foreground-child/dist/commonjs/all-signals.d.ts.map +0 -1
  833. package/node_modules/foreground-child/dist/commonjs/all-signals.js +0 -58
  834. package/node_modules/foreground-child/dist/commonjs/all-signals.js.map +0 -1
  835. package/node_modules/foreground-child/dist/commonjs/index.d.ts +0 -58
  836. package/node_modules/foreground-child/dist/commonjs/index.d.ts.map +0 -1
  837. package/node_modules/foreground-child/dist/commonjs/index.js +0 -123
  838. package/node_modules/foreground-child/dist/commonjs/index.js.map +0 -1
  839. package/node_modules/foreground-child/dist/commonjs/package.json +0 -3
  840. package/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts +0 -6
  841. package/node_modules/foreground-child/dist/commonjs/proxy-signals.d.ts.map +0 -1
  842. package/node_modules/foreground-child/dist/commonjs/proxy-signals.js +0 -38
  843. package/node_modules/foreground-child/dist/commonjs/proxy-signals.js.map +0 -1
  844. package/node_modules/foreground-child/dist/commonjs/watchdog.d.ts +0 -10
  845. package/node_modules/foreground-child/dist/commonjs/watchdog.d.ts.map +0 -1
  846. package/node_modules/foreground-child/dist/commonjs/watchdog.js +0 -50
  847. package/node_modules/foreground-child/dist/commonjs/watchdog.js.map +0 -1
  848. package/node_modules/foreground-child/dist/esm/all-signals.d.ts +0 -2
  849. package/node_modules/foreground-child/dist/esm/all-signals.d.ts.map +0 -1
  850. package/node_modules/foreground-child/dist/esm/all-signals.js +0 -52
  851. package/node_modules/foreground-child/dist/esm/all-signals.js.map +0 -1
  852. package/node_modules/foreground-child/dist/esm/index.d.ts +0 -58
  853. package/node_modules/foreground-child/dist/esm/index.d.ts.map +0 -1
  854. package/node_modules/foreground-child/dist/esm/index.js +0 -115
  855. package/node_modules/foreground-child/dist/esm/index.js.map +0 -1
  856. package/node_modules/foreground-child/dist/esm/package.json +0 -3
  857. package/node_modules/foreground-child/dist/esm/proxy-signals.d.ts +0 -6
  858. package/node_modules/foreground-child/dist/esm/proxy-signals.d.ts.map +0 -1
  859. package/node_modules/foreground-child/dist/esm/proxy-signals.js +0 -34
  860. package/node_modules/foreground-child/dist/esm/proxy-signals.js.map +0 -1
  861. package/node_modules/foreground-child/dist/esm/watchdog.d.ts +0 -10
  862. package/node_modules/foreground-child/dist/esm/watchdog.d.ts.map +0 -1
  863. package/node_modules/foreground-child/dist/esm/watchdog.js +0 -46
  864. package/node_modules/foreground-child/dist/esm/watchdog.js.map +0 -1
  865. package/node_modules/foreground-child/package.json +0 -106
  866. package/node_modules/glob/dist/esm/bin.d.mts +0 -3
  867. package/node_modules/glob/dist/esm/bin.d.mts.map +0 -1
  868. package/node_modules/glob/dist/esm/bin.mjs +0 -346
  869. package/node_modules/glob/dist/esm/bin.mjs.map +0 -1
  870. package/node_modules/isexe/.npmignore +0 -2
  871. package/node_modules/isexe/LICENSE +0 -15
  872. package/node_modules/isexe/README.md +0 -51
  873. package/node_modules/isexe/index.js +0 -57
  874. package/node_modules/isexe/mode.js +0 -41
  875. package/node_modules/isexe/package.json +0 -31
  876. package/node_modules/isexe/test/basic.js +0 -221
  877. package/node_modules/isexe/windows.js +0 -42
  878. package/node_modules/jackspeak/LICENSE.md +0 -55
  879. package/node_modules/jackspeak/README.md +0 -394
  880. package/node_modules/jackspeak/dist/commonjs/index.d.ts +0 -323
  881. package/node_modules/jackspeak/dist/commonjs/index.d.ts.map +0 -1
  882. package/node_modules/jackspeak/dist/commonjs/index.js +0 -944
  883. package/node_modules/jackspeak/dist/commonjs/index.js.map +0 -1
  884. package/node_modules/jackspeak/dist/commonjs/index.min.js +0 -33
  885. package/node_modules/jackspeak/dist/commonjs/index.min.js.map +0 -7
  886. package/node_modules/jackspeak/dist/commonjs/package.json +0 -3
  887. package/node_modules/jackspeak/dist/esm/index.d.ts +0 -323
  888. package/node_modules/jackspeak/dist/esm/index.d.ts.map +0 -1
  889. package/node_modules/jackspeak/dist/esm/index.js +0 -936
  890. package/node_modules/jackspeak/dist/esm/index.js.map +0 -1
  891. package/node_modules/jackspeak/dist/esm/index.min.js +0 -33
  892. package/node_modules/jackspeak/dist/esm/index.min.js.map +0 -7
  893. package/node_modules/jackspeak/dist/esm/package.json +0 -3
  894. package/node_modules/jackspeak/package.json +0 -115
  895. package/node_modules/jishushell-panel/output/public/assets/ApiKeyField-D1i7zWXR.js +0 -1
  896. package/node_modules/jishushell-panel/output/public/assets/Dashboard-sWIvL43F.js +0 -1
  897. package/node_modules/jishushell-panel/output/public/assets/HermesChatPanel-DQ8RyvQY.js +0 -1
  898. package/node_modules/jishushell-panel/output/public/assets/HermesConfigForm-tIbPP1sB.js +0 -4
  899. package/node_modules/jishushell-panel/output/public/assets/InitPassword-C3Slq3Dd.js +0 -1
  900. package/node_modules/jishushell-panel/output/public/assets/InstanceDetail-7JqY9tq4.js +0 -92
  901. package/node_modules/jishushell-panel/output/public/assets/Login-BXLDJlQN.js +0 -1
  902. package/node_modules/jishushell-panel/output/public/assets/NewInstance-dLc5Xrpx.js +0 -1
  903. package/node_modules/jishushell-panel/output/public/assets/ProviderRecommendations-DIAXxesl.js +0 -1
  904. package/node_modules/jishushell-panel/output/public/assets/Settings-Bd5utbBh.js +0 -1
  905. package/node_modules/jishushell-panel/output/public/assets/Setup-Yn9_20FL.js +0 -1
  906. package/node_modules/jishushell-panel/output/public/assets/WeixinLoginPanel-C21doQTJ.js +0 -9
  907. package/node_modules/jishushell-panel/output/public/assets/index-CCkaIEjn.js +0 -20
  908. package/node_modules/jishushell-panel/output/public/assets/index-D7qxy-Vh.css +0 -1
  909. package/node_modules/jishushell-panel/output/public/assets/registry-B2ZQZXWL.js +0 -2
  910. package/node_modules/jishushell-panel/output/public/assets/usePolling-BFZm4do_.js +0 -1
  911. package/node_modules/jishushell-panel/output/public/assets/vendor-i18n-DqPtOicc.js +0 -9
  912. package/node_modules/jishushell-panel/output/public/assets/vendor-react-DW5juQin.js +0 -59
  913. package/node_modules/package-json-from-dist/LICENSE.md +0 -63
  914. package/node_modules/package-json-from-dist/README.md +0 -110
  915. package/node_modules/package-json-from-dist/dist/commonjs/index.d.ts +0 -89
  916. package/node_modules/package-json-from-dist/dist/commonjs/index.d.ts.map +0 -1
  917. package/node_modules/package-json-from-dist/dist/commonjs/index.js +0 -134
  918. package/node_modules/package-json-from-dist/dist/commonjs/index.js.map +0 -1
  919. package/node_modules/package-json-from-dist/dist/commonjs/package.json +0 -3
  920. package/node_modules/package-json-from-dist/dist/esm/index.d.ts +0 -89
  921. package/node_modules/package-json-from-dist/dist/esm/index.d.ts.map +0 -1
  922. package/node_modules/package-json-from-dist/dist/esm/index.js +0 -129
  923. package/node_modules/package-json-from-dist/dist/esm/index.js.map +0 -1
  924. package/node_modules/package-json-from-dist/dist/esm/package.json +0 -3
  925. package/node_modules/package-json-from-dist/package.json +0 -68
  926. package/node_modules/path-key/index.d.ts +0 -40
  927. package/node_modules/path-key/index.js +0 -16
  928. package/node_modules/path-key/license +0 -9
  929. package/node_modules/path-key/package.json +0 -39
  930. package/node_modules/path-key/readme.md +0 -61
  931. package/node_modules/safe-buffer/LICENSE +0 -21
  932. package/node_modules/safe-buffer/README.md +0 -584
  933. package/node_modules/safe-buffer/index.d.ts +0 -187
  934. package/node_modules/safe-buffer/index.js +0 -65
  935. package/node_modules/safe-buffer/package.json +0 -51
  936. package/node_modules/shebang-command/index.js +0 -19
  937. package/node_modules/shebang-command/license +0 -9
  938. package/node_modules/shebang-command/package.json +0 -34
  939. package/node_modules/shebang-command/readme.md +0 -34
  940. package/node_modules/shebang-regex/index.d.ts +0 -22
  941. package/node_modules/shebang-regex/index.js +0 -2
  942. package/node_modules/shebang-regex/license +0 -9
  943. package/node_modules/shebang-regex/package.json +0 -35
  944. package/node_modules/shebang-regex/readme.md +0 -33
  945. package/node_modules/signal-exit/LICENSE.txt +0 -16
  946. package/node_modules/signal-exit/README.md +0 -74
  947. package/node_modules/signal-exit/dist/cjs/browser.d.ts +0 -12
  948. package/node_modules/signal-exit/dist/cjs/browser.d.ts.map +0 -1
  949. package/node_modules/signal-exit/dist/cjs/browser.js +0 -10
  950. package/node_modules/signal-exit/dist/cjs/browser.js.map +0 -1
  951. package/node_modules/signal-exit/dist/cjs/index.d.ts +0 -48
  952. package/node_modules/signal-exit/dist/cjs/index.d.ts.map +0 -1
  953. package/node_modules/signal-exit/dist/cjs/index.js +0 -279
  954. package/node_modules/signal-exit/dist/cjs/index.js.map +0 -1
  955. package/node_modules/signal-exit/dist/cjs/package.json +0 -3
  956. package/node_modules/signal-exit/dist/cjs/signals.d.ts +0 -29
  957. package/node_modules/signal-exit/dist/cjs/signals.d.ts.map +0 -1
  958. package/node_modules/signal-exit/dist/cjs/signals.js +0 -42
  959. package/node_modules/signal-exit/dist/cjs/signals.js.map +0 -1
  960. package/node_modules/signal-exit/dist/mjs/browser.d.ts +0 -12
  961. package/node_modules/signal-exit/dist/mjs/browser.d.ts.map +0 -1
  962. package/node_modules/signal-exit/dist/mjs/browser.js +0 -4
  963. package/node_modules/signal-exit/dist/mjs/browser.js.map +0 -1
  964. package/node_modules/signal-exit/dist/mjs/index.d.ts +0 -48
  965. package/node_modules/signal-exit/dist/mjs/index.d.ts.map +0 -1
  966. package/node_modules/signal-exit/dist/mjs/index.js +0 -275
  967. package/node_modules/signal-exit/dist/mjs/index.js.map +0 -1
  968. package/node_modules/signal-exit/dist/mjs/package.json +0 -3
  969. package/node_modules/signal-exit/dist/mjs/signals.d.ts +0 -29
  970. package/node_modules/signal-exit/dist/mjs/signals.d.ts.map +0 -1
  971. package/node_modules/signal-exit/dist/mjs/signals.js +0 -39
  972. package/node_modules/signal-exit/dist/mjs/signals.js.map +0 -1
  973. package/node_modules/signal-exit/package.json +0 -106
  974. package/node_modules/which/CHANGELOG.md +0 -166
  975. package/node_modules/which/LICENSE +0 -15
  976. package/node_modules/which/README.md +0 -54
  977. package/node_modules/which/bin/node-which +0 -52
  978. package/node_modules/which/package.json +0 -43
  979. package/node_modules/which/which.js +0 -125
  980. package/scripts/check-adapter-isolation.ts +0 -293
  981. /package/dist/services/{app → app-common}/app-compiler.d.ts +0 -0
  982. /package/dist/services/{app → app-common}/terminal-session-manager.d.ts +0 -0
  983. /package/dist/services/{backup-verify.d.ts → backup/backup-verify.d.ts} +0 -0
  984. /package/dist/services/{external-mounts.d.ts → files/external-mounts.d.ts} +0 -0
  985. /package/dist/services/{organize → files/organize}/applier.d.ts +0 -0
  986. /package/dist/services/{organize → files/organize}/rules.d.ts +0 -0
  987. /package/dist/services/{organize → files/organize}/scanner.d.ts +0 -0
  988. /package/dist/services/{organize → files/organize}/store.d.ts +0 -0
  989. /package/dist/services/{webdav → files/webdav}/xml-builder.d.ts +0 -0
  990. /package/dist/services/{webdav → files/webdav}/xml-builder.js +0 -0
  991. /package/dist/services/{app-passwords.d.ts → instances/passwords.d.ts} +0 -0
  992. /package/dist/services/{agent-apps → integrations/installable}/installers/registry-probe.d.ts +0 -0
  993. /package/dist/services/{agent-apps → integrations/installable}/installers/registry-probe.js +0 -0
  994. /package/dist/services/{runtime/mcp-shims → integrations/openclaw}/drive-shim.d.ts +0 -0
  995. /package/dist/services/{runtime/mcp-shims → integrations/openclaw}/mcporter-lite.d.ts +0 -0
  996. /package/dist/services/{plugin-installer.d.ts → setup/plugin-installer.d.ts} +0 -0
  997. /package/dist/services/{macos-launchd.d.ts → system/macos-launchd.d.ts} +0 -0
  998. /package/dist/services/{system-monitor.d.ts → system/system-monitor.d.ts} +0 -0
@@ -1,21 +1,25 @@
1
1
  import { getServiceManagerType } from "../config.js";
2
- import { assertNotLocked } from "../services/backup-manager.js";
3
- import * as instanceManager from "../services/app/app-manager.js";
2
+ import { assertNotLocked } from "../services/backup/backup-manager.js";
3
+ import * as appService from "../services/app-common/service.js";
4
+ import * as appLifecycle from "../services/app-common/lifecycle-service.js";
4
5
  import { cleanupInstance as cleanupProxyInstance, getLastProxyError, invalidateConfigCache, } from "../services/llm-proxy/instance-proxy.js";
5
- import { createInstance, isInstanceAdminError, validateId, } from "../services/instance-admin.js";
6
- import { getConnectionStatus, getConnectionSummary, isConnectionAdminError, replaceConnections, } from "../services/connection-admin.js";
7
- import { getAppConfigMeta, isAppConfigAdminError, readAppConfig, writeAppConfig, } from "../services/app-config-admin.js";
8
- import { augmentInstanceMetadata, getInstanceCapabilities, resolveAgentType, } from "../services/runtime/instance.js";
9
- import { getAdapter, hasAdapter } from "../services/runtime/index.js";
10
- import { invalidateRuntimeIdentity, resolveRuntimeIdentity, } from "../services/runtime-identity.js";
11
- import { acknowledgeRuntimeRestartAdvisory } from "../services/system-reconciler.js";
12
- import { assertTerminalSessionOwner, getTerminalSession, getTerminalSessionEvents, sendTerminalSessionInput, startTerminalSession, stopTerminalSession, subscribeTerminalSession, } from "../services/app/terminal-session-manager.js";
13
- import { TtlMap } from "../utils/ttl-cache.js";
6
+ import { createInstance, isInstanceAdminError, validateId, } from "../services/instances/admin.js";
7
+ import { cloneInstance, isInstanceCloneError } from "../services/instances/clone.js";
8
+ import { getConnectionStatus, getConnectionSummary, isConnectionAdminError, replaceConnections, } from "../services/connections/admin.js";
9
+ import { getAppConfigMeta, isAppConfigAdminError, readAppConfig, writeAppConfig, } from "../services/instances/config-admin.js";
10
+ import { augmentInstanceMetadata, getInstanceCapabilities, resolvePrimaryIntegrationKind, } from "../services/runtime/instance.js";
11
+ import { getIntegration, hasIntegration } from "../services/integrations/index.js";
12
+ import { invalidateExecutionOwner } from "../services/app-common/execution-owner.js";
13
+ import { markRuntimeRepairRestartApplied } from "../services/repair/runtime-repair.js";
14
+ import { getCapabilityHtmlRewriter } from "../services/capability-proxy/html-rewriters/index.js";
15
+ import { createHash } from "node:crypto";
16
+ import { assertTerminalSessionOwner, getTerminalSession, getTerminalSessionEvents, sendTerminalSessionInput, startTerminalSession, stopTerminalSession, subscribeTerminalSession, } from "../services/app-common/terminal-session-manager.js";
17
+ import { refreshInstanceStatus } from "../services/app-common/status-refresh.js";
14
18
  import { writeSecretFile } from "../utils/fs.js";
15
19
  import { Readable } from "node:stream";
16
20
  export { validateId };
17
21
  // Hop-by-hop headers that must not be forwarded by a proxy (RFC 2616 §13.5.1).
18
- // Exported for adapter-owned route modules that implement their own HTTP proxies.
22
+ // Exported for integration-owned route modules that implement their own HTTP proxies.
19
23
  export const HOP_BY_HOP = new Set([
20
24
  "connection", "keep-alive", "proxy-authenticate", "proxy-authorization",
21
25
  "te", "trailer", "transfer-encoding", "upgrade",
@@ -77,7 +81,7 @@ function rewriteCapabilityLocation(basePath, canonicalBasePath, pathname, search
77
81
  : joinProxyPath(basePath, pathname);
78
82
  return `${rewrittenPath}${search}${hash}`;
79
83
  }
80
- function joinUpstreamPath(basePath, suffix) {
84
+ export function joinUpstreamPath(basePath, suffix) {
81
85
  const normalizedBase = typeof basePath === "string" && basePath.trim()
82
86
  ? (basePath.startsWith("/") ? basePath : `/${basePath}`)
83
87
  : "/";
@@ -90,244 +94,49 @@ function shouldRewriteProxyResponse(contentType) {
90
94
  const value = (contentType ?? "").toLowerCase();
91
95
  return value.includes("text/html") || value.includes("text/css");
92
96
  }
93
- function browserlessDebuggerBootstrap(instanceId) {
94
- const apiProxyPath = `${capabilityProxyPath(instanceId, "browserless-api")}`;
95
- const escapedPath = JSON.stringify(apiProxyPath + "/");
96
- const escapedProxyBase = JSON.stringify(apiProxyPath);
97
- const escapedWorkerPrelude = JSON.stringify([
98
- "(function(){",
99
- `var P=${escapedProxyBase};`,
100
- "var _WS=self.WebSocket;",
101
- "if(typeof _WS!=='function')return;",
102
- "self.WebSocket=function(url,protocols){",
103
- "try{var p=new URL(url,self.location.origin);",
104
- "if(p.host===self.location.host&&!p.pathname.startsWith('/api/')){",
105
- "var s=self.location.protocol==='https:'?'wss:':'ws:';",
106
- "url=s+'//'+self.location.host+P+p.pathname+p.search;",
107
- "}}catch(_e){}",
108
- "return protocols!==undefined?new _WS(url,protocols):new _WS(url);",
109
- "};",
110
- "self.WebSocket.prototype=_WS.prototype;",
111
- "self.WebSocket.CONNECTING=_WS.CONNECTING;",
112
- "self.WebSocket.OPEN=_WS.OPEN;",
113
- "self.WebSocket.CLOSING=_WS.CLOSING;",
114
- "self.WebSocket.CLOSED=_WS.CLOSED;",
115
- "})();",
116
- ].join(""));
117
- // 1) Set baseURL in localStorage so the debugger's HTTP API calls go through
118
- // the capability proxy.
119
- // 2) Monkey-patch WebSocket in the page and any same-origin workers so that
120
- // Browserless connections targeting the panel origin (e.g.
121
- // ws://panel:8090/?launch=...) are rewritten through the capability proxy.
122
- return [
123
- "<script>(function(){",
124
- // --- localStorage apiSettings.baseURL ---
125
- // Browserless reads `state.apiSettings.baseURL` (a NESTED object); writing
126
- // a flat `state.baseURL` is silently ignored, and the SPA falls back to
127
- // `window.location.origin` (no proxy prefix) — producing connect URLs like
128
- // `ws://panel:8090/?launch=...` that bypass the capability proxy.
129
- "try{var key='browserless-debugger:'+window.location.origin+window.location.pathname;",
130
- "var raw=window.localStorage.getItem(key)||'{}';",
131
- "var state={};try{state=JSON.parse(raw)||{}}catch(_e){}",
132
- `var base=new URL(${escapedPath},window.location.origin);`,
133
- "var token=new URL(window.location.href).searchParams.get('token');",
134
- "if(token)base.searchParams.set('token',token);",
135
- "var settings=(state&&typeof state.apiSettings==='object'&&state.apiSettings)?state.apiSettings:{};",
136
- "settings.baseURL=base.href;",
137
- "state.apiSettings=settings;",
138
- "window.localStorage.setItem(key,JSON.stringify(state));",
139
- "}catch(_e){}",
140
- // --- WebSocket monkey-patch ---
141
- "var _WS=window.WebSocket;",
142
- `var _base=${escapedProxyBase};`,
143
- "window.WebSocket=function(url,protocols){",
144
- "try{var p=new URL(url,window.location.origin);",
145
- "if(p.host===window.location.host&&!p.pathname.startsWith('/api/')){",
146
- "var s=window.location.protocol==='https:'?'wss:':'ws:';",
147
- "url=s+'//'+window.location.host+_base+p.pathname+p.search;",
148
- "}}catch(_e){}",
149
- "return protocols!==undefined?new _WS(url,protocols):new _WS(url);",
150
- "};",
151
- "window.WebSocket.prototype=_WS.prototype;",
152
- "window.WebSocket.CONNECTING=_WS.CONNECTING;",
153
- "window.WebSocket.OPEN=_WS.OPEN;",
154
- "window.WebSocket.CLOSING=_WS.CLOSING;",
155
- "window.WebSocket.CLOSED=_WS.CLOSED;",
156
- // --- Worker monkey-patch ---
157
- "var _Worker=window.Worker;",
158
- `var _workerPrelude=${escapedWorkerPrelude};`,
159
- "function shouldWrapWorker(url){",
160
- "try{var p=new URL(String(url),window.location.href);",
161
- "return p.protocol==='blob:'||p.protocol==='data:'||p.origin===window.location.origin;",
162
- "}catch(_e){return false;}",
163
- "}",
164
- "function wrapWorker(url,options){",
165
- "if(typeof _Worker!=='function'||!shouldWrapWorker(url))return url;",
166
- "try{var resolved=new URL(String(url),window.location.href).href;",
167
- "var isModule=!!(options&&options.type==='module');",
168
- "var source=isModule?_workerPrelude+'\\nimport '+JSON.stringify(resolved)+';':_workerPrelude+'\\nimportScripts('+JSON.stringify(resolved)+');';",
169
- "return URL.createObjectURL(new Blob([source],{type:'text/javascript'}));",
170
- "}catch(_e){return url;}",
171
- "}",
172
- "if(typeof _Worker==='function'){",
173
- "window.Worker=function(url,options){",
174
- "var wrapped=wrapWorker(url,options);",
175
- "return options!==undefined?new _Worker(wrapped,options):new _Worker(wrapped);",
176
- "};",
177
- "window.Worker.prototype=_Worker.prototype;",
178
- "}",
179
- "})();</script>",
180
- ].join("");
181
- }
182
- const JISHU_KB_PRELOAD_SESSION_LIMIT = 50;
183
- const JISHU_KB_PRELOAD_MESSAGE_LIMIT = 20;
184
- const JISHU_KB_PRELOAD_TIMEOUT_MS = 5_000;
185
- const JISHU_KB_PRELOAD_GLOBAL = "__JISHU_KB_PRELOADED_SESSIONS__";
186
- function trimString(value) {
187
- return typeof value === "string" ? value.trim() : "";
188
- }
189
- function parseJishuKbConversationId(value) {
190
- if (typeof value === "number") {
191
- return Number.isSafeInteger(value) && value > 0 ? value : null;
97
+ function capabilityProxyCleanupToken(parts) {
98
+ const hash = createHash("sha256");
99
+ for (const part of parts) {
100
+ hash.update(part ?? "");
101
+ hash.update("\0");
192
102
  }
193
- const raw = trimString(value);
194
- if (!/^\d+$/.test(raw))
195
- return null;
196
- const parsed = Number(raw);
197
- return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null;
198
- }
199
- function parseJishuKbTimestamp(value) {
200
- const numeric = typeof value === "number" ? value : Number(value);
201
- return Number.isFinite(numeric) ? numeric : 0;
103
+ return hash.digest("hex").slice(0, 32);
202
104
  }
203
- function parseJishuKbRole(value) {
204
- const normalized = trimString(value);
205
- return normalized === "user" || normalized === "assistant" || normalized === "system"
206
- ? normalized
207
- : null;
208
- }
209
- function parseJishuKbCitations(value) {
210
- if (Array.isArray(value))
211
- return value;
212
- if (typeof value !== "string" || !value.trim())
213
- return undefined;
214
- try {
215
- const parsed = JSON.parse(value);
216
- return Array.isArray(parsed) ? parsed : undefined;
217
- }
218
- catch {
219
- return undefined;
220
- }
105
+ function hasCookieValue(cookieHeader, name, expectedValue) {
106
+ return cookieHeader
107
+ .split(";")
108
+ .map((part) => part.trim())
109
+ .some((part) => {
110
+ const eq = part.indexOf("=");
111
+ if (eq < 0)
112
+ return false;
113
+ return part.slice(0, eq) === name && part.slice(eq + 1) === expectedValue;
114
+ });
221
115
  }
222
- function relayAbort(parentSignal, controller) {
223
- if (parentSignal.aborted) {
224
- controller.abort(parentSignal.reason);
225
- return () => { };
116
+ export async function resolveHttpCapability(instanceId, capabilityName) {
117
+ const capability = appService
118
+ .getProvidedCapabilitiesForApp(instanceId)
119
+ .find((entry) => entry.capability === capabilityName);
120
+ if (!capability)
121
+ throw new Error(`Capability '${capabilityName}' not found`);
122
+ if (capability.visibility === "internal") {
123
+ throw new Error(`Capability '${capabilityName}' is not externally accessible`);
226
124
  }
227
- const abort = () => controller.abort(parentSignal.reason);
228
- parentSignal.addEventListener("abort", abort, { once: true });
229
- return () => parentSignal.removeEventListener("abort", abort);
230
- }
231
- async function fetchJsonWithTimeout(upstreamOrigin, relativePath, parentSignal) {
232
- const controller = new AbortController();
233
- const cleanupAbort = relayAbort(parentSignal, controller);
234
- const timer = setTimeout(() => controller.abort(new Error("timeout")), JISHU_KB_PRELOAD_TIMEOUT_MS);
235
- try {
236
- const response = await fetch(new URL(relativePath, `${upstreamOrigin}/`).toString(), {
237
- headers: { accept: "application/json" },
238
- signal: controller.signal,
239
- });
240
- if (!response.ok) {
241
- const detail = (await response.text()).slice(0, 200);
242
- throw new Error(`${relativePath} -> ${response.status}${detail ? `: ${detail}` : ""}`);
243
- }
244
- return await response.json();
125
+ if (capability.protocol !== "http" && capability.protocol !== "https") {
126
+ throw new Error(`Capability '${capabilityName}' does not use HTTP(S)`);
245
127
  }
246
- finally {
247
- clearTimeout(timer);
248
- cleanupAbort();
128
+ const runtimePort = appService.resolveRuntimeCapabilityPort(instanceId, capabilityName);
129
+ if (typeof runtimePort !== "number" || runtimePort < 1) {
130
+ throw new Error(`Capability '${capabilityName}' has no resolved port`);
249
131
  }
250
- }
251
- async function loadJishuKbPreloadedSessions(upstreamOrigin, parentSignal) {
252
- const kbList = await fetchJsonWithTimeout(upstreamOrigin, "/api/kb", parentSignal);
253
- const kbIds = Array.from(new Set((Array.isArray(kbList) ? kbList : [])
254
- .map((kb) => trimString(kb?.id))
255
- .filter(Boolean)));
256
- if (!kbIds.length)
257
- kbIds.push("default");
258
- const conversationLists = await Promise.all(kbIds.map(async (kbId) => {
259
- const query = new URLSearchParams({ kb_id: kbId }).toString();
260
- const rows = await fetchJsonWithTimeout(upstreamOrigin, `/api/conversations?${query}`, parentSignal);
261
- return Array.isArray(rows)
262
- ? rows.map((row) => ({
263
- ...row,
264
- kb_id: trimString(row?.kb_id) || kbId,
265
- }))
266
- : [];
267
- }));
268
- const selected = conversationLists
269
- .flat()
270
- .sort((left, right) => parseJishuKbTimestamp(right.updated_at) - parseJishuKbTimestamp(left.updated_at))
271
- .slice(0, JISHU_KB_PRELOAD_SESSION_LIMIT);
272
- const hydrated = await Promise.all(selected.map(async (conversation) => {
273
- const conversationId = parseJishuKbConversationId(conversation.id);
274
- const kbId = trimString(conversation.kb_id);
275
- if (!conversationId || !kbId) {
276
- console.warn("[cap-proxy] skipping jishukb conversation preload with unsupported id/kb", {
277
- id: conversation.id,
278
- kbId,
279
- });
280
- return null;
281
- }
282
- const messages = await fetchJsonWithTimeout(upstreamOrigin, `/api/conversations/${encodeURIComponent(String(conversationId))}/messages`, parentSignal);
283
- const normalizedMessages = (Array.isArray(messages) ? messages : [])
284
- .map((message) => {
285
- const role = parseJishuKbRole(message?.role);
286
- const content = typeof message?.content === "string" ? message.content : "";
287
- if (!role || !content)
288
- return null;
289
- const cites = parseJishuKbCitations(message?.citations);
290
- return cites?.length
291
- ? { role, content, cites }
292
- : { role, content };
293
- })
294
- .filter((message) => message !== null)
295
- .slice(-JISHU_KB_PRELOAD_MESSAGE_LIMIT);
296
- return {
297
- id: conversationId,
298
- kb: kbId,
299
- title: trimString(conversation.title) || "Untitled",
300
- msgs: normalizedMessages,
301
- _syncedMsgIdx: normalizedMessages.length,
302
- };
303
- }));
304
- return hydrated
305
- .filter((session) => session !== null)
306
- .sort((left, right) => left.id - right.id);
307
- }
308
- function jishuKbConversationBootstrap(preloadedSessions) {
309
- const serialized = JSON.stringify(preloadedSessions);
310
- const globalName = JSON.stringify(JISHU_KB_PRELOAD_GLOBAL);
311
- return [
312
- "<script>(function(){",
313
- "try{",
314
- `var incoming=${serialized};`,
315
- `window[${globalName}]=incoming;`,
316
- "var current=[];",
317
- "try{var raw=window.localStorage.getItem('jkb_sess');current=raw?JSON.parse(raw):[];}catch(_e){current=[];}",
318
- "if(!Array.isArray(current))current=[];",
319
- "var seen=Object.create(null);",
320
- "var merged=[];",
321
- "function key(entry){return String(entry&&entry.kb||'')+'::'+String(entry&&entry.id||'');}",
322
- "function push(entry){if(!entry||typeof entry!=='object')return;var k=key(entry);if(seen[k])return;seen[k]=1;merged.push(entry);}",
323
- "incoming.forEach(push);",
324
- "current.forEach(push);",
325
- "merged.sort(function(a,b){return Number(a&&a.id||0)-Number(b&&b.id||0);});",
326
- `if(merged.length>${JISHU_KB_PRELOAD_SESSION_LIMIT})merged=merged.slice(-${JISHU_KB_PRELOAD_SESSION_LIMIT});`,
327
- "window.localStorage.setItem('jkb_sess',JSON.stringify(merged));",
328
- "}catch(_e){}",
329
- "})();</script>",
330
- ].join("");
132
+ const upstreamHost = await appService.getHostForAppPort(instanceId, runtimePort);
133
+ const proxyBase = capabilityProxyPath(instanceId, capabilityName);
134
+ const canonicalProxyBase = canonicalCapabilityProxyBase(proxyBase, capability.path);
135
+ return {
136
+ capability,
137
+ targetBaseUrl: `${capability.protocol}://${appService.urlHost(upstreamHost)}:${runtimePort}`,
138
+ proxyUrl: canonicalProxyBase,
139
+ };
331
140
  }
332
141
  /**
333
142
  * Inject a tiny <script> that monkey-patches `fetch`, `XMLHttpRequest.open`,
@@ -697,7 +506,7 @@ function isTerminalProvide(provide) {
697
506
  return !!provide && String(provide.protocol).toLowerCase() === "terminal" && !!provide.terminal;
698
507
  }
699
508
  function resolveTerminalProvide(instanceId, capability) {
700
- const provide = instanceManager
509
+ const provide = appService
701
510
  .getProvidedCapabilitiesForApp(instanceId)
702
511
  .find((entry) => entry.capability === capability);
703
512
  if (!provide)
@@ -727,12 +536,12 @@ async function proxyProvidedCapability(req, reply) {
727
536
  const idErr = validateId(req.params.id);
728
537
  if (idErr)
729
538
  return reply.status(400).send({ detail: idErr });
730
- const rawInst = instanceManager.getInstance(req.params.id);
539
+ const rawInst = appService.getInstance(req.params.id);
731
540
  if (!rawInst)
732
541
  return reply.status(404).send({ detail: "Instance not found" });
733
- if (!instanceManager.getApp(req.params.id))
542
+ if (!appService.getInstanceInstallRecord(req.params.id))
734
543
  return reply.status(404).send({ detail: "App not found" });
735
- const capabilities = instanceManager.getProvidedCapabilitiesForApp(req.params.id);
544
+ const capabilities = appService.getProvidedCapabilitiesForApp(req.params.id);
736
545
  const capability = capabilities.find((entry) => entry.capability === req.params.capability);
737
546
  if (!capability) {
738
547
  return reply.status(404).send({ detail: `Capability '${req.params.capability}' not found` });
@@ -743,15 +552,24 @@ async function proxyProvidedCapability(req, reply) {
743
552
  if (capability.protocol !== "http" && capability.protocol !== "https") {
744
553
  return reply.status(400).send({ detail: `Capability '${req.params.capability}' does not use HTTP(S)` });
745
554
  }
746
- // Resolve the runtime port (handles port reallocation) instead of using
747
- // the declared AppSpec port which may be stale.
748
- const runtimePort = instanceManager.resolveRuntimeCapabilityPort(req.params.id, req.params.capability)
749
- ?? capability.port;
555
+ // Resolve only the canonical runtime hostPort. AppSpec declared ports are
556
+ // template metadata; using them here would route users to the wrong
557
+ // instance after reallocation or migration drift.
558
+ let runtimePort;
559
+ try {
560
+ runtimePort = appService.resolveRuntimeCapabilityPort(req.params.id, req.params.capability) ?? undefined;
561
+ }
562
+ catch (error) {
563
+ if (appService.isCanonicalRuntimePortRequiredError(error)) {
564
+ return reply.status(error.statusCode || 409).send({ detail: error.message, code: error.code });
565
+ }
566
+ throw error;
567
+ }
750
568
  if (typeof runtimePort !== "number" || runtimePort < 1) {
751
569
  return reply.status(500).send({ detail: `Capability '${req.params.capability}' has no resolved port` });
752
570
  }
753
- const upstreamHost = await instanceManager.getHostForAppPort(req.params.id, runtimePort);
754
- const upstreamOrigin = `${capability.protocol}://${instanceManager.urlHost(upstreamHost)}:${runtimePort}`;
571
+ const upstreamHost = await appService.getHostForAppPort(req.params.id, runtimePort);
572
+ const upstreamOrigin = `${capability.protocol}://${appService.urlHost(upstreamHost)}:${runtimePort}`;
755
573
  const wildcardSuffix = typeof req.params["*"] === "string" ? req.params["*"] : "";
756
574
  const proxyBasePath = capabilityProxyPath(req.params.id, req.params.capability);
757
575
  const querySuffix = req.raw.url?.includes("?") ? req.raw.url.slice(req.raw.url.indexOf("?")) : "";
@@ -914,18 +732,14 @@ async function proxyProvidedCapability(req, reply) {
914
732
  reply.header("pragma", "no-cache");
915
733
  reply.header("expires", "0");
916
734
  let extraHeadHtml = "";
917
- if (req.params.capability === "browserless-debugger") {
918
- extraHeadHtml = browserlessDebuggerBootstrap(req.params.id);
919
- }
920
- if (willInjectHtml && req.params.capability === "web-jishukb") {
921
- try {
922
- const preloadedSessions = await loadJishuKbPreloadedSessions(upstreamOrigin, upstreamAbort.signal);
923
- extraHeadHtml += jishuKbConversationBootstrap(preloadedSessions);
924
- }
925
- catch (error) {
926
- console.warn("[cap-proxy] jishukb conversation preload skipped:", error);
927
- }
928
- }
735
+ const htmlRewriter = getCapabilityHtmlRewriter(capability);
736
+ extraHeadHtml += (await htmlRewriter?.buildHeadHtml({
737
+ instanceId: req.params.id,
738
+ capability,
739
+ upstreamOrigin,
740
+ signal: upstreamAbort.signal,
741
+ willInjectHtml,
742
+ })) ?? "";
929
743
  // Inject a generic fetch/XHR monkey-patch for all capability-proxied
930
744
  // HTML pages. SPA frameworks like SvelteKit compile absolute API paths
931
745
  // (e.g. `/api/v1/...`, `/ollama/...`) into JS bundles at build time.
@@ -934,24 +748,37 @@ async function proxyProvidedCapability(req, reply) {
934
748
  // intercepts fetch() and XMLHttpRequest.open() and rewrites same-origin
935
749
  // absolute paths that do NOT already start with the proxy prefix.
936
750
  extraHeadHtml += capabilityProxyBootstrap(proxyBasePath);
937
- // First-visit cleanup: if the browser still has a stale ServiceWorker
938
- // registered from an earlier panel build (which would intercept this
939
- // navigation and serve cached HTML *without* the bootstrap patches),
940
- // emit Clear-Site-Data so the browser drops the SW + its cache and
941
- // reloads through the proxy. We mark the success with a long-lived
942
- // cookie scoped to the proxy path to avoid a reload loop.
751
+ const rawBody = await upstream.text();
752
+ // First-visit/content-change cleanup: if the browser still has a stale
753
+ // ServiceWorker registered from an earlier panel build (which would
754
+ // intercept this navigation and serve cached HTML *without* the
755
+ // bootstrap patches), emit Clear-Site-Data so the browser drops the SW
756
+ // + its cache and reloads through the proxy. We mark the success with a
757
+ // long-lived cookie scoped to the proxy path to avoid a reload loop.
758
+ // The cookie value is tied to the upstream HTML bytes and validators,
759
+ // not a fixed boolean, so same-tag image rebuilds such as jishu-kb:0.1.1
760
+ // can still trigger one fresh cleanup after the embedded UI changes.
943
761
  // Gate to HTML only — JS/CSS sub-resources also flow through this branch
944
762
  // now that we rewrite JS bundles, and emitting Clear-Site-Data on a JS
945
763
  // response would clear storage mid-page-load.
946
764
  if (willInjectHtml) {
765
+ const cleanupToken = capabilityProxyCleanupToken([
766
+ req.params.id,
767
+ req.params.capability,
768
+ upstreamOrigin,
769
+ upstreamContentType,
770
+ upstream.headers.get("etag"),
771
+ upstream.headers.get("last-modified"),
772
+ upstream.headers.get("content-length"),
773
+ rawBody,
774
+ ]);
947
775
  const cookieHeader = (req.headers.cookie || "").toString();
948
- const swCleaned = /(?:^|;\s*)cap_proxy_sw_clean=1(?:;|$)/.test(cookieHeader);
776
+ const swCleaned = hasCookieValue(cookieHeader, "cap_proxy_sw_clean", cleanupToken);
949
777
  if (!swCleaned) {
950
778
  reply.header("Clear-Site-Data", '"cache", "storage"');
951
- reply.header("Set-Cookie", `cap_proxy_sw_clean=1; Path=${proxyBasePath}; Max-Age=2592000; SameSite=Lax`);
779
+ reply.header("Set-Cookie", `cap_proxy_sw_clean=${cleanupToken}; Path=${proxyBasePath}; Max-Age=2592000; SameSite=Lax`);
952
780
  }
953
781
  }
954
- const rawBody = await upstream.text();
955
782
  reply.raw.off("close", onClientClose);
956
783
  const rewritten = rewriteProxyTextBody(rawBody, upstreamContentType, proxyBasePath, extraHeadHtml);
957
784
  return reply.send(rewritten);
@@ -970,25 +797,6 @@ async function proxyProvidedCapability(req, reply) {
970
797
  return reply.status(502).send({ detail: error?.message || `Failed to proxy capability '${req.params.capability}'` });
971
798
  }
972
799
  }
973
- export async function ensureControlUiAllowedOrigin(instanceId, origin) {
974
- const normalizedOrigin = origin.trim();
975
- if (!normalizedOrigin)
976
- return false;
977
- const config = instanceManager.getStoredConfig(instanceId);
978
- if (!config)
979
- return false;
980
- const gateway = config.gateway ??= {};
981
- const controlUi = gateway.controlUi ??= {};
982
- const existing = Array.isArray(controlUi.allowedOrigins)
983
- ? controlUi.allowedOrigins.map((value) => String(value))
984
- : [];
985
- const normalized = new Set(existing.map((value) => value.trim().toLowerCase()).filter(Boolean));
986
- if (normalized.has("*") || normalized.has(normalizedOrigin.toLowerCase()))
987
- return false;
988
- controlUi.allowedOrigins = [...existing.filter((value) => value.trim()), normalizedOrigin];
989
- await instanceManager.saveConfig(instanceId, config);
990
- return true;
991
- }
992
800
  // Resolve service manager once at route registration, re-resolve on config change
993
801
  let _svc = null;
994
802
  let _svcType = "";
@@ -996,80 +804,36 @@ export async function getSvc() {
996
804
  const currentType = getServiceManagerType();
997
805
  if (_svc && _svcType === currentType)
998
806
  return _svc;
999
- _svc = currentType === "nomad"
1000
- ? await import("../services/nomad-manager.js")
1001
- : await import("../services/process-manager.js");
807
+ if (currentType !== "nomad") {
808
+ // Step 13: process-manager / host-mode legacy runtime is unsupported.
809
+ throw new Error(`service_manager='${currentType}' is no longer supported. ` +
810
+ "Only 'nomad' runtimes are accepted on the runtime path. " +
811
+ "Run `jishushell migrate legacy` to convert legacy instances.");
812
+ }
813
+ _svc = await import("../services/runtime/drivers/nomad.js");
1002
814
  _svcType = currentType;
1003
815
  return _svc;
1004
816
  }
1005
- function getInstanceBackedInstalledApp(instanceId) {
1006
- return instanceManager.getApp(instanceId);
1007
- }
1008
- function shouldUseAppManager(identity) {
1009
- if (!identity)
1010
- return false;
1011
- if (identity.driver === "app-job")
1012
- return true;
1013
- return identity.driver === "local-model" && !!getInstanceBackedInstalledApp(identity.id);
1014
- }
1015
- function shouldUseAppManagerForId(instanceId, identity) {
1016
- return shouldUseAppManager(identity) || (!identity && !!getInstanceBackedInstalledApp(instanceId));
1017
- }
1018
- function hasRuntimeIdentity(instanceId) {
1019
- return resolveRuntimeIdentity(instanceId) != null
1020
- || !!instanceManager.getInstance(instanceId)
1021
- || !!getInstanceBackedInstalledApp(instanceId);
817
+ function getLifecycleActionSource(req) {
818
+ const raw = req.headers["x-jishushell-action-source"];
819
+ const value = Array.isArray(raw) ? raw[0] : raw;
820
+ const source = typeof value === "string" ? value.trim() : "";
821
+ return /^[a-z0-9._:-]{1,80}$/i.test(source) ? source : "unknown";
1022
822
  }
1023
- // TTL 15s: outlives the frontend 10s polling interval so most requests hit cache
1024
- const statusCache = new TtlMap(15_000);
1025
- const controlUiRestartInFlight = new Map();
1026
- function getCachedStatus(svc, instanceId) {
1027
- const cached = statusCache.get(instanceId);
1028
- if (cached !== undefined)
1029
- return Promise.resolve(cached);
1030
- const identity = resolveRuntimeIdentity(instanceId);
1031
- const statusPromise = shouldUseAppManagerForId(instanceId, identity)
1032
- ? instanceManager.getAppStatus(instanceId).then((data) => ({
1033
- status: data.status,
1034
- pid: data.pid,
1035
- uptime: data.uptime,
1036
- memory_mb: data.memory_mb,
1037
- cpu_percent: data.cpu_percent,
1038
- }))
1039
- : Promise.resolve(svc.getStatus(instanceId));
1040
- return statusPromise.then((data) => {
1041
- statusCache.set(instanceId, data);
1042
- return data;
1043
- });
1044
- }
1045
- export async function restartRunningInstanceForControlUiOrigin(instanceId, origin) {
1046
- const inFlight = controlUiRestartInFlight.get(instanceId);
1047
- if (inFlight)
1048
- return inFlight;
1049
- const task = (async () => {
1050
- const svc = await getSvc();
1051
- const status = await svc.getStatus(instanceId);
1052
- if (status.status !== "running")
1053
- return;
1054
- const result = await svc.restartInstance(instanceId);
1055
- statusCache.delete(instanceId);
1056
- if (!result.ok) {
1057
- console.warn(`[gateway-launch] failed to auto-restart ${instanceId} after allowing origin ${origin}:`, result.error || "unknown error");
1058
- return;
1059
- }
1060
- console.log(`[gateway-launch] auto-restarted ${instanceId} after allowing origin ${origin}`);
1061
- })().finally(() => {
1062
- controlUiRestartInFlight.delete(instanceId);
823
+ export async function getCachedStatus(_svc, instanceId, reason) {
824
+ const snapshot = await refreshInstanceStatus(instanceId, {
825
+ reason,
826
+ force: true,
827
+ minIntervalMs: 0,
1063
828
  });
1064
- controlUiRestartInFlight.set(instanceId, task);
1065
- return task;
829
+ return snapshot?.service ?? { status: "unknown", pid: null, uptime: null, memory_mb: null, cpu_percent: null };
1066
830
  }
1067
831
  export async function instanceRoutes(app) {
1068
832
  // List
1069
833
  app.get("/api/instances", async () => {
1070
834
  const svc = await getSvc();
1071
- const instances = instanceManager.listInstances();
1072
- const statuses = await Promise.all(instances.map(inst => getCachedStatus(svc, inst.id).catch(() => ({ status: "unknown" }))));
835
+ const instances = appService.listInstances();
836
+ const statuses = await Promise.all(instances.map(inst => getCachedStatus(svc, inst.id, "api-list").catch(() => ({ status: "unknown", pid: null, uptime: null, memory_mb: null, cpu_percent: null }))));
1073
837
  return Promise.all(instances.map(async (inst, i) => ({
1074
838
  ...(await augmentInstanceMetadata(inst.id, inst)),
1075
839
  service: statuses[i],
@@ -1097,16 +861,51 @@ export async function instanceRoutes(app) {
1097
861
  return reply.status(409).send({ detail: e.message });
1098
862
  }
1099
863
  });
864
+ app.post("/api/instances/:id/clone", async (req, reply) => {
865
+ const sourceIdError = validateId(req.params.id);
866
+ if (sourceIdError)
867
+ return reply.status(400).send({ detail: sourceIdError });
868
+ const targetId = typeof req.body?.id === "string" ? req.body.id : "";
869
+ const targetIdError = validateId(targetId);
870
+ if (targetIdError)
871
+ return reply.status(400).send({ detail: targetIdError });
872
+ const name = typeof req.body?.name === "string" ? req.body.name.trim() : "";
873
+ if (!name || name.length > 256) {
874
+ return reply.status(400).send({ detail: "Name must be 1-256 characters" });
875
+ }
876
+ if (typeof req.body?.description === "string" && req.body.description.length > 2048) {
877
+ return reply.status(400).send({ detail: "Description must be at most 2048 characters" });
878
+ }
879
+ try {
880
+ const result = await cloneInstance({
881
+ sourceInstanceId: req.params.id,
882
+ targetId,
883
+ name,
884
+ description: req.body?.description,
885
+ cloneOptions: req.body?.clone_options,
886
+ });
887
+ return reply.status(201).send(result);
888
+ }
889
+ catch (error) {
890
+ if (isInstanceCloneError(error)) {
891
+ return reply.status(error.statusCode).send({
892
+ detail: error.message,
893
+ ...(error.code ? { code: error.code } : {}),
894
+ });
895
+ }
896
+ throw error;
897
+ }
898
+ });
1100
899
  // Get
1101
900
  app.get("/api/instances/:id", async (req, reply) => {
1102
901
  const idErr = validateId(req.params.id);
1103
902
  if (idErr)
1104
903
  return reply.status(400).send({ detail: idErr });
1105
904
  const svc = await getSvc();
1106
- const inst = instanceManager.getInstance(req.params.id);
905
+ const inst = appService.getInstance(req.params.id);
1107
906
  if (!inst)
1108
907
  return reply.status(404).send({ detail: "Instance not found" });
1109
- const status = await getCachedStatus(svc, req.params.id);
908
+ const status = await getCachedStatus(svc, req.params.id, "api-detail");
1110
909
  return {
1111
910
  ...(await augmentInstanceMetadata(req.params.id, inst)),
1112
911
  service: status,
@@ -1130,11 +929,11 @@ export async function instanceRoutes(app) {
1130
929
  catch (e) {
1131
930
  return reply.status(e.statusCode || 409).send({ detail: e.message });
1132
931
  }
1133
- const inst = instanceManager.updateInstance(req.params.id, req.body.name, req.body.description);
932
+ const inst = appService.updateInstance(req.params.id, req.body.name, req.body.description);
1134
933
  if (!inst)
1135
934
  return reply.status(404).send({ detail: "Instance not found" });
1136
- invalidateRuntimeIdentity(req.params.id);
1137
- return inst;
935
+ invalidateExecutionOwner(req.params.id);
936
+ return augmentInstanceMetadata(req.params.id, inst);
1138
937
  });
1139
938
  // Delete
1140
939
  app.delete("/api/instances/:id", async (req, reply) => {
@@ -1147,61 +946,35 @@ export async function instanceRoutes(app) {
1147
946
  catch (e) {
1148
947
  return reply.status(e.statusCode || 409).send({ detail: e.message });
1149
948
  }
1150
- if (getInstanceBackedInstalledApp(req.params.id)) {
1151
- const sudoPassword = typeof req.body?.sudoPassword === "string" && req.body.sudoPassword.trim()
1152
- ? req.body.sudoPassword
1153
- : undefined;
1154
- const result = instanceManager.uninstallAppTask(req.params.id, sudoPassword ? { sudoPassword } : undefined);
1155
- if (!result.ok) {
1156
- const code = result.code;
1157
- const status = code === "TASK_BUSY" ? 409 : code === "APP_NOT_FOUND" ? 404 : 400;
1158
- return reply.status(status).send({ detail: result.error, code });
1159
- }
1160
- statusCache.delete(req.params.id);
1161
- invalidateRuntimeIdentity(req.params.id);
1162
- cleanupProxyInstance(req.params.id);
949
+ const purgeBackups = req.query.purge_backups === "true";
950
+ const sudoPassword = typeof req.body?.sudoPassword === "string" && req.body.sudoPassword.trim()
951
+ ? req.body.sudoPassword
952
+ : undefined;
953
+ const result = await appLifecycle.deleteManagedInstance(req.params.id, {
954
+ purgeBackups,
955
+ ...(sudoPassword ? { exec: { sudoPassword } } : {}),
956
+ });
957
+ if (!result.ok) {
958
+ const status = result.code === "TASK_BUSY"
959
+ ? 409
960
+ : result.code === "APP_NOT_FOUND" || result.code === "INSTANCE_NOT_FOUND"
961
+ ? 404
962
+ : 400;
963
+ return reply.status(status).send({
964
+ detail: result.error,
965
+ ...(result.code ? { code: result.code } : {}),
966
+ });
967
+ }
968
+ invalidateExecutionOwner(req.params.id);
969
+ cleanupProxyInstance(req.params.id);
970
+ if (result.taskId) {
1163
971
  return reply.status(202).send({
1164
972
  ok: true,
1165
973
  taskId: result.taskId,
1166
- ...result.reused ? { reused: true } : {},
974
+ ...(result.reused ? { reused: true } : {}),
1167
975
  });
1168
976
  }
1169
- const svc = await getSvc();
1170
- let stopFailed = false;
1171
- try {
1172
- await svc.stopInstance(req.params.id, true);
1173
- }
1174
- catch {
1175
- try {
1176
- await svc.stopInstance(req.params.id);
1177
- }
1178
- catch {
1179
- stopFailed = true;
1180
- }
1181
- }
1182
- // Also stop any legacy process-manager process that might be lingering
1183
- try {
1184
- const { getLegacyStatus, stopInstance: stopLegacy } = await import("../services/process-manager.js");
1185
- if ((await getLegacyStatus(req.params.id)).status === "running") {
1186
- await stopLegacy(req.params.id);
1187
- stopFailed = false;
1188
- }
1189
- }
1190
- catch { /* ignore */ }
1191
- statusCache.delete(req.params.id);
1192
- invalidateRuntimeIdentity(req.params.id);
1193
- cleanupProxyInstance(req.params.id);
1194
- const purgeBackups = req.query.purge_backups === "true";
1195
- const result = await instanceManager.deleteInstance(req.params.id, purgeBackups);
1196
- if (!result.ok && result.warnings?.some(w => w.includes("not found"))) {
1197
- return reply.status(404).send({ detail: "Instance not found" });
1198
- }
1199
- const warnings = result.warnings ? [...result.warnings] : [];
1200
- if (stopFailed) {
1201
- console.warn(`[instances] Delete ${req.params.id}: service stop failed, orphaned processes may remain`);
1202
- warnings.push("Service stop did not complete; verify no orphaned processes remain.");
1203
- }
1204
- return { ok: result.ok, warnings: warnings.length ? warnings : undefined };
977
+ return { ok: true, warnings: result.warnings?.length ? result.warnings : undefined };
1205
978
  });
1206
979
  // Config
1207
980
  app.get("/api/instances/:id/config-meta", async (req, reply) => {
@@ -1245,15 +1018,20 @@ export async function instanceRoutes(app) {
1245
1018
  const idErr = validateId(req.params.id);
1246
1019
  if (idErr)
1247
1020
  return reply.status(400).send({ detail: idErr });
1248
- const svc = await getSvc();
1249
- const identity = resolveRuntimeIdentity(req.params.id);
1250
- if (!identity && !hasRuntimeIdentity(req.params.id)) {
1251
- return reply.status(404).send({ detail: "Instance not found" });
1021
+ let status;
1022
+ try {
1023
+ status = await appLifecycle.getManagedStatus(req.params.id);
1024
+ }
1025
+ catch (error) {
1026
+ if (appService.isCanonicalRuntimePortRequiredError(error)) {
1027
+ return reply.status(error.statusCode || 409).send({ detail: error.message, code: error.code });
1028
+ }
1029
+ throw error;
1252
1030
  }
1253
- if (shouldUseAppManagerForId(req.params.id, identity)) {
1254
- return instanceManager.getAppStatus(req.params.id);
1031
+ if (!status) {
1032
+ return reply.status(404).send({ detail: "Instance not found" });
1255
1033
  }
1256
- return svc.getStatus(req.params.id);
1034
+ return status;
1257
1035
  });
1258
1036
  app.post("/api/instances/:id/service/start", async (req, reply) => {
1259
1037
  const idErr = validateId(req.params.id);
@@ -1265,21 +1043,18 @@ export async function instanceRoutes(app) {
1265
1043
  catch (e) {
1266
1044
  return reply.status(e.statusCode || 409).send({ detail: e.message });
1267
1045
  }
1268
- const svc = await getSvc();
1269
- const identity = resolveRuntimeIdentity(req.params.id);
1270
- if (!identity && !hasRuntimeIdentity(req.params.id)) {
1271
- return reply.status(404).send({ detail: "Instance not found" });
1272
- }
1273
- const result = shouldUseAppManagerForId(req.params.id, identity)
1274
- ? await instanceManager.startApp(req.params.id)
1275
- : await svc.startInstance(req.params.id);
1276
- statusCache.delete(req.params.id);
1277
- invalidateRuntimeIdentity(req.params.id);
1046
+ const actionSource = getLifecycleActionSource(req);
1047
+ console.log(`[lifecycle] start requested for ${req.params.id} source=${actionSource}`);
1048
+ const controlUiOrigin = inferRequestOrigin(req);
1049
+ const result = controlUiOrigin
1050
+ ? await appLifecycle.startInstance(req.params.id, { controlUiOrigin })
1051
+ : await appLifecycle.startInstance(req.params.id);
1052
+ invalidateExecutionOwner(req.params.id);
1278
1053
  if (!result.ok) {
1279
1054
  const resultRecord = result;
1280
1055
  // Surface the phase tag so the UI can highlight where the start
1281
1056
  // pipeline failed (running_check / home_conflict / port_alloc /
1282
- // pre_start_hook / submit). Legacy clients that only read `detail`
1057
+ // port allocation / submit). Legacy clients that only read `detail`
1283
1058
  // keep working.
1284
1059
  const payload = { detail: result.error };
1285
1060
  if (resultRecord.phase)
@@ -1290,6 +1065,9 @@ export async function instanceRoutes(app) {
1290
1065
  payload.taskId = resultRecord.taskId;
1291
1066
  if (resultRecord.code)
1292
1067
  payload.code = resultRecord.code;
1068
+ if (resultRecord.code === "INSTANCE_NOT_FOUND") {
1069
+ return reply.status(404).send(payload);
1070
+ }
1293
1071
  // Honor the structured ConnectionError statusCode (412 / 409 / 400)
1294
1072
  // when present so the UI can distinguish missing-required from
1295
1073
  // ambiguous-prefix from invalid-binding without parsing the message.
@@ -1298,7 +1076,7 @@ export async function instanceRoutes(app) {
1298
1076
  : 400;
1299
1077
  return reply.status(statusCode).send(payload);
1300
1078
  }
1301
- await acknowledgeRuntimeRestartAdvisory(req.params.id);
1079
+ markRuntimeRepairRestartApplied(req.params.id);
1302
1080
  return result;
1303
1081
  });
1304
1082
  app.post("/api/instances/:id/service/stop", async (req, reply) => {
@@ -1311,18 +1089,14 @@ export async function instanceRoutes(app) {
1311
1089
  catch (e) {
1312
1090
  return reply.status(e.statusCode || 409).send({ detail: e.message });
1313
1091
  }
1314
- const svc = await getSvc();
1315
- const identity = resolveRuntimeIdentity(req.params.id);
1316
- if (!identity && !hasRuntimeIdentity(req.params.id)) {
1317
- return reply.status(404).send({ detail: "Instance not found" });
1092
+ const actionSource = getLifecycleActionSource(req);
1093
+ console.log(`[lifecycle] stop requested for ${req.params.id} source=${actionSource}`);
1094
+ const result = await appLifecycle.stopInstance(req.params.id);
1095
+ invalidateExecutionOwner(req.params.id);
1096
+ if (!result.ok) {
1097
+ const statusCode = result.code === "INSTANCE_NOT_FOUND" ? 404 : 400;
1098
+ return reply.status(statusCode).send({ detail: result.error, ...(result.code ? { code: result.code } : {}) });
1318
1099
  }
1319
- const result = shouldUseAppManagerForId(req.params.id, identity)
1320
- ? await instanceManager.stopApp(req.params.id)
1321
- : await svc.stopInstance(req.params.id);
1322
- statusCache.delete(req.params.id);
1323
- invalidateRuntimeIdentity(req.params.id);
1324
- if (!result.ok)
1325
- return reply.status(400).send({ detail: result.error });
1326
1100
  return result;
1327
1101
  });
1328
1102
  app.post("/api/instances/:id/service/restart", async (req, reply) => {
@@ -1335,19 +1109,21 @@ export async function instanceRoutes(app) {
1335
1109
  catch (e) {
1336
1110
  return reply.status(e.statusCode || 409).send({ detail: e.message });
1337
1111
  }
1338
- const svc = await getSvc();
1339
- const identity = resolveRuntimeIdentity(req.params.id);
1340
- if (!identity && !hasRuntimeIdentity(req.params.id)) {
1341
- return reply.status(404).send({ detail: "Instance not found" });
1112
+ const actionSource = getLifecycleActionSource(req);
1113
+ console.log(`[lifecycle] restart requested for ${req.params.id} source=${actionSource}`);
1114
+ const controlUiOrigin = inferRequestOrigin(req);
1115
+ const result = controlUiOrigin
1116
+ ? await appLifecycle.restartInstance(req.params.id, { controlUiOrigin })
1117
+ : await appLifecycle.restartInstance(req.params.id);
1118
+ invalidateExecutionOwner(req.params.id);
1119
+ if (!result.ok) {
1120
+ const statusCode = result.code === "INSTANCE_NOT_FOUND" ? 404 : 400;
1121
+ return reply.status(statusCode).send({
1122
+ detail: result.error || "Unknown error",
1123
+ ...(result.code ? { code: result.code } : {}),
1124
+ });
1342
1125
  }
1343
- const result = shouldUseAppManagerForId(req.params.id, identity)
1344
- ? await instanceManager.restartApp(req.params.id)
1345
- : await svc.restartInstance(req.params.id);
1346
- statusCache.delete(req.params.id);
1347
- invalidateRuntimeIdentity(req.params.id);
1348
- if (!result.ok)
1349
- return reply.status(400).send({ detail: result.error || "Unknown error" });
1350
- await acknowledgeRuntimeRestartAdvisory(req.params.id);
1126
+ markRuntimeRepairRestartApplied(req.params.id);
1351
1127
  return result;
1352
1128
  });
1353
1129
  // ── Pairing ──────────────────────────────────────────────────────────────
@@ -1359,7 +1135,7 @@ export async function instanceRoutes(app) {
1359
1135
  const idErr = validateId(req.params.id);
1360
1136
  if (idErr)
1361
1137
  return reply.status(400).send({ detail: idErr });
1362
- const inst = instanceManager.getInstance(req.params.id);
1138
+ const inst = appService.getInstance(req.params.id);
1363
1139
  if (!inst) {
1364
1140
  return reply.status(404).send({ detail: "Instance not found" });
1365
1141
  }
@@ -1367,10 +1143,13 @@ export async function instanceRoutes(app) {
1367
1143
  if (!capabilities.pairing.list) {
1368
1144
  return reply.status(501).send({ detail: "Pairing list is not supported for this runtime" });
1369
1145
  }
1370
- const agentType = resolveAgentType(inst);
1146
+ const integrationKind = resolvePrimaryIntegrationKind(inst);
1147
+ if (!integrationKind) {
1148
+ return reply.status(501).send({ detail: "Pairing list is not supported for this runtime" });
1149
+ }
1371
1150
  const svc = await getSvc();
1372
- // Pure adapter dispatch — no hardcoded kind fallback.
1373
- const cmd = await getAdapter(agentType).buildPairingListCommand(req.params.id);
1151
+ // Pure integration dispatch — no hardcoded kind fallback.
1152
+ const cmd = await getIntegration(integrationKind).buildPairingListCommand(req.params.id);
1374
1153
  const result = await svc.exec(req.params.id, cmd, 15_000);
1375
1154
  return { output: result.stdout + result.stderr, exitCode: result.exitCode };
1376
1155
  });
@@ -1378,7 +1157,7 @@ export async function instanceRoutes(app) {
1378
1157
  const idErr = validateId(req.params.id);
1379
1158
  if (idErr)
1380
1159
  return reply.status(400).send({ detail: idErr });
1381
- const inst = instanceManager.getInstance(req.params.id);
1160
+ const inst = appService.getInstance(req.params.id);
1382
1161
  if (!inst) {
1383
1162
  return reply.status(404).send({ detail: "Instance not found" });
1384
1163
  }
@@ -1393,8 +1172,11 @@ export async function instanceRoutes(app) {
1393
1172
  if (!code || !PAIRING_CODE_RE.test(code)) {
1394
1173
  return reply.status(400).send({ detail: "Invalid pairing code: must be 4-16 uppercase alphanumeric characters" });
1395
1174
  }
1396
- const agentType = resolveAgentType(inst);
1397
- const cmd = await getAdapter(agentType).buildPairingApproveCommand(req.params.id, {
1175
+ const integrationKind = resolvePrimaryIntegrationKind(inst);
1176
+ if (!integrationKind) {
1177
+ return reply.status(501).send({ detail: "Pairing approve is not supported for this runtime" });
1178
+ }
1179
+ const cmd = await getIntegration(integrationKind).buildPairingApproveCommand(req.params.id, {
1398
1180
  channel,
1399
1181
  code,
1400
1182
  notify,
@@ -1406,11 +1188,11 @@ export async function instanceRoutes(app) {
1406
1188
  }
1407
1189
  return { ok: true, output: (result.stdout + result.stderr).trim() };
1408
1190
  });
1409
- // Agent chat (inline chat panel for runtimes that expose an OpenAI-compat
1191
+ // Integration chat (inline chat panel for runtimes that expose an OpenAI-compat
1410
1192
  // HTTP chat completion endpoint and declare chatPanel="inline" in their
1411
1193
  // capability profile — currently only Hermes).
1412
1194
  //
1413
- // Flow: panel JWT auth → read per-instance API_SERVER_KEY from agent-home/.env →
1195
+ // Flow: panel JWT auth → read per-instance API_SERVER_KEY from integration-home/.env →
1414
1196
  // read allocated host port from runtime.ports → POST forward to
1415
1197
  // http://127.0.0.1:<port>/v1/chat/completions.
1416
1198
  //
@@ -1431,46 +1213,57 @@ export async function instanceRoutes(app) {
1431
1213
  const idErr = validateId(req.params.id);
1432
1214
  if (idErr)
1433
1215
  return reply.status(400).send({ detail: idErr });
1434
- const rawInst = instanceManager.getInstance(req.params.id);
1216
+ const rawInst = appService.getInstance(req.params.id);
1435
1217
  if (!rawInst)
1436
1218
  return reply.status(404).send({ detail: "Instance not found" });
1437
- // getInstance returns raw instance.json without `capabilities` (that's
1438
- // runtime-synthesized per §32.4). Use augmentInstanceMetadata so we
1439
- // read the adapter's live defaultCapabilities.
1219
+ // getInstance returns raw instance.json without `capabilities` (those are
1220
+ // synthesized by the integration layer). Use augmentInstanceMetadata so we
1221
+ // read the integration's live defaultCapabilities.
1440
1222
  const inst = await augmentInstanceMetadata(req.params.id, rawInst);
1223
+ const integrationKind = resolvePrimaryIntegrationKind(inst);
1441
1224
  // Only runtimes declaring chatPanel="inline" are supported here
1442
- const chatPanel = inst?.capabilities?.gateway?.chatPanel;
1225
+ const chatPanel = inst?.capabilities?.ui?.chatPanel;
1443
1226
  if (chatPanel !== "inline") {
1444
1227
  return reply.status(400).send({
1445
- detail: `Runtime "${inst.agentType}" does not support inline chat (chatPanel=${chatPanel})`,
1228
+ detail: `Runtime "${integrationKind ?? "generic"}" does not support inline chat (chatPanel=${chatPanel})`,
1446
1229
  });
1447
1230
  }
1448
- // Adapter-owned dispatch: the route no longer hardcodes Hermes's env
1449
- // var name or endpoint path. Any adapter that declares chatPanel
1231
+ // Integration-owned dispatch: the route no longer hardcodes Hermes's env
1232
+ // var name or endpoint path. Any integration that declares chatPanel
1450
1233
  // "inline" MUST also supply `inlineChatDescriptor` (api key env var +
1451
1234
  // optional path/header/timeout) so this forwarder can reach its agent.
1452
- const agentType = resolveAgentType(inst);
1453
- const adapter = getAdapter(agentType);
1454
- const desc = adapter.inlineChatDescriptor;
1235
+ if (!integrationKind) {
1236
+ return reply.status(500).send({
1237
+ detail: `Instance "${req.params.id}" has no integration identity but declared chatPanel=inline`,
1238
+ });
1239
+ }
1240
+ const integration = getIntegration(integrationKind);
1241
+ const desc = integration.inlineChatDescriptor;
1455
1242
  if (!desc) {
1456
1243
  return reply.status(500).send({
1457
- detail: `Runtime "${agentType}" declares chatPanel=inline but no inlineChatDescriptor`,
1244
+ detail: `Runtime "${integrationKind}" declares chatPanel=inline but no inlineChatDescriptor`,
1458
1245
  });
1459
1246
  }
1460
1247
  // Resolve host port from the persisted RuntimeSpec.ports[] allocation.
1461
- const ports = Array.isArray(inst?.runtime?.ports) ? inst.runtime.ports : [];
1462
- const gw = ports.find((p) => p?.name === "gateway") || ports[0];
1463
- const hostPort = Number(gw?.hostPort) || 0;
1464
- if (!hostPort) {
1465
- return reply.status(500).send({ detail: "Gateway host port not allocated" });
1248
+ let hostPort = 0;
1249
+ let gwHost = "127.0.0.1";
1250
+ try {
1251
+ hostPort = appService.getPrimaryHostPort(req.params.id);
1252
+ gwHost = await appService.getPrimaryHostForInstance(req.params.id);
1253
+ }
1254
+ catch (error) {
1255
+ if (appService.isCanonicalRuntimePortRequiredError(error)) {
1256
+ return reply.status(error.statusCode || 409).send({ detail: error.message, code: error.code });
1257
+ }
1258
+ throw error;
1466
1259
  }
1467
- // Agent API key lives in the adapter-managed secretEnv file. Adapter
1260
+ // Agent API key lives in the integration-managed secretEnv file. Integration
1468
1261
  // declares which env var holds it (Hermes → API_SERVER_KEY).
1469
1262
  const secretEnv = inst?.paths?.secretEnv;
1470
1263
  if (!secretEnv) {
1471
1264
  return reply.status(500).send({ detail: "Instance has no secretEnv path" });
1472
1265
  }
1473
- const envVars = instanceManager.parseEnvFile(secretEnv);
1266
+ const envVars = appService.parseEnvFile(secretEnv);
1474
1267
  const apiKey = envVars[desc.apiKeyEnvVar] || "";
1475
1268
  if (!apiKey) {
1476
1269
  return reply.status(500).send({
@@ -1481,7 +1274,7 @@ export async function instanceRoutes(app) {
1481
1274
  const authHeader = desc.authHeader ?? "Authorization";
1482
1275
  const authScheme = desc.authScheme ?? "Bearer ";
1483
1276
  // Upstream budget: the Hermes call itself still gets a hard ceiling so
1484
- // a wedged container can't hold the connection forever. Adapter can
1277
+ // a wedged container can't hold the connection forever. Integration can
1485
1278
  // extend this via inlineChatDescriptor.timeoutMs; default is 30 min
1486
1279
  // which comfortably covers multi-step tool loops.
1487
1280
  const upstreamTimeoutMs = desc.timeoutMs ?? 30 * 60_000;
@@ -1490,8 +1283,7 @@ export async function instanceRoutes(app) {
1490
1283
  // on modern Linux (Debian 12, Ubuntu 22.04+) that's frequently `::1`
1491
1284
  // rather than `127.0.0.1` — so a hardcoded IPv4 fetch() returns
1492
1285
  // ECONNREFUSED and the user sees "Failed to reach agent".
1493
- const gwHost = await instanceManager.getGatewayHost(req.params.id);
1494
- const target = `http://${instanceManager.urlHost(gwHost)}:${hostPort}${endpointPath}`;
1286
+ const target = `http://${appService.urlHost(gwHost)}:${hostPort}${endpointPath}`;
1495
1287
  // Hijack the response so we own the raw socket — lets us flush SSE
1496
1288
  // headers + heartbeats before the upstream fetch resolves.
1497
1289
  reply.hijack();
@@ -1557,7 +1349,7 @@ export async function instanceRoutes(app) {
1557
1349
  const idErr = validateId(req.params.id);
1558
1350
  if (idErr)
1559
1351
  return reply.status(400).send({ detail: idErr });
1560
- if (!instanceManager.getInstance(req.params.id) && !getInstanceBackedInstalledApp(req.params.id)) {
1352
+ if (!appService.getInstance(req.params.id)) {
1561
1353
  return reply.status(404).send({ detail: "Instance not found" });
1562
1354
  }
1563
1355
  try {
@@ -1657,20 +1449,16 @@ export async function instanceRoutes(app) {
1657
1449
  const idErr = validateId(req.params.id);
1658
1450
  if (idErr)
1659
1451
  return reply.status(400).send({ detail: idErr });
1660
- const svc = await getSvc();
1661
- const identity = resolveRuntimeIdentity(req.params.id);
1662
- if (!identity && !hasRuntimeIdentity(req.params.id)) {
1663
- return reply.status(404).send({ detail: "Instance not found" });
1664
- }
1665
1452
  const logType = req.query.log_type || "stderr";
1666
1453
  if (logType !== "stdout" && logType !== "stderr") {
1667
1454
  return reply.status(400).send({ detail: "log_type must be stdout or stderr" });
1668
1455
  }
1669
1456
  const MAX_LOG_LINES = 5000;
1670
1457
  const lines = Math.min(parseInt(req.query.lines || "100", 10) || 100, MAX_LOG_LINES);
1671
- const logLines = shouldUseAppManagerForId(req.params.id, identity)
1672
- ? await instanceManager.getAppLogs(req.params.id, "", lines, logType)
1673
- : await svc.getLogs(req.params.id, lines, logType);
1458
+ const logLines = await appLifecycle.getManagedLogs(req.params.id, lines, logType);
1459
+ if (!logLines) {
1460
+ return reply.status(404).send({ detail: "Instance not found" });
1461
+ }
1674
1462
  return { lines: logLines };
1675
1463
  });
1676
1464
  // Admin: re-encrypt all instance secrets with current AES key
@@ -1678,12 +1466,12 @@ export async function instanceRoutes(app) {
1678
1466
  const { getAesKey, getJwtSecret } = await import("../config.js");
1679
1467
  const { scryptSync, createDecipheriv, createCipheriv, randomBytes } = await import("crypto");
1680
1468
  const { readFileSync, existsSync: fsExistsSync } = await import("fs");
1681
- const instances = instanceManager.listInstances();
1469
+ const instances = appService.listInstances();
1682
1470
  const results = [];
1683
1471
  const currentKey = getAesKey();
1684
1472
  const legacyKey = scryptSync(getJwtSecret(), "jishushell-apikey-v1", 32);
1685
1473
  for (const inst of instances) {
1686
- const envFiles = instanceManager.getRuntimeEnvFiles(inst.id);
1474
+ const envFiles = appService.getRuntimeEnvFiles(inst.id);
1687
1475
  const providerEnvFile = envFiles[0]?.replace(/model\.env$/, "provider.env");
1688
1476
  if (!providerEnvFile || !fsExistsSync(providerEnvFile)) {
1689
1477
  results.push({ id: inst.id, status: "skipped", error: "no provider.env" });
@@ -1750,7 +1538,7 @@ export async function instanceRoutes(app) {
1750
1538
  });
1751
1539
  // ── Docker image check & pull ───────────────────────────────────────────
1752
1540
  // Generic Docker operations used by NewInstance UI to verify / pull runtime
1753
- // images before creating an instance. Framework-level (not adapter-scoped)
1541
+ // images before creating an instance. Framework-level (not integration-scoped)
1754
1542
  // because every container runtime shares the same docker CLI here.
1755
1543
  app.get("/api/docker/image-check", async (req, reply) => {
1756
1544
  const image = req.query.image;
@@ -1795,7 +1583,7 @@ export async function instanceRoutes(app) {
1795
1583
  return reply.status(500).send({ detail: `Failed to pull image: ${e.message}` });
1796
1584
  }
1797
1585
  });
1798
- // ── Connections REST API (PR 4 of app-interconnect-design) ──────────────
1586
+ // ── Connections REST API ────────────────────────────────────────────────
1799
1587
  /** GET /api/instances/:id/connections — view spec.requires + bindings. */
1800
1588
  app.get("/api/instances/:id/connections", async (req, reply) => {
1801
1589
  try {
@@ -1846,11 +1634,11 @@ export async function instanceRoutes(app) {
1846
1634
  });
1847
1635
  // ── Suggestions API (PR 6) ─────────────────────────────────────────────
1848
1636
  app.get("/api/suggestions", async () => {
1849
- const { computeSuggestions } = await import("../services/suggestions.js");
1637
+ const { computeSuggestions } = await import("../services/connections/suggestions.js");
1850
1638
  return { suggestions: computeSuggestions() };
1851
1639
  });
1852
1640
  app.post("/api/suggestions/:id/apply", async (req, reply) => {
1853
- const { computeSuggestions } = await import("../services/suggestions.js");
1641
+ const { computeSuggestions } = await import("../services/connections/suggestions.js");
1854
1642
  const all = computeSuggestions();
1855
1643
  const target = all.find((s) => s.id === req.params.id);
1856
1644
  if (!target) {
@@ -1859,26 +1647,22 @@ export async function instanceRoutes(app) {
1859
1647
  // Apply by issuing the equivalent PUT /connections — read current
1860
1648
  // bindings, splice in the new one for `slot`, persist via the
1861
1649
  // transactor.
1862
- const meta = instanceManager.getInstance(target.consumerInstanceId);
1650
+ const meta = appService.getInstance(target.consumerInstanceId);
1863
1651
  if (!meta)
1864
1652
  return reply.status(404).send({ detail: "Consumer instance not found" });
1865
- // Resolve consumer spec app-installed instances have it in the app
1866
- // registry; legacy instances (no app_id) fall back to the
1867
- // yaml-template synthesizer used everywhere else for legacy
1868
- // capability work.
1869
- let consumerSpec = null;
1870
- if (target.appId) {
1871
- const appData = instanceManager.getApp(target.appId);
1872
- if (!appData)
1873
- return reply.status(404).send({ detail: "App spec not found" });
1874
- consumerSpec = appData.spec;
1875
- }
1876
- else {
1877
- const { loadCapabilitySpecForLegacyInstance } = await import("../services/runtime/migrations.js");
1878
- consumerSpec = loadCapabilitySpecForLegacyInstance(meta);
1879
- if (!consumerSpec) {
1880
- return reply.status(404).send({ detail: "No capability spec for legacy instance" });
1881
- }
1653
+ // Resolve consumer spec from canonical sources only. The suggestion
1654
+ // target is an instance id; AppSpec id is only the template identity.
1655
+ const appData = appService.getInstanceInstallRecord(target.consumerInstanceId);
1656
+ let consumerSpec = appData?.spec ?? null;
1657
+ if (!consumerSpec) {
1658
+ const { readCanonicalSpecForInstance } = await import("../services/app-common/instance-store.js");
1659
+ consumerSpec = readCanonicalSpecForInstance(target.consumerInstanceId);
1660
+ }
1661
+ if (!consumerSpec) {
1662
+ return reply.status(409).send({
1663
+ detail: "Instance has no canonical AppSpec; run `jishushell migrate legacy --yes` first",
1664
+ code: "INSTANCE_NEEDS_MIGRATION",
1665
+ });
1882
1666
  }
1883
1667
  const newConnections = {
1884
1668
  ...(meta.connections ?? {}),
@@ -1888,11 +1672,11 @@ export async function instanceRoutes(app) {
1888
1672
  capability: target.candidate.capability,
1889
1673
  },
1890
1674
  };
1891
- const { applyConnections } = await import("../services/connection-transactor.js");
1675
+ const { applyConnections } = await import("../services/connections/transactor.js");
1892
1676
  const safeJson = await import("../utils/safe-json.js");
1893
1677
  const fs = await import("fs");
1894
1678
  const path = await import("path");
1895
- const instancePath = instanceManager.instanceMetaPath(target.consumerInstanceId);
1679
+ const instancePath = appService.instanceMetaPath(target.consumerInstanceId);
1896
1680
  const readInstanceJson = async () => (safeJson.safeReadJson(instancePath, `instance:${target.consumerInstanceId}`) ?? {});
1897
1681
  const saveInstanceJson = async (_id, mutator) => {
1898
1682
  const cur = (safeJson.safeReadJson(instancePath, `instance:${target.consumerInstanceId}`) ?? {});
@@ -1904,17 +1688,22 @@ export async function instanceRoutes(app) {
1904
1688
  }
1905
1689
  safeJson.safeWriteJson(instancePath, mutator(cur));
1906
1690
  };
1907
- let adapter = null;
1908
- try {
1909
- const agentType = resolveAgentType(meta);
1910
- if (hasAdapter(agentType)) {
1911
- adapter = getAdapter(agentType);
1912
- if (typeof adapter.applyConnectionEnv !== "function")
1913
- adapter = null;
1691
+ let integration = null;
1692
+ const hasIntegrationMetadata = Array.isArray(meta.integrations)
1693
+ && meta.integrations.length > 0;
1694
+ if (hasIntegrationMetadata) {
1695
+ const integrationKind = resolvePrimaryIntegrationKind(meta);
1696
+ if (!integrationKind || !hasIntegration(integrationKind)) {
1697
+ return reply.status(409).send({
1698
+ detail: "Instance is missing canonical integration identity; run migration or repair first",
1699
+ code: "INSTANCE_NEEDS_MIGRATION",
1700
+ });
1914
1701
  }
1915
- }
1916
- catch {
1917
- adapter = null;
1702
+ const resolvedIntegration = getIntegration(integrationKind);
1703
+ integration =
1704
+ typeof resolvedIntegration.applyConnectionEnv === "function"
1705
+ ? resolvedIntegration
1706
+ : null;
1918
1707
  }
1919
1708
  try {
1920
1709
  const result = await applyConnections({
@@ -1923,7 +1712,7 @@ export async function instanceRoutes(app) {
1923
1712
  newConnections,
1924
1713
  saveInstanceJson,
1925
1714
  readInstanceJson,
1926
- adapter,
1715
+ integration,
1927
1716
  });
1928
1717
  return { ok: true, applied: target.id, resolved: result.resolved.length };
1929
1718
  }
@@ -1935,7 +1724,7 @@ export async function instanceRoutes(app) {
1935
1724
  }
1936
1725
  });
1937
1726
  app.post("/api/suggestions/:id/dismiss", async (req, reply) => {
1938
- const { dismissSuggestion } = await import("../services/suggestions.js");
1727
+ const { dismissSuggestion } = await import("../services/connections/suggestions.js");
1939
1728
  try {
1940
1729
  await dismissSuggestion(req.params.id);
1941
1730
  return { ok: true };
@@ -1944,12 +1733,5 @@ export async function instanceRoutes(app) {
1944
1733
  return reply.status(400).send({ detail: e?.message ?? "Invalid suggestion id" });
1945
1734
  }
1946
1735
  });
1947
- try {
1948
- const { registerOpenclawRoutes } = await import("./openclaw-routes.js");
1949
- registerOpenclawRoutes(app);
1950
- }
1951
- catch (err) {
1952
- console.error("[instances] openclaw route registration failed:", err);
1953
- }
1954
1736
  }
1955
1737
  //# sourceMappingURL=instances.js.map