@calltelemetry/cli 0.4.26 → 0.5.1
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 +135 -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/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/network.d.ts +8 -0
- package/dist/lib/network.d.ts.map +1 -1
- package/dist/lib/network.js +17 -0
- package/dist/lib/network.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 +607 -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 +17 -0
- package/dist/shell/completer.d.ts.map +1 -0
- package/dist/shell/completer.js +151 -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 +36 -0
- package/dist/shell/parser.d.ts.map +1 -0
- package/dist/shell/parser.js +110 -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 +273 -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,36 @@
|
|
|
1
|
+
import type { ShellContext } from './context.js';
|
|
2
|
+
export interface OptionDef {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
hasValue: boolean;
|
|
6
|
+
valuesFn?: () => string[];
|
|
7
|
+
}
|
|
8
|
+
export interface CommandNode {
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
children?: CommandNode[];
|
|
12
|
+
options?: OptionDef[];
|
|
13
|
+
handler?: (args: string[], opts: Record<string, string>, ctx: ShellContext) => Promise<void>;
|
|
14
|
+
requiresMcp?: string;
|
|
15
|
+
/** If true, accepts an optional ethernet interface name as the first positional arg before subcommands. */
|
|
16
|
+
interfacePositional?: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Split input into tokens, respecting quoted strings.
|
|
20
|
+
*/
|
|
21
|
+
export declare function tokenize(input: string): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Walk the command tree consuming tokens, extracting --options.
|
|
24
|
+
* Returns the deepest matched node, remaining positional args, and parsed options.
|
|
25
|
+
*/
|
|
26
|
+
export declare function walkTree(tokens: string[], root: CommandNode): {
|
|
27
|
+
node: CommandNode;
|
|
28
|
+
remaining: string[];
|
|
29
|
+
opts: Record<string, string>;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Tokenize input, walk the command tree, and call the handler.
|
|
33
|
+
* Prints error messages for unknown or incomplete commands.
|
|
34
|
+
*/
|
|
35
|
+
export declare function dispatch(input: string, root: CommandNode, ctx: ShellContext): Promise<void>;
|
|
36
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -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;AAGjD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;CAC3B;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;IACrB,2GAA2G;IAC3G,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;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,CAgD1E;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,110 @@
|
|
|
1
|
+
import { getEthernetInterfaces } from '../lib/network.js';
|
|
2
|
+
/**
|
|
3
|
+
* Split input into tokens, respecting quoted strings.
|
|
4
|
+
*/
|
|
5
|
+
export function tokenize(input) {
|
|
6
|
+
const tokens = [];
|
|
7
|
+
let current = '';
|
|
8
|
+
let inQuote = null;
|
|
9
|
+
for (let i = 0; i < input.length; i++) {
|
|
10
|
+
const ch = input[i];
|
|
11
|
+
if (inQuote) {
|
|
12
|
+
if (ch === inQuote) {
|
|
13
|
+
inQuote = null;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
current += ch;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
else if (ch === '"' || ch === "'") {
|
|
20
|
+
inQuote = ch;
|
|
21
|
+
}
|
|
22
|
+
else if (ch === ' ' || ch === '\t') {
|
|
23
|
+
if (current.length > 0) {
|
|
24
|
+
tokens.push(current);
|
|
25
|
+
current = '';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
current += ch;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (current.length > 0) {
|
|
33
|
+
tokens.push(current);
|
|
34
|
+
}
|
|
35
|
+
return tokens;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Walk the command tree consuming tokens, extracting --options.
|
|
39
|
+
* Returns the deepest matched node, remaining positional args, and parsed options.
|
|
40
|
+
*/
|
|
41
|
+
export function walkTree(tokens, root) {
|
|
42
|
+
let node = root;
|
|
43
|
+
const opts = {};
|
|
44
|
+
const remaining = [];
|
|
45
|
+
let i = 0;
|
|
46
|
+
while (i < tokens.length) {
|
|
47
|
+
const token = tokens[i];
|
|
48
|
+
// Handle options
|
|
49
|
+
if (token.startsWith('--')) {
|
|
50
|
+
const optDef = node.options?.find(o => o.name === token);
|
|
51
|
+
if (optDef && optDef.hasValue && i + 1 < tokens.length) {
|
|
52
|
+
opts[token] = tokens[i + 1];
|
|
53
|
+
i += 2;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
opts[token] = 'true';
|
|
57
|
+
i++;
|
|
58
|
+
}
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
// If the node accepts an interface positional, consume it before trying children
|
|
62
|
+
if (node.interfacePositional && !opts['--interface']) {
|
|
63
|
+
const ethIfaces = getEthernetInterfaces();
|
|
64
|
+
if (ethIfaces.includes(token)) {
|
|
65
|
+
opts['--interface'] = token;
|
|
66
|
+
i++;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Try to match a child node
|
|
71
|
+
if (node.children) {
|
|
72
|
+
const child = node.children.find(c => c.name === token);
|
|
73
|
+
if (child) {
|
|
74
|
+
node = child;
|
|
75
|
+
i++;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// No match — treat as positional arg
|
|
80
|
+
remaining.push(token);
|
|
81
|
+
i++;
|
|
82
|
+
}
|
|
83
|
+
return { node, remaining, opts };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Tokenize input, walk the command tree, and call the handler.
|
|
87
|
+
* Prints error messages for unknown or incomplete commands.
|
|
88
|
+
*/
|
|
89
|
+
export async function dispatch(input, root, ctx) {
|
|
90
|
+
const trimmed = input.trim();
|
|
91
|
+
if (trimmed.length === 0)
|
|
92
|
+
return;
|
|
93
|
+
const tokens = tokenize(trimmed);
|
|
94
|
+
if (tokens.length === 0)
|
|
95
|
+
return;
|
|
96
|
+
const { node, remaining, opts } = walkTree(tokens, root);
|
|
97
|
+
if (node.handler) {
|
|
98
|
+
await node.handler(remaining, opts, ctx);
|
|
99
|
+
}
|
|
100
|
+
else if (node === root) {
|
|
101
|
+
console.log(`% Unknown command "${tokens[0]}"`);
|
|
102
|
+
}
|
|
103
|
+
else if (node.children && node.children.length > 0) {
|
|
104
|
+
console.log('% Incomplete command');
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
console.log(`% Unknown command "${tokens.join(' ')}"`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# 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,CAqIhD"}
|
|
@@ -0,0 +1,273 @@
|
|
|
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
|
+
// Override readline's built-in column-layout tab completion with a
|
|
167
|
+
// vertical single-column list — one completion per line.
|
|
168
|
+
rl._tabComplete = function (_lastKeypressWasTab) {
|
|
169
|
+
const line = rl.line ?? '';
|
|
170
|
+
const [completions, partial] = completer(line);
|
|
171
|
+
if (completions.length === 0)
|
|
172
|
+
return;
|
|
173
|
+
if (completions.length === 1) {
|
|
174
|
+
// Single match — auto-insert it
|
|
175
|
+
const insert = completions[0].slice(partial.length);
|
|
176
|
+
if (insert)
|
|
177
|
+
rl._insertString(insert);
|
|
178
|
+
rl._refreshLine?.();
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// Multiple matches — print one per line then redraw the prompt
|
|
182
|
+
process.stdout.write('\r\n');
|
|
183
|
+
for (const c of completions) {
|
|
184
|
+
process.stdout.write(` ${c}\r\n`);
|
|
185
|
+
}
|
|
186
|
+
rl._refreshLine?.();
|
|
187
|
+
};
|
|
188
|
+
const ctx = {
|
|
189
|
+
rl,
|
|
190
|
+
connections: new Map(),
|
|
191
|
+
backend: 'compose',
|
|
192
|
+
historyFile: HISTORY_FILE,
|
|
193
|
+
};
|
|
194
|
+
// Print the framed banner
|
|
195
|
+
console.log('\n' + buildBanner(ctx) + '\n');
|
|
196
|
+
// Wire built-in command handlers
|
|
197
|
+
wireBuiltins(ctx);
|
|
198
|
+
// Wire feature handlers
|
|
199
|
+
wireConnectHandlers();
|
|
200
|
+
wireSecretsHandlers();
|
|
201
|
+
wireUsersHandlers();
|
|
202
|
+
// Load history into readline
|
|
203
|
+
const history = loadHistory();
|
|
204
|
+
const rlAny = rl; // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
205
|
+
if (Array.isArray(rlAny.history)) {
|
|
206
|
+
rlAny.history = [...history].reverse();
|
|
207
|
+
}
|
|
208
|
+
// Set dynamic prompt
|
|
209
|
+
const updatePrompt = () => {
|
|
210
|
+
rl.setPrompt(getPrompt(ctx));
|
|
211
|
+
};
|
|
212
|
+
updatePrompt();
|
|
213
|
+
// Handle ? key for context-sensitive help
|
|
214
|
+
if (process.stdin.isTTY) {
|
|
215
|
+
readline.emitKeypressEvents(process.stdin, rl);
|
|
216
|
+
process.stdin.on('keypress', (_ch, key) => {
|
|
217
|
+
if (key && key.name === undefined && key.sequence === '?') {
|
|
218
|
+
const line = rlAny.line ?? '';
|
|
219
|
+
const cleanLine = line.endsWith('?') ? line.slice(0, -1) : line;
|
|
220
|
+
console.log();
|
|
221
|
+
console.log(showHelp(cleanLine, commandTree));
|
|
222
|
+
rlAny.line = cleanLine;
|
|
223
|
+
rlAny.cursor = cleanLine.length;
|
|
224
|
+
rl.prompt(true);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
// REPL loop
|
|
229
|
+
rl.prompt();
|
|
230
|
+
rl.on('line', async (input) => {
|
|
231
|
+
const trimmed = input.trim();
|
|
232
|
+
if (trimmed.length > 0) {
|
|
233
|
+
saveHistoryLine(trimmed);
|
|
234
|
+
try {
|
|
235
|
+
await dispatch(trimmed, commandTree, ctx);
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
239
|
+
console.error(chalk.red(`${Status.fail.symbol} Error: ${msg}`));
|
|
240
|
+
}
|
|
241
|
+
// Render metrics footer after each command
|
|
242
|
+
try {
|
|
243
|
+
await renderFooter();
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
// Non-fatal — skip footer if metrics fail
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Update prompt (connections may have changed)
|
|
250
|
+
updatePrompt();
|
|
251
|
+
// Check if rl is still open (exit/quit may have closed it)
|
|
252
|
+
if (!rlAny.closed) {
|
|
253
|
+
rl.prompt();
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
rl.on('close', () => {
|
|
257
|
+
console.log();
|
|
258
|
+
process.exit(0);
|
|
259
|
+
});
|
|
260
|
+
// Handle SIGINT (Ctrl-C) — cancel current line, don't exit
|
|
261
|
+
rl.on('SIGINT', () => {
|
|
262
|
+
rlAny.line = '';
|
|
263
|
+
rlAny.cursor = 0;
|
|
264
|
+
console.log();
|
|
265
|
+
updatePrompt();
|
|
266
|
+
rl.prompt();
|
|
267
|
+
});
|
|
268
|
+
// Wait for the readline to close
|
|
269
|
+
await new Promise((resolve) => {
|
|
270
|
+
rl.on('close', resolve);
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
//# 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"}
|