agent-window 1.0.1 → 1.0.2

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 (53) hide show
  1. package/bin/cli.js +45 -0
  2. package/docs/WEB_UI_GUIDE.md +249 -0
  3. package/package.json +11 -2
  4. package/scripts/test-platform.js +109 -0
  5. package/src/api/routes/index.js +25 -0
  6. package/src/api/routes/instances.js +252 -0
  7. package/src/api/routes/operations.js +118 -0
  8. package/src/api/routes/system.js +42 -0
  9. package/src/api/server.js +147 -0
  10. package/src/api/websocket/index.js +16 -0
  11. package/src/api/websocket/logs.js +127 -0
  12. package/src/cli/commands/add.js +80 -0
  13. package/src/cli/commands/config.js +192 -0
  14. package/src/cli/commands/index.js +89 -0
  15. package/src/cli/commands/info.js +94 -0
  16. package/src/cli/commands/list.js +72 -0
  17. package/src/cli/commands/logs.js +67 -0
  18. package/src/cli/commands/remove.js +97 -0
  19. package/src/cli/commands/restart.js +67 -0
  20. package/src/cli/commands/start.js +101 -0
  21. package/src/cli/commands/status.js +95 -0
  22. package/src/cli/commands/stop.js +53 -0
  23. package/src/cli/commands/ui.js +51 -0
  24. package/src/cli/index.js +110 -0
  25. package/src/core/config.js +5 -10
  26. package/src/core/instance/backup-manager.js +172 -0
  27. package/src/core/instance/config-manager.js +279 -0
  28. package/src/core/instance/index.js +62 -0
  29. package/src/core/instance/manager.js +220 -0
  30. package/src/core/instance/pm2-bridge.js +205 -0
  31. package/src/core/instance/validator.js +161 -0
  32. package/src/core/platform/detector.js +142 -0
  33. package/src/core/platform/docker-bridge.js +372 -0
  34. package/src/core/platform/index.js +27 -0
  35. package/src/core/platform/paths.js +112 -0
  36. package/src/core/platform/pm2-bridge.js +314 -0
  37. package/web/dist/assets/Dashboard-C1smB9Nj.js +1 -0
  38. package/web/dist/assets/Dashboard-ezbZMSpZ.css +1 -0
  39. package/web/dist/assets/InstanceDetail-CRPMV7rg.css +1 -0
  40. package/web/dist/assets/InstanceDetail-C_Ddtrog.js +3 -0
  41. package/web/dist/assets/Instances-CvnH8iDv.css +1 -0
  42. package/web/dist/assets/Instances-_u2__M83.js +1 -0
  43. package/web/dist/assets/Settings-CAu3R9RW.css +1 -0
  44. package/web/dist/assets/Settings-CIa9MX7m.js +1 -0
  45. package/web/dist/assets/_plugin-vue_export-helper-DlAUqK2U.js +1 -0
  46. package/web/dist/assets/element-plus-Jr6qTeY5.js +37 -0
  47. package/web/dist/assets/main-CalRvcyG.css +1 -0
  48. package/web/dist/assets/main-D3cdXAiV.js +7 -0
  49. package/web/dist/assets/vue-vendor-CGSlMM3Y.js +29 -0
  50. package/web/dist/index.html +16 -0
  51. package/SECURITY.md +0 -31
  52. package/docs/legacy/DEVELOPMENT.md +0 -174
  53. package/docs/legacy/HANDOVER.md +0 -149
package/bin/cli.js CHANGED
@@ -662,6 +662,44 @@ async function addBot() {
662
662
  log(' pm2 start ' + ecosystemFile + ' --only bot-' + botName);
663
663
  }
664
664
 
665
+ // UI - Launch Web Interface
666
+ async function ui() {
667
+ log('🌐 Starting AgentWindow Web UI...\n', colors.cyan);
668
+
669
+ // Check if frontend is built
670
+ const distPath = join(PROJECT_ROOT, 'web', 'dist');
671
+ if (!existsSync(distPath)) {
672
+ logError('Frontend not built. Run: npm run ui:build');
673
+ process.exit(1);
674
+ }
675
+
676
+ // Parse arguments
677
+ const args = process.argv.slice(3);
678
+ let port = 3721;
679
+ let openBrowser = true;
680
+
681
+ for (let i = 0; i < args.length; i++) {
682
+ if (args[i] === '--port' || args[i] === '-p') {
683
+ port = parseInt(args[++i]) || 3721;
684
+ } else if (args[i] === '--no-open') {
685
+ openBrowser = false;
686
+ }
687
+ }
688
+
689
+ // Start server
690
+ try {
691
+ const { startServer } = await import('../src/api/server.js');
692
+ await startServer({
693
+ port,
694
+ logger: true,
695
+ open: openBrowser
696
+ });
697
+ } catch (e) {
698
+ logError('Failed to start server: ' + e.message);
699
+ process.exit(1);
700
+ }
701
+ }
702
+
665
703
  // Help
666
704
  function showHelp() {
667
705
  showBanner();
@@ -682,6 +720,9 @@ ${colors.cyan}Multi-Bot Commands:${colors.reset}
682
720
  init Initialize multi-bot management directory
683
721
  add-bot Add a new bot instance
684
722
 
723
+ ${colors.cyan}Web UI:${colors.reset}
724
+ ui Launch web management interface
725
+
685
726
  ${colors.cyan}General:${colors.reset}
686
727
  help Show this help
687
728
 
@@ -689,6 +730,7 @@ ${colors.cyan}Examples:${colors.reset}
689
730
  agent-bridge setup ${colors.dim}# First time setup${colors.reset}
690
731
  agent-bridge init ${colors.dim}# Initialize ~/bots directory${colors.reset}
691
732
  agent-bridge add-bot myproject ${colors.dim}# Add a new bot${colors.reset}
733
+ agent-bridge ui ${colors.dim}# Launch web UI${colors.reset}
692
734
  pm2 start ~/bots/ecosystem.config.cjs ${colors.dim}# Start all bots${colors.reset}
693
735
 
694
736
  ${colors.cyan}Documentation:${colors.reset}
@@ -730,6 +772,9 @@ switch (command) {
730
772
  case 'add-bot':
731
773
  addBot();
732
774
  break;
775
+ case 'ui':
776
+ await ui();
777
+ break;
733
778
  case 'help':
734
779
  case '--help':
735
780
  case '-h':
@@ -0,0 +1,249 @@
1
+ # AgentWindow Web UI 用户指南
2
+
3
+ ## 简介
4
+
5
+ AgentWindow Web UI 是一个基于浏览器的管理界面,用于管理你的 AI Bot 实例。采用 Apple 风格设计,提供简洁优雅的用户体验。
6
+
7
+ ## 快速开始
8
+
9
+ ### 启动 Web UI
10
+
11
+ ```bash
12
+ agent-window ui
13
+ ```
14
+
15
+ 服务器将在 `http://127.0.0.1:3721` 启动,浏览器会自动打开。
16
+
17
+ ### 命令选项
18
+
19
+ | 选项 | 说明 |
20
+ |------|------|
21
+ | `--port, -p <port>` | 指定端口号(默认:3721) |
22
+ | `--no-open` | 不自动打开浏览器 |
23
+ | `--dev` | 开发模式 |
24
+
25
+ ---
26
+
27
+ ## 功能说明
28
+
29
+ ### 1. Dashboard(仪表板)
30
+
31
+ 主页显示所有 Bot 实例的状态概览:
32
+
33
+ - **统计卡片**:显示总数、运行中、已停止、错误数量
34
+ - **实例卡片**:每个实例显示:
35
+ - 名称和显示名称
36
+ - 运行状态(运行中/已停止/错误)
37
+ - 内存使用量
38
+ - CPU 使用率
39
+ - 运行时间
40
+ - 快捷操作按钮(启动/停止/重启)
41
+
42
+ ### 2. 实例管理
43
+
44
+ #### 添加实例
45
+
46
+ 1. 点击右上角 **"Add Instance"** 按钮
47
+ 2. 填写表单:
48
+ - **Name**: 实例标识符(小写字母、数字、连字符)
49
+ - **Display Name**: 显示名称
50
+ - **Project Path**: Bot 项目路径
51
+ - **Tags**: 标签(可选,逗号分隔)
52
+
53
+ 3. 点击 **"Add Instance"** 完成
54
+
55
+ #### 删除实例
56
+
57
+ 1. 进入 **Instances** 页面
58
+ 2. 找到要删除的实例
59
+ 3. 点击 **"Delete"** 按钮
60
+ 4. 确认删除
61
+
62
+ #### 实例操作
63
+
64
+ 每个实例卡片有三个操作按钮:
65
+
66
+ | 按钮 | 功能 | 说明 |
67
+ |------|------|------|
68
+ | ▶ | 启动 | 启动已停止的实例 |
69
+ | ⏸ | 停止 | 停止运行中的实例 |
70
+ | 🔄 | 重启 | 重启实例 |
71
+
72
+ ### 3. 实例详情
73
+
74
+ 点击实例卡片上的 **"Details"** 按钮进入详情页面,查看:
75
+
76
+ - **状态面板**:PID、内存、CPU、重启次数
77
+ - **信息面板**:路径、配置、添加时间、标签
78
+ - **实时日志**:最近的日志输出
79
+
80
+ ### 4. 实时日志
81
+
82
+ 日志查看器功能:
83
+
84
+ - **Live 开关**:启用/禁用实时日志流
85
+ - **类型过滤**:All / Stdout / Stderr
86
+ - **搜索**:搜索日志内容
87
+ - **导出**:下载日志为文本文件
88
+ - **清空**:清空当前日志显示
89
+ - **全屏**:全屏查看日志
90
+
91
+ ### 5. 设置
92
+
93
+ 设置页面显示:
94
+
95
+ - 系统信息(平台、Node 版本、版本号)
96
+ - 外观设置(深色模式切换)
97
+ - 关于信息
98
+
99
+ ---
100
+
101
+ ## 支持的 Bot 类型
102
+
103
+ ### 类型 1: 独立 Bot
104
+
105
+ 普通的 Discord/Slack Bot,具有基本结构:
106
+
107
+ ```
108
+ my-bot/
109
+ ├── config.json
110
+ ├── package.json (含 discord.js)
111
+ └── src/
112
+ └── bot.js
113
+ ```
114
+
115
+ ### 类型 2: BMAD 插件
116
+
117
+ 集成 BMAD 框架的高级 Bot:
118
+
119
+ ```
120
+ my-bmad-bot/
121
+ ├── _bmad/ # BMAD 框架
122
+ │ ├── core/ # 核心模块
123
+ │ ├── bmm/ # BMAD 业务模块
124
+ │ └── _config/ # 配置文件
125
+ ├── _agent-bridge/ # 插件目录
126
+ │ └── src/
127
+ │ └── bot.js # Bot 入口
128
+ └── package.json # 依赖 discord.js
129
+ ```
130
+
131
+ ---
132
+
133
+ ## 实例添加示例
134
+
135
+ ### 示例 1: 添加独立 Bot
136
+
137
+ ```bash
138
+ # 假设你有一个简单 Bot 在 ~/bots/my-bot
139
+ agent-window instance add my-bot ~/bots/my-bot
140
+ ```
141
+
142
+ 或在 Web UI 中:
143
+ - Name: `my-bot`
144
+ - Display Name: `My Bot`
145
+ - Project Path: `/Users/yourname/bots/my-bot`
146
+
147
+ ### 示例 2: 添加 BMAD Bot
148
+
149
+ ```bash
150
+ # 添加 BMAD 企业 Bot
151
+ agent-window instance add corp-office ~/projects/corp-office --tags prod,bmad
152
+ ```
153
+
154
+ 或在 Web UI 中:
155
+ - Name: `corp-office`
156
+ - Display Name: `Corporate Office Bot`
157
+ - Project Path: `/Users/yourname/projects/corp-office`
158
+ - Tags: `prod, bmad`
159
+
160
+ ---
161
+
162
+ ## CLI 命令参考
163
+
164
+ ### 实例管理
165
+
166
+ ```bash
167
+ # 列出所有实例
168
+ agent-window instance list
169
+
170
+ # 添加实例
171
+ agent-window instance add <name> <project-path> [options]
172
+
173
+ # 删除实例
174
+ agent-window instance remove <name>
175
+
176
+ # 查看实例详情
177
+ agent-window instance info <name>
178
+
179
+ # 实例配置
180
+ agent-window instance config <name> get <key>
181
+ agent-window instance config <name> set <key> <value>
182
+ agent-window instance config <name> list
183
+ agent-window instance config <name> backup
184
+ ```
185
+
186
+ ### 实例操作
187
+
188
+ ```bash
189
+ # 启动实例
190
+ agent-window instance start <name>
191
+
192
+ # 停止实例
193
+ agent-window instance stop <name>
194
+
195
+ # 重启实例
196
+ agent-window instance restart <name>
197
+
198
+ # 查看状态
199
+ agent-window instance status <name>
200
+
201
+ # 查看日志
202
+ agent-window instance logs <name>
203
+ ```
204
+
205
+ ---
206
+
207
+ ## 常见问题
208
+
209
+ ### Q: Web UI 无法启动?
210
+
211
+ A: 检查:
212
+ 1. 端口 3721 是否被占用
213
+ 2. 前端是否已构建 (`npm run ui:build`)
214
+ 3. 依赖是否已安装
215
+
216
+ ### Q: 添加实例失败?
217
+
218
+ A: 确保项目:
219
+ 1. 路径存在且可访问
220
+ 2. 包含 `package.json` 和 `src/bot.js`
221
+ 3. BMAD 项目需要 `_bmad` 目录
222
+
223
+ ### Q: 实例状态显示 Unknown?
224
+
225
+ A: 这表示实例未在 PM2 中运行,使用 `start` 按钮启动。
226
+
227
+ ### Q: 日志不显示?
228
+
229
+ A: 检查:
230
+ 1. 实例是否已启动
231
+ 2. Live 开关是否已启用
232
+ 3. 浏览器控制台是否有错误
233
+
234
+ ---
235
+
236
+ ## 键盘快捷键
237
+
238
+ | 快捷键 | 功能 |
239
+ |--------|------|
240
+ | `Cmd/Ctrl + K` | 聚焦搜索框 |
241
+ | `Esc` | 关闭模态框 |
242
+ | `Cmd/Ctrl + /` | 切换深色模式 |
243
+
244
+ ---
245
+
246
+ ## 技术支持
247
+
248
+ - 项目地址:https://github.com/Observer-GGboy/AgentWindow
249
+ - 问题反馈:GitHub Issues
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-window",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "A window to interact with AI agents through chat interfaces. Simplified interaction, powerful backend capabilities.",
5
5
  "type": "module",
6
6
  "main": "src/bot.js",
@@ -11,6 +11,9 @@
11
11
  "start": "node src/bot.js",
12
12
  "dev": "node --watch src/bot.js",
13
13
  "setup": "node bin/cli.js setup",
14
+ "ui": "node bin/cli.js ui",
15
+ "ui:dev": "cd web && npm run dev",
16
+ "ui:build": "cd web && npm run build",
14
17
  "pm2:start": "pm2 start ecosystem.config.cjs",
15
18
  "pm2:stop": "pm2 stop agent-window",
16
19
  "pm2:restart": "pm2 restart agent-window",
@@ -36,7 +39,13 @@
36
39
  "node": ">=18.0.0"
37
40
  },
38
41
  "dependencies": {
39
- "discord.js": "^14.14.1"
42
+ "@fastify/static": "^6.0.0",
43
+ "@fastify/websocket": "^10.0.0",
44
+ "cli-table3": "^0.6.5",
45
+ "discord.js": "^14.14.1",
46
+ "fastify": "^4.25.0",
47
+ "open": "^10.0.0",
48
+ "pino-pretty": "^10.0.0"
40
49
  },
41
50
  "overrides": {
42
51
  "undici": "^7.19.0"
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Platform Compatibility Test Script
4
+ *
5
+ * Tests the platform abstraction layer to ensure cross-platform compatibility.
6
+ * Run this script on different platforms to verify functionality.
7
+ */
8
+
9
+ import {
10
+ Platform,
11
+ currentPlatform,
12
+ isWindows,
13
+ isWSLAvailable,
14
+ getShell,
15
+ paths,
16
+ docker,
17
+ pm2
18
+ } from '../src/core/platform/index.js';
19
+
20
+ console.log('\n=== Platform Compatibility Test ===\n');
21
+
22
+ // Test 1: Platform Detection
23
+ console.log('1. Platform Detection');
24
+ console.log(` Current Platform: ${currentPlatform}`);
25
+ console.log(` Is Windows: ${isWindows()}`);
26
+ console.log(` Platform Enum: ${Platform.WINDOWS}, ${Platform.LINUX}, ${Platform.MACOS}\n`);
27
+
28
+ // Test 2: Shell Detection
29
+ console.log('2. Shell Detection');
30
+ const shell = getShell();
31
+ console.log(` Shell Command: ${shell.command}`);
32
+ console.log(` Shell Type: ${shell.type}\n`);
33
+
34
+ // Test 3: Path Utilities
35
+ console.log('3. Path Utilities');
36
+ console.log(` Home Dir: ${paths.getHomeDir()}`);
37
+ console.log(` AgentWindow Home: ${paths.getAgentWindowHome()}`);
38
+ console.log(` Bots Dir: ${paths.getBotsDir()}`);
39
+ console.log(` Claude Config: ${paths.getClaudeConfigDir()}`);
40
+ console.log(` Expanded ~: ${paths.expandTilde('~/test')}`);
41
+ console.log(` Config Dir: ${paths.getConfigDir()}`);
42
+ console.log(` Data Dir: ${paths.getDataDir()}\n`);
43
+
44
+ // Test 4: WSL Detection (Windows only)
45
+ if (isWindows()) {
46
+ console.log('4. WSL Detection (Windows)');
47
+ isWSLAvailable().then(available => {
48
+ console.log(` WSL Available: ${available}\n`);
49
+ }).catch(() => {
50
+ console.log(' WSL Detection failed\n');
51
+ });
52
+ } else {
53
+ console.log('4. WSL Detection: Skipped (not Windows)\n');
54
+ }
55
+
56
+ // Test 5: PM2 Availability
57
+ console.log('5. PM2 Availability');
58
+ pm2.isAvailable().then(available => {
59
+ console.log(` PM2 Available: ${available}`);
60
+ if (available) {
61
+ pm2.version().then(version => {
62
+ console.log(` PM2 Version: ${version}`);
63
+ runDockerTests();
64
+ }).catch(() => {
65
+ console.log(' PM2 Version: unknown');
66
+ runDockerTests();
67
+ });
68
+ } else {
69
+ console.log(' PM2 not installed - skipping PM2 tests');
70
+ runDockerTests();
71
+ }
72
+ }).catch(() => {
73
+ console.log(' PM2 detection failed');
74
+ runDockerTests();
75
+ });
76
+
77
+ // Test 6: Docker Availability
78
+ function runDockerTests() {
79
+ console.log('\n6. Docker Availability');
80
+ docker.isAvailable().then(available => {
81
+ console.log(` Docker Available: ${available}`);
82
+ if (available) {
83
+ docker.version().then(version => {
84
+ console.log(` Docker Version: ${version.Server?.Version || 'unknown'}`);
85
+ finishTests();
86
+ }).catch(() => {
87
+ console.log(' Docker Version: unknown');
88
+ finishTests();
89
+ });
90
+ } else {
91
+ console.log(' Docker not installed - skipping Docker tests');
92
+ finishTests();
93
+ }
94
+ }).catch(() => {
95
+ console.log(' Docker detection failed');
96
+ finishTests();
97
+ });
98
+ }
99
+
100
+ function finishTests() {
101
+ console.log('\n=== Test Complete ===\n');
102
+ console.log('Platform abstraction layer is working correctly.');
103
+ console.log('Next steps:');
104
+ console.log(' - Test actual PM2 process management');
105
+ console.log(' - Test Docker container operations');
106
+ console.log(' - Test on Windows with WSL2');
107
+ console.log(' - Test on Windows with Docker Desktop');
108
+ console.log('');
109
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * API Routes Registry
3
+ *
4
+ * Registers all REST API routes.
5
+ */
6
+
7
+ import { registerInstanceRoutes } from './instances.js';
8
+ import { registerOperationRoutes } from './operations.js';
9
+ import { registerSystemRoutes } from './system.js';
10
+
11
+ /**
12
+ * Register all API routes
13
+ */
14
+ export async function registerRoutes(fastify) {
15
+ // Instance management routes
16
+ await registerInstanceRoutes(fastify);
17
+
18
+ // Operation routes (start/stop/restart)
19
+ await registerOperationRoutes(fastify);
20
+
21
+ // System routes (health, info)
22
+ await registerSystemRoutes(fastify);
23
+
24
+ fastify.log.info('All API routes registered');
25
+ }