@calltelemetry/cli 0.4.25 → 0.5.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 (174) hide show
  1. package/dist/commands/diag.d.ts.map +1 -1
  2. package/dist/commands/diag.js +29 -0
  3. package/dist/commands/diag.js.map +1 -1
  4. package/dist/commands/k8s.d.ts +3 -0
  5. package/dist/commands/k8s.d.ts.map +1 -0
  6. package/dist/commands/k8s.js +192 -0
  7. package/dist/commands/k8s.js.map +1 -0
  8. package/dist/commands/network.d.ts +3 -0
  9. package/dist/commands/network.d.ts.map +1 -0
  10. package/dist/commands/network.js +120 -0
  11. package/dist/commands/network.js.map +1 -0
  12. package/dist/commands/shell.d.ts +3 -0
  13. package/dist/commands/shell.d.ts.map +1 -0
  14. package/dist/commands/shell.js +10 -0
  15. package/dist/commands/shell.js.map +1 -0
  16. package/dist/index.js +7 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/lib/backend.d.ts +85 -0
  19. package/dist/lib/backend.d.ts.map +1 -0
  20. package/dist/lib/backend.js +6 -0
  21. package/dist/lib/backend.js.map +1 -0
  22. package/dist/lib/bundle.d.ts.map +1 -1
  23. package/dist/lib/bundle.js +3 -0
  24. package/dist/lib/bundle.js.map +1 -1
  25. package/dist/lib/compose-backend.d.ts +19 -0
  26. package/dist/lib/compose-backend.d.ts.map +1 -0
  27. package/dist/lib/compose-backend.js +78 -0
  28. package/dist/lib/compose-backend.js.map +1 -0
  29. package/dist/lib/deployment.d.ts +6 -0
  30. package/dist/lib/deployment.d.ts.map +1 -0
  31. package/dist/lib/deployment.js +51 -0
  32. package/dist/lib/deployment.js.map +1 -0
  33. package/dist/lib/doctor.d.ts +13 -0
  34. package/dist/lib/doctor.d.ts.map +1 -0
  35. package/dist/lib/doctor.js +82 -0
  36. package/dist/lib/doctor.js.map +1 -0
  37. package/dist/lib/helmfile.d.ts +14 -0
  38. package/dist/lib/helmfile.d.ts.map +1 -0
  39. package/dist/lib/helmfile.js +78 -0
  40. package/dist/lib/helmfile.js.map +1 -0
  41. package/dist/lib/k8s-backend.d.ts +36 -0
  42. package/dist/lib/k8s-backend.d.ts.map +1 -0
  43. package/dist/lib/k8s-backend.js +301 -0
  44. package/dist/lib/k8s-backend.js.map +1 -0
  45. package/dist/lib/k8s-client.d.ts +14 -0
  46. package/dist/lib/k8s-client.d.ts.map +1 -0
  47. package/dist/lib/k8s-client.js +42 -0
  48. package/dist/lib/k8s-client.js.map +1 -0
  49. package/dist/lib/metadata-artifacts.d.ts +2 -0
  50. package/dist/lib/metadata-artifacts.d.ts.map +1 -0
  51. package/dist/lib/metadata-artifacts.js +36 -0
  52. package/dist/lib/metadata-artifacts.js.map +1 -0
  53. package/dist/lib/offline-steps.d.ts.map +1 -1
  54. package/dist/lib/offline-steps.js +3 -0
  55. package/dist/lib/offline-steps.js.map +1 -1
  56. package/dist/lib/prefs.d.ts +3 -0
  57. package/dist/lib/prefs.d.ts.map +1 -1
  58. package/dist/lib/prefs.js +9 -1
  59. package/dist/lib/prefs.js.map +1 -1
  60. package/dist/shell/commands/config.d.ts +11 -0
  61. package/dist/shell/commands/config.d.ts.map +1 -0
  62. package/dist/shell/commands/config.js +193 -0
  63. package/dist/shell/commands/config.js.map +1 -0
  64. package/dist/shell/commands/connect.d.ts +18 -0
  65. package/dist/shell/commands/connect.d.ts.map +1 -0
  66. package/dist/shell/commands/connect.js +99 -0
  67. package/dist/shell/commands/connect.js.map +1 -0
  68. package/dist/shell/commands/db.d.ts +11 -0
  69. package/dist/shell/commands/db.d.ts.map +1 -0
  70. package/dist/shell/commands/db.js +237 -0
  71. package/dist/shell/commands/db.js.map +1 -0
  72. package/dist/shell/commands/debug.d.ts +15 -0
  73. package/dist/shell/commands/debug.d.ts.map +1 -0
  74. package/dist/shell/commands/debug.js +310 -0
  75. package/dist/shell/commands/debug.js.map +1 -0
  76. package/dist/shell/commands/diag.d.ts +16 -0
  77. package/dist/shell/commands/diag.d.ts.map +1 -0
  78. package/dist/shell/commands/diag.js +555 -0
  79. package/dist/shell/commands/diag.js.map +1 -0
  80. package/dist/shell/commands/registry.d.ts +7 -0
  81. package/dist/shell/commands/registry.d.ts.map +1 -0
  82. package/dist/shell/commands/registry.js +391 -0
  83. package/dist/shell/commands/registry.js.map +1 -0
  84. package/dist/shell/commands/secrets.d.ts +18 -0
  85. package/dist/shell/commands/secrets.d.ts.map +1 -0
  86. package/dist/shell/commands/secrets.js +100 -0
  87. package/dist/shell/commands/secrets.js.map +1 -0
  88. package/dist/shell/commands/services.d.ts +7 -0
  89. package/dist/shell/commands/services.d.ts.map +1 -0
  90. package/dist/shell/commands/services.js +115 -0
  91. package/dist/shell/commands/services.js.map +1 -0
  92. package/dist/shell/commands/show.d.ts +26 -0
  93. package/dist/shell/commands/show.d.ts.map +1 -0
  94. package/dist/shell/commands/show.js +897 -0
  95. package/dist/shell/commands/show.js.map +1 -0
  96. package/dist/shell/commands/system.d.ts +13 -0
  97. package/dist/shell/commands/system.d.ts.map +1 -0
  98. package/dist/shell/commands/system.js +270 -0
  99. package/dist/shell/commands/system.js.map +1 -0
  100. package/dist/shell/commands/test.d.ts +12 -0
  101. package/dist/shell/commands/test.d.ts.map +1 -0
  102. package/dist/shell/commands/test.js +197 -0
  103. package/dist/shell/commands/test.js.map +1 -0
  104. package/dist/shell/commands/users.d.ts +14 -0
  105. package/dist/shell/commands/users.d.ts.map +1 -0
  106. package/dist/shell/commands/users.js +86 -0
  107. package/dist/shell/commands/users.js.map +1 -0
  108. package/dist/shell/completer.d.ts +16 -0
  109. package/dist/shell/completer.d.ts.map +1 -0
  110. package/dist/shell/completer.js +124 -0
  111. package/dist/shell/completer.js.map +1 -0
  112. package/dist/shell/context.d.ts +12 -0
  113. package/dist/shell/context.d.ts.map +1 -0
  114. package/dist/shell/context.js +2 -0
  115. package/dist/shell/context.js.map +1 -0
  116. package/dist/shell/footer.d.ts +8 -0
  117. package/dist/shell/footer.d.ts.map +1 -0
  118. package/dist/shell/footer.js +47 -0
  119. package/dist/shell/footer.js.map +1 -0
  120. package/dist/shell/formatter.d.ts +47 -0
  121. package/dist/shell/formatter.d.ts.map +1 -0
  122. package/dist/shell/formatter.js +135 -0
  123. package/dist/shell/formatter.js.map +1 -0
  124. package/dist/shell/mcp-bridge.d.ts +13 -0
  125. package/dist/shell/mcp-bridge.d.ts.map +1 -0
  126. package/dist/shell/mcp-bridge.js +23 -0
  127. package/dist/shell/mcp-bridge.js.map +1 -0
  128. package/dist/shell/parser.d.ts +33 -0
  129. package/dist/shell/parser.d.ts.map +1 -0
  130. package/dist/shell/parser.js +100 -0
  131. package/dist/shell/parser.js.map +1 -0
  132. package/dist/shell/repl.d.ts +5 -0
  133. package/dist/shell/repl.d.ts.map +1 -0
  134. package/dist/shell/repl.js +251 -0
  135. package/dist/shell/repl.js.map +1 -0
  136. package/dist/shell/sparkline.d.ts +16 -0
  137. package/dist/shell/sparkline.d.ts.map +1 -0
  138. package/dist/shell/sparkline.js +56 -0
  139. package/dist/shell/sparkline.js.map +1 -0
  140. package/dist/shell/theme.d.ts +72 -0
  141. package/dist/shell/theme.d.ts.map +1 -0
  142. package/dist/shell/theme.js +60 -0
  143. package/dist/shell/theme.js.map +1 -0
  144. package/dist/ui/views/DbHealthView.d.ts +6 -0
  145. package/dist/ui/views/DbHealthView.d.ts.map +1 -0
  146. package/dist/ui/views/DbHealthView.js +180 -0
  147. package/dist/ui/views/DbHealthView.js.map +1 -0
  148. package/dist/ui/views/K8sDeployView.d.ts +8 -0
  149. package/dist/ui/views/K8sDeployView.d.ts.map +1 -0
  150. package/dist/ui/views/K8sDeployView.js +81 -0
  151. package/dist/ui/views/K8sDeployView.js.map +1 -0
  152. package/dist/ui/views/K8sRunbookView.d.ts +8 -0
  153. package/dist/ui/views/K8sRunbookView.d.ts.map +1 -0
  154. package/dist/ui/views/K8sRunbookView.js +181 -0
  155. package/dist/ui/views/K8sRunbookView.js.map +1 -0
  156. package/dist/ui/views/K8sServicesView.d.ts +8 -0
  157. package/dist/ui/views/K8sServicesView.d.ts.map +1 -0
  158. package/dist/ui/views/K8sServicesView.js +106 -0
  159. package/dist/ui/views/K8sServicesView.js.map +1 -0
  160. package/dist/ui/views/K8sStatusView.d.ts +8 -0
  161. package/dist/ui/views/K8sStatusView.d.ts.map +1 -0
  162. package/dist/ui/views/K8sStatusView.js +135 -0
  163. package/dist/ui/views/K8sStatusView.js.map +1 -0
  164. package/dist/ui/views/MainMenu.d.ts.map +1 -1
  165. package/dist/ui/views/MainMenu.js +54 -24
  166. package/dist/ui/views/MainMenu.js.map +1 -1
  167. package/dist/ui/views/SettingsView.d.ts.map +1 -1
  168. package/dist/ui/views/SettingsView.js +19 -1
  169. package/dist/ui/views/SettingsView.js.map +1 -1
  170. package/dist/ui/views/SetupWizardView.d.ts +7 -0
  171. package/dist/ui/views/SetupWizardView.d.ts.map +1 -0
  172. package/dist/ui/views/SetupWizardView.js +244 -0
  173. package/dist/ui/views/SetupWizardView.js.map +1 -0
  174. package/package.json +2 -1
@@ -0,0 +1,180 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { composeExec } from '../../lib/compose.js';
5
+ import { DB_USER, DB_NAME, PG_ENV } from '../../lib/db.js';
6
+ import { readEnvKeys, updateEnvKeys } from '../../lib/env.js';
7
+ import { AppShell, Section, MeterBar, Spinner, StatusLine } from '../components/index.js';
8
+ import { usePolling } from '../hooks/index.js';
9
+ const PROFILES = {
10
+ small: { PG_SHM_SIZE: '1gb', PG_SHARED_BUFFERS: '512MB', PG_EFFECTIVE_CACHE_SIZE: '1536MB', PG_WORK_MEM: '8MB', PG_MAINTENANCE_WORK_MEM: '128MB', label: 'small (8GB appliance, <40GB DB)' },
11
+ medium: { PG_SHM_SIZE: '4gb', PG_SHARED_BUFFERS: '2GB', PG_EFFECTIVE_CACHE_SIZE: '6GB', PG_WORK_MEM: '16MB', PG_MAINTENANCE_WORK_MEM: '256MB', label: 'medium (16GB server, 40-100GB DB)' },
12
+ large: { PG_SHM_SIZE: '8gb', PG_SHARED_BUFFERS: '4GB', PG_EFFECTIVE_CACHE_SIZE: '12GB', PG_WORK_MEM: '32MB', PG_MAINTENANCE_WORK_MEM: '512MB', label: 'large (32GB+ server, 100GB+ DB)' },
13
+ };
14
+ const PROFILE_ORDER = ['small', 'medium', 'large'];
15
+ /* ── SQL helpers ───────────────────────────────────────────────────── */
16
+ async function psql(sql) {
17
+ const result = await composeExec('db', ['psql', '-U', DB_USER, '-d', DB_NAME, '-t', '-A', '-c', sql], { env: PG_ENV, pipe: true });
18
+ return (result.stdout ?? '').trim();
19
+ }
20
+ async function fetchDbHealth() {
21
+ const [connRaw, maxConnRaw, cacheRaw, sbRaw, wmRaw, mwmRaw, avRaw, ckptRaw, sizeRaw, tablesRaw,] = await Promise.allSettled([
22
+ // 0: active/idle counts
23
+ psql(`SELECT state, count(*) FROM pg_stat_activity GROUP BY state`),
24
+ // 1: max_connections
25
+ psql(`SHOW max_connections`),
26
+ // 2: buffer cache hit rate
27
+ psql(`SELECT CASE WHEN (blks_hit + blks_read) = 0 THEN NULL ELSE round(blks_hit * 100.0 / (blks_hit + blks_read), 2) END FROM pg_stat_bgwriter`),
28
+ // 3: shared_buffers live value
29
+ psql(`SHOW shared_buffers`),
30
+ // 4: work_mem live value
31
+ psql(`SHOW work_mem`),
32
+ // 5: maintenance_work_mem live value
33
+ psql(`SHOW maintenance_work_mem`),
34
+ // 6: autovacuum - top tables by dead tuples
35
+ psql(`SELECT relname, n_dead_tup, n_live_tup, CASE WHEN (n_live_tup + n_dead_tup) = 0 THEN 0 ELSE round(n_dead_tup * 100.0 / (n_live_tup + n_dead_tup), 1) END AS ratio, COALESCE(to_char(last_autovacuum, 'HH24:MI'), COALESCE(to_char(last_vacuum, 'HH24:MI'), 'never')) AS last_vac FROM pg_stat_user_tables WHERE n_dead_tup > 100 ORDER BY n_dead_tup DESC LIMIT 5`),
36
+ // 7: checkpoint stats
37
+ psql(`SELECT checkpoints_timed, checkpoints_req, CASE WHEN (blk_write_time + blk_read_time) = 0 THEN 0 ELSE round(blk_write_time * 100.0 / (blk_write_time + blk_read_time + 1), 1) END FROM pg_stat_bgwriter`),
38
+ // 8: total db size in bytes
39
+ psql(`SELECT pg_database_size(current_database())`),
40
+ // 9: top 5 tables by size
41
+ psql(`SELECT relname, pg_size_pretty(pg_total_relation_size(quote_ident(relname))) FROM pg_stat_user_tables ORDER BY pg_total_relation_size(quote_ident(relname)) DESC LIMIT 5`),
42
+ ]);
43
+ // Parse connection counts
44
+ let activeConns = 0;
45
+ let idleConns = 0;
46
+ if (connRaw.status === 'fulfilled') {
47
+ for (const line of connRaw.value.split('\n').filter(Boolean)) {
48
+ const parts = line.split('|');
49
+ const state = parts[0]?.trim() ?? '';
50
+ const count = parseInt(parts[1]?.trim() ?? '0', 10);
51
+ if (state === 'active')
52
+ activeConns = count;
53
+ else if (state === 'idle')
54
+ idleConns = count;
55
+ }
56
+ }
57
+ const maxConns = maxConnRaw.status === 'fulfilled' ? parseInt(maxConnRaw.value, 10) || 300 : 300;
58
+ const cacheHitPct = cacheRaw.status === 'fulfilled' && cacheRaw.value ? parseFloat(cacheRaw.value) : null;
59
+ const sharedBuffers = sbRaw.status === 'fulfilled' ? sbRaw.value : '?';
60
+ const workMem = wmRaw.status === 'fulfilled' ? wmRaw.value : '?';
61
+ const maintenanceWorkMem = mwmRaw.status === 'fulfilled' ? mwmRaw.value : '?';
62
+ // Parse autovacuum rows
63
+ const autovacuumRows = [];
64
+ if (avRaw.status === 'fulfilled') {
65
+ for (const line of avRaw.value.split('\n').filter(Boolean)) {
66
+ const p = line.split('|');
67
+ if (p.length >= 5) {
68
+ autovacuumRows.push({
69
+ table: p[0]?.trim() ?? '',
70
+ deadTup: parseInt(p[1]?.trim() ?? '0', 10),
71
+ liveTup: parseInt(p[2]?.trim() ?? '0', 10),
72
+ ratio: parseFloat(p[3]?.trim() ?? '0'),
73
+ lastVacuum: p[4]?.trim() ?? 'never',
74
+ });
75
+ }
76
+ }
77
+ }
78
+ // Parse checkpoint stats
79
+ let checkpointsScheduled = 0;
80
+ let checkpointsRequested = 0;
81
+ let writeTimePct = null;
82
+ if (ckptRaw.status === 'fulfilled') {
83
+ const p = ckptRaw.value.split('|');
84
+ checkpointsScheduled = parseInt(p[0]?.trim() ?? '0', 10);
85
+ checkpointsRequested = parseInt(p[1]?.trim() ?? '0', 10);
86
+ writeTimePct = parseFloat(p[2]?.trim() ?? '0');
87
+ }
88
+ const totalSizeBytes = sizeRaw.status === 'fulfilled' ? parseInt(sizeRaw.value, 10) || 0 : 0;
89
+ const topTables = [];
90
+ if (tablesRaw.status === 'fulfilled') {
91
+ for (const line of tablesRaw.value.split('\n').filter(Boolean)) {
92
+ const p = line.split('|');
93
+ if (p.length >= 2) {
94
+ topTables.push({ table: p[0]?.trim() ?? '', size: p[1]?.trim() ?? '' });
95
+ }
96
+ }
97
+ }
98
+ return {
99
+ activeConns, idleConns, maxConns,
100
+ cacheHitPct,
101
+ sharedBuffers, workMem, maintenanceWorkMem,
102
+ autovacuumRows,
103
+ checkpointsScheduled, checkpointsRequested, writeTimePct,
104
+ totalSizeBytes, topTables,
105
+ };
106
+ }
107
+ function fmtBytes(bytes) {
108
+ if (bytes >= 1e12)
109
+ return `${(bytes / 1e12).toFixed(1)} TB`;
110
+ if (bytes >= 1e9)
111
+ return `${(bytes / 1e9).toFixed(1)} GB`;
112
+ if (bytes >= 1e6)
113
+ return `${(bytes / 1e6).toFixed(1)} MB`;
114
+ return `${bytes} B`;
115
+ }
116
+ /* ── Component ─────────────────────────────────────────────────────── */
117
+ export function DbHealthView({ onBack }) {
118
+ const [profileCursor, setProfileCursor] = useState(0);
119
+ const [applyStatus, setApplyStatus] = useState('idle');
120
+ const [applyError, setApplyError] = useState('');
121
+ // Read current profile from .env
122
+ const envKeys = readEnvKeys();
123
+ const currentProfile = (envKeys['PG_PROFILE'] ?? 'small');
124
+ const { data, error, isPolling } = usePolling(fetchDbHealth, 10_000, true);
125
+ // Keyboard
126
+ useInput((input, key) => {
127
+ if (input === 'q' || key.escape) {
128
+ if (onBack)
129
+ onBack();
130
+ return;
131
+ }
132
+ if (key.leftArrow) {
133
+ setProfileCursor(prev => Math.max(0, prev - 1));
134
+ setApplyStatus('idle');
135
+ }
136
+ else if (key.rightArrow) {
137
+ setProfileCursor(prev => Math.min(PROFILE_ORDER.length - 1, prev + 1));
138
+ setApplyStatus('idle');
139
+ }
140
+ else if (key.return && applyStatus !== 'saving') {
141
+ const selectedProfile = PROFILE_ORDER[profileCursor];
142
+ if (!selectedProfile)
143
+ return;
144
+ setApplyStatus('saving');
145
+ const profile = PROFILES[selectedProfile];
146
+ updateEnvKeys({
147
+ PG_PROFILE: selectedProfile,
148
+ PG_SHM_SIZE: profile.PG_SHM_SIZE,
149
+ PG_SHARED_BUFFERS: profile.PG_SHARED_BUFFERS,
150
+ PG_EFFECTIVE_CACHE_SIZE: profile.PG_EFFECTIVE_CACHE_SIZE,
151
+ PG_WORK_MEM: profile.PG_WORK_MEM,
152
+ PG_MAINTENANCE_WORK_MEM: profile.PG_MAINTENANCE_WORK_MEM,
153
+ }).then(() => {
154
+ setApplyStatus('saved');
155
+ }).catch((err) => {
156
+ setApplyStatus('error');
157
+ setApplyError(err.message);
158
+ });
159
+ }
160
+ });
161
+ const connTotal = (data?.activeConns ?? 0) + (data?.idleConns ?? 0);
162
+ const connPct = data ? Math.round(connTotal * 100 / data.maxConns) : 0;
163
+ const cacheOk = data?.cacheHitPct !== null && data?.cacheHitPct !== undefined && data.cacheHitPct >= 99;
164
+ const cacheWarn = data?.cacheHitPct !== null && data?.cacheHitPct !== undefined && data.cacheHitPct >= 95 && data.cacheHitPct < 99;
165
+ const reqPct = data
166
+ ? data.checkpointsScheduled + data.checkpointsRequested > 0
167
+ ? Math.round(data.checkpointsRequested * 100 / (data.checkpointsScheduled + data.checkpointsRequested))
168
+ : 0
169
+ : 0;
170
+ return (_jsxs(AppShell, { command: "ct db health", children: [_jsxs(Section, { title: "Memory Profile", children: [_jsxs(Box, { flexDirection: "row", marginBottom: 1, children: [PROFILE_ORDER.map((p, i) => {
171
+ const isCurrent = p === currentProfile;
172
+ const isFocused = i === profileCursor;
173
+ const label = p.charAt(0).toUpperCase() + p.slice(1);
174
+ return (_jsx(Box, { marginRight: 2, children: _jsx(Text, { color: isFocused ? 'cyan' : isCurrent ? 'green' : undefined, bold: isFocused || isCurrent, children: isFocused ? `[${label}]` : isCurrent ? `(${label})` : ` ${label} ` }) }, p));
175
+ }), applyStatus === 'saving' && _jsx(Text, { color: "yellow", children: " Saving..." }), applyStatus === 'saved' && _jsx(Text, { color: "yellow", children: " \u21BA Restart required: ct-cli restart" }), applyStatus === 'error' && _jsxs(Text, { color: "red", children: [" Error: ", applyError] })] }), _jsxs(Box, { flexDirection: "column", marginLeft: 2, children: [_jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { dimColor: true, children: 'shared_buffers: ' }), _jsx(Text, { children: data?.sharedBuffers ?? '...' }), _jsx(Text, { dimColor: true, children: ' (live)' })] }), _jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { dimColor: true, children: 'work_mem: ' }), _jsx(Text, { children: data?.workMem ?? '...' }), _jsx(Text, { dimColor: true, children: ' (live)' })] }), _jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { dimColor: true, children: 'maintenance_work_mem: ' }), _jsx(Text, { children: data?.maintenanceWorkMem ?? '...' }), _jsx(Text, { dimColor: true, children: ' (live)' })] }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { dimColor: true, children: "Profile set: " }), _jsx(Text, { color: "green", children: currentProfile }), _jsx(Text, { dimColor: true, children: ' — ' }), _jsx(Text, { dimColor: true, children: PROFILES[currentProfile]?.label ?? '' })] })] })] }), !data && !error && (_jsx(Section, { title: "Loading", children: _jsx(Spinner, { label: "Fetching database metrics..." }) })), error && (_jsx(Section, { title: "Error", children: _jsx(StatusLine, { status: "fail", label: `Failed to fetch metrics: ${error.message}` }) })), data && (_jsxs(_Fragment, { children: [_jsxs(Box, { flexDirection: "row", marginBottom: 0, children: [_jsx(Box, { flexDirection: "column", flexGrow: 1, children: _jsxs(Section, { title: "Connection Health", children: [_jsx(MeterBar, { label: "Conns", percent: connPct, detail: `${connTotal} / ${data.maxConns}`, thresholds: [50, 80] }), _jsxs(Box, { marginLeft: 2, marginTop: 1, flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: `Active: ${data.activeConns} Idle: ${data.idleConns}` }), _jsx(StatusLine, { status: connPct < 50 ? 'ok' : connPct < 80 ? 'warn' : 'fail', label: connPct < 50 ? 'healthy' : connPct < 80 ? 'elevated' : 'critical' })] })] }) }), _jsx(Box, { flexDirection: "column", flexGrow: 1, children: _jsx(Section, { title: "Cache Hit Rate", children: data.cacheHitPct !== null ? (_jsxs(_Fragment, { children: [_jsx(MeterBar, { label: "Cache", percent: data.cacheHitPct, detail: `${data.cacheHitPct}%`, thresholds: [95, 99] }), _jsx(Box, { marginLeft: 2, marginTop: 1, children: _jsx(StatusLine, { status: cacheOk ? 'ok' : cacheWarn ? 'warn' : 'fail', label: cacheOk ? '>= 99% healthy' : cacheWarn ? '95-99% consider larger shared_buffers' : '< 95% shared_buffers too small' }) })] })) : (_jsx(StatusLine, { status: "info", label: "No read activity yet" })) }) })] }), _jsx(Section, { title: "Autovacuum Health (tables with > 100 dead tuples)", children: data.autovacuumRows.length === 0 ? (_jsx(StatusLine, { status: "ok", label: "All tables clean" })) : (_jsxs(_Fragment, { children: [_jsx(Box, { flexDirection: "row", marginBottom: 0, children: _jsx(Text, { bold: true, dimColor: true, children: ' Table Dead Tup Ratio Last Vac' }) }), data.autovacuumRows.map((row, i) => {
176
+ const color = row.ratio > 20 ? 'red' : row.ratio > 10 ? 'yellow' : undefined;
177
+ return (_jsxs(Box, { flexDirection: "row", children: [_jsx(Text, { color: color, children: ' ' }), _jsx(Text, { color: color, children: row.table.padEnd(26) }), _jsx(Text, { color: color, children: String(row.deadTup).padStart(9) }), _jsx(Text, { color: color, children: ` ${row.ratio.toFixed(1)}%`.padEnd(9) }), _jsxs(Text, { dimColor: true, children: [" ", row.lastVacuum] })] }, i));
178
+ })] })) }), _jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { flexDirection: "column", flexGrow: 1, children: _jsx(Section, { title: "Checkpoint Stats", children: _jsxs(Box, { marginLeft: 2, flexDirection: "column", children: [_jsx(Text, { children: `Scheduled: ${data.checkpointsScheduled}` }), _jsx(Text, { children: `Requested: ${data.checkpointsRequested} (${reqPct}%)` }), data.writeTimePct !== null && (_jsx(Text, { children: `Write time: ${data.writeTimePct}%` })), _jsx(StatusLine, { status: reqPct < 5 ? 'ok' : reqPct < 20 ? 'warn' : 'fail', label: reqPct < 5 ? 'healthy' : reqPct < 20 ? 'elevated — check wal settings' : 'high — too many writes' })] }) }) }), _jsx(Box, { flexDirection: "column", flexGrow: 1, children: _jsx(Section, { title: `DB Size (${fmtBytes(data.totalSizeBytes)})`, children: data.topTables.map((t, i) => (_jsxs(Box, { marginLeft: 2, children: [_jsx(Text, { children: t.table.padEnd(24) }), _jsx(Text, { color: "cyan", children: t.size })] }, i))) }) })] })] })), _jsx(Box, { paddingLeft: 2, paddingTop: 1, children: _jsxs(Text, { dimColor: true, children: ['\u2190\u2192 Select profile Enter Apply q Back', isPolling ? ' \u21bb auto-refresh 10s' : ''] }) })] }));
179
+ }
180
+ //# sourceMappingURL=DbHealthView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DbHealthView.js","sourceRoot":"","sources":["../../../src/ui/views/DbHealthView.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAe,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAU/C,MAAM,QAAQ,GAOT;IACH,KAAK,EAAG,EAAE,WAAW,EAAE,KAAK,EAAG,iBAAiB,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAG,uBAAuB,EAAE,OAAO,EAAG,KAAK,EAAE,mCAAmC,EAAG;IACnM,MAAM,EAAE,EAAE,WAAW,EAAE,KAAK,EAAG,iBAAiB,EAAE,KAAK,EAAI,uBAAuB,EAAE,KAAK,EAAK,WAAW,EAAE,MAAM,EAAE,uBAAuB,EAAE,OAAO,EAAG,KAAK,EAAE,oCAAoC,EAAE;IACnM,KAAK,EAAG,EAAE,WAAW,EAAE,KAAK,EAAG,iBAAiB,EAAE,KAAK,EAAI,uBAAuB,EAAE,MAAM,EAAI,WAAW,EAAE,MAAM,EAAE,uBAAuB,EAAE,OAAO,EAAG,KAAK,EAAE,kCAAkC,EAAI;CACpM,CAAC;AAEF,MAAM,aAAa,GAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAgClE,0EAA0E;AAE1E,KAAK,UAAU,IAAI,CAAC,GAAW;IAC7B,MAAM,MAAM,GAAG,MAAM,WAAW,CAC9B,IAAI,EACJ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,EAC7D,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAC5B,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,CACJ,OAAO,EACP,UAAU,EACV,QAAQ,EACR,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAAK,EACL,OAAO,EACP,OAAO,EACP,SAAS,EACV,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QAC3B,wBAAwB;QACxB,IAAI,CAAC,6DAA6D,CAAC;QACnE,qBAAqB;QACrB,IAAI,CAAC,sBAAsB,CAAC;QAC5B,2BAA2B;QAC3B,IAAI,CAAC,0IAA0I,CAAC;QAChJ,+BAA+B;QAC/B,IAAI,CAAC,qBAAqB,CAAC;QAC3B,yBAAyB;QACzB,IAAI,CAAC,eAAe,CAAC;QACrB,qCAAqC;QACrC,IAAI,CAAC,2BAA2B,CAAC;QACjC,4CAA4C;QAC5C,IAAI,CAAC,mWAAmW,CAAC;QACzW,sBAAsB;QACtB,IAAI,CAAC,yMAAyM,CAAC;QAC/M,4BAA4B;QAC5B,IAAI,CAAC,6CAA6C,CAAC;QACnD,0BAA0B;QAC1B,IAAI,CAAC,0KAA0K,CAAC;KACjL,CAAC,CAAC;IAEH,0BAA0B;IAC1B,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;YACpD,IAAI,KAAK,KAAK,QAAQ;gBAAE,WAAW,GAAG,KAAK,CAAC;iBACvC,IAAI,KAAK,KAAK,MAAM;gBAAE,SAAS,GAAG,KAAK,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACjG,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,KAAK,WAAW,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1G,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IACvE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IACjE,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IAE9E,wBAAwB;IACxB,MAAM,cAAc,GAAmC,EAAE,CAAC;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAClB,cAAc,CAAC,IAAI,CAAC;oBAClB,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;oBACzB,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;oBAC1C,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;oBAC1C,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC;oBACtC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO;iBACpC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,oBAAoB,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QACzD,oBAAoB,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QACzD,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7F,MAAM,SAAS,GAA8B,EAAE,CAAC;IAChD,IAAI,SAAS,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAClB,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW,EAAE,SAAS,EAAE,QAAQ;QAChC,WAAW;QACX,aAAa,EAAE,OAAO,EAAE,kBAAkB;QAC1C,cAAc;QACd,oBAAoB,EAAE,oBAAoB,EAAE,YAAY;QACxD,cAAc,EAAE,SAAS;KAC1B,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5D,IAAI,KAAK,IAAI,GAAG;QAAG,OAAO,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3D,IAAI,KAAK,IAAI,GAAG;QAAG,OAAO,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3D,OAAO,GAAG,KAAK,IAAI,CAAC;AACtB,CAAC;AAED,0EAA0E;AAE1E,MAAM,UAAU,YAAY,CAAC,EAAE,MAAM,EAAqB;IACxD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAwC,MAAM,CAAC,CAAC;IAC9F,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEjD,iCAAiC;IACjC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO,CAAgB,CAAC;IAEzE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAE3E,WAAW;IACX,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,MAAM;gBAAE,MAAM,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YAChD,cAAc,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YAC1B,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YACvE,cAAc,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,GAAG,CAAC,MAAM,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;YAClD,MAAM,eAAe,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;YACrD,IAAI,CAAC,eAAe;gBAAE,OAAO;YAC7B,cAAc,CAAC,QAAQ,CAAC,CAAC;YACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;YAC1C,aAAa,CAAC;gBACZ,UAAU,EAAE,eAAe;gBAC3B,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;gBAC5C,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;gBACxD,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,uBAAuB,EAAE,OAAO,CAAC,uBAAuB;aACzD,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBACX,cAAc,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;gBACtB,cAAc,CAAC,OAAO,CAAC,CAAC;gBACxB,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,IAAI,EAAE,WAAW,KAAK,IAAI,IAAI,IAAI,EAAE,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;IACxG,MAAM,SAAS,GAAG,IAAI,EAAE,WAAW,KAAK,IAAI,IAAI,IAAI,EAAE,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,IAAI,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IAEnI,MAAM,MAAM,GAAG,IAAI;QACjB,CAAC,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,GAAG,CAAC;YACzD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACvG,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC,CAAC;IAEN,OAAO,CACL,MAAC,QAAQ,IAAC,OAAO,EAAC,cAAc,aAE9B,MAAC,OAAO,IAAC,KAAK,EAAC,gBAAgB,aAC7B,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,YAAY,EAAE,CAAC,aACrC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gCAC1B,MAAM,SAAS,GAAG,CAAC,KAAK,cAAc,CAAC;gCACvC,MAAM,SAAS,GAAG,CAAC,KAAK,aAAa,CAAC;gCACtC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gCACrD,OAAO,CACL,KAAC,GAAG,IAAS,WAAW,EAAE,CAAC,YACzB,KAAC,IAAI,IACH,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAC3D,IAAI,EAAE,SAAS,IAAI,SAAS,YAE3B,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,GAC9D,IANC,CAAC,CAOL,CACP,CAAC;4BACJ,CAAC,CAAC,EACD,WAAW,KAAK,QAAQ,IAAI,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,4BAAmB,EACnE,WAAW,KAAK,OAAO,IAAI,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,0DAA4C,EAC3F,WAAW,KAAK,OAAO,IAAI,MAAC,IAAI,IAAC,KAAK,EAAC,KAAK,0BAAW,UAAU,IAAQ,IACtE,EACN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,aACvC,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACtB,KAAC,IAAI,IAAC,QAAQ,kBAAE,yBAAyB,GAAQ,EACjD,KAAC,IAAI,cAAE,IAAI,EAAE,aAAa,IAAI,KAAK,GAAQ,EAC3C,KAAC,IAAI,IAAC,QAAQ,kBAAE,UAAU,GAAQ,IAC9B,EACN,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACtB,KAAC,IAAI,IAAC,QAAQ,kBAAE,yBAAyB,GAAQ,EACjD,KAAC,IAAI,cAAE,IAAI,EAAE,OAAO,IAAI,KAAK,GAAQ,EACrC,KAAC,IAAI,IAAC,QAAQ,kBAAE,UAAU,GAAQ,IAC9B,EACN,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACtB,KAAC,IAAI,IAAC,QAAQ,kBAAE,yBAAyB,GAAQ,EACjD,KAAC,IAAI,cAAE,IAAI,EAAE,kBAAkB,IAAI,KAAK,GAAQ,EAChD,KAAC,IAAI,IAAC,QAAQ,kBAAE,UAAU,GAAQ,IAC9B,EACN,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,aACf,KAAC,IAAI,IAAC,QAAQ,oCAAqB,EACnC,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,cAAc,GAAQ,EAC3C,KAAC,IAAI,IAAC,QAAQ,kBAAE,OAAO,GAAQ,EAC/B,KAAC,IAAI,IAAC,QAAQ,kBAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,EAAE,GAAQ,IACzD,IACF,IACE,EAET,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAClB,KAAC,OAAO,IAAC,KAAK,EAAC,SAAS,YACtB,KAAC,OAAO,IAAC,KAAK,EAAC,8BAA8B,GAAG,GACxC,CACX,EAEA,KAAK,IAAI,CACR,KAAC,OAAO,IAAC,KAAK,EAAC,OAAO,YACpB,KAAC,UAAU,IAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAE,4BAA4B,KAAK,CAAC,OAAO,EAAE,GAAI,GACxE,CACX,EAEA,IAAI,IAAI,CACP,8BAEE,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,YAAY,EAAE,CAAC,aACtC,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,YACrC,MAAC,OAAO,IAAC,KAAK,EAAC,mBAAmB,aAChC,KAAC,QAAQ,IACP,KAAK,EAAC,OAAO,EACb,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,GAAG,SAAS,MAAM,IAAI,CAAC,QAAQ,EAAE,EACzC,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GACpB,EACF,MAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACtD,KAAC,IAAI,IAAC,QAAQ,kBAAE,WAAW,IAAI,CAAC,WAAW,YAAY,IAAI,CAAC,SAAS,EAAE,GAAQ,EAC/E,KAAC,UAAU,IACT,MAAM,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAC5D,KAAK,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,GACxE,IACE,IACE,GACN,EACN,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,YACrC,KAAC,OAAO,IAAC,KAAK,EAAC,gBAAgB,YAC5B,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,CAC3B,8BACE,KAAC,QAAQ,IACP,KAAK,EAAC,OAAO,EACb,OAAO,EAAE,IAAI,CAAC,WAAW,EACzB,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,EAC9B,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GACpB,EACF,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,YAC9B,KAAC,UAAU,IACT,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACpD,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,iCAAiC,GAC7H,GACE,IACL,CACJ,CAAC,CAAC,CAAC,CACF,KAAC,UAAU,IAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAC,sBAAsB,GAAG,CAC1D,GACO,GACN,IACF,EAGN,KAAC,OAAO,IAAC,KAAK,EAAC,mDAAmD,YAC/D,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAClC,KAAC,UAAU,IAAC,MAAM,EAAC,IAAI,EAAC,KAAK,EAAC,kBAAkB,GAAG,CACpD,CAAC,CAAC,CAAC,CACF,8BACE,KAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,YAAY,EAAE,CAAC,YACtC,KAAC,IAAI,IAAC,IAAI,QAAC,QAAQ,kBAAE,yDAAyD,GAAQ,GAClF,EACL,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;oCAClC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;oCAC7E,OAAO,CACL,MAAC,GAAG,IAAS,aAAa,EAAC,KAAK,aAC9B,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,IAAI,GAAQ,EACjC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EACjD,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAQ,EAC5D,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAQ,EACpE,MAAC,IAAI,IAAC,QAAQ,yBAAI,GAAG,CAAC,UAAU,IAAQ,KALhC,CAAC,CAML,CACP,CAAC;gCACJ,CAAC,CAAC,IACD,CACJ,GACO,EAGV,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACtB,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,YACrC,KAAC,OAAO,IAAC,KAAK,EAAC,kBAAkB,YAC/B,MAAC,GAAG,IAAC,UAAU,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACxC,KAAC,IAAI,cAAE,eAAe,IAAI,CAAC,oBAAoB,EAAE,GAAQ,EACzD,KAAC,IAAI,cAAE,eAAe,IAAI,CAAC,oBAAoB,MAAM,MAAM,IAAI,GAAQ,EACtE,IAAI,CAAC,YAAY,KAAK,IAAI,IAAI,CAC7B,KAAC,IAAI,cAAE,eAAe,IAAI,CAAC,YAAY,GAAG,GAAQ,CACnD,EACD,KAAC,UAAU,IACT,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACzD,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,wBAAwB,GACxG,IACE,GACE,GACN,EACN,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,YACrC,KAAC,OAAO,IAAC,KAAK,EAAE,aAAa,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,YAC1D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC5B,MAAC,GAAG,IAAS,UAAU,EAAE,CAAC,aACxB,KAAC,IAAI,cAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAQ,EACjC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,CAAC,CAAC,IAAI,GAAQ,KAF1B,CAAC,CAGL,CACP,CAAC,GACM,GACN,IACF,IACL,CACJ,EAGD,KAAC,GAAG,IAAC,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,YAChC,MAAC,IAAI,IAAC,QAAQ,mBACX,oDAAoD,EACpD,SAAS,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,IACzC,GACH,IACG,CACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { DeploymentBackend } from '../../lib/backend.js';
2
+ interface K8sDeployViewProps {
3
+ backend: DeploymentBackend;
4
+ onBack?: () => void;
5
+ }
6
+ export declare function K8sDeployView({ backend, onBack }: K8sDeployViewProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=K8sDeployView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"K8sDeployView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/K8sDeployView.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAe,MAAM,sBAAsB,CAAC;AAE3E,UAAU,kBAAkB;IAC1B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAID,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,kBAAkB,2CA+JpE"}
@@ -0,0 +1,81 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useCallback } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { AppShell, Section, Spinner } from '../components/index.js';
5
+ import { useAsyncTask } from '../hooks/index.js';
6
+ import { getPrefs } from '../../lib/prefs.js';
7
+ import { resolveHelmfilePath, helmfileSync, helmfileDiff, helmfileDestroy, } from '../../lib/helmfile.js';
8
+ export function K8sDeployView({ backend, onBack }) {
9
+ const [phase, setPhase] = useState('list');
10
+ const [cursor, setCursor] = useState(0);
11
+ const [actionLabel, setActionLabel] = useState('');
12
+ const [actionOutput, setActionOutput] = useState('');
13
+ const [actionError, setActionError] = useState(null);
14
+ const releasesTask = useAsyncTask(() => backend.getHelmReleases());
15
+ const prefs = getPrefs();
16
+ const helmfileOpts = {
17
+ helmfilePath: resolveHelmfilePath(),
18
+ environment: prefs.k8sEnvironment,
19
+ };
20
+ const runAction = useCallback(async (label, fn) => {
21
+ setPhase('action');
22
+ setActionLabel(label);
23
+ setActionOutput('');
24
+ setActionError(null);
25
+ try {
26
+ const result = await fn();
27
+ setActionOutput(result ?? 'Done');
28
+ }
29
+ catch (err) {
30
+ setActionError(err.message);
31
+ }
32
+ setPhase('list');
33
+ // Refresh releases
34
+ releasesTask.run();
35
+ }, [releasesTask]);
36
+ useInput((input, key) => {
37
+ if (phase === 'confirm-destroy') {
38
+ if (input === 'y' || input === 'Y') {
39
+ runAction('Destroying releases...', () => helmfileDestroy(helmfileOpts).then(() => 'Destroyed'));
40
+ }
41
+ else {
42
+ setPhase('list');
43
+ }
44
+ return;
45
+ }
46
+ if (phase !== 'list')
47
+ return;
48
+ const releases = releasesTask.data ?? [];
49
+ if (key.upArrow) {
50
+ setCursor(prev => (prev > 0 ? prev - 1 : Math.max(0, releases.length - 1)));
51
+ }
52
+ else if (key.downArrow) {
53
+ setCursor(prev => (prev < releases.length - 1 ? prev + 1 : 0));
54
+ }
55
+ else if (input === 's') {
56
+ runAction('Syncing (deploy/upgrade)...', () => helmfileSync(helmfileOpts).then(() => 'Sync complete'));
57
+ }
58
+ else if (input === 'd') {
59
+ runAction('Computing diff...', () => helmfileDiff(helmfileOpts));
60
+ }
61
+ else if (input === 'x') {
62
+ setPhase('confirm-destroy');
63
+ }
64
+ else if (input === 'q' || key.escape || key.leftArrow) {
65
+ onBack?.();
66
+ }
67
+ });
68
+ if (phase === 'action') {
69
+ return (_jsx(AppShell, { command: "ct k8s deploy", children: _jsx(Section, { title: "Kubernetes Deployment", children: _jsx(Spinner, { label: actionLabel }) }) }));
70
+ }
71
+ if (phase === 'confirm-destroy') {
72
+ return (_jsx(AppShell, { command: "ct k8s deploy", children: _jsx(Section, { title: "Confirm Destroy", children: _jsxs(Box, { paddingLeft: 2, flexDirection: "column", children: [_jsx(Text, { color: "red", bold: true, children: "This will destroy all Helm releases in the namespace." }), _jsx(Text, { children: "Are you sure? (y/N)" })] }) }) }));
73
+ }
74
+ const releases = releasesTask.data ?? [];
75
+ return (_jsxs(AppShell, { command: "ct k8s deploy", children: [_jsxs(Section, { title: "Kubernetes Deployment", children: [_jsxs(Box, { paddingLeft: 2, marginBottom: 1, children: [_jsx(Text, { dimColor: true, children: "Environment: " }), _jsx(Text, { bold: true, children: prefs.k8sEnvironment }), _jsx(Text, { dimColor: true, children: " Helmfile: " }), _jsx(Text, { children: helmfileOpts.helmfilePath.split('/').slice(-2).join('/') })] }), releasesTask.status === 'pending' && _jsx(Spinner, { label: "Loading Helm releases..." }), actionError && (_jsx(Box, { paddingLeft: 2, marginBottom: 1, children: _jsxs(Text, { color: "red", children: ["Error: ", actionError] }) })), actionOutput && !actionError && (_jsx(Box, { paddingLeft: 2, marginBottom: 1, children: _jsx(Text, { color: "green", children: actionOutput }) })), releases.length > 0 && (_jsxs(_Fragment, { children: [_jsxs(Box, { paddingLeft: 2, children: [_jsx(Text, { dimColor: true, bold: true, children: ' '.padEnd(3) }), _jsx(Text, { dimColor: true, bold: true, children: 'Release'.padEnd(18) }), _jsx(Text, { dimColor: true, bold: true, children: 'Status'.padEnd(12) }), _jsx(Text, { dimColor: true, bold: true, children: 'Chart'.padEnd(20) }), _jsx(Text, { dimColor: true, bold: true, children: 'Version' })] }), releases.map((r, i) => {
76
+ const isActive = i === cursor;
77
+ const statusColor = r.status === 'deployed' ? 'green' : r.status === 'failed' ? 'red' : 'yellow';
78
+ return (_jsxs(Box, { paddingLeft: 2, children: [_jsx(Text, { color: isActive ? 'cyan' : statusColor, children: isActive ? ' \u276F ' : ' \u25CF ' }), _jsx(Text, { color: isActive ? 'cyan' : undefined, bold: isActive, children: r.name.padEnd(18) }), _jsx(Text, { color: statusColor, children: r.status.padEnd(12) }), _jsx(Text, { dimColor: !isActive, children: r.chart.padEnd(20) }), _jsx(Text, { dimColor: !isActive, children: r.appVersion })] }, r.name));
79
+ })] })), releasesTask.status === 'done' && releases.length === 0 && (_jsx(Box, { paddingLeft: 2, children: _jsx(Text, { dimColor: true, children: "No Helm releases found." }) }))] }), _jsx(Box, { paddingLeft: 2, paddingTop: 1, children: _jsx(Text, { dimColor: true, children: 's Sync d Diff x Destroy q Back' }) })] }));
80
+ }
81
+ //# sourceMappingURL=K8sDeployView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"K8sDeployView.js","sourceRoot":"","sources":["../../../src/ui/views/K8sDeployView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { DeploymentBackend } from '../../lib/backend.js';
2
+ interface K8sRunbookViewProps {
3
+ backend: DeploymentBackend;
4
+ onBack?: () => void;
5
+ }
6
+ export declare function K8sRunbookView({ backend, onBack }: K8sRunbookViewProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=K8sRunbookView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"K8sRunbookView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/K8sRunbookView.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,UAAU,mBAAmB;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AA6ID,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,mBAAmB,2CA0CtE"}
@@ -0,0 +1,181 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import { AppShell, Section, StepList } from '../components/index.js';
5
+ import { useStepRunner } from '../hooks/index.js';
6
+ function buildRunbookSteps(backend) {
7
+ return [
8
+ {
9
+ label: 'Node health',
10
+ run: async (ctx) => {
11
+ const nodes = await backend.getNodes();
12
+ const ready = nodes.filter(n => n.status === 'Ready').length;
13
+ ctx?.log(`${ready}/${nodes.length} nodes ready`);
14
+ if (ready < nodes.length)
15
+ throw new Error(`${nodes.length - ready} node(s) not ready`);
16
+ return `${ready}/${nodes.length} Ready`;
17
+ },
18
+ },
19
+ {
20
+ label: 'CNPG cluster',
21
+ run: async (ctx) => {
22
+ const status = await backend.getCnpgClusterStatus();
23
+ ctx?.log(`Phase: ${status.phase}, Instances: ${status.readyInstances}/${status.instances}`);
24
+ if (status.phase !== 'Healthy')
25
+ throw new Error(`CNPG phase: ${status.phase}`);
26
+ if (status.readyInstances < status.instances)
27
+ throw new Error(`Only ${status.readyInstances}/${status.instances} instances ready`);
28
+ return `${status.phase} (${status.readyInstances}/${status.instances})`;
29
+ },
30
+ },
31
+ {
32
+ label: 'WAL archiving',
33
+ run: async (ctx) => {
34
+ const status = await backend.getCnpgClusterStatus();
35
+ const wal = status.walArchiving ?? 'Unknown';
36
+ ctx?.log(`WAL archiving: ${wal}`);
37
+ if (wal !== 'OK')
38
+ throw new Error(`WAL archiving: ${wal}`);
39
+ return wal;
40
+ },
41
+ },
42
+ {
43
+ label: 'Last backup',
44
+ run: async (ctx) => {
45
+ const status = await backend.getCnpgClusterStatus();
46
+ if (!status.lastBackup) {
47
+ ctx?.log('No backup found');
48
+ throw new Error('No backup recorded');
49
+ }
50
+ const hoursAgo = Math.floor((Date.now() - new Date(status.lastBackup).getTime()) / 3600000);
51
+ ctx?.log(`Last backup: ${hoursAgo}h ago (${status.lastBackup})`);
52
+ if (hoursAgo > 24)
53
+ throw new Error(`Last backup was ${hoursAgo}h ago (>24h)`);
54
+ return `${hoursAgo}h ago`;
55
+ },
56
+ },
57
+ {
58
+ label: 'Helm releases',
59
+ run: async (ctx) => {
60
+ const releases = await backend.getHelmReleases();
61
+ const deployed = releases.filter(r => r.status === 'deployed').length;
62
+ const failed = releases.filter(r => r.status === 'failed');
63
+ ctx?.log(`${deployed} deployed, ${failed.length} failed`);
64
+ for (const r of releases)
65
+ ctx?.log(` ${r.name}: ${r.status} (${r.chart})`);
66
+ if (failed.length > 0)
67
+ throw new Error(`${failed.length} release(s) failed: ${failed.map(r => r.name).join(', ')}`);
68
+ return `${deployed} deployed`;
69
+ },
70
+ },
71
+ {
72
+ label: 'Pod health',
73
+ run: async (ctx) => {
74
+ const pods = await backend.listServices();
75
+ const running = pods.filter(p => p.status === 'Running').length;
76
+ const crashloop = pods.filter(p => p.status === 'CrashLoopBackOff');
77
+ ctx?.log(`${running}/${pods.length} running`);
78
+ if (crashloop.length > 0) {
79
+ for (const p of crashloop)
80
+ ctx?.log(` CrashLoopBackOff: ${p.name}`);
81
+ throw new Error(`${crashloop.length} pod(s) in CrashLoopBackOff`);
82
+ }
83
+ if (running < pods.length)
84
+ throw new Error(`Only ${running}/${pods.length} pods running`);
85
+ return `${running}/${pods.length} Running`;
86
+ },
87
+ },
88
+ {
89
+ label: 'API health',
90
+ run: async (ctx) => {
91
+ const health = await backend.getHealth();
92
+ ctx?.log(`API: ${health.api ? 'ok' : 'fail'}`);
93
+ if (!health.api)
94
+ throw new Error(health.errors['api'] || 'API not responding');
95
+ return 'responding';
96
+ },
97
+ },
98
+ {
99
+ label: 'CURRI health',
100
+ run: async (ctx) => {
101
+ const health = await backend.getHealth();
102
+ ctx?.log(`CURRI: ${health.curri ? 'ok' : 'fail'}`);
103
+ if (!health.curri)
104
+ throw new Error(health.errors['curri'] || 'CURRI not responding');
105
+ return 'responding';
106
+ },
107
+ },
108
+ {
109
+ label: 'DB pool',
110
+ run: async (ctx) => {
111
+ const health = await backend.getHealth();
112
+ ctx?.log(`DB pool: ${health.dbConnected ? 'ok' : 'fail'}`);
113
+ if (!health.dbConnected)
114
+ throw new Error(health.errors['db'] || 'DB pool not connected');
115
+ return 'connected';
116
+ },
117
+ },
118
+ {
119
+ label: 'SFTP daemon',
120
+ run: async (ctx) => {
121
+ const health = await backend.getHealth();
122
+ ctx?.log(`SFTP: ${health.sftp ? 'ok' : 'fail'}`);
123
+ if (!health.sftp)
124
+ throw new Error(health.errors['sftp'] || 'SFTP not running');
125
+ return 'listening';
126
+ },
127
+ },
128
+ {
129
+ label: 'Ingress endpoints',
130
+ run: async (ctx) => {
131
+ const health = await backend.getHealth();
132
+ ctx?.log(`Admin HTTPS: ${health.adminProxy ? 'ok' : 'fail'}`);
133
+ ctx?.log(`CURRI HTTP: ${health.curriProxy ? 'ok' : 'fail'}`);
134
+ if (!health.adminProxy || !health.curriProxy) {
135
+ const failed = [];
136
+ if (!health.adminProxy)
137
+ failed.push('HTTPS/443');
138
+ if (!health.curriProxy)
139
+ failed.push('HTTP/80');
140
+ throw new Error(`Ingress down: ${failed.join(', ')}`);
141
+ }
142
+ return 'ports 80/443 ok';
143
+ },
144
+ },
145
+ {
146
+ label: 'Storage (PVCs)',
147
+ run: async (ctx) => {
148
+ const pvcs = await backend.getPVCs();
149
+ const bound = pvcs.filter(p => p.status === 'Bound').length;
150
+ ctx?.log(`${bound}/${pvcs.length} PVCs bound`);
151
+ for (const p of pvcs)
152
+ ctx?.log(` ${p.name}: ${p.status} (${p.size})`);
153
+ const unbound = pvcs.filter(p => p.status !== 'Bound');
154
+ if (unbound.length > 0)
155
+ throw new Error(`${unbound.length} PVC(s) not bound: ${unbound.map(p => p.name).join(', ')}`);
156
+ return `${bound}/${pvcs.length} Bound`;
157
+ },
158
+ },
159
+ ];
160
+ }
161
+ export function K8sRunbookView({ backend, onBack }) {
162
+ const steps = useMemo(() => buildRunbookSteps(backend), [backend]);
163
+ const { states, isDone, isRunning, run } = useStepRunner(steps);
164
+ useEffect(() => {
165
+ run();
166
+ }, [run]);
167
+ useInput((input, key) => {
168
+ if (input === 'q' || key.escape || key.leftArrow) {
169
+ onBack?.();
170
+ }
171
+ if (input === 'r' && !isRunning) {
172
+ run();
173
+ }
174
+ });
175
+ const passed = states.filter(s => s.status === 'done').length;
176
+ const failed = states.filter(s => s.status === 'error').length;
177
+ const running = states.filter(s => s.status === 'running').length;
178
+ const pending = states.filter(s => s.status === 'pending').length;
179
+ return (_jsxs(AppShell, { command: "ct k8s runbook", onBack: onBack, isComplete: isDone, children: [_jsxs(Section, { title: "Deployment Runbook", children: [_jsx(StepList, { steps: states }), _jsx(Box, { paddingLeft: 2, paddingTop: 1, children: _jsxs(Text, { children: ["Result: ", _jsxs(Text, { color: "green", children: [passed, " passed"] }), failed > 0 && _jsxs(Text, { color: "red", children: [", ", failed, " failed"] }), running > 0 && _jsxs(Text, { color: "yellow", children: [", ", running, " running"] }), pending > 0 && _jsxs(Text, { dimColor: true, children: [", ", pending, " pending"] })] }) })] }), _jsx(Box, { paddingLeft: 2, paddingTop: 1, children: _jsx(Text, { dimColor: true, children: 'r Re-run q Back' }) })] }));
180
+ }
181
+ //# sourceMappingURL=K8sRunbookView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"K8sRunbookView.js","sourceRoot":"","sources":["../../../src/ui/views/K8sRunbookView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { DeploymentBackend } from '../../lib/backend.js';
2
+ interface K8sServicesViewProps {
3
+ backend: DeploymentBackend;
4
+ onBack?: () => void;
5
+ }
6
+ export declare function K8sServicesView({ backend, onBack }: K8sServicesViewProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=K8sServicesView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"K8sServicesView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/K8sServicesView.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAe,MAAM,sBAAsB,CAAC;AAE3E,UAAU,oBAAoB;IAC5B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAID,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,oBAAoB,2CAoKxE"}