tokviz 0.2.1 → 0.3.1

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.
@@ -0,0 +1 @@
1
+ :root{--bg:#fff;--bg-secondary:#f5f5f5;--text:#1a1a1a;--text-secondary:#666;--border:#e0e0e0;--accent:#2563eb;--accent-hover:#1d4ed8;--card-bg:#fff;--card-shadow:0 1px 3px #0000001a;--chart-input:#3b82f6;--chart-output:#f59e0b;--chart-cost:#8b5cf6}@media (prefers-color-scheme:dark){:root{--bg:#0a0a0a;--bg-secondary:#1a1a1a;--text:#e5e5e5;--text-secondary:#999;--border:#333;--accent:#3b82f6;--accent-hover:#60a5fa;--card-bg:#1a1a1a;--card-shadow:0 1px 3px #0000004d;--chart-input:#60a5fa;--chart-output:#fbbf24;--chart-cost:#a78bfa}}*{box-sizing:border-box;margin:0;padding:0}body{background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;line-height:1.5}.app{max-width:1200px;margin:0 auto;padding:24px}.header{justify-content:space-between;align-items:center;margin-bottom:24px;display:flex}.header h1{align-items:center;gap:8px;font-size:24px;font-weight:600;display:flex}.logo{width:28px;height:28px}.connection-status{color:var(--text-secondary);align-items:center;gap:6px;font-size:13px;display:flex}.status-dot{background:#ef4444;border-radius:50%;width:8px;height:8px}.status-dot.connected{background:#22c55e}.tabs{border-bottom:1px solid var(--border);gap:4px;margin-bottom:24px;display:flex}.tab{color:var(--text-secondary);cursor:pointer;background:0 0;border:none;border-bottom:2px solid #0000;padding:8px 16px;font-size:14px;font-weight:500;transition:color .15s,border-color .15s}.tab:hover{color:var(--text)}.tab.active{color:var(--accent);border-bottom-color:var(--accent)}.cards{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px;margin-bottom:24px;display:grid}.card{background:var(--card-bg);border:1px solid var(--border);box-shadow:var(--card-shadow);border-radius:8px;padding:16px}.card-label{text-transform:uppercase;letter-spacing:.5px;color:var(--text-secondary);margin-bottom:4px;font-size:12px}.card-value{font-size:24px;font-weight:600}.chart-container{background:var(--card-bg);border:1px solid var(--border);box-shadow:var(--card-shadow);border-radius:8px;margin-bottom:24px;padding:20px}.chart-title{color:var(--text-secondary);margin-bottom:16px;font-size:14px;font-weight:500}.chart-controls{justify-content:flex-end;margin-bottom:12px;display:flex}.toggle{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:8px;display:flex}.toggle-label{color:var(--text-secondary);font-size:13px}.toggle input{display:none}.toggle-track{background:var(--border);border-radius:10px;width:36px;height:20px;transition:background .2s;position:relative}.toggle-track:after{content:"";background:#fff;border-radius:50%;width:16px;height:16px;transition:transform .2s;position:absolute;top:2px;left:2px}.toggle input:checked+.toggle-track{background:var(--accent)}.toggle input:checked+.toggle-track:after{transform:translate(16px)}table{border-collapse:collapse;width:100%;font-size:13px}th{text-align:left;border-bottom:2px solid var(--border);color:var(--text-secondary);text-transform:uppercase;letter-spacing:.5px;padding:10px 12px;font-size:12px;font-weight:600}td{border-bottom:1px solid var(--border);padding:10px 12px}tr.clickable{cursor:pointer}tr.clickable:hover{background:var(--bg-secondary)}.empty-state{text-align:center;min-height:400px;color:var(--text-secondary);flex-direction:column;justify-content:center;align-items:center;display:flex}.empty-state h2{color:var(--text);margin-bottom:12px;font-size:20px}.empty-state p{max-width:500px;margin-bottom:8px}.empty-state code{background:var(--bg-secondary);border-radius:4px;padding:2px 6px;font-size:13px}.detail-overlay{z-index:100;background:#00000080;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.detail-panel{background:var(--card-bg);border:1px solid var(--border);border-radius:12px;width:90%;max-width:900px;max-height:80vh;padding:24px;overflow-y:auto;box-shadow:0 20px 60px #0000004d}.detail-panel h3{margin-bottom:16px;font-size:16px}.detail-panel .close-btn{float:right;cursor:pointer;color:var(--text-secondary);background:0 0;border:none;padding:4px 8px;font-size:20px}.detail-panel .close-btn:hover{color:var(--text)}.attr-table{width:100%}.attr-table td{vertical-align:top;padding:6px 8px}.attr-table td:first-child{white-space:nowrap;width:40%;color:var(--text-secondary);font-weight:500}.attr-table td:last-child{word-break:break-all}.mono{font-family:SF Mono,Fira Code,monospace;font-size:12px}
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
7
7
  <title>tokviz</title>
8
- <script type="module" crossorigin src="/assets/index-DXBuZy55.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-B8TeJ617.css">
8
+ <script type="module" crossorigin src="/assets/index-Be8dkUEp.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-YQMK5nkl.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tokviz",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "description": "Real-time, local-only web dashboard that visualizes LLM token usage and costs from standard OpenTelemetry data",
5
5
  "type": "module",
6
6
  "bin": {
@@ -40,9 +40,9 @@
40
40
  "node": ">=18"
41
41
  },
42
42
  "dependencies": {
43
- "express": "^4.21.2",
43
+ "express": "^5.2.1",
44
44
  "open": "^11.0.0",
45
- "protobufjs": "^7.4.0",
45
+ "protobufjs": "^8.0.3",
46
46
  "ws": "^8.18.0"
47
47
  },
48
48
  "devDependencies": {
@@ -50,14 +50,14 @@
50
50
  "@types/react": "^19.0.0",
51
51
  "@types/react-dom": "^19.0.0",
52
52
  "@types/ws": "^8.5.13",
53
- "@vitejs/plugin-react": "^4.3.4",
54
- "concurrently": "^9.1.0",
53
+ "@vitejs/plugin-react": "^6.0.1",
54
+ "concurrently": "^10.0.0",
55
55
  "react": "^19.0.0",
56
56
  "react-dom": "^19.0.0",
57
- "recharts": "^2.15.0",
57
+ "recharts": "^3.8.1",
58
58
  "tsup": "^8.4.0",
59
59
  "tsx": "^4.19.0",
60
60
  "typescript": "^6.0.3",
61
- "vite": "^6.0.0"
61
+ "vite": "^8.0.0"
62
62
  }
63
63
  }
@@ -1 +0,0 @@
1
- :root{--bg: #ffffff;--bg-secondary: #f5f5f5;--text: #1a1a1a;--text-secondary: #666666;--border: #e0e0e0;--accent: #2563eb;--accent-hover: #1d4ed8;--card-bg: #ffffff;--card-shadow: 0 1px 3px rgba(0, 0, 0, .1);--chart-input: #3b82f6;--chart-output: #f59e0b;--chart-cost: #8b5cf6}@media(prefers-color-scheme:dark){:root{--bg: #0a0a0a;--bg-secondary: #1a1a1a;--text: #e5e5e5;--text-secondary: #999999;--border: #333333;--accent: #3b82f6;--accent-hover: #60a5fa;--card-bg: #1a1a1a;--card-shadow: 0 1px 3px rgba(0, 0, 0, .3);--chart-input: #60a5fa;--chart-output: #fbbf24;--chart-cost: #a78bfa}}*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:var(--bg);color:var(--text);line-height:1.5}.app{max-width:1200px;margin:0 auto;padding:24px}.header{display:flex;align-items:center;justify-content:space-between;margin-bottom:24px}.header h1{font-size:24px;font-weight:600;display:flex;align-items:center;gap:8px}.logo{width:28px;height:28px}.connection-status{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--text-secondary)}.status-dot{width:8px;height:8px;border-radius:50%;background:#ef4444}.status-dot.connected{background:#22c55e}.tabs{display:flex;gap:4px;border-bottom:1px solid var(--border);margin-bottom:24px}.tab{padding:8px 16px;border:none;background:none;color:var(--text-secondary);font-size:14px;font-weight:500;cursor:pointer;border-bottom:2px solid transparent;transition:color .15s,border-color .15s}.tab:hover{color:var(--text)}.tab.active{color:var(--accent);border-bottom-color:var(--accent)}.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px;margin-bottom:24px}.card{background:var(--card-bg);border:1px solid var(--border);border-radius:8px;padding:16px;box-shadow:var(--card-shadow)}.card-label{font-size:12px;text-transform:uppercase;letter-spacing:.5px;color:var(--text-secondary);margin-bottom:4px}.card-value{font-size:24px;font-weight:600}.chart-container{background:var(--card-bg);border:1px solid var(--border);border-radius:8px;padding:20px;margin-bottom:24px;box-shadow:var(--card-shadow)}.chart-title{font-size:14px;font-weight:500;margin-bottom:16px;color:var(--text-secondary)}table{width:100%;border-collapse:collapse;font-size:13px}th{text-align:left;padding:10px 12px;border-bottom:2px solid var(--border);font-weight:600;color:var(--text-secondary);font-size:12px;text-transform:uppercase;letter-spacing:.5px}td{padding:10px 12px;border-bottom:1px solid var(--border)}tr.clickable{cursor:pointer}tr.clickable:hover{background:var(--bg-secondary)}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:400px;text-align:center;color:var(--text-secondary)}.empty-state h2{font-size:20px;margin-bottom:12px;color:var(--text)}.empty-state p{max-width:500px;margin-bottom:8px}.empty-state code{background:var(--bg-secondary);padding:2px 6px;border-radius:4px;font-size:13px}.detail-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:100}.detail-panel{background:var(--card-bg);border:1px solid var(--border);border-radius:12px;padding:24px;max-width:900px;width:90%;max-height:80vh;overflow-y:auto;box-shadow:0 20px 60px #0000004d}.detail-panel h3{margin-bottom:16px;font-size:16px}.detail-panel .close-btn{float:right;border:none;background:none;font-size:20px;cursor:pointer;color:var(--text-secondary);padding:4px 8px}.detail-panel .close-btn:hover{color:var(--text)}.attr-table{width:100%}.attr-table td{padding:6px 8px;vertical-align:top}.attr-table td:first-child{font-weight:500;white-space:nowrap;width:40%;color:var(--text-secondary)}.attr-table td:last-child{word-break:break-all}.mono{font-family:SF Mono,Fira Code,monospace;font-size:12px}