@mrtrinhvn/ag-kit 1.4.1 → 1.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/cli.js
CHANGED
|
@@ -32,16 +32,44 @@ program
|
|
|
32
32
|
|
|
33
33
|
program.command('init')
|
|
34
34
|
.description('Cấy ghép Lõi Trí Nhớ (.agent) vào dự án này')
|
|
35
|
-
.action(() => {
|
|
35
|
+
.action(async () => {
|
|
36
36
|
console.log('\x1b[36m🚀 Đang khởi tạo bộ Tủy Não Lập Trình AI (AG-Kit)...\x1b[0m');
|
|
37
37
|
|
|
38
38
|
const srcAgent = path.join(TEMPLATE_DIR, '.agent');
|
|
39
39
|
if (!fs.existsSync(TARGET_AGENT_DIR)) {
|
|
40
40
|
copyRecursiveSync(srcAgent, TARGET_AGENT_DIR);
|
|
41
41
|
fs.writeFileSync(path.join(TARGET_AGENT_DIR, '.version'), pkg.version);
|
|
42
|
-
|
|
42
|
+
|
|
43
|
+
['scripts', 'start.sh', 'stop_bot.sh', '.gitignore'].forEach(item => {
|
|
44
|
+
const srcPath = path.join(TEMPLATE_DIR, item);
|
|
45
|
+
const destPath = path.join(process.cwd(), item);
|
|
46
|
+
if (fs.existsSync(srcPath) && !fs.existsSync(destPath)) {
|
|
47
|
+
copyRecursiveSync(srcPath, destPath);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const net = require('net');
|
|
52
|
+
const getPort = (port) => new Promise((resolve) => {
|
|
53
|
+
const s = net.createServer();
|
|
54
|
+
s.listen(port, () => { s.close(() => resolve(port)); });
|
|
55
|
+
s.on('error', () => { resolve(getPort(port + 1)); });
|
|
56
|
+
});
|
|
57
|
+
const bridgePort = await getPort(9656);
|
|
58
|
+
|
|
59
|
+
const envEx = path.join(TEMPLATE_DIR, '.env.example');
|
|
60
|
+
if (fs.existsSync(envEx) && !fs.existsSync('.env')) {
|
|
61
|
+
let content = fs.readFileSync(envEx, 'utf-8');
|
|
62
|
+
const projectName = path.basename(process.cwd());
|
|
63
|
+
content = content.replace(/PROJECT_NAME=.*/, `PROJECT_NAME=${projectName}`);
|
|
64
|
+
content = content.replace(/BRIDGE_PORT=.*/, `BRIDGE_PORT=${bridgePort}`);
|
|
65
|
+
fs.writeFileSync('.env', content);
|
|
66
|
+
console.log(`\x1b[32m✅ Đã cấp phát .env với BRIDGE_PORT=${bridgePort} độc quyền.\x1b[0m`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
console.log(`\x1b[32m✅ Đã cấy ghép thành công AG-Kit (v${pkg.version}) vào Project!\x1b[0m`);
|
|
43
70
|
|
|
44
|
-
console.log('\x1b[35m👉 Bước
|
|
71
|
+
console.log('\x1b[35m👉 Bước 1: Mở .env và điền TELEGRAM_BOT_TOKEN.\x1b[0m');
|
|
72
|
+
console.log('\x1b[35m👉 Bước 2: Chạy "./start.sh" để gọi Bot thức dậy.\x1b[0m');
|
|
45
73
|
} else {
|
|
46
74
|
console.log('\x1b[33m⚠️ Thư mục .agent đã tồn tại.\x1b[0m');
|
|
47
75
|
const vPath = path.join(TARGET_AGENT_DIR, '.version');
|
|
@@ -122,29 +150,52 @@ program.command('memory')
|
|
|
122
150
|
|
|
123
151
|
program.command('gateway')
|
|
124
152
|
.description('Kiểm tra trạng thái Agentic Gateway (IDE, Ollama, Telegram)')
|
|
125
|
-
.action(() => {
|
|
153
|
+
.action(async () => {
|
|
126
154
|
console.log('\x1b[36m🤖 Đang kiểm tra hệ sinh thái Agentic Gateway...\x1b[0m');
|
|
127
155
|
if (!fs.existsSync(TARGET_AGENT_DIR)) {
|
|
128
156
|
console.log('\x1b[31m❌ Chưa cấy ghép .agent.\x1b[0m');
|
|
129
157
|
return;
|
|
130
158
|
}
|
|
131
159
|
const envPath = path.join(process.cwd(), '.env');
|
|
132
|
-
let
|
|
160
|
+
let targetPort = null;
|
|
161
|
+
let bridgePort = null;
|
|
133
162
|
if (fs.existsSync(envPath)) {
|
|
134
|
-
const
|
|
135
|
-
|
|
163
|
+
const content = fs.readFileSync(envPath, 'utf-8');
|
|
164
|
+
const matchIde = content.match(/IDE_PORT=(\d+)/);
|
|
165
|
+
if (matchIde) targetPort = parseInt(matchIde[1]);
|
|
166
|
+
const matchBridge = content.match(/BRIDGE_PORT=(\d+)/);
|
|
167
|
+
if (matchBridge) bridgePort = parseInt(matchBridge[1]);
|
|
136
168
|
}
|
|
137
169
|
|
|
138
|
-
|
|
139
|
-
|
|
170
|
+
// 1. Kiểm tra lớp IDE (Hub)
|
|
171
|
+
if (targetPort) {
|
|
140
172
|
try {
|
|
141
|
-
execSync(`curl -s --max-time 2 http://127.0.0.1:${
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
173
|
+
execSync(`curl -s --max-time 2 http://127.0.0.1:${targetPort}/json/version`, { stdio: 'ignore' });
|
|
174
|
+
console.log(`\x1b[32m✅ IDE CDP: Cổng Trạm (Hub ${targetPort}) đang Online!\x1b[0m`);
|
|
175
|
+
} catch (e) {
|
|
176
|
+
console.log(`\x1b[31m❌ IDE CDP: Cổng Trạm (Hub ${targetPort}) Offline. Chạy ./start.sh để tự gọi.\x1b[0m`);
|
|
177
|
+
}
|
|
178
|
+
} else {
|
|
179
|
+
console.log(`\x1b[33m⚠️ IDE CDP: Không tìm thấy IDE_PORT trong .env.\x1b[0m`);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// 2. Kiểm tra lớp Bot Nodejs (Bridge)
|
|
183
|
+
if (bridgePort) {
|
|
184
|
+
const net = require('net');
|
|
185
|
+
const checkBridge = () => new Promise((resolve) => {
|
|
186
|
+
const s = new net.Socket();
|
|
187
|
+
s.setTimeout(2000);
|
|
188
|
+
s.on('connect', () => { s.destroy(); resolve(true); });
|
|
189
|
+
s.on('error', () => { resolve(false); });
|
|
190
|
+
s.on('timeout', () => { s.destroy(); resolve(false); });
|
|
191
|
+
s.connect(bridgePort, '127.0.0.1');
|
|
192
|
+
});
|
|
193
|
+
const up = await checkBridge();
|
|
194
|
+
if (up) console.log(`\x1b[32m✅ BRIDGE: Cổng nội bộ Bot (${bridgePort}) đang Online!\x1b[0m`);
|
|
195
|
+
else console.log(`\x1b[31m❌ BRIDGE: Cổng nội bộ Bot (${bridgePort}) đang Offline. Bot chưa nhúng.\x1b[0m`);
|
|
196
|
+
} else {
|
|
197
|
+
console.log(`\x1b[33m⚠️ BRIDGE: Không tìm thấy BRIDGE_PORT trong .env.\x1b[0m`);
|
|
146
198
|
}
|
|
147
|
-
if (!cdpOk) console.log(`\x1b[31m❌ IDE CDP: Không tìm thấy IDE đang chạy ở các cổng: ${ports.join(', ')}\x1b[0m`);
|
|
148
199
|
|
|
149
200
|
try {
|
|
150
201
|
execSync('ollama --version', { stdio: 'ignore' });
|
package/package.json
CHANGED
|
@@ -1,12 +1,50 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
#
|
|
3
|
-
# Golden Combo Edition (V3)
|
|
2
|
+
# start.sh - Hệ thống Quản trị Khởi động (Agentic Port Fusion)
|
|
4
3
|
|
|
5
4
|
# 1. Load config
|
|
6
5
|
if [ -f .env ]; then
|
|
7
6
|
source .env
|
|
7
|
+
else
|
|
8
|
+
echo "❌ Lỗi: Không tìm thấy file .env. Vui lòng tạo dựa trên .env.example"
|
|
9
|
+
exit 1
|
|
8
10
|
fi
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
PORT=${IDE_PORT:-9555}
|
|
13
|
+
PROJ=${PROJECT_NAME:-"UnknownProject"}
|
|
14
|
+
|
|
15
|
+
echo "🔍 Đang kiểm tra IDE cho [$PROJ] tại cổng $PORT..."
|
|
16
|
+
|
|
17
|
+
open_ide() {
|
|
18
|
+
if command -v antigravity &> /dev/null; then
|
|
19
|
+
antigravity --remote-debugging-port=$PORT . &
|
|
20
|
+
elif command -v cursor &> /dev/null; then
|
|
21
|
+
cursor --remote-debugging-port=$PORT . &
|
|
22
|
+
elif command -v code &> /dev/null; then
|
|
23
|
+
code --remote-debugging-port=$PORT . &
|
|
24
|
+
else
|
|
25
|
+
echo "❌ Lỗi: Không tìm thấy lệnh 'antigravity', 'cursor' hoặc 'code'."
|
|
26
|
+
echo "👉 Hãy tự mở IDE bằng tay cho thư mục này."
|
|
27
|
+
fi
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# 2. Logic Hợp thể & Mở mới linh hoạt
|
|
31
|
+
if nc -z 127.0.0.1 $PORT &>/dev/null; then
|
|
32
|
+
# Cổng đã mở, thám thính xem bên trong có dự án của mình không (lọc theo JSON Title/Url)
|
|
33
|
+
if curl -s --max-time 2 http://127.0.0.1:$PORT/json/list | grep -i "\"title\":.*$PROJ" &>/dev/null; then
|
|
34
|
+
echo "✅ [HỢP THỂ]: Cổng $PORT đang mở và Workspace [$PROJ] đang được hiển thị. Trực tiếp cắm ngầm Bot vào màn hình này..."
|
|
35
|
+
else
|
|
36
|
+
echo "⚠️ [GỌI CỬA]: Cổng $PORT có IDE đang chạy, nhưng chưa mở màn hình cho [$PROJ]. Đang ra lệnh mở thêm giao diện cho dự án này..."
|
|
37
|
+
open_ide
|
|
38
|
+
echo "⏳ Đang đợi màn hình phụ tải xong..."
|
|
39
|
+
sleep 4
|
|
40
|
+
fi
|
|
41
|
+
else
|
|
42
|
+
echo "⚠️ [MỞ MỚI TỪ ĐẦU]: Cổng CDP $PORT hoàn toàn trống. Đang phóng cỗ máy IDE chuyên biệt..."
|
|
43
|
+
open_ide
|
|
44
|
+
echo "⏳ Đang đợi rễ CDP bám rễ..."
|
|
45
|
+
sleep 4
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
# 3. Khởi động Giao diện & Agent (Receptionist)
|
|
49
|
+
echo "🚀 Đang đánh thức bộ não Agentic Gateway..."
|
|
12
50
|
bash .agent/scripts/receptionist_up.sh
|
package/template/start.sh
CHANGED
|
@@ -1,22 +1,50 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
-
# start.sh - Khởi động
|
|
2
|
+
# start.sh - Hệ thống Quản trị Khởi động (Agentic Port Fusion)
|
|
3
3
|
|
|
4
|
-
# 1.
|
|
5
|
-
if [
|
|
4
|
+
# 1. Load config
|
|
5
|
+
if [ -f .env ]; then
|
|
6
|
+
source .env
|
|
7
|
+
else
|
|
6
8
|
echo "❌ Lỗi: Không tìm thấy file .env. Vui lòng tạo dựa trên .env.example"
|
|
7
9
|
exit 1
|
|
8
10
|
fi
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
PORT=${IDE_PORT:-9555}
|
|
13
|
+
PROJ=${PROJECT_NAME:-"UnknownProject"}
|
|
12
14
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
if
|
|
17
|
-
|
|
15
|
+
echo "🔍 Đang kiểm tra IDE cho [$PROJ] tại cổng $PORT..."
|
|
16
|
+
|
|
17
|
+
open_ide() {
|
|
18
|
+
if command -v antigravity &> /dev/null; then
|
|
19
|
+
antigravity --remote-debugging-port=$PORT . &
|
|
20
|
+
elif command -v cursor &> /dev/null; then
|
|
21
|
+
cursor --remote-debugging-port=$PORT . &
|
|
22
|
+
elif command -v code &> /dev/null; then
|
|
23
|
+
code --remote-debugging-port=$PORT . &
|
|
24
|
+
else
|
|
25
|
+
echo "❌ Lỗi: Không tìm thấy lệnh 'antigravity', 'cursor' hoặc 'code'."
|
|
26
|
+
echo "👉 Hãy tự mở IDE bằng tay cho thư mục này."
|
|
27
|
+
fi
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# 2. Logic Hợp thể & Mở mới linh hoạt
|
|
31
|
+
if nc -z 127.0.0.1 $PORT &>/dev/null; then
|
|
32
|
+
# Cổng đã mở, thám thính xem bên trong có dự án của mình không (lọc theo JSON Title/Url)
|
|
33
|
+
if curl -s --max-time 2 http://127.0.0.1:$PORT/json/list | grep -i "\"title\":.*$PROJ" &>/dev/null; then
|
|
34
|
+
echo "✅ [HỢP THỂ]: Cổng $PORT đang mở và Workspace [$PROJ] đang được hiển thị. Trực tiếp cắm ngầm Bot vào màn hình này..."
|
|
35
|
+
else
|
|
36
|
+
echo "⚠️ [GỌI CỬA]: Cổng $PORT có IDE đang chạy, nhưng chưa mở màn hình cho [$PROJ]. Đang ra lệnh mở thêm giao diện cho dự án này..."
|
|
37
|
+
open_ide
|
|
38
|
+
echo "⏳ Đang đợi màn hình phụ tải xong..."
|
|
39
|
+
sleep 4
|
|
40
|
+
fi
|
|
41
|
+
else
|
|
42
|
+
echo "⚠️ [MỞ MỚI TỪ ĐẦU]: Cổng CDP $PORT hoàn toàn trống. Đang phóng cỗ máy IDE chuyên biệt..."
|
|
43
|
+
open_ide
|
|
44
|
+
echo "⏳ Đang đợi rễ CDP bám rễ..."
|
|
45
|
+
sleep 4
|
|
18
46
|
fi
|
|
19
47
|
|
|
20
|
-
#
|
|
21
|
-
echo "🚀
|
|
48
|
+
# 3. Khởi động Giao diện & Agent (Receptionist)
|
|
49
|
+
echo "🚀 Đang đánh thức bộ não Agentic Gateway..."
|
|
22
50
|
bash .agent/scripts/receptionist_up.sh
|