@chenbihao/pomasa-dashboard 1.0.0 → 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.
- package/README.md +45 -61
- package/dist/cli.js +13 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,73 +1,57 @@
|
|
|
1
|
-
#
|
|
1
|
+
# POMASA Dashboard
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A web-based control panel for visualizing and monitoring POMASA multi-agent system (MAS) execution.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Quick Start
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
```bash
|
|
8
|
+
npx @chenbihao/pomasa-dashboard
|
|
9
|
+
```
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
The dashboard will start at `http://localhost:3001` and open in your browser automatically.
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
### Options
|
|
13
14
|
|
|
14
|
-
|
|
15
|
+
```bash
|
|
16
|
+
# Custom port
|
|
17
|
+
npx @chenbihao/pomasa-dashboard --port 8080
|
|
15
18
|
|
|
16
|
-
|
|
19
|
+
# Or via environment variable
|
|
20
|
+
PORT=8080 npx @chenbihao/pomasa-dashboard
|
|
21
|
+
```
|
|
17
22
|
|
|
18
|
-
|
|
19
|
-
export default defineConfig([
|
|
20
|
-
globalIgnores(['dist']),
|
|
21
|
-
{
|
|
22
|
-
files: ['**/*.{ts,tsx}'],
|
|
23
|
-
extends: [
|
|
24
|
-
// Other configs...
|
|
23
|
+
## Features
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
- **Project Overview** — card grid with stats (total, running, completed, alerts), progress bars, and status badges
|
|
26
|
+
- **Pipeline Visualization** — interactive DAG view of agent execution pipelines
|
|
27
|
+
- **Event Timeline** — real-time event and log monitoring
|
|
28
|
+
- **File Viewer** — browse and view project files with syntax highlighting
|
|
29
|
+
- **Embedded Terminal** — built-in web terminal for interacting with projects
|
|
30
|
+
- **Project Creation** — create new MAS projects from templates
|
|
31
|
+
- **i18n** — English and Chinese interface
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
])
|
|
44
|
-
```
|
|
33
|
+
## Development
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# Install dependencies
|
|
37
|
+
npm install
|
|
38
|
+
|
|
39
|
+
# Start dev server (frontend + backend with hot reload)
|
|
40
|
+
npm run dev
|
|
45
41
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
import reactDom from 'eslint-plugin-react-dom'
|
|
52
|
-
|
|
53
|
-
export default defineConfig([
|
|
54
|
-
globalIgnores(['dist']),
|
|
55
|
-
{
|
|
56
|
-
files: ['**/*.{ts,tsx}'],
|
|
57
|
-
extends: [
|
|
58
|
-
// Other configs...
|
|
59
|
-
// Enable lint rules for React
|
|
60
|
-
reactX.configs['recommended-typescript'],
|
|
61
|
-
// Enable lint rules for React DOM
|
|
62
|
-
reactDom.configs.recommended,
|
|
63
|
-
],
|
|
64
|
-
languageOptions: {
|
|
65
|
-
parserOptions: {
|
|
66
|
-
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
67
|
-
tsconfigRootDir: import.meta.dirname,
|
|
68
|
-
},
|
|
69
|
-
// other options...
|
|
70
|
-
},
|
|
71
|
-
},
|
|
72
|
-
])
|
|
42
|
+
# Build for production
|
|
43
|
+
npm run build
|
|
44
|
+
|
|
45
|
+
# Lint
|
|
46
|
+
npm run lint
|
|
73
47
|
```
|
|
48
|
+
|
|
49
|
+
## Tech Stack
|
|
50
|
+
|
|
51
|
+
- **Frontend**: React 19, TypeScript, Vite, Tailwind CSS, ReactFlow
|
|
52
|
+
- **Backend**: Express 5, WebSocket, node-pty
|
|
53
|
+
- **Terminal**: xterm.js with WebGL renderer
|
|
54
|
+
|
|
55
|
+
## License
|
|
56
|
+
|
|
57
|
+
MIT
|
package/dist/cli.js
CHANGED
|
@@ -995,19 +995,19 @@ function createApp() {
|
|
|
995
995
|
});
|
|
996
996
|
return { app, server };
|
|
997
997
|
}
|
|
998
|
-
function startServer(port2, maxRetries = 10) {
|
|
998
|
+
function startServer(port2, host2 = "127.0.0.1", maxRetries = 10) {
|
|
999
999
|
const { server } = createApp();
|
|
1000
1000
|
return new Promise((resolve, reject) => {
|
|
1001
1001
|
server.on("error", (err) => {
|
|
1002
1002
|
if (err.code === "EADDRINUSE" && maxRetries > 0) {
|
|
1003
1003
|
console.log(`Port ${port2} in use, trying ${port2 + 1}...`);
|
|
1004
1004
|
server.removeAllListeners("error");
|
|
1005
|
-
startServer(port2 + 1, maxRetries - 1).then(resolve).catch(reject);
|
|
1005
|
+
startServer(port2 + 1, host2, maxRetries - 1).then(resolve).catch(reject);
|
|
1006
1006
|
} else {
|
|
1007
1007
|
reject(err);
|
|
1008
1008
|
}
|
|
1009
1009
|
});
|
|
1010
|
-
server.listen(port2, () => {
|
|
1010
|
+
server.listen(port2, host2, () => {
|
|
1011
1011
|
console.log(`POMASA Dashboard running at http://localhost:${port2}`);
|
|
1012
1012
|
console.log(`API at http://localhost:${port2}/api`);
|
|
1013
1013
|
console.log(`WebSocket terminal at ws://localhost:${port2}/api/terminal`);
|
|
@@ -1030,8 +1030,16 @@ if (portArg !== -1 && process.argv[portArg + 1]) {
|
|
|
1030
1030
|
} else if (process.env.PORT) {
|
|
1031
1031
|
port = parseInt(process.env.PORT, 10);
|
|
1032
1032
|
}
|
|
1033
|
-
|
|
1034
|
-
|
|
1033
|
+
var host = "127.0.0.1";
|
|
1034
|
+
var hostArg = process.argv.indexOf("--host");
|
|
1035
|
+
if (hostArg !== -1 && process.argv[hostArg + 1]) {
|
|
1036
|
+
host = process.argv[hostArg + 1];
|
|
1037
|
+
} else if (process.env.HOST) {
|
|
1038
|
+
host = process.env.HOST;
|
|
1039
|
+
}
|
|
1040
|
+
startServer(port, host).then(async () => {
|
|
1041
|
+
const displayHost = host === "0.0.0.0" ? "localhost" : host;
|
|
1042
|
+
const url = `http://${displayHost}:${port}`;
|
|
1035
1043
|
try {
|
|
1036
1044
|
const open = (await import("open")).default;
|
|
1037
1045
|
await open(url);
|