@calltelemetry/cli 0.1.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 (297) hide show
  1. package/dist/commands/config.d.ts +3 -0
  2. package/dist/commands/config.d.ts.map +1 -0
  3. package/dist/commands/config.js +201 -0
  4. package/dist/commands/config.js.map +1 -0
  5. package/dist/commands/db.d.ts +3 -0
  6. package/dist/commands/db.d.ts.map +1 -0
  7. package/dist/commands/db.js +143 -0
  8. package/dist/commands/db.js.map +1 -0
  9. package/dist/commands/diag.d.ts +3 -0
  10. package/dist/commands/diag.d.ts.map +1 -0
  11. package/dist/commands/diag.js +123 -0
  12. package/dist/commands/diag.js.map +1 -0
  13. package/dist/commands/docker.d.ts +3 -0
  14. package/dist/commands/docker.d.ts.map +1 -0
  15. package/dist/commands/docker.js +34 -0
  16. package/dist/commands/docker.js.map +1 -0
  17. package/dist/commands/jtapi.d.ts +3 -0
  18. package/dist/commands/jtapi.d.ts.map +1 -0
  19. package/dist/commands/jtapi.js +36 -0
  20. package/dist/commands/jtapi.js.map +1 -0
  21. package/dist/commands/migrate.d.ts +3 -0
  22. package/dist/commands/migrate.d.ts.map +1 -0
  23. package/dist/commands/migrate.js +49 -0
  24. package/dist/commands/migrate.js.map +1 -0
  25. package/dist/commands/offline.d.ts +3 -0
  26. package/dist/commands/offline.d.ts.map +1 -0
  27. package/dist/commands/offline.js +170 -0
  28. package/dist/commands/offline.js.map +1 -0
  29. package/dist/commands/secrets.d.ts +3 -0
  30. package/dist/commands/secrets.d.ts.map +1 -0
  31. package/dist/commands/secrets.js +55 -0
  32. package/dist/commands/secrets.js.map +1 -0
  33. package/dist/commands/status.d.ts +3 -0
  34. package/dist/commands/status.d.ts.map +1 -0
  35. package/dist/commands/status.js +13 -0
  36. package/dist/commands/status.js.map +1 -0
  37. package/dist/commands/update.d.ts +3 -0
  38. package/dist/commands/update.d.ts.map +1 -0
  39. package/dist/commands/update.js +202 -0
  40. package/dist/commands/update.js.map +1 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +65 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/lib/bundle.d.ts +5 -0
  46. package/dist/lib/bundle.d.ts.map +1 -0
  47. package/dist/lib/bundle.js +134 -0
  48. package/dist/lib/bundle.js.map +1 -0
  49. package/dist/lib/certs.d.ts +3 -0
  50. package/dist/lib/certs.d.ts.map +1 -0
  51. package/dist/lib/certs.js +29 -0
  52. package/dist/lib/certs.js.map +1 -0
  53. package/dist/lib/compose.d.ts +36 -0
  54. package/dist/lib/compose.d.ts.map +1 -0
  55. package/dist/lib/compose.js +137 -0
  56. package/dist/lib/compose.js.map +1 -0
  57. package/dist/lib/db.d.ts +6 -0
  58. package/dist/lib/db.d.ts.map +1 -0
  59. package/dist/lib/db.js +6 -0
  60. package/dist/lib/db.js.map +1 -0
  61. package/dist/lib/fs.d.ts +20 -0
  62. package/dist/lib/fs.d.ts.map +1 -0
  63. package/dist/lib/fs.js +72 -0
  64. package/dist/lib/fs.js.map +1 -0
  65. package/dist/lib/jtapi.d.ts +6 -0
  66. package/dist/lib/jtapi.d.ts.map +1 -0
  67. package/dist/lib/jtapi.js +27 -0
  68. package/dist/lib/jtapi.js.map +1 -0
  69. package/dist/lib/network.d.ts +43 -0
  70. package/dist/lib/network.d.ts.map +1 -0
  71. package/dist/lib/network.js +172 -0
  72. package/dist/lib/network.js.map +1 -0
  73. package/dist/lib/paths.d.ts +19 -0
  74. package/dist/lib/paths.d.ts.map +1 -0
  75. package/dist/lib/paths.js +57 -0
  76. package/dist/lib/paths.js.map +1 -0
  77. package/dist/lib/postgres.d.ts +4 -0
  78. package/dist/lib/postgres.d.ts.map +1 -0
  79. package/dist/lib/postgres.js +49 -0
  80. package/dist/lib/postgres.js.map +1 -0
  81. package/dist/lib/rpc.d.ts +5 -0
  82. package/dist/lib/rpc.d.ts.map +1 -0
  83. package/dist/lib/rpc.js +28 -0
  84. package/dist/lib/rpc.js.map +1 -0
  85. package/dist/lib/secrets.d.ts +38 -0
  86. package/dist/lib/secrets.d.ts.map +1 -0
  87. package/dist/lib/secrets.js +132 -0
  88. package/dist/lib/secrets.js.map +1 -0
  89. package/dist/lib/system.d.ts +12 -0
  90. package/dist/lib/system.d.ts.map +1 -0
  91. package/dist/lib/system.js +61 -0
  92. package/dist/lib/system.js.map +1 -0
  93. package/dist/ui/components/AppShell.d.ts +9 -0
  94. package/dist/ui/components/AppShell.d.ts.map +1 -0
  95. package/dist/ui/components/AppShell.js +6 -0
  96. package/dist/ui/components/AppShell.js.map +1 -0
  97. package/dist/ui/components/Confirm.d.ts +7 -0
  98. package/dist/ui/components/Confirm.d.ts.map +1 -0
  99. package/dist/ui/components/Confirm.js +14 -0
  100. package/dist/ui/components/Confirm.js.map +1 -0
  101. package/dist/ui/components/DataTable.d.ts +12 -0
  102. package/dist/ui/components/DataTable.d.ts.map +1 -0
  103. package/dist/ui/components/DataTable.js +28 -0
  104. package/dist/ui/components/DataTable.js.map +1 -0
  105. package/dist/ui/components/Divider.d.ts +6 -0
  106. package/dist/ui/components/Divider.d.ts.map +1 -0
  107. package/dist/ui/components/Divider.js +6 -0
  108. package/dist/ui/components/Divider.js.map +1 -0
  109. package/dist/ui/components/KeyValue.d.ts +11 -0
  110. package/dist/ui/components/KeyValue.d.ts.map +1 -0
  111. package/dist/ui/components/KeyValue.js +7 -0
  112. package/dist/ui/components/KeyValue.js.map +1 -0
  113. package/dist/ui/components/Section.d.ts +8 -0
  114. package/dist/ui/components/Section.d.ts.map +1 -0
  115. package/dist/ui/components/Section.js +6 -0
  116. package/dist/ui/components/Section.js.map +1 -0
  117. package/dist/ui/components/SelectMenu.d.ts +14 -0
  118. package/dist/ui/components/SelectMenu.d.ts.map +1 -0
  119. package/dist/ui/components/SelectMenu.js +55 -0
  120. package/dist/ui/components/SelectMenu.js.map +1 -0
  121. package/dist/ui/components/ShellOutput.d.ts +7 -0
  122. package/dist/ui/components/ShellOutput.d.ts.map +1 -0
  123. package/dist/ui/components/ShellOutput.js +10 -0
  124. package/dist/ui/components/ShellOutput.js.map +1 -0
  125. package/dist/ui/components/Spinner.d.ts +6 -0
  126. package/dist/ui/components/Spinner.d.ts.map +1 -0
  127. package/dist/ui/components/Spinner.js +7 -0
  128. package/dist/ui/components/Spinner.js.map +1 -0
  129. package/dist/ui/components/StatusBox.d.ts +8 -0
  130. package/dist/ui/components/StatusBox.d.ts.map +1 -0
  131. package/dist/ui/components/StatusBox.js +12 -0
  132. package/dist/ui/components/StatusBox.js.map +1 -0
  133. package/dist/ui/components/StatusLine.d.ts +8 -0
  134. package/dist/ui/components/StatusLine.d.ts.map +1 -0
  135. package/dist/ui/components/StatusLine.js +13 -0
  136. package/dist/ui/components/StatusLine.js.map +1 -0
  137. package/dist/ui/components/StepList.d.ts +11 -0
  138. package/dist/ui/components/StepList.d.ts.map +1 -0
  139. package/dist/ui/components/StepList.js +19 -0
  140. package/dist/ui/components/StepList.js.map +1 -0
  141. package/dist/ui/components/SubSection.d.ts +8 -0
  142. package/dist/ui/components/SubSection.d.ts.map +1 -0
  143. package/dist/ui/components/SubSection.js +6 -0
  144. package/dist/ui/components/SubSection.js.map +1 -0
  145. package/dist/ui/components/TextInput.d.ts +11 -0
  146. package/dist/ui/components/TextInput.d.ts.map +1 -0
  147. package/dist/ui/components/TextInput.js +7 -0
  148. package/dist/ui/components/TextInput.js.map +1 -0
  149. package/dist/ui/components/index.d.ts +16 -0
  150. package/dist/ui/components/index.d.ts.map +1 -0
  151. package/dist/ui/components/index.js +15 -0
  152. package/dist/ui/components/index.js.map +1 -0
  153. package/dist/ui/hooks/index.d.ts +7 -0
  154. package/dist/ui/hooks/index.d.ts.map +1 -0
  155. package/dist/ui/hooks/index.js +5 -0
  156. package/dist/ui/hooks/index.js.map +1 -0
  157. package/dist/ui/hooks/useAsyncTask.d.ts +9 -0
  158. package/dist/ui/hooks/useAsyncTask.d.ts.map +1 -0
  159. package/dist/ui/hooks/useAsyncTask.js +22 -0
  160. package/dist/ui/hooks/useAsyncTask.js.map +1 -0
  161. package/dist/ui/hooks/usePolling.d.ts +8 -0
  162. package/dist/ui/hooks/usePolling.d.ts.map +1 -0
  163. package/dist/ui/hooks/usePolling.js +43 -0
  164. package/dist/ui/hooks/usePolling.js.map +1 -0
  165. package/dist/ui/hooks/useStepRunner.d.ts +16 -0
  166. package/dist/ui/hooks/useStepRunner.d.ts.map +1 -0
  167. package/dist/ui/hooks/useStepRunner.js +42 -0
  168. package/dist/ui/hooks/useStepRunner.js.map +1 -0
  169. package/dist/ui/hooks/useStreamingProcess.d.ts +8 -0
  170. package/dist/ui/hooks/useStreamingProcess.d.ts.map +1 -0
  171. package/dist/ui/hooks/useStreamingProcess.js +49 -0
  172. package/dist/ui/hooks/useStreamingProcess.js.map +1 -0
  173. package/dist/ui/types.d.ts +24 -0
  174. package/dist/ui/types.d.ts.map +1 -0
  175. package/dist/ui/types.js +2 -0
  176. package/dist/ui/types.js.map +1 -0
  177. package/dist/ui/views/CertsStatusView.d.ts +2 -0
  178. package/dist/ui/views/CertsStatusView.d.ts.map +1 -0
  179. package/dist/ui/views/CertsStatusView.js +95 -0
  180. package/dist/ui/views/CertsStatusView.js.map +1 -0
  181. package/dist/ui/views/DbBackupView.d.ts +2 -0
  182. package/dist/ui/views/DbBackupView.d.ts.map +1 -0
  183. package/dist/ui/views/DbBackupView.js +62 -0
  184. package/dist/ui/views/DbBackupView.js.map +1 -0
  185. package/dist/ui/views/DbCompactView.d.ts +2 -0
  186. package/dist/ui/views/DbCompactView.d.ts.map +1 -0
  187. package/dist/ui/views/DbCompactView.js +28 -0
  188. package/dist/ui/views/DbCompactView.js.map +1 -0
  189. package/dist/ui/views/DbListView.d.ts +2 -0
  190. package/dist/ui/views/DbListView.d.ts.map +1 -0
  191. package/dist/ui/views/DbListView.js +30 -0
  192. package/dist/ui/views/DbListView.js.map +1 -0
  193. package/dist/ui/views/DbSizeView.d.ts +2 -0
  194. package/dist/ui/views/DbSizeView.d.ts.map +1 -0
  195. package/dist/ui/views/DbSizeView.js +21 -0
  196. package/dist/ui/views/DbSizeView.js.map +1 -0
  197. package/dist/ui/views/DbStatusView.d.ts +2 -0
  198. package/dist/ui/views/DbStatusView.d.ts.map +1 -0
  199. package/dist/ui/views/DbStatusView.js +41 -0
  200. package/dist/ui/views/DbStatusView.js.map +1 -0
  201. package/dist/ui/views/DbTablesView.d.ts +6 -0
  202. package/dist/ui/views/DbTablesView.d.ts.map +1 -0
  203. package/dist/ui/views/DbTablesView.js +28 -0
  204. package/dist/ui/views/DbTablesView.js.map +1 -0
  205. package/dist/ui/views/DiagDatabaseView.d.ts +2 -0
  206. package/dist/ui/views/DiagDatabaseView.d.ts.map +1 -0
  207. package/dist/ui/views/DiagDatabaseView.js +51 -0
  208. package/dist/ui/views/DiagDatabaseView.js.map +1 -0
  209. package/dist/ui/views/DiagNetworkView.d.ts +2 -0
  210. package/dist/ui/views/DiagNetworkView.d.ts.map +1 -0
  211. package/dist/ui/views/DiagNetworkView.js +169 -0
  212. package/dist/ui/views/DiagNetworkView.js.map +1 -0
  213. package/dist/ui/views/DiagServiceView.d.ts +2 -0
  214. package/dist/ui/views/DiagServiceView.d.ts.map +1 -0
  215. package/dist/ui/views/DiagServiceView.js +37 -0
  216. package/dist/ui/views/DiagServiceView.js.map +1 -0
  217. package/dist/ui/views/DockerNetworkView.d.ts +2 -0
  218. package/dist/ui/views/DockerNetworkView.d.ts.map +1 -0
  219. package/dist/ui/views/DockerNetworkView.js +29 -0
  220. package/dist/ui/views/DockerNetworkView.js.map +1 -0
  221. package/dist/ui/views/DockerPruneView.d.ts +2 -0
  222. package/dist/ui/views/DockerPruneView.d.ts.map +1 -0
  223. package/dist/ui/views/DockerPruneView.js +57 -0
  224. package/dist/ui/views/DockerPruneView.js.map +1 -0
  225. package/dist/ui/views/DockerStatusView.d.ts +2 -0
  226. package/dist/ui/views/DockerStatusView.d.ts.map +1 -0
  227. package/dist/ui/views/DockerStatusView.js +43 -0
  228. package/dist/ui/views/DockerStatusView.js.map +1 -0
  229. package/dist/ui/views/JtapiDisableView.d.ts +2 -0
  230. package/dist/ui/views/JtapiDisableView.d.ts.map +1 -0
  231. package/dist/ui/views/JtapiDisableView.js +55 -0
  232. package/dist/ui/views/JtapiDisableView.js.map +1 -0
  233. package/dist/ui/views/JtapiEnableView.d.ts +2 -0
  234. package/dist/ui/views/JtapiEnableView.d.ts.map +1 -0
  235. package/dist/ui/views/JtapiEnableView.js +47 -0
  236. package/dist/ui/views/JtapiEnableView.js.map +1 -0
  237. package/dist/ui/views/JtapiStatusView.d.ts +2 -0
  238. package/dist/ui/views/JtapiStatusView.d.ts.map +1 -0
  239. package/dist/ui/views/JtapiStatusView.js +18 -0
  240. package/dist/ui/views/JtapiStatusView.js.map +1 -0
  241. package/dist/ui/views/JtapiTroubleshootView.d.ts +2 -0
  242. package/dist/ui/views/JtapiTroubleshootView.d.ts.map +1 -0
  243. package/dist/ui/views/JtapiTroubleshootView.js +120 -0
  244. package/dist/ui/views/JtapiTroubleshootView.js.map +1 -0
  245. package/dist/ui/views/MainMenu.d.ts +8 -0
  246. package/dist/ui/views/MainMenu.d.ts.map +1 -0
  247. package/dist/ui/views/MainMenu.js +110 -0
  248. package/dist/ui/views/MainMenu.js.map +1 -0
  249. package/dist/ui/views/MigrateHistoryView.d.ts +2 -0
  250. package/dist/ui/views/MigrateHistoryView.d.ts.map +1 -0
  251. package/dist/ui/views/MigrateHistoryView.js +25 -0
  252. package/dist/ui/views/MigrateHistoryView.js.map +1 -0
  253. package/dist/ui/views/MigrateRollbackView.d.ts +6 -0
  254. package/dist/ui/views/MigrateRollbackView.d.ts.map +1 -0
  255. package/dist/ui/views/MigrateRollbackView.js +50 -0
  256. package/dist/ui/views/MigrateRollbackView.js.map +1 -0
  257. package/dist/ui/views/MigrateRunView.d.ts +2 -0
  258. package/dist/ui/views/MigrateRunView.d.ts.map +1 -0
  259. package/dist/ui/views/MigrateRunView.js +50 -0
  260. package/dist/ui/views/MigrateRunView.js.map +1 -0
  261. package/dist/ui/views/MigrateStatusView.d.ts +2 -0
  262. package/dist/ui/views/MigrateStatusView.d.ts.map +1 -0
  263. package/dist/ui/views/MigrateStatusView.js +88 -0
  264. package/dist/ui/views/MigrateStatusView.js.map +1 -0
  265. package/dist/ui/views/MigrateWatchView.d.ts +6 -0
  266. package/dist/ui/views/MigrateWatchView.d.ts.map +1 -0
  267. package/dist/ui/views/MigrateWatchView.js +83 -0
  268. package/dist/ui/views/MigrateWatchView.js.map +1 -0
  269. package/dist/ui/views/OfflineListView.d.ts +2 -0
  270. package/dist/ui/views/OfflineListView.d.ts.map +1 -0
  271. package/dist/ui/views/OfflineListView.js +47 -0
  272. package/dist/ui/views/OfflineListView.js.map +1 -0
  273. package/dist/ui/views/SecretsSetupView.d.ts +2 -0
  274. package/dist/ui/views/SecretsSetupView.d.ts.map +1 -0
  275. package/dist/ui/views/SecretsSetupView.js +94 -0
  276. package/dist/ui/views/SecretsSetupView.js.map +1 -0
  277. package/dist/ui/views/SecretsStatusView.d.ts +2 -0
  278. package/dist/ui/views/SecretsStatusView.d.ts.map +1 -0
  279. package/dist/ui/views/SecretsStatusView.js +36 -0
  280. package/dist/ui/views/SecretsStatusView.js.map +1 -0
  281. package/dist/ui/views/StatusView.d.ts +2 -0
  282. package/dist/ui/views/StatusView.d.ts.map +1 -0
  283. package/dist/ui/views/StatusView.js +80 -0
  284. package/dist/ui/views/StatusView.js.map +1 -0
  285. package/dist/utils/output.d.ts +11 -0
  286. package/dist/utils/output.d.ts.map +1 -0
  287. package/dist/utils/output.js +30 -0
  288. package/dist/utils/output.js.map +1 -0
  289. package/dist/utils/prompt.d.ts +6 -0
  290. package/dist/utils/prompt.d.ts.map +1 -0
  291. package/dist/utils/prompt.js +25 -0
  292. package/dist/utils/prompt.js.map +1 -0
  293. package/dist/utils/version.d.ts +8 -0
  294. package/dist/utils/version.d.ts.map +1 -0
  295. package/dist/utils/version.js +35 -0
  296. package/dist/utils/version.js.map +1 -0
  297. package/package.json +59 -0
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect } from 'react';
3
+ import { useApp } from 'ink';
4
+ import { composePs } from '../../lib/compose.js';
5
+ import { rpc, rpcOk } from '../../lib/rpc.js';
6
+ import { AppShell, Section, ShellOutput, Spinner, StatusLine } from '../components/index.js';
7
+ import { useAsyncTask } from '../hooks/index.js';
8
+ export function MigrateRunView() {
9
+ const { exit } = useApp();
10
+ const readyTask = useAsyncTask(async () => {
11
+ const container = await composePs('web');
12
+ if (!container)
13
+ throw new Error('Web container not found or not running.');
14
+ if (!await rpcOk())
15
+ throw new Error('Cannot connect to application via RPC. It may still be starting up.');
16
+ return true;
17
+ });
18
+ const runTask = useAsyncTask(async () => {
19
+ const output = await rpc(`
20
+ IO.puts("=== Running Migrations ===")
21
+ try do
22
+ result = Ecto.Migrator.run(Cdrcisco.Repo, :up, all: true)
23
+ case result do
24
+ [] -> IO.puts("No pending migrations to run.")
25
+ migrations ->
26
+ IO.puts("Successfully ran \#{length(migrations)} migrations:")
27
+ for {status, version, name} <- migrations do
28
+ IO.puts(" \#{status} \#{version} \#{name}")
29
+ end
30
+ end
31
+ IO.puts("")
32
+ IO.puts("Migration run completed successfully!")
33
+ rescue
34
+ e -> IO.puts("Error running migrations: \#{inspect(e)}")
35
+ end
36
+ `);
37
+ return output;
38
+ }, false);
39
+ // Chain: run migrations after ready check passes
40
+ useEffect(() => {
41
+ if (readyTask.status === 'done')
42
+ runTask.run();
43
+ }, [readyTask.status]);
44
+ // Exit when done or on error
45
+ const allDone = readyTask.status === 'error' || runTask.status === 'done' || runTask.status === 'error';
46
+ useEffect(() => { if (allDone)
47
+ exit(); }, [allDone, exit]);
48
+ return (_jsx(AppShell, { command: "ct migrate run", children: _jsxs(Section, { title: "Run Migrations", children: [readyTask.status === 'pending' && _jsx(Spinner, { label: "Checking web container..." }), readyTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: readyTask.error?.message ?? 'Web container not ready' }), readyTask.status === 'done' && runTask.status === 'pending' && _jsx(Spinner, { label: "Running pending migrations..." }), runTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: runTask.error?.message ?? 'Migration run failed' }), runTask.status === 'done' && runTask.data && _jsx(ShellOutput, { content: runTask.data }), runTask.status === 'done' && _jsx(StatusLine, { status: "ok", label: "Migration run completed" })] }) }));
49
+ }
50
+ //# sourceMappingURL=MigrateRunView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MigrateRunView.js","sourceRoot":"","sources":["../../../src/ui/views/MigrateRunView.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,UAAU,cAAc;IAC5B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAE1B,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE;QACxC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC3E,IAAI,CAAC,MAAM,KAAK,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QAC3G,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE;QACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC;;;;;;;;;;;;;;;;;KAiBxB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,iDAAiD;IACjD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,CAAC,GAAG,EAAE,CAAC;IACjD,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvB,6BAA6B;IAC7B,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC;IACxG,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO;QAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAE3D,OAAO,CACL,KAAC,QAAQ,IAAC,OAAO,EAAC,gBAAgB,YAChC,MAAC,OAAO,IAAC,KAAK,EAAC,gBAAgB,aAC5B,SAAS,CAAC,MAAM,KAAK,SAAS,IAAI,KAAC,OAAO,IAAC,KAAK,EAAC,2BAA2B,GAAG,EAC/E,SAAS,CAAC,MAAM,KAAK,OAAO,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,IAAI,yBAAyB,GAAI,EAC1H,SAAS,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,KAAC,OAAO,IAAC,KAAK,EAAC,+BAA+B,GAAG,EAChH,OAAO,CAAC,MAAM,KAAK,OAAO,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,IAAI,sBAAsB,GAAI,EACnH,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,IAAI,KAAC,WAAW,IAAC,OAAO,EAAE,OAAO,CAAC,IAAI,GAAI,EACnF,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,yBAAyB,GAAG,IAChF,GACD,CACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function MigrateStatusView(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=MigrateStatusView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MigrateStatusView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/MigrateStatusView.tsx"],"names":[],"mappings":"AA8DA,wBAAgB,iBAAiB,4CAoChC"}
@@ -0,0 +1,88 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect } from 'react';
3
+ import { useApp } from 'ink';
4
+ import { composePs } from '../../lib/compose.js';
5
+ import { rpc, rpcOk } from '../../lib/rpc.js';
6
+ import { AppShell, Section, StatusLine, ShellOutput, Spinner } from '../components/index.js';
7
+ import { useAsyncTask } from '../hooks/index.js';
8
+ const MIGRATION_STATUS_RPC = `
9
+ alias Cdrcisco.Repo
10
+ import Ecto.Query
11
+
12
+ try do
13
+ migrations = Ecto.Migrator.migrations(Repo)
14
+ ordered = Enum.sort_by(migrations, fn {_, version, _} -> version end)
15
+ {applied, pending} = Enum.split_with(ordered, fn {status, _, _} -> status == :up end)
16
+ total = length(ordered)
17
+ applied_count = length(applied)
18
+ pending_count = length(pending)
19
+
20
+ percent = if total == 0, do: 100.0, else: Float.round(applied_count / total * 100, 1)
21
+
22
+ latest = Repo.one(
23
+ from sm in "schema_migrations",
24
+ order_by: [desc: sm.version],
25
+ limit: 1,
26
+ select: %{version: sm.version, inserted_at: sm.inserted_at}
27
+ )
28
+
29
+ IO.puts("=== Migration Progress ===")
30
+ IO.puts("Applied migrations: \#{applied_count}/\#{total} (\#{percent}%)")
31
+ IO.puts("Pending migrations: \#{pending_count}")
32
+
33
+ case latest do
34
+ %{version: version, inserted_at: timestamp} ->
35
+ IO.puts("Latest applied: \#{version} @ \#{timestamp}")
36
+ _ ->
37
+ IO.puts("Latest applied: none recorded")
38
+ end
39
+
40
+ IO.puts("")
41
+
42
+ if pending_count > 0 do
43
+ {_, next_version, next_name} = hd(pending)
44
+ IO.puts("Next pending: \#{next_version} - \#{next_name}")
45
+ IO.puts("")
46
+ IO.puts("=== Pending Queue ===")
47
+ Enum.with_index(pending, 1)
48
+ |> Enum.each(fn {{_, version, name}, idx} ->
49
+ IO.puts("[\#{idx}/\#{pending_count}] \#{version} - \#{name}")
50
+ end)
51
+ else
52
+ IO.puts("All migrations are up to date!")
53
+ end
54
+
55
+ IO.puts("::pending_count=\#{pending_count}")
56
+ rescue
57
+ e ->
58
+ IO.puts("Error checking migrations: \#{inspect(e)}")
59
+ IO.puts("::pending_count=error")
60
+ end
61
+ `;
62
+ export function MigrateStatusView() {
63
+ const { exit } = useApp();
64
+ const readyTask = useAsyncTask(async () => {
65
+ const container = await composePs('web');
66
+ if (!container)
67
+ throw new Error('Web container not found');
68
+ if (!await rpcOk())
69
+ throw new Error('RPC not ready');
70
+ return true;
71
+ });
72
+ const statusTask = useAsyncTask(async () => {
73
+ const output = await rpc(MIGRATION_STATUS_RPC);
74
+ return output.split('\n').filter(l => !l.startsWith('::')).join('\n');
75
+ }, false);
76
+ // Run status after ready
77
+ useEffect(() => {
78
+ if (readyTask.status === 'done')
79
+ statusTask.run();
80
+ }, [readyTask.status]);
81
+ // Exit when done
82
+ const allDone = (readyTask.status === 'error') ||
83
+ (statusTask.status === 'done' || statusTask.status === 'error');
84
+ useEffect(() => { if (allDone)
85
+ exit(); }, [allDone, exit]);
86
+ return (_jsx(AppShell, { command: "ct migrate status", children: _jsxs(Section, { title: "Migration Status", children: [readyTask.status === 'pending' && _jsx(Spinner, { label: "Checking web container..." }), readyTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: readyTask.error?.message ?? 'Web container not ready' }), statusTask.status === 'pending' && _jsx(Spinner, { label: "Querying migration status..." }), statusTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Failed to query migrations" }), statusTask.status === 'done' && statusTask.data && _jsx(ShellOutput, { content: statusTask.data })] }) }));
87
+ }
88
+ //# sourceMappingURL=MigrateStatusView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MigrateStatusView.js","sourceRoot":"","sources":["../../../src/ui/views/MigrateStatusView.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqD5B,CAAC;AAEF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAE1B,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE;QACxC,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,KAAK,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,IAAI,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,yBAAyB;IACzB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM;YAAE,UAAU,CAAC,GAAG,EAAE,CAAC;IACpD,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvB,iBAAiB;IACjB,MAAM,OAAO,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,OAAO,CAAC;QAC9B,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IAChF,SAAS,CAAC,GAAG,EAAE,GAAG,IAAI,OAAO;QAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAE3D,OAAO,CACL,KAAC,QAAQ,IAAC,OAAO,EAAC,mBAAmB,YACnC,MAAC,OAAO,IAAC,KAAK,EAAC,kBAAkB,aAC9B,SAAS,CAAC,MAAM,KAAK,SAAS,IAAI,KAAC,OAAO,IAAC,KAAK,EAAC,2BAA2B,GAAG,EAC/E,SAAS,CAAC,MAAM,KAAK,OAAO,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,IAAI,yBAAyB,GAAI,EAC1H,UAAU,CAAC,MAAM,KAAK,SAAS,IAAI,KAAC,OAAO,IAAC,KAAK,EAAC,8BAA8B,GAAG,EACnF,UAAU,CAAC,MAAM,KAAK,OAAO,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,4BAA4B,GAAG,EAChG,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,IAAI,IAAI,KAAC,WAAW,IAAC,OAAO,EAAE,UAAU,CAAC,IAAI,GAAI,IACrF,GACD,CACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ interface MigrateWatchViewProps {
2
+ interval: number;
3
+ }
4
+ export declare function MigrateWatchView({ interval }: MigrateWatchViewProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=MigrateWatchView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MigrateWatchView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/MigrateWatchView.tsx"],"names":[],"mappings":"AA6DA,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,qBAAqB,2CAqCnE"}
@@ -0,0 +1,83 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from 'react';
3
+ import { useApp, Text } from 'ink';
4
+ import { rpc } from '../../lib/rpc.js';
5
+ import { AppShell, Section, ShellOutput, Spinner, StatusLine } from '../components/index.js';
6
+ import { usePolling } from '../hooks/index.js';
7
+ const MIGRATION_STATUS_RPC = `
8
+ alias Cdrcisco.Repo
9
+ import Ecto.Query
10
+
11
+ try do
12
+ migrations = Ecto.Migrator.migrations(Repo)
13
+ ordered = Enum.sort_by(migrations, fn {_, version, _} -> version end)
14
+ {applied, pending} = Enum.split_with(ordered, fn {status, _, _} -> status == :up end)
15
+ total = length(ordered)
16
+ applied_count = length(applied)
17
+ pending_count = length(pending)
18
+
19
+ percent = if total == 0, do: 100.0, else: Float.round(applied_count / total * 100, 1)
20
+
21
+ latest = Repo.one(
22
+ from sm in "schema_migrations",
23
+ order_by: [desc: sm.version],
24
+ limit: 1,
25
+ select: %{version: sm.version, inserted_at: sm.inserted_at}
26
+ )
27
+
28
+ IO.puts("=== Migration Progress ===")
29
+ IO.puts("Applied migrations: \#{applied_count}/\#{total} (\#{percent}%)")
30
+ IO.puts("Pending migrations: \#{pending_count}")
31
+
32
+ case latest do
33
+ %{version: version, inserted_at: timestamp} ->
34
+ IO.puts("Latest applied: \#{version} @ \#{timestamp}")
35
+ _ ->
36
+ IO.puts("Latest applied: none recorded")
37
+ end
38
+
39
+ IO.puts("")
40
+
41
+ if pending_count > 0 do
42
+ {_, next_version, next_name} = hd(pending)
43
+ IO.puts("Next pending: \#{next_version} - \#{next_name}")
44
+ IO.puts("")
45
+ IO.puts("=== Pending Queue ===")
46
+ Enum.with_index(pending, 1)
47
+ |> Enum.each(fn {{_, version, name}, idx} ->
48
+ IO.puts("[\#{idx}/\#{pending_count}] \#{version} - \#{name}")
49
+ end)
50
+ else
51
+ IO.puts("All migrations are up to date!")
52
+ end
53
+
54
+ IO.puts("::pending_count=\#{pending_count}")
55
+ rescue
56
+ e ->
57
+ IO.puts("Error checking migrations: \#{inspect(e)}")
58
+ IO.puts("::pending_count=error")
59
+ end
60
+ `;
61
+ export function MigrateWatchView({ interval }) {
62
+ const { exit } = useApp();
63
+ const stoppedRef = useRef(false);
64
+ const { data, error, stop } = usePolling(async () => {
65
+ const output = await rpc(MIGRATION_STATUS_RPC);
66
+ return output;
67
+ }, interval);
68
+ // Filter display lines and extract pending count
69
+ const lines = data?.split('\n') ?? [];
70
+ const pendingLine = lines.find(l => l.startsWith('::pending_count='));
71
+ const pendingCount = pendingLine?.split('=')[1];
72
+ const displayContent = lines.filter(l => !l.startsWith('::')).join('\n');
73
+ // Auto-stop when no pending migrations remain
74
+ useEffect(() => {
75
+ if (pendingCount === '0' && !stoppedRef.current) {
76
+ stoppedRef.current = true;
77
+ stop();
78
+ exit();
79
+ }
80
+ }, [pendingCount, stop, exit]);
81
+ return (_jsx(AppShell, { command: "ct migrate watch", children: _jsxs(Section, { title: `Watch Migrations (interval: ${interval / 1000}s)`, children: [!data && !error && _jsx(Spinner, { label: "Polling migration status..." }), error && _jsx(StatusLine, { status: "warn", label: `Error: ${error.message}` }), data && displayContent && _jsx(ShellOutput, { content: displayContent }), pendingCount === '0' && _jsx(StatusLine, { status: "ok", label: "All migrations are up to date. Exiting watch mode." }), data && pendingCount !== '0' && pendingCount !== 'error' && (_jsx(Text, { dimColor: true, children: ` Next refresh in ${interval / 1000}s... Press Ctrl+C to stop.` }))] }) }));
82
+ }
83
+ //# sourceMappingURL=MigrateWatchView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MigrateWatchView.js","sourceRoot":"","sources":["../../../src/ui/views/MigrateWatchView.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqD5B,CAAC;AAMF,MAAM,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAAyB;IAClE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEjC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,QAAQ,CAAC,CAAC;IAEb,iDAAiD;IACjD,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzE,8CAA8C;IAC9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,YAAY,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YAChD,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;YAC1B,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/B,OAAO,CACL,KAAC,QAAQ,IAAC,OAAO,EAAC,kBAAkB,YAClC,MAAC,OAAO,IAAC,KAAK,EAAE,+BAA+B,QAAQ,GAAG,IAAI,IAAI,aAC/D,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,KAAC,OAAO,IAAC,KAAK,EAAC,6BAA6B,GAAG,EAClE,KAAK,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE,GAAI,EACvE,IAAI,IAAI,cAAc,IAAI,KAAC,WAAW,IAAC,OAAO,EAAE,cAAc,GAAI,EAClE,YAAY,KAAK,GAAG,IAAI,KAAC,UAAU,IAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,oDAAoD,GAAG,EAC7G,IAAI,IAAI,YAAY,KAAK,GAAG,IAAI,YAAY,KAAK,OAAO,IAAI,CAC3D,KAAC,IAAI,IAAC,QAAQ,kBAAE,qBAAqB,QAAQ,GAAG,IAAI,4BAA4B,GAAQ,CACzF,IACO,GACD,CACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function OfflineListView(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=OfflineListView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OfflineListView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/OfflineListView.tsx"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,4CAqD9B"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect } from 'react';
3
+ import { useApp } from 'ink';
4
+ import { existsSync, readFileSync } from 'node:fs';
5
+ import { execa } from 'execa';
6
+ import { getPaths } from '../../lib/paths.js';
7
+ import { AppShell, Section, StatusLine, Spinner, KeyValue } from '../components/index.js';
8
+ import { useAsyncTask } from '../hooks/index.js';
9
+ export function OfflineListView() {
10
+ const { exit } = useApp();
11
+ const { composeFile } = getPaths();
12
+ const listTask = useAsyncTask(async () => {
13
+ if (!existsSync(composeFile)) {
14
+ throw new Error('docker-compose.yml not found');
15
+ }
16
+ const content = readFileSync(composeFile, 'utf-8');
17
+ const images = [];
18
+ for (const line of content.split('\n')) {
19
+ const match = line.match(/image:\s*["']?([^\s"']+)/);
20
+ if (match)
21
+ images.push(match[1]);
22
+ }
23
+ const results = [];
24
+ for (const img of images) {
25
+ try {
26
+ const { stdout } = await execa('docker', ['image', 'inspect', img, '--format', '{{.Size}}'], {
27
+ stdout: 'pipe', stderr: 'pipe',
28
+ });
29
+ const sizeMb = (parseInt(stdout) / 1024 / 1024).toFixed(1);
30
+ results.push({ key: img, value: `${sizeMb} MB` });
31
+ }
32
+ catch {
33
+ results.push({ key: img, value: 'not downloaded' });
34
+ }
35
+ }
36
+ return { images: results, total: images.length };
37
+ });
38
+ useEffect(() => {
39
+ if (listTask.status === 'done' || listTask.status === 'error')
40
+ exit();
41
+ }, [listTask.status, exit]);
42
+ return (_jsx(AppShell, { command: "ct offline list", children: _jsxs(Section, { title: "Images in docker-compose.yml", children: [listTask.status === 'pending' && _jsx(Spinner, { label: "Inspecting images..." }), listTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: listTask.error?.message ?? 'Failed' }), listTask.status === 'done' && listTask.data && (_jsxs(_Fragment, { children: [_jsx(KeyValue, { items: listTask.data.images.map(item => ({
43
+ key: item.key,
44
+ value: item.value === 'not downloaded' ? `\u2718 ${item.value}` : `\u2714 ${item.value}`,
45
+ })) }), _jsx(StatusLine, { status: "info", label: `Total images: ${listTask.data.total}` })] }))] }) }));
46
+ }
47
+ //# sourceMappingURL=OfflineListView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OfflineListView.js","sourceRoot":"","sources":["../../../src/ui/views/OfflineListView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function SecretsSetupView(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=SecretsSetupView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecretsSetupView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/SecretsSetupView.tsx"],"names":[],"mappings":"AASA,wBAAgB,gBAAgB,4CA0K/B"}
@@ -0,0 +1,94 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Text, Box, useApp } from 'ink';
4
+ import { AppShell, Section, StatusLine, Divider, SelectMenu, Confirm, TextInput } from '../components/index.js';
5
+ import { SECRET_CATALOG, SECRET_GROUPS, getSecrets, writeEnvFile, writeSecretsOverlay } from '../../lib/secrets.js';
6
+ export function SecretsSetupView() {
7
+ const { exit } = useApp();
8
+ const [phase, setPhase] = useState('intro');
9
+ const [values, setValues] = useState(() => getSecrets());
10
+ const [currentGroup, setCurrentGroup] = useState(null);
11
+ const [fieldIndex, setFieldIndex] = useState(0);
12
+ const [inputValue, setInputValue] = useState('');
13
+ const [writeError, setWriteError] = useState(null);
14
+ // Auto-advance from intro
15
+ useEffect(() => {
16
+ if (phase === 'intro') {
17
+ const timer = setTimeout(() => setPhase('group_select'), 50);
18
+ return () => clearTimeout(timer);
19
+ }
20
+ }, [phase]);
21
+ // Exit after done
22
+ useEffect(() => {
23
+ if (phase === 'done' || phase === 'error') {
24
+ const timer = setTimeout(() => exit(), 200);
25
+ return () => clearTimeout(timer);
26
+ }
27
+ }, [phase, exit]);
28
+ const groupItems = [
29
+ ...SECRET_GROUPS.map(g => ({
30
+ label: g,
31
+ description: SECRET_CATALOG.filter(d => d.group === g).map(d => d.label).join(', '),
32
+ value: g,
33
+ })),
34
+ { label: '\u2190 Review & Save', description: 'Review changes and write files', value: '__review' },
35
+ ];
36
+ const handleGroupSelect = (item) => {
37
+ if (item.value === '__review') {
38
+ setPhase('review');
39
+ return;
40
+ }
41
+ setCurrentGroup(item.value);
42
+ setFieldIndex(0);
43
+ const groupFields = SECRET_CATALOG.filter(d => d.group === item.value);
44
+ if (groupFields.length > 0) {
45
+ setInputValue('');
46
+ setPhase('field_edit');
47
+ }
48
+ };
49
+ const groupFields = currentGroup ? SECRET_CATALOG.filter(d => d.group === currentGroup) : [];
50
+ const currentField = groupFields[fieldIndex];
51
+ const handleFieldSubmit = (submitted) => {
52
+ if (currentField) {
53
+ // If empty input, keep current value
54
+ if (submitted) {
55
+ setValues(prev => ({ ...prev, [currentField.key]: submitted }));
56
+ }
57
+ }
58
+ // Next field or back to group select
59
+ if (fieldIndex + 1 < groupFields.length) {
60
+ setFieldIndex(fieldIndex + 1);
61
+ setInputValue('');
62
+ }
63
+ else {
64
+ setPhase('group_select');
65
+ }
66
+ };
67
+ const handleConfirm = async (yes) => {
68
+ if (!yes) {
69
+ setPhase('group_select');
70
+ return;
71
+ }
72
+ setPhase('write');
73
+ try {
74
+ await writeEnvFile(values);
75
+ await writeSecretsOverlay();
76
+ setPhase('done');
77
+ }
78
+ catch (err) {
79
+ setWriteError(err.message ?? String(err));
80
+ setPhase('error');
81
+ }
82
+ };
83
+ // Count changes
84
+ const originalSecrets = getSecrets();
85
+ const changedKeys = SECRET_CATALOG.filter(d => values[d.key] !== originalSecrets[d.key]);
86
+ return (_jsxs(AppShell, { command: "ct secrets setup", children: [phase === 'intro' && (_jsx(Section, { title: "Secrets Setup Wizard", children: _jsx(Text, { children: "Configuring deployment secrets..." }) })), phase === 'group_select' && (_jsx(Section, { title: "What would you like to configure?", children: _jsx(SelectMenu, { items: groupItems, onSelect: handleGroupSelect, onExit: () => setPhase('review') }) })), phase === 'field_edit' && currentField && (_jsxs(Section, { title: `${currentGroup} Configuration`, children: [_jsxs(Box, { flexDirection: "column", paddingLeft: 2, children: [_jsxs(Text, { bold: true, children: [currentField.label, " (", currentField.key, ")"] }), _jsxs(Text, { dimColor: true, children: [`Current: ${currentField.sensitive ? '********' : (values[currentField.key] || '(not set)')}`, values[currentField.key] === currentField.defaultValue ? ' (default)' : ''] }), _jsx(Text, { dimColor: true, children: "Press Enter to keep current, or type new value" }), _jsx(Box, { marginTop: 1, children: _jsx(TextInput, { label: "New value", value: inputValue, onChange: setInputValue, onSubmit: handleFieldSubmit, mask: currentField.sensitive, placeholder: values[currentField.key] || '(empty)' }) })] }), _jsx(Text, { dimColor: true, children: ` Field ${fieldIndex + 1} of ${groupFields.length}` })] })), phase === 'review' && (_jsxs(Section, { title: "Review Changes", children: [SECRET_CATALOG.map(def => {
87
+ const value = values[def.key] ?? '';
88
+ const isChanged = value !== originalSecrets[def.key];
89
+ const display = def.sensitive ? '********' : (value || '(not set)');
90
+ const tag = isChanged ? '(changed)' : (value === def.defaultValue ? '(default)' : '(not set)');
91
+ return (_jsx(StatusLine, { status: isChanged ? 'warn' : 'ok', label: `${def.key.padEnd(22)} ${display.padEnd(20)} ${tag}` }, def.key));
92
+ }), _jsx(Divider, {}), _jsx(Confirm, { message: `Write ${changedKeys.length} change${changedKeys.length !== 1 ? 's' : ''} to .env and docker-compose.secrets.yml?`, onConfirm: handleConfirm })] })), phase === 'write' && (_jsx(Section, { title: "Writing Files", children: _jsx(Text, { children: "Writing secrets..." }) })), phase === 'done' && (_jsxs(Section, { title: "Secrets Setup Complete", children: [_jsx(StatusLine, { status: "ok", label: ".env file written" }), _jsx(StatusLine, { status: "ok", label: "docker-compose.secrets.yml generated" }), _jsx(Divider, {}), _jsx(Text, { dimColor: true, children: " Run 'ct update' or restart services to apply changes." })] })), phase === 'error' && (_jsx(Section, { title: "Error", children: _jsx(StatusLine, { status: "fail", label: writeError ?? 'Unknown error writing files' }) }))] }));
93
+ }
94
+ //# sourceMappingURL=SecretsSetupView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecretsSetupView.js","sourceRoot":"","sources":["../../../src/ui/views/SecretsSetupView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function SecretsStatusView(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=SecretsStatusView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecretsStatusView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/SecretsStatusView.tsx"],"names":[],"mappings":"AAMA,wBAAgB,iBAAiB,4CAmDhC"}
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect } from 'react';
3
+ import { Text, useApp } from 'ink';
4
+ import { AppShell, Section, SubSection, StatusLine, KeyValue } from '../components/index.js';
5
+ import { SECRET_CATALOG, SECRET_GROUPS, getSecrets, getEnvFilePath, isCustomized, countOverrides } from '../../lib/secrets.js';
6
+ export function SecretsStatusView() {
7
+ const { exit } = useApp();
8
+ const secrets = getSecrets();
9
+ const envPath = getEnvFilePath();
10
+ const customized = isCustomized();
11
+ const overrideCount = countOverrides();
12
+ useEffect(() => {
13
+ // Exit after render
14
+ const timer = setTimeout(() => exit(), 100);
15
+ return () => clearTimeout(timer);
16
+ }, [exit]);
17
+ const getStatus = (key, defaultValue) => {
18
+ const value = secrets[key] ?? '';
19
+ if (!value && !defaultValue)
20
+ return 'warn';
21
+ return 'ok';
22
+ };
23
+ const getLabel = (key, defaultValue, sensitive) => {
24
+ const value = secrets[key] ?? '';
25
+ if (!value && !defaultValue)
26
+ return `${key} (not set)`;
27
+ const display = sensitive ? '********' : value;
28
+ const tag = value !== defaultValue ? '(customized)' : '(default)';
29
+ return `${key} ${display} ${tag}`;
30
+ };
31
+ return (_jsx(AppShell, { command: "ct secrets", children: _jsxs(Section, { title: "Secrets Configuration", children: [_jsx(KeyValue, { items: [
32
+ { key: 'Source', value: envPath },
33
+ { key: 'Status', value: customized ? `Customized (${overrideCount} override${overrideCount !== 1 ? 's' : ''})` : 'Using defaults' },
34
+ ] }), SECRET_GROUPS.map((group) => (_jsx(SubSection, { title: group, children: SECRET_CATALOG.filter(d => d.group === group).map(def => (_jsx(StatusLine, { status: getStatus(def.key, def.defaultValue), label: getLabel(def.key, def.defaultValue, def.sensitive) }, def.key))) }, group))), _jsx(Text, { dimColor: true, children: "\n Run 'ct secrets setup' to configure" })] }) }));
35
+ }
36
+ //# sourceMappingURL=SecretsStatusView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SecretsStatusView.js","sourceRoot":"","sources":["../../../src/ui/views/SecretsStatusView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function StatusView(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=StatusView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/StatusView.tsx"],"names":[],"mappings":"AASA,wBAAgB,UAAU,4CAgKzB"}
@@ -0,0 +1,80 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect } from 'react';
3
+ import { Box, Text, useApp } from 'ink';
4
+ import { compose, composeExec } from '../../lib/compose.js';
5
+ import { DB_USER, DB_NAME, PG_ENV } from '../../lib/db.js';
6
+ import { rpc, rpcOk, healthCheck } from '../../lib/rpc.js';
7
+ import { getSystemStats } from '../../lib/system.js';
8
+ import { AppShell, Section, StatusLine, ShellOutput, Spinner } from '../components/index.js';
9
+ import { useAsyncTask } from '../hooks/index.js';
10
+ export function StatusView() {
11
+ const { exit } = useApp();
12
+ // Section 1: Container Status
13
+ const containerTask = useAsyncTask(async () => {
14
+ const result = await compose(['ps'], { pipe: true });
15
+ return result.stdout ?? '';
16
+ });
17
+ // Section 2: Database Status
18
+ const dbReadyTask = useAsyncTask(async () => {
19
+ try {
20
+ await composeExec('db', ['pg_isready', '-U', DB_USER, '-d', DB_NAME], { pipe: true });
21
+ return true;
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ });
27
+ const dbCountTask = useAsyncTask(async () => {
28
+ const result = await composeExec('db', ['psql', '-U', DB_USER, '-d', DB_NAME, '-t', '-c',
29
+ 'SELECT COUNT(*) FROM schema_migrations;'], { env: PG_ENV, pipe: true });
30
+ return (result.stdout ?? '').trim();
31
+ });
32
+ const dbLatestTask = useAsyncTask(async () => {
33
+ const result = await composeExec('db', ['psql', '-U', DB_USER, '-d', DB_NAME, '-t', '-c',
34
+ 'SELECT version FROM schema_migrations ORDER BY version DESC LIMIT 1;'], { env: PG_ENV, pipe: true });
35
+ return (result.stdout ?? '').trim();
36
+ });
37
+ // Section 3: Application RPC
38
+ const rpcTask = useAsyncTask(async () => {
39
+ const ok = await rpcOk();
40
+ if (!ok)
41
+ return { ok: false, output: '' };
42
+ const output = await rpc(`
43
+ alias Cdrcisco.Repo
44
+ try do
45
+ migrations = Ecto.Migrator.migrations(Repo)
46
+ {applied, pending} = Enum.split_with(migrations, fn {status, _, _} -> status == :up end)
47
+ IO.puts("Applied: \#{length(applied)}")
48
+ IO.puts("Pending: \#{length(pending)}")
49
+ if length(pending) > 0 do
50
+ IO.puts("")
51
+ IO.puts("Pending migrations:")
52
+ Enum.each(pending, fn {_, version, name} -> IO.puts(" - \#{version}: \#{name}") end)
53
+ else
54
+ IO.puts("All migrations complete!")
55
+ end
56
+ rescue
57
+ e -> IO.puts("Error: \#{inspect(e)}")
58
+ end
59
+ `);
60
+ return { ok: true, output };
61
+ });
62
+ // Section 4: Health Check
63
+ const healthTask = useAsyncTask(async () => {
64
+ return await healthCheck();
65
+ });
66
+ // Section 5: System Stats
67
+ const statsTask = useAsyncTask(async () => {
68
+ return await getSystemStats();
69
+ });
70
+ // Exit when all tasks complete
71
+ const allDone = [containerTask, dbReadyTask, dbCountTask, dbLatestTask, rpcTask, healthTask, statsTask]
72
+ .every(t => t.status === 'done' || t.status === 'error');
73
+ useEffect(() => {
74
+ if (allDone) {
75
+ exit();
76
+ }
77
+ }, [allDone, exit]);
78
+ return (_jsxs(AppShell, { command: "ct status", children: [_jsxs(Section, { title: "Container Status", children: [containerTask.status === 'pending' && _jsx(Spinner, { label: "Checking containers..." }), containerTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Could not check containers" }), containerTask.status === 'done' && containerTask.data && (_jsx(ShellOutput, { content: containerTask.data }))] }), _jsxs(Section, { title: "Database Status", children: [dbReadyTask.status === 'pending' && _jsx(Spinner, { label: "Checking database..." }), dbReadyTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Database check failed" }), dbReadyTask.status === 'done' && (_jsx(StatusLine, { status: dbReadyTask.data ? 'ok' : 'fail', label: dbReadyTask.data ? 'Database: accepting connections' : 'Database: not accepting connections' })), dbCountTask.status === 'pending' && _jsx(Spinner, { label: "Counting migrations..." }), dbCountTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Could not count migrations" }), dbCountTask.status === 'done' && (_jsx(StatusLine, { status: "ok", label: `Migrations in database: ${dbCountTask.data}` })), dbLatestTask.status === 'pending' && _jsx(Spinner, { label: "Finding latest migration..." }), dbLatestTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Could not find latest migration" }), dbLatestTask.status === 'done' && (_jsx(StatusLine, { status: "ok", label: `Latest migration: ${dbLatestTask.data}` }))] }), _jsxs(Section, { title: "Application RPC Status", children: [rpcTask.status === 'pending' && _jsx(Spinner, { label: "Checking RPC connection..." }), rpcTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "RPC check failed" }), rpcTask.status === 'done' && rpcTask.data && (_jsxs(_Fragment, { children: [_jsx(StatusLine, { status: rpcTask.data.ok ? 'ok' : 'fail', label: rpcTask.data.ok ? 'RPC connection: working' : 'RPC connection: failed' }), rpcTask.data.ok && rpcTask.data.output && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { bold: true, children: " Migration Status (from application)" }), _jsx(ShellOutput, { content: rpcTask.data.output })] })), !rpcTask.data.ok && (_jsx(Text, { dimColor: true, children: " Application may still be starting up" }))] }))] }), _jsxs(Section, { title: "Health Check", children: [healthTask.status === 'pending' && _jsx(Spinner, { label: "Running health check..." }), healthTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Health check failed" }), healthTask.status === 'done' && (_jsx(StatusLine, { status: healthTask.data ? 'ok' : 'warn', label: healthTask.data ? 'Web application healthy' : 'Web health check pending' }))] }), _jsxs(Section, { title: "System Stats", children: [statsTask.status === 'pending' && _jsx(Spinner, { label: "Gathering system stats..." }), statsTask.status === 'error' && _jsx(StatusLine, { status: "fail", label: "Could not gather system stats" }), statsTask.status === 'done' && statsTask.data && (_jsxs(Text, { children: [" ", statsTask.data] }))] })] }));
79
+ }
80
+ //# sourceMappingURL=StatusView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusView.js","sourceRoot":"","sources":["../../../src/ui/views/StatusView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare const ok: (msg: string) => void;
2
+ export declare const fail: (msg: string) => void;
3
+ export declare const warn: (msg: string) => void;
4
+ export declare const info: (msg: string) => void;
5
+ export declare const pending: (msg: string) => void;
6
+ export declare const header: (title: string) => void;
7
+ export declare const subheader: (title: string) => void;
8
+ export declare const divider: () => void;
9
+ export declare const errorBox: (title: string, details: string[]) => void;
10
+ export declare const successBox: (title: string) => void;
11
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,EAAE,GAAI,KAAK,MAAM,SAAyC,CAAC;AACxE,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,SAAuC,CAAC;AACxE,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,SAA0C,CAAC;AAC3E,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,SAAwC,CAAC;AACzE,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,SAAwC,CAAC;AAE5E,eAAO,MAAM,MAAM,GAAI,OAAO,MAAM,SAGnC,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,SAEtC,CAAC;AAEF,eAAO,MAAM,OAAO,YAEnB,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,SAAS,MAAM,EAAE,SAOxD,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,SAIvC,CAAC"}