@cicore/cli 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 (337) hide show
  1. package/bin/ci.js +13 -0
  2. package/dist/commands/addon/api-actions.d.ts +45 -0
  3. package/dist/commands/addon/api-actions.d.ts.map +1 -0
  4. package/dist/commands/addon/api-actions.js +281 -0
  5. package/dist/commands/addon/api-actions.js.map +1 -0
  6. package/dist/commands/addon/build.d.ts +11 -0
  7. package/dist/commands/addon/build.d.ts.map +1 -0
  8. package/dist/commands/addon/build.js +182 -0
  9. package/dist/commands/addon/build.js.map +1 -0
  10. package/dist/commands/addon/create.d.ts +11 -0
  11. package/dist/commands/addon/create.d.ts.map +1 -0
  12. package/dist/commands/addon/create.js +1186 -0
  13. package/dist/commands/addon/create.js.map +1 -0
  14. package/dist/commands/addon/delete.d.ts +13 -0
  15. package/dist/commands/addon/delete.d.ts.map +1 -0
  16. package/dist/commands/addon/delete.js +83 -0
  17. package/dist/commands/addon/delete.js.map +1 -0
  18. package/dist/commands/addon/deploy.d.ts +27 -0
  19. package/dist/commands/addon/deploy.d.ts.map +1 -0
  20. package/dist/commands/addon/deploy.js +459 -0
  21. package/dist/commands/addon/deploy.js.map +1 -0
  22. package/dist/commands/addon/dev-deploy.d.ts +31 -0
  23. package/dist/commands/addon/dev-deploy.d.ts.map +1 -0
  24. package/dist/commands/addon/dev-deploy.js +128 -0
  25. package/dist/commands/addon/dev-deploy.js.map +1 -0
  26. package/dist/commands/addon/dev.d.ts +36 -0
  27. package/dist/commands/addon/dev.d.ts.map +1 -0
  28. package/dist/commands/addon/dev.js +323 -0
  29. package/dist/commands/addon/dev.js.map +1 -0
  30. package/dist/commands/addon/extract-classes.d.ts +23 -0
  31. package/dist/commands/addon/extract-classes.d.ts.map +1 -0
  32. package/dist/commands/addon/extract-classes.js +281 -0
  33. package/dist/commands/addon/extract-classes.js.map +1 -0
  34. package/dist/commands/addon/generate-safelist.d.ts +24 -0
  35. package/dist/commands/addon/generate-safelist.d.ts.map +1 -0
  36. package/dist/commands/addon/generate-safelist.js +276 -0
  37. package/dist/commands/addon/generate-safelist.js.map +1 -0
  38. package/dist/commands/addon/index.d.ts +19 -0
  39. package/dist/commands/addon/index.d.ts.map +1 -0
  40. package/dist/commands/addon/index.js +296 -0
  41. package/dist/commands/addon/index.js.map +1 -0
  42. package/dist/commands/addon/init-repo.d.ts +25 -0
  43. package/dist/commands/addon/init-repo.d.ts.map +1 -0
  44. package/dist/commands/addon/init-repo.js +171 -0
  45. package/dist/commands/addon/init-repo.js.map +1 -0
  46. package/dist/commands/addon/install.d.ts +23 -0
  47. package/dist/commands/addon/install.d.ts.map +1 -0
  48. package/dist/commands/addon/install.js +84 -0
  49. package/dist/commands/addon/install.js.map +1 -0
  50. package/dist/commands/addon/list.d.ts +10 -0
  51. package/dist/commands/addon/list.d.ts.map +1 -0
  52. package/dist/commands/addon/list.js +102 -0
  53. package/dist/commands/addon/list.js.map +1 -0
  54. package/dist/commands/addon/manifest-refresh.d.ts +17 -0
  55. package/dist/commands/addon/manifest-refresh.d.ts.map +1 -0
  56. package/dist/commands/addon/manifest-refresh.js +48 -0
  57. package/dist/commands/addon/manifest-refresh.js.map +1 -0
  58. package/dist/commands/addon/migrate.d.ts +40 -0
  59. package/dist/commands/addon/migrate.d.ts.map +1 -0
  60. package/dist/commands/addon/migrate.js +236 -0
  61. package/dist/commands/addon/migrate.js.map +1 -0
  62. package/dist/commands/addon/publish.d.ts +33 -0
  63. package/dist/commands/addon/publish.d.ts.map +1 -0
  64. package/dist/commands/addon/publish.js +236 -0
  65. package/dist/commands/addon/publish.js.map +1 -0
  66. package/dist/commands/addon/scaffold-quality.d.ts +21 -0
  67. package/dist/commands/addon/scaffold-quality.d.ts.map +1 -0
  68. package/dist/commands/addon/scaffold-quality.js +90 -0
  69. package/dist/commands/addon/scaffold-quality.js.map +1 -0
  70. package/dist/commands/addon/sign.d.ts +9 -0
  71. package/dist/commands/addon/sign.d.ts.map +1 -0
  72. package/dist/commands/addon/sign.js +83 -0
  73. package/dist/commands/addon/sign.js.map +1 -0
  74. package/dist/commands/addon/toggle.d.ts +6 -0
  75. package/dist/commands/addon/toggle.d.ts.map +1 -0
  76. package/dist/commands/addon/toggle.js +46 -0
  77. package/dist/commands/addon/toggle.js.map +1 -0
  78. package/dist/commands/agent/index.d.ts +34 -0
  79. package/dist/commands/agent/index.d.ts.map +1 -0
  80. package/dist/commands/agent/index.js +564 -0
  81. package/dist/commands/agent/index.js.map +1 -0
  82. package/dist/commands/brand/index.d.ts +54 -0
  83. package/dist/commands/brand/index.d.ts.map +1 -0
  84. package/dist/commands/brand/index.js +367 -0
  85. package/dist/commands/brand/index.js.map +1 -0
  86. package/dist/commands/build/index.d.ts +53 -0
  87. package/dist/commands/build/index.d.ts.map +1 -0
  88. package/dist/commands/build/index.js +726 -0
  89. package/dist/commands/build/index.js.map +1 -0
  90. package/dist/commands/cache/flush-local.d.ts +31 -0
  91. package/dist/commands/cache/flush-local.d.ts.map +1 -0
  92. package/dist/commands/cache/flush-local.js +161 -0
  93. package/dist/commands/cache/flush-local.js.map +1 -0
  94. package/dist/commands/cache/index.d.ts +14 -0
  95. package/dist/commands/cache/index.d.ts.map +1 -0
  96. package/dist/commands/cache/index.js +453 -0
  97. package/dist/commands/cache/index.js.map +1 -0
  98. package/dist/commands/check/index.d.ts +8 -0
  99. package/dist/commands/check/index.d.ts.map +1 -0
  100. package/dist/commands/check/index.js +1316 -0
  101. package/dist/commands/check/index.js.map +1 -0
  102. package/dist/commands/cloudflare/index.d.ts +8 -0
  103. package/dist/commands/cloudflare/index.d.ts.map +1 -0
  104. package/dist/commands/cloudflare/index.js +453 -0
  105. package/dist/commands/cloudflare/index.js.map +1 -0
  106. package/dist/commands/core/create.d.ts +12 -0
  107. package/dist/commands/core/create.d.ts.map +1 -0
  108. package/dist/commands/core/create.js +206 -0
  109. package/dist/commands/core/create.js.map +1 -0
  110. package/dist/commands/core/delete.d.ts +11 -0
  111. package/dist/commands/core/delete.d.ts.map +1 -0
  112. package/dist/commands/core/delete.js +64 -0
  113. package/dist/commands/core/delete.js.map +1 -0
  114. package/dist/commands/core/env.d.ts +12 -0
  115. package/dist/commands/core/env.d.ts.map +1 -0
  116. package/dist/commands/core/env.js +95 -0
  117. package/dist/commands/core/env.js.map +1 -0
  118. package/dist/commands/core/health.d.ts +6 -0
  119. package/dist/commands/core/health.d.ts.map +1 -0
  120. package/dist/commands/core/health.js +215 -0
  121. package/dist/commands/core/health.js.map +1 -0
  122. package/dist/commands/core/index.d.ts +15 -0
  123. package/dist/commands/core/index.d.ts.map +1 -0
  124. package/dist/commands/core/index.js +86 -0
  125. package/dist/commands/core/index.js.map +1 -0
  126. package/dist/commands/core/list.d.ts +11 -0
  127. package/dist/commands/core/list.d.ts.map +1 -0
  128. package/dist/commands/core/list.js +58 -0
  129. package/dist/commands/core/list.js.map +1 -0
  130. package/dist/commands/core/rebuild.d.ts +13 -0
  131. package/dist/commands/core/rebuild.d.ts.map +1 -0
  132. package/dist/commands/core/rebuild.js +119 -0
  133. package/dist/commands/core/rebuild.js.map +1 -0
  134. package/dist/commands/db/index.d.ts +23 -0
  135. package/dist/commands/db/index.d.ts.map +1 -0
  136. package/dist/commands/db/index.js +355 -0
  137. package/dist/commands/db/index.js.map +1 -0
  138. package/dist/commands/db/promote-silo.d.ts +320 -0
  139. package/dist/commands/db/promote-silo.d.ts.map +1 -0
  140. package/dist/commands/db/promote-silo.js +930 -0
  141. package/dist/commands/db/promote-silo.js.map +1 -0
  142. package/dist/commands/db/relocate.d.ts +41 -0
  143. package/dist/commands/db/relocate.d.ts.map +1 -0
  144. package/dist/commands/db/relocate.js +482 -0
  145. package/dist/commands/db/relocate.js.map +1 -0
  146. package/dist/commands/db/rollback-silo.d.ts +44 -0
  147. package/dist/commands/db/rollback-silo.d.ts.map +1 -0
  148. package/dist/commands/db/rollback-silo.js +402 -0
  149. package/dist/commands/db/rollback-silo.js.map +1 -0
  150. package/dist/commands/deploy/index.d.ts +26 -0
  151. package/dist/commands/deploy/index.d.ts.map +1 -0
  152. package/dist/commands/deploy/index.js +107 -0
  153. package/dist/commands/deploy/index.js.map +1 -0
  154. package/dist/commands/devops/index.d.ts +6 -0
  155. package/dist/commands/devops/index.d.ts.map +1 -0
  156. package/dist/commands/devops/index.js +220 -0
  157. package/dist/commands/devops/index.js.map +1 -0
  158. package/dist/commands/domain/index.d.ts +8 -0
  159. package/dist/commands/domain/index.d.ts.map +1 -0
  160. package/dist/commands/domain/index.js +386 -0
  161. package/dist/commands/domain/index.js.map +1 -0
  162. package/dist/commands/image/index.d.ts +8 -0
  163. package/dist/commands/image/index.d.ts.map +1 -0
  164. package/dist/commands/image/index.js +308 -0
  165. package/dist/commands/image/index.js.map +1 -0
  166. package/dist/commands/install/factory-reset.d.ts +21 -0
  167. package/dist/commands/install/factory-reset.d.ts.map +1 -0
  168. package/dist/commands/install/factory-reset.js +83 -0
  169. package/dist/commands/install/factory-reset.js.map +1 -0
  170. package/dist/commands/install/index.d.ts +17 -0
  171. package/dist/commands/install/index.d.ts.map +1 -0
  172. package/dist/commands/install/index.js +44 -0
  173. package/dist/commands/install/index.js.map +1 -0
  174. package/dist/commands/install/install.d.ts +35 -0
  175. package/dist/commands/install/install.d.ts.map +1 -0
  176. package/dist/commands/install/install.js +171 -0
  177. package/dist/commands/install/install.js.map +1 -0
  178. package/dist/commands/login/index.d.ts +15 -0
  179. package/dist/commands/login/index.d.ts.map +1 -0
  180. package/dist/commands/login/index.js +58 -0
  181. package/dist/commands/login/index.js.map +1 -0
  182. package/dist/commands/nginx/index.d.ts +11 -0
  183. package/dist/commands/nginx/index.d.ts.map +1 -0
  184. package/dist/commands/nginx/index.js +580 -0
  185. package/dist/commands/nginx/index.js.map +1 -0
  186. package/dist/commands/server/bootstrap.d.ts +25 -0
  187. package/dist/commands/server/bootstrap.d.ts.map +1 -0
  188. package/dist/commands/server/bootstrap.js +260 -0
  189. package/dist/commands/server/bootstrap.js.map +1 -0
  190. package/dist/commands/server/index.d.ts +8 -0
  191. package/dist/commands/server/index.d.ts.map +1 -0
  192. package/dist/commands/server/index.js +2524 -0
  193. package/dist/commands/server/index.js.map +1 -0
  194. package/dist/commands/setup/index.d.ts +34 -0
  195. package/dist/commands/setup/index.d.ts.map +1 -0
  196. package/dist/commands/setup/index.js +423 -0
  197. package/dist/commands/setup/index.js.map +1 -0
  198. package/dist/commands/ssl/index.d.ts +8 -0
  199. package/dist/commands/ssl/index.d.ts.map +1 -0
  200. package/dist/commands/ssl/index.js +275 -0
  201. package/dist/commands/ssl/index.js.map +1 -0
  202. package/dist/commands/superadmin/index.d.ts +16 -0
  203. package/dist/commands/superadmin/index.d.ts.map +1 -0
  204. package/dist/commands/superadmin/index.js +81 -0
  205. package/dist/commands/superadmin/index.js.map +1 -0
  206. package/dist/commands/tenant/index.d.ts +6 -0
  207. package/dist/commands/tenant/index.d.ts.map +1 -0
  208. package/dist/commands/tenant/index.js +192 -0
  209. package/dist/commands/tenant/index.js.map +1 -0
  210. package/dist/index.d.ts +11 -0
  211. package/dist/index.d.ts.map +1 -0
  212. package/dist/index.js +107 -0
  213. package/dist/index.js.map +1 -0
  214. package/dist/lib/addon-sign.d.ts +23 -0
  215. package/dist/lib/addon-sign.d.ts.map +1 -0
  216. package/dist/lib/addon-sign.js +39 -0
  217. package/dist/lib/addon-sign.js.map +1 -0
  218. package/dist/lib/addon-sign.test.d.ts +2 -0
  219. package/dist/lib/addon-sign.test.d.ts.map +1 -0
  220. package/dist/lib/addon-sign.test.js +27 -0
  221. package/dist/lib/addon-sign.test.js.map +1 -0
  222. package/dist/lib/cdn.d.ts +25 -0
  223. package/dist/lib/cdn.d.ts.map +1 -0
  224. package/dist/lib/cdn.js +131 -0
  225. package/dist/lib/cdn.js.map +1 -0
  226. package/dist/lib/cloudflare.d.ts +133 -0
  227. package/dist/lib/cloudflare.d.ts.map +1 -0
  228. package/dist/lib/cloudflare.js +435 -0
  229. package/dist/lib/cloudflare.js.map +1 -0
  230. package/dist/lib/config.d.ts +96 -0
  231. package/dist/lib/config.d.ts.map +1 -0
  232. package/dist/lib/config.js +132 -0
  233. package/dist/lib/config.js.map +1 -0
  234. package/dist/lib/env.d.ts +8 -0
  235. package/dist/lib/env.d.ts.map +1 -0
  236. package/dist/lib/env.js +64 -0
  237. package/dist/lib/env.js.map +1 -0
  238. package/dist/lib/hosts.d.ts +194 -0
  239. package/dist/lib/hosts.d.ts.map +1 -0
  240. package/dist/lib/hosts.js +183 -0
  241. package/dist/lib/hosts.js.map +1 -0
  242. package/dist/lib/logger.d.ts +68 -0
  243. package/dist/lib/logger.d.ts.map +1 -0
  244. package/dist/lib/logger.js +130 -0
  245. package/dist/lib/logger.js.map +1 -0
  246. package/dist/lib/nginx-config.d.ts +78 -0
  247. package/dist/lib/nginx-config.d.ts.map +1 -0
  248. package/dist/lib/nginx-config.js +736 -0
  249. package/dist/lib/nginx-config.js.map +1 -0
  250. package/dist/lib/ops/addon-dev.d.ts +93 -0
  251. package/dist/lib/ops/addon-dev.d.ts.map +1 -0
  252. package/dist/lib/ops/addon-dev.js +237 -0
  253. package/dist/lib/ops/addon-dev.js.map +1 -0
  254. package/dist/lib/ops/addon-quality.d.ts +38 -0
  255. package/dist/lib/ops/addon-quality.d.ts.map +1 -0
  256. package/dist/lib/ops/addon-quality.js +338 -0
  257. package/dist/lib/ops/addon-quality.js.map +1 -0
  258. package/dist/lib/ops/addon-routes.d.ts +49 -0
  259. package/dist/lib/ops/addon-routes.d.ts.map +1 -0
  260. package/dist/lib/ops/addon-routes.js +189 -0
  261. package/dist/lib/ops/addon-routes.js.map +1 -0
  262. package/dist/lib/ops/addon.d.ts +120 -0
  263. package/dist/lib/ops/addon.d.ts.map +1 -0
  264. package/dist/lib/ops/addon.js +260 -0
  265. package/dist/lib/ops/addon.js.map +1 -0
  266. package/dist/lib/ops/cdn.d.ts +87 -0
  267. package/dist/lib/ops/cdn.d.ts.map +1 -0
  268. package/dist/lib/ops/cdn.js +170 -0
  269. package/dist/lib/ops/cdn.js.map +1 -0
  270. package/dist/lib/ops/cf.d.ts +36 -0
  271. package/dist/lib/ops/cf.d.ts.map +1 -0
  272. package/dist/lib/ops/cf.js +114 -0
  273. package/dist/lib/ops/cf.js.map +1 -0
  274. package/dist/lib/ops/compose.d.ts +95 -0
  275. package/dist/lib/ops/compose.d.ts.map +1 -0
  276. package/dist/lib/ops/compose.js +165 -0
  277. package/dist/lib/ops/compose.js.map +1 -0
  278. package/dist/lib/ops/core.d.ts +117 -0
  279. package/dist/lib/ops/core.d.ts.map +1 -0
  280. package/dist/lib/ops/core.js +322 -0
  281. package/dist/lib/ops/core.js.map +1 -0
  282. package/dist/lib/ops/db.d.ts +116 -0
  283. package/dist/lib/ops/db.d.ts.map +1 -0
  284. package/dist/lib/ops/db.js +351 -0
  285. package/dist/lib/ops/db.js.map +1 -0
  286. package/dist/lib/ops/dns.d.ts +111 -0
  287. package/dist/lib/ops/dns.d.ts.map +1 -0
  288. package/dist/lib/ops/dns.js +306 -0
  289. package/dist/lib/ops/dns.js.map +1 -0
  290. package/dist/lib/ops/image.d.ts +94 -0
  291. package/dist/lib/ops/image.d.ts.map +1 -0
  292. package/dist/lib/ops/image.js +159 -0
  293. package/dist/lib/ops/image.js.map +1 -0
  294. package/dist/lib/ops/nginx.d.ts +114 -0
  295. package/dist/lib/ops/nginx.d.ts.map +1 -0
  296. package/dist/lib/ops/nginx.js +388 -0
  297. package/dist/lib/ops/nginx.js.map +1 -0
  298. package/dist/lib/ops/redis.d.ts +7 -0
  299. package/dist/lib/ops/redis.d.ts.map +1 -0
  300. package/dist/lib/ops/redis.js +35 -0
  301. package/dist/lib/ops/redis.js.map +1 -0
  302. package/dist/lib/ops/ssh.d.ts +127 -0
  303. package/dist/lib/ops/ssh.d.ts.map +1 -0
  304. package/dist/lib/ops/ssh.js +269 -0
  305. package/dist/lib/ops/ssh.js.map +1 -0
  306. package/dist/lib/prompts.d.ts +46 -0
  307. package/dist/lib/prompts.d.ts.map +1 -0
  308. package/dist/lib/prompts.js +113 -0
  309. package/dist/lib/prompts.js.map +1 -0
  310. package/dist/lib/sast.d.ts +43 -0
  311. package/dist/lib/sast.d.ts.map +1 -0
  312. package/dist/lib/sast.js +79 -0
  313. package/dist/lib/sast.js.map +1 -0
  314. package/dist/lib/sast.test.d.ts +2 -0
  315. package/dist/lib/sast.test.d.ts.map +1 -0
  316. package/dist/lib/sast.test.js +33 -0
  317. package/dist/lib/sast.test.js.map +1 -0
  318. package/dist/lib/shell.d.ts +61 -0
  319. package/dist/lib/shell.d.ts.map +1 -0
  320. package/dist/lib/shell.js +183 -0
  321. package/dist/lib/shell.js.map +1 -0
  322. package/dist/lib/ssh-config.d.ts +37 -0
  323. package/dist/lib/ssh-config.d.ts.map +1 -0
  324. package/dist/lib/ssh-config.js +122 -0
  325. package/dist/lib/ssh-config.js.map +1 -0
  326. package/dist/lib/tenant-scope.d.ts +38 -0
  327. package/dist/lib/tenant-scope.d.ts.map +1 -0
  328. package/dist/lib/tenant-scope.js +129 -0
  329. package/dist/lib/tenant-scope.js.map +1 -0
  330. package/dist/lib/tenant-scope.test.d.ts +2 -0
  331. package/dist/lib/tenant-scope.test.d.ts.map +1 -0
  332. package/dist/lib/tenant-scope.test.js +223 -0
  333. package/dist/lib/tenant-scope.test.js.map +1 -0
  334. package/package.json +58 -0
  335. package/templates/bootstrap/.env.template +54 -0
  336. package/templates/bootstrap/docker-compose.yml +145 -0
  337. package/templates/vhost.conf.tmpl +446 -0
@@ -0,0 +1,8 @@
1
+ /**
2
+ * CiCore CLI - Docker Image Management
3
+ *
4
+ * Build, push, and pull Docker images
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare function registerImageCommands(program: Command): void;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/image/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwD5D"}
@@ -0,0 +1,308 @@
1
+ /**
2
+ * CiCore CLI - Docker Image Management
3
+ *
4
+ * Build, push, and pull Docker images
5
+ */
6
+ import { log, spinner } from '../../lib/logger.js';
7
+ import { exec } from '../../lib/shell.js';
8
+ import { paths, getDockerRegistry } from '../../lib/config.js';
9
+ import { confirm } from '../../lib/prompts.js';
10
+ import { getSSHHost, buildSSHCommand } from '../../lib/ssh-config.js';
11
+ const IMAGES = {
12
+ nuxt: {
13
+ name: 'vucore-nuxt',
14
+ dockerfile: 'Dockerfile.nuxt.production',
15
+ description: 'Nuxt.js frontend application',
16
+ },
17
+ php: {
18
+ name: 'vucore-php',
19
+ dockerfile: 'Dockerfile.php.production',
20
+ description: 'PHP backend API',
21
+ },
22
+ };
23
+ export function registerImageCommands(program) {
24
+ const image = program
25
+ .command('image')
26
+ .description('Docker image management');
27
+ // vu image:build
28
+ image
29
+ .command('build')
30
+ .description('Build Docker image locally')
31
+ .option('-i, --image <type>', 'Image type (nuxt, php)', 'nuxt')
32
+ .option('-t, --tag <tag>', 'Image tag', 'latest')
33
+ .option('--no-cache', 'Build without cache')
34
+ .action(async (options) => {
35
+ await buildImage(options);
36
+ });
37
+ // vu image:push
38
+ image
39
+ .command('push')
40
+ .description('Push image to Docker Hub')
41
+ .option('-i, --image <type>', 'Image type (nuxt, php)', 'nuxt')
42
+ .option('-t, --tag <tag>', 'Image tag', 'latest')
43
+ .action(async (options) => {
44
+ await pushImage(options);
45
+ });
46
+ // vu image:pull
47
+ image
48
+ .command('pull')
49
+ .description('Pull image on remote server')
50
+ .option('-h, --host <host>', 'SSH host name', 'cicore')
51
+ .option('-i, --image <type>', 'Image type (nuxt, php)', 'nuxt')
52
+ .option('-t, --tag <tag>', 'Image tag', 'latest')
53
+ .option('--rebuild', 'Rebuild container after pull')
54
+ .action(async (options) => {
55
+ await pullImage(options);
56
+ });
57
+ // vu image:list
58
+ image
59
+ .command('list')
60
+ .alias('ls')
61
+ .description('List local ciCore images')
62
+ .action(async () => {
63
+ await listImages();
64
+ });
65
+ // vu image:prune
66
+ image
67
+ .command('prune')
68
+ .description('Remove old/unused images')
69
+ .option('-h, --host <host>', 'SSH host (or "local" for local)', 'local')
70
+ .option('-f, --force', 'Skip confirmation')
71
+ .action(async (options) => {
72
+ await pruneImages(options);
73
+ });
74
+ }
75
+ // ============================================
76
+ // BUILD IMAGE (with live progress)
77
+ // ============================================
78
+ async function buildImage(options) {
79
+ const imageType = options.image;
80
+ const imageConfig = IMAGES[imageType];
81
+ if (!imageConfig) {
82
+ log.error(`Unknown image type: ${imageType}`);
83
+ log.info('Available: nuxt, php');
84
+ return;
85
+ }
86
+ const registry = getDockerRegistry();
87
+ const fullImageName = `${registry}/${imageConfig.name}:${options.tag}`;
88
+ log.title(`🔨 Build Image: ${imageConfig.name}`);
89
+ log.kv('Dockerfile', imageConfig.dockerfile);
90
+ log.kv('Tag', fullImageName);
91
+ log.kv('Cache', options.cache !== false ? 'Yes' : 'No');
92
+ log.blank();
93
+ const shouldBuild = await confirm('Start build?', true);
94
+ if (!shouldBuild) {
95
+ log.warn('Cancelled');
96
+ return;
97
+ }
98
+ const startTime = Date.now();
99
+ log.info('Building image (live output)...');
100
+ log.blank();
101
+ const args = [
102
+ 'build',
103
+ '-f', imageConfig.dockerfile,
104
+ '-t', fullImageName,
105
+ ];
106
+ if (options.cache === false) {
107
+ args.push('--no-cache');
108
+ }
109
+ args.push('.');
110
+ // Use streaming exec for live output
111
+ const result = await exec('docker', args, {
112
+ cwd: paths.dev.root,
113
+ silent: false, // Show live output
114
+ stream: true
115
+ });
116
+ log.blank();
117
+ if (!result.success) {
118
+ log.error('❌ Build failed');
119
+ if (result.stderr) {
120
+ log.error(result.stderr);
121
+ }
122
+ return;
123
+ }
124
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
125
+ log.success(`✅ Image built: ${fullImageName} (${elapsed}s)`);
126
+ // Show image size
127
+ const sizeResult = await exec('docker', ['images', fullImageName, '--format', '{{.Size}}'], { silent: true });
128
+ if (sizeResult.success) {
129
+ log.kv('Size', sizeResult.stdout.trim());
130
+ }
131
+ }
132
+ // ============================================
133
+ // PUSH IMAGE (with live progress)
134
+ // ============================================
135
+ async function pushImage(options) {
136
+ const imageType = options.image;
137
+ const imageConfig = IMAGES[imageType];
138
+ if (!imageConfig) {
139
+ log.error(`Unknown image type: ${imageType}`);
140
+ return;
141
+ }
142
+ const registry = getDockerRegistry();
143
+ const fullImageName = `${registry}/${imageConfig.name}:${options.tag}`;
144
+ log.title(`📤 Push Image: ${imageConfig.name}`);
145
+ log.kv('Image', fullImageName);
146
+ log.kv('Registry', registry);
147
+ log.blank();
148
+ // Check if image exists locally
149
+ const checkResult = await exec('docker', ['images', '-q', fullImageName], { silent: true });
150
+ if (!checkResult.stdout.trim()) {
151
+ log.error(`Image not found locally: ${fullImageName}`);
152
+ log.info('Build first: vu image build --image ' + imageType);
153
+ return;
154
+ }
155
+ const shouldPush = await confirm('Push to Docker Hub?', true);
156
+ if (!shouldPush) {
157
+ log.warn('Cancelled');
158
+ return;
159
+ }
160
+ const startTime = Date.now();
161
+ log.info('Pushing to Docker Hub (live progress)...');
162
+ log.blank();
163
+ // Stream push output for real-time progress
164
+ const result = await exec('docker', ['push', fullImageName], {
165
+ silent: false,
166
+ stream: true
167
+ });
168
+ log.blank();
169
+ if (!result.success) {
170
+ log.error('❌ Push failed');
171
+ log.info('Make sure you are logged in: docker login');
172
+ return;
173
+ }
174
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
175
+ log.success(`✅ Image pushed: ${fullImageName} (${elapsed}s)`);
176
+ }
177
+ // ============================================
178
+ // PULL IMAGE (with live progress)
179
+ // ============================================
180
+ async function pullImage(options) {
181
+ const imageType = options.image;
182
+ const imageConfig = IMAGES[imageType];
183
+ if (!imageConfig) {
184
+ log.error(`Unknown image type: ${imageType}`);
185
+ return;
186
+ }
187
+ const host = await getSSHHost(options.host);
188
+ if (!host) {
189
+ log.error(`SSH host "${options.host}" not found`);
190
+ return;
191
+ }
192
+ const registry = getDockerRegistry();
193
+ const fullImageName = `${registry}/${imageConfig.name}:${options.tag}`;
194
+ log.title(`📥 Pull Image: ${imageConfig.name}`);
195
+ log.kv('Image', fullImageName);
196
+ log.kv('Server', `${host.name} (${host.hostname})`);
197
+ log.kv('Rebuild', options.rebuild ? 'Yes' : 'No');
198
+ log.blank();
199
+ const shouldPull = await confirm('Pull image on server?', true);
200
+ if (!shouldPull) {
201
+ log.warn('Cancelled');
202
+ return;
203
+ }
204
+ const startTime = Date.now();
205
+ log.info('Pulling image on server (live progress)...');
206
+ log.blank();
207
+ // Stream pull output for real-time progress
208
+ const args = buildSSHCommand(host, `docker pull ${fullImageName}`);
209
+ const result = await exec('ssh', args, { silent: false, stream: true });
210
+ log.blank();
211
+ if (!result.success) {
212
+ log.error('❌ Pull failed');
213
+ return;
214
+ }
215
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
216
+ log.success(`✅ Image pulled (${elapsed}s)`);
217
+ // Rebuild container if requested
218
+ if (options.rebuild) {
219
+ log.blank();
220
+ log.info('Rebuilding container...');
221
+ log.blank();
222
+ const composeFile = imageType === 'nuxt'
223
+ ? '/home/services/docker-core-nuxt.yml'
224
+ : '/home/services/docker-core-php.yml';
225
+ const service = imageType === 'nuxt' ? 'nuxt' : 'php';
226
+ const rebuildCmd = `docker compose -f ${composeFile} up -d ${service} --force-recreate`;
227
+ const rebuildArgs = buildSSHCommand(host, rebuildCmd);
228
+ const rebuildResult = await exec('ssh', rebuildArgs, { silent: false, stream: true });
229
+ log.blank();
230
+ if (!rebuildResult.success) {
231
+ log.error('❌ Rebuild failed');
232
+ return;
233
+ }
234
+ log.success('✅ Container rebuilt');
235
+ }
236
+ log.blank();
237
+ log.success('🎉 Done!');
238
+ }
239
+ // ============================================
240
+ // LIST IMAGES
241
+ // ============================================
242
+ async function listImages() {
243
+ log.title('Local ciCore Images');
244
+ const registry = getDockerRegistry();
245
+ const result = await exec('docker', [
246
+ 'images',
247
+ '--filter', `reference=${registry}/cicore-*`,
248
+ '--format', 'table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedSince}}'
249
+ ], { silent: true });
250
+ if (!result.success) {
251
+ log.error('Failed to list images');
252
+ return;
253
+ }
254
+ if (!result.stdout.trim()) {
255
+ log.info('No ciCore images found');
256
+ return;
257
+ }
258
+ console.log(result.stdout);
259
+ }
260
+ // ============================================
261
+ // PRUNE IMAGES
262
+ // ============================================
263
+ async function pruneImages(options) {
264
+ log.title('🧹 Prune Images');
265
+ if (options.host === 'local') {
266
+ // Local prune
267
+ if (!options.force) {
268
+ const shouldPrune = await confirm('Remove unused Docker images?', false);
269
+ if (!shouldPrune) {
270
+ log.warn('Cancelled');
271
+ return;
272
+ }
273
+ }
274
+ const pruneSpinner = spinner('Removing unused images...').start();
275
+ const result = await exec('docker', ['image', 'prune', '-af'], { silent: true });
276
+ if (!result.success) {
277
+ pruneSpinner.fail('Prune failed');
278
+ return;
279
+ }
280
+ pruneSpinner.succeed('Unused images removed');
281
+ log.info(result.stdout);
282
+ }
283
+ else {
284
+ // Remote prune
285
+ const host = await getSSHHost(options.host);
286
+ if (!host) {
287
+ log.error(`SSH host "${options.host}" not found`);
288
+ return;
289
+ }
290
+ if (!options.force) {
291
+ const shouldPrune = await confirm(`Remove unused images on ${host.name}?`, false);
292
+ if (!shouldPrune) {
293
+ log.warn('Cancelled');
294
+ return;
295
+ }
296
+ }
297
+ const pruneSpinner = spinner('Removing unused images on server...').start();
298
+ const args = buildSSHCommand(host, 'docker image prune -af');
299
+ const result = await exec('ssh', args, { silent: true });
300
+ if (!result.success) {
301
+ pruneSpinner.fail('Prune failed');
302
+ return;
303
+ }
304
+ pruneSpinner.succeed('Unused images removed');
305
+ log.info(result.stdout);
306
+ }
307
+ }
308
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/image/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ci factory-reset — interactive CLI front for SetupController::factoryReset
3
+ *
4
+ * Calls the `/install/factoryreset` endpoint after a two-step danger
5
+ * confirmation: a yes/no prompt, then re-typing the literal string
6
+ * "FACTORY RESET" (mirrors the double-confirm pattern from the web UI).
7
+ * Operator must also provide the current super-admin password — the
8
+ * backend uses it to prove ownership before dropping the database.
9
+ *
10
+ * Used for: wiping a dev/staging install back to factory state without
11
+ * spinning down the stack. Production should never run this — there is
12
+ * no rollback once the DROP DATABASE commits.
13
+ */
14
+ export interface FactoryResetOptions {
15
+ readonly apiBase?: string;
16
+ readonly dbName?: string;
17
+ readonly password?: string;
18
+ readonly yes?: boolean;
19
+ }
20
+ export declare function runFactoryReset(options: FactoryResetOptions): Promise<void>;
21
+ //# sourceMappingURL=factory-reset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-reset.d.ts","sourceRoot":"","sources":["../../../src/commands/install/factory-reset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CACvB;AAOD,wBAAsB,eAAe,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEjF"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * ci factory-reset — interactive CLI front for SetupController::factoryReset
3
+ *
4
+ * Calls the `/install/factoryreset` endpoint after a two-step danger
5
+ * confirmation: a yes/no prompt, then re-typing the literal string
6
+ * "FACTORY RESET" (mirrors the double-confirm pattern from the web UI).
7
+ * Operator must also provide the current super-admin password — the
8
+ * backend uses it to prove ownership before dropping the database.
9
+ *
10
+ * Used for: wiping a dev/staging install back to factory state without
11
+ * spinning down the stack. Production should never run this — there is
12
+ * no rollback once the DROP DATABASE commits.
13
+ */
14
+ import { input, confirm, password as passwordPrompt } from '../../lib/prompts.js';
15
+ import { log, spinner } from '../../lib/logger.js';
16
+ import chalk from 'chalk';
17
+ // Backend expects this exact string in the `confirm_dangerous` field —
18
+ // changing it on the CLI side without matching the backend would silently
19
+ // fail every reset. Keep in sync with SetupController::factoryReset.
20
+ const CONFIRM_PHRASE = 'RESET_EVERYTHING';
21
+ export async function runFactoryReset(options) {
22
+ const apiBase = (options.apiBase ?? 'http://localhost:3080').replace(/\/$/, '');
23
+ log.blank();
24
+ log.warn(chalk.red.bold('⚠ DANGER — Factory Reset'));
25
+ log.warn('This will DROP the application database and wipe all data.');
26
+ log.warn('There is NO recovery from this. Backups must be taken first.');
27
+ log.info(`Target API: ${apiBase}`);
28
+ log.blank();
29
+ if (options.yes !== true) {
30
+ const first = await confirm('Do you really want to factory-reset this installation?', false);
31
+ if (!first) {
32
+ log.info('Cancelled');
33
+ return;
34
+ }
35
+ const typed = await input(`Type ${chalk.red.bold(CONFIRM_PHRASE)} to confirm`);
36
+ if (typed.trim() !== CONFIRM_PHRASE) {
37
+ log.warn('Confirmation phrase mismatch — cancelled');
38
+ return;
39
+ }
40
+ }
41
+ // Backend asks for the current super-admin password before dropping. If
42
+ // the system was never fully installed (no users table, no super admin
43
+ // yet) the backend's verifySuperAdminPassword returns false and a
44
+ // reset is allowed regardless — we still ask, to be consistent.
45
+ const password = options.password ?? (await passwordPrompt('Super admin password (hidden)'));
46
+ const dbName = options.dbName ?? '';
47
+ const spin = spinner('Dropping database + resetting install state...').start();
48
+ let res;
49
+ try {
50
+ res = await fetch(`${apiBase}/setup/factory-reset`, {
51
+ method: 'POST',
52
+ headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
53
+ body: JSON.stringify({
54
+ super_admin_password: password,
55
+ confirm_dangerous: CONFIRM_PHRASE,
56
+ ...(dbName !== '' ? { db_name: dbName } : {}),
57
+ }),
58
+ signal: AbortSignal.timeout(2 * 60 * 1000),
59
+ });
60
+ }
61
+ catch (err) {
62
+ spin.fail('Request failed');
63
+ log.error(err instanceof Error ? err.message : String(err));
64
+ return;
65
+ }
66
+ let body = {};
67
+ try {
68
+ body = (await res.json());
69
+ }
70
+ catch {
71
+ spin.fail(`HTTP ${res.status} — non-JSON response`);
72
+ return;
73
+ }
74
+ if (!res.ok || body.success === false) {
75
+ spin.fail('Factory reset failed');
76
+ log.error(body.message ?? `HTTP ${res.status}`);
77
+ return;
78
+ }
79
+ spin.succeed('Factory reset complete');
80
+ log.blank();
81
+ log.success(body.message ?? 'Installation wiped. Run `ci install` to set up again.');
82
+ }
83
+ //# sourceMappingURL=factory-reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-reset.js","sourceRoot":"","sources":["../../../src/commands/install/factory-reset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `ci install` + `ci factory-reset` — top-level installation commands.
3
+ *
4
+ * These mirror the web UI at `/install/setup` and `/install/factoryreset`
5
+ * for operators who would rather drive the four-step wizard from a
6
+ * terminal than a browser. Backend stays the same (SetupController +
7
+ * SetupService); these commands are pure clients.
8
+ *
9
+ * Not to be confused with `ci setup <core>`, which provisions the
10
+ * filesystem + nginx + SSL skeleton for a brand-new core on a remote
11
+ * host. Setup runs once per core, before the app DB exists; `ci install`
12
+ * runs once per core, after the stack is up, to create the DB + super
13
+ * admin + run migrations.
14
+ */
15
+ import type { Command } from 'commander';
16
+ export declare function registerInstallCommands(program: Command): void;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/install/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAIxC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2B9D"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `ci install` + `ci factory-reset` — top-level installation commands.
3
+ *
4
+ * These mirror the web UI at `/install/setup` and `/install/factoryreset`
5
+ * for operators who would rather drive the four-step wizard from a
6
+ * terminal than a browser. Backend stays the same (SetupController +
7
+ * SetupService); these commands are pure clients.
8
+ *
9
+ * Not to be confused with `ci setup <core>`, which provisions the
10
+ * filesystem + nginx + SSL skeleton for a brand-new core on a remote
11
+ * host. Setup runs once per core, before the app DB exists; `ci install`
12
+ * runs once per core, after the stack is up, to create the DB + super
13
+ * admin + run migrations.
14
+ */
15
+ import { runInstall } from './install.js';
16
+ import { runFactoryReset } from './factory-reset.js';
17
+ export function registerInstallCommands(program) {
18
+ program
19
+ .command('install')
20
+ .description('Interactive app install: DB + super admin + migrations (POST /setup/install)')
21
+ .option('--api-base <url>', 'Backend API base URL', 'http://localhost:3080')
22
+ .option('--db-name <name>', 'Database name (skips prompt)')
23
+ .option('--gateway <gateway>', 'Database gateway: local | managed')
24
+ .option('--admin-name <name>', 'Super admin display name (skips prompt)')
25
+ .option('--admin-email <email>', 'Super admin email (skips prompt)')
26
+ .option('--admin-password <pw>', 'Super admin password (skips prompt — avoid on shared TTYs)')
27
+ .option('--tenant-mode <mode>', 'Tenant mode: subdomain | path')
28
+ .option('--tenant-name <name>', 'Tenant display name (skips prompt)')
29
+ .option('-y, --yes', 'Skip final confirmation', false)
30
+ .action(async (options) => {
31
+ await runInstall(options);
32
+ });
33
+ program
34
+ .command('factory-reset')
35
+ .description('DANGER: drop DB + reset install state (POST /setup/factory-reset)')
36
+ .option('--api-base <url>', 'Backend API base URL', 'http://localhost:3080')
37
+ .option('--db-name <name>', 'Database name (optional, backend auto-detects from .env)')
38
+ .option('--password <pw>', 'Super admin password (skips prompt)')
39
+ .option('-y, --yes', 'Skip both confirmation steps (DANGEROUS — use only in CI)', false)
40
+ .action(async (options) => {
41
+ await runFactoryReset(options);
42
+ });
43
+ }
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/install/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,8EAA8E,CAAC;SAC3F,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,uBAAuB,CAAC;SAC3E,MAAM,CAAC,kBAAkB,EAAE,8BAA8B,CAAC;SAC1D,MAAM,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;SAClE,MAAM,CAAC,qBAAqB,EAAE,yCAAyC,CAAC;SACxE,MAAM,CAAC,uBAAuB,EAAE,kCAAkC,CAAC;SACnE,MAAM,CAAC,uBAAuB,EAAE,4DAA4D,CAAC;SAC7F,MAAM,CAAC,sBAAsB,EAAE,+BAA+B,CAAC;SAC/D,MAAM,CAAC,sBAAsB,EAAE,oCAAoC,CAAC;SACpE,MAAM,CAAC,WAAW,EAAE,yBAAyB,EAAE,KAAK,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,UAAU,CAAC,OAAO,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEJ,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,mEAAmE,CAAC;SAChF,MAAM,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,uBAAuB,CAAC;SAC3E,MAAM,CAAC,kBAAkB,EAAE,0DAA0D,CAAC;SACtF,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SAChE,MAAM,CAAC,WAAW,EAAE,2DAA2D,EAAE,KAAK,CAAC;SACvF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,eAAe,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * ci install — interactive CLI front for SetupController::install
3
+ *
4
+ * Walks the operator through the four-step setup wizard that previously
5
+ * lived only in the `/install/setup` Nuxt page:
6
+ *
7
+ * 1. Database (name + gateway)
8
+ * 2. Super admin (name, email, password)
9
+ * 3. Tenant (mode + display name)
10
+ * 4. Confirm + POST → backend runs migrations + tenant/user creation
11
+ * inside a transaction; rolls back the whole thing on failure.
12
+ *
13
+ * Every prompt accepts a corresponding `--flag` so the same code path
14
+ * also runs in non-interactive contexts (CI, scripted setups). Required
15
+ * fields default to interactive when neither flag nor prompt value is
16
+ * provided.
17
+ *
18
+ * Talks to the API over plain HTTP — the backend exposes /install/* as
19
+ * unauthenticated only when the system is in initial-setup state; once
20
+ * the first super admin lands, the same endpoints require a super-admin
21
+ * session (handling that auth flow is FUTURE).
22
+ */
23
+ export interface InstallOptions {
24
+ readonly apiBase?: string;
25
+ readonly dbName?: string;
26
+ readonly gateway?: string;
27
+ readonly adminName?: string;
28
+ readonly adminEmail?: string;
29
+ readonly adminPassword?: string;
30
+ readonly tenantMode?: string;
31
+ readonly tenantName?: string;
32
+ readonly yes?: boolean;
33
+ }
34
+ export declare function runInstall(options: InstallOptions): Promise<void>;
35
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/commands/install/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CACvB;AAiBD,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA2JvE"}