@redonvn/cli 0.1.5 → 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.
Files changed (42) hide show
  1. package/dist/auth/permissions.d.ts +20 -0
  2. package/dist/auth/permissions.js +73 -0
  3. package/dist/auth/permissions.js.map +1 -0
  4. package/dist/auth/store.d.ts +0 -3
  5. package/dist/auth/store.js.map +1 -1
  6. package/dist/build-info.d.ts +2 -2
  7. package/dist/build-info.js +2 -2
  8. package/dist/cli/commands/login.js +16 -9
  9. package/dist/cli/commands/login.js.map +1 -1
  10. package/dist/cli/commands/mcp.d.ts +20 -0
  11. package/dist/cli/commands/mcp.js +175 -0
  12. package/dist/cli/commands/mcp.js.map +1 -0
  13. package/dist/cli/commands/permission.d.ts +1 -0
  14. package/dist/cli/commands/permission.js +176 -0
  15. package/dist/cli/commands/permission.js.map +1 -0
  16. package/dist/cli/commands/start.js +11 -0
  17. package/dist/cli/commands/start.js.map +1 -1
  18. package/dist/cli/commands/status.js +0 -2
  19. package/dist/cli/commands/status.js.map +1 -1
  20. package/dist/cli/index.js +51 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli-router/detect.js +6 -0
  23. package/dist/cli-router/detect.js.map +1 -1
  24. package/dist/config.d.ts +1 -1
  25. package/dist/daemon/tunnel.js +2 -0
  26. package/dist/daemon/tunnel.js.map +1 -1
  27. package/dist/mcp/client.d.ts +14 -0
  28. package/dist/mcp/client.js +51 -0
  29. package/dist/mcp/client.js.map +1 -0
  30. package/dist/mcp/config.d.ts +65 -0
  31. package/dist/mcp/config.js +132 -0
  32. package/dist/mcp/config.js.map +1 -0
  33. package/dist/tools/mcp-call.d.ts +1 -0
  34. package/dist/tools/mcp-call.js +20 -0
  35. package/dist/tools/mcp-call.js.map +1 -0
  36. package/dist/tools/mcp-list.d.ts +13 -0
  37. package/dist/tools/mcp-list.js +43 -0
  38. package/dist/tools/mcp-list.js.map +1 -0
  39. package/dist/tools/registry.d.ts +1 -1
  40. package/dist/tools/registry.js +9 -0
  41. package/dist/tools/registry.js.map +1 -1
  42. package/package.json +2 -1
@@ -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"}
@@ -10,9 +10,6 @@ export interface RedaiCliConfig {
10
10
  userEmail: string | null;
11
11
  userName: string | null;
12
12
  expiresAt: number;
13
- projectSchemaId: string;
14
- /** Tools BE đã bootstrap cho máy này (chỉ informational, không enforce ở CLI). */
15
- registeredTools: string[];
16
13
  }
17
14
  export declare function loadConfig(): RedaiCliConfig | null;
18
15
  export declare function saveConfig(cfg: RedaiCliConfig): void;
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/auth/store.ts"],"names":[],"mappings":";;;;;AAyBA,gCAQC;AAED,gCAMC;AAED,kCAIC;AA/CD,4CAAoB;AACpB,sCAA0E;AAkB1E,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,UAAU;IACxB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,0BAAiB,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,0BAAiB,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,GAAmB;IAC5C,SAAS,EAAE,CAAC;IACZ,YAAE,CAAC,aAAa,CAAC,0BAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAChE,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,WAAW;IACzB,IAAI,YAAE,CAAC,UAAU,CAAC,0BAAiB,CAAC,EAAE,CAAC;QACrC,YAAE,CAAC,UAAU,CAAC,0BAAiB,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/auth/store.ts"],"names":[],"mappings":";;;;;AAsBA,gCAQC;AAED,gCAMC;AAED,kCAIC;AA5CD,4CAAoB;AACpB,sCAA0E;AAe1E,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,UAAU;IACxB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,0BAAiB,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAE,CAAC,YAAY,CAAC,0BAAiB,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,GAAmB;IAC5C,SAAS,EAAE,CAAC;IACZ,YAAE,CAAC,aAAa,CAAC,0BAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAChE,QAAQ,EAAE,MAAM;QAChB,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,WAAW;IACzB,IAAI,YAAE,CAAC,UAAU,CAAC,0BAAiB,CAAC,EAAE,CAAC;QACrC,YAAE,CAAC,UAAU,CAAC,0BAAiB,CAAC,CAAC;IACnC,CAAC;AACH,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.5";
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-18T05:14:00.918Z";
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.5';
9
+ exports.PKG_VERSION = '0.1.7';
10
10
  /** ISO timestamp lúc build (informational). */
11
- exports.BUILD_TIME = '2026-05-18T05:14:00.918Z';
11
+ exports.BUILD_TIME = '2026-05-18T09:38:01.024Z';
12
12
  //# sourceMappingURL=build-info.js.map
@@ -63,10 +63,21 @@ async function loginCommand(options = {}) {
63
63
  process.exit(1);
64
64
  return;
65
65
  }
66
- // BE thường trả wsUrl đầy đủ. Nếu thiếu (BE version cũ), CLI tự build từ preset.
67
- const wsUrl = result.wsUrl && result.wsUrl.trim()
68
- ? result.wsUrl
69
- : `${wsFallbackBase}/redai-cli`;
66
+ // BE thường trả wsUrl đầy đủ. 2 case CLI override bằng preset:
67
+ // - BE không trả wsUrl (version )
68
+ // - BE trả về localhost/127.0.0.1 (BE thiếu ENV REDAI_CLI_WS_URL / PUBLIC_BASE_URL)
69
+ const beWsUrl = result.wsUrl?.trim();
70
+ const beIsLocalhost = !!beWsUrl && /^wss?:\/\/(localhost|127\.0\.0\.1)/i.test(beWsUrl);
71
+ let wsUrl;
72
+ if (!beWsUrl || beIsLocalhost) {
73
+ wsUrl = `${wsFallbackBase}/redai-cli`;
74
+ if (beIsLocalhost) {
75
+ console.warn(chalk_1.default.yellow(`! BE trả wsUrl=${beWsUrl} → override sang ${wsUrl} (preset ${env.toUpperCase()}).`));
76
+ }
77
+ }
78
+ else {
79
+ wsUrl = beWsUrl;
80
+ }
70
81
  (0, store_1.saveConfig)({
71
82
  env,
72
83
  cliToken: result.cliToken,
@@ -77,8 +88,6 @@ async function loginCommand(options = {}) {
77
88
  userEmail: result.user.email,
78
89
  userName: result.user.name,
79
90
  expiresAt: result.expiresAt,
80
- projectSchemaId: result.projectSchemaId,
81
- registeredTools: result.registeredTools,
82
91
  });
83
92
  console.log();
84
93
  console.log(chalk_1.default.green('✓ Logged in.'));
@@ -87,11 +96,9 @@ async function loginCommand(options = {}) {
87
96
  console.log(` ${chalk_1.default.gray('WS :')} ${wsUrl}`);
88
97
  console.log(` ${chalk_1.default.gray('User :')} ${result.user.name ?? result.user.email ?? result.user.id}`);
89
98
  console.log(` ${chalk_1.default.gray('Client ID :')} ${result.clientId}`);
90
- console.log(` ${chalk_1.default.gray('Schema :')} ${result.projectSchemaId}`);
91
- console.log(` ${chalk_1.default.gray('Tools :')} ${result.registeredTools.join(', ') || '(none)'}`);
92
99
  console.log(` ${chalk_1.default.gray('Expires :')} ${new Date(result.expiresAt).toISOString()}`);
93
100
  console.log();
94
- console.log(chalk_1.default.dim('Next: run `redai start` to keep this machine connected.'));
101
+ console.log(chalk_1.default.dim('Next: run `redai start` để giữ máy connected, hoặc gọi POST /cli/clients/<clientId>/bootstrap nếu cần khởi tạo ProjectSchema + tools.'));
95
102
  // Hint nếu user chọn dev/prod khác mặc định
96
103
  if (env === 'prod') {
97
104
  console.log(chalk_1.default.dim(`Tip: PROD preset = ${config_1.REDAI_ENV_PRESETS.prod.apiBaseUrl} + ${config_1.REDAI_ENV_PRESETS.prod.wsBaseUrl}`));
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
@@ -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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"}
@@ -7,6 +7,7 @@ exports.startCommand = startCommand;
7
7
  const chalk_1 = __importDefault(require("chalk"));
8
8
  const store_1 = require("../../auth/store");
9
9
  const tunnel_1 = require("../../daemon/tunnel");
10
+ const config_1 = require("../../config");
10
11
  async function startCommand() {
11
12
  const cfg = (0, store_1.loadConfig)();
12
13
  if (!cfg) {
@@ -17,6 +18,16 @@ async function startCommand() {
17
18
  console.error(chalk_1.default.red('cliToken expired. Run `redai login` again.'));
18
19
  process.exit(1);
19
20
  }
21
+ // BE phiên bản cũ trả về `ws://localhost:3000/...` do thiếu ENV
22
+ // `REDAI_CLI_WS_URL` / `PUBLIC_BASE_URL`. CLI tự rewrite về preset
23
+ // theo env hiện tại để khỏi phải login lại.
24
+ if (/^wss?:\/\/(localhost|127\.0\.0\.1)/i.test(cfg.wsUrl)) {
25
+ const env = (0, config_1.resolveEnv)(cfg.env);
26
+ const fallback = `${config_1.REDAI_ENV_PRESETS[env].wsBaseUrl}/redai-cli`;
27
+ console.warn(chalk_1.default.yellow(`! WS url từ BE trỏ về localhost (${cfg.wsUrl}) — override sang ${fallback}.`));
28
+ cfg.wsUrl = fallback;
29
+ (0, store_1.saveConfig)(cfg);
30
+ }
20
31
  console.log(chalk_1.default.cyan('Starting RedAI CLI daemon...'));
21
32
  console.log(chalk_1.default.dim(` WS: ${cfg.wsUrl}`));
22
33
  console.log(chalk_1.default.dim(` Client ID: ${cfg.clientId}`));