@redonvn/cli 0.1.6 → 0.1.7

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.
@@ -0,0 +1,20 @@
1
+ export declare const REDAI_PERMISSIONS_FILE: string;
2
+ /**
3
+ * Các tool name mà CLI có thể nhận từ backend. Dùng làm danh sách chuẩn
4
+ * khi hiển thị trạng thái và validate input lệnh permission.
5
+ */
6
+ export declare const ALL_TOOL_NAMES: readonly ["Read", "Write", "Edit", "Bash", "Grep", "Glob", "WebFetch", "RunClaude", "RunCodex", "RunGemini", "LLMRequest", "McpCall", "McpList"];
7
+ export type ToolPermissionName = (typeof ALL_TOOL_NAMES)[number];
8
+ /**
9
+ * Map { ToolName → enabled }.
10
+ * Tool không có trong map = enabled (mặc định cho phép tất cả).
11
+ */
12
+ export type PermissionsMap = Partial<Record<ToolPermissionName, boolean>>;
13
+ export declare function loadPermissions(): PermissionsMap;
14
+ export declare function savePermissions(perms: PermissionsMap): void;
15
+ /**
16
+ * Kiểm tra tool có được phép chạy không.
17
+ * Tool không có trong file = allowed (whitelist trống = tất cả OK).
18
+ */
19
+ export declare function isToolAllowed(toolName: string, perms: PermissionsMap): boolean;
20
+ export declare function setToolPermission(toolName: ToolPermissionName, enabled: boolean): PermissionsMap;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ALL_TOOL_NAMES = exports.REDAI_PERMISSIONS_FILE = void 0;
7
+ exports.loadPermissions = loadPermissions;
8
+ exports.savePermissions = savePermissions;
9
+ exports.isToolAllowed = isToolAllowed;
10
+ exports.setToolPermission = setToolPermission;
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const config_1 = require("../config");
14
+ exports.REDAI_PERMISSIONS_FILE = path_1.default.join(config_1.REDAI_CONFIG_DIR, 'permissions.json');
15
+ /**
16
+ * Các tool name mà CLI có thể nhận từ backend. Dùng làm danh sách chuẩn
17
+ * khi hiển thị trạng thái và validate input lệnh permission.
18
+ */
19
+ exports.ALL_TOOL_NAMES = [
20
+ 'Read',
21
+ 'Write',
22
+ 'Edit',
23
+ 'Bash',
24
+ 'Grep',
25
+ 'Glob',
26
+ 'WebFetch',
27
+ 'RunClaude',
28
+ 'RunCodex',
29
+ 'RunGemini',
30
+ 'LLMRequest',
31
+ 'McpCall',
32
+ 'McpList',
33
+ ];
34
+ function ensureDir() {
35
+ if (!fs_1.default.existsSync(config_1.REDAI_CONFIG_DIR)) {
36
+ fs_1.default.mkdirSync(config_1.REDAI_CONFIG_DIR, { recursive: true, mode: 0o700 });
37
+ }
38
+ }
39
+ function loadPermissions() {
40
+ if (!fs_1.default.existsSync(exports.REDAI_PERMISSIONS_FILE))
41
+ return {};
42
+ try {
43
+ const raw = fs_1.default.readFileSync(exports.REDAI_PERMISSIONS_FILE, 'utf8');
44
+ return JSON.parse(raw);
45
+ }
46
+ catch {
47
+ return {};
48
+ }
49
+ }
50
+ function savePermissions(perms) {
51
+ ensureDir();
52
+ fs_1.default.writeFileSync(exports.REDAI_PERMISSIONS_FILE, JSON.stringify(perms, null, 2), {
53
+ encoding: 'utf8',
54
+ mode: 0o600,
55
+ });
56
+ }
57
+ /**
58
+ * Kiểm tra tool có được phép chạy không.
59
+ * Tool không có trong file = allowed (whitelist trống = tất cả OK).
60
+ */
61
+ function isToolAllowed(toolName, perms) {
62
+ const key = toolName;
63
+ if (!(key in perms))
64
+ return true;
65
+ return perms[key] !== false;
66
+ }
67
+ function setToolPermission(toolName, enabled) {
68
+ const perms = loadPermissions();
69
+ perms[toolName] = enabled;
70
+ savePermissions(perms);
71
+ return perms;
72
+ }
73
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/auth/permissions.ts"],"names":[],"mappings":";;;;;;AAwCA,0CAQC;AAED,0CAMC;AAMD,sCAIC;AAED,8CAKC;AAzED,4CAAoB;AACpB,gDAAwB;AACxB,sCAA6C;AAEhC,QAAA,sBAAsB,GAAG,cAAI,CAAC,IAAI,CAAC,yBAAgB,EAAE,kBAAkB,CAAC,CAAC;AAEtF;;;GAGG;AACU,QAAA,cAAc,GAAG;IAC5B,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,UAAU;IACV,WAAW;IACX,UAAU;IACV,WAAW;IACX,YAAY;IACZ,SAAS;IACT,SAAS;CACD,CAAC;AAUX,SAAS,SAAS;IAChB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,yBAAgB,CAAC,EAAE,CAAC;QACrC,YAAE,CAAC,SAAS,CAAC,yBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,SAAgB,eAAe;IAC7B,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,8BAAsB,CAAC;QAAE,OAAO,EAAE,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,8BAAsB,EAAE,MAAM,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,KAAqB;IACnD,SAAS,EAAE,CAAC;IACZ,YAAE,CAAC,aAAa,CAAC,8BAAsB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QACvE,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAAC,QAAgB,EAAE,KAAqB;IACnE,MAAM,GAAG,GAAG,QAA8B,CAAC;IAC3C,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC;AAC9B,CAAC;AAED,SAAgB,iBAAiB,CAAC,QAA4B,EAAE,OAAgB;IAC9E,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,KAAK,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;IAC1B,eAAe,CAAC,KAAK,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,6 +1,6 @@
1
1
  /** Env baked at build time. Runtime flag `--env` / `REDAI_ENV` vẫn override được. */
2
2
  export declare const BUILD_ENV: 'dev' | 'prod';
3
3
  /** Package version đọc từ package.json lúc build. Đồng bộ với npm version. */
4
- export declare const PKG_VERSION = "0.1.6";
4
+ export declare const PKG_VERSION = "0.1.7";
5
5
  /** ISO timestamp lúc build (informational). */
6
- export declare const BUILD_TIME = "2026-05-18T06:28:03.566Z";
6
+ export declare const BUILD_TIME = "2026-05-18T09:38:01.024Z";
@@ -6,7 +6,7 @@ exports.BUILD_TIME = exports.PKG_VERSION = exports.BUILD_ENV = void 0;
6
6
  /** Env baked at build time. Runtime flag `--env` / `REDAI_ENV` vẫn override được. */
7
7
  exports.BUILD_ENV = 'dev';
8
8
  /** Package version đọc từ package.json lúc build. Đồng bộ với npm version. */
9
- exports.PKG_VERSION = '0.1.6';
9
+ exports.PKG_VERSION = '0.1.7';
10
10
  /** ISO timestamp lúc build (informational). */
11
- exports.BUILD_TIME = '2026-05-18T06:28:03.566Z';
11
+ exports.BUILD_TIME = '2026-05-18T09:38:01.024Z';
12
12
  //# sourceMappingURL=build-info.js.map
@@ -0,0 +1,20 @@
1
+ /**
2
+ * redai mcp list
3
+ * List tất cả MCP server đã config và tool available của từng server.
4
+ */
5
+ export declare function mcpListCommand(): Promise<void>;
6
+ /**
7
+ * redai mcp add [server]
8
+ * Thêm MCP server vào ~/.redai/mcp.json từ catalog hoặc theo tên trực tiếp.
9
+ */
10
+ export declare function mcpAddCommand(serverArg?: string): Promise<void>;
11
+ /**
12
+ * redai mcp remove <server>
13
+ * Xóa MCP server khỏi ~/.redai/mcp.json.
14
+ */
15
+ export declare function mcpRemoveCommand(serverName: string): Promise<void>;
16
+ /**
17
+ * redai mcp test <server>
18
+ * Ping 1 MCP server cụ thể — spawn, list tools, verify hoạt động.
19
+ */
20
+ export declare function mcpTestCommand(serverName: string): Promise<void>;
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.mcpListCommand = mcpListCommand;
7
+ exports.mcpAddCommand = mcpAddCommand;
8
+ exports.mcpRemoveCommand = mcpRemoveCommand;
9
+ exports.mcpTestCommand = mcpTestCommand;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const prompts_1 = __importDefault(require("prompts"));
12
+ const config_1 = require("../../mcp/config");
13
+ const client_1 = require("../../mcp/client");
14
+ /**
15
+ * redai mcp list
16
+ * List tất cả MCP server đã config và tool available của từng server.
17
+ */
18
+ async function mcpListCommand() {
19
+ const servers = (0, config_1.loadMcpConfig)();
20
+ const names = Object.keys(servers);
21
+ if (names.length === 0) {
22
+ console.log(chalk_1.default.yellow('No MCP servers configured.'));
23
+ console.log(chalk_1.default.dim(`Add servers to: ${(0, config_1.getMcpConfigPath)()}`));
24
+ console.log();
25
+ console.log(chalk_1.default.dim('Example ~/.redai/mcp.json:'));
26
+ console.log(chalk_1.default.dim(JSON.stringify({
27
+ servers: {
28
+ chrome: {
29
+ command: 'npx',
30
+ args: ['-y', '@modelcontextprotocol/server-puppeteer'],
31
+ transport: 'stdio',
32
+ },
33
+ },
34
+ }, null, 2)));
35
+ return;
36
+ }
37
+ console.log(chalk_1.default.cyan(`MCP servers (${names.length})`), chalk_1.default.dim((0, config_1.getMcpConfigPath)()));
38
+ console.log();
39
+ for (const name of names) {
40
+ const cfg = servers[name];
41
+ console.log(` ${chalk_1.default.bold(name)} ${chalk_1.default.dim(`${cfg.command} ${(cfg.args ?? []).join(' ')}`)}`);
42
+ try {
43
+ const client = await client_1.mcpClientPool.getClient(name);
44
+ const { tools } = await client.listTools();
45
+ if (tools.length === 0) {
46
+ console.log(chalk_1.default.dim(' (no tools)'));
47
+ }
48
+ else {
49
+ for (const t of tools) {
50
+ console.log(` ${chalk_1.default.green('✓')} ${t.name}${t.description ? chalk_1.default.dim(' — ' + t.description) : ''}`);
51
+ }
52
+ }
53
+ }
54
+ catch (err) {
55
+ console.log(` ${chalk_1.default.red('✗')} ${err instanceof Error ? err.message : String(err)}`);
56
+ }
57
+ console.log();
58
+ }
59
+ await client_1.mcpClientPool.shutdown();
60
+ }
61
+ /**
62
+ * redai mcp add [server]
63
+ * Thêm MCP server vào ~/.redai/mcp.json từ catalog hoặc theo tên trực tiếp.
64
+ */
65
+ async function mcpAddCommand(serverArg) {
66
+ const existing = (0, config_1.loadMcpConfig)();
67
+ // Direct add by name from catalog
68
+ if (serverArg) {
69
+ const entry = config_1.MCP_CATALOG.find((e) => e.name === serverArg);
70
+ if (!entry) {
71
+ console.error(chalk_1.default.red(`Server "${serverArg}" not found in catalog.`));
72
+ console.error(chalk_1.default.dim(`Available: ${config_1.MCP_CATALOG.map((e) => e.name).join(', ')}`));
73
+ process.exitCode = 1;
74
+ return;
75
+ }
76
+ if (existing[entry.name]) {
77
+ console.log(chalk_1.default.yellow(`"${entry.name}" is already configured. Use 'redai mcp remove ${entry.name}' first.`));
78
+ return;
79
+ }
80
+ existing[entry.name] = entry.config;
81
+ (0, config_1.saveMcpConfig)(existing);
82
+ console.log(chalk_1.default.green(`✓ Added "${entry.name}" to ${(0, config_1.getMcpConfigPath)()}`));
83
+ if (entry.config.env) {
84
+ const keys = Object.keys(entry.config.env);
85
+ console.log(chalk_1.default.yellow(` Set env vars: ${keys.join(', ')}`));
86
+ console.log(chalk_1.default.dim(` Edit ${(0, config_1.getMcpConfigPath)()} to fill in your credentials.`));
87
+ }
88
+ return;
89
+ }
90
+ // Interactive catalog picker
91
+ const choices = config_1.MCP_CATALOG.map((entry) => ({
92
+ title: chalk_1.default.bold(entry.name),
93
+ description: `${entry.description} · ${chalk_1.default.dim(entry.tools)}`,
94
+ value: entry.name,
95
+ disabled: !!existing[entry.name],
96
+ }));
97
+ const response = await (0, prompts_1.default)([
98
+ {
99
+ type: 'multiselect',
100
+ name: 'servers',
101
+ message: 'Select MCP servers to add (space to toggle, enter to confirm):',
102
+ choices,
103
+ hint: '(already added servers are disabled)',
104
+ },
105
+ ]);
106
+ if (!response.servers || response.servers.length === 0) {
107
+ console.log(chalk_1.default.dim('No servers selected.'));
108
+ return;
109
+ }
110
+ const selected = response.servers;
111
+ for (const name of selected) {
112
+ const entry = config_1.MCP_CATALOG.find((e) => e.name === name);
113
+ existing[name] = entry.config;
114
+ console.log(chalk_1.default.green(` ✓ ${name}`));
115
+ if (entry.config.env) {
116
+ const keys = Object.keys(entry.config.env);
117
+ console.log(chalk_1.default.yellow(` Set env vars: ${keys.join(', ')}`));
118
+ }
119
+ }
120
+ (0, config_1.saveMcpConfig)(existing);
121
+ console.log();
122
+ console.log(chalk_1.default.cyan(`Saved to ${(0, config_1.getMcpConfigPath)()}`));
123
+ if (selected.some((n) => config_1.MCP_CATALOG.find((e) => e.name === n)?.config.env)) {
124
+ console.log(chalk_1.default.dim(`Edit the file to fill in your API keys / tokens.`));
125
+ }
126
+ }
127
+ /**
128
+ * redai mcp remove <server>
129
+ * Xóa MCP server khỏi ~/.redai/mcp.json.
130
+ */
131
+ async function mcpRemoveCommand(serverName) {
132
+ const existing = (0, config_1.loadMcpConfig)();
133
+ if (!(serverName in existing)) {
134
+ console.error(chalk_1.default.red(`Server "${serverName}" not found in config.`));
135
+ console.error(chalk_1.default.dim(`Configured: ${Object.keys(existing).join(', ') || '(none)'}`));
136
+ process.exitCode = 1;
137
+ return;
138
+ }
139
+ delete existing[serverName];
140
+ (0, config_1.saveMcpConfig)(existing);
141
+ console.log(chalk_1.default.green(`✓ Removed "${serverName}" from ${(0, config_1.getMcpConfigPath)()}`));
142
+ }
143
+ /**
144
+ * redai mcp test <server>
145
+ * Ping 1 MCP server cụ thể — spawn, list tools, verify hoạt động.
146
+ */
147
+ async function mcpTestCommand(serverName) {
148
+ const servers = (0, config_1.loadMcpConfig)();
149
+ if (!(serverName in servers)) {
150
+ console.error(chalk_1.default.red(`Server "${serverName}" not found in ~/.redai/mcp.json`));
151
+ console.error(chalk_1.default.dim(`Available: ${Object.keys(servers).join(', ') || '(none)'}`));
152
+ process.exitCode = 1;
153
+ return;
154
+ }
155
+ const cfg = servers[serverName];
156
+ console.log(chalk_1.default.dim(`Testing MCP server: ${chalk_1.default.bold(serverName)}`));
157
+ console.log(chalk_1.default.dim(` command: ${cfg.command} ${(cfg.args ?? []).join(' ')}`));
158
+ console.log();
159
+ try {
160
+ const client = await client_1.mcpClientPool.getClient(serverName);
161
+ const { tools } = await client.listTools();
162
+ console.log(chalk_1.default.green(`✓ Connected. ${tools.length} tool(s) available:`));
163
+ for (const t of tools) {
164
+ console.log(` • ${chalk_1.default.bold(t.name)}${t.description ? chalk_1.default.dim(' — ' + t.description) : ''}`);
165
+ }
166
+ }
167
+ catch (err) {
168
+ console.error(chalk_1.default.red('✗ Failed:'), err instanceof Error ? err.message : String(err));
169
+ process.exitCode = 1;
170
+ }
171
+ finally {
172
+ await client_1.mcpClientPool.shutdown();
173
+ }
174
+ }
175
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/cli/commands/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function permissionCommand(argv: string[]): Promise<void>;
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.permissionCommand = permissionCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const prompts_1 = __importDefault(require("prompts"));
9
+ const permissions_1 = require("../../auth/permissions");
10
+ // ─── Group tools by category for a cleaner display ────────────────────────────
11
+ const TOOL_GROUPS = [
12
+ { label: 'File System', tools: ['Read', 'Write', 'Edit', 'Grep', 'Glob'] },
13
+ { label: 'Shell', tools: ['Bash'] },
14
+ { label: 'Network', tools: ['WebFetch'] },
15
+ { label: 'AI Agents', tools: ['RunClaude', 'RunCodex', 'RunGemini', 'LLMRequest'] },
16
+ { label: 'MCP', tools: ['McpCall', 'McpList'] },
17
+ ];
18
+ const TOOL_DESC = {
19
+ Read: 'Read file contents',
20
+ Write: 'Create / overwrite files',
21
+ Edit: 'Find-and-replace inside files',
22
+ Grep: 'Search file content (ripgrep)',
23
+ Glob: 'Find files by pattern',
24
+ Bash: 'Run shell commands ⚠ high-risk',
25
+ WebFetch: 'Fetch URLs from this machine',
26
+ RunClaude: 'Spawn Claude Code agent',
27
+ RunCodex: 'Spawn Codex CLI agent',
28
+ RunGemini: 'Spawn Gemini CLI agent',
29
+ LLMRequest: 'Proxy LLM API via OAuth token',
30
+ McpCall: 'Call MCP server tool',
31
+ McpList: 'List MCP server tools',
32
+ };
33
+ // ─── Plain list (non-interactive fallback) ─────────────────────────────────────
34
+ function printList() {
35
+ const perms = (0, permissions_1.loadPermissions)();
36
+ console.log();
37
+ console.log(chalk_1.default.bold.cyan(' RedAI CLI — Tool Permissions'));
38
+ console.log(chalk_1.default.dim(' ~/.redai/permissions.json'));
39
+ console.log();
40
+ for (const group of TOOL_GROUPS) {
41
+ console.log(chalk_1.default.bold(` ${group.label}`));
42
+ for (const name of group.tools) {
43
+ const disabled = perms[name] === false;
44
+ const badge = disabled
45
+ ? chalk_1.default.bgRed.white(' DISABLED ')
46
+ : chalk_1.default.bgGreen.black(' ENABLED ');
47
+ const desc = chalk_1.default.dim(TOOL_DESC[name]);
48
+ console.log(` ${badge} ${chalk_1.default.bold(name.padEnd(12))} ${desc}`);
49
+ }
50
+ console.log();
51
+ }
52
+ const disabledCount = permissions_1.ALL_TOOL_NAMES.filter((n) => perms[n] === false).length;
53
+ if (disabledCount > 0) {
54
+ console.log(chalk_1.default.yellow(` ${disabledCount} tool(s) disabled.`));
55
+ }
56
+ else {
57
+ console.log(chalk_1.default.green(' All tools enabled.'));
58
+ }
59
+ console.log();
60
+ console.log(chalk_1.default.dim(' Run `redai permission` (no args) for interactive mode.'));
61
+ console.log();
62
+ }
63
+ // ─── Interactive multi-select with checkboxes ─────────────────────────────────
64
+ async function interactiveMode() {
65
+ const perms = (0, permissions_1.loadPermissions)();
66
+ // Build choices: currently-enabled tools are pre-selected
67
+ const choices = permissions_1.ALL_TOOL_NAMES.map((name) => ({
68
+ title: `${chalk_1.default.bold(name.padEnd(14))} ${chalk_1.default.dim(TOOL_DESC[name])}`,
69
+ value: name,
70
+ selected: perms[name] !== false, // default = enabled
71
+ }));
72
+ console.log();
73
+ console.log(chalk_1.default.bold.cyan(' RedAI CLI — Tool Permissions'));
74
+ console.log(chalk_1.default.dim(' Use ↑↓ to move, Space to toggle, A to select all, Enter to save.\n'));
75
+ const response = await (0, prompts_1.default)({
76
+ type: 'multiselect',
77
+ name: 'enabled',
78
+ message: 'Select tools to ENABLE on this machine',
79
+ choices,
80
+ hint: '- Space to toggle, Enter to confirm',
81
+ instructions: false,
82
+ }, {
83
+ onCancel: () => {
84
+ console.log(chalk_1.default.yellow('\nCancelled — no changes saved.'));
85
+ process.exit(0);
86
+ },
87
+ });
88
+ // response.enabled = string[] of selected tool names
89
+ const enabledSet = new Set(response.enabled);
90
+ const newPerms = {};
91
+ for (const name of permissions_1.ALL_TOOL_NAMES) {
92
+ newPerms[name] = enabledSet.has(name);
93
+ }
94
+ (0, permissions_1.savePermissions)(newPerms);
95
+ // ── Summary ──────────────────────────────────────────────────────────────────
96
+ console.log();
97
+ const nowDisabled = permissions_1.ALL_TOOL_NAMES.filter((n) => newPerms[n] === false);
98
+ const nowEnabled = permissions_1.ALL_TOOL_NAMES.filter((n) => newPerms[n] !== false);
99
+ if (nowDisabled.length === 0) {
100
+ console.log(chalk_1.default.green(' ✓ All tools enabled. Permissions saved.'));
101
+ }
102
+ else {
103
+ console.log(chalk_1.default.green(` ✓ ${nowEnabled.length} enabled, ${nowDisabled.length} disabled. Permissions saved.`));
104
+ console.log();
105
+ console.log(chalk_1.default.yellow(' Disabled tools:'));
106
+ for (const name of nowDisabled) {
107
+ console.log(` ${chalk_1.default.red('✗')} ${name}`);
108
+ }
109
+ }
110
+ console.log();
111
+ }
112
+ // ─── Single-tool subcommands (non-interactive, scriptable) ────────────────────
113
+ function resolveToolName(input) {
114
+ const match = permissions_1.ALL_TOOL_NAMES.find((n) => n.toLowerCase() === input.toLowerCase());
115
+ if (!match) {
116
+ console.error(chalk_1.default.red(`Unknown tool: ${input}`));
117
+ console.error(chalk_1.default.dim(`Valid tools: ${permissions_1.ALL_TOOL_NAMES.join(', ')}`));
118
+ return null;
119
+ }
120
+ return match;
121
+ }
122
+ async function enableCommand(toolName) {
123
+ const tool = resolveToolName(toolName);
124
+ if (!tool) {
125
+ process.exitCode = 1;
126
+ return;
127
+ }
128
+ (0, permissions_1.setToolPermission)(tool, true);
129
+ console.log(chalk_1.default.green(`✓ ${tool} enabled`));
130
+ }
131
+ async function disableCommand(toolName) {
132
+ const tool = resolveToolName(toolName);
133
+ if (!tool) {
134
+ process.exitCode = 1;
135
+ return;
136
+ }
137
+ (0, permissions_1.setToolPermission)(tool, false);
138
+ console.log(chalk_1.default.yellow(`✗ ${tool} disabled`));
139
+ }
140
+ // ─── Entry point ──────────────────────────────────────────────────────────────
141
+ async function permissionCommand(argv) {
142
+ const sub = argv[0];
143
+ // No subcommand → interactive TUI
144
+ if (!sub) {
145
+ await interactiveMode();
146
+ return;
147
+ }
148
+ if (sub === 'list') {
149
+ printList();
150
+ return;
151
+ }
152
+ if (sub === 'enable') {
153
+ const tool = argv[1];
154
+ if (!tool) {
155
+ console.error(chalk_1.default.red('Usage: redai permission enable <tool>'));
156
+ process.exitCode = 1;
157
+ return;
158
+ }
159
+ await enableCommand(tool);
160
+ return;
161
+ }
162
+ if (sub === 'disable') {
163
+ const tool = argv[1];
164
+ if (!tool) {
165
+ console.error(chalk_1.default.red('Usage: redai permission disable <tool>'));
166
+ process.exitCode = 1;
167
+ return;
168
+ }
169
+ await disableCommand(tool);
170
+ return;
171
+ }
172
+ console.error(chalk_1.default.red(`Unknown subcommand: ${sub}`));
173
+ console.error(chalk_1.default.dim('Usage: redai permission [list | enable <tool> | disable <tool>]'));
174
+ process.exitCode = 1;
175
+ }
176
+ //# sourceMappingURL=permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.js","sourceRoot":"","sources":["../../../src/cli/commands/permission.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -9,6 +9,8 @@ const config_1 = require("../config");
9
9
  const login_1 = require("./commands/login");
10
10
  const logout_1 = require("./commands/logout");
11
11
  const oauth_1 = require("./commands/oauth");
12
+ const mcp_1 = require("./commands/mcp");
13
+ const permission_1 = require("./commands/permission");
12
14
  const serve_1 = require("./commands/serve");
13
15
  const start_1 = require("./commands/start");
14
16
  const status_1 = require("./commands/status");
@@ -58,6 +60,18 @@ function printHelp() {
58
60
  console.log(' redai oauth list List all OAuth accounts');
59
61
  console.log(' redai oauth logout <provider> [<account>] Remove a provider login');
60
62
  console.log();
63
+ console.log();
64
+ console.log('MCP servers:');
65
+ console.log(' redai mcp list List configured MCP servers and their tools');
66
+ console.log(' redai mcp add [server] Add MCP server from catalog (interactive or by name)');
67
+ console.log(' redai mcp remove <server> Remove a configured MCP server');
68
+ console.log(' redai mcp test <server> Ping an MCP server, verify tools available');
69
+ console.log();
70
+ console.log('Local permissions:');
71
+ console.log(' redai permission list Show all tools and their enabled/disabled status');
72
+ console.log(' redai permission enable <tool> Allow a tool to run on this machine');
73
+ console.log(' redai permission disable <tool> Block a tool from running on this machine');
74
+ console.log();
61
75
  console.log(' redai help Show this help');
62
76
  }
63
77
  async function main() {
@@ -116,6 +130,43 @@ async function main() {
116
130
  });
117
131
  return;
118
132
  }
133
+ case 'permission': {
134
+ await (0, permission_1.permissionCommand)(process.argv.slice(3));
135
+ return;
136
+ }
137
+ case 'mcp': {
138
+ const sub = process.argv[3];
139
+ if (!sub || sub === 'list') {
140
+ await (0, mcp_1.mcpListCommand)();
141
+ return;
142
+ }
143
+ if (sub === 'add') {
144
+ const server = process.argv[4];
145
+ await (0, mcp_1.mcpAddCommand)(server);
146
+ return;
147
+ }
148
+ if (sub === 'remove') {
149
+ const server = process.argv[4];
150
+ if (!server) {
151
+ console.error(chalk_1.default.red('Usage: redai mcp remove <server>'));
152
+ process.exit(1);
153
+ }
154
+ await (0, mcp_1.mcpRemoveCommand)(server);
155
+ return;
156
+ }
157
+ if (sub === 'test') {
158
+ const server = process.argv[4];
159
+ if (!server) {
160
+ console.error(chalk_1.default.red('Usage: redai mcp test <server>'));
161
+ process.exit(1);
162
+ }
163
+ await (0, mcp_1.mcpTestCommand)(server);
164
+ return;
165
+ }
166
+ console.error(chalk_1.default.red(`Unknown mcp subcommand: ${sub}`));
167
+ console.error(chalk_1.default.dim('Usage: redai mcp [list|add|remove|test]'));
168
+ process.exit(1);
169
+ }
119
170
  case 'help':
120
171
  case '--help':
121
172
  case '-h':
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.detectCapabilities = detectCapabilities;
4
4
  const child_process_1 = require("child_process");
5
5
  const store_1 = require("../llm/oauth/store");
6
+ const config_1 = require("../mcp/config");
6
7
  /**
7
8
  * Detect AI-Agent CLI có sẵn trên máy. Trả:
8
9
  * - capabilities: tổng hợp gồm 3 nhóm:
@@ -37,6 +38,11 @@ function detectCapabilities() {
37
38
  capabilities.push(`llm-${provider}`);
38
39
  }
39
40
  }
41
+ // (4) MCP capabilities — phụ thuộc ~/.redai/mcp.json
42
+ const mcpServers = (0, config_1.loadMcpConfig)();
43
+ for (const serverName of Object.keys(mcpServers)) {
44
+ capabilities.push(`mcp-${serverName}`);
45
+ }
40
46
  return { capabilities, cliDetected };
41
47
  }
42
48
  function sniffVersion(binary) {
@@ -1 +1 @@
1
- {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/cli-router/detect.ts"],"names":[],"mappings":";;AAYA,gDAiCC;AA7CD,iDAA0C;AAE1C,8CAAkD;AAElD;;;;;;;GAOG;AACH,SAAgB,kBAAkB;IAIhC,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,MAAM,YAAY,GAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAE9E,wDAAwD;IACxD,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAU,EAAE,CAAC;QACzD,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,OAAO,EAAE,CAAC;YACZ,WAAW,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;YAC3B,YAAY,CAAC,IAAI,CAAC,GAAiB,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,KAAK,MAAM,QAAQ,IAAI;QACrB,QAAQ;QACR,OAAO;QACP,QAAQ;QACR,aAAa;QACb,MAAM;QACN,MAAM;QACN,OAAO;QACP,KAAK;KACG,EAAE,CAAC;QACX,IAAI,IAAA,oBAAY,EAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,YAAY,CAAC,IAAI,CAAC,OAAO,QAAQ,EAAgB,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE;YACtC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,IAAK;YACd,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;QACnE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/cli-router/detect.ts"],"names":[],"mappings":";;AAaA,gDAuCC;AApDD,iDAA0C;AAE1C,8CAAkD;AAClD,0CAA8C;AAE9C;;;;;;;GAOG;AACH,SAAgB,kBAAkB;IAIhC,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,MAAM,YAAY,GAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAE9E,wDAAwD;IACxD,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAU,EAAE,CAAC;QACzD,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,OAAO,EAAE,CAAC;YACZ,WAAW,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;YAC3B,YAAY,CAAC,IAAI,CAAC,GAAiB,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,KAAK,MAAM,QAAQ,IAAI;QACrB,QAAQ;QACR,OAAO;QACP,QAAQ;QACR,aAAa;QACb,MAAM;QACN,MAAM;QACN,OAAO;QACP,KAAK;KACG,EAAE,CAAC;QACX,IAAI,IAAA,oBAAY,EAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,YAAY,CAAC,IAAI,CAAC,OAAO,QAAQ,EAAgB,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,MAAM,UAAU,GAAG,IAAA,sBAAa,GAAE,CAAC;IACnC,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACjD,YAAY,CAAC,IAAI,CAAC,OAAO,UAAU,EAAgB,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAClC,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE;YACtC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,IAAK;YACd,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACvD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;QACnE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/dist/config.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { BUILD_ENV, BUILD_TIME, PKG_VERSION } from './build-info';
2
2
  export declare const CLI_PACKAGE_NAME = "@redonvn/cli";
3
3
  /** Version đồng bộ với `package.json` lúc build — KHÔNG hardcode. */
4
- export declare const CLI_VERSION = "0.1.6";
4
+ export declare const CLI_VERSION = "0.1.7";
5
5
  /** Re-export build metadata cho status command. */
6
6
  export { BUILD_ENV, BUILD_TIME, PKG_VERSION };
7
7
  export declare const REDAI_CONFIG_DIR: string;
@@ -10,6 +10,7 @@ const socket_io_client_1 = require("socket.io-client");
10
10
  const cli_protocol_1 = require("@redonvn/cli-protocol");
11
11
  const config_1 = require("../config");
12
12
  const detect_1 = require("../cli-router/detect");
13
+ const client_1 = require("../mcp/client");
13
14
  const router_1 = require("./router");
14
15
  let activeSocket = null;
15
16
  let heartbeatTimer = null;
@@ -151,6 +152,7 @@ async function shutdown(code) {
151
152
  }
152
153
  activeSocket = null;
153
154
  }
155
+ await client_1.mcpClientPool.shutdown();
154
156
  process.exit(code);
155
157
  }
156
158
  //# sourceMappingURL=tunnel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/daemon/tunnel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/daemon/tunnel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
+ /**
3
+ * Singleton pool giữ kết nối MCP client cho từng server.
4
+ * Lazy spawn — chỉ connect khi có tool call đầu tiên đến server đó.
5
+ * Auto-reconnect: nếu transport bị đóng, xóa khỏi pool → lần sau sẽ spawn lại.
6
+ */
7
+ declare class McpClientPool {
8
+ private pool;
9
+ getClient(serverName: string): Promise<Client>;
10
+ shutdown(): Promise<void>;
11
+ listConnected(): string[];
12
+ }
13
+ export declare const mcpClientPool: McpClientPool;
14
+ export {};
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mcpClientPool = void 0;
4
+ const index_js_1 = require("@modelcontextprotocol/sdk/client/index.js");
5
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/client/stdio.js");
6
+ const config_1 = require("./config");
7
+ /**
8
+ * Singleton pool giữ kết nối MCP client cho từng server.
9
+ * Lazy spawn — chỉ connect khi có tool call đầu tiên đến server đó.
10
+ * Auto-reconnect: nếu transport bị đóng, xóa khỏi pool → lần sau sẽ spawn lại.
11
+ */
12
+ class McpClientPool {
13
+ constructor() {
14
+ this.pool = new Map();
15
+ }
16
+ async getClient(serverName) {
17
+ const existing = this.pool.get(serverName);
18
+ if (existing)
19
+ return existing.client;
20
+ const servers = (0, config_1.loadMcpConfig)();
21
+ const cfg = servers[serverName];
22
+ if (!cfg) {
23
+ throw new Error(`MCP server "${serverName}" not found in ~/.redai/mcp.json`);
24
+ }
25
+ const transport = new stdio_js_1.StdioClientTransport({
26
+ command: cfg.command,
27
+ args: cfg.args ?? [],
28
+ env: cfg.env
29
+ ? Object.fromEntries(Object.entries({ ...process.env, ...cfg.env }).filter(([, v]) => v !== undefined))
30
+ : undefined,
31
+ });
32
+ const client = new index_js_1.Client({ name: 'redai-cli', version: '1.0.0' }, { capabilities: {} });
33
+ await client.connect(transport);
34
+ // Khi transport đóng bất ngờ → xóa khỏi pool để lần sau spawn lại
35
+ transport.onclose = () => {
36
+ this.pool.delete(serverName);
37
+ };
38
+ this.pool.set(serverName, { client, transport });
39
+ return client;
40
+ }
41
+ async shutdown() {
42
+ const entries = [...this.pool.values()];
43
+ this.pool.clear();
44
+ await Promise.allSettled(entries.map((e) => e.client.close()));
45
+ }
46
+ listConnected() {
47
+ return [...this.pool.keys()];
48
+ }
49
+ }
50
+ exports.mcpClientPool = new McpClientPool();
51
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":";;;AAAA,wEAAmE;AACnE,wEAAiF;AACjF,qCAA+D;AAO/D;;;;GAIG;AACH,MAAM,aAAa;IAAnB;QACU,SAAI,GAAG,IAAI,GAAG,EAAqB,CAAC;IA+C9C,CAAC;IA7CC,KAAK,CAAC,SAAS,CAAC,UAAkB;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;QAErC,MAAM,OAAO,GAAG,IAAA,sBAAa,GAAE,CAAC;QAChC,MAAM,GAAG,GAAgC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,eAAe,UAAU,kCAAkC,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,+BAAoB,CAAC;YACzC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE;YACpB,GAAG,EAAE,GAAG,CAAC,GAAG;gBACV,CAAC,CAAE,MAAM,CAAC,WAAW,CACjB,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CACvD;gBAC9B,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,iBAAM,CACvB,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,EACvC,EAAE,YAAY,EAAE,EAAE,EAAE,CACrB,CAAC;QAEF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEhC,kEAAkE;QAClE,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,aAAa;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/B,CAAC;CACF;AAEY,QAAA,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { z } from 'zod';
2
+ declare const McpServerConfigSchema: z.ZodObject<{
3
+ command: z.ZodString;
4
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
5
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
6
+ transport: z.ZodLiteral<"stdio">;
7
+ }, "strip", z.ZodTypeAny, {
8
+ command: string;
9
+ transport: "stdio";
10
+ args?: string[] | undefined;
11
+ env?: Record<string, string> | undefined;
12
+ }, {
13
+ command: string;
14
+ transport: "stdio";
15
+ args?: string[] | undefined;
16
+ env?: Record<string, string> | undefined;
17
+ }>;
18
+ declare const McpConfigFileSchema: z.ZodObject<{
19
+ servers: z.ZodRecord<z.ZodString, z.ZodObject<{
20
+ command: z.ZodString;
21
+ args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
22
+ env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
23
+ transport: z.ZodLiteral<"stdio">;
24
+ }, "strip", z.ZodTypeAny, {
25
+ command: string;
26
+ transport: "stdio";
27
+ args?: string[] | undefined;
28
+ env?: Record<string, string> | undefined;
29
+ }, {
30
+ command: string;
31
+ transport: "stdio";
32
+ args?: string[] | undefined;
33
+ env?: Record<string, string> | undefined;
34
+ }>>;
35
+ }, "strip", z.ZodTypeAny, {
36
+ servers: Record<string, {
37
+ command: string;
38
+ transport: "stdio";
39
+ args?: string[] | undefined;
40
+ env?: Record<string, string> | undefined;
41
+ }>;
42
+ }, {
43
+ servers: Record<string, {
44
+ command: string;
45
+ transport: "stdio";
46
+ args?: string[] | undefined;
47
+ env?: Record<string, string> | undefined;
48
+ }>;
49
+ }>;
50
+ export type McpServerConfig = z.infer<typeof McpServerConfigSchema>;
51
+ export type McpConfigFile = z.infer<typeof McpConfigFileSchema>;
52
+ export declare function loadMcpConfig(): Record<string, McpServerConfig>;
53
+ export declare function getMcpConfigPath(): string;
54
+ export declare function saveMcpConfig(servers: Record<string, McpServerConfig>): void;
55
+ export interface McpCatalogEntry {
56
+ /** Key sẽ dùng trong mcp.json */
57
+ name: string;
58
+ /** Mô tả ngắn cho user */
59
+ description: string;
60
+ /** Các tool nổi bật */
61
+ tools: string;
62
+ config: McpServerConfig;
63
+ }
64
+ export declare const MCP_CATALOG: McpCatalogEntry[];
65
+ export {};
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MCP_CATALOG = void 0;
7
+ exports.loadMcpConfig = loadMcpConfig;
8
+ exports.getMcpConfigPath = getMcpConfigPath;
9
+ exports.saveMcpConfig = saveMcpConfig;
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const os_1 = __importDefault(require("os"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const zod_1 = require("zod");
14
+ const McpServerConfigSchema = zod_1.z.object({
15
+ command: zod_1.z.string(),
16
+ args: zod_1.z.array(zod_1.z.string()).optional(),
17
+ env: zod_1.z.record(zod_1.z.string()).optional(),
18
+ transport: zod_1.z.literal('stdio'),
19
+ });
20
+ const McpConfigFileSchema = zod_1.z.object({
21
+ servers: zod_1.z.record(McpServerConfigSchema),
22
+ });
23
+ const MCP_CONFIG_PATH = path_1.default.join(os_1.default.homedir(), '.redai', 'mcp.json');
24
+ function loadMcpConfig() {
25
+ try {
26
+ if (!fs_1.default.existsSync(MCP_CONFIG_PATH))
27
+ return {};
28
+ const raw = fs_1.default.readFileSync(MCP_CONFIG_PATH, 'utf-8');
29
+ const parsed = McpConfigFileSchema.safeParse(JSON.parse(raw));
30
+ if (!parsed.success)
31
+ return {};
32
+ return parsed.data.servers;
33
+ }
34
+ catch {
35
+ return {};
36
+ }
37
+ }
38
+ function getMcpConfigPath() {
39
+ return MCP_CONFIG_PATH;
40
+ }
41
+ function saveMcpConfig(servers) {
42
+ const dir = path_1.default.dirname(MCP_CONFIG_PATH);
43
+ if (!fs_1.default.existsSync(dir))
44
+ fs_1.default.mkdirSync(dir, { recursive: true });
45
+ fs_1.default.writeFileSync(MCP_CONFIG_PATH, JSON.stringify({ servers }, null, 2), 'utf-8');
46
+ }
47
+ exports.MCP_CATALOG = [
48
+ {
49
+ name: 'chrome',
50
+ description: 'Chrome / Puppeteer — điều khiển trình duyệt, chụp screenshot, scrape web',
51
+ tools: 'puppeteer_navigate, puppeteer_screenshot, puppeteer_click, puppeteer_fill, ...',
52
+ config: {
53
+ command: 'npx',
54
+ args: ['-y', '@modelcontextprotocol/server-puppeteer'],
55
+ transport: 'stdio',
56
+ },
57
+ },
58
+ {
59
+ name: 'filesystem',
60
+ description: 'Filesystem — đọc/ghi file với sandbox trong thư mục cho phép',
61
+ tools: 'read_file, write_file, list_directory, search_files, ...',
62
+ config: {
63
+ command: 'npx',
64
+ args: ['-y', '@modelcontextprotocol/server-filesystem', process.env['HOME'] ?? '.'],
65
+ transport: 'stdio',
66
+ },
67
+ },
68
+ {
69
+ name: 'postgres',
70
+ description: 'PostgreSQL — query database, describe schema',
71
+ tools: 'query, list_tables, describe_table',
72
+ config: {
73
+ command: 'npx',
74
+ args: ['-y', '@modelcontextprotocol/server-postgres', 'postgresql://localhost/mydb'],
75
+ transport: 'stdio',
76
+ },
77
+ },
78
+ {
79
+ name: 'github',
80
+ description: 'GitHub — quản lý repo, PR, issues, search code',
81
+ tools: 'create_issue, list_pull_requests, search_repositories, get_file_contents, ...',
82
+ config: {
83
+ command: 'npx',
84
+ args: ['-y', '@modelcontextprotocol/server-github'],
85
+ env: { GITHUB_PERSONAL_ACCESS_TOKEN: '<your-token>' },
86
+ transport: 'stdio',
87
+ },
88
+ },
89
+ {
90
+ name: 'slack',
91
+ description: 'Slack — đọc/gửi message, list channels',
92
+ tools: 'post_message, list_channels, get_channel_history, ...',
93
+ config: {
94
+ command: 'npx',
95
+ args: ['-y', '@modelcontextprotocol/server-slack'],
96
+ env: { SLACK_BOT_TOKEN: '<your-token>', SLACK_TEAM_ID: '<team-id>' },
97
+ transport: 'stdio',
98
+ },
99
+ },
100
+ {
101
+ name: 'brave-search',
102
+ description: 'Brave Search — web search + local search qua Brave API',
103
+ tools: 'brave_web_search, brave_local_search',
104
+ config: {
105
+ command: 'npx',
106
+ args: ['-y', '@modelcontextprotocol/server-brave-search'],
107
+ env: { BRAVE_API_KEY: '<your-key>' },
108
+ transport: 'stdio',
109
+ },
110
+ },
111
+ {
112
+ name: 'memory',
113
+ description: 'Memory — lưu trữ knowledge graph persistent cho AI agent',
114
+ tools: 'create_entities, create_relations, search_nodes, read_graph, ...',
115
+ config: {
116
+ command: 'npx',
117
+ args: ['-y', '@modelcontextprotocol/server-memory'],
118
+ transport: 'stdio',
119
+ },
120
+ },
121
+ {
122
+ name: 'fetch',
123
+ description: 'Fetch — HTTP client: fetch URL, convert HTML sang markdown',
124
+ tools: 'fetch (GET/POST any URL)',
125
+ config: {
126
+ command: 'npx',
127
+ args: ['-y', '@modelcontextprotocol/server-fetch'],
128
+ transport: 'stdio',
129
+ },
130
+ },
131
+ ];
132
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function mcpCallTool(input: unknown): Promise<unknown>;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mcpCallTool = mcpCallTool;
4
+ const zod_1 = require("zod");
5
+ const client_1 = require("../mcp/client");
6
+ const McpCallParamsSchema = zod_1.z.object({
7
+ server: zod_1.z.string().min(1),
8
+ tool: zod_1.z.string().min(1),
9
+ arguments: zod_1.z.record(zod_1.z.unknown()).optional().default({}),
10
+ });
11
+ async function mcpCallTool(input) {
12
+ const params = McpCallParamsSchema.parse(input);
13
+ const client = await client_1.mcpClientPool.getClient(params.server);
14
+ const response = await client.callTool({
15
+ name: params.tool,
16
+ arguments: params.arguments,
17
+ });
18
+ return response;
19
+ }
20
+ //# sourceMappingURL=mcp-call.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-call.js","sourceRoot":"","sources":["../../src/tools/mcp-call.ts"],"names":[],"mappings":";;AASA,kCAUC;AAnBD,6BAAwB;AACxB,0CAA8C;AAE9C,MAAM,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACvB,SAAS,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CACxD,CAAC,CAAC;AAEI,KAAK,UAAU,WAAW,CAAC,KAAc;IAC9C,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEhD,MAAM,MAAM,GAAG,MAAM,sBAAa,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;QACrC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,13 @@
1
+ interface McpToolInfo {
2
+ name: string;
3
+ description?: string;
4
+ inputSchema?: unknown;
5
+ }
6
+ interface McpListResult {
7
+ servers: Record<string, {
8
+ tools: McpToolInfo[];
9
+ error?: string;
10
+ }>;
11
+ }
12
+ export declare function mcpListTool(input: unknown): Promise<McpListResult>;
13
+ export {};
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mcpListTool = mcpListTool;
4
+ const zod_1 = require("zod");
5
+ const config_1 = require("../mcp/config");
6
+ const client_1 = require("../mcp/client");
7
+ const McpListParamsSchema = zod_1.z.object({
8
+ server: zod_1.z.string().optional(),
9
+ });
10
+ async function mcpListTool(input) {
11
+ const params = McpListParamsSchema.parse(input);
12
+ const servers = (0, config_1.loadMcpConfig)();
13
+ const result = { servers: {} };
14
+ const targetServers = params.server
15
+ ? params.server in servers
16
+ ? [params.server]
17
+ : []
18
+ : Object.keys(servers);
19
+ if (params.server && !(params.server in servers)) {
20
+ throw new Error(`MCP server "${params.server}" not found in ~/.redai/mcp.json`);
21
+ }
22
+ await Promise.all(targetServers.map(async (name) => {
23
+ try {
24
+ const client = await client_1.mcpClientPool.getClient(name);
25
+ const { tools } = await client.listTools();
26
+ result.servers[name] = {
27
+ tools: tools.map((t) => ({
28
+ name: t.name,
29
+ description: t.description,
30
+ inputSchema: t.inputSchema,
31
+ })),
32
+ };
33
+ }
34
+ catch (err) {
35
+ result.servers[name] = {
36
+ tools: [],
37
+ error: err instanceof Error ? err.message : String(err),
38
+ };
39
+ }
40
+ }));
41
+ return result;
42
+ }
43
+ //# sourceMappingURL=mcp-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-list.js","sourceRoot":"","sources":["../../src/tools/mcp-list.ts"],"names":[],"mappings":";;AAkBA,kCAqCC;AAvDD,6BAAwB;AACxB,0CAA8C;AAC9C,0CAA8C;AAE9C,MAAM,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC;AAYI,KAAK,UAAU,WAAW,CAAC,KAAc;IAC9C,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAA,sBAAa,GAAE,CAAC;IAChC,MAAM,MAAM,GAAkB,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAE9C,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM;QACjC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO;YACxB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;YACjB,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEzB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,CAAC,MAAM,kCAAkC,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CACf,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,sBAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YAC3C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;gBACrB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACvB,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;iBAC3B,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;gBACrB,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,4 +1,4 @@
1
- export type ToolName = 'Read' | 'Write' | 'Edit' | 'Bash' | 'Grep' | 'Glob' | 'WebFetch' | 'RunClaude' | 'RunCodex' | 'RunGemini' | 'LLMRequest';
1
+ export type ToolName = 'Read' | 'Write' | 'Edit' | 'Bash' | 'Grep' | 'Glob' | 'WebFetch' | 'RunClaude' | 'RunCodex' | 'RunGemini' | 'LLMRequest' | 'McpCall' | 'McpList';
2
2
  export interface ToolContext {
3
3
  timeoutMs?: number;
4
4
  cwd?: string;
@@ -1,11 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runTool = runTool;
4
+ const permissions_1 = require("../auth/permissions");
4
5
  const llm_request_1 = require("../llm/llm-request");
5
6
  const bash_1 = require("./bash");
6
7
  const edit_1 = require("./edit");
7
8
  const glob_1 = require("./glob");
8
9
  const grep_1 = require("./grep");
10
+ const mcp_call_1 = require("./mcp-call");
11
+ const mcp_list_1 = require("./mcp-list");
9
12
  const read_1 = require("./read");
10
13
  const run_cli_1 = require("./run-cli");
11
14
  const webfetch_1 = require("./webfetch");
@@ -22,6 +25,8 @@ const HANDLERS = {
22
25
  RunCodex: (p, ctx) => (0, run_cli_1.runCliTool)('codex', injectCwd(p, ctx.cwd)),
23
26
  RunGemini: (p, ctx) => (0, run_cli_1.runCliTool)('gemini', injectCwd(p, ctx.cwd)),
24
27
  LLMRequest: (p, ctx) => (0, llm_request_1.llmRequestTool)(p, { onStream: ctx.onStream }),
28
+ McpCall: (p) => (0, mcp_call_1.mcpCallTool)(p),
29
+ McpList: (p) => (0, mcp_list_1.mcpListTool)(p),
25
30
  };
26
31
  function injectCwd(params, cwd) {
27
32
  if (!cwd)
@@ -38,6 +43,10 @@ async function runTool(name, params, ctx = {}) {
38
43
  if (!handler) {
39
44
  throw new Error(`Tool not supported on this CLI: ${name}`);
40
45
  }
46
+ const perms = (0, permissions_1.loadPermissions)();
47
+ if (!(0, permissions_1.isToolAllowed)(name, perms)) {
48
+ throw new Error(`Tool '${name}' is disabled on this machine. Run \`redai permission enable ${name}\` to allow it.`);
49
+ }
41
50
  return handler(params, ctx);
42
51
  }
43
52
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":";;AAuDA,0BAUC;AAjED,oDAAoD;AACpD,iCAAkC;AAClC,iCAAkC;AAClC,iCAAkC;AAClC,iCAAkC;AAClC,iCAAkC;AAClC,uCAAuC;AACvC,yCAA0C;AAC1C,mCAAoC;AAwBpC,MAAM,QAAQ,GAAkC;IAC9C,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,eAAQ,EAAC,CAAC,CAAC;IACxB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,iBAAS,EAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,eAAQ,EAAC,CAAC,CAAC;IACxB,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,IAAA,eAAQ,EAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,eAAQ,EAAC,CAAC,CAAC;IACxB,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,eAAQ,EAAC,CAAC,CAAC;IACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,uBAAY,EAAC,CAAC,CAAC;IAChC,SAAS,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,IAAA,oBAAU,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAClE,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,IAAA,oBAAU,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAChE,SAAS,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,IAAA,oBAAU,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAClE,UAAU,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,IAAA,4BAAc,EAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC;CACtE,CAAC;AAEF,SAAS,SAAS,CAAC,MAAe,EAAE,GAAY;IAC9C,IAAI,CAAC,GAAG;QAAE,OAAO,MAAM,CAAC;IACxB,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,GAAG,GAAG,MAAiC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,GAAG;YAAE,OAAO,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;IACvC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,OAAO,CAC3B,IAAc,EACd,MAAe,EACf,MAAmB,EAAE;IAErB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@redonvn/cli",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "RedAI CLI — kết nối máy bạn với RedAI agent runtime. AI cloud agent có thể run tools (Read/Write/Edit/Bash/Grep/Glob/WebFetch), spawn code-CLI (Claude/Codex/Gemini), và proxy LLM request qua OAuth của bạn (Claude Code / ChatGPT / Gemini / Antigravity / Qwen / Kimi / iFlow / xAI).",
5
5
  "bin": {
6
6
  "redai": "./bin/redai.js"
@@ -56,6 +56,7 @@
56
56
  },
57
57
  "homepage": "https://github.com/redonvn/redai-cli#readme",
58
58
  "dependencies": {
59
+ "@modelcontextprotocol/sdk": "^1.29.0",
59
60
  "@redonvn/cli-protocol": "^0.1.2",
60
61
  "@vscode/ripgrep": "^1.15.9",
61
62
  "axios": "^1.7.7",