@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.
- package/dist/commands/diag.d.ts.map +1 -1
- package/dist/commands/diag.js +29 -0
- package/dist/commands/diag.js.map +1 -1
- package/dist/commands/k8s.d.ts +3 -0
- package/dist/commands/k8s.d.ts.map +1 -0
- package/dist/commands/k8s.js +192 -0
- package/dist/commands/k8s.js.map +1 -0
- package/dist/commands/network.d.ts +3 -0
- package/dist/commands/network.d.ts.map +1 -0
- package/dist/commands/network.js +120 -0
- package/dist/commands/network.js.map +1 -0
- package/dist/commands/shell.d.ts +3 -0
- package/dist/commands/shell.d.ts.map +1 -0
- package/dist/commands/shell.js +10 -0
- package/dist/commands/shell.js.map +1 -0
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/backend.d.ts +85 -0
- package/dist/lib/backend.d.ts.map +1 -0
- package/dist/lib/backend.js +6 -0
- package/dist/lib/backend.js.map +1 -0
- package/dist/lib/bundle.d.ts.map +1 -1
- package/dist/lib/bundle.js +3 -0
- package/dist/lib/bundle.js.map +1 -1
- package/dist/lib/compose-backend.d.ts +19 -0
- package/dist/lib/compose-backend.d.ts.map +1 -0
- package/dist/lib/compose-backend.js +78 -0
- package/dist/lib/compose-backend.js.map +1 -0
- package/dist/lib/deployment.d.ts +6 -0
- package/dist/lib/deployment.d.ts.map +1 -0
- package/dist/lib/deployment.js +51 -0
- package/dist/lib/deployment.js.map +1 -0
- package/dist/lib/doctor.d.ts +13 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/doctor.js +82 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/helmfile.d.ts +14 -0
- package/dist/lib/helmfile.d.ts.map +1 -0
- package/dist/lib/helmfile.js +78 -0
- package/dist/lib/helmfile.js.map +1 -0
- package/dist/lib/k8s-backend.d.ts +36 -0
- package/dist/lib/k8s-backend.d.ts.map +1 -0
- package/dist/lib/k8s-backend.js +301 -0
- package/dist/lib/k8s-backend.js.map +1 -0
- package/dist/lib/k8s-client.d.ts +14 -0
- package/dist/lib/k8s-client.d.ts.map +1 -0
- package/dist/lib/k8s-client.js +42 -0
- package/dist/lib/k8s-client.js.map +1 -0
- package/dist/lib/metadata-artifacts.d.ts +2 -0
- package/dist/lib/metadata-artifacts.d.ts.map +1 -0
- package/dist/lib/metadata-artifacts.js +36 -0
- package/dist/lib/metadata-artifacts.js.map +1 -0
- package/dist/lib/offline-steps.d.ts.map +1 -1
- package/dist/lib/offline-steps.js +3 -0
- package/dist/lib/offline-steps.js.map +1 -1
- package/dist/lib/prefs.d.ts +3 -0
- package/dist/lib/prefs.d.ts.map +1 -1
- package/dist/lib/prefs.js +9 -1
- package/dist/lib/prefs.js.map +1 -1
- package/dist/shell/commands/config.d.ts +11 -0
- package/dist/shell/commands/config.d.ts.map +1 -0
- package/dist/shell/commands/config.js +193 -0
- package/dist/shell/commands/config.js.map +1 -0
- package/dist/shell/commands/connect.d.ts +18 -0
- package/dist/shell/commands/connect.d.ts.map +1 -0
- package/dist/shell/commands/connect.js +99 -0
- package/dist/shell/commands/connect.js.map +1 -0
- package/dist/shell/commands/db.d.ts +11 -0
- package/dist/shell/commands/db.d.ts.map +1 -0
- package/dist/shell/commands/db.js +237 -0
- package/dist/shell/commands/db.js.map +1 -0
- package/dist/shell/commands/debug.d.ts +15 -0
- package/dist/shell/commands/debug.d.ts.map +1 -0
- package/dist/shell/commands/debug.js +310 -0
- package/dist/shell/commands/debug.js.map +1 -0
- package/dist/shell/commands/diag.d.ts +16 -0
- package/dist/shell/commands/diag.d.ts.map +1 -0
- package/dist/shell/commands/diag.js +555 -0
- package/dist/shell/commands/diag.js.map +1 -0
- package/dist/shell/commands/registry.d.ts +7 -0
- package/dist/shell/commands/registry.d.ts.map +1 -0
- package/dist/shell/commands/registry.js +391 -0
- package/dist/shell/commands/registry.js.map +1 -0
- package/dist/shell/commands/secrets.d.ts +18 -0
- package/dist/shell/commands/secrets.d.ts.map +1 -0
- package/dist/shell/commands/secrets.js +100 -0
- package/dist/shell/commands/secrets.js.map +1 -0
- package/dist/shell/commands/services.d.ts +7 -0
- package/dist/shell/commands/services.d.ts.map +1 -0
- package/dist/shell/commands/services.js +115 -0
- package/dist/shell/commands/services.js.map +1 -0
- package/dist/shell/commands/show.d.ts +26 -0
- package/dist/shell/commands/show.d.ts.map +1 -0
- package/dist/shell/commands/show.js +897 -0
- package/dist/shell/commands/show.js.map +1 -0
- package/dist/shell/commands/system.d.ts +13 -0
- package/dist/shell/commands/system.d.ts.map +1 -0
- package/dist/shell/commands/system.js +270 -0
- package/dist/shell/commands/system.js.map +1 -0
- package/dist/shell/commands/test.d.ts +12 -0
- package/dist/shell/commands/test.d.ts.map +1 -0
- package/dist/shell/commands/test.js +197 -0
- package/dist/shell/commands/test.js.map +1 -0
- package/dist/shell/commands/users.d.ts +14 -0
- package/dist/shell/commands/users.d.ts.map +1 -0
- package/dist/shell/commands/users.js +86 -0
- package/dist/shell/commands/users.js.map +1 -0
- package/dist/shell/completer.d.ts +16 -0
- package/dist/shell/completer.d.ts.map +1 -0
- package/dist/shell/completer.js +124 -0
- package/dist/shell/completer.js.map +1 -0
- package/dist/shell/context.d.ts +12 -0
- package/dist/shell/context.d.ts.map +1 -0
- package/dist/shell/context.js +2 -0
- package/dist/shell/context.js.map +1 -0
- package/dist/shell/footer.d.ts +8 -0
- package/dist/shell/footer.d.ts.map +1 -0
- package/dist/shell/footer.js +47 -0
- package/dist/shell/footer.js.map +1 -0
- package/dist/shell/formatter.d.ts +47 -0
- package/dist/shell/formatter.d.ts.map +1 -0
- package/dist/shell/formatter.js +135 -0
- package/dist/shell/formatter.js.map +1 -0
- package/dist/shell/mcp-bridge.d.ts +13 -0
- package/dist/shell/mcp-bridge.d.ts.map +1 -0
- package/dist/shell/mcp-bridge.js +23 -0
- package/dist/shell/mcp-bridge.js.map +1 -0
- package/dist/shell/parser.d.ts +33 -0
- package/dist/shell/parser.d.ts.map +1 -0
- package/dist/shell/parser.js +100 -0
- package/dist/shell/parser.js.map +1 -0
- package/dist/shell/repl.d.ts +5 -0
- package/dist/shell/repl.d.ts.map +1 -0
- package/dist/shell/repl.js +251 -0
- package/dist/shell/repl.js.map +1 -0
- package/dist/shell/sparkline.d.ts +16 -0
- package/dist/shell/sparkline.d.ts.map +1 -0
- package/dist/shell/sparkline.js +56 -0
- package/dist/shell/sparkline.js.map +1 -0
- package/dist/shell/theme.d.ts +72 -0
- package/dist/shell/theme.d.ts.map +1 -0
- package/dist/shell/theme.js +60 -0
- package/dist/shell/theme.js.map +1 -0
- package/dist/ui/views/DbHealthView.d.ts +6 -0
- package/dist/ui/views/DbHealthView.d.ts.map +1 -0
- package/dist/ui/views/DbHealthView.js +180 -0
- package/dist/ui/views/DbHealthView.js.map +1 -0
- package/dist/ui/views/K8sDeployView.d.ts +8 -0
- package/dist/ui/views/K8sDeployView.d.ts.map +1 -0
- package/dist/ui/views/K8sDeployView.js +81 -0
- package/dist/ui/views/K8sDeployView.js.map +1 -0
- package/dist/ui/views/K8sRunbookView.d.ts +8 -0
- package/dist/ui/views/K8sRunbookView.d.ts.map +1 -0
- package/dist/ui/views/K8sRunbookView.js +181 -0
- package/dist/ui/views/K8sRunbookView.js.map +1 -0
- package/dist/ui/views/K8sServicesView.d.ts +8 -0
- package/dist/ui/views/K8sServicesView.d.ts.map +1 -0
- package/dist/ui/views/K8sServicesView.js +106 -0
- package/dist/ui/views/K8sServicesView.js.map +1 -0
- package/dist/ui/views/K8sStatusView.d.ts +8 -0
- package/dist/ui/views/K8sStatusView.d.ts.map +1 -0
- package/dist/ui/views/K8sStatusView.js +135 -0
- package/dist/ui/views/K8sStatusView.js.map +1 -0
- package/dist/ui/views/MainMenu.d.ts.map +1 -1
- package/dist/ui/views/MainMenu.js +54 -24
- package/dist/ui/views/MainMenu.js.map +1 -1
- package/dist/ui/views/SettingsView.d.ts.map +1 -1
- package/dist/ui/views/SettingsView.js +19 -1
- package/dist/ui/views/SettingsView.js.map +1 -1
- package/dist/ui/views/SetupWizardView.d.ts +7 -0
- package/dist/ui/views/SetupWizardView.d.ts.map +1 -0
- package/dist/ui/views/SetupWizardView.js +244 -0
- package/dist/ui/views/SetupWizardView.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/shell/parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7F,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA+BhD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,EAAE,WAAW,GAChB;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAsC1E;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC,CAkBf"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Split input into tokens, respecting quoted strings.
|
|
3
|
+
*/
|
|
4
|
+
export function tokenize(input) {
|
|
5
|
+
const tokens = [];
|
|
6
|
+
let current = '';
|
|
7
|
+
let inQuote = null;
|
|
8
|
+
for (let i = 0; i < input.length; i++) {
|
|
9
|
+
const ch = input[i];
|
|
10
|
+
if (inQuote) {
|
|
11
|
+
if (ch === inQuote) {
|
|
12
|
+
inQuote = null;
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
current += ch;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
else if (ch === '"' || ch === "'") {
|
|
19
|
+
inQuote = ch;
|
|
20
|
+
}
|
|
21
|
+
else if (ch === ' ' || ch === '\t') {
|
|
22
|
+
if (current.length > 0) {
|
|
23
|
+
tokens.push(current);
|
|
24
|
+
current = '';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
current += ch;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (current.length > 0) {
|
|
32
|
+
tokens.push(current);
|
|
33
|
+
}
|
|
34
|
+
return tokens;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Walk the command tree consuming tokens, extracting --options.
|
|
38
|
+
* Returns the deepest matched node, remaining positional args, and parsed options.
|
|
39
|
+
*/
|
|
40
|
+
export function walkTree(tokens, root) {
|
|
41
|
+
let node = root;
|
|
42
|
+
const opts = {};
|
|
43
|
+
const remaining = [];
|
|
44
|
+
let i = 0;
|
|
45
|
+
while (i < tokens.length) {
|
|
46
|
+
const token = tokens[i];
|
|
47
|
+
// Handle options
|
|
48
|
+
if (token.startsWith('--')) {
|
|
49
|
+
const optDef = node.options?.find(o => o.name === token);
|
|
50
|
+
if (optDef && optDef.hasValue && i + 1 < tokens.length) {
|
|
51
|
+
opts[token] = tokens[i + 1];
|
|
52
|
+
i += 2;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
opts[token] = 'true';
|
|
56
|
+
i++;
|
|
57
|
+
}
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
// Try to match a child node
|
|
61
|
+
if (node.children) {
|
|
62
|
+
const child = node.children.find(c => c.name === token);
|
|
63
|
+
if (child) {
|
|
64
|
+
node = child;
|
|
65
|
+
i++;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// No match — treat as positional arg
|
|
70
|
+
remaining.push(token);
|
|
71
|
+
i++;
|
|
72
|
+
}
|
|
73
|
+
return { node, remaining, opts };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Tokenize input, walk the command tree, and call the handler.
|
|
77
|
+
* Prints error messages for unknown or incomplete commands.
|
|
78
|
+
*/
|
|
79
|
+
export async function dispatch(input, root, ctx) {
|
|
80
|
+
const trimmed = input.trim();
|
|
81
|
+
if (trimmed.length === 0)
|
|
82
|
+
return;
|
|
83
|
+
const tokens = tokenize(trimmed);
|
|
84
|
+
if (tokens.length === 0)
|
|
85
|
+
return;
|
|
86
|
+
const { node, remaining, opts } = walkTree(tokens, root);
|
|
87
|
+
if (node.handler) {
|
|
88
|
+
await node.handler(remaining, opts, ctx);
|
|
89
|
+
}
|
|
90
|
+
else if (node === root) {
|
|
91
|
+
console.log(`% Unknown command "${tokens[0]}"`);
|
|
92
|
+
}
|
|
93
|
+
else if (node.children && node.children.length > 0) {
|
|
94
|
+
console.log('% Incomplete command');
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.log(`% Unknown command "${tokens.join(' ')}"`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/shell/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../../src/shell/repl.ts"],"names":[],"mappings":"AAqLA;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgHhD"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import * as readline from 'node:readline';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { existsSync, readFileSync, appendFileSync, mkdirSync } from 'node:fs';
|
|
5
|
+
import { createCompleter, showHelp } from './completer.js';
|
|
6
|
+
import { dispatch } from './parser.js';
|
|
7
|
+
import { commandTree } from './commands/registry.js';
|
|
8
|
+
import { wireConnectHandlers } from './commands/connect.js';
|
|
9
|
+
import { wireSecretsHandlers } from './commands/secrets.js';
|
|
10
|
+
import { wireUsersHandlers } from './commands/users.js';
|
|
11
|
+
import { LOGO } from '../lib/brand.js';
|
|
12
|
+
import { Box, Status } from './theme.js';
|
|
13
|
+
import { renderFooter } from './footer.js';
|
|
14
|
+
import chalk from 'chalk';
|
|
15
|
+
const CT_DIR = join(homedir(), '.ct');
|
|
16
|
+
const HISTORY_FILE = join(CT_DIR, 'shell_history');
|
|
17
|
+
const MAX_HISTORY = 500;
|
|
18
|
+
/**
|
|
19
|
+
* Build the framed startup banner.
|
|
20
|
+
*/
|
|
21
|
+
function buildBanner(ctx) {
|
|
22
|
+
const lines = [];
|
|
23
|
+
// Split the logo into lines and find the max width
|
|
24
|
+
const logoLines = LOGO.split('\n');
|
|
25
|
+
const logoMaxWidth = Math.max(...logoLines.map((l) => l.length));
|
|
26
|
+
// Inner content: logo + status info + help hints
|
|
27
|
+
const contentLines = [];
|
|
28
|
+
for (const l of logoLines) {
|
|
29
|
+
contentLines.push(l.padEnd(logoMaxWidth));
|
|
30
|
+
}
|
|
31
|
+
contentLines.push('');
|
|
32
|
+
const version = '0.4.26';
|
|
33
|
+
const backendLabel = ctx.backend === 'k8s' ? 'Kubernetes' : 'Compose';
|
|
34
|
+
const statusSymbol = Status.online.color(Status.online.symbol);
|
|
35
|
+
contentLines.push(` ${chalk.bold('CallTelemetry Voice OS')} ${chalk.dim('v' + version)}`);
|
|
36
|
+
contentLines.push(` ${statusSymbol} ${chalk.dim('Backend:')} ${chalk.cyan(backendLabel)} ${statusSymbol} ${chalk.dim('Status:')} ${chalk.green('Ready')}`);
|
|
37
|
+
contentLines.push('');
|
|
38
|
+
contentLines.push(` ${chalk.dim('\u2328 Tab to complete \u2022 ? for help \u2022 exit to quit')}`);
|
|
39
|
+
contentLines.push('');
|
|
40
|
+
// Calculate the widest content line for the frame
|
|
41
|
+
// We need to strip ANSI to measure visible width
|
|
42
|
+
// eslint-disable-next-line no-control-regex
|
|
43
|
+
const stripAnsi = (s) => s.replace(/\x1B\[[0-9;]*m/g, '');
|
|
44
|
+
const maxVisible = Math.max(...contentLines.map((l) => stripAnsi(l).length));
|
|
45
|
+
const innerWidth = Math.max(maxVisible + 2, 62);
|
|
46
|
+
// Top border
|
|
47
|
+
lines.push(chalk.cyan(Box.tl + Box.h.repeat(innerWidth) + Box.tr));
|
|
48
|
+
// Content rows, padded inside the frame
|
|
49
|
+
for (const cl of contentLines) {
|
|
50
|
+
const visible = stripAnsi(cl).length;
|
|
51
|
+
const padding = innerWidth - visible;
|
|
52
|
+
lines.push(chalk.cyan(Box.v) + cl + ' '.repeat(Math.max(0, padding)) + chalk.cyan(Box.v));
|
|
53
|
+
}
|
|
54
|
+
// Bottom border
|
|
55
|
+
lines.push(chalk.cyan(Box.bl + Box.h.repeat(innerWidth) + Box.br));
|
|
56
|
+
return lines.join('\n');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Build a dynamic prompt reflecting connection state.
|
|
60
|
+
*/
|
|
61
|
+
function getPrompt(ctx) {
|
|
62
|
+
const parts = [];
|
|
63
|
+
if (ctx.connections.size > 0) {
|
|
64
|
+
const names = [...ctx.connections.keys()].join(',');
|
|
65
|
+
parts.push(chalk.cyan(`(${names})`));
|
|
66
|
+
}
|
|
67
|
+
return `${chalk.bold.cyan('ct')}${parts.join('')}${chalk.cyan('>')} `;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Load command history from disk.
|
|
71
|
+
*/
|
|
72
|
+
function loadHistory() {
|
|
73
|
+
try {
|
|
74
|
+
if (!existsSync(HISTORY_FILE))
|
|
75
|
+
return [];
|
|
76
|
+
const raw = readFileSync(HISTORY_FILE, 'utf-8');
|
|
77
|
+
return raw.split('\n').filter(Boolean).slice(-MAX_HISTORY);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Append a line to the history file.
|
|
85
|
+
*/
|
|
86
|
+
function saveHistoryLine(line) {
|
|
87
|
+
try {
|
|
88
|
+
mkdirSync(CT_DIR, { recursive: true });
|
|
89
|
+
appendFileSync(HISTORY_FILE, line + '\n', 'utf-8');
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// Silently ignore history write failures
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Wire up built-in shell commands (help, history, clear, exit, quit, whoami).
|
|
97
|
+
*/
|
|
98
|
+
function wireBuiltins(ctx) {
|
|
99
|
+
const tree = commandTree;
|
|
100
|
+
const findChild = (name) => tree.children?.find((c) => c.name === name);
|
|
101
|
+
// exit / quit
|
|
102
|
+
const exitNode = findChild('exit');
|
|
103
|
+
if (exitNode) {
|
|
104
|
+
exitNode.handler = async () => {
|
|
105
|
+
console.log(chalk.dim('Goodbye.'));
|
|
106
|
+
ctx.rl.close();
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const quitNode = findChild('quit');
|
|
110
|
+
if (quitNode) {
|
|
111
|
+
quitNode.handler = async () => {
|
|
112
|
+
console.log(chalk.dim('Goodbye.'));
|
|
113
|
+
ctx.rl.close();
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// help
|
|
117
|
+
const helpNode = findChild('help');
|
|
118
|
+
if (helpNode) {
|
|
119
|
+
helpNode.handler = async () => {
|
|
120
|
+
console.log(showHelp('', commandTree));
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
// clear
|
|
124
|
+
const clearNode = findChild('clear');
|
|
125
|
+
if (clearNode) {
|
|
126
|
+
clearNode.handler = async () => {
|
|
127
|
+
process.stdout.write('\x1B[2J\x1B[H');
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// history
|
|
131
|
+
const historyNode = findChild('history');
|
|
132
|
+
if (historyNode) {
|
|
133
|
+
historyNode.handler = async () => {
|
|
134
|
+
const history = loadHistory();
|
|
135
|
+
if (history.length === 0) {
|
|
136
|
+
console.log('No command history.');
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
history.forEach((line, i) => {
|
|
140
|
+
console.log(` ${String(i + 1).padStart(4)} ${line}`);
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// whoami
|
|
145
|
+
const whoamiNode = findChild('whoami');
|
|
146
|
+
if (whoamiNode) {
|
|
147
|
+
whoamiNode.handler = async (_args, _opts, c) => {
|
|
148
|
+
const user = process.env.USER ?? process.env.USERNAME ?? 'unknown';
|
|
149
|
+
const host = process.env.HOSTNAME ?? 'localhost';
|
|
150
|
+
console.log(`${user}@${host} backend=${c.backend} connections=${c.connections.size}`);
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Start the interactive IOS-style shell.
|
|
156
|
+
*/
|
|
157
|
+
export async function startShell() {
|
|
158
|
+
const completer = createCompleter(commandTree, null);
|
|
159
|
+
const rl = readline.createInterface({
|
|
160
|
+
input: process.stdin,
|
|
161
|
+
output: process.stdout,
|
|
162
|
+
completer,
|
|
163
|
+
terminal: true,
|
|
164
|
+
prompt: '', // Set dynamically below
|
|
165
|
+
});
|
|
166
|
+
const ctx = {
|
|
167
|
+
rl,
|
|
168
|
+
connections: new Map(),
|
|
169
|
+
backend: 'compose',
|
|
170
|
+
historyFile: HISTORY_FILE,
|
|
171
|
+
};
|
|
172
|
+
// Print the framed banner
|
|
173
|
+
console.log('\n' + buildBanner(ctx) + '\n');
|
|
174
|
+
// Wire built-in command handlers
|
|
175
|
+
wireBuiltins(ctx);
|
|
176
|
+
// Wire feature handlers
|
|
177
|
+
wireConnectHandlers();
|
|
178
|
+
wireSecretsHandlers();
|
|
179
|
+
wireUsersHandlers();
|
|
180
|
+
// Load history into readline
|
|
181
|
+
const history = loadHistory();
|
|
182
|
+
const rlAny = rl; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
183
|
+
if (Array.isArray(rlAny.history)) {
|
|
184
|
+
rlAny.history = [...history].reverse();
|
|
185
|
+
}
|
|
186
|
+
// Set dynamic prompt
|
|
187
|
+
const updatePrompt = () => {
|
|
188
|
+
rl.setPrompt(getPrompt(ctx));
|
|
189
|
+
};
|
|
190
|
+
updatePrompt();
|
|
191
|
+
// Handle ? key for context-sensitive help
|
|
192
|
+
if (process.stdin.isTTY) {
|
|
193
|
+
readline.emitKeypressEvents(process.stdin, rl);
|
|
194
|
+
process.stdin.on('keypress', (_ch, key) => {
|
|
195
|
+
if (key && key.name === undefined && key.sequence === '?') {
|
|
196
|
+
const line = rlAny.line ?? '';
|
|
197
|
+
const cleanLine = line.endsWith('?') ? line.slice(0, -1) : line;
|
|
198
|
+
console.log();
|
|
199
|
+
console.log(showHelp(cleanLine, commandTree));
|
|
200
|
+
rlAny.line = cleanLine;
|
|
201
|
+
rlAny.cursor = cleanLine.length;
|
|
202
|
+
rl.prompt(true);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
// REPL loop
|
|
207
|
+
rl.prompt();
|
|
208
|
+
rl.on('line', async (input) => {
|
|
209
|
+
const trimmed = input.trim();
|
|
210
|
+
if (trimmed.length > 0) {
|
|
211
|
+
saveHistoryLine(trimmed);
|
|
212
|
+
try {
|
|
213
|
+
await dispatch(trimmed, commandTree, ctx);
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
217
|
+
console.error(chalk.red(`${Status.fail.symbol} Error: ${msg}`));
|
|
218
|
+
}
|
|
219
|
+
// Render metrics footer after each command
|
|
220
|
+
try {
|
|
221
|
+
await renderFooter();
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// Non-fatal — skip footer if metrics fail
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Update prompt (connections may have changed)
|
|
228
|
+
updatePrompt();
|
|
229
|
+
// Check if rl is still open (exit/quit may have closed it)
|
|
230
|
+
if (!rlAny.closed) {
|
|
231
|
+
rl.prompt();
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
rl.on('close', () => {
|
|
235
|
+
console.log();
|
|
236
|
+
process.exit(0);
|
|
237
|
+
});
|
|
238
|
+
// Handle SIGINT (Ctrl-C) — cancel current line, don't exit
|
|
239
|
+
rl.on('SIGINT', () => {
|
|
240
|
+
rlAny.line = '';
|
|
241
|
+
rlAny.cursor = 0;
|
|
242
|
+
console.log();
|
|
243
|
+
updatePrompt();
|
|
244
|
+
rl.prompt();
|
|
245
|
+
});
|
|
246
|
+
// Wait for the readline to close
|
|
247
|
+
await new Promise((resolve) => {
|
|
248
|
+
rl.on('close', resolve);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=repl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/shell/repl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render an array of numbers as a sparkline string.
|
|
3
|
+
* Auto-scales to min/max of the data.
|
|
4
|
+
*/
|
|
5
|
+
export declare function sparkline(data: number[], width?: number): string;
|
|
6
|
+
/**
|
|
7
|
+
* Render a meter bar: filled and empty blocks with percentage.
|
|
8
|
+
* ████████░░░░░░░░ 67%
|
|
9
|
+
*/
|
|
10
|
+
export declare function meterBar(pct: number, width?: number): string;
|
|
11
|
+
/**
|
|
12
|
+
* Render an inline metric with optional sparkline history.
|
|
13
|
+
* CPU ▃▅▇▅▃ 23% (load 1.2)
|
|
14
|
+
*/
|
|
15
|
+
export declare function inlineMetric(label: string, pct: number, history: number[], detail?: string): string;
|
|
16
|
+
//# sourceMappingURL=sparkline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparkline.d.ts","sourceRoot":"","sources":["../../src/shell/sparkline.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAuBhE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAQxD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAMR"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { thresholdColor } from './theme.js';
|
|
3
|
+
const BLOCKS = ['\u2581', '\u2582', '\u2583', '\u2584', '\u2585', '\u2586', '\u2587', '\u2588'];
|
|
4
|
+
const EMPTY_BLOCK = '\u2591';
|
|
5
|
+
const FILLED_BLOCK = '\u2588';
|
|
6
|
+
/**
|
|
7
|
+
* Render an array of numbers as a sparkline string.
|
|
8
|
+
* Auto-scales to min/max of the data.
|
|
9
|
+
*/
|
|
10
|
+
export function sparkline(data, width) {
|
|
11
|
+
if (data.length === 0)
|
|
12
|
+
return '';
|
|
13
|
+
const w = width ?? data.length;
|
|
14
|
+
// Pad or trim data to fit width
|
|
15
|
+
let values = data;
|
|
16
|
+
if (values.length < w) {
|
|
17
|
+
const pad = new Array(w - values.length).fill(values[0] ?? 0);
|
|
18
|
+
values = [...pad, ...values];
|
|
19
|
+
}
|
|
20
|
+
else if (values.length > w) {
|
|
21
|
+
values = values.slice(values.length - w);
|
|
22
|
+
}
|
|
23
|
+
const min = Math.min(...values);
|
|
24
|
+
const max = Math.max(...values);
|
|
25
|
+
const range = max - min || 1;
|
|
26
|
+
return values
|
|
27
|
+
.map((v) => {
|
|
28
|
+
const idx = Math.round(((v - min) / range) * (BLOCKS.length - 1));
|
|
29
|
+
return BLOCKS[Math.max(0, Math.min(BLOCKS.length - 1, idx))];
|
|
30
|
+
})
|
|
31
|
+
.join('');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Render a meter bar: filled and empty blocks with percentage.
|
|
35
|
+
* ████████░░░░░░░░ 67%
|
|
36
|
+
*/
|
|
37
|
+
export function meterBar(pct, width = 20) {
|
|
38
|
+
const clamped = Math.max(0, Math.min(100, pct));
|
|
39
|
+
const filled = Math.round((clamped / 100) * width);
|
|
40
|
+
const empty = width - filled;
|
|
41
|
+
const color = thresholdColor(clamped);
|
|
42
|
+
const bar = color(FILLED_BLOCK.repeat(filled)) + chalk.dim(EMPTY_BLOCK.repeat(empty));
|
|
43
|
+
return `${bar} ${color(String(Math.round(clamped)) + '%')}`;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Render an inline metric with optional sparkline history.
|
|
47
|
+
* CPU ▃▅▇▅▃ 23% (load 1.2)
|
|
48
|
+
*/
|
|
49
|
+
export function inlineMetric(label, pct, history, detail) {
|
|
50
|
+
const color = thresholdColor(pct);
|
|
51
|
+
const spark = history.length > 0 ? ' ' + sparkline(history, 6) : '';
|
|
52
|
+
const pctStr = color(String(Math.round(pct)) + '%');
|
|
53
|
+
const detailStr = detail ? chalk.dim(` (${detail})`) : '';
|
|
54
|
+
return `${chalk.bold(label)}${spark} ${pctStr}${detailStr}`;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=sparkline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sparkline.js","sourceRoot":"","sources":["../../src/shell/sparkline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export declare const Status: {
|
|
3
|
+
readonly ok: {
|
|
4
|
+
readonly symbol: "✓";
|
|
5
|
+
readonly color: import("chalk").ChalkInstance;
|
|
6
|
+
};
|
|
7
|
+
readonly fail: {
|
|
8
|
+
readonly symbol: "✗";
|
|
9
|
+
readonly color: import("chalk").ChalkInstance;
|
|
10
|
+
};
|
|
11
|
+
readonly warn: {
|
|
12
|
+
readonly symbol: "⚠";
|
|
13
|
+
readonly color: import("chalk").ChalkInstance;
|
|
14
|
+
};
|
|
15
|
+
readonly info: {
|
|
16
|
+
readonly symbol: "ℹ";
|
|
17
|
+
readonly color: import("chalk").ChalkInstance;
|
|
18
|
+
};
|
|
19
|
+
readonly running: {
|
|
20
|
+
readonly symbol: "●";
|
|
21
|
+
readonly color: import("chalk").ChalkInstance;
|
|
22
|
+
};
|
|
23
|
+
readonly waiting: {
|
|
24
|
+
readonly symbol: "○";
|
|
25
|
+
readonly color: import("chalk").ChalkInstance;
|
|
26
|
+
};
|
|
27
|
+
readonly online: {
|
|
28
|
+
readonly symbol: "●";
|
|
29
|
+
readonly color: import("chalk").ChalkInstance;
|
|
30
|
+
};
|
|
31
|
+
readonly offline: {
|
|
32
|
+
readonly symbol: "○";
|
|
33
|
+
readonly color: import("chalk").ChalkInstance;
|
|
34
|
+
};
|
|
35
|
+
readonly degraded: {
|
|
36
|
+
readonly symbol: "◐";
|
|
37
|
+
readonly color: import("chalk").ChalkInstance;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
export type StatusKey = keyof typeof Status;
|
|
41
|
+
export declare const Box: {
|
|
42
|
+
readonly h: "─";
|
|
43
|
+
readonly v: "│";
|
|
44
|
+
readonly tl: "┌";
|
|
45
|
+
readonly tr: "┐";
|
|
46
|
+
readonly bl: "└";
|
|
47
|
+
readonly br: "┘";
|
|
48
|
+
readonly lt: "├";
|
|
49
|
+
readonly rt: "┤";
|
|
50
|
+
readonly tt: "┬";
|
|
51
|
+
readonly bt: "┴";
|
|
52
|
+
readonly x: "┼";
|
|
53
|
+
readonly hBold: "━";
|
|
54
|
+
readonly vBold: "┃";
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Return a chalk color function based on percentage thresholds.
|
|
58
|
+
*/
|
|
59
|
+
export declare function thresholdColor(pct: number, warn?: number, crit?: number): typeof chalk.red;
|
|
60
|
+
/**
|
|
61
|
+
* Strip ANSI escape codes to get the visible character length.
|
|
62
|
+
*/
|
|
63
|
+
export declare function visibleLength(str: string): number;
|
|
64
|
+
/**
|
|
65
|
+
* Pad a string to a target visible width, accounting for ANSI codes.
|
|
66
|
+
*/
|
|
67
|
+
export declare function padEnd(str: string, width: number): string;
|
|
68
|
+
/**
|
|
69
|
+
* Truncate a string to a max visible width, adding ellipsis if needed.
|
|
70
|
+
*/
|
|
71
|
+
export declare function truncate(str: string, maxWidth: number): string;
|
|
72
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/shell/theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAUT,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,MAAM,CAAC;AAE5C,eAAO,MAAM,GAAG;;;;;;;;;;;;;;CAKN,CAAC;AAEX;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,IAAI,SAAK,EACT,IAAI,SAAK,GACR,OAAO,KAAK,CAAC,GAAG,CAIlB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAU9D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export const Status = {
|
|
3
|
+
ok: { symbol: '\u2713', color: chalk.green },
|
|
4
|
+
fail: { symbol: '\u2717', color: chalk.red },
|
|
5
|
+
warn: { symbol: '\u26A0', color: chalk.yellow },
|
|
6
|
+
info: { symbol: '\u2139', color: chalk.blue },
|
|
7
|
+
running: { symbol: '\u25CF', color: chalk.cyan },
|
|
8
|
+
waiting: { symbol: '\u25CB', color: chalk.gray },
|
|
9
|
+
online: { symbol: '\u25CF', color: chalk.green },
|
|
10
|
+
offline: { symbol: '\u25CB', color: chalk.gray },
|
|
11
|
+
degraded: { symbol: '\u25D0', color: chalk.yellow },
|
|
12
|
+
};
|
|
13
|
+
export const Box = {
|
|
14
|
+
h: '\u2500', v: '\u2502',
|
|
15
|
+
tl: '\u250C', tr: '\u2510', bl: '\u2514', br: '\u2518',
|
|
16
|
+
lt: '\u251C', rt: '\u2524', tt: '\u252C', bt: '\u2534', x: '\u253C',
|
|
17
|
+
hBold: '\u2501', vBold: '\u2503',
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Return a chalk color function based on percentage thresholds.
|
|
21
|
+
*/
|
|
22
|
+
export function thresholdColor(pct, warn = 70, crit = 90) {
|
|
23
|
+
if (pct >= crit)
|
|
24
|
+
return chalk.red;
|
|
25
|
+
if (pct >= warn)
|
|
26
|
+
return chalk.yellow;
|
|
27
|
+
return chalk.green;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Strip ANSI escape codes to get the visible character length.
|
|
31
|
+
*/
|
|
32
|
+
export function visibleLength(str) {
|
|
33
|
+
// eslint-disable-next-line no-control-regex
|
|
34
|
+
return str.replace(/\x1B\[[0-9;]*m/g, '').length;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Pad a string to a target visible width, accounting for ANSI codes.
|
|
38
|
+
*/
|
|
39
|
+
export function padEnd(str, width) {
|
|
40
|
+
const visible = visibleLength(str);
|
|
41
|
+
if (visible >= width)
|
|
42
|
+
return str;
|
|
43
|
+
return str + ' '.repeat(width - visible);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Truncate a string to a max visible width, adding ellipsis if needed.
|
|
47
|
+
*/
|
|
48
|
+
export function truncate(str, maxWidth) {
|
|
49
|
+
if (maxWidth < 1)
|
|
50
|
+
return '';
|
|
51
|
+
const visible = visibleLength(str);
|
|
52
|
+
if (visible <= maxWidth)
|
|
53
|
+
return str;
|
|
54
|
+
// Strip ANSI, truncate plain text, re-wrap would be complex.
|
|
55
|
+
// For simplicity, strip all ANSI, truncate, add ellipsis.
|
|
56
|
+
// eslint-disable-next-line no-control-regex
|
|
57
|
+
const plain = str.replace(/\x1B\[[0-9;]*m/g, '');
|
|
58
|
+
return plain.slice(0, maxWidth - 1) + '\u2026';
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/shell/theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,EAAE,EAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;IAClD,IAAI,EAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE;IAChD,IAAI,EAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE;IACnD,IAAI,EAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;IACjD,OAAO,EAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;IACjD,OAAO,EAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;IACjD,MAAM,EAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;IAClD,OAAO,EAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE;CAC3C,CAAC;AAIX,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ;IACxB,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ;IACtD,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ;IACnE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ;CACxB,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,GAAW,EACX,IAAI,GAAG,EAAE,EACT,IAAI,GAAG,EAAE;IAET,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC;IAClC,IAAI,GAAG,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IACrC,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,4CAA4C;IAC5C,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,KAAa;IAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,OAAO,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC;IACjC,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,QAAgB;IACpD,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,OAAO,IAAI,QAAQ;QAAE,OAAO,GAAG,CAAC;IAEpC,6DAA6D;IAC7D,0DAA0D;IAC1D,4CAA4C;IAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DbHealthView.d.ts","sourceRoot":"","sources":["../../../src/ui/views/DbHealthView.tsx"],"names":[],"mappings":"AAQA,UAAU,iBAAiB;IACzB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AA+KD,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CAkOzD"}
|