token-contribution 0.0.0-stage → 0.1.0

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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/client/index.tsx", "../src/client/HeatmapView.tsx", "../src/client/HeatmapModal.tsx"],
4
+ "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 = \"token-contribution-client\";\nexport const inject = [\"slots\"];\n\nexport function apply(ctx: any) {\n // 1. Register under Settings -> \"Token Contribution\"\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-contribution\",\n order: 14,\n label: () => \"Token Contribution\",\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 // Inject dynamic resizing stylesheet for settings dialog\n if (!document.getElementById(\"dsh-token-heatmap-panel-resize\")) {\n const resizeStyle = document.createElement(\"style\");\n resizeStyle.id = \"dsh-token-heatmap-panel-resize\";\n resizeStyle.textContent = `\n /* Dynamically widen DSH Settings panel when Token Heatmap is active */\n .VOzbGW_panel:has([data-dsh-heatmap]),\n [class*=\"_panel\"]:has([data-dsh-heatmap]) {\n width: min(1180px, calc(100vw - 32px)) !important;\n max-width: calc(100vw - 32px) !important;\n transition: width 0.25s cubic-bezier(0.16, 1, 0.3, 1), max-width 0.25s ease !important;\n }\n `;\n document.head.appendChild(resizeStyle);\n }\n\n const modalContainer = document.createElement(\"div\");\n modalContainer.id = \"token-contribution-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-contribution\", handleOpen);\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-contribution\", handleOpen);\n window.removeEventListener(\"dsh:open-token-heatmap\", handleOpen);\n };\n }, []);\n\n return <HeatmapModal open={isOpen} onClose={() => setIsOpen(false)} />;\n }\n\n root.render(<ModalController />);\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 = \"<span>View Token Contribution \u2192</span>\";\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(51, 109, 250, 0.12);\n border: 1px solid rgba(51, 109, 250, 0.35);\n border-radius: 8px;\n color: #4f85ff;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15);\n transition: all 0.15s ease;\n `;\n button.onmouseenter = () => {\n button.style.background = \"rgba(51, 109, 250, 0.22)\";\n button.style.borderColor = \"#336dfa\";\n button.style.boxShadow = \"0 2px 8px rgba(51, 109, 250, 0.25)\";\n };\n button.onmouseleave = () => {\n button.style.background = \"rgba(51, 109, 250, 0.12)\";\n button.style.borderColor = \"rgba(51, 109, 250, 0.35)\";\n button.style.boxShadow = \"0 1px 4px rgba(0, 0, 0, 0.15)\";\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 Contribution\" || 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-contribution\"));\n }\n }, 120);\n } else {\n // Open direct interactive modal\n window.dispatchEvent(new CustomEvent(\"dsh:open-token-contribution\"));\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, useRef } from \"react\";\n\nexport interface DaySessionDetail {\n sessionId: string;\n sessionTitle: string;\n createdAt: number;\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n turns: number;\n}\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 sessions?: DaySessionDetail[];\n}\n\nexport interface ModelUsage {\n model: string;\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n turns: number;\n percentage: 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<string, DayStats>;\n models?: Record<string, { totalTokens: number; inputTokens: number; outputTokens: number; cacheReadTokens: number; turns: number }>;\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<string, DayStats>;\n sessions: SessionSummary[];\n models?: ModelUsage[];\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 = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\n// Simple monochromatic gradient: Black -> Vibrant DeepSeek Blue\nconst DEEPSEEK_LEVELS = [\n \"#0f1117\", // Level 0: Black / dark void tile\n \"#152c6f\", // Level 1: Dark deep blue\n \"#1f4cdb\", // Level 2: Medium vibrant blue\n \"#336dfa\", // Level 3: Vibrant DeepSeek brand blue\n \"#4f85ff\", // Level 4: Bright electric DeepSeek blue\n];\n\n// Clean depth for tiles (subtle glow on peak tiles only)\nconst TILE_SHADOWS = [\n \"none\",\n \"none\",\n \"none\",\n \"0 0 3px rgba(51, 109, 250, 0.35)\",\n \"0 0 6px rgba(79, 133, 255, 0.65)\",\n];\n\nfunction HeatmapInnerView() {\n const [data, setData] = useState<HeatmapResponse | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [selectedSessionId, setSelectedSessionId] = useState<string>(\"all\");\n const [selectedDate, setSelectedDate] = useState<string | null>(null);\n const [chartRange, setChartRange] = useState<14 | 30 | 90>(30);\n const [hoveredDay, setHoveredDay] = useState<{ date: string; stats: DayStats } | null>(null);\n const [hoveredBar, setHoveredBar] = useState<{\n date: string;\n label: string;\n totalTokens: number;\n billedTokens: number;\n cachedTokens: number;\n turns: number;\n } | null>(null);\n const [tooltipPos, setTooltipPos] = useState<{ x: number; y: number } | null>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Dynamically enlarge the DSH Settings dialog panel so the calendar fits perfectly without a scrollbar\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const findPanel = () => {\n return (\n rootRef.current?.closest('[class*=\"_panel\"]') ||\n document.querySelector('.VOzbGW_panel') ||\n document.querySelector('[class*=\"_panel\"]')\n ) as HTMLElement | null;\n };\n\n const panel = findPanel();\n if (panel) {\n const prevWidth = panel.style.width;\n const prevMaxWidth = panel.style.maxWidth;\n const prevTransition = panel.style.transition;\n\n panel.style.transition = \"width 0.25s cubic-bezier(0.16, 1, 0.3, 1), max-width 0.25s ease\";\n panel.style.setProperty(\"width\", \"min(1180px, calc(100vw - 32px))\", \"important\");\n panel.style.setProperty(\"max-width\", \"calc(100vw - 32px)\", \"important\");\n\n return () => {\n panel.style.width = prevWidth;\n panel.style.maxWidth = prevMaxWidth;\n panel.style.transition = prevTransition;\n };\n }\n }, []);\n\n const fetchStats = () => {\n setLoading(true);\n fetch(\"/api/token-contribution/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 models: data.models || [],\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 models: data.models || [],\n sessionTitle: \"All Sessions (Global)\",\n };\n }\n\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 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<string, DayStats> = {};\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 // Models for this session\n const sessionModels: ModelUsage[] = session.models\n ? Object.entries(session.models)\n .map(([model, m]) => ({\n model,\n totalTokens: m.totalTokens,\n inputTokens: m.inputTokens,\n outputTokens: m.outputTokens,\n cacheReadTokens: m.cacheReadTokens,\n turns: m.turns,\n percentage: totalTokens > 0 ? Math.round((m.totalTokens / totalTokens) * 1000) / 10 : 0,\n }))\n .sort((a, b) => b.totalTokens - a.totalTokens)\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 models: sessionModels,\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<Array<{ date: string; stats: DayStats } | null>> = [];\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 // Daily token timeline chart data for the selected range (14, 30, or 90 days)\n const chartData = useMemo(() => {\n if (!activeView) return [];\n const now = new Date();\n const items: Array<{\n date: string;\n label: string;\n totalTokens: number;\n billedTokens: number;\n cachedTokens: number;\n turns: number;\n }> = [];\n\n for (let i = chartRange - 1; i >= 0; i--) {\n const d = new Date(now);\n d.setDate(d.getDate() - i);\n const dateKey = `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, \"0\")}-${String(d.getDate()).padStart(2, \"0\")}`;\n const stats = activeView.days[dateKey] || {\n totalTokens: 0,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheWriteTokens: 0,\n turns: 0,\n };\n items.push({\n date: dateKey,\n label: `${MONTH_NAMES[d.getMonth()]} ${d.getDate()}`,\n totalTokens: stats.totalTokens,\n billedTokens: stats.inputTokens + stats.outputTokens,\n cachedTokens: stats.cacheReadTokens,\n turns: stats.turns,\n });\n }\n return items;\n }, [activeView, chartRange]);\n\n const maxChartTokens = useMemo(() => {\n return Math.max(...chartData.map((d) => d.totalTokens), 1_000_000);\n }, [chartData]);\n\n if (loading && !data) {\n return (\n <div style={{ padding: \"40px 20px\", textAlign: \"center\", color: \"var(--dsw-alias-label-secondary)\" }}>\n Loading token usage statistics...\n </div>\n );\n }\n\n if (error) {\n return (\n <div style={{ padding: \"20px\", color: \"var(--dsw-alias-state-error-primary, #ef4444)\" }}>\n Failed to load heatmap: {error}\n <button\n onClick={fetchStats}\n style={{\n marginLeft: 12,\n padding: \"4px 10px\",\n background: \"var(--dsw-alias-bg-layer-2)\",\n border: \"1px solid var(--dsw-alias-border-l2)\",\n color: \"var(--dsw-alias-label-primary)\",\n borderRadius: 6,\n cursor: \"pointer\",\n }}\n >\n Retry\n </button>\n </div>\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 const inspectedDayStats = selectedDate ? activeView.days[selectedDate] : null;\n\n return (\n <div\n data-dsh-heatmap=\"true\"\n ref={rootRef}\n style={{\n boxSizing: \"border-box\",\n width: \"100%\",\n maxWidth: \"1020px\",\n margin: \"0 auto\",\n padding: \"8px 0 40px\",\n fontFamily: \"inherit\",\n color: \"var(--dsw-alias-label-primary, #eeeeee)\",\n }}\n >\n {/* Top Header & Filter Controls (OpenCode / Codex style) */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n flexWrap: \"wrap\",\n gap: 14,\n marginBottom: 16,\n }}\n >\n <div>\n <h2\n style={{\n margin: 0,\n fontSize: 20,\n fontWeight: 650,\n letterSpacing: \"-0.02em\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n }}\n >\n Token Usage Activity\n <span\n style={{\n fontSize: 11,\n fontWeight: 600,\n padding: \"2px 8px\",\n borderRadius: 12,\n background: \"rgba(51, 109, 250, 0.12)\",\n color: \"#4f85ff\",\n border: \"1px solid rgba(51, 109, 250, 0.35)\",\n }}\n >\n 52 Weeks\n </span>\n </h2>\n <p\n style={{\n margin: \"4px 0 0\",\n fontSize: 12,\n color: \"var(--dsw-alias-label-tertiary, #a0a0a0)\",\n }}\n >\n Daily token throughput and model breakdown across sessions\n </p>\n </div>\n\n {/* Right side controls: Session selector & Refresh */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 10 }}>\n {/* Session Filter Dropdown */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <span style={{ fontSize: 12, color: \"var(--dsw-alias-label-tertiary)\" }}>Session:</span>\n <select\n value={selectedSessionId}\n onChange={(e) => {\n setSelectedSessionId(e.target.value);\n setSelectedDate(null);\n }}\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 <option value=\"all\">All Sessions ({(data.sessions || []).length} total)</option>\n {(data.sessions || []).map((s) => (\n <option key={s.id} value={s.id}>\n {new Date(s.createdAt).toLocaleDateString()} \u00B7 {s.title.slice(0, 32)}\n </option>\n ))}\n </select>\n </div>\n\n <button\n onClick={fetchStats}\n title=\"Refresh statistics\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\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)\",\n borderRadius: 8,\n padding: \"6px 12px\",\n fontSize: 12,\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n \u21BB Refresh\n </button>\n </div>\n </div>\n\n {/* Prominent Centered Total Token Usage Hero (Centered above the chart) */}\n <div\n style={{\n textAlign: \"center\",\n margin: \"12px 0 20px\",\n padding: \"16px 20px\",\n background: \"var(--dsw-alias-bg-layer-2, #2c2c2c)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n borderRadius: 12,\n boxShadow: \"0 2px 8px rgba(0, 0, 0, 0.15)\",\n }}\n >\n <div style={{ fontSize: 11, textTransform: \"uppercase\", letterSpacing: \"0.08em\", color: \"var(--dsw-alias-label-tertiary, #a0a0a0)\", fontWeight: 600 }}>\n Total Tokens Processed\n </div>\n <div style={{ fontSize: 36, fontWeight: 800, margin: \"6px 0 2px\", color: \"#4f85ff\", letterSpacing: \"-0.03em\" }}>\n {formatExact(summary.totalTokens)}\n </div>\n <div style={{ fontSize: 13, color: \"var(--dsw-alias-label-secondary, #b9b9b9)\" }}>\n <strong>{formatNumber(summary.totalTokens)}</strong> tokens across {summary.activeDays} active days ({summary.totalTurns} total requests)\n </div>\n </div>\n\n {/* Contribution Calendar Card (Centered and scaled to fit without horizontal scrollbars) */}\n <div\n style={{\n background: \"var(--dsw-alias-bg-layer-2, #2c2c2c)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n borderRadius: 12,\n padding: \"18px 20px\",\n position: \"relative\",\n boxShadow: \"0 4px 16px rgba(0, 0, 0, 0.2)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: 12,\n fontSize: 13,\n fontWeight: 600,\n }}\n >\n <span>Contribution Calendar</span>\n {summary.peakDay && (\n <span style={{ fontSize: 12, fontWeight: 400, color: \"var(--dsw-alias-label-secondary)\" }}>\n Peak day: <strong style={{ color: \"var(--dsw-alias-label-primary)\" }}>{summary.peakDay.date}</strong> ({formatNumber(summary.peakDay.tokens)} tokens)\n </span>\n )}\n </div>\n\n {/* Clean, centered SVG Calendar Grid (Fits 1180px panel with zero scrollbars) */}\n {calendarGrid && (\n <div style={{ width: \"100%\", display: \"flex\", flexDirection: \"column\", alignItems: \"center\" }}>\n <svg\n viewBox=\"0 0 880 136\"\n style={{\n width: \"100%\",\n maxWidth: \"880px\",\n height: \"auto\",\n display: \"block\",\n overflow: \"visible\",\n }}\n >\n {/* Month labels */}\n {monthHeaders.map((m, i) => (\n <text\n key={i}\n x={32 + m.col * 15.6}\n y={11}\n fontSize={11}\n fill=\"var(--dsw-alias-label-tertiary, #888888)\"\n fontFamily=\"inherit\"\n >\n {m.label}\n </text>\n ))}\n\n {/* Day of week labels */}\n <text x={2} y={45} fontSize={10} fill=\"var(--dsw-alias-label-tertiary, #888888)\" fontFamily=\"inherit\">\n Mon\n </text>\n <text x={2} y={76} fontSize={10} fill=\"var(--dsw-alias-label-tertiary, #888888)\" fontFamily=\"inherit\">\n Wed\n </text>\n <text x={2} y={107} fontSize={10} fill=\"var(--dsw-alias-label-tertiary, #888888)\" fontFamily=\"inherit\">\n Fri\n </text>\n\n {/* Day Tiles: comfortable 12px with 15.6px step */}\n {calendarGrid.map((week, colIdx) => (\n <g key={colIdx} transform={`translate(${32 + colIdx * 15.6}, 18)`}>\n {week.map((day, rowIdx) => {\n if (!day) return null;\n\n const lvl = day.stats.level || 0;\n const bg = DEEPSEEK_LEVELS[lvl];\n const isSelected = selectedDate === day.date;\n const isHovered = hoveredDay?.date === day.date;\n\n // GitHub-style glow & outline\n const strokeColor = isSelected\n ? \"#ffffff\"\n : isHovered\n ? \"#5686fe\"\n : lvl === 0\n ? \"rgba(255, 255, 255, 0.06)\"\n : \"transparent\";\n\n const strokeWidth = isSelected ? 1.8 : isHovered ? 1.4 : 1;\n\n return (\n <rect\n key={rowIdx}\n x={0}\n y={rowIdx * 15.6}\n width={12}\n height={12}\n rx={2.5}\n ry={2.5}\n fill={bg}\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n style={{\n cursor: \"pointer\",\n transition: \"fill 0.12s ease, stroke 0.12s ease\",\n filter: isSelected\n ? \"drop-shadow(0 0 6px rgba(86, 134, 254, 0.9))\"\n : isHovered\n ? \"drop-shadow(0 0 4px rgba(86, 134, 254, 0.7))\"\n : lvl === 4\n ? \"drop-shadow(0 0 3px rgba(79, 133, 255, 0.5))\"\n : \"none\",\n }}\n onClick={() => {\n setSelectedDate(isSelected ? null : day.date);\n }}\n onMouseEnter={(e) => {\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 />\n );\n })}\n </g>\n ))}\n </svg>\n\n {/* Bottom Legend */}\n <div\n style={{\n width: \"100%\",\n maxWidth: \"880px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginTop: 12,\n fontSize: 11,\n color: \"var(--dsw-alias-label-tertiary, #a0a0a0)\",\n }}\n >\n <span style={{ fontSize: 11 }}>\n Tip: Click any day to inspect sessions and token breakdown\n </span>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <span>Less</span>\n {DEEPSEEK_LEVELS.map((c, i) => (\n <div\n key={i}\n style={{\n width: 12,\n height: 12,\n borderRadius: 2.5,\n backgroundColor: c,\n border: i === 0 ? \"1px solid rgba(255, 255, 255, 0.06)\" : \"none\",\n filter: i === 4 ? \"drop-shadow(0 0 3px rgba(79, 133, 255, 0.5))\" : \"none\",\n }}\n />\n ))}\n <span>More</span>\n </div>\n </div>\n </div>\n )}\n </div>\n\n {/* Secondary Metrics Grid (Under the chart, cache color cleared to neutral) */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fit, minmax(180px, 1fr))\",\n gap: 12,\n marginTop: 18,\n marginBottom: 18,\n }}\n >\n {/* Card 1: Cache Hit Ratio (CLEARED BLUE COLOR -> Neutral/Clean White) */}\n <div\n style={{\n background: \"var(--dsw-alias-bg-layer-2, #2c2c2c)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n borderRadius: 10,\n padding: \"14px 16px\",\n boxShadow: \"0 2px 8px rgba(0, 0, 0, 0.15)\",\n }}\n >\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-tertiary, #a0a0a0)\", textTransform: \"uppercase\", letterSpacing: \"0.06em\", fontWeight: 600 }}>\n Cache Hit Ratio\n </div>\n <div style={{ fontSize: 24, fontWeight: 700, margin: \"6px 0 2px\", color: \"var(--dsw-alias-label-primary, #ffffff)\" }}>\n {cacheHitPercent}%\n </div>\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-secondary, #b9b9b9)\" }}>\n {formatNumber(summary.totalCacheReadTokens)} cached reads\n </div>\n </div>\n\n {/* Card 2: Daily Average / Turns */}\n <div\n style={{\n background: \"var(--dsw-alias-bg-layer-2, #2c2c2c)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n borderRadius: 10,\n padding: \"14px 16px\",\n boxShadow: \"0 2px 8px rgba(0, 0, 0, 0.15)\",\n }}\n >\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-tertiary, #a0a0a0)\", textTransform: \"uppercase\", letterSpacing: \"0.06em\", fontWeight: 600 }}>\n {selectedSessionId === \"all\" ? \"Daily Average\" : \"Total Steps\"}\n </div>\n <div style={{ fontSize: 24, fontWeight: 700, margin: \"6px 0 2px\", color: \"var(--dsw-alias-label-primary, #ffffff)\" }}>\n {selectedSessionId === \"all\" ? formatNumber(summary.dailyAverage) : summary.totalTurns}\n </div>\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-secondary, #b9b9b9)\" }}>\n {selectedSessionId === \"all\" ? `Across ${summary.activeDays} active days` : `${formatNumber(summary.totalInputTokens + summary.totalOutputTokens)} billed`}\n </div>\n </div>\n\n {/* Card 3: Streak / Activity */}\n <div\n style={{\n background: \"var(--dsw-alias-bg-layer-2, #2c2c2c)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n borderRadius: 10,\n padding: \"14px 16px\",\n boxShadow: \"0 2px 8px rgba(0, 0, 0, 0.15)\",\n }}\n >\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-tertiary, #a0a0a0)\", textTransform: \"uppercase\", letterSpacing: \"0.06em\", fontWeight: 600 }}>\n {selectedSessionId === \"all\" ? \"Active Streak\" : \"Active Days\"}\n </div>\n <div style={{ fontSize: 24, fontWeight: 700, margin: \"6px 0 2px\", color: \"var(--dsw-alias-label-primary, #ffffff)\" }}>\n {selectedSessionId === \"all\" ? `${summary.currentStreak} days` : `${summary.activeDays} days`}\n </div>\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-secondary, #b9b9b9)\" }}>\n {selectedSessionId === \"all\" ? `Longest streak: ${summary.longestStreak} days` : `Session: ${activeView.sessionTitle.slice(0, 24)}`}\n </div>\n </div>\n\n {/* Card 4: Peak Day */}\n <div\n style={{\n background: \"var(--dsw-alias-bg-layer-2, #2c2c2c)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n borderRadius: 10,\n padding: \"14px 16px\",\n boxShadow: \"0 2px 8px rgba(0, 0, 0, 0.15)\",\n }}\n >\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-tertiary, #a0a0a0)\", textTransform: \"uppercase\", letterSpacing: \"0.06em\", fontWeight: 600 }}>\n Peak Volume Day\n </div>\n <div style={{ fontSize: 20, fontWeight: 700, margin: \"6px 0 2px\", color: \"var(--dsw-alias-label-primary, #ffffff)\" }}>\n {summary.peakDay ? formatNumber(summary.peakDay.tokens) : \"None\"}\n </div>\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-secondary, #b9b9b9)\" }}>\n {summary.peakDay ? summary.peakDay.date : \"No activity\"}\n </div>\n </div>\n </div>\n\n {/* Top Models Breakdown Section */}\n {activeView.models && activeView.models.length > 0 && (\n <div\n style={{\n background: \"var(--dsw-alias-bg-layer-2, #2c2c2c)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n borderRadius: 12,\n padding: \"18px 20px\",\n marginBottom: 18,\n boxShadow: \"0 2px 8px rgba(0, 0, 0, 0.15)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n marginBottom: 12,\n }}\n >\n <div style={{ fontSize: 13, fontWeight: 650, color: \"var(--dsw-alias-label-primary, #ffffff)\" }}>\n Model Usage Breakdown\n </div>\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-tertiary, #a0a0a0)\" }}>\n {activeView.models.length} model{activeView.models.length === 1 ? \"\" : \"s\"} tracked\n </div>\n </div>\n\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n {activeView.models.map((m) => (\n <div key={m.model}>\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n fontSize: 12,\n marginBottom: 5,\n }}\n >\n <span style={{ fontWeight: 600, color: \"var(--dsw-alias-label-primary)\" }}>\n {m.model}\n </span>\n <span style={{ color: \"var(--dsw-alias-label-secondary)\" }}>\n <strong style={{ color: \"#4f85ff\" }}>{formatNumber(m.totalTokens)}</strong> ({m.percentage}%) \u00B7 {m.turns} requests\n </span>\n </div>\n <div\n style={{\n width: \"100%\",\n height: 6,\n background: \"rgba(255, 255, 255, 0.06)\",\n borderRadius: 3,\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n width: `${Math.max(1, m.percentage)}%`,\n height: \"100%\",\n background: \"#336dfa\",\n borderRadius: 3,\n transition: \"width 0.3s ease\",\n }}\n />\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Token Usage Trends Graph Card */}\n <div\n style={{\n background: \"var(--dsw-alias-bg-layer-2, #2c2c2c)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n borderRadius: 12,\n padding: \"18px 20px\",\n position: \"relative\",\n boxShadow: \"0 4px 16px rgba(0, 0, 0, 0.2)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n flexWrap: \"wrap\",\n gap: 12,\n marginBottom: 16,\n }}\n >\n <div>\n <div style={{ fontSize: 13, fontWeight: 650, color: \"var(--dsw-alias-label-primary, #ffffff)\" }}>\n Token Usage Trends\n </div>\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-tertiary, #a0a0a0)\", marginTop: 2 }}>\n Daily billed vs cached token volume over time\n </div>\n </div>\n\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 14, flexWrap: \"wrap\" }}>\n {/* Legend: Billed vs Cached */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12, fontSize: 11, color: \"var(--dsw-alias-label-secondary)\" }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 5 }}>\n <span style={{ width: 8, height: 8, borderRadius: 2, background: \"#4f85ff\" }} />\n <span>Billed Tokens</span>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 5 }}>\n <span style={{ width: 8, height: 8, borderRadius: 2, background: \"#253b82\" }} />\n <span>Cache Reads</span>\n </div>\n </div>\n\n {/* Range Toggle: 14D | 30D | 90D */}\n <div\n style={{\n display: \"inline-flex\",\n background: \"var(--dsw-alias-bg-layer-1, #1e1e1e)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n borderRadius: 8,\n padding: 2,\n }}\n >\n {[14, 30, 90].map((days) => (\n <button\n key={days}\n onClick={() => setChartRange(days as any)}\n style={{\n border: 0,\n background: chartRange === days ? \"var(--dsw-alias-bg-layer-2, #2c2c2c)\" : \"transparent\",\n color: chartRange === days ? \"#4f85ff\" : \"var(--dsw-alias-label-tertiary)\",\n fontSize: 11,\n padding: \"3px 8px\",\n borderRadius: 6,\n cursor: \"pointer\",\n fontWeight: chartRange === days ? 600 : 400,\n }}\n >\n {days}D\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* The SVG Timeline Bar Chart */}\n <div style={{ width: \"100%\", overflowX: \"auto\", WebkitOverflowScrolling: \"touch\" }}>\n <div style={{ minWidth: \"680px\", width: \"100%\" }}>\n <svg\n viewBox=\"0 0 880 180\"\n style={{ width: \"100%\", height: \"180px\", display: \"block\", overflow: \"visible\" }}\n >\n {/* Horizontal grid lines & Y labels */}\n {[1, 0.66, 0.33, 0].map((ratio, i) => {\n const y = 20 + (1 - ratio) * 125;\n const tokenVal = Math.round(maxChartTokens * ratio);\n return (\n <g key={i}>\n <line\n x1={45}\n y1={y}\n x2={870}\n y2={y}\n stroke=\"var(--dsw-alias-border-l1, rgba(255,255,255,0.08))\"\n strokeDasharray=\"4 4\"\n />\n <text\n x={40}\n y={y + 3}\n fontSize={9}\n fill=\"var(--dsw-alias-label-tertiary, #888888)\"\n textAnchor=\"end\"\n fontFamily=\"inherit\"\n >\n {formatNumber(tokenVal)}\n </text>\n </g>\n );\n })}\n\n {/* Bars for each day in chartData */}\n {chartData.map((d, idx) => {\n const totalBarWidth = 825 / chartData.length;\n const barWidth = Math.max(5, Math.min(22, totalBarWidth - 5));\n const x = 50 + idx * totalBarWidth + (totalBarWidth - barWidth) / 2;\n\n const totalH = (d.totalTokens / maxChartTokens) * 125;\n const cachedH = d.totalTokens > 0 ? (d.cachedTokens / d.totalTokens) * totalH : 0;\n const billedH = totalH - cachedH;\n const yBase = 145;\n\n const isHovered = hoveredBar?.date === d.date;\n\n return (\n <g\n key={idx}\n style={{ cursor: \"pointer\" }}\n onMouseEnter={(e) => {\n setHoveredBar(d);\n const rect = e.currentTarget.getBoundingClientRect();\n setTooltipPos({ x: rect.left + rect.width / 2, y: rect.top - 8 });\n }}\n onMouseLeave={() => {\n setHoveredBar(null);\n setTooltipPos(null);\n }}\n onClick={() => setSelectedDate(selectedDate === d.date ? null : d.date)}\n >\n {/* Hover hit area */}\n <rect\n x={x - 2}\n y={20}\n width={barWidth + 4}\n height={125}\n fill={isHovered ? \"rgba(79, 133, 255, 0.08)\" : \"transparent\"}\n rx={3}\n />\n\n {/* Empty/Zero line marker if 0 tokens */}\n {d.totalTokens === 0 ? (\n <rect\n x={x}\n y={yBase - 2}\n width={barWidth}\n height={2}\n fill=\"rgba(255, 255, 255, 0.08)\"\n rx={1}\n />\n ) : (\n <g>\n {/* Cached segment (bottom) */}\n {cachedH > 0 && (\n <rect\n x={x}\n y={yBase - cachedH}\n width={barWidth}\n height={cachedH}\n fill=\"#253b82\"\n rx={billedH <= 0 ? 2 : 0}\n />\n )}\n {/* Billed segment (top) */}\n {billedH > 0 && (\n <rect\n x={x}\n y={yBase - totalH}\n width={barWidth}\n height={billedH}\n fill={isHovered ? \"#60a5fa\" : \"#4f85ff\"}\n rx={2}\n style={{\n filter: isHovered ? \"drop-shadow(0 0 5px rgba(79, 133, 255, 0.8))\" : \"none\",\n }}\n />\n )}\n </g>\n )}\n\n {/* X-axis date labels: show every Nth label depending on range */}\n {(chartRange === 14 || idx % (chartRange === 30 ? 3 : 7) === 0) && (\n <text\n x={x + barWidth / 2}\n y={162}\n fontSize={9}\n fill=\"var(--dsw-alias-label-tertiary, #888888)\"\n textAnchor=\"middle\"\n fontFamily=\"inherit\"\n >\n {d.label}\n </text>\n )}\n </g>\n );\n })}\n </svg>\n </div>\n </div>\n </div>\n\n {/* Day Inspection Detail Drawer (Opens when any day is clicked) */}\n {selectedDate && (\n <div\n style={{\n marginTop: 18,\n background: \"var(--dsw-alias-bg-layer-2, #2c2c2c)\",\n border: \"1px solid var(--dsw-alias-border-l2, #494949)\",\n borderRadius: 12,\n padding: \"18px 20px\",\n boxShadow: \"0 6px 20px rgba(0, 0, 0, 0.25)\",\n animation: \"fadeIn 0.15s ease\",\n }}\n >\n {/* Header of the Day Detail */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderBottom: \"1px solid var(--dsw-alias-border-l1, #3a3a3a)\",\n paddingBottom: 12,\n marginBottom: 14,\n }}\n >\n <div>\n <div style={{ fontSize: 16, fontWeight: 700, color: \"var(--dsw-alias-label-primary, #ffffff)\" }}>\n {new Date(selectedDate + \"T00:00:00\").toLocaleDateString(undefined, {\n weekday: \"long\",\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n })}\n </div>\n <div style={{ fontSize: 12, color: \"var(--dsw-alias-label-secondary, #b9b9b9)\", marginTop: 2 }}>\n {inspectedDayStats && inspectedDayStats.totalTokens > 0 ? (\n <span>\n <strong style={{ color: \"#4f85ff\" }}>{formatExact(inspectedDayStats.totalTokens)}</strong> total tokens across{\" \"}\n <strong>{inspectedDayStats.turns}</strong> turns\n </span>\n ) : (\n \"No activity recorded\"\n )}\n </div>\n </div>\n\n <button\n onClick={() => setSelectedDate(null)}\n style={{\n background: \"transparent\",\n border: \"none\",\n color: \"var(--dsw-alias-label-tertiary)\",\n cursor: \"pointer\",\n fontSize: 16,\n padding: \"4px 8px\",\n borderRadius: 4,\n }}\n title=\"Close day view\"\n >\n \u2715\n </button>\n </div>\n\n {/* Breakdown Pills for the day */}\n {inspectedDayStats && inspectedDayStats.totalTokens > 0 && (\n <div\n style={{\n display: \"flex\",\n gap: 12,\n flexWrap: \"wrap\",\n marginBottom: 16,\n fontSize: 12,\n }}\n >\n <div style={{ padding: \"6px 12px\", background: \"var(--dsw-alias-bg-layer-1, #1e1e1e)\", borderRadius: 6, border: \"1px solid var(--dsw-alias-border-l1)\" }}>\n <span style={{ color: \"var(--dsw-alias-label-tertiary)\" }}>Billed Input: </span>\n <strong>{formatNumber(inspectedDayStats.inputTokens)}</strong>\n </div>\n <div style={{ padding: \"6px 12px\", background: \"var(--dsw-alias-bg-layer-1, #1e1e1e)\", borderRadius: 6, border: \"1px solid var(--dsw-alias-border-l1)\" }}>\n <span style={{ color: \"var(--dsw-alias-label-tertiary)\" }}>Output Generated: </span>\n <strong>{formatNumber(inspectedDayStats.outputTokens)}</strong>\n </div>\n <div style={{ padding: \"6px 12px\", background: \"var(--dsw-alias-bg-layer-1, #1e1e1e)\", borderRadius: 6, border: \"1px solid var(--dsw-alias-border-l1)\" }}>\n <span style={{ color: \"var(--dsw-alias-label-tertiary)\" }}>Cache Reads: </span>\n <strong>{formatNumber(inspectedDayStats.cacheReadTokens)}</strong> (\n {Math.round((inspectedDayStats.cacheReadTokens / inspectedDayStats.totalTokens) * 100)}%)\n </div>\n </div>\n )}\n\n {/* Sessions List for that Day */}\n <div>\n <div style={{ fontSize: 13, fontWeight: 600, color: \"var(--dsw-alias-label-primary)\", marginBottom: 10 }}>\n Sessions Active on this Day ({(inspectedDayStats?.sessions || []).length})\n </div>\n\n {inspectedDayStats?.sessions && inspectedDayStats.sessions.length > 0 ? (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8, maxHeight: 320, overflowY: \"auto\" }}>\n {inspectedDayStats.sessions.map((sess, idx) => (\n <div\n key={idx}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"10px 14px\",\n background: \"var(--dsw-alias-bg-layer-1, #1e1e1e)\",\n border: \"1px solid var(--dsw-alias-border-l1, #3a3a3a)\",\n borderRadius: 8,\n }}\n >\n <div style={{ minWidth: 0, flex: 1, paddingRight: 16 }}>\n <div style={{ fontWeight: 600, fontSize: 13, color: \"var(--dsw-alias-label-primary, #ffffff)\", overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }}>\n {sess.sessionTitle}\n </div>\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-tertiary, #a0a0a0)\", marginTop: 2 }}>\n Started {new Date(sess.createdAt).toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" })} \u00B7 ID: {sess.sessionId.slice(0, 10)}\n </div>\n </div>\n\n <div style={{ textAlign: \"right\", flexShrink: 0 }}>\n <div style={{ fontWeight: 700, fontSize: 13, color: \"#4f85ff\" }}>\n {formatNumber(sess.totalTokens)} tokens\n </div>\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-secondary)\", marginTop: 2 }}>\n {sess.turns} turns \u00B7 {formatNumber(sess.inputTokens + sess.outputTokens)} billed\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div style={{ padding: \"16px\", textAlign: \"center\", color: \"var(--dsw-alias-label-tertiary)\", fontSize: 12, background: \"var(--dsw-alias-bg-layer-1)\", borderRadius: 8 }}>\n No session records found for this date.\n </div>\n )}\n </div>\n </div>\n )}\n\n {/* Floating Hover Tooltip for Calendar Day */}\n {hoveredDay && tooltipPos && !selectedDate && (\n <div\n style={{\n position: \"fixed\",\n left: tooltipPos.x,\n top: tooltipPos.y,\n transform: \"translate(-50%, -100%)\",\n background: \"var(--dsw-alias-bg-layer-1, #1e1e1e)\",\n border: \"1px solid var(--dsw-alias-border-l3, #555555)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n fontSize: 12,\n lineHeight: 1.4,\n boxShadow: \"0 6px 18px rgba(0,0,0,0.35)\",\n pointerEvents: \"none\",\n zIndex: 9999,\n whiteSpace: \"nowrap\",\n }}\n >\n <div style={{ fontWeight: 650, color: \"var(--dsw-alias-label-primary, #ffffff)\", marginBottom: 4 }}>\n {new Date(hoveredDay.date + \"T00:00:00\").toLocaleDateString(undefined, {\n weekday: \"short\",\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })}\n </div>\n {hoveredDay.stats.totalTokens === 0 ? (\n <div style={{ color: \"var(--dsw-alias-label-tertiary)\" }}>No activity recorded</div>\n ) : (\n <div>\n <div style={{ color: \"#4f85ff\", fontWeight: 600 }}>\n {formatExact(hoveredDay.stats.totalTokens)} tokens\n </div>\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-secondary)\", marginTop: 2 }}>\n {hoveredDay.stats.turns} requests / steps\n </div>\n <div style={{ fontSize: 10, color: \"var(--dsw-alias-label-tertiary)\", marginTop: 4 }}>\n Click to inspect sessions on this day\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Floating Hover Tooltip for Chart Bar */}\n {hoveredBar && tooltipPos && (\n <div\n style={{\n position: \"fixed\",\n left: tooltipPos.x,\n top: tooltipPos.y,\n transform: \"translate(-50%, -100%)\",\n background: \"var(--dsw-alias-bg-layer-1, #1e1e1e)\",\n border: \"1px solid var(--dsw-alias-border-l3, #555555)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n fontSize: 12,\n lineHeight: 1.4,\n boxShadow: \"0 6px 18px rgba(0,0,0,0.35)\",\n pointerEvents: \"none\",\n zIndex: 9999,\n whiteSpace: \"nowrap\",\n }}\n >\n <div style={{ fontWeight: 650, color: \"var(--dsw-alias-label-primary, #ffffff)\", marginBottom: 4 }}>\n {new Date(hoveredBar.date + \"T00:00:00\").toLocaleDateString(undefined, {\n weekday: \"short\",\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n })}\n </div>\n {hoveredBar.totalTokens === 0 ? (\n <div style={{ color: \"var(--dsw-alias-label-tertiary)\" }}>No activity recorded</div>\n ) : (\n <div>\n <div style={{ color: \"#4f85ff\", fontWeight: 600 }}>\n {formatExact(hoveredBar.totalTokens)} total tokens\n </div>\n <div style={{ fontSize: 11, color: \"var(--dsw-alias-label-secondary)\", marginTop: 2 }}>\n Billed: {formatNumber(hoveredBar.billedTokens)} \u00B7 Cached: {formatNumber(hoveredBar.cachedTokens)}\n </div>\n <div style={{ fontSize: 10, color: \"var(--dsw-alias-label-tertiary)\", marginTop: 4 }}>\n {hoveredBar.turns} turns \u00B7 Click to inspect day\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nclass HeatmapErrorBoundary extends React.Component<\n { children: React.ReactNode },\n { hasError: boolean; error: any }\n> {\n constructor(props: any) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n static getDerivedStateFromError(error: any) {\n return { hasError: true, error };\n }\n componentDidCatch(error: any, info: any) {\n console.error(\"Heatmap rendering error:\", error, info);\n }\n render() {\n if (this.state.hasError) {\n return (\n <div style={{ padding: \"30px 20px\", color: \"var(--dsw-alias-state-error-primary, #ef4444)\" }}>\n <h3 style={{ margin: \"0 0 10px 0\" }}>Token Heatmap Encountered an Error</h3>\n <pre\n style={{\n fontSize: 12,\n background: \"rgba(0,0,0,0.3)\",\n padding: 12,\n borderRadius: 8,\n overflowX: \"auto\",\n }}\n >\n {String(this.state.error?.message || this.state.error)}\n </pre>\n <button\n onClick={() => this.setState({ hasError: false, error: null })}\n style={{\n marginTop: 12,\n padding: \"6px 14px\",\n background: \"var(--dsw-alias-brand-primary, #3964fe)\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: 6,\n cursor: \"pointer\",\n }}\n >\n Retry\n </button>\n </div>\n );\n }\n return this.props.children;\n }\n}\n\nexport function HeatmapView() {\n return (\n <HeatmapErrorBoundary>\n <HeatmapInnerView />\n </HeatmapErrorBoundary>\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 <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Token Usage Heatmap\"\n onClick={onClose}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 10000,\n backgroundColor: \"rgba(0, 0, 0, 0.65)\",\n backdropFilter: \"blur(4px)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"20px\",\n overflowY: \"auto\",\n }}\n >\n <div\n onClick={(e) => e.stopPropagation()}\n style={{\n position: \"relative\",\n width: \"100%\",\n maxWidth: \"1040px\",\n maxHeight: \"92vh\",\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 <button\n onClick={onClose}\n aria-label=\"Close dialog\"\n style={{\n position: \"absolute\",\n top: \"16px\",\n right: \"18px\",\n background: \"transparent\",\n border: \"none\",\n color: \"var(--dsw-alias-label-tertiary, #a0a0a0)\",\n fontSize: \"20px\",\n cursor: \"pointer\",\n width: \"32px\",\n height: \"32px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: \"6px\",\n }}\n >\n \u2715\n </button>\n\n <HeatmapView />\n </div>\n </div>\n );\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_react", "React", "import_react", "React", "React"]
7
+ }
package/lib/index.js ADDED
@@ -0,0 +1,45 @@
1
+ const name = "token-contribution";
2
+ const inject = ["webServer"];
3
+ function apply(ctx) {
4
+ ctx.effect(
5
+ () => ctx.webServer.register({
6
+ kind: "prefix",
7
+ path: "/api/token-contribution",
8
+ handler: async (req, res) => {
9
+ const url = new URL(req.url, "http://localhost");
10
+ const pathname = url.pathname.replace(/\/+$/, "");
11
+ res.setHeader("Access-Control-Allow-Origin", "*");
12
+ res.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS");
13
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type");
14
+ if (req.method === "OPTIONS") {
15
+ res.writeHead(204);
16
+ res.end();
17
+ return;
18
+ }
19
+ if (req.method === "GET" && (pathname === "/api/token-contribution" || pathname === "/api/token-contribution/stats" || pathname === "/api/dsh-token-heatmap/stats")) {
20
+ try {
21
+ const { aggregateTokens } = await import(`./aggregator.js?t=${Date.now()}`);
22
+ const data = await aggregateTokens();
23
+ res.writeHead(200, {
24
+ "Content-Type": "application/json; charset=utf-8",
25
+ "Cache-Control": "no-cache"
26
+ });
27
+ res.end(JSON.stringify(data));
28
+ } catch (err) {
29
+ res.writeHead(500, { "Content-Type": "application/json" });
30
+ res.end(JSON.stringify({ error: err?.message || "Failed to aggregate token stats" }));
31
+ }
32
+ return;
33
+ }
34
+ res.writeHead(404, { "Content-Type": "application/json" });
35
+ res.end(JSON.stringify({ error: "Not found" }));
36
+ }
37
+ })
38
+ );
39
+ }
40
+ export {
41
+ apply,
42
+ inject,
43
+ name
44
+ };
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/server/index.ts"],
4
+ "sourcesContent": ["export const name = \"token-contribution\";\nexport const inject = [\"webServer\"];\n\nexport function apply(ctx: any) {\n ctx.effect(() =>\n ctx.webServer.register({\n kind: \"prefix\",\n path: \"/api/token-contribution\",\n handler: async (req: any, res: any) => {\n const url = new URL(req.url, \"http://localhost\");\n const pathname = url.pathname.replace(/\\/+$/, \"\");\n\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (req.method === \"GET\" && (pathname === \"/api/token-contribution\" || pathname === \"/api/token-contribution/stats\" || pathname === \"/api/dsh-token-heatmap/stats\")) {\n try {\n const { aggregateTokens } = await import(`./aggregator.js?t=${Date.now()}`);\n const data = await aggregateTokens();\n res.writeHead(200, {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n });\n res.end(JSON.stringify(data));\n } catch (err: any) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: err?.message || \"Failed to aggregate token stats\" }));\n }\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found\" }));\n },\n })\n );\n}\n"],
5
+ "mappings": "AAAO,MAAM,OAAO;AACb,MAAM,SAAS,CAAC,WAAW;AAE3B,SAAS,MAAM,KAAU;AAC9B,MAAI;AAAA,IAAO,MACT,IAAI,UAAU,SAAS;AAAA,MACrB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,OAAO,KAAU,QAAa;AACrC,cAAM,MAAM,IAAI,IAAI,IAAI,KAAK,kBAAkB;AAC/C,cAAM,WAAW,IAAI,SAAS,QAAQ,QAAQ,EAAE;AAEhD,YAAI,UAAU,+BAA+B,GAAG;AAChD,YAAI,UAAU,gCAAgC,cAAc;AAC5D,YAAI,UAAU,gCAAgC,cAAc;AAE5D,YAAI,IAAI,WAAW,WAAW;AAC5B,cAAI,UAAU,GAAG;AACjB,cAAI,IAAI;AACR;AAAA,QACF;AAEA,YAAI,IAAI,WAAW,UAAU,aAAa,6BAA6B,aAAa,mCAAmC,aAAa,iCAAiC;AACnK,cAAI;AACF,kBAAM,EAAE,gBAAgB,IAAI,MAAM,OAAO,qBAAqB,KAAK,IAAI,CAAC;AACxE,kBAAM,OAAO,MAAM,gBAAgB;AACnC,gBAAI,UAAU,KAAK;AAAA,cACjB,gBAAgB;AAAA,cAChB,iBAAiB;AAAA,YACnB,CAAC;AACD,gBAAI,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA,UAC9B,SAAS,KAAU;AACjB,gBAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,gBAAI,IAAI,KAAK,UAAU,EAAE,OAAO,KAAK,WAAW,kCAAkC,CAAC,CAAC;AAAA,UACtF;AACA;AAAA,QACF;AAEA,YAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,YAAI,IAAI,KAAK,UAAU,EAAE,OAAO,YAAY,CAAC,CAAC;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACH;AACF;",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,56 @@
1
1
  {
2
2
  "name": "token-contribution",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "GitHub-style token usage contribution calendar and analytics for DeepSeek Harness",
5
+ "type": "module",
6
+ "main": "./lib/index.js",
7
+ "exports": {
8
+ ".": "./lib/index.js",
9
+ "./client": "./lib/client.js",
10
+ "./package.json": "./package.json"
11
+ },
12
+ "files": [
13
+ "lib",
14
+ "cordis.patch.yml",
15
+ "README.md",
16
+ "LICENSE",
17
+ "assets"
18
+ ],
19
+ "keywords": [
20
+ "deepseek-harness",
21
+ "dsh",
22
+ "dsh-plugin",
23
+ "cordis",
24
+ "heatmap",
25
+ "token-usage",
26
+ "analytics"
27
+ ],
28
+ "dsh": {
29
+ "bundle": {
30
+ "patch": "./cordis.patch.yml"
31
+ },
32
+ "client": {
33
+ "inject": [
34
+ "@deepseek-ai/dsh-client-ui-slots"
35
+ ],
36
+ "platform": "web"
37
+ }
38
+ },
39
+ "scripts": {
40
+ "build": "node scripts/build.mjs"
41
+ },
42
+ "peerDependencies": {
43
+ "@deepseek-ai/cordis": ">=4.0.0",
44
+ "react": "^18.2.0",
45
+ "react-dom": "^18.2.0"
46
+ },
47
+ "license": "MIT",
48
+ "repository": {
49
+ "type": "git",
50
+ "url": "https://git.oiupoyt.space/oiupoyt/token-contribution.git"
51
+ },
52
+ "bugs": {
53
+ "url": "https://git.oiupoyt.space/oiupoyt/token-contribution/issues"
54
+ },
55
+ "homepage": "https://git.oiupoyt.space/oiupoyt/token-contribution#readme"
56
+ }