From 9c46847e406a8f63e828eb473b442c80cfa64e34 Mon Sep 17 00:00:00 2001 From: oiupoyt Date: Fri, 9 Oct 2026 13:03:54 +0530 Subject: [PATCH] style: use official DeepSeek logo cobalt blue #3964FE and #5686FE gradient --- lib/client.js | 34 +++++++++++++++++----------------- lib/client.js.map | 4 ++-- src/client/HeatmapView.tsx | 22 +++++++++++----------- src/client/index.tsx | 14 +++++++------- 4 files changed, 37 insertions(+), 37 deletions(-) diff --git a/lib/client.js b/lib/client.js index d9220cd..4678489 100644 --- a/lib/client.js +++ b/lib/client.js @@ -52,11 +52,11 @@ function formatExact(num) { var MONTH_NAMES = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; var DAY_LABELS = ["", "Mon", "", "Wed", "", "Fri", ""]; var DEEPSEEK_LEVELS = [ - "var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, 0.08))", - "#1e2640", - "#2d3e8b", - "#3d52c4", - "#4f46e5" + "rgba(57, 100, 254, 0.06)", + "#1c2d68", + "#2849b8", + "#3964fe", + "#5686fe" ]; function HeatmapView() { const [data, setData] = (0, import_react.useState)(null); @@ -270,9 +270,9 @@ function HeatmapView() { fontWeight: 600, padding: "2px 8px", borderRadius: 12, - background: "rgba(79, 70, 229, 0.15)", - color: "var(--dsw-alias-brand-primary, #6366f1)", - border: "1px solid rgba(79, 70, 229, 0.3)" + background: "rgba(57, 100, 254, 0.12)", + color: "#5686fe", + border: "1px solid rgba(57, 100, 254, 0.3)" } }, "52 Weeks" @@ -350,7 +350,7 @@ function HeatmapView() { } }, /* @__PURE__ */ import_react.default.createElement("div", { style: { fontSize: 11, color: "var(--dsw-alias-label-tertiary, #a0a0a0)", textTransform: "uppercase", letterSpacing: "0.06em", fontWeight: 600 } }, "Total Tokens"), - /* @__PURE__ */ import_react.default.createElement("div", { style: { fontSize: 24, fontWeight: 700, margin: "6px 0 2px", color: "var(--dsw-alias-brand-primary, #6366f1)" } }, formatNumber(summary.totalTokens)), + /* @__PURE__ */ import_react.default.createElement("div", { style: { fontSize: 24, fontWeight: 700, margin: "6px 0 2px", color: "#5686fe" } }, formatNumber(summary.totalTokens)), /* @__PURE__ */ import_react.default.createElement("div", { style: { fontSize: 11, color: "var(--dsw-alias-label-secondary, #b9b9b9)" } }, formatExact(summary.totalTokens), " tokens") ), /* @__PURE__ */ import_react.default.createElement( @@ -538,7 +538,7 @@ function HeatmapView() { month: "short", day: "numeric" })), - hoveredDay.stats.totalTokens === 0 ? /* @__PURE__ */ import_react.default.createElement("div", { style: { color: "var(--dsw-alias-label-tertiary)" } }, "No activity recorded") : /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("div", { style: { color: "var(--dsw-alias-brand-primary, #818cf8)", fontWeight: 600 } }, formatExact(hoveredDay.stats.totalTokens), " tokens"), /* @__PURE__ */ import_react.default.createElement("div", { style: { fontSize: 11, color: "var(--dsw-alias-label-secondary)", marginTop: 2 } }, hoveredDay.stats.turns, " requests / steps"), /* @__PURE__ */ import_react.default.createElement("div", { style: { fontSize: 10, color: "var(--dsw-alias-label-tertiary)", marginTop: 4 } }, "Billed: ", formatNumber(hoveredDay.stats.inputTokens + hoveredDay.stats.outputTokens), " \xB7 Cache: ", formatNumber(hoveredDay.stats.cacheReadTokens))) + hoveredDay.stats.totalTokens === 0 ? /* @__PURE__ */ import_react.default.createElement("div", { style: { color: "var(--dsw-alias-label-tertiary)" } }, "No activity recorded") : /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("div", { style: { color: "#5686fe", fontWeight: 600 } }, formatExact(hoveredDay.stats.totalTokens), " tokens"), /* @__PURE__ */ import_react.default.createElement("div", { style: { fontSize: 11, color: "var(--dsw-alias-label-secondary)", marginTop: 2 } }, hoveredDay.stats.turns, " requests / steps"), /* @__PURE__ */ import_react.default.createElement("div", { style: { fontSize: 10, color: "var(--dsw-alias-label-tertiary)", marginTop: 4 } }, "Billed: ", formatNumber(hoveredDay.stats.inputTokens + hoveredDay.stats.outputTokens), " \xB7 Cache: ", formatNumber(hoveredDay.stats.cacheReadTokens))) ) ); } @@ -671,22 +671,22 @@ function apply(ctx) { width: 100%; margin-top: 12px; padding: 8px 12px; - background: rgba(79, 70, 229, 0.12); - border: 1px solid rgba(79, 70, 229, 0.35); + background: rgba(57, 100, 254, 0.12); + border: 1px solid rgba(57, 100, 254, 0.35); border-radius: 8px; - color: var(--dsw-alias-brand-primary, #6366f1); + color: #5686fe; font-size: 12px; font-weight: 600; cursor: pointer; transition: background 0.15s ease, border-color 0.15s ease; `; button.onmouseenter = () => { - button.style.background = "rgba(79, 70, 229, 0.22)"; - button.style.borderColor = "var(--dsw-alias-brand-primary, #6366f1)"; + button.style.background = "rgba(57, 100, 254, 0.22)"; + button.style.borderColor = "#3964fe"; }; button.onmouseleave = () => { - button.style.background = "rgba(79, 70, 229, 0.12)"; - button.style.borderColor = "rgba(79, 70, 229, 0.35)"; + button.style.background = "rgba(57, 100, 254, 0.12)"; + button.style.borderColor = "rgba(57, 100, 254, 0.35)"; }; button.onclick = (e) => { e.preventDefault(); diff --git a/lib/client.js.map b/lib/client.js.map index 36ed24b..88c563c 100644 --- a/lib/client.js.map +++ b/lib/client.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/client/index.tsx", "../src/client/HeatmapView.tsx", "../src/client/HeatmapModal.tsx"], - "sourcesContent": ["import React, { useState, useEffect } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { HeatmapView } from \"./HeatmapView.js\";\nimport { HeatmapModal } from \"./HeatmapModal.js\";\n\nexport const name = \"dsh-plugin-token-heatmap-client\";\nexport const inject = [\"slots\"];\n\nexport function apply(ctx: any) {\n // 1. Register under Settings -> \"Token Heatmap\"\n if (ctx.slots && typeof ctx.slots.inject === \"function\") {\n ctx.slots.inject(\"settings.section\", () => {\n return ctx.slots.register(\n {\n name: \"settings.section\",\n id: \"token-heatmap\",\n order: 14,\n label: () => \"Token Heatmap\",\n icon: \"chart\",\n },\n HeatmapView\n );\n });\n }\n\n // 2. Global Modal Host & In-Session Token Meter Integration\n if (typeof document !== \"undefined\") {\n const modalContainer = document.createElement(\"div\");\n modalContainer.id = \"dsh-token-heatmap-modal-root\";\n document.body.appendChild(modalContainer);\n\n const root = createRoot(modalContainer);\n\n function ModalController() {\n const [isOpen, setIsOpen] = useState(false);\n\n useEffect(() => {\n const handleOpen = () => setIsOpen(true);\n const handleClose = () => setIsOpen(false);\n\n window.addEventListener(\"dsh:open-token-heatmap\", handleOpen);\n window.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Escape\") handleClose();\n });\n\n return () => {\n window.removeEventListener(\"dsh:open-token-heatmap\", handleOpen);\n };\n }, []);\n\n return setIsOpen(false)} />;\n }\n\n root.render();\n\n // 3. Observe DOM for in-session token usage dialog: strictly single button\n const observer = new MutationObserver(() => {\n // Find the dl with data-session-stats-usage\n const usageList = document.querySelector('[data-session-stats-usage]');\n if (!usageList) return;\n\n const dialogContainer = usageList.closest('div[role=\"dialog\"]') || usageList.parentElement;\n if (!dialogContainer) return;\n\n // Strictly ensure only one button is ever attached\n if (dialogContainer.querySelector(\".dsh-heatmap-trigger-btn\") || document.querySelector(\".dsh-heatmap-trigger-btn\")) {\n return;\n }\n\n const button = document.createElement(\"button\");\n button.className = \"dsh-heatmap-trigger-btn\";\n button.type = \"button\";\n button.innerHTML = \"View Token Usage Heatmap \u2192\";\n button.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n margin-top: 12px;\n padding: 8px 12px;\n background: rgba(79, 70, 229, 0.12);\n border: 1px solid rgba(79, 70, 229, 0.35);\n border-radius: 8px;\n color: var(--dsw-alias-brand-primary, #6366f1);\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s ease, border-color 0.15s ease;\n `;\n button.onmouseenter = () => {\n button.style.background = \"rgba(79, 70, 229, 0.22)\";\n button.style.borderColor = \"var(--dsw-alias-brand-primary, #6366f1)\";\n };\n button.onmouseleave = () => {\n button.style.background = \"rgba(79, 70, 229, 0.12)\";\n button.style.borderColor = \"rgba(79, 70, 229, 0.35)\";\n };\n button.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n // Try navigating to Settings -> Token Heatmap\n const settingsTrigger = document.querySelector(\n 'button[aria-label*=\"Setting\" i], [data-sidebar-settings] button, button.settings'\n );\n\n if (settingsTrigger) {\n (settingsTrigger as HTMLElement).click();\n setTimeout(() => {\n const heatmapTab = Array.from(document.querySelectorAll(\"*\")).find(\n (el) =>\n el.textContent?.trim() === \"Token Heatmap\" &&\n (el.tagName === \"BUTTON\" || el.tagName === \"DIV\" || el.getAttribute(\"role\") === \"tab\" || el.classList.contains(\"ant-list-item\"))\n );\n if (heatmapTab) {\n (heatmapTab as HTMLElement).click();\n } else {\n window.dispatchEvent(new CustomEvent(\"dsh:open-token-heatmap\"));\n }\n }, 120);\n } else {\n // Open direct interactive modal\n window.dispatchEvent(new CustomEvent(\"dsh:open-token-heatmap\"));\n }\n };\n\n dialogContainer.appendChild(button);\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n }\n}\n", "import React, { useEffect, useState, useMemo } from \"react\";\n\nexport interface DayStats {\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n turns: number;\n level?: number;\n}\n\nexport interface SessionSummary {\n id: string;\n title: string;\n createdAt: number;\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n turns: number;\n days: Record;\n}\n\nexport interface SummaryStats {\n totalTokens: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalCacheReadTokens: number;\n totalTurns: number;\n activeDays: number;\n currentStreak: number;\n longestStreak: number;\n peakDay: { date: string; tokens: number; turns: number } | null;\n dailyAverage: number;\n}\n\nexport interface HeatmapResponse {\n summary: SummaryStats;\n days: Record;\n sessions: SessionSummary[];\n startDate: string;\n endDate: string;\n}\n\nfunction formatNumber(num: number): string {\n if (num >= 1_000_000_000) return (num / 1_000_000_000).toFixed(2) + \"B\";\n if (num >= 1_000_000) return (num / 1_000_000).toFixed(1) + \"M\";\n if (num >= 1_000) return (num / 1_000).toFixed(1) + \"k\";\n return num.toLocaleString();\n}\n\nfunction formatExact(num: number): string {\n return num.toLocaleString();\n}\n\nconst MONTH_NAMES = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\nconst DAY_LABELS = [\"\", \"Mon\", \"\", \"Wed\", \"\", \"Fri\", \"\"];\n\n// DeepSeek Blue/Indigo theme levels (OpenCode & Codex style)\nconst DEEPSEEK_LEVELS = [\n \"var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, 0.08))\",\n \"#1e2640\",\n \"#2d3e8b\",\n \"#3d52c4\",\n \"#4f46e5\",\n];\n\nexport function HeatmapView() {\n const [data, setData] = useState(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n const [selectedSessionId, setSelectedSessionId] = useState(\"all\");\n const [hoveredDay, setHoveredDay] = useState<{ date: string; stats: DayStats } | null>(null);\n const [tooltipPos, setTooltipPos] = useState<{ x: number; y: number } | null>(null);\n\n const fetchStats = () => {\n setLoading(true);\n fetch(\"/api/dsh-token-heatmap/stats\")\n .then((r) => {\n if (!r.ok) throw new Error(`HTTP error ${r.status}`);\n return r.json();\n })\n .then((res) => {\n setData(res);\n setLoading(false);\n })\n .catch((err) => {\n setError(err.message);\n setLoading(false);\n });\n };\n\n useEffect(() => {\n fetchStats();\n }, []);\n\n // Compute active days & stats based on session filter\n const activeView = useMemo(() => {\n if (!data) return null;\n\n if (selectedSessionId === \"all\") {\n return {\n summary: data.summary,\n days: data.days,\n sessionTitle: \"All Sessions (Global)\",\n };\n }\n\n const session = data.sessions.find((s) => s.id === selectedSessionId);\n if (!session) {\n return {\n summary: data.summary,\n days: data.days,\n sessionTitle: \"All Sessions (Global)\",\n };\n }\n\n // Recalculate summary for this specific session\n let totalTokens = session.totalTokens;\n let totalInputTokens = session.inputTokens;\n let totalOutputTokens = session.outputTokens;\n let totalCacheReadTokens = session.cacheReadTokens;\n let totalTurns = session.turns;\n let activeDays = Object.values(session.days).filter((d) => d.totalTokens > 0).length;\n let dailyAverage = activeDays > 0 ? Math.round(totalTokens / activeDays) : 0;\n let peakDay: { date: string; tokens: number; turns: number } | null = null;\n\n for (const [date, stats] of Object.entries(session.days)) {\n if (!peakDay || stats.totalTokens > peakDay.tokens) {\n peakDay = { date, tokens: stats.totalTokens, turns: stats.turns };\n }\n }\n\n // Re-level for this session\n const positiveValues = Object.values(session.days)\n .map((d) => d.totalTokens)\n .filter((t) => t > 0)\n .sort((a, b) => a - b);\n\n let q1 = 1_000_000;\n let q2 = 5_000_000;\n let q3 = 15_000_000;\n\n if (positiveValues.length >= 4) {\n q1 = positiveValues[Math.floor(positiveValues.length * 0.25)];\n q2 = positiveValues[Math.floor(positiveValues.length * 0.50)];\n q3 = positiveValues[Math.floor(positiveValues.length * 0.75)];\n }\n\n const leveledDays: Record = {};\n for (const [date, stats] of Object.entries(session.days)) {\n let lvl = 0;\n if (stats.totalTokens === 0) lvl = 0;\n else if (stats.totalTokens <= q1) lvl = 1;\n else if (stats.totalTokens <= q2) lvl = 2;\n else if (stats.totalTokens <= q3) lvl = 3;\n else lvl = 4;\n leveledDays[date] = { ...stats, level: lvl };\n }\n\n return {\n summary: {\n totalTokens,\n totalInputTokens,\n totalOutputTokens,\n totalCacheReadTokens,\n totalTurns,\n activeDays,\n currentStreak: 0,\n longestStreak: 0,\n peakDay,\n dailyAverage,\n },\n days: leveledDays,\n sessionTitle: session.title,\n };\n }, [data, selectedSessionId]);\n\n // Compute 52-week calendar grid: 7 rows x 53 columns\n const calendarGrid = useMemo(() => {\n if (!activeView) return null;\n\n const weeks: Array> = [];\n const now = new Date();\n const end = new Date(now);\n const start = new Date(now);\n start.setDate(start.getDate() - 364);\n start.setDate(start.getDate() - start.getDay());\n\n let current = new Date(start);\n let currentWeek: Array<{ date: string; stats: DayStats } | null> = [];\n\n while (current <= end || currentWeek.length > 0) {\n const dateKey = `${current.getFullYear()}-${String(current.getMonth() + 1).padStart(2, \"0\")}-${String(current.getDate()).padStart(2, \"0\")}`;\n const dayStats = activeView.days[dateKey] || {\n totalTokens: 0,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n turns: 0,\n level: 0,\n };\n\n if (current <= end) {\n currentWeek.push({ date: dateKey, stats: dayStats });\n } else {\n currentWeek.push(null);\n }\n\n if (currentWeek.length === 7) {\n weeks.push(currentWeek);\n currentWeek = [];\n }\n current.setDate(current.getDate() + 1);\n if (current > end && currentWeek.length === 0) break;\n }\n\n return weeks;\n }, [activeView]);\n\n // Compute month headers\n const monthHeaders = useMemo(() => {\n if (!calendarGrid) return [];\n const headers: Array<{ label: string; col: number }> = [];\n let lastMonth = -1;\n\n calendarGrid.forEach((week, colIdx) => {\n const firstValidDay = week.find((d) => d !== null);\n if (firstValidDay) {\n const d = new Date(firstValidDay.date + \"T00:00:00\");\n const month = d.getMonth();\n if (month !== lastMonth) {\n headers.push({ label: MONTH_NAMES[month], col: colIdx });\n lastMonth = month;\n }\n }\n });\n\n return headers;\n }, [calendarGrid]);\n\n if (loading && !data) {\n return (\n
\n Loading token usage statistics...\n
\n );\n }\n\n if (error) {\n return (\n
\n Failed to load heatmap: {error}\n \n Retry\n \n
\n );\n }\n\n if (!data || !activeView) return null;\n\n const { summary } = activeView;\n const cacheHitPercent =\n summary.totalTokens > 0\n ? Math.round((summary.totalCacheReadTokens / summary.totalTokens) * 100)\n : 0;\n\n return (\n \n {/* Top Header & Filter Controls (OpenCode / Codex style) */}\n \n
\n \n Token Usage Activity\n \n 52 Weeks\n \n \n \n Daily token volume and request step intensity across sessions\n

\n
\n\n {/* Right side controls: Session selector & Refresh */}\n
\n {/* Session Filter Dropdown */}\n
\n Session:\n setSelectedSessionId(e.target.value)}\n style={{\n background: \"var(--dsw-alias-bg-layer-2, #2c2c2c)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n color: \"var(--dsw-alias-label-primary, #eeeeee)\",\n borderRadius: 8,\n padding: \"6px 12px\",\n fontSize: 12,\n outline: \"none\",\n cursor: \"pointer\",\n maxWidth: 240,\n }}\n >\n \n {data.sessions.map((s) => (\n \n ))}\n \n
\n\n \n \u21BB Refresh\n \n
\n \n\n {/* Summary Cards Row (Codex / OpenCode style) */}\n \n {/* Card 1: Total Tokens */}\n \n
\n Total Tokens\n
\n
\n {formatNumber(summary.totalTokens)}\n
\n
\n {formatExact(summary.totalTokens)} tokens\n
\n \n\n {/* Card 2: Cache Hit */}\n \n
\n Cache Hit Ratio\n
\n
\n {cacheHitPercent}%\n
\n
\n {formatNumber(summary.totalCacheReadTokens)} cached reads\n
\n \n\n {/* Card 3: Daily Average / Turns */}\n \n
\n {selectedSessionId === \"all\" ? \"Daily Average\" : \"Total Steps\"}\n
\n
\n {selectedSessionId === \"all\" ? formatNumber(summary.dailyAverage) : summary.totalTurns}\n
\n
\n {selectedSessionId === \"all\" ? `Across ${summary.activeDays} active days` : `${formatNumber(summary.totalInputTokens + summary.totalOutputTokens)} billed`}\n
\n \n\n {/* Card 4: Streak / Activity */}\n \n
\n {selectedSessionId === \"all\" ? \"Active Streak\" : \"Active Days\"}\n
\n
\n {selectedSessionId === \"all\" ? `${summary.currentStreak} days` : `${summary.activeDays} days`}\n
\n
\n {selectedSessionId === \"all\" ? `Longest streak: ${summary.longestStreak} days` : `Session: ${activeView.sessionTitle.slice(0, 24)}`}\n
\n \n \n\n {/* Heatmap Card */}\n \n \n Contribution Calendar\n {summary.peakDay && (\n \n Peak day: {summary.peakDay.date} ({formatNumber(summary.peakDay.tokens)} tokens)\n \n )}\n \n\n {/* SVG Heatmap */}\n {calendarGrid && (\n
\n {/* Month labels */}\n
\n {monthHeaders.map((m, i) => (\n \n {m.label}\n
\n ))}\n
\n\n {/* Grid with day labels */}\n
\n {/* Day of week labels */}\n \n {DAY_LABELS.map((lbl, idx) => (\n
\n {lbl}\n
\n ))}\n
\n\n {/* Columns of weeks */}\n
\n {calendarGrid.map((week, colIdx) => (\n
\n {week.map((day, rowIdx) => {\n if (!day) {\n return
;\n }\n const lvl = day.stats.level || 0;\n const bg = DEEPSEEK_LEVELS[lvl];\n\n return (\n {\n setHoveredDay({ date: day.date, stats: day.stats });\n const rect = e.currentTarget.getBoundingClientRect();\n setTooltipPos({ x: rect.left + rect.width / 2, y: rect.top - 8 });\n }}\n onMouseLeave={() => {\n setHoveredDay(null);\n setTooltipPos(null);\n }}\n style={{\n width: 11,\n height: 11,\n borderRadius: 2,\n backgroundColor: bg,\n border:\n lvl === 0\n ? \"1px solid var(--dsw-alias-border-l1, rgba(255,255,255,0.06))\"\n : \"1px solid transparent\",\n cursor: \"pointer\",\n transition: \"transform 0.1s ease, filter 0.1s ease\",\n }}\n />\n );\n })}\n
\n ))}\n
\n
\n\n {/* Legend & Footnote */}\n \n Less\n {DEEPSEEK_LEVELS.map((c, i) => (\n \n ))}\n More\n \n \n )}\n \n\n {/* Floating Hover Tooltip */}\n {hoveredDay && tooltipPos && (\n \n
\n {new Date(hoveredDay.date + \"T00:00:00\").toLocaleDateString(undefined, {\n weekday: \"short\",\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })}\n
\n {hoveredDay.stats.totalTokens === 0 ? (\n
No activity recorded
\n ) : (\n
\n
\n {formatExact(hoveredDay.stats.totalTokens)} tokens\n
\n
\n {hoveredDay.stats.turns} requests / steps\n
\n
\n Billed: {formatNumber(hoveredDay.stats.inputTokens + hoveredDay.stats.outputTokens)} \u00B7 Cache: {formatNumber(hoveredDay.stats.cacheReadTokens)}\n
\n
\n )}\n \n )}\n \n );\n}\n", "import React from \"react\";\nimport { HeatmapView } from \"./HeatmapView.js\";\n\ninterface HeatmapModalProps {\n open: boolean;\n onClose: () => void;\n}\n\nexport function HeatmapModal({ open, onClose }: HeatmapModalProps) {\n if (!open) return null;\n\n return (\n \n e.stopPropagation()}\n style={{\n position: \"relative\",\n width: \"100%\",\n maxWidth: \"960px\",\n maxHeight: \"90vh\",\n overflowY: \"auto\",\n background: \"var(--dsw-alias-bg-layer-1, #1e1e1e)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n borderRadius: \"14px\",\n boxShadow: \"0 16px 40px rgba(0, 0, 0, 0.5)\",\n padding: \"24px 28px\",\n }}\n >\n {/* Close button */}\n \n \u2715\n \n\n \n \n \n );\n}\n"], - "mappings": "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", + "sourcesContent": ["import React, { useState, useEffect } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { HeatmapView } from \"./HeatmapView.js\";\nimport { HeatmapModal } from \"./HeatmapModal.js\";\n\nexport const name = \"dsh-plugin-token-heatmap-client\";\nexport const inject = [\"slots\"];\n\nexport function apply(ctx: any) {\n // 1. Register under Settings -> \"Token Heatmap\"\n if (ctx.slots && typeof ctx.slots.inject === \"function\") {\n ctx.slots.inject(\"settings.section\", () => {\n return ctx.slots.register(\n {\n name: \"settings.section\",\n id: \"token-heatmap\",\n order: 14,\n label: () => \"Token Heatmap\",\n icon: \"chart\",\n },\n HeatmapView\n );\n });\n }\n\n // 2. Global Modal Host & In-Session Token Meter Integration\n if (typeof document !== \"undefined\") {\n const modalContainer = document.createElement(\"div\");\n modalContainer.id = \"dsh-token-heatmap-modal-root\";\n document.body.appendChild(modalContainer);\n\n const root = createRoot(modalContainer);\n\n function ModalController() {\n const [isOpen, setIsOpen] = useState(false);\n\n useEffect(() => {\n const handleOpen = () => setIsOpen(true);\n const handleClose = () => setIsOpen(false);\n\n window.addEventListener(\"dsh:open-token-heatmap\", handleOpen);\n window.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Escape\") handleClose();\n });\n\n return () => {\n window.removeEventListener(\"dsh:open-token-heatmap\", handleOpen);\n };\n }, []);\n\n return setIsOpen(false)} />;\n }\n\n root.render();\n\n // 3. Observe DOM for in-session token usage dialog: strictly single button\n const observer = new MutationObserver(() => {\n // Find the dl with data-session-stats-usage\n const usageList = document.querySelector('[data-session-stats-usage]');\n if (!usageList) return;\n\n const dialogContainer = usageList.closest('div[role=\"dialog\"]') || usageList.parentElement;\n if (!dialogContainer) return;\n\n // Strictly ensure only one button is ever attached\n if (dialogContainer.querySelector(\".dsh-heatmap-trigger-btn\") || document.querySelector(\".dsh-heatmap-trigger-btn\")) {\n return;\n }\n\n const button = document.createElement(\"button\");\n button.className = \"dsh-heatmap-trigger-btn\";\n button.type = \"button\";\n button.innerHTML = \"View Token Usage Heatmap \u2192\";\n button.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n margin-top: 12px;\n padding: 8px 12px;\n background: rgba(57, 100, 254, 0.12);\n border: 1px solid rgba(57, 100, 254, 0.35);\n border-radius: 8px;\n color: #5686fe;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.15s ease, border-color 0.15s ease;\n `;\n button.onmouseenter = () => {\n button.style.background = \"rgba(57, 100, 254, 0.22)\";\n button.style.borderColor = \"#3964fe\";\n };\n button.onmouseleave = () => {\n button.style.background = \"rgba(57, 100, 254, 0.12)\";\n button.style.borderColor = \"rgba(57, 100, 254, 0.35)\";\n };\n button.onclick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n // Try navigating to Settings -> Token Heatmap\n const settingsTrigger = document.querySelector(\n 'button[aria-label*=\"Setting\" i], [data-sidebar-settings] button, button.settings'\n );\n\n if (settingsTrigger) {\n (settingsTrigger as HTMLElement).click();\n setTimeout(() => {\n const heatmapTab = Array.from(document.querySelectorAll(\"*\")).find(\n (el) =>\n el.textContent?.trim() === \"Token Heatmap\" &&\n (el.tagName === \"BUTTON\" || el.tagName === \"DIV\" || el.getAttribute(\"role\") === \"tab\" || el.classList.contains(\"ant-list-item\"))\n );\n if (heatmapTab) {\n (heatmapTab as HTMLElement).click();\n } else {\n window.dispatchEvent(new CustomEvent(\"dsh:open-token-heatmap\"));\n }\n }, 120);\n } else {\n // Open direct interactive modal\n window.dispatchEvent(new CustomEvent(\"dsh:open-token-heatmap\"));\n }\n };\n\n dialogContainer.appendChild(button);\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n }\n}\n", "import React, { useEffect, useState, useMemo } from \"react\";\n\nexport interface DayStats {\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n turns: number;\n level?: number;\n}\n\nexport interface SessionSummary {\n id: string;\n title: string;\n createdAt: number;\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n turns: number;\n days: Record;\n}\n\nexport interface SummaryStats {\n totalTokens: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n totalCacheReadTokens: number;\n totalTurns: number;\n activeDays: number;\n currentStreak: number;\n longestStreak: number;\n peakDay: { date: string; tokens: number; turns: number } | null;\n dailyAverage: number;\n}\n\nexport interface HeatmapResponse {\n summary: SummaryStats;\n days: Record;\n sessions: SessionSummary[];\n startDate: string;\n endDate: string;\n}\n\nfunction formatNumber(num: number): string {\n if (num >= 1_000_000_000) return (num / 1_000_000_000).toFixed(2) + \"B\";\n if (num >= 1_000_000) return (num / 1_000_000).toFixed(1) + \"M\";\n if (num >= 1_000) return (num / 1_000).toFixed(1) + \"k\";\n return num.toLocaleString();\n}\n\nfunction formatExact(num: number): string {\n return num.toLocaleString();\n}\n\nconst MONTH_NAMES = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\nconst DAY_LABELS = [\"\", \"Mon\", \"\", \"Wed\", \"\", \"Fri\", \"\"];\n\n// DeepSeek Official Blue Gradient (anchored on DeepSeek logo #3964FE and highlight #5686FE)\nconst DEEPSEEK_LEVELS = [\n \"rgba(57, 100, 254, 0.06)\",\n \"#1c2d68\",\n \"#2849b8\",\n \"#3964fe\",\n \"#5686fe\",\n];\n\nexport function HeatmapView() {\n const [data, setData] = useState(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(null);\n const [selectedSessionId, setSelectedSessionId] = useState(\"all\");\n const [hoveredDay, setHoveredDay] = useState<{ date: string; stats: DayStats } | null>(null);\n const [tooltipPos, setTooltipPos] = useState<{ x: number; y: number } | null>(null);\n\n const fetchStats = () => {\n setLoading(true);\n fetch(\"/api/dsh-token-heatmap/stats\")\n .then((r) => {\n if (!r.ok) throw new Error(`HTTP error ${r.status}`);\n return r.json();\n })\n .then((res) => {\n setData(res);\n setLoading(false);\n })\n .catch((err) => {\n setError(err.message);\n setLoading(false);\n });\n };\n\n useEffect(() => {\n fetchStats();\n }, []);\n\n // Compute active days & stats based on session filter\n const activeView = useMemo(() => {\n if (!data) return null;\n\n if (selectedSessionId === \"all\") {\n return {\n summary: data.summary,\n days: data.days,\n sessionTitle: \"All Sessions (Global)\",\n };\n }\n\n const session = data.sessions.find((s) => s.id === selectedSessionId);\n if (!session) {\n return {\n summary: data.summary,\n days: data.days,\n sessionTitle: \"All Sessions (Global)\",\n };\n }\n\n // Recalculate summary for this specific session\n let totalTokens = session.totalTokens;\n let totalInputTokens = session.inputTokens;\n let totalOutputTokens = session.outputTokens;\n let totalCacheReadTokens = session.cacheReadTokens;\n let totalTurns = session.turns;\n let activeDays = Object.values(session.days).filter((d) => d.totalTokens > 0).length;\n let dailyAverage = activeDays > 0 ? Math.round(totalTokens / activeDays) : 0;\n let peakDay: { date: string; tokens: number; turns: number } | null = null;\n\n for (const [date, stats] of Object.entries(session.days)) {\n if (!peakDay || stats.totalTokens > peakDay.tokens) {\n peakDay = { date, tokens: stats.totalTokens, turns: stats.turns };\n }\n }\n\n // Re-level for this session\n const positiveValues = Object.values(session.days)\n .map((d) => d.totalTokens)\n .filter((t) => t > 0)\n .sort((a, b) => a - b);\n\n let q1 = 1_000_000;\n let q2 = 5_000_000;\n let q3 = 15_000_000;\n\n if (positiveValues.length >= 4) {\n q1 = positiveValues[Math.floor(positiveValues.length * 0.25)];\n q2 = positiveValues[Math.floor(positiveValues.length * 0.50)];\n q3 = positiveValues[Math.floor(positiveValues.length * 0.75)];\n }\n\n const leveledDays: Record = {};\n for (const [date, stats] of Object.entries(session.days)) {\n let lvl = 0;\n if (stats.totalTokens === 0) lvl = 0;\n else if (stats.totalTokens <= q1) lvl = 1;\n else if (stats.totalTokens <= q2) lvl = 2;\n else if (stats.totalTokens <= q3) lvl = 3;\n else lvl = 4;\n leveledDays[date] = { ...stats, level: lvl };\n }\n\n return {\n summary: {\n totalTokens,\n totalInputTokens,\n totalOutputTokens,\n totalCacheReadTokens,\n totalTurns,\n activeDays,\n currentStreak: 0,\n longestStreak: 0,\n peakDay,\n dailyAverage,\n },\n days: leveledDays,\n sessionTitle: session.title,\n };\n }, [data, selectedSessionId]);\n\n // Compute 52-week calendar grid: 7 rows x 53 columns\n const calendarGrid = useMemo(() => {\n if (!activeView) return null;\n\n const weeks: Array> = [];\n const now = new Date();\n const end = new Date(now);\n const start = new Date(now);\n start.setDate(start.getDate() - 364);\n start.setDate(start.getDate() - start.getDay());\n\n let current = new Date(start);\n let currentWeek: Array<{ date: string; stats: DayStats } | null> = [];\n\n while (current <= end || currentWeek.length > 0) {\n const dateKey = `${current.getFullYear()}-${String(current.getMonth() + 1).padStart(2, \"0\")}-${String(current.getDate()).padStart(2, \"0\")}`;\n const dayStats = activeView.days[dateKey] || {\n totalTokens: 0,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n turns: 0,\n level: 0,\n };\n\n if (current <= end) {\n currentWeek.push({ date: dateKey, stats: dayStats });\n } else {\n currentWeek.push(null);\n }\n\n if (currentWeek.length === 7) {\n weeks.push(currentWeek);\n currentWeek = [];\n }\n current.setDate(current.getDate() + 1);\n if (current > end && currentWeek.length === 0) break;\n }\n\n return weeks;\n }, [activeView]);\n\n // Compute month headers\n const monthHeaders = useMemo(() => {\n if (!calendarGrid) return [];\n const headers: Array<{ label: string; col: number }> = [];\n let lastMonth = -1;\n\n calendarGrid.forEach((week, colIdx) => {\n const firstValidDay = week.find((d) => d !== null);\n if (firstValidDay) {\n const d = new Date(firstValidDay.date + \"T00:00:00\");\n const month = d.getMonth();\n if (month !== lastMonth) {\n headers.push({ label: MONTH_NAMES[month], col: colIdx });\n lastMonth = month;\n }\n }\n });\n\n return headers;\n }, [calendarGrid]);\n\n if (loading && !data) {\n return (\n
\n Loading token usage statistics...\n
\n );\n }\n\n if (error) {\n return (\n
\n Failed to load heatmap: {error}\n \n Retry\n \n
\n );\n }\n\n if (!data || !activeView) return null;\n\n const { summary } = activeView;\n const cacheHitPercent =\n summary.totalTokens > 0\n ? Math.round((summary.totalCacheReadTokens / summary.totalTokens) * 100)\n : 0;\n\n return (\n \n {/* Top Header & Filter Controls (OpenCode / Codex style) */}\n \n
\n \n Token Usage Activity\n \n 52 Weeks\n \n \n \n Daily token volume and request step intensity across sessions\n

\n
\n\n {/* Right side controls: Session selector & Refresh */}\n
\n {/* Session Filter Dropdown */}\n
\n Session:\n setSelectedSessionId(e.target.value)}\n style={{\n background: \"var(--dsw-alias-bg-layer-2, #2c2c2c)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n color: \"var(--dsw-alias-label-primary, #eeeeee)\",\n borderRadius: 8,\n padding: \"6px 12px\",\n fontSize: 12,\n outline: \"none\",\n cursor: \"pointer\",\n maxWidth: 240,\n }}\n >\n \n {data.sessions.map((s) => (\n \n ))}\n \n
\n\n \n \u21BB Refresh\n \n
\n \n\n {/* Summary Cards Row (Codex / OpenCode style) */}\n \n {/* Card 1: Total Tokens */}\n \n
\n Total Tokens\n
\n
\n {formatNumber(summary.totalTokens)}\n
\n
\n {formatExact(summary.totalTokens)} tokens\n
\n \n\n {/* Card 2: Cache Hit */}\n \n
\n Cache Hit Ratio\n
\n
\n {cacheHitPercent}%\n
\n
\n {formatNumber(summary.totalCacheReadTokens)} cached reads\n
\n \n\n {/* Card 3: Daily Average / Turns */}\n \n
\n {selectedSessionId === \"all\" ? \"Daily Average\" : \"Total Steps\"}\n
\n
\n {selectedSessionId === \"all\" ? formatNumber(summary.dailyAverage) : summary.totalTurns}\n
\n
\n {selectedSessionId === \"all\" ? `Across ${summary.activeDays} active days` : `${formatNumber(summary.totalInputTokens + summary.totalOutputTokens)} billed`}\n
\n \n\n {/* Card 4: Streak / Activity */}\n \n
\n {selectedSessionId === \"all\" ? \"Active Streak\" : \"Active Days\"}\n
\n
\n {selectedSessionId === \"all\" ? `${summary.currentStreak} days` : `${summary.activeDays} days`}\n
\n
\n {selectedSessionId === \"all\" ? `Longest streak: ${summary.longestStreak} days` : `Session: ${activeView.sessionTitle.slice(0, 24)}`}\n
\n \n \n\n {/* Heatmap Card */}\n \n \n Contribution Calendar\n {summary.peakDay && (\n \n Peak day: {summary.peakDay.date} ({formatNumber(summary.peakDay.tokens)} tokens)\n \n )}\n \n\n {/* SVG Heatmap */}\n {calendarGrid && (\n
\n {/* Month labels */}\n
\n {monthHeaders.map((m, i) => (\n \n {m.label}\n
\n ))}\n
\n\n {/* Grid with day labels */}\n
\n {/* Day of week labels */}\n \n {DAY_LABELS.map((lbl, idx) => (\n
\n {lbl}\n
\n ))}\n
\n\n {/* Columns of weeks */}\n
\n {calendarGrid.map((week, colIdx) => (\n
\n {week.map((day, rowIdx) => {\n if (!day) {\n return
;\n }\n const lvl = day.stats.level || 0;\n const bg = DEEPSEEK_LEVELS[lvl];\n\n return (\n {\n setHoveredDay({ date: day.date, stats: day.stats });\n const rect = e.currentTarget.getBoundingClientRect();\n setTooltipPos({ x: rect.left + rect.width / 2, y: rect.top - 8 });\n }}\n onMouseLeave={() => {\n setHoveredDay(null);\n setTooltipPos(null);\n }}\n style={{\n width: 11,\n height: 11,\n borderRadius: 2,\n backgroundColor: bg,\n border:\n lvl === 0\n ? \"1px solid var(--dsw-alias-border-l1, rgba(255,255,255,0.06))\"\n : \"1px solid transparent\",\n cursor: \"pointer\",\n transition: \"transform 0.1s ease, filter 0.1s ease\",\n }}\n />\n );\n })}\n
\n ))}\n
\n
\n\n {/* Legend & Footnote */}\n \n Less\n {DEEPSEEK_LEVELS.map((c, i) => (\n \n ))}\n More\n \n \n )}\n \n\n {/* Floating Hover Tooltip */}\n {hoveredDay && tooltipPos && (\n \n
\n {new Date(hoveredDay.date + \"T00:00:00\").toLocaleDateString(undefined, {\n weekday: \"short\",\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })}\n
\n {hoveredDay.stats.totalTokens === 0 ? (\n
No activity recorded
\n ) : (\n
\n
\n {formatExact(hoveredDay.stats.totalTokens)} tokens\n
\n
\n {hoveredDay.stats.turns} requests / steps\n
\n
\n Billed: {formatNumber(hoveredDay.stats.inputTokens + hoveredDay.stats.outputTokens)} \u00B7 Cache: {formatNumber(hoveredDay.stats.cacheReadTokens)}\n
\n
\n )}\n \n )}\n \n );\n}\n", "import React from \"react\";\nimport { HeatmapView } from \"./HeatmapView.js\";\n\ninterface HeatmapModalProps {\n open: boolean;\n onClose: () => void;\n}\n\nexport function HeatmapModal({ open, onClose }: HeatmapModalProps) {\n if (!open) return null;\n\n return (\n \n e.stopPropagation()}\n style={{\n position: \"relative\",\n width: \"100%\",\n maxWidth: \"960px\",\n maxHeight: \"90vh\",\n overflowY: \"auto\",\n background: \"var(--dsw-alias-bg-layer-1, #1e1e1e)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n borderRadius: \"14px\",\n boxShadow: \"0 16px 40px rgba(0, 0, 0, 0.5)\",\n padding: \"24px 28px\",\n }}\n >\n {/* Close button */}\n \n \u2715\n \n\n \n \n \n );\n}\n"], + "mappings": "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", "names": ["import_react", "React", "import_react", "React", "React"] } diff --git a/src/client/HeatmapView.tsx b/src/client/HeatmapView.tsx index 453566c..7336353 100644 --- a/src/client/HeatmapView.tsx +++ b/src/client/HeatmapView.tsx @@ -57,13 +57,13 @@ function formatExact(num: number): string { const MONTH_NAMES = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; const DAY_LABELS = ["", "Mon", "", "Wed", "", "Fri", ""]; -// DeepSeek Blue/Indigo theme levels (OpenCode & Codex style) +// DeepSeek Official Blue Gradient (anchored on DeepSeek logo #3964FE and highlight #5686FE) const DEEPSEEK_LEVELS = [ - "var(--dsw-alias-interactive-bg-hover, rgba(128, 128, 128, 0.08))", - "#1e2640", - "#2d3e8b", - "#3d52c4", - "#4f46e5", + "rgba(57, 100, 254, 0.06)", + "#1c2d68", + "#2849b8", + "#3964fe", + "#5686fe", ]; export function HeatmapView() { @@ -321,9 +321,9 @@ export function HeatmapView() { fontWeight: 600, padding: "2px 8px", borderRadius: 12, - background: "rgba(79, 70, 229, 0.15)", - color: "var(--dsw-alias-brand-primary, #6366f1)", - border: "1px solid rgba(79, 70, 229, 0.3)", + background: "rgba(57, 100, 254, 0.12)", + color: "#5686fe", + border: "1px solid rgba(57, 100, 254, 0.3)", }} > 52 Weeks @@ -412,7 +412,7 @@ export function HeatmapView() {
Total Tokens
-
+
{formatNumber(summary.totalTokens)}
@@ -660,7 +660,7 @@ export function HeatmapView() {
No activity recorded
) : (
-
+
{formatExact(hoveredDay.stats.totalTokens)} tokens
diff --git a/src/client/index.tsx b/src/client/index.tsx index 95da3cc..c0bf411 100644 --- a/src/client/index.tsx +++ b/src/client/index.tsx @@ -78,22 +78,22 @@ export function apply(ctx: any) { width: 100%; margin-top: 12px; padding: 8px 12px; - background: rgba(79, 70, 229, 0.12); - border: 1px solid rgba(79, 70, 229, 0.35); + background: rgba(57, 100, 254, 0.12); + border: 1px solid rgba(57, 100, 254, 0.35); border-radius: 8px; - color: var(--dsw-alias-brand-primary, #6366f1); + color: #5686fe; font-size: 12px; font-weight: 600; cursor: pointer; transition: background 0.15s ease, border-color 0.15s ease; `; button.onmouseenter = () => { - button.style.background = "rgba(79, 70, 229, 0.22)"; - button.style.borderColor = "var(--dsw-alias-brand-primary, #6366f1)"; + button.style.background = "rgba(57, 100, 254, 0.22)"; + button.style.borderColor = "#3964fe"; }; button.onmouseleave = () => { - button.style.background = "rgba(79, 70, 229, 0.12)"; - button.style.borderColor = "rgba(79, 70, 229, 0.35)"; + button.style.background = "rgba(57, 100, 254, 0.12)"; + button.style.borderColor = "rgba(57, 100, 254, 0.35)"; }; button.onclick = (e) => { e.preventDefault();