@redonvn/cli 0.1.6 → 0.1.9

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 (39) 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 +1 -0
  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/ask.d.ts +1 -0
  9. package/dist/cli/commands/ask.js +451 -0
  10. package/dist/cli/commands/ask.js.map +1 -0
  11. package/dist/cli/commands/mcp.d.ts +20 -0
  12. package/dist/cli/commands/mcp.js +175 -0
  13. package/dist/cli/commands/mcp.js.map +1 -0
  14. package/dist/cli/commands/permission.d.ts +1 -0
  15. package/dist/cli/commands/permission.js +176 -0
  16. package/dist/cli/commands/permission.js.map +1 -0
  17. package/dist/cli/index.js +67 -2
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/cli-router/detect.js +6 -0
  20. package/dist/cli-router/detect.js.map +1 -1
  21. package/dist/config.d.ts +1 -1
  22. package/dist/daemon/tunnel.js +2 -0
  23. package/dist/daemon/tunnel.js.map +1 -1
  24. package/dist/mcp/client.d.ts +14 -0
  25. package/dist/mcp/client.js +51 -0
  26. package/dist/mcp/client.js.map +1 -0
  27. package/dist/mcp/config.d.ts +65 -0
  28. package/dist/mcp/config.js +132 -0
  29. package/dist/mcp/config.js.map +1 -0
  30. package/dist/tools/mcp-call.d.ts +1 -0
  31. package/dist/tools/mcp-call.js +20 -0
  32. package/dist/tools/mcp-call.js.map +1 -0
  33. package/dist/tools/mcp-list.d.ts +13 -0
  34. package/dist/tools/mcp-list.js +43 -0
  35. package/dist/tools/mcp-list.js.map +1 -0
  36. package/dist/tools/registry.d.ts +1 -1
  37. package/dist/tools/registry.js +9 -0
  38. package/dist/tools/registry.js.map +1 -1
  39. 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,6 +10,7 @@ export interface RedaiCliConfig {
10
10
  userEmail: string | null;
11
11
  userName: string | null;
12
12
  expiresAt: number;
13
+ workspaceId?: string | null;
13
14
  }
14
15
  export declare function loadConfig(): RedaiCliConfig | null;
15
16
  export declare function saveConfig(cfg: RedaiCliConfig): void;
@@ -1 +1 @@
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
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/auth/store.ts"],"names":[],"mappings":";;;;;AAuBA,gCAQC;AAED,gCAMC;AAED,kCAIC;AA7CD,4CAAoB;AACpB,sCAA0E;AAgB1E,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.6";
4
+ export declare const PKG_VERSION = "0.1.9";
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-18T10:23:42.051Z";
@@ -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.9';
10
10
  /** ISO timestamp lúc build (informational). */
11
- exports.BUILD_TIME = '2026-05-18T06:28:03.566Z';
11
+ exports.BUILD_TIME = '2026-05-18T10:23:42.051Z';
12
12
  //# sourceMappingURL=build-info.js.map
@@ -0,0 +1 @@
1
+ export declare function askCommand(): Promise<void>;
@@ -0,0 +1,451 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.askCommand = askCommand;
40
+ /**
41
+ * `redai` (no args) — Interactive shell của RedAI.
42
+ *
43
+ * Gõ prompt tự do → gửi lên /user/chat (backend) → stream response về.
44
+ * Slash commands (/help, /agents, /permissions, ...) xử lý local.
45
+ */
46
+ const chalk_1 = __importDefault(require("chalk"));
47
+ const readline_1 = __importDefault(require("readline"));
48
+ const axios_1 = __importDefault(require("axios"));
49
+ const store_1 = require("../../auth/store");
50
+ const permissions_1 = require("../../auth/permissions");
51
+ const permissions_2 = require("../../auth/permissions");
52
+ const config_1 = require("../../config");
53
+ // ─── Session state ─────────────────────────────────────────────────────────────
54
+ let currentThreadId = null;
55
+ let currentAgentId = null;
56
+ let currentAgentName = 'RedAI';
57
+ // ─── Banner ────────────────────────────────────────────────────────────────────
58
+ const LOGO = [
59
+ ' ██████╗ ███████╗██████╗ █████╗ ██╗',
60
+ ' ██╔══██╗██╔════╝██╔══██╗██╔══██╗██║',
61
+ ' ██████╔╝█████╗ ██║ ██║███████║██║',
62
+ ' ██╔══██╗██╔══╝ ██║ ██║██╔══██║██║',
63
+ ' ██║ ██║███████╗██████╔╝██║ ██║██║',
64
+ ' ╚═╝ ╚═╝╚══════╝╚═════╝ ╚═╝ ╚═╝╚═╝',
65
+ ];
66
+ function printBanner(cfg) {
67
+ console.log();
68
+ for (const line of LOGO) {
69
+ console.log(chalk_1.default.cyan(line));
70
+ }
71
+ console.log();
72
+ console.log(chalk_1.default.dim(' v' + config_1.CLI_VERSION) +
73
+ ' ' +
74
+ chalk_1.default.white(cfg.userName ?? cfg.userEmail ?? String(cfg.userId)));
75
+ console.log(chalk_1.default.dim(' Type / to see commands, Ctrl-C to exit.'));
76
+ console.log();
77
+ }
78
+ // ─── Slash command list ────────────────────────────────────────────────────────
79
+ const COMMANDS = [
80
+ { cmd: '/help', desc: 'Show all commands' },
81
+ { cmd: '/account', desc: 'Account info' },
82
+ { cmd: '/agents', desc: 'List AI agents — select default' },
83
+ { cmd: '/permissions', desc: 'View / toggle tool permissions on this machine' },
84
+ { cmd: '/mcps', desc: 'List configured MCP servers' },
85
+ { cmd: '/thread', desc: 'Show current conversation thread ID' },
86
+ { cmd: '/new', desc: 'Start a new conversation thread' },
87
+ { cmd: '/clear', desc: 'Clear screen' },
88
+ { cmd: '/exit', desc: 'Quit' },
89
+ ];
90
+ function printHelp() {
91
+ console.log();
92
+ console.log(chalk_1.default.bold(' Commands'));
93
+ console.log();
94
+ for (const { cmd, desc } of COMMANDS) {
95
+ console.log(` ${chalk_1.default.cyan(cmd.padEnd(16))} ${chalk_1.default.dim(desc)}`);
96
+ }
97
+ console.log();
98
+ console.log(chalk_1.default.dim(' Type anything else to chat with the current agent.'));
99
+ console.log();
100
+ }
101
+ // ─── /account ─────────────────────────────────────────────────────────────────
102
+ function printAccount(cfg) {
103
+ console.log();
104
+ console.log(chalk_1.default.bold(' Account'));
105
+ console.log(` ${chalk_1.default.dim('User ')} ${cfg.userName ?? '-'}`);
106
+ console.log(` ${chalk_1.default.dim('Email ')} ${cfg.userEmail ?? '-'}`);
107
+ console.log(` ${chalk_1.default.dim('Client ')} ${cfg.clientId}`);
108
+ console.log(` ${chalk_1.default.dim('Env ')} ${(cfg.env ?? 'dev').toUpperCase()}`);
109
+ console.log(` ${chalk_1.default.dim('Expires ')} ${new Date(cfg.expiresAt).toLocaleString()}` +
110
+ (cfg.expiresAt < Date.now() ? chalk_1.default.red(' (EXPIRED)') : ''));
111
+ console.log();
112
+ }
113
+ // ─── /agents ──────────────────────────────────────────────────────────────────
114
+ async function printAgents(cfg, rl) {
115
+ process.stdout.write(chalk_1.default.dim(' Loading agents...\r'));
116
+ let agents = [];
117
+ try {
118
+ const res = await axios_1.default.get(`${cfg.apiBaseUrl}/api/v1/user/agents?pageSize=50&active=true`, {
119
+ headers: buildHeaders(cfg),
120
+ timeout: 10000,
121
+ });
122
+ agents = res.data?.data?.items ?? [];
123
+ }
124
+ catch {
125
+ process.stdout.write(' \r');
126
+ console.log(chalk_1.default.red(' ✗ Could not fetch agents.'));
127
+ console.log();
128
+ return;
129
+ }
130
+ process.stdout.write(' \r');
131
+ if (agents.length === 0) {
132
+ console.log(chalk_1.default.dim(' No agents found.'));
133
+ console.log();
134
+ return;
135
+ }
136
+ console.log();
137
+ console.log(chalk_1.default.bold(` AI Agents (${agents.length})`));
138
+ console.log();
139
+ agents.forEach((a, i) => {
140
+ const current = a.id === currentAgentId;
141
+ const bullet = current ? chalk_1.default.green('●') : chalk_1.default.dim('○');
142
+ const name = current ? chalk_1.default.bold.green(a.name) : a.name;
143
+ const type = a.typeEnum ? chalk_1.default.dim(` [${a.typeEnum}]`) : '';
144
+ const active = a.active ? '' : chalk_1.default.red(' (inactive)');
145
+ console.log(` ${bullet} ${String(i + 1).padStart(2)}. ${name}${type}${active}`);
146
+ });
147
+ console.log();
148
+ console.log(chalk_1.default.dim(' Enter number to select agent, or press Enter to keep current.'));
149
+ // Pause readline and wait for selection inline
150
+ rl.pause();
151
+ const answer = await new Promise((resolve) => {
152
+ const tmp = readline_1.default.createInterface({ input: process.stdin, output: process.stdout, terminal: false });
153
+ process.stdout.write(chalk_1.default.dim(' › '));
154
+ tmp.once('line', (line) => { tmp.close(); resolve(line.trim()); });
155
+ });
156
+ rl.resume();
157
+ if (!answer) {
158
+ console.log();
159
+ return;
160
+ }
161
+ const idx = parseInt(answer, 10) - 1;
162
+ if (isNaN(idx) || idx < 0 || idx >= agents.length) {
163
+ console.log(chalk_1.default.yellow(' Invalid selection.'));
164
+ console.log();
165
+ return;
166
+ }
167
+ const chosen = agents[idx];
168
+ currentAgentId = chosen.id;
169
+ currentAgentName = chosen.name;
170
+ console.log(chalk_1.default.green(`\n ✓ Agent set to: ${chalk_1.default.bold(chosen.name)}`));
171
+ console.log();
172
+ }
173
+ // ─── /permissions ─────────────────────────────────────────────────────────────
174
+ const TOOL_DESC = {
175
+ Read: 'Read files',
176
+ Write: 'Create/overwrite files',
177
+ Edit: 'Find-and-replace in files',
178
+ Grep: 'Search content (ripgrep)',
179
+ Glob: 'Find files by pattern',
180
+ Bash: 'Run shell commands ⚠',
181
+ WebFetch: 'Fetch URLs',
182
+ RunClaude: 'Spawn Claude Code',
183
+ RunCodex: 'Spawn Codex CLI',
184
+ RunGemini: 'Spawn Gemini CLI',
185
+ LLMRequest: 'Proxy LLM via OAuth',
186
+ McpCall: 'Call MCP tool',
187
+ McpList: 'List MCP tools',
188
+ };
189
+ function printPermissions() {
190
+ const perms = (0, permissions_1.loadPermissions)();
191
+ console.log();
192
+ console.log(chalk_1.default.bold(' Tool Permissions') + chalk_1.default.dim(' (edit: redai permission)'));
193
+ console.log();
194
+ for (const name of permissions_2.ALL_TOOL_NAMES) {
195
+ const off = perms[name] === false;
196
+ const icon = off ? chalk_1.default.red('✗ off') : chalk_1.default.green('✓ on ');
197
+ console.log(` ${icon} ${chalk_1.default.bold(name.padEnd(13))} ${chalk_1.default.dim(TOOL_DESC[name])}`);
198
+ }
199
+ console.log();
200
+ }
201
+ // ─── /mcps ────────────────────────────────────────────────────────────────────
202
+ function printMcps() {
203
+ try {
204
+ // lazy import to avoid hard dep at top level
205
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
206
+ const { loadMcpConfig } = require('../../mcp/config');
207
+ const servers = loadMcpConfig();
208
+ const names = Object.keys(servers);
209
+ console.log();
210
+ console.log(chalk_1.default.bold(' MCP Servers'));
211
+ console.log();
212
+ if (names.length === 0) {
213
+ console.log(chalk_1.default.dim(' No MCP servers configured.'));
214
+ console.log(chalk_1.default.dim(' Run `redai mcp add` to configure one.'));
215
+ }
216
+ else {
217
+ for (const name of names) {
218
+ console.log(` ${chalk_1.default.green('●')} ${name}`);
219
+ }
220
+ }
221
+ console.log();
222
+ }
223
+ catch {
224
+ console.log(chalk_1.default.dim(' (MCP config unavailable)'));
225
+ console.log();
226
+ }
227
+ }
228
+ // ─── /thread ──────────────────────────────────────────────────────────────────
229
+ function printThread() {
230
+ console.log();
231
+ if (currentThreadId) {
232
+ console.log(` ${chalk_1.default.dim('Thread ')} ${currentThreadId}`);
233
+ console.log(` ${chalk_1.default.dim('Agent ')} ${currentAgentName}`);
234
+ }
235
+ else {
236
+ console.log(chalk_1.default.dim(' No active thread. Send a message to create one.'));
237
+ }
238
+ console.log();
239
+ }
240
+ // ─── Create / reset thread ────────────────────────────────────────────────────
241
+ async function createThread(cfg, title) {
242
+ try {
243
+ const res = await axios_1.default.post(`${cfg.apiBaseUrl}/api/v1/user/chat/threads`, { title }, { headers: buildHeaders(cfg), timeout: 10000 });
244
+ return res.data?.data?.id ?? null;
245
+ }
246
+ catch {
247
+ return null;
248
+ }
249
+ }
250
+ // ─── Send message + stream response ───────────────────────────────────────────
251
+ async function sendMessage(cfg, prompt) {
252
+ // Ensure thread exists
253
+ if (!currentThreadId) {
254
+ process.stdout.write(chalk_1.default.dim(' Creating thread...'));
255
+ const tid = await createThread(cfg, prompt.slice(0, 80));
256
+ if (!tid) {
257
+ process.stdout.write('\r' + ' '.repeat(30) + '\r');
258
+ console.log(chalk_1.default.red(' ✗ Could not create thread. Check connection.'));
259
+ console.log();
260
+ return;
261
+ }
262
+ currentThreadId = tid;
263
+ process.stdout.write('\r' + ' '.repeat(30) + '\r');
264
+ }
265
+ // Send message → get runId
266
+ process.stdout.write(chalk_1.default.dim(` ⠸ ${currentAgentName}...`));
267
+ let runId = null;
268
+ try {
269
+ const body = {
270
+ contentBlocks: [{ type: 'text', text: prompt }],
271
+ agentMode: 'FAST',
272
+ };
273
+ if (currentAgentId)
274
+ body.agentId = currentAgentId;
275
+ const res = await axios_1.default.post(`${cfg.apiBaseUrl}/api/v1/user/chat/threads/${currentThreadId}/messages`, body, { headers: buildHeaders(cfg), timeout: 30000 });
276
+ runId = res.data?.data?.runId ?? null;
277
+ if (!runId)
278
+ throw new Error('No runId returned');
279
+ }
280
+ catch (err) {
281
+ process.stdout.write('\r' + ' '.repeat(40) + '\r');
282
+ const msg = axios_1.default.isAxiosError(err) && err.response
283
+ ? `${err.response.status}: ${JSON.stringify(err.response.data)}`
284
+ : err instanceof Error ? err.message : String(err);
285
+ console.log(chalk_1.default.red(` ✗ ${msg}`));
286
+ console.log();
287
+ return;
288
+ }
289
+ process.stdout.write('\r' + ' '.repeat(40) + '\r');
290
+ // Stream SSE response
291
+ console.log();
292
+ process.stdout.write(chalk_1.default.dim(' '));
293
+ try {
294
+ await streamResponse(cfg, currentThreadId, runId);
295
+ }
296
+ catch (err) {
297
+ console.log(chalk_1.default.red(`\n ✗ Stream error: ${err instanceof Error ? err.message : String(err)}`));
298
+ }
299
+ console.log('\n');
300
+ }
301
+ async function streamResponse(cfg, threadId, runId) {
302
+ const url = `${cfg.apiBaseUrl}/api/v1/user/chat/threads/${threadId}/stream/${runId}`;
303
+ // Use undici for proper SSE streaming
304
+ const { fetch: undiciFetch } = await Promise.resolve().then(() => __importStar(require('undici')));
305
+ const res = await undiciFetch(url, {
306
+ headers: { ...buildHeaders(cfg), Accept: 'text/event-stream' },
307
+ });
308
+ if (!res.body)
309
+ return;
310
+ const reader = res.body.getReader();
311
+ const decoder = new TextDecoder();
312
+ let buf = '';
313
+ let lastType = '';
314
+ while (true) {
315
+ const { done, value } = await reader.read();
316
+ if (done)
317
+ break;
318
+ buf += decoder.decode(value, { stream: true });
319
+ const lines = buf.split('\n');
320
+ buf = lines.pop() ?? '';
321
+ for (const line of lines) {
322
+ if (!line.startsWith('data: '))
323
+ continue;
324
+ const raw = line.slice(6).trim();
325
+ if (!raw || raw === '[DONE]')
326
+ continue;
327
+ try {
328
+ const evt = JSON.parse(raw);
329
+ // Text delta → print inline
330
+ const delta = evt.delta ?? evt.text ?? evt.content ?? '';
331
+ if (delta) {
332
+ // First chunk after non-text event → newline indent
333
+ if (lastType !== 'text')
334
+ process.stdout.write('\n ');
335
+ process.stdout.write(delta);
336
+ lastType = 'text';
337
+ }
338
+ else if (evt.type === 'done' || evt.status === 'completed') {
339
+ break;
340
+ }
341
+ else if (evt.error) {
342
+ console.log(chalk_1.default.red(`\n ✗ ${evt.error}`));
343
+ break;
344
+ }
345
+ }
346
+ catch {
347
+ // Non-JSON SSE line — ignore
348
+ }
349
+ }
350
+ }
351
+ reader.releaseLock();
352
+ }
353
+ // ─── Auth headers ─────────────────────────────────────────────────────────────
354
+ function buildHeaders(cfg) {
355
+ return {
356
+ Authorization: `Bearer ${cfg.cliToken}`,
357
+ 'Content-Type': 'application/json',
358
+ // workspace scope — required by guards
359
+ ...(cfg.workspaceId ? { 'x-workspace-id': cfg.workspaceId } : {}),
360
+ };
361
+ }
362
+ // ─── Main REPL ────────────────────────────────────────────────────────────────
363
+ async function askCommand() {
364
+ const cfg = (0, store_1.loadConfig)();
365
+ if (!cfg) {
366
+ console.error(chalk_1.default.red('Not logged in. Run `redai login` first.'));
367
+ process.exit(1);
368
+ }
369
+ if (cfg.expiresAt < Date.now()) {
370
+ console.error(chalk_1.default.red('Session expired. Run `redai login` again.'));
371
+ process.exit(1);
372
+ }
373
+ process.stdout.write('\x1Bc'); // clear screen
374
+ printBanner(cfg);
375
+ const rl = readline_1.default.createInterface({
376
+ input: process.stdin,
377
+ output: process.stdout,
378
+ terminal: true,
379
+ prompt: '\n' + chalk_1.default.cyan('redai') + chalk_1.default.dim(' › '),
380
+ });
381
+ rl.prompt();
382
+ rl.on('line', async (raw) => {
383
+ const input = raw.trim();
384
+ if (!input) {
385
+ rl.prompt();
386
+ return;
387
+ }
388
+ // ── / → show command list ────────────────────────────────────────────────
389
+ if (input === '/') {
390
+ printHelp();
391
+ rl.prompt();
392
+ return;
393
+ }
394
+ // ── Slash commands ────────────────────────────────────────────────────────
395
+ if (input.startsWith('/')) {
396
+ const cmd = input.split(' ')[0].toLowerCase();
397
+ rl.pause();
398
+ switch (cmd) {
399
+ case '/help':
400
+ printHelp();
401
+ break;
402
+ case '/account':
403
+ printAccount(cfg);
404
+ break;
405
+ case '/agents':
406
+ await printAgents(cfg, rl);
407
+ break;
408
+ case '/permissions':
409
+ printPermissions();
410
+ break;
411
+ case '/mcps':
412
+ printMcps();
413
+ break;
414
+ case '/thread':
415
+ printThread();
416
+ break;
417
+ case '/new':
418
+ currentThreadId = null;
419
+ console.log(chalk_1.default.dim('\n Thread reset — next message starts a new conversation.\n'));
420
+ break;
421
+ case '/clear':
422
+ process.stdout.write('\x1Bc');
423
+ printBanner(cfg);
424
+ break;
425
+ case '/exit':
426
+ case '/quit':
427
+ console.log(chalk_1.default.dim('\n Bye!\n'));
428
+ rl.close();
429
+ process.exit(0);
430
+ break;
431
+ default:
432
+ console.log(chalk_1.default.yellow(`\n Unknown command: ${cmd}`));
433
+ console.log(chalk_1.default.dim(' Type / to see available commands.\n'));
434
+ }
435
+ rl.resume();
436
+ rl.prompt();
437
+ return;
438
+ }
439
+ // ── Regular prompt → send to RedAI backend ────────────────────────────────
440
+ rl.pause();
441
+ await sendMessage(cfg, input);
442
+ rl.resume();
443
+ rl.prompt();
444
+ });
445
+ rl.on('close', () => {
446
+ console.log(chalk_1.default.dim('\n Bye!\n'));
447
+ process.exit(0);
448
+ });
449
+ await new Promise(() => undefined);
450
+ }
451
+ //# sourceMappingURL=ask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../../../src/cli/commands/ask.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>;