@calltelemetry/cli 0.4.26 → 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/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/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,14 @@
|
|
|
1
|
+
import type { ShellContext } from '../context.js';
|
|
2
|
+
/**
|
|
3
|
+
* users list — list all users across all organizations
|
|
4
|
+
*/
|
|
5
|
+
export declare function usersListHandler(_args: string[], _opts: Record<string, string>, _ctx: ShellContext): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* users reset-password — reset a user's password by user ID
|
|
8
|
+
*/
|
|
9
|
+
export declare function usersResetPasswordHandler(args: string[], _opts: Record<string, string>, ctx: ShellContext): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Wire user handlers into the command tree.
|
|
12
|
+
*/
|
|
13
|
+
export declare function wireUsersHandlers(): void;
|
|
14
|
+
//# sourceMappingURL=users.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/shell/commands/users.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAKlD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAkCf;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,EAAE,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CASxC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { table, statusLine, banner } from '../formatter.js';
|
|
2
|
+
import { commandTree } from './registry.js';
|
|
3
|
+
import { listOrgs, listOrgUsers, resetUserPassword, generateUserPassword } from '../../lib/users.js';
|
|
4
|
+
/**
|
|
5
|
+
* users list — list all users across all organizations
|
|
6
|
+
*/
|
|
7
|
+
export async function usersListHandler(_args, _opts, _ctx) {
|
|
8
|
+
try {
|
|
9
|
+
const orgs = await listOrgs();
|
|
10
|
+
if (orgs.length === 0) {
|
|
11
|
+
console.log('No organizations found.');
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
for (const org of orgs) {
|
|
15
|
+
console.log(banner(`Organization: ${org.name}`));
|
|
16
|
+
const users = await listOrgUsers(org.id);
|
|
17
|
+
if (users.length === 0) {
|
|
18
|
+
console.log(' No users.');
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const rows = users.map(u => [
|
|
22
|
+
String(u.id),
|
|
23
|
+
u.email,
|
|
24
|
+
u.role,
|
|
25
|
+
u.roles.join(', ') || '-',
|
|
26
|
+
]);
|
|
27
|
+
console.log(table(['ID', 'Email', 'Role', 'Roles'], rows));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
32
|
+
console.log(statusLine('Failed to list users', 'fail', msg));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* users reset-password — reset a user's password by user ID
|
|
37
|
+
*/
|
|
38
|
+
export async function usersResetPasswordHandler(args, _opts, ctx) {
|
|
39
|
+
const userIdStr = args[0];
|
|
40
|
+
if (!userIdStr) {
|
|
41
|
+
console.log('Usage: users reset-password <user-id>');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const userId = parseInt(userIdStr, 10);
|
|
45
|
+
if (isNaN(userId)) {
|
|
46
|
+
console.log(`% Invalid user ID "${userIdStr}"`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const question = (prompt) => new Promise(resolve => ctx.rl.question(prompt, resolve));
|
|
50
|
+
const answer = await question('Generate random password? [Y/n]: ');
|
|
51
|
+
let password;
|
|
52
|
+
if (answer.trim().toLowerCase() === 'n') {
|
|
53
|
+
password = await question('Enter new password: ');
|
|
54
|
+
if (!password || password.length < 8) {
|
|
55
|
+
console.log('% Password must be at least 8 characters');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
password = generateUserPassword();
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
await resetUserPassword(userId, password);
|
|
64
|
+
console.log(statusLine(`Password reset for user ${userId}`, 'ok'));
|
|
65
|
+
console.log(` New password: ${password}`);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
69
|
+
console.log(statusLine('Password reset failed', 'fail', msg));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Wire user handlers into the command tree.
|
|
74
|
+
*/
|
|
75
|
+
export function wireUsersHandlers() {
|
|
76
|
+
const usersNode = commandTree.children?.find(c => c.name === 'users');
|
|
77
|
+
if (!usersNode?.children)
|
|
78
|
+
return;
|
|
79
|
+
const listNode = usersNode.children.find(c => c.name === 'list');
|
|
80
|
+
if (listNode)
|
|
81
|
+
listNode.handler = usersListHandler;
|
|
82
|
+
const resetNode = usersNode.children.find(c => c.name === 'reset-password');
|
|
83
|
+
if (resetNode)
|
|
84
|
+
resetNode.handler = usersResetPasswordHandler;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/shell/commands/users.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CompleterResult } from 'node:readline';
|
|
2
|
+
import type { CommandNode } from './parser.js';
|
|
3
|
+
import type { ShellContext } from './context.js';
|
|
4
|
+
/**
|
|
5
|
+
* Create a readline-compatible completer function.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createCompleter(root: CommandNode, _ctx: ShellContext): (line: string) => CompleterResult;
|
|
8
|
+
/**
|
|
9
|
+
* Walk the tree to the current position and return valid next tokens.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getCompletions(line: string, root: CommandNode): string[];
|
|
12
|
+
/**
|
|
13
|
+
* Format IOS-style ? help output for the current line context.
|
|
14
|
+
*/
|
|
15
|
+
export declare function showHelp(line: string, root: CommandNode): string;
|
|
16
|
+
//# sourceMappingURL=completer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completer.d.ts","sourceRoot":"","sources":["../../src/shell/completer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,YAAY,GACjB,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,CASnC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAyDxE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CA+DhE"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { tokenize } from './parser.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a readline-compatible completer function.
|
|
4
|
+
*/
|
|
5
|
+
export function createCompleter(root, _ctx) {
|
|
6
|
+
return (line) => {
|
|
7
|
+
const completions = getCompletions(line, root);
|
|
8
|
+
// The partial word being completed
|
|
9
|
+
const tokens = tokenize(line);
|
|
10
|
+
const partial = line.endsWith(' ') ? '' : (tokens[tokens.length - 1] ?? '');
|
|
11
|
+
const hits = completions.filter(c => c.startsWith(partial));
|
|
12
|
+
return [hits.length > 0 ? hits : completions, partial];
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Walk the tree to the current position and return valid next tokens.
|
|
17
|
+
*/
|
|
18
|
+
export function getCompletions(line, root) {
|
|
19
|
+
const tokens = tokenize(line);
|
|
20
|
+
const trailingSpace = line.endsWith(' ');
|
|
21
|
+
let node = root;
|
|
22
|
+
let consumed = 0;
|
|
23
|
+
// Walk through fully-typed tokens
|
|
24
|
+
const tokensToWalk = trailingSpace ? tokens : tokens.slice(0, -1);
|
|
25
|
+
for (const token of tokensToWalk) {
|
|
26
|
+
if (token.startsWith('--')) {
|
|
27
|
+
consumed++;
|
|
28
|
+
// Skip option values
|
|
29
|
+
const optDef = node.options?.find(o => o.name === token);
|
|
30
|
+
if (optDef?.hasValue)
|
|
31
|
+
consumed++;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (node.children) {
|
|
35
|
+
const child = node.children.find(c => c.name === token);
|
|
36
|
+
if (child) {
|
|
37
|
+
node = child;
|
|
38
|
+
consumed++;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Unknown token — can't complete further
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
// Collect completions from current node
|
|
46
|
+
const completions = [];
|
|
47
|
+
if (node.children) {
|
|
48
|
+
const partial = (!trailingSpace && tokens.length > consumed)
|
|
49
|
+
? tokens[tokens.length - 1] ?? ''
|
|
50
|
+
: '';
|
|
51
|
+
for (const child of node.children) {
|
|
52
|
+
if (child.name.startsWith(partial)) {
|
|
53
|
+
completions.push(child.name);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (node.options) {
|
|
58
|
+
const partial = (!trailingSpace && tokens.length > consumed)
|
|
59
|
+
? tokens[tokens.length - 1] ?? ''
|
|
60
|
+
: '';
|
|
61
|
+
for (const opt of node.options) {
|
|
62
|
+
if (opt.name.startsWith(partial)) {
|
|
63
|
+
completions.push(opt.name);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return completions;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Format IOS-style ? help output for the current line context.
|
|
71
|
+
*/
|
|
72
|
+
export function showHelp(line, root) {
|
|
73
|
+
const tokens = tokenize(line);
|
|
74
|
+
const trailingSpace = line.endsWith(' ') || tokens.length === 0;
|
|
75
|
+
let node = root;
|
|
76
|
+
// Walk fully completed tokens
|
|
77
|
+
const tokensToWalk = trailingSpace ? tokens : tokens.slice(0, -1);
|
|
78
|
+
for (const token of tokensToWalk) {
|
|
79
|
+
if (token.startsWith('--'))
|
|
80
|
+
continue;
|
|
81
|
+
if (node.children) {
|
|
82
|
+
const child = node.children.find(c => c.name === token);
|
|
83
|
+
if (child) {
|
|
84
|
+
node = child;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return '% Unrecognized command\n';
|
|
89
|
+
}
|
|
90
|
+
const partial = (!trailingSpace && tokens.length > 0)
|
|
91
|
+
? tokens[tokens.length - 1] ?? ''
|
|
92
|
+
: '';
|
|
93
|
+
const lines = [];
|
|
94
|
+
// List matching children
|
|
95
|
+
if (node.children) {
|
|
96
|
+
const matches = partial
|
|
97
|
+
? node.children.filter(c => c.name.startsWith(partial))
|
|
98
|
+
: node.children;
|
|
99
|
+
// Find max name length for alignment
|
|
100
|
+
const maxLen = matches.reduce((max, c) => Math.max(max, c.name.length), 0);
|
|
101
|
+
for (const child of matches) {
|
|
102
|
+
lines.push(` ${child.name.padEnd(maxLen + 2)}${child.description}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// List matching options
|
|
106
|
+
if (node.options) {
|
|
107
|
+
const matches = partial
|
|
108
|
+
? node.options.filter(o => o.name.startsWith(partial))
|
|
109
|
+
: node.options;
|
|
110
|
+
const maxLen = matches.reduce((max, o) => Math.max(max, o.name.length), 0);
|
|
111
|
+
for (const opt of matches) {
|
|
112
|
+
lines.push(` ${opt.name.padEnd(maxLen + 2)}${opt.description}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Show <cr> if the current node has a handler (is executable)
|
|
116
|
+
if (node.handler && (trailingSpace || partial === '')) {
|
|
117
|
+
lines.push(' <cr>');
|
|
118
|
+
}
|
|
119
|
+
if (lines.length === 0) {
|
|
120
|
+
return '% No completions available\n';
|
|
121
|
+
}
|
|
122
|
+
return lines.join('\n') + '\n';
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=completer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completer.js","sourceRoot":"","sources":["../../src/shell/completer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type * as readline from 'node:readline';
|
|
2
|
+
export interface McpConnection {
|
|
3
|
+
name: string;
|
|
4
|
+
type: 'cucm' | 'dashboard' | 'phone' | 'ris';
|
|
5
|
+
}
|
|
6
|
+
export interface ShellContext {
|
|
7
|
+
rl: readline.Interface;
|
|
8
|
+
connections: Map<string, McpConnection>;
|
|
9
|
+
backend: 'compose' | 'k8s';
|
|
10
|
+
historyFile: string;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/shell/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,KAAK,CAAC;CAE9C;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC;IACvB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxC,OAAO,EAAE,SAAS,GAAG,KAAK,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/shell/context.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render a single-line metrics footer after each command.
|
|
3
|
+
*
|
|
4
|
+
* ─────────────────────────────────────────────────────
|
|
5
|
+
* CPU ██░░ 12% │ RAM ████░░ 61% │ Disk ███░ 78%
|
|
6
|
+
*/
|
|
7
|
+
export declare function renderFooter(): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=footer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../src/shell/footer.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAwClD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import { Box, thresholdColor } from './theme.js';
|
|
4
|
+
import { meterBar } from './sparkline.js';
|
|
5
|
+
/**
|
|
6
|
+
* Render a single-line metrics footer after each command.
|
|
7
|
+
*
|
|
8
|
+
* ─────────────────────────────────────────────────────
|
|
9
|
+
* CPU ██░░ 12% │ RAM ████░░ 61% │ Disk ███░ 78%
|
|
10
|
+
*/
|
|
11
|
+
export async function renderFooter() {
|
|
12
|
+
const width = Math.min(process.stdout.columns ?? 60, 70);
|
|
13
|
+
// Gather metrics synchronously where possible
|
|
14
|
+
const totalMem = os.totalmem();
|
|
15
|
+
const freeMem = os.freemem();
|
|
16
|
+
const usedMem = totalMem - freeMem;
|
|
17
|
+
const ramPct = Math.round((usedMem / totalMem) * 100);
|
|
18
|
+
const cpus = os.cpus();
|
|
19
|
+
const load1m = os.loadavg()[0];
|
|
20
|
+
const cpuPct = Math.min(100, Math.round((load1m / cpus.length) * 100));
|
|
21
|
+
// Disk — async but quick
|
|
22
|
+
let diskPct = 0;
|
|
23
|
+
try {
|
|
24
|
+
const { execa } = await import('execa');
|
|
25
|
+
const { stdout } = await execa('df', ['-h', '/']);
|
|
26
|
+
const lines = stdout.split('\n');
|
|
27
|
+
if (lines.length >= 2) {
|
|
28
|
+
const match = lines[1].match(/(\d+)%/);
|
|
29
|
+
diskPct = match ? parseInt(match[1], 10) : 0;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// leave at 0
|
|
34
|
+
}
|
|
35
|
+
const cpuColor = thresholdColor(cpuPct);
|
|
36
|
+
const ramColor = thresholdColor(ramPct);
|
|
37
|
+
const diskColor = thresholdColor(diskPct);
|
|
38
|
+
const cpuBar = meterBar(cpuPct, 8);
|
|
39
|
+
const ramBar = meterBar(ramPct, 8);
|
|
40
|
+
const diskBar = meterBar(diskPct, 8);
|
|
41
|
+
const sep = chalk.dim(` ${Box.v} `);
|
|
42
|
+
const line = chalk.dim(Box.h.repeat(width));
|
|
43
|
+
const metrics = `${chalk.bold('CPU')} ${cpuBar}${sep}${chalk.bold('RAM')} ${ramBar}${sep}${chalk.bold('Disk')} ${diskBar}`;
|
|
44
|
+
console.log(line);
|
|
45
|
+
console.log(metrics);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footer.js","sourceRoot":"","sources":["../../src/shell/footer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import type { StatusKey } from './theme.js';
|
|
3
|
+
/**
|
|
4
|
+
* Render a Unicode box-drawing table with auto-sized columns.
|
|
5
|
+
*
|
|
6
|
+
* ┌──────────────────┬──────────┬─────────────┬────────────┐
|
|
7
|
+
* │ Device │ Model │ IP │ Status │
|
|
8
|
+
* ├──────────────────┼──────────┼─────────────┼────────────┤
|
|
9
|
+
* │ SEP001122334455 │ CP-8845 │ 192.168.1.1 │ ● Registered│
|
|
10
|
+
* └──────────────────┴──────────┴─────────────┴────────────┘
|
|
11
|
+
*/
|
|
12
|
+
export declare function table(headers: string[], rows: string[][], opts?: {
|
|
13
|
+
maxWidth?: number;
|
|
14
|
+
title?: string;
|
|
15
|
+
borderColor?: typeof chalk.green;
|
|
16
|
+
}): string;
|
|
17
|
+
/**
|
|
18
|
+
* Render a status line with symbol and color.
|
|
19
|
+
* ✓ Admin API — responding (12ms)
|
|
20
|
+
* ✗ SFTP — connection timeout
|
|
21
|
+
*/
|
|
22
|
+
export declare function statusLine(label: string, status: StatusKey, detail?: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Render a bold section banner spanning the terminal width.
|
|
25
|
+
* ━━━ System Health ━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
26
|
+
*/
|
|
27
|
+
export declare function banner(text: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Render key-value pairs with right-aligned keys and colored values.
|
|
30
|
+
* Version: 0.8.5
|
|
31
|
+
* Backend: Docker Compose
|
|
32
|
+
* Uptime: 12d 4h 23m
|
|
33
|
+
*/
|
|
34
|
+
export declare function kv(pairs: [string, string][]): string;
|
|
35
|
+
/**
|
|
36
|
+
* Render step-progress lines for multi-step operations.
|
|
37
|
+
* ✓ Exporting tables (2.3s)
|
|
38
|
+
* ● Compressing data...
|
|
39
|
+
* ○ Uploading to S3
|
|
40
|
+
*/
|
|
41
|
+
export declare function stepProgress(stepName: string, status: 'running' | 'done' | 'fail' | 'waiting', detail?: string): string;
|
|
42
|
+
/**
|
|
43
|
+
* Render a progress bar with percentage and optional size info.
|
|
44
|
+
* [████████████░░░░░░░░] 62% 4.2 GB / 6.8 GB
|
|
45
|
+
*/
|
|
46
|
+
export declare function progressBar(pct: number, width?: number, detail?: string): string;
|
|
47
|
+
//# sourceMappingURL=formatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/shell/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;;;;;GAQG;AACH,wBAAgB,KAAK,CACnB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,IAAI,CAAC,EAAE;IACL,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,KAAK,CAAC,KAAK,CAAC;CAClC,GACA,MAAM,CAyER;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAKR;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK3C;AAED;;;;;GAKG;AACH,wBAAgB,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAKpD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,EAC/C,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAUR;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAI5E"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { Status, Box, visibleLength, padEnd, truncate } from './theme.js';
|
|
3
|
+
import { meterBar } from './sparkline.js';
|
|
4
|
+
/**
|
|
5
|
+
* Render a Unicode box-drawing table with auto-sized columns.
|
|
6
|
+
*
|
|
7
|
+
* ┌──────────────────┬──────────┬─────────────┬────────────┐
|
|
8
|
+
* │ Device │ Model │ IP │ Status │
|
|
9
|
+
* ├──────────────────┼──────────┼─────────────┼────────────┤
|
|
10
|
+
* │ SEP001122334455 │ CP-8845 │ 192.168.1.1 │ ● Registered│
|
|
11
|
+
* └──────────────────┴──────────┴─────────────┴────────────┘
|
|
12
|
+
*/
|
|
13
|
+
export function table(headers, rows, opts) {
|
|
14
|
+
const maxWidth = opts?.maxWidth ?? process.stdout.columns ?? 120;
|
|
15
|
+
const border = opts?.borderColor ?? chalk.dim;
|
|
16
|
+
// Calculate column widths from content
|
|
17
|
+
const colWidths = headers.map((h, i) => {
|
|
18
|
+
let max = visibleLength(h);
|
|
19
|
+
for (const row of rows) {
|
|
20
|
+
const cell = row[i] ?? '';
|
|
21
|
+
max = Math.max(max, visibleLength(cell));
|
|
22
|
+
}
|
|
23
|
+
return max;
|
|
24
|
+
});
|
|
25
|
+
// Account for padding (1 space each side) and border characters
|
|
26
|
+
const totalBorderWidth = colWidths.length + 1; // │ between each col + outer │
|
|
27
|
+
const totalPadding = colWidths.length * 2; // 1 space padding each side
|
|
28
|
+
const totalContentWidth = colWidths.reduce((s, w) => s + w, 0);
|
|
29
|
+
const totalWidth = totalContentWidth + totalPadding + totalBorderWidth;
|
|
30
|
+
// Shrink columns proportionally if too wide
|
|
31
|
+
if (totalWidth > maxWidth && headers.length > 0) {
|
|
32
|
+
const availableForContent = maxWidth - totalPadding - totalBorderWidth;
|
|
33
|
+
if (availableForContent > headers.length * 4) {
|
|
34
|
+
const scale = availableForContent / totalContentWidth;
|
|
35
|
+
for (let i = 0; i < colWidths.length; i++) {
|
|
36
|
+
colWidths[i] = Math.max(4, Math.floor(colWidths[i] * scale));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const drawHLine = (left, mid, right, h) => {
|
|
41
|
+
const segments = colWidths.map((w) => h.repeat(w + 2));
|
|
42
|
+
return border(left + segments.join(mid) + right);
|
|
43
|
+
};
|
|
44
|
+
const drawRow = (cells) => {
|
|
45
|
+
const parts = cells.map((cell, i) => {
|
|
46
|
+
const w = colWidths[i] ?? visibleLength(cell);
|
|
47
|
+
const content = visibleLength(cell) > w ? truncate(cell, w) : padEnd(cell, w);
|
|
48
|
+
return ' ' + content + ' ';
|
|
49
|
+
});
|
|
50
|
+
return border(Box.v) + parts.join(border(Box.v)) + border(Box.v);
|
|
51
|
+
};
|
|
52
|
+
const lines = [];
|
|
53
|
+
// Title row
|
|
54
|
+
if (opts?.title) {
|
|
55
|
+
const innerWidth = colWidths.reduce((s, w) => s + w + 2, 0) + colWidths.length - 1;
|
|
56
|
+
lines.push(border(Box.tl + Box.h.repeat(innerWidth) + Box.tr));
|
|
57
|
+
const titlePadded = padEnd(` ${opts.title}`, innerWidth);
|
|
58
|
+
lines.push(border(Box.v) + chalk.bold(titlePadded) + border(Box.v));
|
|
59
|
+
lines.push(drawHLine(Box.lt, Box.tt, Box.rt, Box.h));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
lines.push(drawHLine(Box.tl, Box.tt, Box.tr, Box.h));
|
|
63
|
+
}
|
|
64
|
+
// Header row
|
|
65
|
+
lines.push(drawRow(headers.map((h) => chalk.bold(h))));
|
|
66
|
+
// Header separator
|
|
67
|
+
lines.push(drawHLine(Box.lt, Box.x, Box.rt, Box.h));
|
|
68
|
+
// Data rows
|
|
69
|
+
for (const row of rows) {
|
|
70
|
+
lines.push(drawRow(row));
|
|
71
|
+
}
|
|
72
|
+
// Bottom border
|
|
73
|
+
lines.push(drawHLine(Box.bl, Box.bt, Box.br, Box.h));
|
|
74
|
+
return lines.join('\n');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Render a status line with symbol and color.
|
|
78
|
+
* ✓ Admin API — responding (12ms)
|
|
79
|
+
* ✗ SFTP — connection timeout
|
|
80
|
+
*/
|
|
81
|
+
export function statusLine(label, status, detail) {
|
|
82
|
+
const s = Status[status] ?? Status.info;
|
|
83
|
+
const symbol = s.color(s.symbol);
|
|
84
|
+
const suffix = detail ? chalk.dim(` \u2014 ${detail}`) : '';
|
|
85
|
+
return `${symbol} ${s.color(label)}${suffix}`;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Render a bold section banner spanning the terminal width.
|
|
89
|
+
* ━━━ System Health ━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
90
|
+
*/
|
|
91
|
+
export function banner(text) {
|
|
92
|
+
const width = Math.min(process.stdout.columns ?? 60, 60);
|
|
93
|
+
const prefix = Box.hBold.repeat(3) + ' ';
|
|
94
|
+
const suffix = ' ' + Box.hBold.repeat(Math.max(0, width - text.length - 6));
|
|
95
|
+
return '\n' + chalk.bold(prefix + text + suffix);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Render key-value pairs with right-aligned keys and colored values.
|
|
99
|
+
* Version: 0.8.5
|
|
100
|
+
* Backend: Docker Compose
|
|
101
|
+
* Uptime: 12d 4h 23m
|
|
102
|
+
*/
|
|
103
|
+
export function kv(pairs) {
|
|
104
|
+
const maxKeyLen = pairs.reduce((max, [k]) => Math.max(max, k.length), 0);
|
|
105
|
+
return pairs
|
|
106
|
+
.map(([k, v]) => ` ${chalk.dim(k.padStart(maxKeyLen))}: ${chalk.cyan(v)}`)
|
|
107
|
+
.join('\n');
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Render step-progress lines for multi-step operations.
|
|
111
|
+
* ✓ Exporting tables (2.3s)
|
|
112
|
+
* ● Compressing data...
|
|
113
|
+
* ○ Uploading to S3
|
|
114
|
+
*/
|
|
115
|
+
export function stepProgress(stepName, status, detail) {
|
|
116
|
+
const indicators = {
|
|
117
|
+
done: { symbol: Status.ok.symbol, color: chalk.green },
|
|
118
|
+
running: { symbol: Status.running.symbol, color: chalk.cyan },
|
|
119
|
+
fail: { symbol: Status.fail.symbol, color: chalk.red },
|
|
120
|
+
waiting: { symbol: Status.waiting.symbol, color: chalk.gray },
|
|
121
|
+
};
|
|
122
|
+
const ind = indicators[status] ?? indicators.running;
|
|
123
|
+
const suffix = detail ? chalk.dim(` (${detail})`) : '';
|
|
124
|
+
return ` ${ind.color(ind.symbol)} ${ind.color(stepName)}${suffix}`;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Render a progress bar with percentage and optional size info.
|
|
128
|
+
* [████████████░░░░░░░░] 62% 4.2 GB / 6.8 GB
|
|
129
|
+
*/
|
|
130
|
+
export function progressBar(pct, width = 20, detail) {
|
|
131
|
+
const bar = meterBar(pct, width);
|
|
132
|
+
const suffix = detail ? ` ${chalk.dim(detail)}` : '';
|
|
133
|
+
return ` ${bar}${suffix}`;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../src/shell/formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stub MCP bridge — will be replaced with real stdio child-process bridge.
|
|
3
|
+
*/
|
|
4
|
+
export declare class McpBridge {
|
|
5
|
+
name: string;
|
|
6
|
+
type: string;
|
|
7
|
+
host: string;
|
|
8
|
+
constructor(name: string, type: string, host: string);
|
|
9
|
+
connect(): Promise<void>;
|
|
10
|
+
callTool(name: string, _params: Record<string, unknown>): Promise<unknown>;
|
|
11
|
+
close(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=mcp-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-bridge.d.ts","sourceRoot":"","sources":["../../src/shell/mcp-bridge.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,SAAS;IAEX,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;gBAFZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM;IAGf,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIhF,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stub MCP bridge — will be replaced with real stdio child-process bridge.
|
|
3
|
+
*/
|
|
4
|
+
export class McpBridge {
|
|
5
|
+
name;
|
|
6
|
+
type;
|
|
7
|
+
host;
|
|
8
|
+
constructor(name, type, host) {
|
|
9
|
+
this.name = name;
|
|
10
|
+
this.type = type;
|
|
11
|
+
this.host = host;
|
|
12
|
+
}
|
|
13
|
+
async connect() {
|
|
14
|
+
/* TODO: spawn child process */
|
|
15
|
+
}
|
|
16
|
+
async callTool(name, _params) {
|
|
17
|
+
throw new Error(`MCP bridge not yet implemented — cannot call tool "${name}"`);
|
|
18
|
+
}
|
|
19
|
+
close() {
|
|
20
|
+
/* TODO: kill child process */
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=mcp-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-bridge.js","sourceRoot":"","sources":["../../src/shell/mcp-bridge.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,SAAS;IAEX;IACA;IACA;IAHT,YACS,IAAY,EACZ,IAAY,EACZ,IAAY;QAFZ,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;IAClB,CAAC;IAEJ,KAAK,CAAC,OAAO;QACX,+BAA+B;IACjC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,OAAgC;QAC3D,MAAM,IAAI,KAAK,CAAC,sDAAsD,IAAI,GAAG,CAAC,CAAC;IACjF,CAAC;IAED,KAAK;QACH,8BAA8B;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ShellContext } from './context.js';
|
|
2
|
+
export interface OptionDef {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
hasValue: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface CommandNode {
|
|
8
|
+
name: string;
|
|
9
|
+
description: string;
|
|
10
|
+
children?: CommandNode[];
|
|
11
|
+
options?: OptionDef[];
|
|
12
|
+
handler?: (args: string[], opts: Record<string, string>, ctx: ShellContext) => Promise<void>;
|
|
13
|
+
requiresMcp?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Split input into tokens, respecting quoted strings.
|
|
17
|
+
*/
|
|
18
|
+
export declare function tokenize(input: string): string[];
|
|
19
|
+
/**
|
|
20
|
+
* Walk the command tree consuming tokens, extracting --options.
|
|
21
|
+
* Returns the deepest matched node, remaining positional args, and parsed options.
|
|
22
|
+
*/
|
|
23
|
+
export declare function walkTree(tokens: string[], root: CommandNode): {
|
|
24
|
+
node: CommandNode;
|
|
25
|
+
remaining: string[];
|
|
26
|
+
opts: Record<string, string>;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Tokenize input, walk the command tree, and call the handler.
|
|
30
|
+
* Prints error messages for unknown or incomplete commands.
|
|
31
|
+
*/
|
|
32
|
+
export declare function dispatch(input: string, root: CommandNode, ctx: ShellContext): Promise<void>;
|
|
33
|
+
//# sourceMappingURL=parser.d.ts.map
|