noctrace 0.7.2 → 0.7.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.
@@ -7,7 +7,7 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com" />
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
9
  <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap" rel="stylesheet" />
10
- <script type="module" crossorigin src="/assets/index-Bm2zvJB3.js"></script>
10
+ <script type="module" crossorigin src="/assets/index-CLA0rrye.js"></script>
11
11
  <link rel="stylesheet" crossorigin href="/assets/index-iQItZcUN.css">
12
12
  </head>
13
13
  <body>
@@ -242,6 +242,29 @@ export function buildApiRouter(claudeHome, wss) {
242
242
  }
243
243
  });
244
244
  // ---------------------------------------------------------------------------
245
+ // GET /api/sessions/registered (MUST be before /sessions/:slug to avoid param capture)
246
+ // ---------------------------------------------------------------------------
247
+ /**
248
+ * Return the list of currently registered MCP session paths.
249
+ * An empty array means standalone mode (show all sessions from disk).
250
+ * A non-empty array means MCP mode (show only registered sessions).
251
+ */
252
+ router.get('/sessions/registered', async (_req, res) => {
253
+ const STALE_THRESHOLD_MS = 5 * 60 * 1000;
254
+ for (const registeredPath of registeredSessionPaths) {
255
+ try {
256
+ const stat = await fs.stat(registeredPath);
257
+ if (Date.now() - stat.mtime.getTime() > STALE_THRESHOLD_MS) {
258
+ registeredSessionPaths.delete(registeredPath);
259
+ }
260
+ }
261
+ catch {
262
+ registeredSessionPaths.delete(registeredPath);
263
+ }
264
+ }
265
+ res.json({ sessions: Array.from(registeredSessionPaths) });
266
+ });
267
+ // ---------------------------------------------------------------------------
245
268
  // GET /api/sessions/:slug
246
269
  // ---------------------------------------------------------------------------
247
270
  /**
@@ -572,30 +595,5 @@ export function buildApiRouter(claudeHome, wss) {
572
595
  }
573
596
  });
574
597
  // ---------------------------------------------------------------------------
575
- // GET /api/sessions/registered
576
- // ---------------------------------------------------------------------------
577
- /**
578
- * Return the list of currently registered MCP session paths.
579
- * An empty array means standalone mode (show all sessions from disk).
580
- * A non-empty array means MCP mode (show only registered sessions).
581
- */
582
- router.get('/sessions/registered', async (_req, res) => {
583
- // Prune phantom sessions whose JSONL has not been modified in the last 5 minutes.
584
- // Active sessions are written to frequently; stale ones left by SIGKILL won't be.
585
- const STALE_THRESHOLD_MS = 5 * 60 * 1000;
586
- for (const registeredPath of registeredSessionPaths) {
587
- try {
588
- const stat = await fs.stat(registeredPath);
589
- if (Date.now() - stat.mtime.getTime() > STALE_THRESHOLD_MS) {
590
- registeredSessionPaths.delete(registeredPath);
591
- }
592
- }
593
- catch {
594
- // File no longer exists — remove the phantom entry
595
- registeredSessionPaths.delete(registeredPath);
596
- }
597
- }
598
- res.json({ sessions: Array.from(registeredSessionPaths) });
599
- });
600
598
  return router;
601
599
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "noctrace",
3
- "version": "0.7.2",
3
+ "version": "0.7.3",
4
4
  "description": "Chrome DevTools Network-tab-style waterfall visualizer for Claude Code agent workflows",
5
5
  "type": "module",
6
6
  "license": "MIT",