@calltelemetry/cli 0.1.0 → 0.2.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 (147) hide show
  1. package/README.md +171 -0
  2. package/dist/commands/self-update.d.ts +8 -0
  3. package/dist/commands/self-update.d.ts.map +1 -0
  4. package/dist/commands/self-update.js +43 -0
  5. package/dist/commands/self-update.js.map +1 -0
  6. package/dist/commands/services.d.ts +3 -0
  7. package/dist/commands/services.d.ts.map +1 -0
  8. package/dist/commands/services.js +40 -0
  9. package/dist/commands/services.js.map +1 -0
  10. package/dist/commands/update.d.ts.map +1 -1
  11. package/dist/commands/update.js +31 -0
  12. package/dist/commands/update.js.map +1 -1
  13. package/dist/index.js +9 -4
  14. package/dist/index.js.map +1 -1
  15. package/dist/lib/services.d.ts +39 -0
  16. package/dist/lib/services.d.ts.map +1 -0
  17. package/dist/lib/services.js +36 -0
  18. package/dist/lib/services.js.map +1 -0
  19. package/dist/ui/hooks/index.d.ts +2 -0
  20. package/dist/ui/hooks/index.d.ts.map +1 -1
  21. package/dist/ui/hooks/index.js +2 -0
  22. package/dist/ui/hooks/index.js.map +1 -1
  23. package/dist/ui/hooks/useComposeLogs.d.ts +7 -0
  24. package/dist/ui/hooks/useComposeLogs.d.ts.map +1 -0
  25. package/dist/ui/hooks/useComposeLogs.js +79 -0
  26. package/dist/ui/hooks/useComposeLogs.js.map +1 -0
  27. package/dist/ui/hooks/useFinish.d.ts +6 -0
  28. package/dist/ui/hooks/useFinish.d.ts.map +1 -0
  29. package/dist/ui/hooks/useFinish.js +18 -0
  30. package/dist/ui/hooks/useFinish.js.map +1 -0
  31. package/dist/ui/views/CertsStatusView.d.ts +5 -1
  32. package/dist/ui/views/CertsStatusView.d.ts.map +1 -1
  33. package/dist/ui/views/CertsStatusView.js +17 -12
  34. package/dist/ui/views/CertsStatusView.js.map +1 -1
  35. package/dist/ui/views/DbBackupView.d.ts +5 -1
  36. package/dist/ui/views/DbBackupView.d.ts.map +1 -1
  37. package/dist/ui/views/DbBackupView.js +11 -7
  38. package/dist/ui/views/DbBackupView.js.map +1 -1
  39. package/dist/ui/views/DbCompactView.d.ts +5 -1
  40. package/dist/ui/views/DbCompactView.d.ts.map +1 -1
  41. package/dist/ui/views/DbCompactView.js +11 -7
  42. package/dist/ui/views/DbCompactView.js.map +1 -1
  43. package/dist/ui/views/DbListView.d.ts +5 -1
  44. package/dist/ui/views/DbListView.d.ts.map +1 -1
  45. package/dist/ui/views/DbListView.js +15 -10
  46. package/dist/ui/views/DbListView.js.map +1 -1
  47. package/dist/ui/views/DbSizeView.d.ts +5 -1
  48. package/dist/ui/views/DbSizeView.d.ts.map +1 -1
  49. package/dist/ui/views/DbSizeView.js +13 -8
  50. package/dist/ui/views/DbSizeView.js.map +1 -1
  51. package/dist/ui/views/DbStatusView.d.ts +5 -1
  52. package/dist/ui/views/DbStatusView.d.ts.map +1 -1
  53. package/dist/ui/views/DbStatusView.js +11 -7
  54. package/dist/ui/views/DbStatusView.js.map +1 -1
  55. package/dist/ui/views/DbTablesView.d.ts +3 -2
  56. package/dist/ui/views/DbTablesView.d.ts.map +1 -1
  57. package/dist/ui/views/DbTablesView.js +11 -7
  58. package/dist/ui/views/DbTablesView.js.map +1 -1
  59. package/dist/ui/views/DiagDatabaseView.d.ts +5 -1
  60. package/dist/ui/views/DiagDatabaseView.d.ts.map +1 -1
  61. package/dist/ui/views/DiagDatabaseView.js +11 -7
  62. package/dist/ui/views/DiagDatabaseView.js.map +1 -1
  63. package/dist/ui/views/DiagNetworkView.d.ts +5 -1
  64. package/dist/ui/views/DiagNetworkView.d.ts.map +1 -1
  65. package/dist/ui/views/DiagNetworkView.js +15 -9
  66. package/dist/ui/views/DiagNetworkView.js.map +1 -1
  67. package/dist/ui/views/DiagServiceView.d.ts +5 -1
  68. package/dist/ui/views/DiagServiceView.d.ts.map +1 -1
  69. package/dist/ui/views/DiagServiceView.js +11 -7
  70. package/dist/ui/views/DiagServiceView.js.map +1 -1
  71. package/dist/ui/views/DockerNetworkView.d.ts +5 -1
  72. package/dist/ui/views/DockerNetworkView.d.ts.map +1 -1
  73. package/dist/ui/views/DockerNetworkView.js +13 -8
  74. package/dist/ui/views/DockerNetworkView.js.map +1 -1
  75. package/dist/ui/views/DockerPruneView.d.ts +5 -1
  76. package/dist/ui/views/DockerPruneView.d.ts.map +1 -1
  77. package/dist/ui/views/DockerPruneView.js +12 -8
  78. package/dist/ui/views/DockerPruneView.js.map +1 -1
  79. package/dist/ui/views/DockerStatusView.d.ts +5 -1
  80. package/dist/ui/views/DockerStatusView.d.ts.map +1 -1
  81. package/dist/ui/views/DockerStatusView.js +12 -8
  82. package/dist/ui/views/DockerStatusView.js.map +1 -1
  83. package/dist/ui/views/JtapiDisableView.d.ts +5 -1
  84. package/dist/ui/views/JtapiDisableView.d.ts.map +1 -1
  85. package/dist/ui/views/JtapiDisableView.js +11 -7
  86. package/dist/ui/views/JtapiDisableView.js.map +1 -1
  87. package/dist/ui/views/JtapiEnableView.d.ts +5 -1
  88. package/dist/ui/views/JtapiEnableView.d.ts.map +1 -1
  89. package/dist/ui/views/JtapiEnableView.js +14 -10
  90. package/dist/ui/views/JtapiEnableView.js.map +1 -1
  91. package/dist/ui/views/JtapiStatusView.d.ts +5 -1
  92. package/dist/ui/views/JtapiStatusView.d.ts.map +1 -1
  93. package/dist/ui/views/JtapiStatusView.js +15 -9
  94. package/dist/ui/views/JtapiStatusView.js.map +1 -1
  95. package/dist/ui/views/JtapiTroubleshootView.d.ts +5 -1
  96. package/dist/ui/views/JtapiTroubleshootView.d.ts.map +1 -1
  97. package/dist/ui/views/JtapiTroubleshootView.js +12 -8
  98. package/dist/ui/views/JtapiTroubleshootView.js.map +1 -1
  99. package/dist/ui/views/MainMenu.d.ts +3 -2
  100. package/dist/ui/views/MainMenu.d.ts.map +1 -1
  101. package/dist/ui/views/MainMenu.js +91 -13
  102. package/dist/ui/views/MainMenu.js.map +1 -1
  103. package/dist/ui/views/MigrateHistoryView.d.ts +5 -1
  104. package/dist/ui/views/MigrateHistoryView.d.ts.map +1 -1
  105. package/dist/ui/views/MigrateHistoryView.js +11 -7
  106. package/dist/ui/views/MigrateHistoryView.js.map +1 -1
  107. package/dist/ui/views/MigrateRollbackView.d.ts +2 -1
  108. package/dist/ui/views/MigrateRollbackView.d.ts.map +1 -1
  109. package/dist/ui/views/MigrateRollbackView.js +11 -7
  110. package/dist/ui/views/MigrateRollbackView.js.map +1 -1
  111. package/dist/ui/views/MigrateRunView.d.ts +5 -1
  112. package/dist/ui/views/MigrateRunView.d.ts.map +1 -1
  113. package/dist/ui/views/MigrateRunView.js +11 -7
  114. package/dist/ui/views/MigrateRunView.js.map +1 -1
  115. package/dist/ui/views/MigrateStatusView.d.ts +5 -1
  116. package/dist/ui/views/MigrateStatusView.d.ts.map +1 -1
  117. package/dist/ui/views/MigrateStatusView.js +11 -7
  118. package/dist/ui/views/MigrateStatusView.js.map +1 -1
  119. package/dist/ui/views/MigrateWatchView.d.ts +2 -1
  120. package/dist/ui/views/MigrateWatchView.d.ts.map +1 -1
  121. package/dist/ui/views/MigrateWatchView.js +13 -7
  122. package/dist/ui/views/MigrateWatchView.js.map +1 -1
  123. package/dist/ui/views/OfflineListView.d.ts +5 -1
  124. package/dist/ui/views/OfflineListView.d.ts.map +1 -1
  125. package/dist/ui/views/OfflineListView.js +16 -11
  126. package/dist/ui/views/OfflineListView.js.map +1 -1
  127. package/dist/ui/views/SecretsSetupView.d.ts +5 -1
  128. package/dist/ui/views/SecretsSetupView.d.ts.map +1 -1
  129. package/dist/ui/views/SecretsSetupView.js +6 -5
  130. package/dist/ui/views/SecretsSetupView.js.map +1 -1
  131. package/dist/ui/views/SecretsStatusView.d.ts +5 -1
  132. package/dist/ui/views/SecretsStatusView.d.ts.map +1 -1
  133. package/dist/ui/views/SecretsStatusView.js +18 -11
  134. package/dist/ui/views/SecretsStatusView.js.map +1 -1
  135. package/dist/ui/views/ServiceLogsView.d.ts +8 -0
  136. package/dist/ui/views/ServiceLogsView.d.ts.map +1 -0
  137. package/dist/ui/views/ServiceLogsView.js +167 -0
  138. package/dist/ui/views/ServiceLogsView.js.map +1 -0
  139. package/dist/ui/views/ServicesView.d.ts +8 -0
  140. package/dist/ui/views/ServicesView.d.ts.map +1 -0
  141. package/dist/ui/views/ServicesView.js +237 -0
  142. package/dist/ui/views/ServicesView.js.map +1 -0
  143. package/dist/ui/views/StatusView.d.ts +5 -1
  144. package/dist/ui/views/StatusView.d.ts.map +1 -1
  145. package/dist/ui/views/StatusView.js +12 -8
  146. package/dist/ui/views/StatusView.js.map +1 -1
  147. package/package.json +1 -1
package/README.md ADDED
@@ -0,0 +1,171 @@
1
+ # @calltelemetry/cli
2
+
3
+ On-premise appliance management CLI for [CallTelemetry](https://calltelemetry.com). Manage updates, databases, networking, certificates, Docker services, and Cisco JTAPI integration from a single tool.
4
+
5
+ ```
6
+ ______ ____ ______ __ __
7
+ / ____/___ _/ / / /_ __/__ / /__ ____ ___ ___ / /________ __
8
+ / / / __ `/ / / / / / _ \/ / _ \/ __ `__ \/ _ \/ __/ ___/ / / /
9
+ / /___/ /_/ / / / / / / __/ / __/ / / / / / __/ /_/ / / /_/ /
10
+ \____/\__,_/_/_/ /_/ \___/_/\___/_/ /_/ /_/\___/\__/_/ \__, /
11
+ /____/
12
+ ```
13
+
14
+ ## Install
15
+
16
+ ```bash
17
+ npm install -g @calltelemetry/cli
18
+ ```
19
+
20
+ Requires Node.js 20+.
21
+
22
+ ## Usage
23
+
24
+ Run `ct` with no arguments to launch the interactive TUI menu, or use commands directly:
25
+
26
+ ```bash
27
+ ct # Interactive menu
28
+ ct status # Show system health
29
+ ct update # Update to latest stable version
30
+ ct db status # Database overview
31
+ ```
32
+
33
+ ## Commands
34
+
35
+ ### Status
36
+
37
+ ```bash
38
+ ct status # System health dashboard
39
+ ```
40
+
41
+ ### Update
42
+
43
+ ```bash
44
+ ct update # Update to latest stable
45
+ ct update 0.8.6 # Update to specific version
46
+ ct update --latest # Include pre-releases
47
+ ct update --force-upgrade # Skip RAM/disk checks
48
+ ct update --no-cleanup # Skip Docker cleanup after update
49
+ ct update --ipv6 # Enable IPv6 support
50
+ ct rollback # Roll back to previous version
51
+ ```
52
+
53
+ Performs pre-flight checks (RAM >= 7.2 GB, disk >= 10% free, Docker 26+), backs up the current compose file, pulls images, and restarts services.
54
+
55
+ ### Database
56
+
57
+ ```bash
58
+ ct db # Show status (default)
59
+ ct db status # Connection and version info
60
+ ct db backup # Create a backup
61
+ ct db restore <file> # Restore from backup
62
+ ct db list # List available backups
63
+ ct db compact # Vacuum and optimize
64
+ ct db tables [name] # Table sizes (optional filter)
65
+ ct db purge <table> <days> # Purge records older than N days
66
+ ct db size # Database size on disk
67
+ ```
68
+
69
+ ### Migrations
70
+
71
+ ```bash
72
+ ct migrate # Show migration status (default)
73
+ ct migrate status # Pending and applied migrations
74
+ ct migrate run # Run pending migrations
75
+ ct migrate rollback [steps] # Roll back N migrations (default: 1)
76
+ ct migrate history # Last 10 applied migrations
77
+ ct migrate watch --interval 5 # Poll migration progress
78
+ ```
79
+
80
+ ### Secrets
81
+
82
+ ```bash
83
+ ct secrets # Show secrets status (default)
84
+ ct secrets setup # Interactive configuration wizard
85
+ ct secrets reset # Revert to defaults
86
+ ```
87
+
88
+ Manages credentials for PostgreSQL, NATS, and Minio. Values load with three-tier priority: defaults, `.env` file, then environment variables. The `.env` file is written with `0600` permissions and a Docker Compose overlay is generated automatically.
89
+
90
+ ### Config
91
+
92
+ ```bash
93
+ ct logging # Show current log level
94
+ ct logging info # Set level (debug|info|warning|error)
95
+
96
+ ct ipv6 # Show IPv6 status
97
+ ct ipv6 enable # Enable IPv6
98
+ ct ipv6 disable # Disable IPv6
99
+
100
+ ct postgres status # Show PostgreSQL version
101
+ ct postgres set 17 # Set version for next update
102
+ ct postgres upgrade 17 # Full upgrade with backup/restore
103
+
104
+ ct certs status # Show certificate details
105
+ ct certs generate # Generate self-signed certificates
106
+ ct certs reset # Remove and regenerate
107
+ ```
108
+
109
+ PostgreSQL upgrade performs a full backup, swaps the container version, and restores data. Supported versions: 14, 15, 16, 17, 18.
110
+
111
+ ### Docker
112
+
113
+ ```bash
114
+ ct docker # Container status (default)
115
+ ct docker status # Containers, images, and networks
116
+ ct docker prune # Clean up unused resources
117
+ ct docker network # Network configuration
118
+ ```
119
+
120
+ ### Diagnostics
121
+
122
+ ```bash
123
+ ct diag network # Interfaces, DNS, gateway, connectivity
124
+ ct diag service # Systemd and container logs
125
+ ct diag database # PostgreSQL diagnostics
126
+ ct diag tesla <ipv4|ipv6> <url> # Test HTTP connectivity to endpoint
127
+ ct diag capture <seconds> [filter] # Packet capture via tcpdump
128
+ ```
129
+
130
+ ### JTAPI (Cisco Phone Control)
131
+
132
+ ```bash
133
+ ct jtapi # Show status (default)
134
+ ct jtapi status # Sidecar connection status
135
+ ct jtapi enable # Enable the JTAPI sidecar
136
+ ct jtapi disable # Disable the JTAPI sidecar
137
+ ct jtapi troubleshoot # Run 9-point diagnostic check
138
+ ```
139
+
140
+ ### Offline / Air-Gapped Deployment
141
+
142
+ ```bash
143
+ ct offline fetch <version> # Download config bundle (fast, no images)
144
+ ct offline download <version> # Full bundle with Docker images
145
+ ct offline apply <bundle> # Install bundle on target machine
146
+ ct offline list # List images in current compose file
147
+ ```
148
+
149
+ `fetch` downloads configs only. `download` builds a full offline archive including all Docker images for air-gapped installation.
150
+
151
+ ## Interactive TUI
152
+
153
+ When run without arguments on a TTY, `ct` launches an interactive menu built with [Ink](https://github.com/vadimdemedes/ink). Navigate with arrow keys, select with Enter, quit with `q`.
154
+
155
+ Categories: Status, Update, Database, Migrate, Secrets, Config, Docker, Diagnostics, JTAPI, Offline.
156
+
157
+ ## Development
158
+
159
+ ```bash
160
+ git clone https://github.com/calltelemetry/ct-cli.git
161
+ cd ct-cli
162
+ yarn install
163
+ yarn dev # Run from source via tsx
164
+ yarn build # Compile TypeScript
165
+ yarn test # Run tests
166
+ yarn test:watch # Watch mode
167
+ ```
168
+
169
+ ## License
170
+
171
+ UNLICENSED - Proprietary software of CallTelemetry.
@@ -0,0 +1,8 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Update the CLI itself via npm.
4
+ * Can be called standalone or as a pre-step during `ct update`.
5
+ */
6
+ export declare function selfUpdate(): Promise<void>;
7
+ export declare function registerSelfUpdateCommand(program: Command): void;
8
+ //# sourceMappingURL=self-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-update.d.ts","sourceRoot":"","sources":["../../src/commands/self-update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CA6BhD;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,QAOzD"}
@@ -0,0 +1,43 @@
1
+ import { execa } from 'execa';
2
+ import * as out from '../utils/output.js';
3
+ /**
4
+ * Update the CLI itself via npm.
5
+ * Can be called standalone or as a pre-step during `ct update`.
6
+ */
7
+ export async function selfUpdate() {
8
+ console.log('Checking for CLI updates...');
9
+ try {
10
+ const { stdout: installed } = await execa('npm', ['ls', '-g', '@calltelemetry/cli', '--json']);
11
+ const local = JSON.parse(installed)?.dependencies?.['@calltelemetry/cli']?.version;
12
+ const { stdout: registryJson } = await execa('npm', ['view', '@calltelemetry/cli', 'version', '--json']);
13
+ const latest = JSON.parse(registryJson);
14
+ if (local && local === latest) {
15
+ out.ok(`CLI is up to date (v${local})`);
16
+ return;
17
+ }
18
+ console.log(`Updating CLI: ${local ?? 'unknown'} → ${latest}...`);
19
+ }
20
+ catch {
21
+ // Can't determine versions — just run the install
22
+ console.log('Installing latest CLI...');
23
+ }
24
+ try {
25
+ await execa('sudo', ['npm', 'install', '-g', '@calltelemetry/cli'], {
26
+ stdout: 'inherit',
27
+ stderr: 'inherit',
28
+ });
29
+ out.ok('CLI updated successfully');
30
+ }
31
+ catch {
32
+ out.warn('CLI self-update failed. You can update manually: sudo npm install -g @calltelemetry/cli');
33
+ }
34
+ }
35
+ export function registerSelfUpdateCommand(program) {
36
+ program
37
+ .command('self-update')
38
+ .description('Update the ct CLI tool to the latest version')
39
+ .action(async () => {
40
+ await selfUpdate();
41
+ });
42
+ }
43
+ //# sourceMappingURL=self-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-update.js","sourceRoot":"","sources":["../../src/commands/self-update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,oBAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAEnF,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAExC,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YAC9B,GAAG,CAAC,EAAE,CAAC,uBAAuB,KAAK,GAAG,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,IAAI,SAAS,MAAM,MAAM,KAAK,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;QAClD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,CAAC,EAAE;YAClE,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,0BAA0B,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC;IACtG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,UAAU,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerServicesCommand(program: Command): void;
3
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/commands/services.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,QA+CvD"}
@@ -0,0 +1,40 @@
1
+ import { render } from 'ink';
2
+ import React from 'react';
3
+ import { ServicesView } from '../ui/views/ServicesView.js';
4
+ import { ServiceLogsView } from '../ui/views/ServiceLogsView.js';
5
+ export function registerServicesCommand(program) {
6
+ const services = program
7
+ .command('services')
8
+ .description('Manage Docker Compose services');
9
+ // Default: interactive dashboard
10
+ services.action(async () => {
11
+ const { waitUntilExit } = render(React.createElement(ServicesView));
12
+ await waitUntilExit();
13
+ });
14
+ services.command('logs <service>')
15
+ .description('Stream logs for a service')
16
+ .option('-n, --tail <lines>', 'Number of lines to show', '200')
17
+ .action(async (service, opts) => {
18
+ const { waitUntilExit } = render(React.createElement(ServiceLogsView, { service, tail: Number(opts.tail) }));
19
+ await waitUntilExit();
20
+ });
21
+ services.command('start <service>')
22
+ .description('Start a service')
23
+ .action(async (service) => {
24
+ const { waitUntilExit } = render(React.createElement(ServicesView, { action: 'start', service }));
25
+ await waitUntilExit();
26
+ });
27
+ services.command('stop <service>')
28
+ .description('Stop a service')
29
+ .action(async (service) => {
30
+ const { waitUntilExit } = render(React.createElement(ServicesView, { action: 'stop', service }));
31
+ await waitUntilExit();
32
+ });
33
+ services.command('restart <service>')
34
+ .description('Restart a service')
35
+ .action(async (service) => {
36
+ const { waitUntilExit } = render(React.createElement(ServicesView, { action: 'restart', service }));
37
+ await waitUntilExit();
38
+ });
39
+ }
40
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/commands/services.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,gCAAgC,CAAC,CAAC;IAEjD,iCAAiC;IACjC,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACzB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;QACpE,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;SAC/B,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,KAAK,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAsB,EAAE,EAAE;QACxD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,KAAK,CAAC,aAAa,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAC3E,CAAC;QACF,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEL,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC;SAChC,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAChC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAChE,CAAC;QACF,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEL,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;SAC/B,WAAW,CAAC,gBAAgB,CAAC;SAC7B,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAChC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAC/D,CAAC;QACF,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEL,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC;SAClC,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;QAChC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAClE,CAAC;QACF,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwBpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAqMrD"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,QAkOrD"}
@@ -10,6 +10,7 @@ import { generateSelfSignedCerts } from '../lib/certs.js';
10
10
  import { setPostgresVersion } from '../lib/postgres.js';
11
11
  import { isVersionGte } from '../utils/version.js';
12
12
  import { confirm } from '../utils/prompt.js';
13
+ import { selfUpdate } from './self-update.js';
13
14
  import * as out from '../utils/output.js';
14
15
  function getCurrentVersion() {
15
16
  const { composeFile } = getPaths();
@@ -30,6 +31,9 @@ export function registerUpdateCommand(program) {
30
31
  .option('--ipv6', 'Enable IPv6 support')
31
32
  .action(async (versionArg, opts) => {
32
33
  const { installDir, composeFile, backupDir, overrideFile } = getPaths();
34
+ // Self-update CLI first
35
+ await selfUpdate();
36
+ console.log();
33
37
  await generateSelfSignedCerts();
34
38
  // Resolve version
35
39
  let version = versionArg;
@@ -95,6 +99,33 @@ export function registerUpdateCommand(program) {
95
99
  else {
96
100
  out.ok(`Docker version ${dockerVer} is supported`);
97
101
  }
102
+ // Ensure Node.js 20.x is installed
103
+ console.log();
104
+ console.log('Ensuring Node.js 20.x is installed...');
105
+ try {
106
+ const { stdout: nodeVer } = await execa('node', ['--version']);
107
+ const major = parseInt(nodeVer.replace('v', '').split('.')[0], 10);
108
+ if (major >= 20) {
109
+ out.ok(`Node.js ${nodeVer.trim()} is installed`);
110
+ }
111
+ else {
112
+ out.warn(`Node.js ${nodeVer.trim()} detected — upgrading to 20.x`);
113
+ await execa('bash', ['-c', 'curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -'], { stdout: 'inherit', stderr: 'inherit' });
114
+ await execa('sudo', ['dnf', 'install', '-y', 'nodejs'], { stdout: 'inherit', stderr: 'inherit' });
115
+ out.ok('Node.js 20.x installed');
116
+ }
117
+ }
118
+ catch {
119
+ console.log('Node.js not found — installing 20.x...');
120
+ try {
121
+ await execa('bash', ['-c', 'curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -'], { stdout: 'inherit', stderr: 'inherit' });
122
+ await execa('sudo', ['dnf', 'install', '-y', 'nodejs'], { stdout: 'inherit', stderr: 'inherit' });
123
+ out.ok('Node.js 20.x installed');
124
+ }
125
+ catch (installErr) {
126
+ out.warn('Could not install Node.js automatically. Please install Node.js 20+ manually.');
127
+ }
128
+ }
98
129
  // Backup current compose
99
130
  await mkdir(backupDir, { recursive: true });
100
131
  if (existsSync(composeFile)) {
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7G,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAsB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,SAAS,iBAAiB;IACxB,MAAM,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;IACnC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,eAAe,CAAC;IAErD,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,qFAAqF,CAAC;SAClG,MAAM,CAAC,UAAU,EAAE,yCAAyC,CAAC;SAC7D,MAAM,CAAC,UAAU,EAAE,qCAAqC,CAAC;SACzD,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;SAC1E,MAAM,CAAC,cAAc,EAAE,kCAAkC,CAAC;SAC1D,MAAM,CAAC,QAAQ,EAAE,qBAAqB,CAAC;SACvC,MAAM,CAAC,KAAK,EAAE,UAA8B,EAAE,IAAI,EAAE,EAAE;QACrD,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,QAAQ,EAAE,CAAC;QAExE,wBAAwB;QACxB,MAAM,UAAU,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,MAAM,uBAAuB,EAAE,CAAC;QAEhC,kBAAkB;QAClB,IAAI,OAAO,GAAG,UAAU,CAAC;QACzB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;YACnE,OAAO,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;YACjD,OAAO,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,oBAAoB,cAAc,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,yBAAyB;QACzB,IAAI,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,yCAAyC,OAAO,KAAK,CAAC,CAAC;YACnE,MAAM,GAAG,GAAG,MAAM,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,GAAG,CAAC,QAAQ,CAAC,kBAAkB,EAAE;oBAC/B,8CAA8C,GAAG,CAAC,OAAO,KAAK;oBAC9D,wCAAwC;iBACzC,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,GAAG,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,aAAa;QACb,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACtC,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,GAAG,CAAC,QAAQ,CAAC,yBAAyB,EAAE;oBACtC,cAAc,IAAI,CAAC,WAAW,2BAA2B;oBACzD,wCAAwC;iBACzC,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,GAAG,CAAC,EAAE,CAAC,iCAAiC,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,uBAAuB;QACvB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC3C,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,SAAS,GAAG,EAAE,EAAE,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,kBAAkB,SAAS,oCAAoC,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,sBAAsB,EAAE,uBAAuB,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACtK,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;gBACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,EAAE,CAAC,kBAAkB,SAAS,eAAe,CAAC,CAAC;QACrD,CAAC;QAED,mCAAmC;QACnC,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;YAC/D,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnE,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;gBAChB,GAAG,CAAC,EAAE,CAAC,WAAW,OAAO,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC;gBACnE,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,gEAAgE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBACxI,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAClG,GAAG,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,gEAAgE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBACxI,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBAClG,GAAG,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,GAAG,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9E,MAAM,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,kBAAkB,SAAS,MAAM,CAAC,CAAC,CAAC;YAChF,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACxD,CAAC;QAED,kBAAkB;QAClB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5C,GAAG,CAAC,QAAQ,CAAC,6BAA6B,EAAE;oBAC1C,gCAAgC;oBAChC,wCAAwC;iBACzC,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,cAAc;QACd,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,OAAO,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACxC,GAAG,CAAC,EAAE,CAAC,gCAAgC,CAAC,CAAC;QAEzC,gBAAgB;QAChB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,KAAK,MAAM,GAAG,IAAI,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QAEpD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,kBAAkB,cAAc,OAAO,OAAO,EAAE,CAAC,CAAC;QAE9D,oBAAoB;QACpB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,MAAM,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;gBAClC,OAAO;YACT,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACnD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/D,MAAM,YAAY,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAClC,IAAI,YAAY,IAAI,YAAY,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBACvE,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,IAAI,CAAC,4DAA4D,YAAY,EAAE,CAAC,CAAC;gBACrF,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;gBACnF,MAAM,kBAAkB,CAAC,YAAY,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAED,QAAQ;QACR,MAAM,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAE3D,UAAU;QACV,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;YAChC,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1B,CAAC;QAED,UAAU;QACV,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnE,CAAC;QAED,GAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,oDAAoD,CAAC;SACjE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,QAAQ,EAAE,CAAC;QAE9C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC;aACnC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;aAClE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;aACnE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QAEnC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1B,CAAC;QAED,GAAG,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/index.js CHANGED
@@ -10,6 +10,8 @@ import { registerOfflineCommand } from './commands/offline.js';
10
10
  import { registerDiagCommand } from './commands/diag.js';
11
11
  import { registerJtapiCommand } from './commands/jtapi.js';
12
12
  import { registerSecretsCommand } from './commands/secrets.js';
13
+ import { registerServicesCommand } from './commands/services.js';
14
+ import { registerSelfUpdateCommand } from './commands/self-update.js';
13
15
  const LOGO = `
14
16
  ______ ____ ______ __ __
15
17
  / ____/___ _/ / / /_ __/__ / /__ ____ ___ ___ / /________ __
@@ -23,8 +25,9 @@ const program = new Command();
23
25
  program
24
26
  .name('ct')
25
27
  .description('CallTelemetry appliance management CLI')
26
- .version('0.1.0')
28
+ .version('0.2.0')
27
29
  .hook('preAction', () => {
30
+ // Only show logo for direct CLI invocations, not TUI
28
31
  console.log(LOGO);
29
32
  console.log();
30
33
  });
@@ -38,6 +41,8 @@ registerOfflineCommand(program);
38
41
  registerDiagCommand(program);
39
42
  registerJtapiCommand(program);
40
43
  registerSecretsCommand(program);
44
+ registerServicesCommand(program);
45
+ registerSelfUpdateCommand(program);
41
46
  // Interactive menu when `ct` is run with no arguments on a TTY
42
47
  const hasCommand = process.argv.length > 2;
43
48
  if (!hasCommand && process.stdout.isTTY) {
@@ -46,10 +51,10 @@ if (!hasCommand && process.stdout.isTTY) {
46
51
  const React = await import('react');
47
52
  const { MainMenu } = await import('./ui/views/MainMenu.js');
48
53
  const { unmount, waitUntilExit } = render(React.createElement(MainMenu, {
49
- version: '0.1.0',
50
- onSelect: (command) => {
54
+ version: '0.2.0',
55
+ onCliCommand: (command) => {
51
56
  unmount();
52
- // Re-invoke Commander with the selected command
57
+ // Fall back to Commander for commands without TUI views
53
58
  program.parse(['node', 'ct', ...command.split(' ')]);
54
59
  },
55
60
  onExit: () => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,IAAI,GAAG;;;;;;;;0BAQa,CAAC;AAE3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,wCAAwC,CAAC;KACrD,OAAO,CAAC,OAAO,CAAC;KAChB,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IACtB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC,CAAC,CAAC;AAEL,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,+DAA+D;AAC/D,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;AAE3C,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACxC,2EAA2E;IAC3E,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAE5D,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CACvC,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE;YAC5B,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,CAAC,OAAe,EAAE,EAAE;gBAC5B,OAAO,EAAE,CAAC;gBACV,gDAAgD;gBAChD,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,EAAE,GAAG,EAAE;gBACX,OAAO,EAAE,CAAC;YACZ,CAAC;SACF,CAAC,CACH,CAAC;QAEF,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export interface ServiceInfo {
2
+ service: string;
3
+ state: string;
4
+ health: string;
5
+ image: string;
6
+ ports: string;
7
+ status: string;
8
+ }
9
+ export declare function getServiceList(): Promise<ServiceInfo[]>;
10
+ export declare function startService(name: string): Promise<import("execa").Result<{
11
+ cwd: string;
12
+ stdin: "pipe" | undefined;
13
+ stdout: "pipe" | "inherit";
14
+ stderr: "pipe" | "inherit";
15
+ }>>;
16
+ export declare function stopService(name: string): Promise<import("execa").Result<{
17
+ cwd: string;
18
+ stdin: "pipe" | undefined;
19
+ stdout: "pipe" | "inherit";
20
+ stderr: "pipe" | "inherit";
21
+ }>>;
22
+ export declare function restartService(name: string): Promise<import("execa").Result<{
23
+ cwd: string;
24
+ stdin: "pipe" | undefined;
25
+ stdout: "pipe" | "inherit";
26
+ stderr: "pipe" | "inherit";
27
+ }>>;
28
+ export declare function startAllServices(): Promise<import("execa").Result<{
29
+ cwd: string;
30
+ stdout: "pipe" | "inherit";
31
+ stderr: "pipe" | "inherit";
32
+ }>>;
33
+ export declare function stopAllServices(): Promise<import("execa").Result<{
34
+ cwd: string;
35
+ stdin: "pipe" | undefined;
36
+ stdout: "pipe" | "inherit";
37
+ stderr: "pipe" | "inherit";
38
+ }>>;
39
+ //# sourceMappingURL=services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/lib/services.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAkB7D;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM;;;;;IAE9C;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM;;;;;IAE7C;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM;;;;;IAEhD;AAED,wBAAsB,gBAAgB;;;;IAErC;AAED,wBAAsB,eAAe;;;;;IAEpC"}
@@ -0,0 +1,36 @@
1
+ import { compose, composeUp } from './compose.js';
2
+ export async function getServiceList() {
3
+ const result = await compose(['ps', '-a', '--format', 'json'], { pipe: true });
4
+ const raw = (result.stdout ?? '').trim();
5
+ if (!raw)
6
+ return [];
7
+ return raw.split('\n')
8
+ .filter(line => line.trim())
9
+ .map(line => {
10
+ const obj = JSON.parse(line);
11
+ return {
12
+ service: obj.Service ?? '',
13
+ state: obj.State ?? '',
14
+ health: obj.Health || '',
15
+ image: obj.Image ?? '',
16
+ ports: obj.Ports || '',
17
+ status: obj.Status ?? '',
18
+ };
19
+ });
20
+ }
21
+ export async function startService(name) {
22
+ return compose(['start', name], { pipe: true });
23
+ }
24
+ export async function stopService(name) {
25
+ return compose(['stop', name], { pipe: true });
26
+ }
27
+ export async function restartService(name) {
28
+ return compose(['restart', name], { pipe: true });
29
+ }
30
+ export async function startAllServices() {
31
+ return composeUp(['-d'], { pipe: true });
32
+ }
33
+ export async function stopAllServices() {
34
+ return compose(['stop'], { pipe: true });
35
+ }
36
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/lib/services.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAWlD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;SACnB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC3B,GAAG,CAAC,IAAI,CAAC,EAAE;QACV,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE;YAC1B,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;YACtB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;YACxB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;YACtB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;YACtB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;SACzB,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,OAAO,OAAO,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,OAAO,OAAO,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,OAAO,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC"}
@@ -4,4 +4,6 @@ export { useStepRunner } from "./useStepRunner.js";
4
4
  export type { Step, StepState } from "./useStepRunner.js";
5
5
  export { useStreamingProcess } from "./useStreamingProcess.js";
6
6
  export { usePolling } from "./usePolling.js";
7
+ export { useComposeLogs } from "./useComposeLogs.js";
8
+ export { useFinish } from "./useFinish.js";
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -2,4 +2,6 @@ export { useAsyncTask } from "./useAsyncTask.js";
2
2
  export { useStepRunner } from "./useStepRunner.js";
3
3
  export { useStreamingProcess } from "./useStreamingProcess.js";
4
4
  export { usePolling } from "./usePolling.js";
5
+ export { useComposeLogs } from "./useComposeLogs.js";
6
+ export { useFinish } from "./useFinish.js";
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function useComposeLogs(service: string | null, tail?: number): {
2
+ lines: string[];
3
+ isRunning: boolean;
4
+ start: () => void;
5
+ stop: () => void;
6
+ };
7
+ //# sourceMappingURL=useComposeLogs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComposeLogs.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useComposeLogs.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,IAAI,SAAM,GACT;IACD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB,CAmFA"}