vibemon 1.9.1 → 1.9.3

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 CHANGED
@@ -10,8 +10,17 @@ See at a glance what your AI assistant is doing — thinking, working, or waitin
10
10
 
11
11
  ![Demo](https://raw.githubusercontent.com/nalbam/vibemon-app/main/images/demo.gif)
12
12
 
13
+ ## Quick Start
14
+
15
+ ```bash
16
+ npx vibemon
17
+ ```
18
+
19
+ The app launches in the system tray and listens on `http://127.0.0.1:19280`.
20
+
13
21
  ## Supported Tools
14
22
 
23
+ - **Apto** - Personal AI coding assistant
15
24
  - **[Claude Code](https://claude.ai/code)** - Anthropic's AI coding assistant
16
25
  - **[Kiro](https://kiro.dev/)** - AWS's AI coding assistant
17
26
  - **[OpenClaw](https://openclaw.ai/)** - Open-source computer use agent
@@ -22,18 +31,19 @@ See at a glance what your AI assistant is doing — thinking, working, or waitin
22
31
  - **Always on Top** - Always displayed above other windows
23
32
  - **System Tray** - Quick control from the menu bar
24
33
  - **Multi-window** - One window per project (up to 5)
34
+ - **Snap to Corner** - Auto-snaps near screen edges
35
+ - **Click to Focus** - Switch to iTerm2/Ghostty tab (macOS)
36
+ - **Open at Login** - Auto-start on macOS login
25
37
  - **HTTP API** - Easy integration with hooks
26
- - **Auto-launch** - Hook scripts auto-start via `npx vibemon`
27
38
 
28
39
  ## Documentation
29
40
 
30
- For installation and setup instructions, visit **[vibemon.io/docs](https://vibemon.io/docs)**.
41
+ For full documentation, visit **[vibemon.io/docs](https://vibemon.io/docs)**.
31
42
 
32
43
  ## Links
33
44
 
34
45
  - [Homepage](https://nalbam.github.io/vibemon-app/)
35
46
  - [GitHub Repository](https://github.com/nalbam/vibemon-app)
36
- - [Full Documentation](https://github.com/nalbam/vibemon-app#readme)
37
47
 
38
48
  ## License
39
49
 
package/main.js CHANGED
@@ -160,6 +160,22 @@ function handleWsStatusUpdate(data) {
160
160
  windowManager.sendToWindow(projectId, 'state-update', stateData);
161
161
  }
162
162
 
163
+ /**
164
+ * Handle project deletion from WebSocket ({type: 'delete', data: {project}}).
165
+ * Closes the window for the deleted project; windowManager.onWindowClosed
166
+ * cascades into stateManager.cleanupProject and tray refresh, so no extra
167
+ * bookkeeping is needed here. No-op when the project is unknown locally.
168
+ */
169
+ function handleWsStatusDelete(projectId) {
170
+ if (typeof projectId !== 'string' || projectId.length === 0) {
171
+ return;
172
+ }
173
+ if (!windowManager.getWindow(projectId)) {
174
+ return;
175
+ }
176
+ windowManager.closeWindow(projectId);
177
+ }
178
+
163
179
  // IPC handlers
164
180
  ipcMain.handle('get-version', () => {
165
181
  return app.getVersion();
@@ -321,6 +337,9 @@ app.whenReady().then(() => {
321
337
  wsClient.onStatusUpdate = (data) => {
322
338
  handleWsStatusUpdate(data);
323
339
  };
340
+ wsClient.onStatusDelete = (projectId) => {
341
+ handleWsStatusDelete(projectId);
342
+ };
324
343
  wsClient.onConnectionChange = () => {
325
344
  if (trayManager) {
326
345
  trayManager.updateMenu();
@@ -140,6 +140,12 @@ class HttpServer {
140
140
  const route = `${req.method} ${req.url}`;
141
141
 
142
142
  switch (route) {
143
+ case 'GET /':
144
+ await this.handleGetDashboard(res);
145
+ break;
146
+ case 'GET /dashboard-data':
147
+ this.handleGetDashboardData(res);
148
+ break;
143
149
  case 'POST /status':
144
150
  await this.handlePostStatus(req, res);
145
151
  break;
@@ -559,6 +565,36 @@ class HttpServer {
559
565
  });
560
566
  }
561
567
 
568
+ handleGetDashboardData(res) {
569
+ const windows = this.windowManager.getWindows();
570
+ const windowList = Object.entries(windows).map(([projectId, info]) => ({
571
+ project: projectId,
572
+ state: info.state ? info.state.state : 'unknown'
573
+ }));
574
+
575
+ sendJson(res, 200, {
576
+ health: 'ok',
577
+ windowCount: windowList.length,
578
+ windowMode: this.windowManager.getWindowMode(),
579
+ lockMode: this.windowManager.getLockMode(),
580
+ lockedProject: this.windowManager.getLockedProject(),
581
+ windows: windowList
582
+ });
583
+ }
584
+
585
+ async handleGetDashboard(res) {
586
+ const dashboardPath = path.join(__dirname, '..', 'dashboard.html');
587
+
588
+ try {
589
+ const html = await fsPromises.readFile(dashboardPath, 'utf8');
590
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
591
+ res.end(html);
592
+ } catch (err) {
593
+ console.error('Failed to load dashboard page:', err.message);
594
+ sendError(res, 500, 'Failed to load dashboard page');
595
+ }
596
+ }
597
+
562
598
  async handleGetStatsPage(res) {
563
599
  const statsHtmlPath = path.join(__dirname, '..', 'stats.html');
564
600
 
@@ -41,6 +41,7 @@ class WsClient {
41
41
 
42
42
  // Callbacks
43
43
  this.onStatusUpdate = null; // Called when status message received
44
+ this.onStatusDelete = null; // Called when {type:'delete'} received with project name
44
45
  this.onConnectionChange = null; // Called when connection state changes
45
46
  }
46
47
 
@@ -240,6 +241,15 @@ class WsClient {
240
241
  return;
241
242
  }
242
243
 
244
+ // Handle project deletion (server sends {type: "delete", data: {project}})
245
+ // Emitted by DELETE /api/status?project=X on the server side.
246
+ if (message.type === 'delete' && message.data && typeof message.data.project === 'string') {
247
+ if (this.onStatusDelete) {
248
+ this.onStatusDelete(message.data.project);
249
+ }
250
+ return;
251
+ }
252
+
243
253
  // Handle status update (direct format: {state: "..."})
244
254
  if (message.state) {
245
255
  if (this.onStatusUpdate) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibemon",
3
- "version": "1.9.1",
3
+ "version": "1.9.3",
4
4
  "description": "AI assistant status monitor",
5
5
  "main": "main.js",
6
6
  "bin": {
@@ -37,8 +37,8 @@
37
37
 
38
38
  "PROJECT_NAME_MAX_LENGTH": 20,
39
39
  "PROJECT_NAME_TRUNCATE_AT": 17,
40
- "MODEL_NAME_MAX_LENGTH": 14,
41
- "MODEL_NAME_TRUNCATE_AT": 11,
40
+ "MODEL_NAME_MAX_LENGTH": 20,
41
+ "MODEL_NAME_TRUNCATE_AT": 17,
42
42
 
43
43
  "MATRIX_STREAM_DENSITY": 0.7,
44
44
  "MATRIX_SPEED_MIN": 1,