ysk-server-core 1.0.0

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 (1526) hide show
  1. package/README.md +16 -0
  2. package/dist/agents/comms.d.ts +33 -0
  3. package/dist/agents/comms.d.ts.map +1 -0
  4. package/dist/agents/comms.js +67 -0
  5. package/dist/agents/comms.js.map +1 -0
  6. package/dist/agents/fleet.d.ts +60 -0
  7. package/dist/agents/fleet.d.ts.map +1 -0
  8. package/dist/agents/fleet.js +260 -0
  9. package/dist/agents/fleet.js.map +1 -0
  10. package/dist/agents/index.d.ts +7 -0
  11. package/dist/agents/index.d.ts.map +1 -0
  12. package/dist/agents/index.js +7 -0
  13. package/dist/agents/index.js.map +1 -0
  14. package/dist/agents/install.d.ts +34 -0
  15. package/dist/agents/install.d.ts.map +1 -0
  16. package/dist/agents/install.js +154 -0
  17. package/dist/agents/install.js.map +1 -0
  18. package/dist/agents/outbound-agent.d.ts +40 -0
  19. package/dist/agents/outbound-agent.d.ts.map +1 -0
  20. package/dist/agents/outbound-agent.js +135 -0
  21. package/dist/agents/outbound-agent.js.map +1 -0
  22. package/dist/agents/probe.d.ts +44 -0
  23. package/dist/agents/probe.d.ts.map +1 -0
  24. package/dist/agents/probe.js +129 -0
  25. package/dist/agents/probe.js.map +1 -0
  26. package/dist/agents/runtime.d.ts +25 -0
  27. package/dist/agents/runtime.d.ts.map +1 -0
  28. package/dist/agents/runtime.js +82 -0
  29. package/dist/agents/runtime.js.map +1 -0
  30. package/dist/config/schema.d.ts +58 -0
  31. package/dist/config/schema.d.ts.map +1 -0
  32. package/dist/config/schema.js +112 -0
  33. package/dist/config/schema.js.map +1 -0
  34. package/dist/db/database.d.ts +24 -0
  35. package/dist/db/database.d.ts.map +1 -0
  36. package/dist/db/database.js +31 -0
  37. package/dist/db/database.js.map +1 -0
  38. package/dist/db/document-store.d.ts +66 -0
  39. package/dist/db/document-store.d.ts.map +1 -0
  40. package/dist/db/document-store.js +363 -0
  41. package/dist/db/document-store.js.map +1 -0
  42. package/dist/db/index.d.ts +4 -0
  43. package/dist/db/index.d.ts.map +1 -0
  44. package/dist/db/index.js +4 -0
  45. package/dist/db/index.js.map +1 -0
  46. package/dist/db/schema.d.ts +8 -0
  47. package/dist/db/schema.d.ts.map +1 -0
  48. package/dist/db/schema.js +124 -0
  49. package/dist/db/schema.js.map +1 -0
  50. package/dist/db/store.d.ts +257 -0
  51. package/dist/db/store.d.ts.map +1 -0
  52. package/dist/db/store.js +100 -0
  53. package/dist/db/store.js.map +1 -0
  54. package/dist/email/autodiscover.d.ts +17 -0
  55. package/dist/email/autodiscover.d.ts.map +1 -0
  56. package/dist/email/autodiscover.js +70 -0
  57. package/dist/email/autodiscover.js.map +1 -0
  58. package/dist/email/deliverability.d.ts +55 -0
  59. package/dist/email/deliverability.d.ts.map +1 -0
  60. package/dist/email/deliverability.js +135 -0
  61. package/dist/email/deliverability.js.map +1 -0
  62. package/dist/email/dns-records.d.ts +70 -0
  63. package/dist/email/dns-records.d.ts.map +1 -0
  64. package/dist/email/dns-records.js +249 -0
  65. package/dist/email/dns-records.js.map +1 -0
  66. package/dist/email/dnsbl.d.ts +45 -0
  67. package/dist/email/dnsbl.d.ts.map +1 -0
  68. package/dist/email/dnsbl.js +127 -0
  69. package/dist/email/dnsbl.js.map +1 -0
  70. package/dist/email/domain-flags-apply.d.ts +78 -0
  71. package/dist/email/domain-flags-apply.d.ts.map +1 -0
  72. package/dist/email/domain-flags-apply.js +304 -0
  73. package/dist/email/domain-flags-apply.js.map +1 -0
  74. package/dist/email/dovecot-passdb.d.ts +59 -0
  75. package/dist/email/dovecot-passdb.d.ts.map +1 -0
  76. package/dist/email/dovecot-passdb.js +220 -0
  77. package/dist/email/dovecot-passdb.js.map +1 -0
  78. package/dist/email/email-bootstrap.d.ts +69 -0
  79. package/dist/email/email-bootstrap.d.ts.map +1 -0
  80. package/dist/email/email-bootstrap.js +294 -0
  81. package/dist/email/email-bootstrap.js.map +1 -0
  82. package/dist/email/index.d.ts +22 -0
  83. package/dist/email/index.d.ts.map +1 -0
  84. package/dist/email/index.js +22 -0
  85. package/dist/email/index.js.map +1 -0
  86. package/dist/email/live-checks.d.ts +52 -0
  87. package/dist/email/live-checks.d.ts.map +1 -0
  88. package/dist/email/live-checks.js +124 -0
  89. package/dist/email/live-checks.js.map +1 -0
  90. package/dist/email/mail-policy.d.ts +24 -0
  91. package/dist/email/mail-policy.d.ts.map +1 -0
  92. package/dist/email/mail-policy.js +318 -0
  93. package/dist/email/mail-policy.js.map +1 -0
  94. package/dist/email/mail-queue.d.ts +23 -0
  95. package/dist/email/mail-queue.d.ts.map +1 -0
  96. package/dist/email/mail-queue.js +188 -0
  97. package/dist/email/mail-queue.js.map +1 -0
  98. package/dist/email/mail-tls-apply.d.ts +31 -0
  99. package/dist/email/mail-tls-apply.d.ts.map +1 -0
  100. package/dist/email/mail-tls-apply.js +134 -0
  101. package/dist/email/mail-tls-apply.js.map +1 -0
  102. package/dist/email/password-hash.d.ts +16 -0
  103. package/dist/email/password-hash.d.ts.map +1 -0
  104. package/dist/email/password-hash.js +56 -0
  105. package/dist/email/password-hash.js.map +1 -0
  106. package/dist/email/relay.d.ts +45 -0
  107. package/dist/email/relay.d.ts.map +1 -0
  108. package/dist/email/relay.js +122 -0
  109. package/dist/email/relay.js.map +1 -0
  110. package/dist/email/roundcube-sso-plugin.d.ts +44 -0
  111. package/dist/email/roundcube-sso-plugin.d.ts.map +1 -0
  112. package/dist/email/roundcube-sso-plugin.js +278 -0
  113. package/dist/email/roundcube-sso-plugin.js.map +1 -0
  114. package/dist/email/sender-rate-policy.d.ts +24 -0
  115. package/dist/email/sender-rate-policy.d.ts.map +1 -0
  116. package/dist/email/sender-rate-policy.js +245 -0
  117. package/dist/email/sender-rate-policy.js.map +1 -0
  118. package/dist/email/service.d.ts +211 -0
  119. package/dist/email/service.d.ts.map +1 -0
  120. package/dist/email/service.js +1017 -0
  121. package/dist/email/service.js.map +1 -0
  122. package/dist/email/sieve.d.ts +32 -0
  123. package/dist/email/sieve.d.ts.map +1 -0
  124. package/dist/email/sieve.js +80 -0
  125. package/dist/email/sieve.js.map +1 -0
  126. package/dist/email/warmup.d.ts +26 -0
  127. package/dist/email/warmup.d.ts.map +1 -0
  128. package/dist/email/warmup.js +59 -0
  129. package/dist/email/warmup.js.map +1 -0
  130. package/dist/email/webmail-apply.d.ts +40 -0
  131. package/dist/email/webmail-apply.d.ts.map +1 -0
  132. package/dist/email/webmail-apply.js +191 -0
  133. package/dist/email/webmail-apply.js.map +1 -0
  134. package/dist/email/webmail-project.d.ts +194 -0
  135. package/dist/email/webmail-project.d.ts.map +1 -0
  136. package/dist/email/webmail-project.js +1365 -0
  137. package/dist/email/webmail-project.js.map +1 -0
  138. package/dist/email/webmail-sso.d.ts +40 -0
  139. package/dist/email/webmail-sso.d.ts.map +1 -0
  140. package/dist/email/webmail-sso.js +87 -0
  141. package/dist/email/webmail-sso.js.map +1 -0
  142. package/dist/errors/index.d.ts +2 -0
  143. package/dist/errors/index.d.ts.map +1 -0
  144. package/dist/errors/index.js +2 -0
  145. package/dist/errors/index.js.map +1 -0
  146. package/dist/files/index.d.ts +5 -0
  147. package/dist/files/index.d.ts.map +1 -0
  148. package/dist/files/index.js +5 -0
  149. package/dist/files/index.js.map +1 -0
  150. package/dist/files/manager.d.ts +172 -0
  151. package/dist/files/manager.d.ts.map +1 -0
  152. package/dist/files/manager.js +525 -0
  153. package/dist/files/manager.js.map +1 -0
  154. package/dist/files/shares.d.ts +36 -0
  155. package/dist/files/shares.d.ts.map +1 -0
  156. package/dist/files/shares.js +136 -0
  157. package/dist/files/shares.js.map +1 -0
  158. package/dist/files/versions.d.ts +16 -0
  159. package/dist/files/versions.d.ts.map +1 -0
  160. package/dist/files/versions.js +90 -0
  161. package/dist/files/versions.js.map +1 -0
  162. package/dist/files/webdav.d.ts +42 -0
  163. package/dist/files/webdav.d.ts.map +1 -0
  164. package/dist/files/webdav.js +116 -0
  165. package/dist/files/webdav.js.map +1 -0
  166. package/dist/host/executor.d.ts +93 -0
  167. package/dist/host/executor.d.ts.map +1 -0
  168. package/dist/host/executor.js +764 -0
  169. package/dist/host/executor.js.map +1 -0
  170. package/dist/host/health.d.ts +29 -0
  171. package/dist/host/health.d.ts.map +1 -0
  172. package/dist/host/health.js +132 -0
  173. package/dist/host/health.js.map +1 -0
  174. package/dist/host/host-job.d.ts +27 -0
  175. package/dist/host/host-job.d.ts.map +1 -0
  176. package/dist/host/host-job.js +38 -0
  177. package/dist/host/host-job.js.map +1 -0
  178. package/dist/host/host-overview.d.ts +54 -0
  179. package/dist/host/host-overview.d.ts.map +1 -0
  180. package/dist/host/host-overview.js +459 -0
  181. package/dist/host/host-overview.js.map +1 -0
  182. package/dist/host/host-power.d.ts +27 -0
  183. package/dist/host/host-power.d.ts.map +1 -0
  184. package/dist/host/host-power.js +99 -0
  185. package/dist/host/host-power.js.map +1 -0
  186. package/dist/host/index.d.ts +7 -0
  187. package/dist/host/index.d.ts.map +1 -0
  188. package/dist/host/index.js +7 -0
  189. package/dist/host/index.js.map +1 -0
  190. package/dist/host/timezones.d.ts +19 -0
  191. package/dist/host/timezones.d.ts.map +1 -0
  192. package/dist/host/timezones.js +64 -0
  193. package/dist/host/timezones.js.map +1 -0
  194. package/dist/host-browse/audio-bridge.d.ts +20 -0
  195. package/dist/host-browse/audio-bridge.d.ts.map +1 -0
  196. package/dist/host-browse/audio-bridge.js +96 -0
  197. package/dist/host-browse/audio-bridge.js.map +1 -0
  198. package/dist/host-browse/bookmarks.d.ts +44 -0
  199. package/dist/host-browse/bookmarks.d.ts.map +1 -0
  200. package/dist/host-browse/bookmarks.js +54 -0
  201. package/dist/host-browse/bookmarks.js.map +1 -0
  202. package/dist/host-browse/browser-engine.d.ts +167 -0
  203. package/dist/host-browse/browser-engine.d.ts.map +1 -0
  204. package/dist/host-browse/browser-engine.js +777 -0
  205. package/dist/host-browse/browser-engine.js.map +1 -0
  206. package/dist/host-browse/chrome-as-user.d.ts +34 -0
  207. package/dist/host-browse/chrome-as-user.d.ts.map +1 -0
  208. package/dist/host-browse/chrome-as-user.js +131 -0
  209. package/dist/host-browse/chrome-as-user.js.map +1 -0
  210. package/dist/host-browse/chrome-probe.d.ts +11 -0
  211. package/dist/host-browse/chrome-probe.d.ts.map +1 -0
  212. package/dist/host-browse/chrome-probe.js +62 -0
  213. package/dist/host-browse/chrome-probe.js.map +1 -0
  214. package/dist/host-browse/cookie-jar.d.ts +25 -0
  215. package/dist/host-browse/cookie-jar.d.ts.map +1 -0
  216. package/dist/host-browse/cookie-jar.js +126 -0
  217. package/dist/host-browse/cookie-jar.js.map +1 -0
  218. package/dist/host-browse/danger.d.ts +20 -0
  219. package/dist/host-browse/danger.d.ts.map +1 -0
  220. package/dist/host-browse/danger.js +84 -0
  221. package/dist/host-browse/danger.js.map +1 -0
  222. package/dist/host-browse/downloads.d.ts +31 -0
  223. package/dist/host-browse/downloads.d.ts.map +1 -0
  224. package/dist/host-browse/downloads.js +61 -0
  225. package/dist/host-browse/downloads.js.map +1 -0
  226. package/dist/host-browse/ephemeral-user.d.ts +39 -0
  227. package/dist/host-browse/ephemeral-user.d.ts.map +1 -0
  228. package/dist/host-browse/ephemeral-user.js +100 -0
  229. package/dist/host-browse/ephemeral-user.js.map +1 -0
  230. package/dist/host-browse/headers.d.ts +18 -0
  231. package/dist/host-browse/headers.d.ts.map +1 -0
  232. package/dist/host-browse/headers.js +93 -0
  233. package/dist/host-browse/headers.js.map +1 -0
  234. package/dist/host-browse/index.d.ts +18 -0
  235. package/dist/host-browse/index.d.ts.map +1 -0
  236. package/dist/host-browse/index.js +18 -0
  237. package/dist/host-browse/index.js.map +1 -0
  238. package/dist/host-browse/live-ticket.d.ts +19 -0
  239. package/dist/host-browse/live-ticket.d.ts.map +1 -0
  240. package/dist/host-browse/live-ticket.js +39 -0
  241. package/dist/host-browse/live-ticket.js.map +1 -0
  242. package/dist/host-browse/rewrite-html.d.ts +22 -0
  243. package/dist/host-browse/rewrite-html.d.ts.map +1 -0
  244. package/dist/host-browse/rewrite-html.js +134 -0
  245. package/dist/host-browse/rewrite-html.js.map +1 -0
  246. package/dist/host-browse/service.d.ts +122 -0
  247. package/dist/host-browse/service.d.ts.map +1 -0
  248. package/dist/host-browse/service.js +934 -0
  249. package/dist/host-browse/service.js.map +1 -0
  250. package/dist/host-browse/session-store.d.ts +57 -0
  251. package/dist/host-browse/session-store.d.ts.map +1 -0
  252. package/dist/host-browse/session-store.js +182 -0
  253. package/dist/host-browse/session-store.js.map +1 -0
  254. package/dist/host-browse/ssrf.d.ts +27 -0
  255. package/dist/host-browse/ssrf.d.ts.map +1 -0
  256. package/dist/host-browse/ssrf.js +191 -0
  257. package/dist/host-browse/ssrf.js.map +1 -0
  258. package/dist/host-browse/stream-presets.d.ts +33 -0
  259. package/dist/host-browse/stream-presets.d.ts.map +1 -0
  260. package/dist/host-browse/stream-presets.js +84 -0
  261. package/dist/host-browse/stream-presets.js.map +1 -0
  262. package/dist/host-browse/types.d.ts +151 -0
  263. package/dist/host-browse/types.d.ts.map +1 -0
  264. package/dist/host-browse/types.js +42 -0
  265. package/dist/host-browse/types.js.map +1 -0
  266. package/dist/hosting/adminer.d.ts +21 -0
  267. package/dist/hosting/adminer.d.ts.map +1 -0
  268. package/dist/hosting/adminer.js +183 -0
  269. package/dist/hosting/adminer.js.map +1 -0
  270. package/dist/hosting/apache/artifacts.d.ts +57 -0
  271. package/dist/hosting/apache/artifacts.d.ts.map +1 -0
  272. package/dist/hosting/apache/artifacts.js +309 -0
  273. package/dist/hosting/apache/artifacts.js.map +1 -0
  274. package/dist/hosting/apache/index.d.ts +8 -0
  275. package/dist/hosting/apache/index.d.ts.map +1 -0
  276. package/dist/hosting/apache/index.js +8 -0
  277. package/dist/hosting/apache/index.js.map +1 -0
  278. package/dist/hosting/apache/render-site.d.ts +17 -0
  279. package/dist/hosting/apache/render-site.d.ts.map +1 -0
  280. package/dist/hosting/apache/render-site.js +93 -0
  281. package/dist/hosting/apache/render-site.js.map +1 -0
  282. package/dist/hosting/apache/service.d.ts +27 -0
  283. package/dist/hosting/apache/service.d.ts.map +1 -0
  284. package/dist/hosting/apache/service.js +162 -0
  285. package/dist/hosting/apache/service.js.map +1 -0
  286. package/dist/hosting/apache/settings.d.ts +25 -0
  287. package/dist/hosting/apache/settings.d.ts.map +1 -0
  288. package/dist/hosting/apache/settings.js +104 -0
  289. package/dist/hosting/apache/settings.js.map +1 -0
  290. package/dist/hosting/apache/sites-list.d.ts +51 -0
  291. package/dist/hosting/apache/sites-list.d.ts.map +1 -0
  292. package/dist/hosting/apache/sites-list.js +188 -0
  293. package/dist/hosting/apache/sites-list.js.map +1 -0
  294. package/dist/hosting/apache/sync.d.ts +24 -0
  295. package/dist/hosting/apache/sync.d.ts.map +1 -0
  296. package/dist/hosting/apache/sync.js +148 -0
  297. package/dist/hosting/apache/sync.js.map +1 -0
  298. package/dist/hosting/apache/types.d.ts +28 -0
  299. package/dist/hosting/apache/types.d.ts.map +1 -0
  300. package/dist/hosting/apache/types.js +9 -0
  301. package/dist/hosting/apache/types.js.map +1 -0
  302. package/dist/hosting/app-templates.d.ts +44 -0
  303. package/dist/hosting/app-templates.d.ts.map +1 -0
  304. package/dist/hosting/app-templates.js +477 -0
  305. package/dist/hosting/app-templates.js.map +1 -0
  306. package/dist/hosting/apply-audit.d.ts +31 -0
  307. package/dist/hosting/apply-audit.d.ts.map +1 -0
  308. package/dist/hosting/apply-audit.js +149 -0
  309. package/dist/hosting/apply-audit.js.map +1 -0
  310. package/dist/hosting/apply-honesty.d.ts +25 -0
  311. package/dist/hosting/apply-honesty.d.ts.map +1 -0
  312. package/dist/hosting/apply-honesty.js +16 -0
  313. package/dist/hosting/apply-honesty.js.map +1 -0
  314. package/dist/hosting/backup-cron.d.ts +299 -0
  315. package/dist/hosting/backup-cron.d.ts.map +1 -0
  316. package/dist/hosting/backup-cron.js +1021 -0
  317. package/dist/hosting/backup-cron.js.map +1 -0
  318. package/dist/hosting/backup-remote.d.ts +44 -0
  319. package/dist/hosting/backup-remote.d.ts.map +1 -0
  320. package/dist/hosting/backup-remote.js +196 -0
  321. package/dist/hosting/backup-remote.js.map +1 -0
  322. package/dist/hosting/backup-restic.d.ts +82 -0
  323. package/dist/hosting/backup-restic.d.ts.map +1 -0
  324. package/dist/hosting/backup-restic.js +290 -0
  325. package/dist/hosting/backup-restic.js.map +1 -0
  326. package/dist/hosting/bt-tracker/index.d.ts +10 -0
  327. package/dist/hosting/bt-tracker/index.d.ts.map +1 -0
  328. package/dist/hosting/bt-tracker/index.js +10 -0
  329. package/dist/hosting/bt-tracker/index.js.map +1 -0
  330. package/dist/hosting/bt-tracker/prepare-share-bt.d.ts +17 -0
  331. package/dist/hosting/bt-tracker/prepare-share-bt.d.ts.map +1 -0
  332. package/dist/hosting/bt-tracker/prepare-share-bt.js +54 -0
  333. package/dist/hosting/bt-tracker/prepare-share-bt.js.map +1 -0
  334. package/dist/hosting/bt-tracker/process.d.ts +28 -0
  335. package/dist/hosting/bt-tracker/process.d.ts.map +1 -0
  336. package/dist/hosting/bt-tracker/process.js +210 -0
  337. package/dist/hosting/bt-tracker/process.js.map +1 -0
  338. package/dist/hosting/bt-tracker/restore-shares.d.ts +24 -0
  339. package/dist/hosting/bt-tracker/restore-shares.d.ts.map +1 -0
  340. package/dist/hosting/bt-tracker/restore-shares.js +140 -0
  341. package/dist/hosting/bt-tracker/restore-shares.js.map +1 -0
  342. package/dist/hosting/bt-tracker/scrape.d.ts +23 -0
  343. package/dist/hosting/bt-tracker/scrape.d.ts.map +1 -0
  344. package/dist/hosting/bt-tracker/scrape.js +147 -0
  345. package/dist/hosting/bt-tracker/scrape.js.map +1 -0
  346. package/dist/hosting/bt-tracker/seeder.d.ts +45 -0
  347. package/dist/hosting/bt-tracker/seeder.d.ts.map +1 -0
  348. package/dist/hosting/bt-tracker/seeder.js +154 -0
  349. package/dist/hosting/bt-tracker/seeder.js.map +1 -0
  350. package/dist/hosting/bt-tracker/service.d.ts +99 -0
  351. package/dist/hosting/bt-tracker/service.d.ts.map +1 -0
  352. package/dist/hosting/bt-tracker/service.js +405 -0
  353. package/dist/hosting/bt-tracker/service.js.map +1 -0
  354. package/dist/hosting/bt-tracker/settings.d.ts +38 -0
  355. package/dist/hosting/bt-tracker/settings.d.ts.map +1 -0
  356. package/dist/hosting/bt-tracker/settings.js +151 -0
  357. package/dist/hosting/bt-tracker/settings.js.map +1 -0
  358. package/dist/hosting/bt-tracker/torrent-create.d.ts +44 -0
  359. package/dist/hosting/bt-tracker/torrent-create.d.ts.map +1 -0
  360. package/dist/hosting/bt-tracker/torrent-create.js +194 -0
  361. package/dist/hosting/bt-tracker/torrent-create.js.map +1 -0
  362. package/dist/hosting/bt-tracker/torrent-jobs.d.ts +40 -0
  363. package/dist/hosting/bt-tracker/torrent-jobs.d.ts.map +1 -0
  364. package/dist/hosting/bt-tracker/torrent-jobs.js +109 -0
  365. package/dist/hosting/bt-tracker/torrent-jobs.js.map +1 -0
  366. package/dist/hosting/bt-tracker/worker.d.ts +2 -0
  367. package/dist/hosting/bt-tracker/worker.d.ts.map +1 -0
  368. package/dist/hosting/bt-tracker/worker.js +47 -0
  369. package/dist/hosting/bt-tracker/worker.js.map +1 -0
  370. package/dist/hosting/cdn/dns-sync.d.ts +131 -0
  371. package/dist/hosting/cdn/dns-sync.d.ts.map +1 -0
  372. package/dist/hosting/cdn/dns-sync.js +520 -0
  373. package/dist/hosting/cdn/dns-sync.js.map +1 -0
  374. package/dist/hosting/cdn/edge-render.d.ts +76 -0
  375. package/dist/hosting/cdn/edge-render.d.ts.map +1 -0
  376. package/dist/hosting/cdn/edge-render.js +380 -0
  377. package/dist/hosting/cdn/edge-render.js.map +1 -0
  378. package/dist/hosting/cdn/fan-out.d.ts +67 -0
  379. package/dist/hosting/cdn/fan-out.d.ts.map +1 -0
  380. package/dist/hosting/cdn/fan-out.js +807 -0
  381. package/dist/hosting/cdn/fan-out.js.map +1 -0
  382. package/dist/hosting/cdn/fleet-payload.d.ts +42 -0
  383. package/dist/hosting/cdn/fleet-payload.d.ts.map +1 -0
  384. package/dist/hosting/cdn/fleet-payload.js +128 -0
  385. package/dist/hosting/cdn/fleet-payload.js.map +1 -0
  386. package/dist/hosting/cdn/from-project.d.ts +39 -0
  387. package/dist/hosting/cdn/from-project.d.ts.map +1 -0
  388. package/dist/hosting/cdn/from-project.js +101 -0
  389. package/dist/hosting/cdn/from-project.js.map +1 -0
  390. package/dist/hosting/cdn/index.d.ts +10 -0
  391. package/dist/hosting/cdn/index.d.ts.map +1 -0
  392. package/dist/hosting/cdn/index.js +10 -0
  393. package/dist/hosting/cdn/index.js.map +1 -0
  394. package/dist/hosting/cdn/metrics.d.ts +69 -0
  395. package/dist/hosting/cdn/metrics.d.ts.map +1 -0
  396. package/dist/hosting/cdn/metrics.js +270 -0
  397. package/dist/hosting/cdn/metrics.js.map +1 -0
  398. package/dist/hosting/cdn/nodes.d.ts +51 -0
  399. package/dist/hosting/cdn/nodes.d.ts.map +1 -0
  400. package/dist/hosting/cdn/nodes.js +282 -0
  401. package/dist/hosting/cdn/nodes.js.map +1 -0
  402. package/dist/hosting/cdn/sites.d.ts +27 -0
  403. package/dist/hosting/cdn/sites.d.ts.map +1 -0
  404. package/dist/hosting/cdn/sites.js +265 -0
  405. package/dist/hosting/cdn/sites.js.map +1 -0
  406. package/dist/hosting/cdn/ssl.d.ts +82 -0
  407. package/dist/hosting/cdn/ssl.d.ts.map +1 -0
  408. package/dist/hosting/cdn/ssl.js +593 -0
  409. package/dist/hosting/cdn/ssl.js.map +1 -0
  410. package/dist/hosting/cloudflare-dns.d.ts +65 -0
  411. package/dist/hosting/cloudflare-dns.d.ts.map +1 -0
  412. package/dist/hosting/cloudflare-dns.js +206 -0
  413. package/dist/hosting/cloudflare-dns.js.map +1 -0
  414. package/dist/hosting/database.d.ts +27 -0
  415. package/dist/hosting/database.d.ts.map +1 -0
  416. package/dist/hosting/database.js +51 -0
  417. package/dist/hosting/database.js.map +1 -0
  418. package/dist/hosting/datadir-perms.d.ts +19 -0
  419. package/dist/hosting/datadir-perms.d.ts.map +1 -0
  420. package/dist/hosting/datadir-perms.js +55 -0
  421. package/dist/hosting/datadir-perms.js.map +1 -0
  422. package/dist/hosting/db-browser-project.d.ts +67 -0
  423. package/dist/hosting/db-browser-project.d.ts.map +1 -0
  424. package/dist/hosting/db-browser-project.js +287 -0
  425. package/dist/hosting/db-browser-project.js.map +1 -0
  426. package/dist/hosting/db-client.d.ts +33 -0
  427. package/dist/hosting/db-client.d.ts.map +1 -0
  428. package/dist/hosting/db-client.js +70 -0
  429. package/dist/hosting/db-client.js.map +1 -0
  430. package/dist/hosting/db-cluster/apply-local.d.ts +35 -0
  431. package/dist/hosting/db-cluster/apply-local.d.ts.map +1 -0
  432. package/dist/hosting/db-cluster/apply-local.js +349 -0
  433. package/dist/hosting/db-cluster/apply-local.js.map +1 -0
  434. package/dist/hosting/db-cluster/fleet-dispatch.d.ts +42 -0
  435. package/dist/hosting/db-cluster/fleet-dispatch.d.ts.map +1 -0
  436. package/dist/hosting/db-cluster/fleet-dispatch.js +116 -0
  437. package/dist/hosting/db-cluster/fleet-dispatch.js.map +1 -0
  438. package/dist/hosting/db-cluster/import-sync.d.ts +18 -0
  439. package/dist/hosting/db-cluster/import-sync.d.ts.map +1 -0
  440. package/dist/hosting/db-cluster/import-sync.js +57 -0
  441. package/dist/hosting/db-cluster/import-sync.js.map +1 -0
  442. package/dist/hosting/db-cluster/index.d.ts +14 -0
  443. package/dist/hosting/db-cluster/index.d.ts.map +1 -0
  444. package/dist/hosting/db-cluster/index.js +14 -0
  445. package/dist/hosting/db-cluster/index.js.map +1 -0
  446. package/dist/hosting/db-cluster/peer-ops.d.ts +50 -0
  447. package/dist/hosting/db-cluster/peer-ops.d.ts.map +1 -0
  448. package/dist/hosting/db-cluster/peer-ops.js +470 -0
  449. package/dist/hosting/db-cluster/peer-ops.js.map +1 -0
  450. package/dist/hosting/db-cluster/plan-mariadb-galera.d.ts +14 -0
  451. package/dist/hosting/db-cluster/plan-mariadb-galera.d.ts.map +1 -0
  452. package/dist/hosting/db-cluster/plan-mariadb-galera.js +190 -0
  453. package/dist/hosting/db-cluster/plan-mariadb-galera.js.map +1 -0
  454. package/dist/hosting/db-cluster/plan-mysql-replica.d.ts +13 -0
  455. package/dist/hosting/db-cluster/plan-mysql-replica.d.ts.map +1 -0
  456. package/dist/hosting/db-cluster/plan-mysql-replica.js +221 -0
  457. package/dist/hosting/db-cluster/plan-mysql-replica.js.map +1 -0
  458. package/dist/hosting/db-cluster/plan-postgres-replica.d.ts +11 -0
  459. package/dist/hosting/db-cluster/plan-postgres-replica.d.ts.map +1 -0
  460. package/dist/hosting/db-cluster/plan-postgres-replica.js +193 -0
  461. package/dist/hosting/db-cluster/plan-postgres-replica.js.map +1 -0
  462. package/dist/hosting/db-cluster/plan-redis-replica.d.ts +10 -0
  463. package/dist/hosting/db-cluster/plan-redis-replica.d.ts.map +1 -0
  464. package/dist/hosting/db-cluster/plan-redis-replica.js +184 -0
  465. package/dist/hosting/db-cluster/plan-redis-replica.js.map +1 -0
  466. package/dist/hosting/db-cluster/plan.d.ts +15 -0
  467. package/dist/hosting/db-cluster/plan.d.ts.map +1 -0
  468. package/dist/hosting/db-cluster/plan.js +59 -0
  469. package/dist/hosting/db-cluster/plan.js.map +1 -0
  470. package/dist/hosting/db-cluster/probe.d.ts +37 -0
  471. package/dist/hosting/db-cluster/probe.d.ts.map +1 -0
  472. package/dist/hosting/db-cluster/probe.js +414 -0
  473. package/dist/hosting/db-cluster/probe.js.map +1 -0
  474. package/dist/hosting/db-cluster/push-peer.d.ts +85 -0
  475. package/dist/hosting/db-cluster/push-peer.d.ts.map +1 -0
  476. package/dist/hosting/db-cluster/push-peer.js +360 -0
  477. package/dist/hosting/db-cluster/push-peer.js.map +1 -0
  478. package/dist/hosting/db-cluster/store.d.ts +12 -0
  479. package/dist/hosting/db-cluster/store.d.ts.map +1 -0
  480. package/dist/hosting/db-cluster/store.js +240 -0
  481. package/dist/hosting/db-cluster/store.js.map +1 -0
  482. package/dist/hosting/db-cluster/types.d.ts +83 -0
  483. package/dist/hosting/db-cluster/types.d.ts.map +1 -0
  484. package/dist/hosting/db-cluster/types.js +6 -0
  485. package/dist/hosting/db-cluster/types.js.map +1 -0
  486. package/dist/hosting/db-dump.d.ts +39 -0
  487. package/dist/hosting/db-dump.d.ts.map +1 -0
  488. package/dist/hosting/db-dump.js +150 -0
  489. package/dist/hosting/db-dump.js.map +1 -0
  490. package/dist/hosting/db-engine.d.ts +75 -0
  491. package/dist/hosting/db-engine.d.ts.map +1 -0
  492. package/dist/hosting/db-engine.js +225 -0
  493. package/dist/hosting/db-engine.js.map +1 -0
  494. package/dist/hosting/db-service-config.d.ts +100 -0
  495. package/dist/hosting/db-service-config.d.ts.map +1 -0
  496. package/dist/hosting/db-service-config.js +410 -0
  497. package/dist/hosting/db-service-config.js.map +1 -0
  498. package/dist/hosting/defense/auto-ban.d.ts +86 -0
  499. package/dist/hosting/defense/auto-ban.d.ts.map +1 -0
  500. package/dist/hosting/defense/auto-ban.js +573 -0
  501. package/dist/hosting/defense/auto-ban.js.map +1 -0
  502. package/dist/hosting/defense/automation.d.ts +104 -0
  503. package/dist/hosting/defense/automation.d.ts.map +1 -0
  504. package/dist/hosting/defense/automation.js +475 -0
  505. package/dist/hosting/defense/automation.js.map +1 -0
  506. package/dist/hosting/defense/cf-ufw.d.ts +23 -0
  507. package/dist/hosting/defense/cf-ufw.d.ts.map +1 -0
  508. package/dist/hosting/defense/cf-ufw.js +108 -0
  509. package/dist/hosting/defense/cf-ufw.js.map +1 -0
  510. package/dist/hosting/defense/cloudflare-ua.d.ts +58 -0
  511. package/dist/hosting/defense/cloudflare-ua.d.ts.map +1 -0
  512. package/dist/hosting/defense/cloudflare-ua.js +167 -0
  513. package/dist/hosting/defense/cloudflare-ua.js.map +1 -0
  514. package/dist/hosting/defense/defense-service.d.ts +96 -0
  515. package/dist/hosting/defense/defense-service.d.ts.map +1 -0
  516. package/dist/hosting/defense/defense-service.js +597 -0
  517. package/dist/hosting/defense/defense-service.js.map +1 -0
  518. package/dist/hosting/defense/geoip/downloader.d.ts +24 -0
  519. package/dist/hosting/defense/geoip/downloader.d.ts.map +1 -0
  520. package/dist/hosting/defense/geoip/downloader.js +179 -0
  521. package/dist/hosting/defense/geoip/downloader.js.map +1 -0
  522. package/dist/hosting/defense/geoip/index.d.ts +32 -0
  523. package/dist/hosting/defense/geoip/index.d.ts.map +1 -0
  524. package/dist/hosting/defense/geoip/index.js +140 -0
  525. package/dist/hosting/defense/geoip/index.js.map +1 -0
  526. package/dist/hosting/defense/geoip/lookup.d.ts +4 -0
  527. package/dist/hosting/defense/geoip/lookup.d.ts.map +1 -0
  528. package/dist/hosting/defense/geoip/lookup.js +320 -0
  529. package/dist/hosting/defense/geoip/lookup.js.map +1 -0
  530. package/dist/hosting/defense/geoip/nginx-geo.d.ts +19 -0
  531. package/dist/hosting/defense/geoip/nginx-geo.d.ts.map +1 -0
  532. package/dist/hosting/defense/geoip/nginx-geo.js +94 -0
  533. package/dist/hosting/defense/geoip/nginx-geo.js.map +1 -0
  534. package/dist/hosting/defense/geoip/policy.d.ts +21 -0
  535. package/dist/hosting/defense/geoip/policy.d.ts.map +1 -0
  536. package/dist/hosting/defense/geoip/policy.js +161 -0
  537. package/dist/hosting/defense/geoip/policy.js.map +1 -0
  538. package/dist/hosting/defense/geoip/providers.d.ts +30 -0
  539. package/dist/hosting/defense/geoip/providers.d.ts.map +1 -0
  540. package/dist/hosting/defense/geoip/providers.js +98 -0
  541. package/dist/hosting/defense/geoip/providers.js.map +1 -0
  542. package/dist/hosting/defense/geoip/types.d.ts +102 -0
  543. package/dist/hosting/defense/geoip/types.d.ts.map +1 -0
  544. package/dist/hosting/defense/geoip/types.js +89 -0
  545. package/dist/hosting/defense/geoip/types.js.map +1 -0
  546. package/dist/hosting/defense/index.d.ts +12 -0
  547. package/dist/hosting/defense/index.d.ts.map +1 -0
  548. package/dist/hosting/defense/index.js +12 -0
  549. package/dist/hosting/defense/index.js.map +1 -0
  550. package/dist/hosting/defense/intel.d.ts +26 -0
  551. package/dist/hosting/defense/intel.d.ts.map +1 -0
  552. package/dist/hosting/defense/intel.js +148 -0
  553. package/dist/hosting/defense/intel.js.map +1 -0
  554. package/dist/hosting/defense/nginx-limits.d.ts +39 -0
  555. package/dist/hosting/defense/nginx-limits.d.ts.map +1 -0
  556. package/dist/hosting/defense/nginx-limits.js +142 -0
  557. package/dist/hosting/defense/nginx-limits.js.map +1 -0
  558. package/dist/hosting/defense/presets.d.ts +12 -0
  559. package/dist/hosting/defense/presets.d.ts.map +1 -0
  560. package/dist/hosting/defense/presets.js +128 -0
  561. package/dist/hosting/defense/presets.js.map +1 -0
  562. package/dist/hosting/defense/signals.d.ts +60 -0
  563. package/dist/hosting/defense/signals.d.ts.map +1 -0
  564. package/dist/hosting/defense/signals.js +176 -0
  565. package/dist/hosting/defense/signals.js.map +1 -0
  566. package/dist/hosting/defense/types.d.ts +134 -0
  567. package/dist/hosting/defense/types.d.ts.map +1 -0
  568. package/dist/hosting/defense/types.js +5 -0
  569. package/dist/hosting/defense/types.js.map +1 -0
  570. package/dist/hosting/dns-cluster.d.ts +100 -0
  571. package/dist/hosting/dns-cluster.d.ts.map +1 -0
  572. package/dist/hosting/dns-cluster.js +532 -0
  573. package/dist/hosting/dns-cluster.js.map +1 -0
  574. package/dist/hosting/dns-health.d.ts +93 -0
  575. package/dist/hosting/dns-health.d.ts.map +1 -0
  576. package/dist/hosting/dns-health.js +491 -0
  577. package/dist/hosting/dns-health.js.map +1 -0
  578. package/dist/hosting/dns-lookup.d.ts +22 -0
  579. package/dist/hosting/dns-lookup.d.ts.map +1 -0
  580. package/dist/hosting/dns-lookup.js +114 -0
  581. package/dist/hosting/dns-lookup.js.map +1 -0
  582. package/dist/hosting/dns-validate.d.ts +25 -0
  583. package/dist/hosting/dns-validate.d.ts.map +1 -0
  584. package/dist/hosting/dns-validate.js +145 -0
  585. package/dist/hosting/dns-validate.js.map +1 -0
  586. package/dist/hosting/dns-zone.d.ts +112 -0
  587. package/dist/hosting/dns-zone.d.ts.map +1 -0
  588. package/dist/hosting/dns-zone.js +365 -0
  589. package/dist/hosting/dns-zone.js.map +1 -0
  590. package/dist/hosting/dnssec.d.ts +22 -0
  591. package/dist/hosting/dnssec.d.ts.map +1 -0
  592. package/dist/hosting/dnssec.js +170 -0
  593. package/dist/hosting/dnssec.js.map +1 -0
  594. package/dist/hosting/extras.d.ts +106 -0
  595. package/dist/hosting/extras.d.ts.map +1 -0
  596. package/dist/hosting/extras.js +294 -0
  597. package/dist/hosting/extras.js.map +1 -0
  598. package/dist/hosting/fail2ban-ops.d.ts +72 -0
  599. package/dist/hosting/fail2ban-ops.d.ts.map +1 -0
  600. package/dist/hosting/fail2ban-ops.js +229 -0
  601. package/dist/hosting/fail2ban-ops.js.map +1 -0
  602. package/dist/hosting/firewall-ops.d.ts +109 -0
  603. package/dist/hosting/firewall-ops.d.ts.map +1 -0
  604. package/dist/hosting/firewall-ops.js +398 -0
  605. package/dist/hosting/firewall-ops.js.map +1 -0
  606. package/dist/hosting/ftps-service.d.ts +182 -0
  607. package/dist/hosting/ftps-service.d.ts.map +1 -0
  608. package/dist/hosting/ftps-service.js +909 -0
  609. package/dist/hosting/ftps-service.js.map +1 -0
  610. package/dist/hosting/git-deploy.d.ts +33 -0
  611. package/dist/hosting/git-deploy.d.ts.map +1 -0
  612. package/dist/hosting/git-deploy.js +181 -0
  613. package/dist/hosting/git-deploy.js.map +1 -0
  614. package/dist/hosting/global-search.d.ts +23 -0
  615. package/dist/hosting/global-search.d.ts.map +1 -0
  616. package/dist/hosting/global-search.js +296 -0
  617. package/dist/hosting/global-search.js.map +1 -0
  618. package/dist/hosting/host-migrate/bootstrap-target.d.ts +84 -0
  619. package/dist/hosting/host-migrate/bootstrap-target.d.ts.map +1 -0
  620. package/dist/hosting/host-migrate/bootstrap-target.js +457 -0
  621. package/dist/hosting/host-migrate/bootstrap-target.js.map +1 -0
  622. package/dist/hosting/host-migrate/index.d.ts +16 -0
  623. package/dist/hosting/host-migrate/index.d.ts.map +1 -0
  624. package/dist/hosting/host-migrate/index.js +16 -0
  625. package/dist/hosting/host-migrate/index.js.map +1 -0
  626. package/dist/hosting/host-migrate/inventory.d.ts +27 -0
  627. package/dist/hosting/host-migrate/inventory.d.ts.map +1 -0
  628. package/dist/hosting/host-migrate/inventory.js +386 -0
  629. package/dist/hosting/host-migrate/inventory.js.map +1 -0
  630. package/dist/hosting/host-migrate/job-store.d.ts +23 -0
  631. package/dist/hosting/host-migrate/job-store.d.ts.map +1 -0
  632. package/dist/hosting/host-migrate/job-store.js +126 -0
  633. package/dist/hosting/host-migrate/job-store.js.map +1 -0
  634. package/dist/hosting/host-migrate/orchestrator.d.ts +69 -0
  635. package/dist/hosting/host-migrate/orchestrator.d.ts.map +1 -0
  636. package/dist/hosting/host-migrate/orchestrator.js +376 -0
  637. package/dist/hosting/host-migrate/orchestrator.js.map +1 -0
  638. package/dist/hosting/host-migrate/package-source.d.ts +88 -0
  639. package/dist/hosting/host-migrate/package-source.d.ts.map +1 -0
  640. package/dist/hosting/host-migrate/package-source.js +473 -0
  641. package/dist/hosting/host-migrate/package-source.js.map +1 -0
  642. package/dist/hosting/host-migrate/post-transfer.d.ts +32 -0
  643. package/dist/hosting/host-migrate/post-transfer.d.ts.map +1 -0
  644. package/dist/hosting/host-migrate/post-transfer.js +81 -0
  645. package/dist/hosting/host-migrate/post-transfer.js.map +1 -0
  646. package/dist/hosting/host-migrate/preflight.d.ts +58 -0
  647. package/dist/hosting/host-migrate/preflight.d.ts.map +1 -0
  648. package/dist/hosting/host-migrate/preflight.js +315 -0
  649. package/dist/hosting/host-migrate/preflight.js.map +1 -0
  650. package/dist/hosting/host-migrate/reapply.d.ts +36 -0
  651. package/dist/hosting/host-migrate/reapply.d.ts.map +1 -0
  652. package/dist/hosting/host-migrate/reapply.js +361 -0
  653. package/dist/hosting/host-migrate/reapply.js.map +1 -0
  654. package/dist/hosting/host-migrate/redis-dump.d.ts +25 -0
  655. package/dist/hosting/host-migrate/redis-dump.d.ts.map +1 -0
  656. package/dist/hosting/host-migrate/redis-dump.js +153 -0
  657. package/dist/hosting/host-migrate/redis-dump.js.map +1 -0
  658. package/dist/hosting/host-migrate/restore.d.ts +62 -0
  659. package/dist/hosting/host-migrate/restore.d.ts.map +1 -0
  660. package/dist/hosting/host-migrate/restore.js +420 -0
  661. package/dist/hosting/host-migrate/restore.js.map +1 -0
  662. package/dist/hosting/host-migrate/temp-key.d.ts +56 -0
  663. package/dist/hosting/host-migrate/temp-key.d.ts.map +1 -0
  664. package/dist/hosting/host-migrate/temp-key.js +207 -0
  665. package/dist/hosting/host-migrate/temp-key.js.map +1 -0
  666. package/dist/hosting/host-migrate/transfer.d.ts +57 -0
  667. package/dist/hosting/host-migrate/transfer.d.ts.map +1 -0
  668. package/dist/hosting/host-migrate/transfer.js +408 -0
  669. package/dist/hosting/host-migrate/transfer.js.map +1 -0
  670. package/dist/hosting/host-migrate/transport.d.ts +96 -0
  671. package/dist/hosting/host-migrate/transport.d.ts.map +1 -0
  672. package/dist/hosting/host-migrate/transport.js +363 -0
  673. package/dist/hosting/host-migrate/transport.js.map +1 -0
  674. package/dist/hosting/host-migrate/types.d.ts +8 -0
  675. package/dist/hosting/host-migrate/types.d.ts.map +1 -0
  676. package/dist/hosting/host-migrate/types.js +9 -0
  677. package/dist/hosting/host-migrate/types.js.map +1 -0
  678. package/dist/hosting/host-migrate/verify.d.ts +29 -0
  679. package/dist/hosting/host-migrate/verify.d.ts.map +1 -0
  680. package/dist/hosting/host-migrate/verify.js +268 -0
  681. package/dist/hosting/host-migrate/verify.js.map +1 -0
  682. package/dist/hosting/index.d.ts +103 -0
  683. package/dist/hosting/index.d.ts.map +1 -0
  684. package/dist/hosting/index.js +103 -0
  685. package/dist/hosting/index.js.map +1 -0
  686. package/dist/hosting/log-center/catalog.d.ts +33 -0
  687. package/dist/hosting/log-center/catalog.d.ts.map +1 -0
  688. package/dist/hosting/log-center/catalog.js +321 -0
  689. package/dist/hosting/log-center/catalog.js.map +1 -0
  690. package/dist/hosting/log-center/file-tail.d.ts +20 -0
  691. package/dist/hosting/log-center/file-tail.d.ts.map +1 -0
  692. package/dist/hosting/log-center/file-tail.js +89 -0
  693. package/dist/hosting/log-center/file-tail.js.map +1 -0
  694. package/dist/hosting/log-center/index.d.ts +6 -0
  695. package/dist/hosting/log-center/index.d.ts.map +1 -0
  696. package/dist/hosting/log-center/index.js +6 -0
  697. package/dist/hosting/log-center/index.js.map +1 -0
  698. package/dist/hosting/log-center/journal.d.ts +35 -0
  699. package/dist/hosting/log-center/journal.d.ts.map +1 -0
  700. package/dist/hosting/log-center/journal.js +248 -0
  701. package/dist/hosting/log-center/journal.js.map +1 -0
  702. package/dist/hosting/log-center/service.d.ts +92 -0
  703. package/dist/hosting/log-center/service.d.ts.map +1 -0
  704. package/dist/hosting/log-center/service.js +548 -0
  705. package/dist/hosting/log-center/service.js.map +1 -0
  706. package/dist/hosting/log-center/types.d.ts +103 -0
  707. package/dist/hosting/log-center/types.d.ts.map +1 -0
  708. package/dist/hosting/log-center/types.js +17 -0
  709. package/dist/hosting/log-center/types.js.map +1 -0
  710. package/dist/hosting/managed-resources.d.ts +87 -0
  711. package/dist/hosting/managed-resources.d.ts.map +1 -0
  712. package/dist/hosting/managed-resources.js +561 -0
  713. package/dist/hosting/managed-resources.js.map +1 -0
  714. package/dist/hosting/mysql-provision.d.ts +37 -0
  715. package/dist/hosting/mysql-provision.d.ts.map +1 -0
  716. package/dist/hosting/mysql-provision.js +91 -0
  717. package/dist/hosting/mysql-provision.js.map +1 -0
  718. package/dist/hosting/nginx-settings.d.ts +47 -0
  719. package/dist/hosting/nginx-settings.d.ts.map +1 -0
  720. package/dist/hosting/nginx-settings.js +147 -0
  721. package/dist/hosting/nginx-settings.js.map +1 -0
  722. package/dist/hosting/nginx-sites-list.d.ts +31 -0
  723. package/dist/hosting/nginx-sites-list.d.ts.map +1 -0
  724. package/dist/hosting/nginx-sites-list.js +86 -0
  725. package/dist/hosting/nginx-sites-list.js.map +1 -0
  726. package/dist/hosting/nginx-ssl.d.ts +84 -0
  727. package/dist/hosting/nginx-ssl.d.ts.map +1 -0
  728. package/dist/hosting/nginx-ssl.js +342 -0
  729. package/dist/hosting/nginx-ssl.js.map +1 -0
  730. package/dist/hosting/nginx-sync.d.ts +38 -0
  731. package/dist/hosting/nginx-sync.d.ts.map +1 -0
  732. package/dist/hosting/nginx-sync.js +141 -0
  733. package/dist/hosting/nginx-sync.js.map +1 -0
  734. package/dist/hosting/node-apply.d.ts +32 -0
  735. package/dist/hosting/node-apply.d.ts.map +1 -0
  736. package/dist/hosting/node-apply.js +86 -0
  737. package/dist/hosting/node-apply.js.map +1 -0
  738. package/dist/hosting/package-limits.d.ts +38 -0
  739. package/dist/hosting/package-limits.d.ts.map +1 -0
  740. package/dist/hosting/package-limits.js +129 -0
  741. package/dist/hosting/package-limits.js.map +1 -0
  742. package/dist/hosting/panel-tls.d.ts +150 -0
  743. package/dist/hosting/panel-tls.d.ts.map +1 -0
  744. package/dist/hosting/panel-tls.js +533 -0
  745. package/dist/hosting/panel-tls.js.map +1 -0
  746. package/dist/hosting/php-disable-functions.d.ts +25 -0
  747. package/dist/hosting/php-disable-functions.d.ts.map +1 -0
  748. package/dist/hosting/php-disable-functions.js +79 -0
  749. package/dist/hosting/php-disable-functions.js.map +1 -0
  750. package/dist/hosting/php-extensions.d.ts +118 -0
  751. package/dist/hosting/php-extensions.d.ts.map +1 -0
  752. package/dist/hosting/php-extensions.js +482 -0
  753. package/dist/hosting/php-extensions.js.map +1 -0
  754. package/dist/hosting/php-fpm.d.ts +38 -0
  755. package/dist/hosting/php-fpm.d.ts.map +1 -0
  756. package/dist/hosting/php-fpm.js +94 -0
  757. package/dist/hosting/php-fpm.js.map +1 -0
  758. package/dist/hosting/php-ini-catalog.d.ts +55 -0
  759. package/dist/hosting/php-ini-catalog.d.ts.map +1 -0
  760. package/dist/hosting/php-ini-catalog.js +469 -0
  761. package/dist/hosting/php-ini-catalog.js.map +1 -0
  762. package/dist/hosting/php-ini.d.ts +54 -0
  763. package/dist/hosting/php-ini.d.ts.map +1 -0
  764. package/dist/hosting/php-ini.js +299 -0
  765. package/dist/hosting/php-ini.js.map +1 -0
  766. package/dist/hosting/pm2-apply.d.ts +163 -0
  767. package/dist/hosting/pm2-apply.d.ts.map +1 -0
  768. package/dist/hosting/pm2-apply.js +629 -0
  769. package/dist/hosting/pm2-apply.js.map +1 -0
  770. package/dist/hosting/pm2-status.d.ts +59 -0
  771. package/dist/hosting/pm2-status.d.ts.map +1 -0
  772. package/dist/hosting/pm2-status.js +188 -0
  773. package/dist/hosting/pm2-status.js.map +1 -0
  774. package/dist/hosting/postfix-bootstrap.d.ts +56 -0
  775. package/dist/hosting/postfix-bootstrap.d.ts.map +1 -0
  776. package/dist/hosting/postfix-bootstrap.js +212 -0
  777. package/dist/hosting/postfix-bootstrap.js.map +1 -0
  778. package/dist/hosting/postgres-provision.d.ts +48 -0
  779. package/dist/hosting/postgres-provision.d.ts.map +1 -0
  780. package/dist/hosting/postgres-provision.js +166 -0
  781. package/dist/hosting/postgres-provision.js.map +1 -0
  782. package/dist/hosting/powerdns-apply.d.ts +215 -0
  783. package/dist/hosting/powerdns-apply.d.ts.map +1 -0
  784. package/dist/hosting/powerdns-apply.js +790 -0
  785. package/dist/hosting/powerdns-apply.js.map +1 -0
  786. package/dist/hosting/process-fleet.d.ts +55 -0
  787. package/dist/hosting/process-fleet.d.ts.map +1 -0
  788. package/dist/hosting/process-fleet.js +203 -0
  789. package/dist/hosting/process-fleet.js.map +1 -0
  790. package/dist/hosting/production-readiness.d.ts +47 -0
  791. package/dist/hosting/production-readiness.d.ts.map +1 -0
  792. package/dist/hosting/production-readiness.js +797 -0
  793. package/dist/hosting/production-readiness.js.map +1 -0
  794. package/dist/hosting/project-isolation-status.d.ts +47 -0
  795. package/dist/hosting/project-isolation-status.d.ts.map +1 -0
  796. package/dist/hosting/project-isolation-status.js +150 -0
  797. package/dist/hosting/project-isolation-status.js.map +1 -0
  798. package/dist/hosting/project-logs.d.ts +124 -0
  799. package/dist/hosting/project-logs.d.ts.map +1 -0
  800. package/dist/hosting/project-logs.js +510 -0
  801. package/dist/hosting/project-logs.js.map +1 -0
  802. package/dist/hosting/project-ops.d.ts +324 -0
  803. package/dist/hosting/project-ops.d.ts.map +1 -0
  804. package/dist/hosting/project-ops.js +2509 -0
  805. package/dist/hosting/project-ops.js.map +1 -0
  806. package/dist/hosting/project-os-user.d.ts +44 -0
  807. package/dist/hosting/project-os-user.d.ts.map +1 -0
  808. package/dist/hosting/project-os-user.js +279 -0
  809. package/dist/hosting/project-os-user.js.map +1 -0
  810. package/dist/hosting/project-ownership.d.ts +21 -0
  811. package/dist/hosting/project-ownership.d.ts.map +1 -0
  812. package/dist/hosting/project-ownership.js +52 -0
  813. package/dist/hosting/project-ownership.js.map +1 -0
  814. package/dist/hosting/project-service.d.ts +156 -0
  815. package/dist/hosting/project-service.d.ts.map +1 -0
  816. package/dist/hosting/project-service.js +950 -0
  817. package/dist/hosting/project-service.js.map +1 -0
  818. package/dist/hosting/project-user-run.d.ts +61 -0
  819. package/dist/hosting/project-user-run.d.ts.map +1 -0
  820. package/dist/hosting/project-user-run.js +130 -0
  821. package/dist/hosting/project-user-run.js.map +1 -0
  822. package/dist/hosting/project-web-group.d.ts +21 -0
  823. package/dist/hosting/project-web-group.d.ts.map +1 -0
  824. package/dist/hosting/project-web-group.js +79 -0
  825. package/dist/hosting/project-web-group.js.map +1 -0
  826. package/dist/hosting/project.d.ts +58 -0
  827. package/dist/hosting/project.d.ts.map +1 -0
  828. package/dist/hosting/project.js +154 -0
  829. package/dist/hosting/project.js.map +1 -0
  830. package/dist/hosting/public-files.d.ts +53 -0
  831. package/dist/hosting/public-files.d.ts.map +1 -0
  832. package/dist/hosting/public-files.js +324 -0
  833. package/dist/hosting/public-files.js.map +1 -0
  834. package/dist/hosting/quota.d.ts +36 -0
  835. package/dist/hosting/quota.d.ts.map +1 -0
  836. package/dist/hosting/quota.js +70 -0
  837. package/dist/hosting/quota.js.map +1 -0
  838. package/dist/hosting/real-ip/apply.d.ts +17 -0
  839. package/dist/hosting/real-ip/apply.d.ts.map +1 -0
  840. package/dist/hosting/real-ip/apply.js +62 -0
  841. package/dist/hosting/real-ip/apply.js.map +1 -0
  842. package/dist/hosting/real-ip/index.d.ts +7 -0
  843. package/dist/hosting/real-ip/index.d.ts.map +1 -0
  844. package/dist/hosting/real-ip/index.js +7 -0
  845. package/dist/hosting/real-ip/index.js.map +1 -0
  846. package/dist/hosting/real-ip/providers.d.ts +12 -0
  847. package/dist/hosting/real-ip/providers.d.ts.map +1 -0
  848. package/dist/hosting/real-ip/providers.js +237 -0
  849. package/dist/hosting/real-ip/providers.js.map +1 -0
  850. package/dist/hosting/real-ip/refresh.d.ts +17 -0
  851. package/dist/hosting/real-ip/refresh.d.ts.map +1 -0
  852. package/dist/hosting/real-ip/refresh.js +113 -0
  853. package/dist/hosting/real-ip/refresh.js.map +1 -0
  854. package/dist/hosting/real-ip/render.d.ts +39 -0
  855. package/dist/hosting/real-ip/render.d.ts.map +1 -0
  856. package/dist/hosting/real-ip/render.js +132 -0
  857. package/dist/hosting/real-ip/render.js.map +1 -0
  858. package/dist/hosting/real-ip/store.d.ts +9 -0
  859. package/dist/hosting/real-ip/store.d.ts.map +1 -0
  860. package/dist/hosting/real-ip/store.js +66 -0
  861. package/dist/hosting/real-ip/store.js.map +1 -0
  862. package/dist/hosting/real-ip/types.d.ts +41 -0
  863. package/dist/hosting/real-ip/types.d.ts.map +1 -0
  864. package/dist/hosting/real-ip/types.js +10 -0
  865. package/dist/hosting/real-ip/types.js.map +1 -0
  866. package/dist/hosting/rebuild.d.ts +82 -0
  867. package/dist/hosting/rebuild.d.ts.map +1 -0
  868. package/dist/hosting/rebuild.js +241 -0
  869. package/dist/hosting/rebuild.js.map +1 -0
  870. package/dist/hosting/redis-browser.d.ts +109 -0
  871. package/dist/hosting/redis-browser.d.ts.map +1 -0
  872. package/dist/hosting/redis-browser.js +312 -0
  873. package/dist/hosting/redis-browser.js.map +1 -0
  874. package/dist/hosting/redis-provision.d.ts +39 -0
  875. package/dist/hosting/redis-provision.d.ts.map +1 -0
  876. package/dist/hosting/redis-provision.js +107 -0
  877. package/dist/hosting/redis-provision.js.map +1 -0
  878. package/dist/hosting/runtime-latest.d.ts +33 -0
  879. package/dist/hosting/runtime-latest.d.ts.map +1 -0
  880. package/dist/hosting/runtime-latest.js +180 -0
  881. package/dist/hosting/runtime-latest.js.map +1 -0
  882. package/dist/hosting/runtime-panel-defaults.d.ts +7 -0
  883. package/dist/hosting/runtime-panel-defaults.d.ts.map +1 -0
  884. package/dist/hosting/runtime-panel-defaults.js +43 -0
  885. package/dist/hosting/runtime-panel-defaults.js.map +1 -0
  886. package/dist/hosting/runtime-plugins.d.ts +164 -0
  887. package/dist/hosting/runtime-plugins.d.ts.map +1 -0
  888. package/dist/hosting/runtime-plugins.js +799 -0
  889. package/dist/hosting/runtime-plugins.js.map +1 -0
  890. package/dist/hosting/runtime-probe.d.ts +155 -0
  891. package/dist/hosting/runtime-probe.d.ts.map +1 -0
  892. package/dist/hosting/runtime-probe.js +1872 -0
  893. package/dist/hosting/runtime-probe.js.map +1 -0
  894. package/dist/hosting/runtime-tools.d.ts +20 -0
  895. package/dist/hosting/runtime-tools.d.ts.map +1 -0
  896. package/dist/hosting/runtime-tools.js +41 -0
  897. package/dist/hosting/runtime-tools.js.map +1 -0
  898. package/dist/hosting/runtime-tuning.d.ts +46 -0
  899. package/dist/hosting/runtime-tuning.d.ts.map +1 -0
  900. package/dist/hosting/runtime-tuning.js +289 -0
  901. package/dist/hosting/runtime-tuning.js.map +1 -0
  902. package/dist/hosting/runtime.d.ts +163 -0
  903. package/dist/hosting/runtime.d.ts.map +1 -0
  904. package/dist/hosting/runtime.js +709 -0
  905. package/dist/hosting/runtime.js.map +1 -0
  906. package/dist/hosting/service-catalog/index.d.ts +10 -0
  907. package/dist/hosting/service-catalog/index.d.ts.map +1 -0
  908. package/dist/hosting/service-catalog/index.js +22 -0
  909. package/dist/hosting/service-catalog/index.js.map +1 -0
  910. package/dist/hosting/service-catalog/mysql.d.ts +5 -0
  911. package/dist/hosting/service-catalog/mysql.d.ts.map +1 -0
  912. package/dist/hosting/service-catalog/mysql.js +257 -0
  913. package/dist/hosting/service-catalog/mysql.js.map +1 -0
  914. package/dist/hosting/service-catalog/postgres.d.ts +3 -0
  915. package/dist/hosting/service-catalog/postgres.d.ts.map +1 -0
  916. package/dist/hosting/service-catalog/postgres.js +140 -0
  917. package/dist/hosting/service-catalog/postgres.js.map +1 -0
  918. package/dist/hosting/service-catalog/redis.d.ts +3 -0
  919. package/dist/hosting/service-catalog/redis.d.ts.map +1 -0
  920. package/dist/hosting/service-catalog/redis.js +146 -0
  921. package/dist/hosting/service-catalog/redis.js.map +1 -0
  922. package/dist/hosting/service-catalog/types.d.ts +59 -0
  923. package/dist/hosting/service-catalog/types.d.ts.map +1 -0
  924. package/dist/hosting/service-catalog/types.js +72 -0
  925. package/dist/hosting/service-catalog/types.js.map +1 -0
  926. package/dist/hosting/service-console.d.ts +51 -0
  927. package/dist/hosting/service-console.d.ts.map +1 -0
  928. package/dist/hosting/service-console.js +480 -0
  929. package/dist/hosting/service-console.js.map +1 -0
  930. package/dist/hosting/service-exposure/geo-countries.d.ts +51 -0
  931. package/dist/hosting/service-exposure/geo-countries.d.ts.map +1 -0
  932. package/dist/hosting/service-exposure/geo-countries.js +245 -0
  933. package/dist/hosting/service-exposure/geo-countries.js.map +1 -0
  934. package/dist/hosting/service-exposure/index.d.ts +5 -0
  935. package/dist/hosting/service-exposure/index.d.ts.map +1 -0
  936. package/dist/hosting/service-exposure/index.js +5 -0
  937. package/dist/hosting/service-exposure/index.js.map +1 -0
  938. package/dist/hosting/service-exposure/ports.d.ts +38 -0
  939. package/dist/hosting/service-exposure/ports.d.ts.map +1 -0
  940. package/dist/hosting/service-exposure/ports.js +175 -0
  941. package/dist/hosting/service-exposure/ports.js.map +1 -0
  942. package/dist/hosting/service-exposure/store.d.ts +18 -0
  943. package/dist/hosting/service-exposure/store.d.ts.map +1 -0
  944. package/dist/hosting/service-exposure/store.js +158 -0
  945. package/dist/hosting/service-exposure/store.js.map +1 -0
  946. package/dist/hosting/service-exposure/sync.d.ts +89 -0
  947. package/dist/hosting/service-exposure/sync.d.ts.map +1 -0
  948. package/dist/hosting/service-exposure/sync.js +365 -0
  949. package/dist/hosting/service-exposure/sync.js.map +1 -0
  950. package/dist/hosting/service-matrix.d.ts +31 -0
  951. package/dist/hosting/service-matrix.d.ts.map +1 -0
  952. package/dist/hosting/service-matrix.js +282 -0
  953. package/dist/hosting/service-matrix.js.map +1 -0
  954. package/dist/hosting/sftp-keys.d.ts +35 -0
  955. package/dist/hosting/sftp-keys.d.ts.map +1 -0
  956. package/dist/hosting/sftp-keys.js +151 -0
  957. package/dist/hosting/sftp-keys.js.map +1 -0
  958. package/dist/hosting/software-catalog.d.ts +56 -0
  959. package/dist/hosting/software-catalog.d.ts.map +1 -0
  960. package/dist/hosting/software-catalog.js +380 -0
  961. package/dist/hosting/software-catalog.js.map +1 -0
  962. package/dist/hosting/software-install.d.ts +88 -0
  963. package/dist/hosting/software-install.d.ts.map +1 -0
  964. package/dist/hosting/software-install.js +610 -0
  965. package/dist/hosting/software-install.js.map +1 -0
  966. package/dist/hosting/software-probe/HostSoftwareProbe.d.ts +45 -0
  967. package/dist/hosting/software-probe/HostSoftwareProbe.d.ts.map +1 -0
  968. package/dist/hosting/software-probe/HostSoftwareProbe.js +362 -0
  969. package/dist/hosting/software-probe/HostSoftwareProbe.js.map +1 -0
  970. package/dist/hosting/software-probe/index.d.ts +6 -0
  971. package/dist/hosting/software-probe/index.d.ts.map +1 -0
  972. package/dist/hosting/software-probe/index.js +6 -0
  973. package/dist/hosting/software-probe/index.js.map +1 -0
  974. package/dist/hosting/software-probe/registry.d.ts +11 -0
  975. package/dist/hosting/software-probe/registry.d.ts.map +1 -0
  976. package/dist/hosting/software-probe/registry.js +100 -0
  977. package/dist/hosting/software-probe/registry.js.map +1 -0
  978. package/dist/hosting/software-probe/resolve-bin.d.ts +38 -0
  979. package/dist/hosting/software-probe/resolve-bin.d.ts.map +1 -0
  980. package/dist/hosting/software-probe/resolve-bin.js +168 -0
  981. package/dist/hosting/software-probe/resolve-bin.js.map +1 -0
  982. package/dist/hosting/software-probe/shell.d.ts +22 -0
  983. package/dist/hosting/software-probe/shell.d.ts.map +1 -0
  984. package/dist/hosting/software-probe/shell.js +41 -0
  985. package/dist/hosting/software-probe/shell.js.map +1 -0
  986. package/dist/hosting/software-probe/types.d.ts +57 -0
  987. package/dist/hosting/software-probe/types.d.ts.map +1 -0
  988. package/dist/hosting/software-probe/types.js +6 -0
  989. package/dist/hosting/software-probe/types.js.map +1 -0
  990. package/dist/hosting/software-uninstall.d.ts +67 -0
  991. package/dist/hosting/software-uninstall.d.ts.map +1 -0
  992. package/dist/hosting/software-uninstall.js +333 -0
  993. package/dist/hosting/software-uninstall.js.map +1 -0
  994. package/dist/hosting/sql-engine-health/actions.d.ts +20 -0
  995. package/dist/hosting/sql-engine-health/actions.d.ts.map +1 -0
  996. package/dist/hosting/sql-engine-health/actions.js +29 -0
  997. package/dist/hosting/sql-engine-health/actions.js.map +1 -0
  998. package/dist/hosting/sql-engine-health/compat.d.ts +33 -0
  999. package/dist/hosting/sql-engine-health/compat.d.ts.map +1 -0
  1000. package/dist/hosting/sql-engine-health/compat.js +45 -0
  1001. package/dist/hosting/sql-engine-health/compat.js.map +1 -0
  1002. package/dist/hosting/sql-engine-health/diagnose.d.ts +10 -0
  1003. package/dist/hosting/sql-engine-health/diagnose.d.ts.map +1 -0
  1004. package/dist/hosting/sql-engine-health/diagnose.js +268 -0
  1005. package/dist/hosting/sql-engine-health/diagnose.js.map +1 -0
  1006. package/dist/hosting/sql-engine-health/execute.d.ts +14 -0
  1007. package/dist/hosting/sql-engine-health/execute.d.ts.map +1 -0
  1008. package/dist/hosting/sql-engine-health/execute.js +130 -0
  1009. package/dist/hosting/sql-engine-health/execute.js.map +1 -0
  1010. package/dist/hosting/sql-engine-health/index.d.ts +6 -0
  1011. package/dist/hosting/sql-engine-health/index.d.ts.map +1 -0
  1012. package/dist/hosting/sql-engine-health/index.js +6 -0
  1013. package/dist/hosting/sql-engine-health/index.js.map +1 -0
  1014. package/dist/hosting/sql-engine-health/types.d.ts +63 -0
  1015. package/dist/hosting/sql-engine-health/types.d.ts.map +1 -0
  1016. package/dist/hosting/sql-engine-health/types.js +6 -0
  1017. package/dist/hosting/sql-engine-health/types.js.map +1 -0
  1018. package/dist/hosting/sql-engine-switch/grants.d.ts +10 -0
  1019. package/dist/hosting/sql-engine-switch/grants.d.ts.map +1 -0
  1020. package/dist/hosting/sql-engine-switch/grants.js +61 -0
  1021. package/dist/hosting/sql-engine-switch/grants.js.map +1 -0
  1022. package/dist/hosting/sql-engine-switch/index.d.ts +7 -0
  1023. package/dist/hosting/sql-engine-switch/index.d.ts.map +1 -0
  1024. package/dist/hosting/sql-engine-switch/index.js +7 -0
  1025. package/dist/hosting/sql-engine-switch/index.js.map +1 -0
  1026. package/dist/hosting/sql-engine-switch/migrate.d.ts +22 -0
  1027. package/dist/hosting/sql-engine-switch/migrate.d.ts.map +1 -0
  1028. package/dist/hosting/sql-engine-switch/migrate.js +389 -0
  1029. package/dist/hosting/sql-engine-switch/migrate.js.map +1 -0
  1030. package/dist/hosting/sql-engine-switch/mysql-frozen.d.ts +74 -0
  1031. package/dist/hosting/sql-engine-switch/mysql-frozen.d.ts.map +1 -0
  1032. package/dist/hosting/sql-engine-switch/mysql-frozen.js +317 -0
  1033. package/dist/hosting/sql-engine-switch/mysql-frozen.js.map +1 -0
  1034. package/dist/hosting/sql-engine-switch/preview.d.ts +18 -0
  1035. package/dist/hosting/sql-engine-switch/preview.d.ts.map +1 -0
  1036. package/dist/hosting/sql-engine-switch/preview.js +173 -0
  1037. package/dist/hosting/sql-engine-switch/preview.js.map +1 -0
  1038. package/dist/hosting/sql-engine-switch/sql-auth.d.ts +9 -0
  1039. package/dist/hosting/sql-engine-switch/sql-auth.d.ts.map +1 -0
  1040. package/dist/hosting/sql-engine-switch/sql-auth.js +23 -0
  1041. package/dist/hosting/sql-engine-switch/sql-auth.js.map +1 -0
  1042. package/dist/hosting/sql-engine-switch/types.d.ts +51 -0
  1043. package/dist/hosting/sql-engine-switch/types.d.ts.map +1 -0
  1044. package/dist/hosting/sql-engine-switch/types.js +5 -0
  1045. package/dist/hosting/sql-engine-switch/types.js.map +1 -0
  1046. package/dist/hosting/sshd-sftp-snippet.d.ts +35 -0
  1047. package/dist/hosting/sshd-sftp-snippet.d.ts.map +1 -0
  1048. package/dist/hosting/sshd-sftp-snippet.js +135 -0
  1049. package/dist/hosting/sshd-sftp-snippet.js.map +1 -0
  1050. package/dist/hosting/ssl-certs.d.ts +151 -0
  1051. package/dist/hosting/ssl-certs.d.ts.map +1 -0
  1052. package/dist/hosting/ssl-certs.js +462 -0
  1053. package/dist/hosting/ssl-certs.js.map +1 -0
  1054. package/dist/hosting/ssl-le-errors.d.ts +19 -0
  1055. package/dist/hosting/ssl-le-errors.d.ts.map +1 -0
  1056. package/dist/hosting/ssl-le-errors.js +105 -0
  1057. package/dist/hosting/ssl-le-errors.js.map +1 -0
  1058. package/dist/hosting/stack/definitions.d.ts +67 -0
  1059. package/dist/hosting/stack/definitions.d.ts.map +1 -0
  1060. package/dist/hosting/stack/definitions.js +519 -0
  1061. package/dist/hosting/stack/definitions.js.map +1 -0
  1062. package/dist/hosting/stack/index.d.ts +4 -0
  1063. package/dist/hosting/stack/index.d.ts.map +1 -0
  1064. package/dist/hosting/stack/index.js +4 -0
  1065. package/dist/hosting/stack/index.js.map +1 -0
  1066. package/dist/hosting/stack/manifest.d.ts +48 -0
  1067. package/dist/hosting/stack/manifest.d.ts.map +1 -0
  1068. package/dist/hosting/stack/manifest.js +108 -0
  1069. package/dist/hosting/stack/manifest.js.map +1 -0
  1070. package/dist/hosting/stack/ops.d.ts +89 -0
  1071. package/dist/hosting/stack/ops.d.ts.map +1 -0
  1072. package/dist/hosting/stack/ops.js +485 -0
  1073. package/dist/hosting/stack/ops.js.map +1 -0
  1074. package/dist/hosting/system-apply.d.ts +242 -0
  1075. package/dist/hosting/system-apply.d.ts.map +1 -0
  1076. package/dist/hosting/system-apply.js +1148 -0
  1077. package/dist/hosting/system-apply.js.map +1 -0
  1078. package/dist/hosting/temp-db-user.d.ts +75 -0
  1079. package/dist/hosting/temp-db-user.d.ts.map +1 -0
  1080. package/dist/hosting/temp-db-user.js +230 -0
  1081. package/dist/hosting/temp-db-user.js.map +1 -0
  1082. package/dist/hosting/version-discovery.d.ts +59 -0
  1083. package/dist/hosting/version-discovery.d.ts.map +1 -0
  1084. package/dist/hosting/version-discovery.js +599 -0
  1085. package/dist/hosting/version-discovery.js.map +1 -0
  1086. package/dist/hosting/vnc/client-profiles.d.ts +78 -0
  1087. package/dist/hosting/vnc/client-profiles.d.ts.map +1 -0
  1088. package/dist/hosting/vnc/client-profiles.js +251 -0
  1089. package/dist/hosting/vnc/client-profiles.js.map +1 -0
  1090. package/dist/hosting/vnc/index.d.ts +13 -0
  1091. package/dist/hosting/vnc/index.d.ts.map +1 -0
  1092. package/dist/hosting/vnc/index.js +13 -0
  1093. package/dist/hosting/vnc/index.js.map +1 -0
  1094. package/dist/hosting/vnc/linux-user.d.ts +33 -0
  1095. package/dist/hosting/vnc/linux-user.d.ts.map +1 -0
  1096. package/dist/hosting/vnc/linux-user.js +114 -0
  1097. package/dist/hosting/vnc/linux-user.js.map +1 -0
  1098. package/dist/hosting/vnc/novnc.d.ts +89 -0
  1099. package/dist/hosting/vnc/novnc.d.ts.map +1 -0
  1100. package/dist/hosting/vnc/novnc.js +232 -0
  1101. package/dist/hosting/vnc/novnc.js.map +1 -0
  1102. package/dist/hosting/vnc/passwd.d.ts +16 -0
  1103. package/dist/hosting/vnc/passwd.d.ts.map +1 -0
  1104. package/dist/hosting/vnc/passwd.js +41 -0
  1105. package/dist/hosting/vnc/passwd.js.map +1 -0
  1106. package/dist/hosting/vnc/ports.d.ts +12 -0
  1107. package/dist/hosting/vnc/ports.d.ts.map +1 -0
  1108. package/dist/hosting/vnc/ports.js +36 -0
  1109. package/dist/hosting/vnc/ports.js.map +1 -0
  1110. package/dist/hosting/vnc/rfb-probe.d.ts +23 -0
  1111. package/dist/hosting/vnc/rfb-probe.d.ts.map +1 -0
  1112. package/dist/hosting/vnc/rfb-probe.js +95 -0
  1113. package/dist/hosting/vnc/rfb-probe.js.map +1 -0
  1114. package/dist/hosting/vnc/server-session.d.ts +69 -0
  1115. package/dist/hosting/vnc/server-session.d.ts.map +1 -0
  1116. package/dist/hosting/vnc/server-session.js +390 -0
  1117. package/dist/hosting/vnc/server-session.js.map +1 -0
  1118. package/dist/hosting/vnc/service.d.ts +135 -0
  1119. package/dist/hosting/vnc/service.d.ts.map +1 -0
  1120. package/dist/hosting/vnc/service.js +896 -0
  1121. package/dist/hosting/vnc/service.js.map +1 -0
  1122. package/dist/hosting/vnc/session-ticket.d.ts +37 -0
  1123. package/dist/hosting/vnc/session-ticket.d.ts.map +1 -0
  1124. package/dist/hosting/vnc/session-ticket.js +64 -0
  1125. package/dist/hosting/vnc/session-ticket.js.map +1 -0
  1126. package/dist/hosting/vnc/share-links.d.ts +27 -0
  1127. package/dist/hosting/vnc/share-links.d.ts.map +1 -0
  1128. package/dist/hosting/vnc/share-links.js +68 -0
  1129. package/dist/hosting/vnc/share-links.js.map +1 -0
  1130. package/dist/hosting/vnc/types.d.ts +87 -0
  1131. package/dist/hosting/vnc/types.d.ts.map +1 -0
  1132. package/dist/hosting/vnc/types.js +35 -0
  1133. package/dist/hosting/vnc/types.js.map +1 -0
  1134. package/dist/hosting/vnc/xstartup.d.ts +7 -0
  1135. package/dist/hosting/vnc/xstartup.d.ts.map +1 -0
  1136. package/dist/hosting/vnc/xstartup.js +50 -0
  1137. package/dist/hosting/vnc/xstartup.js.map +1 -0
  1138. package/dist/hosting/vpn/access-mode.d.ts +37 -0
  1139. package/dist/hosting/vpn/access-mode.d.ts.map +1 -0
  1140. package/dist/hosting/vpn/access-mode.js +126 -0
  1141. package/dist/hosting/vpn/access-mode.js.map +1 -0
  1142. package/dist/hosting/vpn/client-conf-protect.d.ts +28 -0
  1143. package/dist/hosting/vpn/client-conf-protect.d.ts.map +1 -0
  1144. package/dist/hosting/vpn/client-conf-protect.js +138 -0
  1145. package/dist/hosting/vpn/client-conf-protect.js.map +1 -0
  1146. package/dist/hosting/vpn/endpoint.d.ts +26 -0
  1147. package/dist/hosting/vpn/endpoint.d.ts.map +1 -0
  1148. package/dist/hosting/vpn/endpoint.js +90 -0
  1149. package/dist/hosting/vpn/endpoint.js.map +1 -0
  1150. package/dist/hosting/vpn/index.d.ts +12 -0
  1151. package/dist/hosting/vpn/index.d.ts.map +1 -0
  1152. package/dist/hosting/vpn/index.js +12 -0
  1153. package/dist/hosting/vpn/index.js.map +1 -0
  1154. package/dist/hosting/vpn/monitor.d.ts +141 -0
  1155. package/dist/hosting/vpn/monitor.d.ts.map +1 -0
  1156. package/dist/hosting/vpn/monitor.js +537 -0
  1157. package/dist/hosting/vpn/monitor.js.map +1 -0
  1158. package/dist/hosting/vpn/openvpn-conf.d.ts +34 -0
  1159. package/dist/hosting/vpn/openvpn-conf.d.ts.map +1 -0
  1160. package/dist/hosting/vpn/openvpn-conf.js +89 -0
  1161. package/dist/hosting/vpn/openvpn-conf.js.map +1 -0
  1162. package/dist/hosting/vpn/openvpn-ops.d.ts +72 -0
  1163. package/dist/hosting/vpn/openvpn-ops.d.ts.map +1 -0
  1164. package/dist/hosting/vpn/openvpn-ops.js +500 -0
  1165. package/dist/hosting/vpn/openvpn-ops.js.map +1 -0
  1166. package/dist/hosting/vpn/outline-ops.d.ts +71 -0
  1167. package/dist/hosting/vpn/outline-ops.d.ts.map +1 -0
  1168. package/dist/hosting/vpn/outline-ops.js +321 -0
  1169. package/dist/hosting/vpn/outline-ops.js.map +1 -0
  1170. package/dist/hosting/vpn/ports.d.ts +10 -0
  1171. package/dist/hosting/vpn/ports.d.ts.map +1 -0
  1172. package/dist/hosting/vpn/ports.js +48 -0
  1173. package/dist/hosting/vpn/ports.js.map +1 -0
  1174. package/dist/hosting/vpn/service.d.ts +114 -0
  1175. package/dist/hosting/vpn/service.d.ts.map +1 -0
  1176. package/dist/hosting/vpn/service.js +786 -0
  1177. package/dist/hosting/vpn/service.js.map +1 -0
  1178. package/dist/hosting/vpn/types.d.ts +66 -0
  1179. package/dist/hosting/vpn/types.d.ts.map +1 -0
  1180. package/dist/hosting/vpn/types.js +10 -0
  1181. package/dist/hosting/vpn/types.js.map +1 -0
  1182. package/dist/hosting/vpn/wireguard-conf.d.ts +31 -0
  1183. package/dist/hosting/vpn/wireguard-conf.d.ts.map +1 -0
  1184. package/dist/hosting/vpn/wireguard-conf.js +69 -0
  1185. package/dist/hosting/vpn/wireguard-conf.js.map +1 -0
  1186. package/dist/hosting/web-stats.d.ts +53 -0
  1187. package/dist/hosting/web-stats.d.ts.map +1 -0
  1188. package/dist/hosting/web-stats.js +177 -0
  1189. package/dist/hosting/web-stats.js.map +1 -0
  1190. package/dist/hosting/web-ui-build.d.ts +44 -0
  1191. package/dist/hosting/web-ui-build.d.ts.map +1 -0
  1192. package/dist/hosting/web-ui-build.js +297 -0
  1193. package/dist/hosting/web-ui-build.js.map +1 -0
  1194. package/dist/hosting/wizard.d.ts +43 -0
  1195. package/dist/hosting/wizard.d.ts.map +1 -0
  1196. package/dist/hosting/wizard.js +158 -0
  1197. package/dist/hosting/wizard.js.map +1 -0
  1198. package/dist/hosting/wordpress-download.d.ts +26 -0
  1199. package/dist/hosting/wordpress-download.d.ts.map +1 -0
  1200. package/dist/hosting/wordpress-download.js +70 -0
  1201. package/dist/hosting/wordpress-download.js.map +1 -0
  1202. package/dist/hosting/wordpress-setup.d.ts +40 -0
  1203. package/dist/hosting/wordpress-setup.d.ts.map +1 -0
  1204. package/dist/hosting/wordpress-setup.js +150 -0
  1205. package/dist/hosting/wordpress-setup.js.map +1 -0
  1206. package/dist/index.d.ts +19 -0
  1207. package/dist/index.d.ts.map +1 -0
  1208. package/dist/index.js +19 -0
  1209. package/dist/index.js.map +1 -0
  1210. package/dist/llm/gateway.d.ts +61 -0
  1211. package/dist/llm/gateway.d.ts.map +1 -0
  1212. package/dist/llm/gateway.js +98 -0
  1213. package/dist/llm/gateway.js.map +1 -0
  1214. package/dist/llm/http-transport.d.ts +6 -0
  1215. package/dist/llm/http-transport.d.ts.map +1 -0
  1216. package/dist/llm/http-transport.js +52 -0
  1217. package/dist/llm/http-transport.js.map +1 -0
  1218. package/dist/llm/index.d.ts +3 -0
  1219. package/dist/llm/index.d.ts.map +1 -0
  1220. package/dist/llm/index.js +3 -0
  1221. package/dist/llm/index.js.map +1 -0
  1222. package/dist/monitoring/index.d.ts +7 -0
  1223. package/dist/monitoring/index.d.ts.map +1 -0
  1224. package/dist/monitoring/index.js +7 -0
  1225. package/dist/monitoring/index.js.map +1 -0
  1226. package/dist/monitoring/metrics.d.ts +26 -0
  1227. package/dist/monitoring/metrics.d.ts.map +1 -0
  1228. package/dist/monitoring/metrics.js +144 -0
  1229. package/dist/monitoring/metrics.js.map +1 -0
  1230. package/dist/monitoring/notifications.d.ts +29 -0
  1231. package/dist/monitoring/notifications.d.ts.map +1 -0
  1232. package/dist/monitoring/notifications.js +337 -0
  1233. package/dist/monitoring/notifications.js.map +1 -0
  1234. package/dist/monitoring/process-signal.d.ts +78 -0
  1235. package/dist/monitoring/process-signal.d.ts.map +1 -0
  1236. package/dist/monitoring/process-signal.js +289 -0
  1237. package/dist/monitoring/process-signal.js.map +1 -0
  1238. package/dist/monitoring/process-snapshot.d.ts +21 -0
  1239. package/dist/monitoring/process-snapshot.d.ts.map +1 -0
  1240. package/dist/monitoring/process-snapshot.js +219 -0
  1241. package/dist/monitoring/process-snapshot.js.map +1 -0
  1242. package/dist/monitoring/project-usage.d.ts +45 -0
  1243. package/dist/monitoring/project-usage.d.ts.map +1 -0
  1244. package/dist/monitoring/project-usage.js +75 -0
  1245. package/dist/monitoring/project-usage.js.map +1 -0
  1246. package/dist/monitoring/top-snapshot.d.ts +47 -0
  1247. package/dist/monitoring/top-snapshot.d.ts.map +1 -0
  1248. package/dist/monitoring/top-snapshot.js +245 -0
  1249. package/dist/monitoring/top-snapshot.js.map +1 -0
  1250. package/dist/net/index.d.ts +7 -0
  1251. package/dist/net/index.d.ts.map +1 -0
  1252. package/dist/net/index.js +7 -0
  1253. package/dist/net/index.js.map +1 -0
  1254. package/dist/net/ip.d.ts +41 -0
  1255. package/dist/net/ip.d.ts.map +1 -0
  1256. package/dist/net/ip.js +326 -0
  1257. package/dist/net/ip.js.map +1 -0
  1258. package/dist/net/network-apply.d.ts +73 -0
  1259. package/dist/net/network-apply.d.ts.map +1 -0
  1260. package/dist/net/network-apply.js +712 -0
  1261. package/dist/net/network-apply.js.map +1 -0
  1262. package/dist/net/network-parse.d.ts +27 -0
  1263. package/dist/net/network-parse.d.ts.map +1 -0
  1264. package/dist/net/network-parse.js +162 -0
  1265. package/dist/net/network-parse.js.map +1 -0
  1266. package/dist/net/network-snapshot.d.ts +9 -0
  1267. package/dist/net/network-snapshot.d.ts.map +1 -0
  1268. package/dist/net/network-snapshot.js +241 -0
  1269. package/dist/net/network-snapshot.js.map +1 -0
  1270. package/dist/net/network-types.d.ts +107 -0
  1271. package/dist/net/network-types.d.ts.map +1 -0
  1272. package/dist/net/network-types.js +5 -0
  1273. package/dist/net/network-types.js.map +1 -0
  1274. package/dist/net/ssrf.d.ts +25 -0
  1275. package/dist/net/ssrf.d.ts.map +1 -0
  1276. package/dist/net/ssrf.js +127 -0
  1277. package/dist/net/ssrf.js.map +1 -0
  1278. package/dist/repositories/approval-repo.d.ts +13 -0
  1279. package/dist/repositories/approval-repo.d.ts.map +1 -0
  1280. package/dist/repositories/approval-repo.js +29 -0
  1281. package/dist/repositories/approval-repo.js.map +1 -0
  1282. package/dist/repositories/audit-repo.d.ts +21 -0
  1283. package/dist/repositories/audit-repo.d.ts.map +1 -0
  1284. package/dist/repositories/audit-repo.js +39 -0
  1285. package/dist/repositories/audit-repo.js.map +1 -0
  1286. package/dist/repositories/index.d.ts +7 -0
  1287. package/dist/repositories/index.d.ts.map +1 -0
  1288. package/dist/repositories/index.js +7 -0
  1289. package/dist/repositories/index.js.map +1 -0
  1290. package/dist/repositories/project-repo.d.ts +19 -0
  1291. package/dist/repositories/project-repo.d.ts.map +1 -0
  1292. package/dist/repositories/project-repo.js +142 -0
  1293. package/dist/repositories/project-repo.js.map +1 -0
  1294. package/dist/repositories/session-repo.d.ts +37 -0
  1295. package/dist/repositories/session-repo.d.ts.map +1 -0
  1296. package/dist/repositories/session-repo.js +141 -0
  1297. package/dist/repositories/session-repo.js.map +1 -0
  1298. package/dist/repositories/settings-repo.d.ts +10 -0
  1299. package/dist/repositories/settings-repo.d.ts.map +1 -0
  1300. package/dist/repositories/settings-repo.js +23 -0
  1301. package/dist/repositories/settings-repo.js.map +1 -0
  1302. package/dist/repositories/user-repo.d.ts +21 -0
  1303. package/dist/repositories/user-repo.d.ts.map +1 -0
  1304. package/dist/repositories/user-repo.js +104 -0
  1305. package/dist/repositories/user-repo.js.map +1 -0
  1306. package/dist/security/allowlist.d.ts +40 -0
  1307. package/dist/security/allowlist.d.ts.map +1 -0
  1308. package/dist/security/allowlist.js +167 -0
  1309. package/dist/security/allowlist.js.map +1 -0
  1310. package/dist/security/api-keys.d.ts +40 -0
  1311. package/dist/security/api-keys.d.ts.map +1 -0
  1312. package/dist/security/api-keys.js +99 -0
  1313. package/dist/security/api-keys.js.map +1 -0
  1314. package/dist/security/approval.d.ts +37 -0
  1315. package/dist/security/approval.d.ts.map +1 -0
  1316. package/dist/security/approval.js +152 -0
  1317. package/dist/security/approval.js.map +1 -0
  1318. package/dist/security/capabilities-enforce.d.ts +18 -0
  1319. package/dist/security/capabilities-enforce.d.ts.map +1 -0
  1320. package/dist/security/capabilities-enforce.js +29 -0
  1321. package/dist/security/capabilities-enforce.js.map +1 -0
  1322. package/dist/security/index.d.ts +14 -0
  1323. package/dist/security/index.d.ts.map +1 -0
  1324. package/dist/security/index.js +14 -0
  1325. package/dist/security/index.js.map +1 -0
  1326. package/dist/security/mfa/backup-export.d.ts +30 -0
  1327. package/dist/security/mfa/backup-export.d.ts.map +1 -0
  1328. package/dist/security/mfa/backup-export.js +57 -0
  1329. package/dist/security/mfa/backup-export.js.map +1 -0
  1330. package/dist/security/mfa/fail2ban-jails.d.ts +10 -0
  1331. package/dist/security/mfa/fail2ban-jails.d.ts.map +1 -0
  1332. package/dist/security/mfa/fail2ban-jails.js +71 -0
  1333. package/dist/security/mfa/fail2ban-jails.js.map +1 -0
  1334. package/dist/security/mfa/index.d.ts +9 -0
  1335. package/dist/security/mfa/index.d.ts.map +1 -0
  1336. package/dist/security/mfa/index.js +9 -0
  1337. package/dist/security/mfa/index.js.map +1 -0
  1338. package/dist/security/mfa/rate-limit.d.ts +30 -0
  1339. package/dist/security/mfa/rate-limit.d.ts.map +1 -0
  1340. package/dist/security/mfa/rate-limit.js +90 -0
  1341. package/dist/security/mfa/rate-limit.js.map +1 -0
  1342. package/dist/security/mfa/recovery-codes.d.ts +10 -0
  1343. package/dist/security/mfa/recovery-codes.d.ts.map +1 -0
  1344. package/dist/security/mfa/recovery-codes.js +38 -0
  1345. package/dist/security/mfa/recovery-codes.js.map +1 -0
  1346. package/dist/security/mfa/remember-device.d.ts +34 -0
  1347. package/dist/security/mfa/remember-device.d.ts.map +1 -0
  1348. package/dist/security/mfa/remember-device.js +112 -0
  1349. package/dist/security/mfa/remember-device.js.map +1 -0
  1350. package/dist/security/mfa/step-up.d.ts +9 -0
  1351. package/dist/security/mfa/step-up.d.ts.map +1 -0
  1352. package/dist/security/mfa/step-up.js +25 -0
  1353. package/dist/security/mfa/step-up.js.map +1 -0
  1354. package/dist/security/mfa/totp-crypto.d.ts +13 -0
  1355. package/dist/security/mfa/totp-crypto.d.ts.map +1 -0
  1356. package/dist/security/mfa/totp-crypto.js +29 -0
  1357. package/dist/security/mfa/totp-crypto.js.map +1 -0
  1358. package/dist/security/mfa/webauthn.d.ts +69 -0
  1359. package/dist/security/mfa/webauthn.d.ts.map +1 -0
  1360. package/dist/security/mfa/webauthn.js +178 -0
  1361. package/dist/security/mfa/webauthn.js.map +1 -0
  1362. package/dist/security/operation-level.d.ts +14 -0
  1363. package/dist/security/operation-level.d.ts.map +1 -0
  1364. package/dist/security/operation-level.js +39 -0
  1365. package/dist/security/operation-level.js.map +1 -0
  1366. package/dist/security/password-policy.d.ts +22 -0
  1367. package/dist/security/password-policy.d.ts.map +1 -0
  1368. package/dist/security/password-policy.js +50 -0
  1369. package/dist/security/password-policy.js.map +1 -0
  1370. package/dist/security/rbac.d.ts +18 -0
  1371. package/dist/security/rbac.d.ts.map +1 -0
  1372. package/dist/security/rbac.js +58 -0
  1373. package/dist/security/rbac.js.map +1 -0
  1374. package/dist/security/sandbox.d.ts +34 -0
  1375. package/dist/security/sandbox.d.ts.map +1 -0
  1376. package/dist/security/sandbox.js +62 -0
  1377. package/dist/security/sandbox.js.map +1 -0
  1378. package/dist/security/ssh-2fa/index.d.ts +4 -0
  1379. package/dist/security/ssh-2fa/index.d.ts.map +1 -0
  1380. package/dist/security/ssh-2fa/index.js +4 -0
  1381. package/dist/security/ssh-2fa/index.js.map +1 -0
  1382. package/dist/security/ssh-2fa/install.d.ts +93 -0
  1383. package/dist/security/ssh-2fa/install.d.ts.map +1 -0
  1384. package/dist/security/ssh-2fa/install.js +457 -0
  1385. package/dist/security/ssh-2fa/install.js.map +1 -0
  1386. package/dist/security/ssh-2fa/store.d.ts +44 -0
  1387. package/dist/security/ssh-2fa/store.d.ts.map +1 -0
  1388. package/dist/security/ssh-2fa/store.js +209 -0
  1389. package/dist/security/ssh-2fa/store.js.map +1 -0
  1390. package/dist/security/ssh-2fa/types.d.ts +33 -0
  1391. package/dist/security/ssh-2fa/types.d.ts.map +1 -0
  1392. package/dist/security/ssh-2fa/types.js +9 -0
  1393. package/dist/security/ssh-2fa/types.js.map +1 -0
  1394. package/dist/security/ssh-identity/crypto.d.ts +24 -0
  1395. package/dist/security/ssh-identity/crypto.d.ts.map +1 -0
  1396. package/dist/security/ssh-identity/crypto.js +109 -0
  1397. package/dist/security/ssh-identity/crypto.js.map +1 -0
  1398. package/dist/security/ssh-identity/generate.d.ts +18 -0
  1399. package/dist/security/ssh-identity/generate.d.ts.map +1 -0
  1400. package/dist/security/ssh-identity/generate.js +102 -0
  1401. package/dist/security/ssh-identity/generate.js.map +1 -0
  1402. package/dist/security/ssh-identity/index.d.ts +7 -0
  1403. package/dist/security/ssh-identity/index.d.ts.map +1 -0
  1404. package/dist/security/ssh-identity/index.js +7 -0
  1405. package/dist/security/ssh-identity/index.js.map +1 -0
  1406. package/dist/security/ssh-identity/install.d.ts +37 -0
  1407. package/dist/security/ssh-identity/install.d.ts.map +1 -0
  1408. package/dist/security/ssh-identity/install.js +281 -0
  1409. package/dist/security/ssh-identity/install.js.map +1 -0
  1410. package/dist/security/ssh-identity/ops.d.ts +77 -0
  1411. package/dist/security/ssh-identity/ops.d.ts.map +1 -0
  1412. package/dist/security/ssh-identity/ops.js +244 -0
  1413. package/dist/security/ssh-identity/ops.js.map +1 -0
  1414. package/dist/security/ssh-identity/store.d.ts +51 -0
  1415. package/dist/security/ssh-identity/store.d.ts.map +1 -0
  1416. package/dist/security/ssh-identity/store.js +240 -0
  1417. package/dist/security/ssh-identity/store.js.map +1 -0
  1418. package/dist/security/ssh-identity/types.d.ts +43 -0
  1419. package/dist/security/ssh-identity/types.d.ts.map +1 -0
  1420. package/dist/security/ssh-identity/types.js +9 -0
  1421. package/dist/security/ssh-identity/types.js.map +1 -0
  1422. package/dist/security/tool-executor.d.ts +39 -0
  1423. package/dist/security/tool-executor.d.ts.map +1 -0
  1424. package/dist/security/tool-executor.js +271 -0
  1425. package/dist/security/tool-executor.js.map +1 -0
  1426. package/dist/security/totp.d.ts +15 -0
  1427. package/dist/security/totp.d.ts.map +1 -0
  1428. package/dist/security/totp.js +97 -0
  1429. package/dist/security/totp.js.map +1 -0
  1430. package/dist/services/ai-task-service.d.ts +35 -0
  1431. package/dist/services/ai-task-service.d.ts.map +1 -0
  1432. package/dist/services/ai-task-service.js +208 -0
  1433. package/dist/services/ai-task-service.js.map +1 -0
  1434. package/dist/services/auth.d.ts +126 -0
  1435. package/dist/services/auth.d.ts.map +1 -0
  1436. package/dist/services/auth.js +705 -0
  1437. package/dist/services/auth.js.map +1 -0
  1438. package/dist/services/index.d.ts +9 -0
  1439. package/dist/services/index.d.ts.map +1 -0
  1440. package/dist/services/index.js +9 -0
  1441. package/dist/services/index.js.map +1 -0
  1442. package/dist/services/list-filter.d.ts +24 -0
  1443. package/dist/services/list-filter.d.ts.map +1 -0
  1444. package/dist/services/list-filter.js +90 -0
  1445. package/dist/services/list-filter.js.map +1 -0
  1446. package/dist/services/protection-probe.d.ts +31 -0
  1447. package/dist/services/protection-probe.d.ts.map +1 -0
  1448. package/dist/services/protection-probe.js +97 -0
  1449. package/dist/services/protection-probe.js.map +1 -0
  1450. package/dist/services/protection.d.ts +23 -0
  1451. package/dist/services/protection.d.ts.map +1 -0
  1452. package/dist/services/protection.js +51 -0
  1453. package/dist/services/protection.js.map +1 -0
  1454. package/dist/services/rbac-policy.d.ts +95 -0
  1455. package/dist/services/rbac-policy.d.ts.map +1 -0
  1456. package/dist/services/rbac-policy.js +260 -0
  1457. package/dist/services/rbac-policy.js.map +1 -0
  1458. package/dist/services/scheduler.d.ts +35 -0
  1459. package/dist/services/scheduler.d.ts.map +1 -0
  1460. package/dist/services/scheduler.js +124 -0
  1461. package/dist/services/scheduler.js.map +1 -0
  1462. package/dist/services/users-admin.d.ts +64 -0
  1463. package/dist/services/users-admin.d.ts.map +1 -0
  1464. package/dist/services/users-admin.js +249 -0
  1465. package/dist/services/users-admin.js.map +1 -0
  1466. package/dist/skills/index.d.ts +3 -0
  1467. package/dist/skills/index.d.ts.map +1 -0
  1468. package/dist/skills/index.js +3 -0
  1469. package/dist/skills/index.js.map +1 -0
  1470. package/dist/skills/playbooks.d.ts +32 -0
  1471. package/dist/skills/playbooks.d.ts.map +1 -0
  1472. package/dist/skills/playbooks.js +164 -0
  1473. package/dist/skills/playbooks.js.map +1 -0
  1474. package/dist/skills/task-planner.d.ts +74 -0
  1475. package/dist/skills/task-planner.d.ts.map +1 -0
  1476. package/dist/skills/task-planner.js +172 -0
  1477. package/dist/skills/task-planner.js.map +1 -0
  1478. package/dist/terminal/index.d.ts +4 -0
  1479. package/dist/terminal/index.d.ts.map +1 -0
  1480. package/dist/terminal/index.js +4 -0
  1481. package/dist/terminal/index.js.map +1 -0
  1482. package/dist/terminal/spawn-plan.d.ts +30 -0
  1483. package/dist/terminal/spawn-plan.d.ts.map +1 -0
  1484. package/dist/terminal/spawn-plan.js +63 -0
  1485. package/dist/terminal/spawn-plan.js.map +1 -0
  1486. package/dist/terminal/targets.d.ts +39 -0
  1487. package/dist/terminal/targets.d.ts.map +1 -0
  1488. package/dist/terminal/targets.js +51 -0
  1489. package/dist/terminal/targets.js.map +1 -0
  1490. package/dist/terminal/tickets.d.ts +34 -0
  1491. package/dist/terminal/tickets.d.ts.map +1 -0
  1492. package/dist/terminal/tickets.js +64 -0
  1493. package/dist/terminal/tickets.js.map +1 -0
  1494. package/dist/test/host.d.ts +11 -0
  1495. package/dist/test/host.d.ts.map +1 -0
  1496. package/dist/test/host.js +25 -0
  1497. package/dist/test/host.js.map +1 -0
  1498. package/dist/update/advisor.d.ts +39 -0
  1499. package/dist/update/advisor.d.ts.map +1 -0
  1500. package/dist/update/advisor.js +117 -0
  1501. package/dist/update/advisor.js.map +1 -0
  1502. package/dist/update/index.d.ts +7 -0
  1503. package/dist/update/index.d.ts.map +1 -0
  1504. package/dist/update/index.js +7 -0
  1505. package/dist/update/index.js.map +1 -0
  1506. package/dist/update/inventory.d.ts +40 -0
  1507. package/dist/update/inventory.d.ts.map +1 -0
  1508. package/dist/update/inventory.js +182 -0
  1509. package/dist/update/inventory.js.map +1 -0
  1510. package/dist/update/package-apply.d.ts +74 -0
  1511. package/dist/update/package-apply.d.ts.map +1 -0
  1512. package/dist/update/package-apply.js +188 -0
  1513. package/dist/update/package-apply.js.map +1 -0
  1514. package/dist/update/self-update-apply.d.ts +112 -0
  1515. package/dist/update/self-update-apply.d.ts.map +1 -0
  1516. package/dist/update/self-update-apply.js +437 -0
  1517. package/dist/update/self-update-apply.js.map +1 -0
  1518. package/dist/update/self-update.d.ts +33 -0
  1519. package/dist/update/self-update.d.ts.map +1 -0
  1520. package/dist/update/self-update.js +88 -0
  1521. package/dist/update/self-update.js.map +1 -0
  1522. package/dist/update/summary.d.ts +35 -0
  1523. package/dist/update/summary.d.ts.map +1 -0
  1524. package/dist/update/summary.js +88 -0
  1525. package/dist/update/summary.js.map +1 -0
  1526. package/package.json +54 -0
@@ -0,0 +1,1872 @@
1
+ import { tl } from 'ysk-server-shared';
2
+ /**
3
+ * Probe multi-version runtimes on the host + managed install plans.
4
+ * Never fakes install success — package installs need root + YSK_EXECUTE.
5
+ */
6
+ import { mkdirSync, writeFileSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import { listSupportedRuntimes, selectBunRuntime, selectGoRuntime, selectJavaRuntime, selectKotlinRuntime, selectNodeRuntime, selectPhpRuntime, selectPythonRuntime, selectRustRuntime, } from './runtime.js';
9
+ import { resolvePhpAptPackages } from './php-extensions.js';
10
+ import { buildRuntimePluginScriptLines } from './runtime-plugins.js';
11
+ import { resolveBin, shellBinExists, shellResolveBin } from './software-probe/index.js';
12
+ import { getCachedRuntimeVersionPins } from './version-discovery.js';
13
+ import { withHostMutatingJob } from '../host/host-job.js';
14
+ /** Managed Go roots: /usr/local/ysk/go/<minor>/bin/go */
15
+ async function probeGoVersions(host, versions, hostDefault) {
16
+ const out = [];
17
+ // Resolve active go on PATH
18
+ let activeMinor;
19
+ if (hostDefault) {
20
+ const m = hostDefault.match(/go(\d+\.\d+)/);
21
+ if (m)
22
+ activeMinor = m[1];
23
+ }
24
+ // Dedup by minor pin (1.26.5 and 1.26 → one slot under /usr/local/ysk/go/1.26)
25
+ const minorPins = [
26
+ ...new Set(versions
27
+ .map((v) => v.replace(/^go/i, '').match(/^(\d+\.\d+)/)?.[1] ?? '')
28
+ .filter(Boolean)),
29
+ ];
30
+ for (const minor of minorPins) {
31
+ const plan = selectGoRuntime(minor);
32
+ let available = false;
33
+ let resolvedPath;
34
+ let versionOutput;
35
+ const notes = [];
36
+ // Prefer managed multi-version path
37
+ if (host.pathExists(plan.binaryPath)) {
38
+ const ver = await host.runCommand([plan.binaryPath, 'version'], { timeoutMs: 8_000 });
39
+ if (ver.exitCode === 0) {
40
+ available = true;
41
+ resolvedPath = plan.binaryPath;
42
+ versionOutput = (ver.stdout || ver.stderr).trim().split('\n')[0];
43
+ }
44
+ }
45
+ // Host default only counts as this minor when version string matches
46
+ if (!available &&
47
+ hostDefault &&
48
+ (hostDefault.includes(`go${minor}`) ||
49
+ new RegExp(`\\bgo?${minor.replace('.', '\\.')}(?:\\.|\\s|$)`).test(hostDefault))) {
50
+ available = true;
51
+ versionOutput = hostDefault;
52
+ notes.push(tl('notes.auto.n1302'));
53
+ }
54
+ if (!available)
55
+ notes.push(tl('notes.auto.t0395', { v0: plan.binaryPath }));
56
+ const active = Boolean(available && activeMinor === minor);
57
+ out.push({
58
+ kind: 'go',
59
+ version: minor,
60
+ binaryPath: plan.binaryPath,
61
+ available,
62
+ active,
63
+ resolvedPath,
64
+ versionOutput,
65
+ notes,
66
+ });
67
+ }
68
+ // If only one available and PATH matches that install, mark active
69
+ const avail = out.filter((i) => i.available);
70
+ if (avail.length === 1 && hostDefault && !out.some((i) => i.active)) {
71
+ avail[0].active = true;
72
+ }
73
+ return out;
74
+ }
75
+ /**
76
+ * Parse `rustup toolchain list` lines into toolchain ids + default.
77
+ * Examples: "stable-x86_64-unknown-linux-gnu (default)", "1.78.0-x86_64-..."
78
+ */
79
+ export function parseRustupToolchainList(text) {
80
+ const ids = [];
81
+ let defaultId;
82
+ for (const raw of text.split(/\r?\n/)) {
83
+ const line = raw.trim();
84
+ if (!line || line.startsWith('YSK_') || line.startsWith('#'))
85
+ continue;
86
+ // skip cargo version lines
87
+ if (/^cargo\s+/i.test(line))
88
+ continue;
89
+ const def = /\(default\)/i.test(line);
90
+ const id = line.replace(/\s*\(default\)\s*/i, '').trim().split(/\s+/)[0] ?? '';
91
+ if (!id || !/^[a-zA-Z0-9._-]+$/.test(id))
92
+ continue;
93
+ if (!ids.includes(id))
94
+ ids.push(id);
95
+ if (def)
96
+ defaultId = id;
97
+ }
98
+ return { ids, defaultId };
99
+ }
100
+ /** Whether panel pin (stable | 1.78) is present in rustup toolchain ids. */
101
+ export function rustPanelVersionInstalled(panelVer, toolchainIds) {
102
+ const v = panelVer.trim().toLowerCase();
103
+ if (!v)
104
+ return false;
105
+ if (v === 'stable') {
106
+ return toolchainIds.some((id) => id === 'stable' || id.startsWith('stable-'));
107
+ }
108
+ // 1.78 → 1.78, 1.78.0-x86_64-..., 1.78-x86_64-...
109
+ return toolchainIds.some((id) => {
110
+ const base = id.split('-')[0] ?? id;
111
+ return base === v || base.startsWith(`${v}.`);
112
+ });
113
+ }
114
+ export function rustPanelVersionIsDefault(panelVer, defaultId) {
115
+ if (!defaultId)
116
+ return false;
117
+ const v = panelVer.trim().toLowerCase();
118
+ const d = defaultId.toLowerCase();
119
+ if (v === 'stable')
120
+ return d === 'stable' || d.startsWith('stable-');
121
+ const base = d.split('-')[0] ?? d;
122
+ return base === v || base.startsWith(`${v}.`);
123
+ }
124
+ /**
125
+ * Managed rustup: list installed toolchains; stable + minor pins can coexist.
126
+ * Scans new layout, legacy single-dir layout, and verifies with `rustup run`.
127
+ */
128
+ async function probeRustVersions(host, versions, hostDefault) {
129
+ // Probe both current layout and legacy RUSTUP_HOME=/usr/local/ysk/rust (pre-split)
130
+ const shell = [
131
+ 'set +e',
132
+ 'export PATH="/usr/local/ysk/rust/cargo/bin:/usr/local/ysk/rust/bin:/usr/local/ysk/rust/rustup/bin:$HOME/.cargo/bin:$PATH"',
133
+ 'RU=""',
134
+ 'for c in /usr/local/ysk/rust/cargo/bin/rustup /usr/local/ysk/rust/bin/rustup /usr/local/ysk/rust/rustup/bin/rustup; do',
135
+ ' [ -x "$c" ] && RU="$c" && break',
136
+ 'done',
137
+ '[ -z "$RU" ] && RU=$(command -v rustup 2>/dev/null || true)',
138
+ 'echo "YSK_RUSTUP=${RU:-}"',
139
+ // Collect toolchains from every known RUSTUP_HOME (install may have used either layout)
140
+ 'echo "YSK_TOOLCHAIN_LIST_BEGIN"',
141
+ 'if [ -n "$RU" ]; then',
142
+ ' for RH in /usr/local/ysk/rust/rustup /usr/local/ysk/rust "$HOME/.rustup"; do',
143
+ ' [ -d "$RH" ] || continue',
144
+ ' export RUSTUP_HOME="$RH"',
145
+ ' # Prefer matching CARGO_HOME next to managed tree',
146
+ ' if [ "$RH" = /usr/local/ysk/rust/rustup ]; then export CARGO_HOME=/usr/local/ysk/rust/cargo',
147
+ ' elif [ "$RH" = /usr/local/ysk/rust ]; then export CARGO_HOME=/usr/local/ysk/rust',
148
+ ' else export CARGO_HOME="${CARGO_HOME:-$HOME/.cargo}"; fi',
149
+ ' echo "YSK_RH=$RH"',
150
+ ' "$RU" toolchain list 2>/dev/null',
151
+ ' echo -n "YSK_DEFAULT_FOR_RH="',
152
+ ' "$RU" show active-toolchain 2>/dev/null | head -1',
153
+ ' echo',
154
+ ' # Directory scan (authoritative when rustup list is empty/wrong home)',
155
+ ' if [ -d "$RH/toolchains" ]; then',
156
+ ' for d in "$RH/toolchains"/*; do',
157
+ ' [ -d "$d" ] || continue',
158
+ ' echo "YSK_DIR_TC=$(basename "$d")"',
159
+ ' done',
160
+ ' fi',
161
+ ' done',
162
+ 'fi',
163
+ 'echo "YSK_TOOLCHAIN_LIST_END"',
164
+ // Per-panel-version verify via rustup run (works even if not default)
165
+ 'if [ -n "$RU" ]; then',
166
+ ` for TC in ${versions.map((v) => JSON.stringify(v)).join(' ')}; do`,
167
+ ' echo -n "YSK_RUN_${TC}="',
168
+ ' ok=""',
169
+ ' for RH in /usr/local/ysk/rust/rustup /usr/local/ysk/rust "$HOME/.rustup"; do',
170
+ ' [ -d "$RH" ] || continue',
171
+ ' export RUSTUP_HOME="$RH"',
172
+ ' if [ "$RH" = /usr/local/ysk/rust/rustup ]; then export CARGO_HOME=/usr/local/ysk/rust/cargo',
173
+ ' elif [ "$RH" = /usr/local/ysk/rust ]; then export CARGO_HOME=/usr/local/ysk/rust',
174
+ ' else export CARGO_HOME="${CARGO_HOME:-$HOME/.cargo}"; fi',
175
+ ' out=$("$RU" run "$TC" cargo --version 2>/dev/null) && { ok="$out"; break; }',
176
+ ' done',
177
+ ' echo "$ok"',
178
+ ' done',
179
+ 'fi',
180
+ 'command -v cargo >/dev/null 2>&1 && echo "YSK_PATH_CARGO=$(cargo --version 2>/dev/null)"',
181
+ ].join('\n');
182
+ let listOut = '';
183
+ try {
184
+ const r = await host.runCommand(['bash', '-c', shell], { timeoutMs: 45_000 });
185
+ listOut = `${r.stdout || ''}\n${r.stderr || ''}`;
186
+ }
187
+ catch {
188
+ listOut = '';
189
+ }
190
+ const listMatch = listOut.match(/YSK_TOOLCHAIN_LIST_BEGIN\r?\n([\s\S]*?)\r?\nYSK_TOOLCHAIN_LIST_END/);
191
+ const block = listMatch?.[1] ?? listOut;
192
+ const parsed = parseRustupToolchainList(block);
193
+ // Also fold YSK_DIR_TC= lines
194
+ for (const line of block.split(/\r?\n/)) {
195
+ const m = line.trim().match(/^YSK_DIR_TC=(.+)$/);
196
+ if (m?.[1] && !parsed.ids.includes(m[1]))
197
+ parsed.ids.push(m[1]);
198
+ }
199
+ // Default from first YSK_DEFAULT_FOR_RH= with content, or (default) in list
200
+ const defaultFromRh = [...block.matchAll(/YSK_DEFAULT_FOR_RH=(.+)/g)]
201
+ .map((m) => m[1]?.trim())
202
+ .find((s) => s && s.length > 0);
203
+ if (defaultFromRh)
204
+ parsed.defaultId = defaultFromRh.split(/\s+/)[0];
205
+ // rustup run results for panel pins
206
+ const runOk = new Map();
207
+ for (const v of versions) {
208
+ const key = v === 'stable' ? 'stable' : v;
209
+ // Match YSK_RUN_1.78=... (dot in name)
210
+ const re = new RegExp(`YSK_RUN_${key.replace(/\./g, '\\.')}=(.+)`);
211
+ const m = listOut.match(re);
212
+ const val = m?.[1]?.trim();
213
+ if (val && /cargo\s+\d/i.test(val))
214
+ runOk.set(v, val);
215
+ }
216
+ const out = [];
217
+ for (const v of versions) {
218
+ const plan = selectRustRuntime(v);
219
+ let available = rustPanelVersionInstalled(v, parsed.ids) || runOk.has(v);
220
+ let versionOutput = runOk.get(v);
221
+ const notes = [];
222
+ // PATH cargo → only attribute to default toolchain (or stable if unknown)
223
+ if (!available && hostDefault && /cargo\s+\d/i.test(hostDefault)) {
224
+ if (rustPanelVersionIsDefault(v, parsed.defaultId) || (v === 'stable' && !parsed.defaultId && parsed.ids.length === 0)) {
225
+ available = true;
226
+ versionOutput = hostDefault;
227
+ notes.push(tl('notes.auto.n1302'));
228
+ }
229
+ }
230
+ if (available && !versionOutput) {
231
+ versionOutput =
232
+ v === 'stable' && hostDefault
233
+ ? hostDefault
234
+ : `toolchain ${v}${parsed.ids.find((id) => rustPanelVersionInstalled(v, [id])) ? ` (${parsed.ids.find((id) => rustPanelVersionInstalled(v, [id]))})` : ''}`;
235
+ }
236
+ if (!available)
237
+ notes.push(tl('notes.auto.t0395', { v0: plan.binaryPath }));
238
+ out.push({
239
+ kind: 'rust',
240
+ version: v,
241
+ binaryPath: plan.binaryPath,
242
+ available,
243
+ active: available && rustPanelVersionIsDefault(v, parsed.defaultId),
244
+ versionOutput,
245
+ notes,
246
+ });
247
+ }
248
+ // PATH-only cargo (no rustup homes): mark stable only
249
+ if (!out.some((i) => i.available) && hostDefault && /cargo\s+\d/i.test(hostDefault)) {
250
+ const stable = out.find((i) => i.version === 'stable');
251
+ if (stable) {
252
+ stable.available = true;
253
+ stable.active = true;
254
+ stable.versionOutput = hostDefault;
255
+ stable.notes = [tl('notes.auto.n1302')];
256
+ }
257
+ }
258
+ const avail = out.filter((i) => i.available);
259
+ if (avail.length === 1 && !out.some((i) => i.active))
260
+ avail[0].active = true;
261
+ // Prefer explicit default over heuristic
262
+ if (parsed.defaultId) {
263
+ for (const i of out) {
264
+ i.active = i.available && rustPanelVersionIsDefault(i.version, parsed.defaultId);
265
+ }
266
+ }
267
+ return out;
268
+ }
269
+ async function probeBinaryVersions(host, kind, versions, select, versionCmd, match, hostDefault) {
270
+ const out = [];
271
+ for (const v of versions) {
272
+ let plan;
273
+ try {
274
+ plan = select(v);
275
+ }
276
+ catch {
277
+ // Invalid pin (e.g. discovery prerelease shape) must not abort whole probeRuntimes
278
+ out.push({
279
+ kind,
280
+ version: v,
281
+ binaryPath: '',
282
+ available: false,
283
+ notes: [`skip invalid ${kind} pin: ${v}`],
284
+ });
285
+ continue;
286
+ }
287
+ let available = false;
288
+ let resolvedPath;
289
+ let versionOutput;
290
+ const itemNotes = [];
291
+ if (hostDefault && match(hostDefault, v)) {
292
+ available = true;
293
+ versionOutput = hostDefault;
294
+ itemNotes.push(tl('notes.auto.n1302'));
295
+ }
296
+ if (!available && plan.binaryPath && host.pathExists(plan.binaryPath)) {
297
+ const ver = await host.runCommand(versionCmd(plan.binaryPath), { timeoutMs: 8_000 });
298
+ if (ver.exitCode === 0 && match(ver.stdout + ver.stderr, v)) {
299
+ available = true;
300
+ resolvedPath = plan.binaryPath;
301
+ versionOutput = (ver.stdout || ver.stderr).trim().split('\n')[0];
302
+ }
303
+ }
304
+ if (!available) {
305
+ // PATH probe via unified resolveBin (same PATH rules as HostSoftwareProbe)
306
+ const candidates = kind === 'python'
307
+ // Only versioned binary (python3.14). Bare `python3` is often still 3.12 and
308
+ // must not be used to decide whether 3.14 is installed.
309
+ ? [`python${v}`]
310
+ : kind === 'go'
311
+ ? ['go']
312
+ : kind === 'rust'
313
+ ? ['cargo']
314
+ : kind === 'node'
315
+ ? [`node${v}`, 'node']
316
+ : kind === 'java'
317
+ ? ['java', 'javac']
318
+ : kind === 'kotlin'
319
+ ? ['kotlin', 'kotlinc']
320
+ : kind === 'bun'
321
+ ? ['bun']
322
+ : [`php${v}`, 'php'];
323
+ for (const name of candidates) {
324
+ const p = await resolveBin(host, name);
325
+ if (!p)
326
+ continue;
327
+ const ver = await host.runCommand(versionCmd(p), { timeoutMs: 8_000 });
328
+ const text = ver.stdout + ver.stderr;
329
+ if (ver.exitCode === 0 && match(text, v)) {
330
+ available = true;
331
+ resolvedPath = p;
332
+ versionOutput = text.trim().split('\n')[0];
333
+ break;
334
+ }
335
+ }
336
+ }
337
+ if (!available)
338
+ itemNotes.push(tl('notes.auto.t0395', { v0: plan.binaryPath || v }));
339
+ out.push({
340
+ kind,
341
+ version: v,
342
+ binaryPath: plan.binaryPath,
343
+ available,
344
+ resolvedPath,
345
+ versionOutput,
346
+ notes: itemNotes,
347
+ });
348
+ }
349
+ return out;
350
+ }
351
+ /**
352
+ * Probe which supported runtime versions exist on PATH / well-known paths.
353
+ */
354
+ /** Scan managed install dirs + host version strings (no hardcoded pin tables). */
355
+ async function listDirVersions(host, dir, pattern) {
356
+ try {
357
+ const r = await host.runCommand(['bash', '-c', `ls -1 ${JSON.stringify(dir)} 2>/dev/null || true`], { timeoutMs: 5_000 });
358
+ return (r.stdout || '')
359
+ .split('\n')
360
+ .map((s) => s.trim())
361
+ .filter((s) => pattern.test(s));
362
+ }
363
+ catch {
364
+ return [];
365
+ }
366
+ }
367
+ /**
368
+ * Discover Node installs under /usr/local/ysk/node/<major>/bin/node.
369
+ * Does not use softwareVersions DB — binary must exist and respond to -v.
370
+ */
371
+ export async function discoverYskNodeMajors(host) {
372
+ const found = [];
373
+ const seen = new Set();
374
+ const tryPath = async (major, path) => {
375
+ if (!major || seen.has(major))
376
+ return;
377
+ // Prefer pathExists, but still try -v when exists (or when exists is flaky)
378
+ if (!host.pathExists(path)) {
379
+ // Last chance: bash -x test (read-only)
380
+ const chk = await host.runCommand(['bash', '-c', `[ -x ${JSON.stringify(path)} ] && echo yes || echo no`], { timeoutMs: 5_000 });
381
+ if ((chk.stdout || '').trim() !== 'yes')
382
+ return;
383
+ }
384
+ const ver = await host.runCommand([path, '-v'], { timeoutMs: 8_000 });
385
+ if (ver.exitCode !== 0)
386
+ return;
387
+ const versionOutput = (ver.stdout || ver.stderr || '').trim().split('\n')[0];
388
+ if (!versionOutput)
389
+ return;
390
+ // Sanity: major should appear in output (v26.x.x)
391
+ if (!new RegExp(`v?${major}\\b`).test(versionOutput)) {
392
+ // still accept if binary lives under that major dir (custom build)
393
+ }
394
+ seen.add(major);
395
+ found.push({ major, path, versionOutput });
396
+ };
397
+ const majors = await listDirVersions(host, '/usr/local/ysk/node', /^\d+$/);
398
+ for (const major of majors) {
399
+ await tryPath(major, `/usr/local/ysk/node/${major}/bin/node`);
400
+ }
401
+ if (found.length === 0) {
402
+ // Glob fallback when ls listing failed but dirs exist
403
+ try {
404
+ const r = await host.runCommand([
405
+ 'bash',
406
+ '-c',
407
+ `for d in /usr/local/ysk/node/*/bin/node; do
408
+ [ -x "$d" ] || continue
409
+ v=$("$d" -v 2>/dev/null | head -1)
410
+ maj=$(printf '%s' "$d" | sed -n 's|.*/ysk/node/\\([0-9][0-9]*\\)/bin/node$|\\1|p')
411
+ [ -n "$maj" ] && [ -n "$v" ] && printf '%s\\n' "$maj|$d|$v"
412
+ done`,
413
+ ], { timeoutMs: 15_000 });
414
+ for (const line of (r.stdout || '').split('\n')) {
415
+ const t = line.trim();
416
+ if (!t)
417
+ continue;
418
+ const [major, path, ...rest] = t.split('|');
419
+ const versionOutput = rest.join('|');
420
+ if (major && path && versionOutput && !seen.has(major)) {
421
+ seen.add(major);
422
+ found.push({ major, path, versionOutput });
423
+ }
424
+ }
425
+ }
426
+ catch {
427
+ /* ignore */
428
+ }
429
+ }
430
+ // Highest major first (useful for host default)
431
+ found.sort((a, b) => Number(b.major) - Number(a.major));
432
+ return found;
433
+ }
434
+ /**
435
+ * Discover multi-version binaries already on the host (e.g. python3.14, php8.3).
436
+ * Expands probe pins so post-install refresh lists the new version.
437
+ *
438
+ * NOTE: deadsnakes / distro name binaries as `python3.14` (major.minor after "python"),
439
+ * NOT `python3.` + extra `x.y`. Wrong sed never finds 3.14 after a successful install.
440
+ */
441
+ async function listHostVersionedBins(host, kind) {
442
+ let cmd;
443
+ if (kind === 'python') {
444
+ // /usr/bin/python3.12 → 3.12 ; /usr/bin/python3.14 → 3.14
445
+ // (binary name is python + major.minor, not python3 + .x.y)
446
+ cmd =
447
+ 'ls -1 /usr/bin/python[0-9]* /usr/local/bin/python[0-9]* 2>/dev/null | sed -n "s|.*/python\\([0-9][0-9]*\\.[0-9][0-9]*\\)$|\\1|p"';
448
+ }
449
+ else if (kind === 'php') {
450
+ cmd =
451
+ 'ls -1 /usr/bin/php[0-9]* /usr/local/bin/php[0-9]* 2>/dev/null | sed -n "s|.*/php\\([0-9][0-9]*\\.[0-9][0-9]*\\)$|\\1|p"';
452
+ }
453
+ else {
454
+ cmd =
455
+ 'ls -1 /usr/local/ysk/node 2>/dev/null; ls -1 /usr/bin/node[0-9]* /usr/local/bin/node[0-9]* 2>/dev/null | sed -n "s|.*/node\\([0-9][0-9]*\\)$|\\1|p"';
456
+ }
457
+ try {
458
+ const r = await host.runCommand(['bash', '-c', `${cmd} || true`], { timeoutMs: 5_000 });
459
+ return [
460
+ ...new Set((r.stdout || '')
461
+ .split('\n')
462
+ .map((s) => s.trim())
463
+ .filter((s) => kind === 'node' ? /^\d+$/.test(s) : /^\d+\.\d+$/.test(s))),
464
+ ];
465
+ }
466
+ catch {
467
+ return [];
468
+ }
469
+ }
470
+ function extractPin(kind, versionText) {
471
+ if (!versionText)
472
+ return undefined;
473
+ if (kind === 'node')
474
+ return versionText.replace(/^v/i, '').match(/^(\d+)/)?.[1];
475
+ if (kind === 'go')
476
+ return versionText.replace(/^go/i, '').match(/(\d+\.\d+)/)?.[1];
477
+ if (kind === 'php' || kind === 'python')
478
+ return versionText.match(/(\d+\.\d+)/)?.[1];
479
+ if (kind === 'java') {
480
+ const m = versionText.match(/version "?(\d+)/) || versionText.match(/(\d+)\.\d+\.\d+/);
481
+ return m?.[1];
482
+ }
483
+ if (kind === 'kotlin')
484
+ return versionText.match(/(\d+\.\d+\.\d+)/)?.[1];
485
+ if (kind === 'bun')
486
+ return versionText.match(/(\d+\.\d+[\w.-]*)/)?.[1] || 'latest';
487
+ if (kind === 'rust')
488
+ return versionText.match(/(\d+\.\d+\.\d+)/)?.[1] || 'stable';
489
+ return undefined;
490
+ }
491
+ export async function probeRuntimes(host, opts) {
492
+ // Installable list from listSupportedRuntimes is empty by design.
493
+ // Merge disk discovery cache + host bins so post-install pins (e.g. 3.14) are probed.
494
+ const supported = listSupportedRuntimes();
495
+ const cachePins = (kind) => opts?.dataDir ? getCachedRuntimeVersionPins(opts.dataDir, kind) : [];
496
+ const notes = [];
497
+ async function hostDefault(bin, versionArgv) {
498
+ const p = await resolveBin(host, bin);
499
+ if (!p)
500
+ return undefined;
501
+ const ver = await host.runCommand(versionArgv, { timeoutMs: 8_000 });
502
+ const text = (ver.stdout || ver.stderr || '').trim().split('\n')[0];
503
+ return text || undefined;
504
+ }
505
+ /** Prefer PATH node; fall back to newest ysk node major install */
506
+ async function hostNodeDefault(ysk) {
507
+ const fromPath = await hostDefault('node', ['node', '-v']);
508
+ if (fromPath)
509
+ return fromPath;
510
+ if (ysk[0]?.versionOutput)
511
+ return ysk[0].versionOutput;
512
+ try {
513
+ const r = await host.runCommand([
514
+ 'bash',
515
+ '-c',
516
+ 'for d in /usr/local/ysk/node/*/bin/node; do [ -x "$d" ] && { "$d" -v 2>/dev/null; exit 0; }; done; true',
517
+ ], { timeoutMs: 8_000 });
518
+ const text = (r.stdout || '').trim().split('\n')[0];
519
+ return text || undefined;
520
+ }
521
+ catch {
522
+ return undefined;
523
+ }
524
+ }
525
+ const yskNodes = await discoverYskNodeMajors(host);
526
+ let hostNode = await hostNodeDefault(yskNodes);
527
+ const hostPhp = await hostDefault('php', ['php', '-v']);
528
+ const hostPython = await hostDefault('python3', ['python3', '--version']);
529
+ const hostGo = await hostDefault('go', ['go', 'version']);
530
+ const hostRust = await hostDefault('cargo', ['cargo', '--version']);
531
+ const hostJava = await hostDefault('java', ['java', '-version']);
532
+ const hostKotlin = (await hostDefault('kotlinc', ['kotlinc', '-version'])) ||
533
+ (await hostDefault('kotlin', ['kotlin', '-version']));
534
+ const hostBun = await hostDefault('bun', ['bun', '--version']);
535
+ const nodePins = [
536
+ ...new Set([
537
+ ...supported.node,
538
+ ...cachePins('node'),
539
+ ...yskNodes.map((n) => n.major),
540
+ ...(await listDirVersions(host, '/usr/local/ysk/node', /^\d+$/)),
541
+ ...(await listHostVersionedBins(host, 'node')),
542
+ extractPin('node', hostNode),
543
+ ].filter(Boolean)),
544
+ ];
545
+ const phpPins = [
546
+ ...new Set([
547
+ ...supported.php,
548
+ ...cachePins('php'),
549
+ ...(await listHostVersionedBins(host, 'php')),
550
+ extractPin('php', hostPhp),
551
+ ].filter(Boolean)),
552
+ ];
553
+ const pythonPins = [
554
+ ...new Set([
555
+ ...supported.python,
556
+ ...cachePins('python'),
557
+ ...(await listHostVersionedBins(host, 'python')),
558
+ extractPin('python', hostPython),
559
+ ].filter(Boolean)),
560
+ ];
561
+ const goPins = [
562
+ ...new Set([
563
+ ...supported.go,
564
+ ...cachePins('go'),
565
+ ...(await listDirVersions(host, '/usr/local/ysk/go', /^\d+\.\d+/)),
566
+ extractPin('go', hostGo),
567
+ ].filter(Boolean)),
568
+ ];
569
+ const rustPins = [
570
+ ...new Set([
571
+ ...supported.rust,
572
+ ...cachePins('rust'),
573
+ 'stable',
574
+ extractPin('rust', hostRust),
575
+ ].filter(Boolean)),
576
+ ];
577
+ const javaPins = [
578
+ ...new Set([
579
+ ...supported.java,
580
+ ...cachePins('java'),
581
+ extractPin('java', hostJava),
582
+ ].filter(Boolean)),
583
+ ];
584
+ const kotlinPins = [
585
+ ...new Set([
586
+ ...supported.kotlin,
587
+ ...cachePins('kotlin'),
588
+ extractPin('kotlin', hostKotlin),
589
+ ].filter(Boolean)),
590
+ ];
591
+ const bunPins = [
592
+ ...new Set([
593
+ ...supported.bun,
594
+ ...cachePins('bun'),
595
+ 'latest',
596
+ extractPin('bun', hostBun),
597
+ ].filter(Boolean)),
598
+ ];
599
+ let node = await probeBinaryVersions(host, 'node', nodePins, selectNodeRuntime, (p) => [p, '-v'], (out, v) => new RegExp(`v?${v}\\b`).test(out), hostNode);
600
+ // Force-merge YSK disk discoveries — never leave "recorded only" as the only signal
601
+ for (const y of yskNodes) {
602
+ const hit = node.find((n) => n.version === y.major);
603
+ if (hit) {
604
+ if (!hit.available) {
605
+ hit.available = true;
606
+ hit.resolvedPath = y.path;
607
+ hit.versionOutput = y.versionOutput;
608
+ hit.notes = hit.notes.filter((n) => !/not found|未|missing/i.test(n));
609
+ hit.notes.push(`ysk node binary: ${y.path}`);
610
+ }
611
+ }
612
+ else {
613
+ node.push({
614
+ kind: 'node',
615
+ version: y.major,
616
+ binaryPath: y.path,
617
+ available: true,
618
+ resolvedPath: y.path,
619
+ versionOutput: y.versionOutput,
620
+ notes: [`ysk node binary: ${y.path}`],
621
+ });
622
+ }
623
+ }
624
+ const php = await probeBinaryVersions(host, 'php', phpPins, selectPhpRuntime, (p) => [p, '-v'], (out, v) => out.includes(v), hostPhp);
625
+ const python = await probeBinaryVersions(host, 'python', pythonPins, selectPythonRuntime, (p) => [p, '--version'], (out, v) => out.includes(v), hostPython);
626
+ // Go: multi-version under /usr/local/ysk/go/<minor>/ — probe each path; active = PATH go matches
627
+ const go = await probeGoVersions(host, goPins, hostGo);
628
+ // Rust: multi-toolchain via rustup; pins stay installed even when not default
629
+ const rust = await probeRustVersions(host, rustPins, hostRust);
630
+ const java = await probeBinaryVersions(host, 'java', javaPins, selectJavaRuntime, (p) => [p, '-version'], (out, v) => out.includes(`"${v}`) || out.includes(`version ${v}`) || new RegExp(`\\b${v}\\b`).test(out), hostJava);
631
+ const kotlin = await probeBinaryVersions(host, 'kotlin', kotlinPins, selectKotlinRuntime, (p) => [p, '-version'], (out, v) => out.includes(v) || /kotlinc/i.test(out), hostKotlin);
632
+ const bun = await probeBinaryVersions(host, 'bun', bunPins, selectBunRuntime, (p) => [p, '--version'], (out, v) => {
633
+ if (v === 'latest')
634
+ return /\d+\.\d+/.test(out);
635
+ return out.includes(v);
636
+ }, hostBun);
637
+ // If PATH node missing but a pin resolved, surface highest available as host default
638
+ if (!hostNode) {
639
+ const hit = yskNodes[0] ||
640
+ [...node]
641
+ .filter((n) => n.available && n.versionOutput)
642
+ .sort((a, b) => Number(b.version) - Number(a.version))[0];
643
+ if (hit?.versionOutput)
644
+ hostNode = hit.versionOutput;
645
+ }
646
+ notes.push(tl('notes.auto.t0396', { v0: (hostNode ?? tl('notes.tpl.none')) }), tl('notes.auto.t0397', { v0: (hostPhp ?? tl('notes.tpl.none')) }), tl('notes.auto.t0398', { v0: (hostPython ?? tl('notes.tpl.none')) }), tl('notes.auto.t0399', { v0: (hostGo ?? tl('notes.tpl.none')) }), tl('notes.auto.t0400', { v0: (hostRust ?? tl('notes.tpl.none')) }), tl('notes.auto.t0401', { v0: (node.filter((n) => n.available).map((n) => n.version).join(', ') || tl('notes.tpl.none')) }), tl('notes.auto.t0402', { v0: (php.filter((p) => p.available).map((p) => p.version).join(', ') || tl('notes.tpl.none')) }), tl('notes.auto.t0403', { v0: (python.filter((p) => p.available).map((p) => p.version).join(', ') || tl('notes.tpl.none')) }), tl('notes.auto.t0404', { v0: (go.filter((g) => g.available).map((g) => g.version).join(', ') || tl('notes.tpl.none')) }), tl('notes.auto.t0405', { v0: (rust.filter((r) => r.available).map((r) => r.version).join(', ') || tl('notes.tpl.none')) }));
647
+ return {
648
+ node,
649
+ php,
650
+ python,
651
+ go,
652
+ rust,
653
+ java,
654
+ kotlin,
655
+ bun,
656
+ hostNode,
657
+ hostPhp,
658
+ hostPython,
659
+ hostGo,
660
+ hostRust,
661
+ hostJava,
662
+ hostKotlin,
663
+ hostBun,
664
+ notes,
665
+ };
666
+ }
667
+ /** Compress install stderr for panel notes (avoid dumping full apt logs). */
668
+ function summarizeInstallLog(stderr, stdout) {
669
+ const text = `${stderr || ''}\n${stdout || ''}`.trim();
670
+ if (!text)
671
+ return '';
672
+ const lines = text
673
+ .split('\n')
674
+ .map((l) => l.trim())
675
+ .filter(Boolean)
676
+ .filter((l) => !/^(Get:|Hit:|Ign:|Reading package|Building dependency|Preparing to unpack|Unpacking |Setting up |Processing triggers|Fetched )/i.test(l));
677
+ const pick = (lines.length ? lines : text.split('\n')).slice(-6).join(' · ');
678
+ return pick.replace(/\s+/g, ' ').slice(0, 360);
679
+ }
680
+ /**
681
+ * Write install helper for a runtime version; optionally run when root+EXECUTE.
682
+ */
683
+ export async function planOrInstallRuntime(input) {
684
+ const notes = [];
685
+ const written = [];
686
+ const commandResults = [];
687
+ const dir = join(input.dataDir, 'runtimes', input.kind, input.version);
688
+ mkdirSync(dir, { recursive: true });
689
+ let script = '';
690
+ let packages;
691
+ let extensionIds;
692
+ let pluginIds;
693
+ if (input.kind === 'node') {
694
+ const plan = selectNodeRuntime(input.version);
695
+ // Official binary tarball → /usr/local/ysk/node/<major> (same layout as go/rust).
696
+ // Reuse PATH node when major already matches; NodeSource apt is fallback only.
697
+ script = [
698
+ '#!/usr/bin/env bash',
699
+ `# YSK Server — install Node.js ${plan.version}`,
700
+ 'set -euo pipefail',
701
+ 'export DEBIAN_FRONTEND=noninteractive',
702
+ `MAJOR="${plan.version}"`,
703
+ `DEST="/usr/local/ysk/node/${plan.version}"`,
704
+ 'mkdir -p /usr/local/ysk/node /tmp/ysk-node-install',
705
+ '# Reuse existing node when major version already matches',
706
+ `if ${shellBinExists('node')}; then`,
707
+ ' CUR="$(node -v 2>/dev/null | sed "s/^v//" || true)"',
708
+ ' case "$CUR" in',
709
+ ' ${MAJOR}.*)',
710
+ ' mkdir -p "$DEST/bin"',
711
+ ` NODE_BIN="$(${shellResolveBin('node')})"`,
712
+ ' test -n "$NODE_BIN"',
713
+ ' ln -sfn "$NODE_BIN" "$DEST/bin/node"',
714
+ ` if ${shellBinExists('npm')}; then ln -sfn "$(${shellResolveBin('npm')})" "$DEST/bin/npm" || true; fi`,
715
+ ' "$DEST/bin/node" -v',
716
+ ' # fall through to companion tools (do not exit — plugins still run)',
717
+ ' SKIP_NODE_TARBALL=1',
718
+ ' ;;',
719
+ ' esac',
720
+ 'fi',
721
+ 'if [ "${SKIP_NODE_TARBALL:-0}" != "1" ]; then',
722
+ 'case "$(uname -m)" in aarch64|arm64) ARCH=linux-arm64 ;; *) ARCH=linux-x64 ;; esac',
723
+ 'cd /tmp/ysk-node-install',
724
+ 'rm -f SHASUMS256.txt node.tgz',
725
+ 'curl -fsSL "https://nodejs.org/dist/latest-v${MAJOR}.x/SHASUMS256.txt" -o SHASUMS256.txt',
726
+ '# Prefer .tar.gz (no xz dependency); fall back to .tar.xz',
727
+ 'TARBALL=$(grep -E "node-v${MAJOR}\\.[0-9]+\\.[0-9]+-${ARCH}\\.tar\\.gz$" SHASUMS256.txt | awk \'{print $2}\' | head -1)',
728
+ 'if [ -z "$TARBALL" ]; then',
729
+ ' TARBALL=$(grep -E "node-v${MAJOR}\\.[0-9]+\\.[0-9]+-${ARCH}\\.tar\\.xz$" SHASUMS256.txt | awk \'{print $2}\' | head -1)',
730
+ 'fi',
731
+ 'if [ -n "$TARBALL" ]; then',
732
+ ' curl -fsSL "https://nodejs.org/dist/latest-v${MAJOR}.x/$TARBALL" -o node.tgz',
733
+ ' rm -rf "$DEST"',
734
+ ' mkdir -p "$DEST"',
735
+ ' if echo "$TARBALL" | grep -q "\\.xz$"; then tar -C "$DEST" --strip-components=1 -xJf node.tgz',
736
+ ' else tar -C "$DEST" --strip-components=1 -xzf node.tgz; fi',
737
+ ' ln -sfn "$DEST/bin/node" /usr/local/bin/node || true',
738
+ ' ln -sfn "$DEST/bin/npm" /usr/local/bin/npm || true',
739
+ ' ln -sfn "$DEST/bin/npx" /usr/local/bin/npx || true',
740
+ ' "$DEST/bin/node" -v',
741
+ 'else',
742
+ ' echo "official tarball resolve failed; trying NodeSource apt fallback" >&2',
743
+ ' apt-get update -qq',
744
+ ' curl -fsSL "https://deb.nodesource.com/setup_${MAJOR}.x" | bash -',
745
+ ' apt-get install -y nodejs',
746
+ ' node -v',
747
+ ' mkdir -p "$DEST/bin"',
748
+ ` NODE_BIN="$(${shellResolveBin('node')})"`,
749
+ ' test -n "$NODE_BIN"',
750
+ ' ln -sfn "$NODE_BIN" "$DEST/bin/node"',
751
+ 'fi',
752
+ // Verify requested major is what we got (no silent wrong major)
753
+ ' NODE_V="$("$DEST/bin/node" -v 2>/dev/null | sed "s/^v//" || true)"',
754
+ ' case "$NODE_V" in',
755
+ ' ${MAJOR}.*) ;;',
756
+ ' *) echo "node major mismatch: wanted ${MAJOR} got ${NODE_V:-missing}" >&2; exit 32 ;;',
757
+ ' esac',
758
+ 'fi', // SKIP_NODE_TARBALL
759
+ '',
760
+ ].join('\n');
761
+ notes.push(tl('notes.auto.t0406', { v0: plan.version }));
762
+ }
763
+ else if (input.kind === 'php') {
764
+ const plan = selectPhpRuntime(input.version);
765
+ const resolved = resolvePhpAptPackages(plan.version, input.extensions);
766
+ packages = resolved.packages;
767
+ extensionIds = resolved.resolvedIds;
768
+ const pkgLine = packages.map((p) => `'${p.replace(/'/g, '')}'`).join(' ');
769
+ // packages.sury.org/php is the only supported upstream (ondrej Launchpad PPA archived).
770
+ // Mixed ondrej+sury indexes cause phpX.Y-common version mismatches on extensions
771
+ // (e.g. common from sury, bz2 wants Launchpad gbp build of the same 8.5.9).
772
+ script = [
773
+ '#!/usr/bin/env bash',
774
+ `# YSK Server — install PHP ${plan.version} + selected extensions (sury.org only)`,
775
+ 'set -euo pipefail',
776
+ 'export DEBIAN_FRONTEND=noninteractive',
777
+ 'export LC_ALL=C',
778
+ `PHP_VER=${JSON.stringify(plan.version)}`,
779
+ '',
780
+ '# —— Single origin: packages.sury.org/php (purge Launchpad ondrej remnants) ——',
781
+ 'rm -f /etc/apt/sources.list.d/ondrej-ubuntu-php*.list 2>/dev/null || true',
782
+ 'rm -f /etc/apt/sources.list.d/ondrej-php*.list 2>/dev/null || true',
783
+ 'rm -f /etc/apt/sources.list.d/*ondrej*php* 2>/dev/null || true',
784
+ 'rm -f /etc/apt/sources.list.d/ondrej-ubuntu-php*.sources 2>/dev/null || true',
785
+ 'rm -f /etc/apt/sources.list.d/php-sury.list 2>/dev/null || true',
786
+ 'if [ -d /etc/apt/sources.list.d ]; then',
787
+ ' for f in /etc/apt/sources.list.d/*; do',
788
+ ' [ -f "$f" ] || continue',
789
+ ' if grep -qiE "ppa\\.launchpad\\.(net|content\\.com)/ondrej/php|launchpadcontent\\.com/ondrej/php|ondrej/php" "$f" 2>/dev/null; then',
790
+ ' echo "YSK_PHP_DROP_SOURCE $f"',
791
+ ' rm -f "$f"',
792
+ ' fi',
793
+ ' done',
794
+ 'fi',
795
+ '',
796
+ 'apt-get install -y lsb-release ca-certificates curl gnupg 2>/dev/null || true',
797
+ '',
798
+ 'setup_sury_php() {',
799
+ ' curl -fsSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb',
800
+ ' dpkg -i /tmp/debsuryorg-archive-keyring.deb',
801
+ ' CODENAME=$(lsb_release -sc 2>/dev/null || true)',
802
+ ' if [ -z "$CODENAME" ]; then',
803
+ ' # shellcheck disable=SC1091',
804
+ ' . /etc/os-release 2>/dev/null || true',
805
+ ' CODENAME="${VERSION_CODENAME:-}"',
806
+ ' fi',
807
+ ' if [ -z "$CODENAME" ]; then',
808
+ ' echo "cannot detect distro codename for sury.org" >&2',
809
+ ' return 1',
810
+ ' fi',
811
+ ' echo "deb [signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg] https://packages.sury.org/php/ ${CODENAME} main" > /etc/apt/sources.list.d/php.list',
812
+ ' # Prefer sury origin; demote any leftover Launchpad PHP indexes',
813
+ ' mkdir -p /etc/apt/preferences.d',
814
+ ' cat > /etc/apt/preferences.d/ysk-php-sury.pref <<\'PREF\'',
815
+ 'Package: php* libapache2-mod-php* php-*',
816
+ 'Pin: origin packages.sury.org',
817
+ 'Pin-Priority: 1001',
818
+ '',
819
+ 'Package: php* libapache2-mod-php* php-*',
820
+ 'Pin: release o=LP-PPA-ondrej-php',
821
+ 'Pin-Priority: -1',
822
+ '',
823
+ 'Package: php* libapache2-mod-php* php-*',
824
+ 'Pin: release o=LP-PPA-ondrej-php-ubuntu-*',
825
+ 'Pin-Priority: -1',
826
+ 'PREF',
827
+ ' apt-get update -qq',
828
+ '}',
829
+ '',
830
+ 'echo "YSK_PHP_SETUP=packages.sury.org/php"',
831
+ 'if ! setup_sury_php; then',
832
+ ' echo "sury.org setup failed" >&2',
833
+ ' exit 31',
834
+ 'fi',
835
+ '',
836
+ `PKGS=(${pkgLine})`,
837
+ 'echo "Installing: ${PKGS[*]}"',
838
+ // Prefer packages.sury.org version (not Launchpad gbp); skip packages that do not exist
839
+ 'ysk_php_pick_ver() {',
840
+ ' local p="$1" v=""',
841
+ ' # madison: "pkg | version | repo"',
842
+ ' v=$(apt-cache madison "$p" 2>/dev/null | awk -F"|" \'/packages\\.sury\\.org/{gsub(/^[ \\t]+|[ \\t]+$/,"",$2); print $2; exit}\')',
843
+ ' if [ -z "$v" ]; then',
844
+ ' v=$(apt-cache madison "$p" 2>/dev/null | awk -F"|" \'/sury/{gsub(/^[ \\t]+|[ \\t]+$/,"",$2); print $2; exit}\')',
845
+ ' fi',
846
+ ' if [ -z "$v" ]; then',
847
+ ' v=$(apt-cache policy "$p" 2>/dev/null | awk \'/Candidate:/{print $2; exit}\')',
848
+ ' fi',
849
+ ' if [ "$v" = "(none)" ]; then v=""; fi',
850
+ ' # Prefer deb.sury.org builds when policy lists multiple',
851
+ ' if echo "$v" | grep -q gbp; then',
852
+ ' local sury_v',
853
+ ' sury_v=$(apt-cache madison "$p" 2>/dev/null | awk -F"|" \'/deb\\.sury\\.org|packages\\.sury\\.org/{gsub(/^[ \\t]+|[ \\t]+$/,"",$2); print $2; exit}\')',
854
+ ' if [ -n "$sury_v" ]; then v="$sury_v"; fi',
855
+ ' fi',
856
+ ' printf "%s" "$v"',
857
+ '}',
858
+ 'ysk_php_filter_pkgs() {',
859
+ ' local p out=()',
860
+ ' for p in "$@"; do',
861
+ ' if apt-cache show "$p" >/dev/null 2>&1; then',
862
+ ' out+=("$p")',
863
+ ' else',
864
+ ' echo "YSK_PHP_SKIP_MISSING $p (not in apt indexes — e.g. opcache is in php-common)" >&2',
865
+ ' fi',
866
+ ' done',
867
+ ' printf "%s\\n" "${out[@]}"',
868
+ '}',
869
+ 'mapfile -t PKGS < <(ysk_php_filter_pkgs "${PKGS[@]}")',
870
+ 'if [ "${#PKGS[@]}" -eq 0 ]; then',
871
+ ' echo "no installable PHP packages after filter" >&2',
872
+ ' exit 32',
873
+ 'fi',
874
+ 'echo "YSK_PHP_PKGS_FILTERED=${PKGS[*]}"',
875
+ // Align stack to packages.sury.org versions
876
+ 'ysk_php_install_set() {',
877
+ ' local cand pinned=() p v',
878
+ ' cand=$(ysk_php_pick_ver "php${PHP_VER}-common")',
879
+ ' echo "YSK_PHP_COMMON_CANDIDATE=${cand:-(none)}"',
880
+ ' if [ -n "${cand:-}" ]; then',
881
+ ' for p in "php${PHP_VER}-common" "php${PHP_VER}-cli" "php${PHP_VER}-fpm"; do',
882
+ ' if apt-cache show "$p" >/dev/null 2>&1; then pinned+=("${p}=${cand}"); fi',
883
+ ' done',
884
+ ' apt-get install -y --allow-downgrades --allow-change-held-packages "${pinned[@]}" || true',
885
+ ' fi',
886
+ ' pinned=()',
887
+ ' for p in "${PKGS[@]}"; do',
888
+ ' v=$(ysk_php_pick_ver "$p")',
889
+ ' if [ -n "${v:-}" ]; then',
890
+ ' pinned+=("${p}=${v}")',
891
+ ' else',
892
+ ' pinned+=("$p")',
893
+ ' fi',
894
+ ' done',
895
+ ' echo "YSK_PHP_PINNED=${pinned[*]}"',
896
+ ' apt-get install -y --allow-downgrades --allow-change-held-packages "${pinned[@]}"',
897
+ '}',
898
+ '',
899
+ 'FAILED=()',
900
+ 'if ! ysk_php_install_set; then',
901
+ ' echo "full set failed; installing packages one-by-one with pin" >&2',
902
+ ' for p in "${PKGS[@]}"; do',
903
+ ' v=$(ysk_php_pick_ver "$p")',
904
+ ' if [ -n "${v:-}" ]; then',
905
+ ' if ! apt-get install -y --allow-downgrades --allow-change-held-packages "${p}=${v}"; then',
906
+ ' FAILED+=("$p")',
907
+ ' echo "skip $p (wanted $v)" >&2',
908
+ ' fi',
909
+ ' else',
910
+ ' if ! apt-get install -y "$p"; then',
911
+ ' FAILED+=("$p")',
912
+ ' echo "skip $p" >&2',
913
+ ' fi',
914
+ ' fi',
915
+ ' done',
916
+ 'fi',
917
+ `if ! php${plan.version} -v; then`,
918
+ ' echo "PHP binary missing after install — sury packages may not support this minor on this distro" >&2',
919
+ ' exit 32',
920
+ 'fi',
921
+ `php${plan.version} -m 2>/dev/null | head -60 || true`,
922
+ `systemctl enable --now php${plan.version}-fpm 2>/dev/null || systemctl enable --now php-fpm 2>/dev/null || true`,
923
+ 'if [ "${#FAILED[@]}" -gt 0 ]; then',
924
+ ' echo "YSK_PHP_EXT_FAILED: ${FAILED[*]}" >&2',
925
+ ' echo "Some PHP packages could not be installed (version skew / missing). Core CLI may work." >&2',
926
+ ' exit 33',
927
+ 'fi',
928
+ '',
929
+ ].join('\n');
930
+ notes.push(tl('notes.auto.t0407', { v0: plan.version }));
931
+ notes.push('source=packages.sury.org/php only (pin 1001; demote ondrej)');
932
+ // Package list also returned as result.packages for the panel
933
+ if (packages.length) {
934
+ notes.push(tl('notes.php.aptPackages', {
935
+ count: packages.length,
936
+ list: packages.slice(0, 14).join(', ') + (packages.length > 14 ? '…' : ''),
937
+ }));
938
+ }
939
+ }
940
+ else if (input.kind === 'python') {
941
+ const plan = selectPythonRuntime(input.version);
942
+ // deadsnakes for multi-version on Ubuntu; never silently fall back to system python3
943
+ script = [
944
+ '#!/usr/bin/env bash',
945
+ `# YSK Server — install Python ${plan.version} (requested pin only)`,
946
+ 'set -euo pipefail',
947
+ 'export DEBIAN_FRONTEND=noninteractive',
948
+ 'export LC_ALL=C',
949
+ `VER=${JSON.stringify(plan.version)}`,
950
+ 'apt-get update -qq || true',
951
+ 'apt-get install -y software-properties-common ca-certificates 2>/dev/null || true',
952
+ 'if ! add-apt-repository -y ppa:deadsnakes/ppa; then',
953
+ ' echo "deadsnakes PPA unavailable — will try distro packages for python${VER} only" >&2',
954
+ 'fi',
955
+ 'apt-get update -qq',
956
+ 'if ! apt-get install -y "python${VER}" "python${VER}-venv" "python${VER}-dev"; then',
957
+ ' echo "failed to install python${VER} (and venv/dev). No fallback to system python3." >&2',
958
+ ' echo "Hint: deadsnakes may not ship this minor on this Ubuntu release; check apt-cache policy python${VER}" >&2',
959
+ ' exit 32',
960
+ 'fi',
961
+ 'if ! "python${VER}" --version; then',
962
+ ' echo "python${VER} binary missing after apt install" >&2',
963
+ ' exit 32',
964
+ 'fi',
965
+ '',
966
+ ].join('\n');
967
+ notes.push(tl('notes.auto.t0408', { v0: (plan.version) }));
968
+ notes.push('source=deadsnakes/ppa or distro; no silent python3 fallback');
969
+ }
970
+ else if (input.kind === 'go') {
971
+ const plan = selectGoRuntime(input.version);
972
+ // Panel + DEST always minor (1.26); go.dev download resolves full patch (1.26.5).
973
+ script = [
974
+ '#!/usr/bin/env bash',
975
+ `# YSK Server — install Go ${plan.version} (resolves full patch version)`,
976
+ 'set -euo pipefail',
977
+ `VER=${JSON.stringify(plan.version)}`,
978
+ `DEST=${JSON.stringify(plan.binaryPath.replace(/\/bin\/go$/, ''))}`,
979
+ 'mkdir -p /usr/local/ysk/go /tmp/ysk-go-install',
980
+ 'cd /tmp/ysk-go-install',
981
+ 'case "$(uname -m)" in aarch64|arm64) GOARCH=linux-arm64 ;; *) GOARCH=linux-amd64 ;; esac',
982
+ // Resolve full patch from live go.dev JSON — no hardcoded patch table
983
+ 'resolve_go_full() {',
984
+ ' local minor="$1"',
985
+ ' if echo "$minor" | grep -qE "^[0-9]+\\.[0-9]+\\.[0-9]+$"; then',
986
+ ' echo "$minor"',
987
+ ' return',
988
+ ' fi',
989
+ ' local json best=""',
990
+ ' json=$(curl -fsSL "https://go.dev/dl/?mode=json" 2>/dev/null || true)',
991
+ ' if [ -n "$json" ]; then',
992
+ ' best=$(printf "%s" "$json" | grep -oE "go${minor}\\.[0-9]+" | sed "s/^go//" | sort -t. -k3 -n | tail -1)',
993
+ ' fi',
994
+ ' if [ -n "$best" ]; then echo "$best"; else echo ""; fi',
995
+ '}',
996
+ 'FULL_VER=$(resolve_go_full "$VER")',
997
+ 'if [ -z "$FULL_VER" ]; then',
998
+ ' echo "cannot resolve full Go patch version for $VER from go.dev/dl JSON" >&2',
999
+ ' exit 22',
1000
+ 'fi',
1001
+ 'echo "YSK_GO_PANEL_VERSION=$VER"',
1002
+ 'echo "YSK_GO_DOWNLOAD_VERSION=$FULL_VER"',
1003
+ 'URL="https://go.dev/dl/go${FULL_VER}.${GOARCH}.tar.gz"',
1004
+ 'echo "YSK_GO_DOWNLOAD_URL=$URL"',
1005
+ 'if ! curl -fsSL "$URL" -o go.tgz; then',
1006
+ ' echo "Go download failed (HTTP error). Panel version=$VER download=$FULL_VER arch=$GOARCH" >&2',
1007
+ ' echo "Hint: go.dev requires a full patch version (e.g. 1.21.13), not minor-only (1.21)." >&2',
1008
+ ' exit 22',
1009
+ 'fi',
1010
+ 'rm -rf "$DEST"',
1011
+ 'mkdir -p "$DEST"',
1012
+ 'tar -C "$DEST" --strip-components=1 -xzf go.tgz',
1013
+ 'ln -sfn "$DEST/bin/go" /usr/local/bin/go || true',
1014
+ 'mkdir -p /usr/local/ysk/go/bin',
1015
+ 'ln -sfn "$DEST/bin/go" /usr/local/ysk/go/bin/go || true',
1016
+ 'export PATH="$DEST/bin:/usr/local/bin:/usr/local/ysk/go/bin:$PATH"',
1017
+ // So companion tools (air, …) use the just-installed go, not a stale multi-path ysk_go
1018
+ 'export YSK_PREFERRED_GO="$DEST/bin/go"',
1019
+ '"$DEST/bin/go" version',
1020
+ '',
1021
+ ].join('\n');
1022
+ notes.push(tl('notes.auto.t0409', { v0: plan.version }));
1023
+ notes.push('Go tarball full patch resolved from go.dev/dl JSON (no hardcoded patch table)');
1024
+ }
1025
+ else if (input.kind === 'rust') {
1026
+ const plan = selectRustRuntime(input.version);
1027
+ // rustup needs a channel/toolchain id; panel pins like "1.78" are valid.
1028
+ // Layout matches runtime-plugins probe: RUSTUP_HOME=…/rustup CARGO_HOME=…/cargo
1029
+ // (putting both on the same dir leaves rustup off PATH after partial installs.)
1030
+ const tc = plan.version === 'stable' ? 'stable' : plan.version;
1031
+ script = [
1032
+ '#!/usr/bin/env bash',
1033
+ `# YSK Server — install Rust (${plan.version}) via rustup`,
1034
+ 'set -euo pipefail',
1035
+ 'export RUSTUP_HOME=/usr/local/ysk/rust/rustup',
1036
+ 'export CARGO_HOME=/usr/local/ysk/rust/cargo',
1037
+ 'mkdir -p "$RUSTUP_HOME" "$CARGO_HOME" /usr/local/ysk/rust/bin',
1038
+ 'export PATH="$CARGO_HOME/bin:$RUSTUP_HOME/bin:/usr/local/ysk/rust/bin:$PATH"',
1039
+ 'ysk_rustup_bin() {',
1040
+ ' if [ -x "$CARGO_HOME/bin/rustup" ]; then echo "$CARGO_HOME/bin/rustup"; return; fi',
1041
+ ' if [ -x /usr/local/ysk/rust/bin/rustup ]; then echo /usr/local/ysk/rust/bin/rustup; return; fi',
1042
+ ' command -v rustup 2>/dev/null || true',
1043
+ '}',
1044
+ 'RU="$(ysk_rustup_bin)"',
1045
+ 'if [ -z "$RU" ]; then',
1046
+ ' echo "YSK_RUST_INSTALLING_RUSTUP"',
1047
+ // Install without default first, then set toolchain explicitly (clearer errors)
1048
+ ' curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --default-toolchain none',
1049
+ ' RU="$(ysk_rustup_bin)"',
1050
+ 'fi',
1051
+ 'if [ -z "$RU" ] || [ ! -x "$RU" ]; then',
1052
+ ' echo "rustup missing after install (RUSTUP_HOME=$RUSTUP_HOME CARGO_HOME=$CARGO_HOME)" >&2',
1053
+ ' exit 1',
1054
+ 'fi',
1055
+ 'echo "YSK_RUSTUP=$RU"',
1056
+ `TC=${JSON.stringify(tc)}`,
1057
+ 'echo "YSK_RUST_TOOLCHAIN=$TC"',
1058
+ // Install pin/channel then make it default so bare cargo works
1059
+ '"$RU" toolchain install "$TC"',
1060
+ '"$RU" default "$TC"',
1061
+ '"$RU" show',
1062
+ // Symlinks for panel probe + /usr/local/bin
1063
+ 'ln -sfn "$CARGO_HOME/bin/rustup" /usr/local/ysk/rust/bin/rustup 2>/dev/null || true',
1064
+ 'ln -sfn "$CARGO_HOME/bin/cargo" /usr/local/ysk/rust/bin/cargo 2>/dev/null || true',
1065
+ 'ln -sfn "$CARGO_HOME/bin/rustc" /usr/local/ysk/rust/bin/rustc 2>/dev/null || true',
1066
+ 'ln -sfn "$CARGO_HOME/bin/cargo" /usr/local/bin/cargo 2>/dev/null || true',
1067
+ 'ln -sfn "$CARGO_HOME/bin/rustc" /usr/local/bin/rustc 2>/dev/null || true',
1068
+ 'ln -sfn "$CARGO_HOME/bin/rustup" /usr/local/bin/rustup 2>/dev/null || true',
1069
+ // Prefer explicit toolchain run (does not depend on default alone)
1070
+ '"$RU" run "$TC" cargo --version',
1071
+ '"$RU" run "$TC" rustc --version',
1072
+ 'cargo --version',
1073
+ 'rustc --version',
1074
+ '',
1075
+ ].join('\n');
1076
+ notes.push(tl('notes.auto.t0410', { v0: plan.version }));
1077
+ notes.push('Rust install uses rustup under /usr/local/ysk/rust/{rustup,cargo}; sets default toolchain');
1078
+ }
1079
+ else if (input.kind === 'java') {
1080
+ const plan = selectJavaRuntime(input.version);
1081
+ // Never silently install a different feature version (no openjdk-17 fallback)
1082
+ script = [
1083
+ '#!/usr/bin/env bash',
1084
+ `# YSK Server — install OpenJDK ${plan.version} (requested pin only)`,
1085
+ 'set -euo pipefail',
1086
+ 'export DEBIAN_FRONTEND=noninteractive',
1087
+ `VER=${JSON.stringify(plan.version)}`,
1088
+ 'apt-get update -qq',
1089
+ 'if ! apt-get install -y "openjdk-${VER}-jdk"; then',
1090
+ ' echo "openjdk-${VER}-jdk not available from apt; refusing silent downgrade" >&2',
1091
+ ' exit 32',
1092
+ 'fi',
1093
+ 'java -version',
1094
+ 'javac -version',
1095
+ // Best-effort check that installed major matches request
1096
+ 'JV=$(java -version 2>&1 | head -1 || true)',
1097
+ 'echo "YSK_JAVA_VERSION_LINE=$JV"',
1098
+ 'if ! echo "$JV" | grep -qE "version \\"?${VER}([.\\"_]|$)"; then',
1099
+ ' if ! echo "$JV" | grep -qE " ${VER}\\.|openjdk ${VER}|version \\"${VER}"; then',
1100
+ ' echo "installed java does not look like feature version ${VER}: $JV" >&2',
1101
+ ' exit 32',
1102
+ ' fi',
1103
+ 'fi',
1104
+ '',
1105
+ ].join('\n');
1106
+ notes.push(tl('notes.auto.t0412', { v0: plan.version }));
1107
+ notes.push('no silent openjdk-17 fallback');
1108
+ }
1109
+ else if (input.kind === 'kotlin') {
1110
+ const plan = selectKotlinRuntime(input.version);
1111
+ script = [
1112
+ '#!/usr/bin/env bash',
1113
+ `# YSK Server — install Kotlin ${plan.version} (requires JDK; no version downgrade fallback)`,
1114
+ 'set -euo pipefail',
1115
+ 'export DEBIAN_FRONTEND=noninteractive',
1116
+ `if ! ${shellBinExists('java')}; then apt-get update -qq && apt-get install -y openjdk-21-jdk; fi`,
1117
+ `VER=${JSON.stringify(plan.version)}`,
1118
+ 'DEST=/usr/local/ysk/kotlin',
1119
+ 'TMP=$(mktemp -d)',
1120
+ 'mkdir -p /usr/local/ysk /usr/local/bin',
1121
+ 'URL="https://github.com/JetBrains/kotlin/releases/download/v${VER}/kotlin-compiler-${VER}.zip"',
1122
+ 'echo "YSK_KOTLIN_URL=$URL"',
1123
+ 'if ! curl -fsSL "$URL" -o "$TMP/kotlin.zip"; then',
1124
+ ' echo "Kotlin download failed for version ${VER} (no fallback pin)" >&2',
1125
+ ' exit 22',
1126
+ 'fi',
1127
+ 'rm -rf "$DEST"',
1128
+ 'mkdir -p "$DEST" "$TMP/out"',
1129
+ 'if command -v unzip >/dev/null 2>&1; then unzip -q "$TMP/kotlin.zip" -d "$TMP/out";',
1130
+ 'else python3 -c "import zipfile,sys; zipfile.ZipFile(sys.argv[1]).extractall(sys.argv[2])" "$TMP/kotlin.zip" "$TMP/out"; fi',
1131
+ 'if [ -d "$TMP/out/kotlinc" ]; then cp -a "$TMP/out/kotlinc/." "$DEST/"; else cp -a "$TMP/out/." "$DEST/"; fi',
1132
+ 'ln -sfn "$DEST/bin/kotlin" /usr/local/bin/kotlin || true',
1133
+ 'ln -sfn "$DEST/bin/kotlinc" /usr/local/bin/kotlinc || true',
1134
+ 'rm -rf "$TMP"',
1135
+ 'kotlinc -version || kotlin -version',
1136
+ '',
1137
+ ].join('\n');
1138
+ notes.push(tl('notes.auto.t0413', { v0: plan.version }));
1139
+ notes.push('no hardcoded kotlin fallback pin');
1140
+ }
1141
+ else if (input.kind === 'bun') {
1142
+ const plan = selectBunRuntime(input.version);
1143
+ // latest / empty → official installer; specific pin → GitHub release tarball
1144
+ const pin = plan.version === 'latest' || plan.version === 'stable' ? '' : plan.version;
1145
+ script = [
1146
+ '#!/usr/bin/env bash',
1147
+ `# YSK Server — install Bun (${plan.version})`,
1148
+ 'set -euo pipefail',
1149
+ 'export BUN_INSTALL=/usr/local/ysk/bun',
1150
+ 'mkdir -p /usr/local/ysk/bun /usr/local/bin',
1151
+ `WANT=${JSON.stringify(pin)}`,
1152
+ 'if [ -z "$WANT" ]; then',
1153
+ ' curl -fsSL https://bun.sh/install | bash',
1154
+ 'else',
1155
+ ' case "$(uname -m)" in aarch64|arm64) BUN_OS=linux-aarch64 ;; *) BUN_OS=linux-x64 ;; esac',
1156
+ ' URL="https://github.com/oven-sh/bun/releases/download/bun-v${WANT}/bun-${BUN_OS}.zip"',
1157
+ ' echo "YSK_BUN_URL=$URL"',
1158
+ ' TMP=$(mktemp -d)',
1159
+ ' if ! curl -fsSL "$URL" -o "$TMP/bun.zip"; then',
1160
+ ' echo "Bun download failed for version ${WANT}" >&2',
1161
+ ' exit 22',
1162
+ ' fi',
1163
+ ' mkdir -p "$TMP/out" "$BUN_INSTALL/bin"',
1164
+ ' if command -v unzip >/dev/null 2>&1; then unzip -q "$TMP/bun.zip" -d "$TMP/out";',
1165
+ ' else python3 -c "import zipfile,sys; zipfile.ZipFile(sys.argv[1]).extractall(sys.argv[2])" "$TMP/bun.zip" "$TMP/out"; fi',
1166
+ ' BIN=$(find "$TMP/out" -type f -name bun | head -1)',
1167
+ ' test -n "$BIN"',
1168
+ ' install -m 755 "$BIN" "$BUN_INSTALL/bin/bun"',
1169
+ ' rm -rf "$TMP"',
1170
+ 'fi',
1171
+ 'ln -sfn /usr/local/ysk/bun/bin/bun /usr/local/bin/bun || true',
1172
+ 'export PATH="/usr/local/bin:/usr/local/ysk/bun/bin:$PATH"',
1173
+ 'GOT=$(bun --version)',
1174
+ 'echo "YSK_BUN_VERSION=$GOT"',
1175
+ 'if [ -n "$WANT" ] && [ "$GOT" != "$WANT" ]; then',
1176
+ ' # allow patch drift only if prefix matches (e.g. 1.2 vs 1.2.3)',
1177
+ ' case "$GOT" in',
1178
+ ' "$WANT"|"$WANT".*) ;;',
1179
+ ' *) echo "bun version mismatch: wanted ${WANT} got ${GOT}" >&2; exit 32 ;;',
1180
+ ' esac',
1181
+ 'fi',
1182
+ '',
1183
+ ].join('\n');
1184
+ notes.push(tl('notes.auto.t0414', { v0: plan.version }));
1185
+ }
1186
+ else {
1187
+ throw new Error(`unsupported runtime kind: ${input.kind}`);
1188
+ }
1189
+ // Companion plugins (pm2, poetry, maven, …) — all kinds except pure PHP extensions path
1190
+ // PHP uses `extensions` for apt modules; other kinds use `plugins`.
1191
+ if (input.kind !== 'php') {
1192
+ const built = buildRuntimePluginScriptLines(input.kind, input.plugins);
1193
+ pluginIds = built.ids;
1194
+ if (built.lines.length) {
1195
+ script = script.replace(/\n$/, '') + '\n' + built.lines.join('\n') + '\n';
1196
+ notes.push(tl('notes.runtime.plugins', {
1197
+ list: built.labels.join(', ') || built.ids.join(', '),
1198
+ }));
1199
+ }
1200
+ }
1201
+ const scriptPath = join(dir, 'install.sh');
1202
+ writeFileSync(scriptPath, script, 'utf8');
1203
+ written.push(scriptPath);
1204
+ notes.push(tl('notes.auto.n0762'));
1205
+ const want = Boolean(input.install);
1206
+ const execOn = input.host.executeEnabled();
1207
+ const rootOn = input.host.isRoot();
1208
+ const can = want && execOn && rootOn;
1209
+ let blocked = false;
1210
+ let blockMessage;
1211
+ if (want && !can) {
1212
+ blocked = true;
1213
+ if (!execOn) {
1214
+ blockMessage = tl('ops.blocked.install');
1215
+ }
1216
+ else if (!rootOn) {
1217
+ blockMessage = tl('notes.auto.n1582');
1218
+ }
1219
+ else {
1220
+ blockMessage = tl('ops.blocked.panel');
1221
+ }
1222
+ // Lead with the real reason so panels / 422 first-note fallback stay honest
1223
+ notes.unshift(blockMessage);
1224
+ }
1225
+ let failedPackages;
1226
+ if (can) {
1227
+ // Serialize with apt package updates (shared host mutating job lock)
1228
+ await withHostMutatingJob(async () => {
1229
+ input.onLog?.({
1230
+ stream: 'stdout',
1231
+ line: `YSK_INSTALL_START kind=${input.kind} version=${input.version}`,
1232
+ });
1233
+ input.onLog?.({ stream: 'stdout', line: `YSK_INSTALL_SCRIPT ${scriptPath}` });
1234
+ const r = await input.host.runCommand(['bash', scriptPath], {
1235
+ timeoutMs: 600_000,
1236
+ // Executor already splits on newlines; map chunk.text → line
1237
+ onChunk: input.onLog
1238
+ ? (c) => input.onLog({ stream: c.stream, line: c.text })
1239
+ : undefined,
1240
+ signal: input.abortSignal,
1241
+ });
1242
+ commandResults.push({
1243
+ argv: ['bash', scriptPath],
1244
+ exitCode: r.exitCode,
1245
+ stderr: r.stderr,
1246
+ });
1247
+ const out = `${r.stdout || ''}\n${r.stderr || ''}`;
1248
+ const pluginFailMatch = out.match(/YSK_PLUGIN_FAILED:([^\n]+)/);
1249
+ const pluginFailed = pluginFailMatch
1250
+ ? pluginFailMatch[1]
1251
+ .trim()
1252
+ .split(/\s+/)
1253
+ .filter(Boolean)
1254
+ : [];
1255
+ const phpFailMatch = out.match(/YSK_PHP_EXT_FAILED:\s*([^\n]+)/);
1256
+ if (phpFailMatch?.[1]) {
1257
+ failedPackages = phpFailMatch[1]
1258
+ .trim()
1259
+ .split(/\s+/)
1260
+ .filter(Boolean);
1261
+ notes.unshift(tl('notes.ops.phpPackagesPartialFail', {
1262
+ list: failedPackages.join(', '),
1263
+ }));
1264
+ }
1265
+ // exit 3 = runtime ok-ish but plugins failed; other non-zero = hard fail
1266
+ if (r.exitCode === 0) {
1267
+ notes.push(tl('notes.auto.n0656'));
1268
+ if (pluginIds?.length)
1269
+ notes.push(tl('notes.runtime.pluginsOk'));
1270
+ }
1271
+ else if (r.exitCode === 3 && pluginFailed.length) {
1272
+ notes.push(tl('notes.auto.n0656'));
1273
+ notes.unshift(tl('notes.runtime.pluginsFailed', { list: pluginFailed.join(', ') }));
1274
+ }
1275
+ else if (r.exitCode === 130) {
1276
+ notes.unshift(tl('notes.ops.installAborted'));
1277
+ }
1278
+ else {
1279
+ const detail = summarizeInstallLog(r.stderr || '', r.stdout || '') || String(r.exitCode);
1280
+ const failNote = tl('notes.auto.t0411', { v0: detail });
1281
+ notes.unshift(failNote);
1282
+ if (pluginFailed.length) {
1283
+ notes.push(tl('notes.runtime.pluginsFailed', { list: pluginFailed.join(', ') }));
1284
+ }
1285
+ }
1286
+ });
1287
+ }
1288
+ const hardFail = commandResults.some((c) => c.exitCode !== 0 && c.exitCode !== 3);
1289
+ const pluginPartial = commandResults.some((c) => c.exitCode === 3);
1290
+ // Runtime install ok if hard success OR plugin-only partial (exit 3)
1291
+ const ranOk = commandResults.length === 0 ||
1292
+ commandResults.every((c) => c.exitCode === 0) ||
1293
+ (pluginPartial && !hardFail);
1294
+ return {
1295
+ ok: want ? can && ranOk && !pluginPartial : true,
1296
+ kind: input.kind,
1297
+ version: input.version,
1298
+ written,
1299
+ notes,
1300
+ commandResults,
1301
+ requiresExecute: !execOn,
1302
+ requiresRoot: !rootOn,
1303
+ blocked: want ? blocked : false,
1304
+ blockMessage: want ? blockMessage : undefined,
1305
+ packages,
1306
+ extensionIds,
1307
+ pluginIds,
1308
+ failedPackages,
1309
+ };
1310
+ }
1311
+ /**
1312
+ * Switch the **active** host default without reinstalling.
1313
+ * - go: retarget /usr/local/bin/go → /usr/local/ysk/go/<v>/bin/go
1314
+ * - rust: rustup default <toolchain>
1315
+ * - node: retarget /usr/local/bin/node|npm|npx → /usr/local/ysk/node/<major>/bin/*
1316
+ * - bun: retarget /usr/local/bin/bun → /usr/local/ysk/bun/<v>/bin/bun (managed layout)
1317
+ * Other kinds: refused (install per version only).
1318
+ */
1319
+ export async function switchRuntimeDefault(input) {
1320
+ const notes = [];
1321
+ const commandResults = [];
1322
+ const execOn = input.host.executeEnabled();
1323
+ const rootOn = input.host.isRoot();
1324
+ const can = execOn && rootOn;
1325
+ const switchable = [
1326
+ 'go',
1327
+ 'rust',
1328
+ 'node',
1329
+ 'bun',
1330
+ 'php',
1331
+ 'python',
1332
+ 'java',
1333
+ 'kotlin',
1334
+ ];
1335
+ if (!switchable.includes(input.kind)) {
1336
+ return {
1337
+ ok: false,
1338
+ kind: input.kind,
1339
+ version: input.version,
1340
+ notes: [
1341
+ `Host default switch is not supported for ${input.kind}. Install a version, or use project-level pin.`,
1342
+ ],
1343
+ commandResults,
1344
+ requiresExecute: !execOn,
1345
+ requiresRoot: !rootOn,
1346
+ };
1347
+ }
1348
+ if (!can) {
1349
+ return {
1350
+ ok: false,
1351
+ kind: input.kind,
1352
+ version: input.version,
1353
+ notes: [tl('notes.auto.n1163')],
1354
+ commandResults,
1355
+ requiresExecute: !execOn,
1356
+ requiresRoot: !rootOn,
1357
+ blocked: true,
1358
+ blockMessage: tl('notes.auto.n1163'),
1359
+ };
1360
+ }
1361
+ let script = '';
1362
+ if (input.kind === 'go') {
1363
+ const plan = selectGoRuntime(input.version);
1364
+ script = [
1365
+ 'set -euo pipefail',
1366
+ `VER=${JSON.stringify(plan.version)}`,
1367
+ `DEST=/usr/local/ysk/go/$VER`,
1368
+ 'if [ ! -x "$DEST/bin/go" ]; then',
1369
+ ' echo "Go $VER not installed at $DEST — install first" >&2',
1370
+ ' exit 2',
1371
+ 'fi',
1372
+ 'mkdir -p /usr/local/ysk/go/bin /usr/local/bin',
1373
+ 'ln -sfn "$DEST/bin/go" /usr/local/bin/go',
1374
+ 'ln -sfn "$DEST/bin/go" /usr/local/ysk/go/bin/go',
1375
+ 'echo "YSK_GO_ACTIVE=$VER"',
1376
+ 'go version',
1377
+ 'readlink -f /usr/local/bin/go || true',
1378
+ '',
1379
+ ].join('\n');
1380
+ notes.push(`Switch active Go symlink → ${plan.version}`);
1381
+ }
1382
+ else if (input.kind === 'rust') {
1383
+ const plan = selectRustRuntime(input.version);
1384
+ const tc = plan.version === 'stable' ? 'stable' : plan.version;
1385
+ script = [
1386
+ 'set -euo pipefail',
1387
+ 'export RUSTUP_HOME=/usr/local/ysk/rust/rustup',
1388
+ 'export CARGO_HOME=/usr/local/ysk/rust/cargo',
1389
+ 'export PATH="$CARGO_HOME/bin:$RUSTUP_HOME/bin:/usr/local/ysk/rust/bin:$PATH"',
1390
+ 'RU=""',
1391
+ '[ -x "$CARGO_HOME/bin/rustup" ] && RU="$CARGO_HOME/bin/rustup"',
1392
+ '[ -z "$RU" ] && [ -x /usr/local/ysk/rust/bin/rustup ] && RU=/usr/local/ysk/rust/bin/rustup',
1393
+ '[ -z "$RU" ] && RU=$(command -v rustup 2>/dev/null || true)',
1394
+ 'if [ -z "$RU" ] || [ ! -x "$RU" ]; then',
1395
+ ' echo "rustup not found — install Rust first" >&2',
1396
+ ' exit 2',
1397
+ 'fi',
1398
+ `TC=${JSON.stringify(tc)}`,
1399
+ 'if ! "$RU" toolchain list 2>/dev/null | grep -qE "^${TC}(\\.|\\s|-|$)"; then',
1400
+ ' echo "Toolchain $TC not installed — install first" >&2',
1401
+ ' exit 2',
1402
+ 'fi',
1403
+ '"$RU" default "$TC"',
1404
+ 'mkdir -p /usr/local/ysk/rust/bin /usr/local/bin',
1405
+ 'ln -sfn "$CARGO_HOME/bin/cargo" /usr/local/bin/cargo 2>/dev/null || true',
1406
+ 'ln -sfn "$CARGO_HOME/bin/rustc" /usr/local/bin/rustc 2>/dev/null || true',
1407
+ 'ln -sfn "$CARGO_HOME/bin/rustup" /usr/local/bin/rustup 2>/dev/null || true',
1408
+ 'ln -sfn "$CARGO_HOME/bin/cargo" /usr/local/ysk/rust/bin/cargo 2>/dev/null || true',
1409
+ 'echo "YSK_RUST_ACTIVE=$TC"',
1410
+ 'cargo --version',
1411
+ 'rustc --version',
1412
+ '',
1413
+ ].join('\n');
1414
+ notes.push(`Switch rustup default → ${tc}`);
1415
+ }
1416
+ else if (input.kind === 'node') {
1417
+ const plan = selectNodeRuntime(input.version);
1418
+ script = [
1419
+ 'set -euo pipefail',
1420
+ `MAJOR=${JSON.stringify(plan.version)}`,
1421
+ 'DEST="/usr/local/ysk/node/$MAJOR"',
1422
+ 'if [ ! -x "$DEST/bin/node" ]; then',
1423
+ ' echo "Node $MAJOR not installed at $DEST — install first" >&2',
1424
+ ' exit 2',
1425
+ 'fi',
1426
+ 'mkdir -p /usr/local/bin',
1427
+ 'ln -sfn "$DEST/bin/node" /usr/local/bin/node',
1428
+ 'if [ -x "$DEST/bin/npm" ]; then ln -sfn "$DEST/bin/npm" /usr/local/bin/npm; fi',
1429
+ 'if [ -x "$DEST/bin/npx" ]; then ln -sfn "$DEST/bin/npx" /usr/local/bin/npx; fi',
1430
+ 'echo "YSK_NODE_ACTIVE=$MAJOR"',
1431
+ '"$DEST/bin/node" -v',
1432
+ 'readlink -f /usr/local/bin/node || true',
1433
+ '',
1434
+ ].join('\n');
1435
+ notes.push(`Switch active Node symlink → ${plan.version}`);
1436
+ }
1437
+ else if (input.kind === 'php') {
1438
+ const plan = selectPhpRuntime(input.version);
1439
+ script = [
1440
+ 'set -euo pipefail',
1441
+ `VER=${JSON.stringify(plan.version)}`,
1442
+ 'BIN=""',
1443
+ 'if [ -x "/usr/bin/php$VER" ]; then BIN="/usr/bin/php$VER"; fi',
1444
+ 'if [ -z "$BIN" ] && [ -x "/usr/local/bin/php$VER" ]; then BIN="/usr/local/bin/php$VER"; fi',
1445
+ 'if [ -z "$BIN" ]; then echo "php$VER not found — install PHP $VER first" >&2; exit 2; fi',
1446
+ 'mkdir -p /usr/local/bin',
1447
+ 'ln -sfn "$BIN" /usr/local/bin/php',
1448
+ 'if command -v update-alternatives >/dev/null 2>&1 && [ -x /usr/bin/php ]; then',
1449
+ ' update-alternatives --set php "$BIN" 2>/dev/null || true',
1450
+ 'fi',
1451
+ 'echo "YSK_PHP_ACTIVE=$VER"',
1452
+ '"$BIN" -v | head -1',
1453
+ 'readlink -f /usr/local/bin/php || true',
1454
+ '',
1455
+ ].join('\n');
1456
+ notes.push(`Switch host PHP CLI → ${plan.version}`);
1457
+ }
1458
+ else if (input.kind === 'python') {
1459
+ const plan = selectPythonRuntime(input.version);
1460
+ script = [
1461
+ 'set -euo pipefail',
1462
+ `VER=${JSON.stringify(plan.version)}`,
1463
+ 'BIN=""',
1464
+ 'if [ -x "/usr/bin/python$VER" ]; then BIN="/usr/bin/python$VER"; fi',
1465
+ 'if [ -z "$BIN" ] && [ -x "/usr/local/bin/python$VER" ]; then BIN="/usr/local/bin/python$VER"; fi',
1466
+ 'if [ -z "$BIN" ] && [ -x "/usr/local/ysk/python/$VER/bin/python$VER" ]; then BIN="/usr/local/ysk/python/$VER/bin/python$VER"; fi',
1467
+ 'if [ -z "$BIN" ]; then echo "python$VER not found — install Python $VER first" >&2; exit 2; fi',
1468
+ 'mkdir -p /usr/local/bin',
1469
+ 'ln -sfn "$BIN" /usr/local/bin/python3',
1470
+ 'ln -sfn "$BIN" /usr/local/bin/python 2>/dev/null || true',
1471
+ 'echo "YSK_PYTHON_ACTIVE=$VER"',
1472
+ '"$BIN" --version',
1473
+ 'readlink -f /usr/local/bin/python3 || true',
1474
+ '',
1475
+ ].join('\n');
1476
+ notes.push(`Switch host Python CLI → ${plan.version}`);
1477
+ }
1478
+ else if (input.kind === 'java') {
1479
+ const plan = selectJavaRuntime(input.version);
1480
+ script = [
1481
+ 'set -euo pipefail',
1482
+ `VER=${JSON.stringify(plan.version)}`,
1483
+ 'BIN=""',
1484
+ 'for c in \\',
1485
+ ' "/usr/lib/jvm/java-${VER}-openjdk-amd64/bin/java" \\',
1486
+ ' "/usr/lib/jvm/java-${VER}-openjdk-arm64/bin/java" \\',
1487
+ ' "/usr/lib/jvm/java-${VER}-openjdk/bin/java" \\',
1488
+ ' "/usr/local/ysk/java/${VER}/bin/java"; do',
1489
+ ' if [ -x "$c" ]; then BIN="$c"; break; fi',
1490
+ 'done',
1491
+ 'if [ -z "$BIN" ]; then echo "Java $VER not found under JVM paths — install first" >&2; exit 2; fi',
1492
+ 'HOME_JVM=$(dirname "$(dirname "$BIN")")',
1493
+ 'mkdir -p /usr/local/bin',
1494
+ 'ln -sfn "$BIN" /usr/local/bin/java',
1495
+ 'if [ -x "$HOME_JVM/bin/javac" ]; then ln -sfn "$HOME_JVM/bin/javac" /usr/local/bin/javac; fi',
1496
+ 'if command -v update-java-alternatives >/dev/null 2>&1; then',
1497
+ ' update-java-alternatives -s "java-1.${VER}.0-openjdk-amd64" 2>/dev/null \\',
1498
+ ' || update-java-alternatives -s "java-${VER}-openjdk-amd64" 2>/dev/null \\',
1499
+ ' || true',
1500
+ 'fi',
1501
+ 'echo "YSK_JAVA_ACTIVE=$VER"',
1502
+ '"$BIN" -version 2>&1 | head -1',
1503
+ 'readlink -f /usr/local/bin/java || true',
1504
+ '',
1505
+ ].join('\n');
1506
+ notes.push(`Switch host Java CLI → ${plan.version}`);
1507
+ }
1508
+ else if (input.kind === 'kotlin') {
1509
+ const plan = selectKotlinRuntime(input.version);
1510
+ script = [
1511
+ 'set -euo pipefail',
1512
+ `VER=${JSON.stringify(plan.version)}`,
1513
+ 'BIN=""',
1514
+ 'if [ -x "/usr/local/ysk/kotlin/bin/kotlinc" ]; then BIN=/usr/local/ysk/kotlin/bin/kotlinc; fi',
1515
+ 'if [ -z "$BIN" ] && [ -x "/usr/local/ysk/kotlin/$VER/bin/kotlinc" ]; then BIN="/usr/local/ysk/kotlin/$VER/bin/kotlinc"; fi',
1516
+ 'if [ -z "$BIN" ]; then echo "Kotlin $VER not found under /usr/local/ysk/kotlin — install first" >&2; exit 2; fi',
1517
+ 'KHOME=$(dirname "$(dirname "$BIN")")',
1518
+ 'mkdir -p /usr/local/bin',
1519
+ 'ln -sfn "$BIN" /usr/local/bin/kotlinc',
1520
+ 'if [ -x "$KHOME/bin/kotlin" ]; then ln -sfn "$KHOME/bin/kotlin" /usr/local/bin/kotlin; fi',
1521
+ 'echo "YSK_KOTLIN_ACTIVE=$VER"',
1522
+ '"$BIN" -version 2>&1 | head -1 || true',
1523
+ 'readlink -f /usr/local/bin/kotlinc || true',
1524
+ '',
1525
+ ].join('\n');
1526
+ notes.push(`Switch host Kotlin CLI → ${plan.version}`);
1527
+ }
1528
+ else if (input.kind === 'bun') {
1529
+ const plan = selectBunRuntime(input.version);
1530
+ script = [
1531
+ 'set -euo pipefail',
1532
+ `VER=${JSON.stringify(plan.version)}`,
1533
+ 'DEST="/usr/local/ysk/bun/$VER"',
1534
+ 'if [ ! -x "$DEST/bin/bun" ] && [ ! -x "/usr/local/ysk/bun/bin/bun" ]; then',
1535
+ ' # also accept single-dir layout',
1536
+ ' if [ -x /usr/local/bin/bun ]; then DEST_BIN=/usr/local/bin/bun; else',
1537
+ ' echo "Bun $VER not installed under /usr/local/ysk/bun — install first" >&2',
1538
+ ' exit 2',
1539
+ ' fi',
1540
+ 'else',
1541
+ ' if [ -x "$DEST/bin/bun" ]; then DEST_BIN="$DEST/bin/bun"; else DEST_BIN=/usr/local/ysk/bun/bin/bun; fi',
1542
+ 'fi',
1543
+ 'mkdir -p /usr/local/bin',
1544
+ 'ln -sfn "$DEST_BIN" /usr/local/bin/bun',
1545
+ 'echo "YSK_BUN_ACTIVE=$VER"',
1546
+ '"$DEST_BIN" --version || true',
1547
+ 'readlink -f /usr/local/bin/bun || true',
1548
+ '',
1549
+ ].join('\n');
1550
+ notes.push(`Switch active Bun symlink → ${plan.version}`);
1551
+ }
1552
+ const r = await input.host.runCommand(['bash', '-c', script], { timeoutMs: 120_000 });
1553
+ commandResults.push({
1554
+ argv: ['bash', '-c', `switch-${input.kind}-${input.version}`],
1555
+ exitCode: r.exitCode,
1556
+ stderr: r.stderr,
1557
+ });
1558
+ const out = `${r.stdout || ''}\n${r.stderr || ''}`;
1559
+ notes.push(...out
1560
+ .split('\n')
1561
+ .map((l) => l.trim())
1562
+ .filter(Boolean)
1563
+ .slice(0, 12));
1564
+ if (r.exitCode !== 0) {
1565
+ notes.unshift(summarizeInstallLog(r.stderr || '', r.stdout || '') || `exit ${r.exitCode}`);
1566
+ }
1567
+ return {
1568
+ ok: r.exitCode === 0,
1569
+ kind: input.kind,
1570
+ version: input.version,
1571
+ notes,
1572
+ commandResults,
1573
+ requiresExecute: false,
1574
+ requiresRoot: false,
1575
+ };
1576
+ }
1577
+ /**
1578
+ * Remove one managed runtime version (YSK install dir / rustup toolchain).
1579
+ * Never touches /home, /var/lib, or apt system packages except explicit refuse for php/python apt.
1580
+ * If the version was host default, clears /usr/local/bin symlinks for that binary.
1581
+ */
1582
+ export async function uninstallRuntimeVersion(input) {
1583
+ const notes = [];
1584
+ const commandResults = [];
1585
+ const execOn = input.host.executeEnabled();
1586
+ const rootOn = input.host.isRoot();
1587
+ const can = execOn && rootOn;
1588
+ const managed = [
1589
+ 'node',
1590
+ 'go',
1591
+ 'rust',
1592
+ 'bun',
1593
+ 'php',
1594
+ 'python',
1595
+ 'java',
1596
+ 'kotlin',
1597
+ ];
1598
+ if (!managed.includes(input.kind)) {
1599
+ return {
1600
+ ok: false,
1601
+ kind: input.kind,
1602
+ version: input.version,
1603
+ notes: [
1604
+ `Version uninstall for ${input.kind} is not supported yet (use package manager or panel stack uninstall).`,
1605
+ ],
1606
+ commandResults,
1607
+ requiresExecute: !execOn,
1608
+ requiresRoot: !rootOn,
1609
+ };
1610
+ }
1611
+ if (!can) {
1612
+ return {
1613
+ ok: false,
1614
+ kind: input.kind,
1615
+ version: input.version,
1616
+ notes: [tl('notes.auto.n1163')],
1617
+ commandResults,
1618
+ requiresExecute: !execOn,
1619
+ requiresRoot: !rootOn,
1620
+ blocked: true,
1621
+ blockMessage: tl('notes.auto.n1163'),
1622
+ };
1623
+ }
1624
+ let script = '';
1625
+ let removedPath = '';
1626
+ if (input.kind === 'node') {
1627
+ const plan = selectNodeRuntime(input.version);
1628
+ removedPath = `/usr/local/ysk/node/${plan.version}`;
1629
+ script = [
1630
+ 'set -euo pipefail',
1631
+ `MAJOR=${JSON.stringify(plan.version)}`,
1632
+ 'DEST="/usr/local/ysk/node/$MAJOR"',
1633
+ 'case "$DEST" in /usr/local/ysk/node/*) ;; *) echo "refuse path $DEST" >&2; exit 3 ;; esac',
1634
+ 'if [ ! -d "$DEST" ]; then echo "Node $MAJOR not at $DEST" >&2; exit 2; fi',
1635
+ 'ACTIVE=0',
1636
+ 'if [ -L /usr/local/bin/node ]; then',
1637
+ ' REAL=$(readlink -f /usr/local/bin/node 2>/dev/null || true)',
1638
+ ' case "$REAL" in "$DEST"/*) ACTIVE=1 ;; esac',
1639
+ 'fi',
1640
+ 'if [ "$ACTIVE" = "1" ]; then',
1641
+ ' rm -f /usr/local/bin/node /usr/local/bin/npm /usr/local/bin/npx',
1642
+ ' echo "YSK_NODE_DEFAULT_CLEARED=1"',
1643
+ 'fi',
1644
+ 'rm -rf "$DEST"',
1645
+ 'echo "YSK_NODE_REMOVED=$MAJOR"',
1646
+ 'echo "YSK_REMOVED_PATH=$DEST"',
1647
+ '',
1648
+ ].join('\n');
1649
+ notes.push(`Remove managed Node ${plan.version} at ${removedPath}`);
1650
+ }
1651
+ else if (input.kind === 'go') {
1652
+ const plan = selectGoRuntime(input.version);
1653
+ removedPath = `/usr/local/ysk/go/${plan.version}`;
1654
+ script = [
1655
+ 'set -euo pipefail',
1656
+ `VER=${JSON.stringify(plan.version)}`,
1657
+ 'DEST="/usr/local/ysk/go/$VER"',
1658
+ 'case "$DEST" in /usr/local/ysk/go/*) ;; *) echo "refuse path $DEST" >&2; exit 3 ;; esac',
1659
+ 'if [ ! -d "$DEST" ]; then echo "Go $VER not at $DEST" >&2; exit 2; fi',
1660
+ 'ACTIVE=0',
1661
+ 'if [ -L /usr/local/bin/go ]; then',
1662
+ ' REAL=$(readlink -f /usr/local/bin/go 2>/dev/null || true)',
1663
+ ' case "$REAL" in "$DEST"/*) ACTIVE=1 ;; esac',
1664
+ 'fi',
1665
+ 'if [ "$ACTIVE" = "1" ]; then',
1666
+ ' rm -f /usr/local/bin/go /usr/local/ysk/go/bin/go',
1667
+ ' echo "YSK_GO_DEFAULT_CLEARED=1"',
1668
+ 'fi',
1669
+ 'rm -rf "$DEST"',
1670
+ 'echo "YSK_GO_REMOVED=$VER"',
1671
+ 'echo "YSK_REMOVED_PATH=$DEST"',
1672
+ '',
1673
+ ].join('\n');
1674
+ notes.push(`Remove managed Go ${plan.version} at ${removedPath}`);
1675
+ }
1676
+ else if (input.kind === 'rust') {
1677
+ const plan = selectRustRuntime(input.version);
1678
+ const tc = plan.version === 'stable' ? 'stable' : plan.version;
1679
+ removedPath = `rustup:${tc}`;
1680
+ script = [
1681
+ 'set -euo pipefail',
1682
+ 'export RUSTUP_HOME=/usr/local/ysk/rust/rustup',
1683
+ 'export CARGO_HOME=/usr/local/ysk/rust/cargo',
1684
+ 'export PATH="$CARGO_HOME/bin:$RUSTUP_HOME/bin:/usr/local/ysk/rust/bin:$PATH"',
1685
+ 'RU=""',
1686
+ '[ -x "$CARGO_HOME/bin/rustup" ] && RU="$CARGO_HOME/bin/rustup"',
1687
+ '[ -z "$RU" ] && [ -x /usr/local/ysk/rust/bin/rustup ] && RU=/usr/local/ysk/rust/bin/rustup',
1688
+ '[ -z "$RU" ] && RU=$(command -v rustup 2>/dev/null || true)',
1689
+ 'if [ -z "$RU" ] || [ ! -x "$RU" ]; then echo "rustup not found" >&2; exit 2; fi',
1690
+ `TC=${JSON.stringify(tc)}`,
1691
+ 'if [ "$TC" = "stable" ]; then',
1692
+ ' echo "Refusing to uninstall rustup default channel stable entirely — switch default first or use toolchain id" >&2',
1693
+ ' # still allow if other toolchains exist and stable is not only one — keep simple: uninstall named',
1694
+ 'fi',
1695
+ '"$RU" toolchain uninstall "$TC" || { echo "toolchain uninstall failed for $TC" >&2; exit 2; }',
1696
+ 'echo "YSK_RUST_REMOVED=$TC"',
1697
+ '',
1698
+ ].join('\n');
1699
+ notes.push(`rustup toolchain uninstall ${tc}`);
1700
+ }
1701
+ else if (input.kind === 'php') {
1702
+ const plan = selectPhpRuntime(input.version);
1703
+ removedPath = `apt:php${plan.version}`;
1704
+ script = [
1705
+ 'set -euo pipefail',
1706
+ 'export DEBIAN_FRONTEND=noninteractive',
1707
+ `VER=${JSON.stringify(plan.version)}`,
1708
+ 'case "$VER" in',
1709
+ " ''|*[!0-9.]*) echo \"invalid PHP version $VER\" >&2; exit 3 ;;",
1710
+ 'esac',
1711
+ 'PKGS=$(dpkg-query -W -f=\'${Package}\\n\' "php${VER}-*" 2>/dev/null | head -80 || true)',
1712
+ 'if [ -z "$PKGS" ]; then',
1713
+ ' echo "No dpkg packages matching php${VER}-* — nothing to remove" >&2',
1714
+ ' exit 2',
1715
+ 'fi',
1716
+ 'echo "YSK_PHP_PACKAGES=$PKGS"',
1717
+ '# remove versioned packages only (never plain "php")',
1718
+ 'echo "$PKGS" | xargs -r apt-get remove -y',
1719
+ 'if [ -L /usr/local/bin/php ]; then',
1720
+ ' REAL=$(readlink -f /usr/local/bin/php 2>/dev/null || true)',
1721
+ ' case "$REAL" in *php"$VER"*) rm -f /usr/local/bin/php; echo "YSK_PHP_DEFAULT_CLEARED=1" ;; esac',
1722
+ 'fi',
1723
+ 'echo "YSK_PHP_REMOVED=$VER"',
1724
+ '',
1725
+ ].join('\n');
1726
+ notes.push(`apt remove php${plan.version}-* packages`);
1727
+ }
1728
+ else if (input.kind === 'python') {
1729
+ const plan = selectPythonRuntime(input.version);
1730
+ removedPath = `/usr/local/ysk/python/${plan.version}`;
1731
+ script = [
1732
+ 'set -euo pipefail',
1733
+ 'export DEBIAN_FRONTEND=noninteractive',
1734
+ `VER=${JSON.stringify(plan.version)}`,
1735
+ 'REMOVED=0',
1736
+ 'DEST="/usr/local/ysk/python/$VER"',
1737
+ 'if [ -d "$DEST" ]; then',
1738
+ ' case "$DEST" in /usr/local/ysk/python/*) ;; *) echo refuse >&2; exit 3 ;; esac',
1739
+ ' if [ -L /usr/local/bin/python3 ]; then',
1740
+ ' REAL=$(readlink -f /usr/local/bin/python3 2>/dev/null || true)',
1741
+ ' case "$REAL" in "$DEST"/*) rm -f /usr/local/bin/python3 /usr/local/bin/python; echo "YSK_PYTHON_DEFAULT_CLEARED=1" ;; esac',
1742
+ ' fi',
1743
+ ' rm -rf "$DEST"',
1744
+ ' REMOVED=1',
1745
+ ' echo "YSK_PYTHON_REMOVED_YSK=$VER"',
1746
+ 'fi',
1747
+ '# deadsnakes / system versioned binary only — do not purge unversioned python3',
1748
+ 'if dpkg-query -W "python${VER}" >/dev/null 2>&1 || dpkg-query -W "python${VER}-minimal" >/dev/null 2>&1; then',
1749
+ ' apt-get remove -y "python${VER}" "python${VER}-minimal" "python${VER}-dev" "python${VER}-venv" 2>/dev/null || true',
1750
+ ' REMOVED=1',
1751
+ ' echo "YSK_PYTHON_REMOVED_APT=$VER"',
1752
+ 'fi',
1753
+ 'if [ "$REMOVED" = "0" ]; then echo "Python $VER not found under managed paths or apt" >&2; exit 2; fi',
1754
+ '',
1755
+ ].join('\n');
1756
+ notes.push(`Remove managed/apt Python ${plan.version}`);
1757
+ }
1758
+ else if (input.kind === 'java') {
1759
+ const plan = selectJavaRuntime(input.version);
1760
+ removedPath = `apt:openjdk-${plan.version}`;
1761
+ script = [
1762
+ 'set -euo pipefail',
1763
+ 'export DEBIAN_FRONTEND=noninteractive',
1764
+ `VER=${JSON.stringify(plan.version)}`,
1765
+ 'case "$VER" in',
1766
+ " ''|*[!0-9]*) echo \"invalid Java major $VER\" >&2; exit 3 ;;",
1767
+ 'esac',
1768
+ 'PKGS=""',
1769
+ 'for p in "openjdk-${VER}-jdk" "openjdk-${VER}-jdk-headless" "openjdk-${VER}-jre" "openjdk-${VER}-jre-headless"; do',
1770
+ ' if dpkg-query -W "$p" >/dev/null 2>&1; then PKGS="$PKGS $p"; fi',
1771
+ 'done',
1772
+ 'if [ -z "$PKGS" ]; then echo "No openjdk-$VER packages installed" >&2; exit 2; fi',
1773
+ 'echo "YSK_JAVA_PACKAGES=$PKGS"',
1774
+ 'apt-get remove -y $PKGS',
1775
+ 'if [ -L /usr/local/bin/java ]; then',
1776
+ ' REAL=$(readlink -f /usr/local/bin/java 2>/dev/null || true)',
1777
+ ' case "$REAL" in *java-"$VER"*|*java-${VER}-*) rm -f /usr/local/bin/java /usr/local/bin/javac; echo "YSK_JAVA_DEFAULT_CLEARED=1" ;; esac',
1778
+ 'fi',
1779
+ 'echo "YSK_JAVA_REMOVED=$VER"',
1780
+ '',
1781
+ ].join('\n');
1782
+ notes.push(`apt remove openjdk-${plan.version}-* packages`);
1783
+ }
1784
+ else if (input.kind === 'kotlin') {
1785
+ const plan = selectKotlinRuntime(input.version);
1786
+ removedPath = '/usr/local/ysk/kotlin';
1787
+ script = [
1788
+ 'set -euo pipefail',
1789
+ `VER=${JSON.stringify(plan.version)}`,
1790
+ 'REMOVED=0',
1791
+ 'if [ -d "/usr/local/ysk/kotlin/$VER" ]; then',
1792
+ ' rm -rf "/usr/local/ysk/kotlin/$VER"',
1793
+ ' REMOVED=1',
1794
+ ' echo "YSK_KOTLIN_REMOVED_DIR=$VER"',
1795
+ 'fi',
1796
+ 'if [ -d /usr/local/ysk/kotlin ] && [ -x /usr/local/ysk/kotlin/bin/kotlinc ]; then',
1797
+ ' # single-layout install — only remove when version matches installed marker or latest',
1798
+ ' CUR=$(/usr/local/ysk/kotlin/bin/kotlinc -version 2>&1 | grep -oE "[0-9]+\\.[0-9]+(\\.[0-9]+)?" | head -1 || true)',
1799
+ ' if [ -n "$CUR" ] && { [ "$CUR" = "$VER" ] || [ "$VER" = "latest" ]; }; then',
1800
+ ' rm -f /usr/local/bin/kotlinc /usr/local/bin/kotlin',
1801
+ ' rm -rf /usr/local/ysk/kotlin',
1802
+ ' REMOVED=1',
1803
+ ' echo "YSK_KOTLIN_REMOVED_SINGLE=$VER"',
1804
+ ' fi',
1805
+ 'fi',
1806
+ 'if [ "$REMOVED" = "0" ]; then echo "Kotlin $VER not found under managed paths" >&2; exit 2; fi',
1807
+ 'echo "YSK_KOTLIN_REMOVED=$VER"',
1808
+ '',
1809
+ ].join('\n');
1810
+ notes.push(`Remove managed Kotlin ${plan.version}`);
1811
+ }
1812
+ else {
1813
+ // bun — multi-dir or single bin
1814
+ const plan = selectBunRuntime(input.version);
1815
+ removedPath = `/usr/local/ysk/bun/${plan.version}`;
1816
+ script = [
1817
+ 'set -euo pipefail',
1818
+ `VER=${JSON.stringify(plan.version)}`,
1819
+ 'DEST="/usr/local/ysk/bun/$VER"',
1820
+ 'REMOVED=0',
1821
+ 'if [ -d "$DEST" ]; then',
1822
+ ' case "$DEST" in /usr/local/ysk/bun/*) ;; *) echo "refuse" >&2; exit 3 ;; esac',
1823
+ ' if [ -L /usr/local/bin/bun ]; then',
1824
+ ' REAL=$(readlink -f /usr/local/bin/bun 2>/dev/null || true)',
1825
+ ' case "$REAL" in "$DEST"/*) rm -f /usr/local/bin/bun; echo "YSK_BUN_DEFAULT_CLEARED=1" ;; esac',
1826
+ ' fi',
1827
+ ' rm -rf "$DEST"',
1828
+ ' REMOVED=1',
1829
+ ' echo "YSK_BUN_REMOVED=$VER"',
1830
+ ' echo "YSK_REMOVED_PATH=$DEST"',
1831
+ 'fi',
1832
+ 'if [ "$REMOVED" = "0" ] && [ "$VER" = "latest" ] && [ -x /usr/local/ysk/bun/bin/bun ]; then',
1833
+ ' # single-origin layout: only remove when version is latest',
1834
+ ' rm -f /usr/local/bin/bun',
1835
+ ' rm -rf /usr/local/ysk/bun/bin /usr/local/ysk/bun',
1836
+ ' echo "YSK_BUN_REMOVED=single-layout"',
1837
+ ' REMOVED=1',
1838
+ 'fi',
1839
+ 'if [ "$REMOVED" = "0" ]; then echo "Bun $VER not found under managed paths" >&2; exit 2; fi',
1840
+ '',
1841
+ ].join('\n');
1842
+ notes.push(`Remove managed Bun ${plan.version}`);
1843
+ }
1844
+ const r = await input.host.runCommand(['bash', '-c', script], { timeoutMs: 180_000 });
1845
+ commandResults.push({
1846
+ argv: ['bash', '-c', `uninstall-${input.kind}-${input.version}`],
1847
+ exitCode: r.exitCode,
1848
+ stderr: r.stderr,
1849
+ });
1850
+ const out = `${r.stdout || ''}\n${r.stderr || ''}`;
1851
+ notes.push(...out
1852
+ .split('\n')
1853
+ .map((l) => l.trim())
1854
+ .filter(Boolean)
1855
+ .slice(0, 16));
1856
+ if (r.exitCode !== 0) {
1857
+ notes.unshift(summarizeInstallLog(r.stderr || '', r.stdout || '') || `exit ${r.exitCode}`);
1858
+ }
1859
+ const clearedHostDefault = /YSK_\w+_DEFAULT_CLEARED=1/.test(out);
1860
+ return {
1861
+ ok: r.exitCode === 0,
1862
+ kind: input.kind,
1863
+ version: input.version,
1864
+ notes,
1865
+ commandResults,
1866
+ requiresExecute: false,
1867
+ requiresRoot: false,
1868
+ removedPath,
1869
+ clearedHostDefault,
1870
+ };
1871
+ }
1872
+ //# sourceMappingURL=runtime-probe.js.map