@cryptiklemur/lattice 4.0.2 → 5.0.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.
- package/bin/lattice +1 -9
- package/dist/client/assets/{angular-html-N8PCEquT.js → angular-html-DKTL-XDO.js} +1 -1
- package/dist/client/assets/{angular-ts-CJ8RJIPD.js → angular-ts-tvBzOwQR.js} +1 -1
- package/dist/client/assets/{apl-BD6tCLWN.js → apl-CCzl5qFl.js} +1 -1
- package/dist/client/assets/{astro-CpIIfBs6.js → astro-DNQTpO2Y.js} +1 -1
- package/dist/client/assets/{blade-D3qgnjiV.js → blade-CyJoIMeJ.js} +1 -1
- package/dist/client/assets/{c-Dr6ADN_t.js → c-OEwk5KN8.js} +1 -1
- package/dist/client/assets/{cobol-BIfDE0Hr.js → cobol-DpHyJzz2.js} +1 -1
- package/dist/client/assets/{coffee-DHQ57vfY.js → coffee-BX5dbDzZ.js} +1 -1
- package/dist/client/assets/{cpp-CEBY6JOp.js → cpp-BTBjNg2U.js} +1 -1
- package/dist/client/assets/{crystal-D125CSmP.js → crystal-CNzZd6DW.js} +1 -1
- package/dist/client/assets/{css-CBmrkYSr.js → css-BuKsNmms.js} +1 -1
- package/dist/client/assets/{dist-A_mCRD1f.js → dist-CKpDHMy6.js} +2 -2
- package/dist/client/assets/{edge-Ccsz7cJW.js → edge-DzhnGgJE.js} +1 -1
- package/dist/client/assets/{elixir-Do6gk14X.js → elixir-Dqs0waqF.js} +1 -1
- package/dist/client/assets/{elm-Db22zT4C.js → elm-BtWwjxWn.js} +1 -1
- package/dist/client/assets/{erb-MXVqAAJD.js → erb-iPD89b4v.js} +1 -1
- package/dist/client/assets/{git-rebase-B-LLWBOA.js → git-rebase-BxVNXJL4.js} +1 -1
- package/dist/client/assets/{glimmer-js-eWszRU73.js → glimmer-js-BlyCupwF.js} +1 -1
- package/dist/client/assets/{glimmer-ts-VQmwGqUp.js → glimmer-ts-DjIxWOS9.js} +1 -1
- package/dist/client/assets/{glsl-B8ilOfAl.js → glsl-CGIL-65r.js} +1 -1
- package/dist/client/assets/{graphql-DnTqxeOc.js → graphql-DeOn6mNV.js} +1 -1
- package/dist/client/assets/{hack-XJsHYSQb.js → hack-DVppeCmS.js} +1 -1
- package/dist/client/assets/{haml-CQ7Vqzwp.js → haml-WDhua0Mp.js} +1 -1
- package/dist/client/assets/{handlebars-C4szooBf.js → handlebars-i2Fu_9HI.js} +1 -1
- package/dist/client/assets/{html-B6EgAiSd.js → html-B1e6oxzK.js} +1 -1
- package/dist/client/assets/{html-derivative-DdinogQX.js → html-derivative-MofKXIVd.js} +1 -1
- package/dist/client/assets/{http-BSLxCgRq.js → http-Dk6S5pRD.js} +1 -1
- package/dist/client/assets/{hurl-pOsTwNfp.js → hurl-CroFYYJG.js} +1 -1
- package/dist/client/assets/{index-BHQ_8mvl.js → index-CVu-S6Yk.js} +2 -2
- package/dist/client/assets/{java-DRQLiiST.js → java-B89FYjqS.js} +1 -1
- package/dist/client/assets/{javascript-DvEK2-47.js → javascript-m6CO1Uiy.js} +1 -1
- package/dist/client/assets/{jinja-D2NYJ25y.js → jinja-DC9Wi41X.js} +1 -1
- package/dist/client/assets/{jison-DDZaLNAp.js → jison-6xiegwDk.js} +1 -1
- package/dist/client/assets/{json-TGR0NIWd.js → json-HA-96-qr.js} +1 -1
- package/dist/client/assets/{jsx-BjUoPYga.js → jsx-Wt1a8i8U.js} +1 -1
- package/dist/client/assets/{julia-C4gjSpFu.js → julia-7M93VBON.js} +1 -1
- package/dist/client/assets/{just-H351x5u_.js → just-CjfDLYLv.js} +1 -1
- package/dist/client/assets/{latex-BiTmf6gf.js → latex-CitsJ46x.js} +1 -1
- package/dist/client/assets/{liquid-86ufjRy-.js → liquid-C8VIFin8.js} +1 -1
- package/dist/client/assets/{lua-BNxR0F_8.js → lua-Ba2N7esc.js} +1 -1
- package/dist/client/assets/{marko-CvRxpRjM.js → marko-lTLvb2wu.js} +1 -1
- package/dist/client/assets/{mdc-CYbAIy2C.js → mdc-D6IV-8FD.js} +1 -1
- package/dist/client/assets/{nginx-egdgMq-F.js → nginx-Ch5AjE6S.js} +1 -1
- package/dist/client/assets/{nim-CXBJVz_w.js → nim-WmDDC6LW.js} +1 -1
- package/dist/client/assets/{perl-XRfMobzg.js → perl-CQv0gYuq.js} +1 -1
- package/dist/client/assets/{php-Br7a8uil.js → php-BJmH0qOB.js} +1 -1
- package/dist/client/assets/{pug-BVbbUVvy.js → pug-CsHPkzc9.js} +1 -1
- package/dist/client/assets/{qml-ByKvrL1j.js → qml-B36ecArG.js} +1 -1
- package/dist/client/assets/{r-mVoV0Ni6.js → r-D5Yi5Z4y.js} +1 -1
- package/dist/client/assets/{razor-T5O-9UJL.js → razor-CHAxVq4R.js} +1 -1
- package/dist/client/assets/{regexp-CioRuhuN.js → regexp-gfs--3M7.js} +1 -1
- package/dist/client/assets/{rst-V__uTudD.js → rst-ugdlp-hl.js} +1 -1
- package/dist/client/assets/{ruby-C_PuKPTI.js → ruby-CDRRW37j.js} +1 -1
- package/dist/client/assets/{sas-D_DqqQH4.js → sas-DZaNQaIP.js} +1 -1
- package/dist/client/assets/{scss-D-TjzZ4c.js → scss-CzWQEplj.js} +1 -1
- package/dist/client/assets/{shellscript-E5759VHu.js → shellscript-fgYvpu9N.js} +1 -1
- package/dist/client/assets/{shellsession-AESTM-Pv.js → shellsession-BoAohHh7.js} +1 -1
- package/dist/client/assets/{soy-QrbrrcDv.js → soy-DBzVgv9x.js} +1 -1
- package/dist/client/assets/{sql-0M8VcDHD.js → sql-BYXpAYTs.js} +1 -1
- package/dist/client/assets/{stata-CgeIpGtc.js → stata-I71MMY3p.js} +1 -1
- package/dist/client/assets/{surrealql-DBGwnZbw.js → surrealql-C9U8_1VO.js} +1 -1
- package/dist/client/assets/{svelte-Cv0PvUc_.js → svelte-VOFrPnWT.js} +1 -1
- package/dist/client/assets/{templ-B9t7xRE4.js → templ-BIaxAEtC.js} +1 -1
- package/dist/client/assets/{tex-DhZZ8dr2.js → tex-D1dwnBE5.js} +1 -1
- package/dist/client/assets/{ts-tags-BFv8sbnd.js → ts-tags-C0L2Q0r5.js} +1 -1
- package/dist/client/assets/{tsx-CXC9KSbY.js → tsx-BqcycEv1.js} +1 -1
- package/dist/client/assets/{twig-CM_OO66r.js → twig-vyWqOhpM.js} +1 -1
- package/dist/client/assets/{typescript-BdgOTaoD.js → typescript-B2YbovqG.js} +1 -1
- package/dist/client/assets/{vue-BnQhjnCm.js → vue-CbXxGdjo.js} +1 -1
- package/dist/client/assets/{vue-html-CNnGecRI.js → vue-html-DDX4KXW7.js} +1 -1
- package/dist/client/assets/{vue-vine-DCuMkRhK.js → vue-vine-DsyY1LR5.js} +1 -1
- package/dist/client/assets/{xml-CbTD7cB8.js → xml-Ddi0-r0D.js} +1 -1
- package/dist/client/assets/{xsl-uOqqo7cf.js → xsl-CsFcZHFS.js} +1 -1
- package/dist/client/assets/{yaml-BNrLoH59.js → yaml-tGJWoH6Y.js} +1 -1
- package/dist/client/index.html +1 -1
- package/dist/client/sw.js +1 -1
- package/dist/server/analytics/engine.js +832 -0
- package/dist/server/assets.js +39 -0
- package/dist/server/auth/passphrase.js +70 -0
- package/dist/server/config.js +47 -0
- package/dist/server/daemon.js +535 -0
- package/dist/server/features/ralph-loop.js +138 -0
- package/dist/server/features/scheduler.js +260 -0
- package/dist/server/features/sticky-notes.js +99 -0
- package/dist/server/handlers/analytics.js +28 -0
- package/dist/server/handlers/attachment.js +158 -0
- package/dist/server/handlers/bookmarks.js +41 -0
- package/dist/server/handlers/chat.js +350 -0
- package/dist/server/handlers/editor.js +72 -0
- package/dist/server/handlers/fs.js +234 -0
- package/dist/server/handlers/loop.js +33 -0
- package/dist/server/handlers/memory.js +181 -0
- package/dist/server/handlers/mesh.js +322 -0
- package/dist/server/handlers/notes.js +36 -0
- package/dist/server/handlers/plugins.js +593 -0
- package/dist/server/handlers/project-settings.js +166 -0
- package/dist/server/handlers/scheduler.js +52 -0
- package/dist/server/handlers/session.js +194 -0
- package/dist/server/handlers/settings.js +148 -0
- package/dist/server/handlers/skills.js +360 -0
- package/dist/server/handlers/terminal.js +75 -0
- package/dist/server/handlers/themes.js +102 -0
- package/dist/server/handlers/update.js +124 -0
- package/dist/server/identity.js +45 -0
- package/dist/server/index.js +435 -0
- package/dist/server/logger.js +20 -0
- package/dist/server/mesh/connector.js +355 -0
- package/dist/server/mesh/crypto.js +88 -0
- package/dist/server/mesh/discovery.js +95 -0
- package/dist/server/mesh/pairing.js +104 -0
- package/dist/server/mesh/peers.js +54 -0
- package/dist/server/mesh/proxy.js +86 -0
- package/dist/server/mesh/session-sync.js +85 -0
- package/dist/server/project/bookmarks.js +77 -0
- package/dist/server/project/context-breakdown.js +279 -0
- package/dist/server/project/file-browser.js +97 -0
- package/dist/server/project/project-files.js +274 -0
- package/dist/server/project/registry.js +51 -0
- package/dist/server/project/sdk-bridge.js +960 -0
- package/dist/server/project/session.js +696 -0
- package/dist/server/project/terminal.js +87 -0
- package/dist/server/project/warmup.js +242 -0
- package/dist/server/push.js +87 -0
- package/dist/server/tls.js +50 -0
- package/dist/server/tui.js +83 -0
- package/dist/server/update-checker.js +119 -0
- package/dist/server/ws/broadcast.js +50 -0
- package/dist/server/ws/router.js +105 -0
- package/dist/server/ws/server.js +2 -0
- package/dist/shared/analytics.js +1 -0
- package/dist/shared/messages.js +1 -0
- package/dist/shared/models.js +1 -0
- package/dist/shared/project-settings.js +1 -0
- package/package.json +5 -8
- package/themes/alabaster.json +9 -0
- package/themes/amoled.json +20 -0
- package/themes/ayu-light.json +9 -0
- package/themes/catppuccin-latte.json +9 -0
- package/themes/catppuccin-mocha.json +9 -0
- package/themes/clay-light.json +10 -0
- package/themes/clay.json +10 -0
- package/themes/dracula.json +9 -0
- package/themes/everforest-light.json +9 -0
- package/themes/everforest.json +9 -0
- package/themes/github-light.json +9 -0
- package/themes/gruvbox-dark.json +9 -0
- package/themes/gruvbox-light.json +9 -0
- package/themes/horizon-light.json +9 -0
- package/themes/kanagawa-lotus.json +9 -0
- package/themes/kanagawa.json +9 -0
- package/themes/modus-operandi.json +9 -0
- package/themes/monokai.json +9 -0
- package/themes/nightfox.json +9 -0
- package/themes/nord-light.json +9 -0
- package/themes/nord.json +9 -0
- package/themes/one-dark.json +9 -0
- package/themes/one-light.json +9 -0
- package/themes/palenight.json +9 -0
- package/themes/paper.json +9 -0
- package/themes/penumbra-light.json +9 -0
- package/themes/poimandres.json +9 -0
- package/themes/quiet-light.json +9 -0
- package/themes/rose-pine-dawn.json +9 -0
- package/themes/rose-pine.json +9 -0
- package/themes/solarized-dark.json +9 -0
- package/themes/solarized-light.json +9 -0
- package/themes/synthwave84.json +9 -0
- package/themes/tokyo-night-light.json +9 -0
- package/themes/tokyo-night.json +9 -0
- package/themes/vesper.json +9 -0
- package/index.html +0 -20
- package/public/icons/icon-192.svg +0 -11
- package/public/icons/icon-512.svg +0 -11
- package/public/sw-push.js +0 -53
- package/src/client/App.tsx +0 -42
- package/src/client/commands.ts +0 -36
- package/src/client/components/analytics/AnalyticsView.tsx +0 -244
- package/src/client/components/analytics/ChartCard.tsx +0 -194
- package/src/client/components/analytics/PeriodSelector.tsx +0 -42
- package/src/client/components/analytics/QuickStats.tsx +0 -122
- package/src/client/components/analytics/chartTokens.ts +0 -188
- package/src/client/components/analytics/charts/ActivityCalendar.tsx +0 -204
- package/src/client/components/analytics/charts/CacheEfficiencyChart.tsx +0 -56
- package/src/client/components/analytics/charts/ContextUtilizationChart.tsx +0 -106
- package/src/client/components/analytics/charts/CostAreaChart.tsx +0 -79
- package/src/client/components/analytics/charts/CostDistributionChart.tsx +0 -59
- package/src/client/components/analytics/charts/CostDonutChart.tsx +0 -84
- package/src/client/components/analytics/charts/CumulativeCostChart.tsx +0 -59
- package/src/client/components/analytics/charts/DailySummaryCards.tsx +0 -86
- package/src/client/components/analytics/charts/HourlyHeatmap.tsx +0 -133
- package/src/client/components/analytics/charts/NodeFleetOverview.tsx +0 -89
- package/src/client/components/analytics/charts/PermissionBreakdown.tsx +0 -98
- package/src/client/components/analytics/charts/ProjectRadar.tsx +0 -126
- package/src/client/components/analytics/charts/ResponseTimeScatter.tsx +0 -96
- package/src/client/components/analytics/charts/SessionBubbleChart.tsx +0 -114
- package/src/client/components/analytics/charts/SessionComplexityList.tsx +0 -65
- package/src/client/components/analytics/charts/SessionTimeline.tsx +0 -107
- package/src/client/components/analytics/charts/TokenFlowChart.tsx +0 -78
- package/src/client/components/analytics/charts/TokenSankeyChart.tsx +0 -93
- package/src/client/components/analytics/charts/ToolSunburst.tsx +0 -123
- package/src/client/components/analytics/charts/ToolTreemap.tsx +0 -110
- package/src/client/components/auth/PassphrasePrompt.tsx +0 -70
- package/src/client/components/chat/AttachmentChips.tsx +0 -116
- package/src/client/components/chat/ChatInput.tsx +0 -533
- package/src/client/components/chat/ChatView.tsx +0 -1076
- package/src/client/components/chat/CommandPalette.tsx +0 -162
- package/src/client/components/chat/ElicitationCard.tsx +0 -238
- package/src/client/components/chat/Message.tsx +0 -825
- package/src/client/components/chat/ModelSelector.tsx +0 -108
- package/src/client/components/chat/PermissionModeSelector.tsx +0 -41
- package/src/client/components/chat/PromptQuestion.tsx +0 -271
- package/src/client/components/chat/StatusBar.tsx +0 -50
- package/src/client/components/chat/TodoCard.tsx +0 -57
- package/src/client/components/chat/ToolGroup.tsx +0 -129
- package/src/client/components/chat/ToolResultRenderer.tsx +0 -348
- package/src/client/components/chat/VoiceRecorder.tsx +0 -85
- package/src/client/components/chat/toolSummary.ts +0 -41
- package/src/client/components/dashboard/DashboardView.tsx +0 -200
- package/src/client/components/dashboard/ProjectDashboardView.tsx +0 -179
- package/src/client/components/mesh/NodeBadge.tsx +0 -24
- package/src/client/components/mesh/PairingDialog.tsx +0 -340
- package/src/client/components/project-settings/ProjectClaude.tsx +0 -318
- package/src/client/components/project-settings/ProjectEnvironment.tsx +0 -235
- package/src/client/components/project-settings/ProjectGeneral.tsx +0 -76
- package/src/client/components/project-settings/ProjectMcp.tsx +0 -232
- package/src/client/components/project-settings/ProjectMemory.tsx +0 -488
- package/src/client/components/project-settings/ProjectNotifications.tsx +0 -48
- package/src/client/components/project-settings/ProjectPermissions.tsx +0 -209
- package/src/client/components/project-settings/ProjectPlugins.tsx +0 -117
- package/src/client/components/project-settings/ProjectRules.tsx +0 -286
- package/src/client/components/project-settings/ProjectSettingsView.tsx +0 -117
- package/src/client/components/project-settings/ProjectSkills.tsx +0 -91
- package/src/client/components/settings/Appearance.tsx +0 -275
- package/src/client/components/settings/BudgetSettings.tsx +0 -165
- package/src/client/components/settings/ClaudeSettings.tsx +0 -175
- package/src/client/components/settings/Editor.tsx +0 -123
- package/src/client/components/settings/Environment.tsx +0 -185
- package/src/client/components/settings/GlobalMcp.tsx +0 -216
- package/src/client/components/settings/GlobalMemory.tsx +0 -19
- package/src/client/components/settings/GlobalPlugins.tsx +0 -806
- package/src/client/components/settings/GlobalRules.tsx +0 -149
- package/src/client/components/settings/GlobalSkills.tsx +0 -140
- package/src/client/components/settings/MeshStatus.tsx +0 -183
- package/src/client/components/settings/Notifications.tsx +0 -123
- package/src/client/components/settings/SettingsView.tsx +0 -75
- package/src/client/components/settings/SkillMarketplace.tsx +0 -175
- package/src/client/components/settings/ThemePreview.tsx +0 -140
- package/src/client/components/settings/ThemeWizard.tsx +0 -405
- package/src/client/components/settings/mcp-shared.tsx +0 -194
- package/src/client/components/settings/skill-shared.tsx +0 -186
- package/src/client/components/setup/SetupWizard.tsx +0 -755
- package/src/client/components/sidebar/AddProjectModal.tsx +0 -438
- package/src/client/components/sidebar/NodeSettingsModal.tsx +0 -206
- package/src/client/components/sidebar/ProjectDropdown.tsx +0 -211
- package/src/client/components/sidebar/ProjectRail.tsx +0 -353
- package/src/client/components/sidebar/SearchFilter.tsx +0 -52
- package/src/client/components/sidebar/SessionList.tsx +0 -599
- package/src/client/components/sidebar/SettingsSidebar.tsx +0 -139
- package/src/client/components/sidebar/Sidebar.tsx +0 -469
- package/src/client/components/sidebar/UserIsland.tsx +0 -282
- package/src/client/components/sidebar/UserMenu.tsx +0 -107
- package/src/client/components/ui/CommandPalette.tsx +0 -321
- package/src/client/components/ui/ContextMenu.tsx +0 -153
- package/src/client/components/ui/ErrorBoundary.tsx +0 -56
- package/src/client/components/ui/IconPicker.tsx +0 -184
- package/src/client/components/ui/KeyboardShortcuts.tsx +0 -129
- package/src/client/components/ui/LatticeLogomark.tsx +0 -19
- package/src/client/components/ui/NodeDisconnectedOverlay.tsx +0 -35
- package/src/client/components/ui/PopupMenu.tsx +0 -120
- package/src/client/components/ui/SaveFooter.tsx +0 -63
- package/src/client/components/ui/Toast.tsx +0 -132
- package/src/client/components/ui/UpdateBanner.tsx +0 -110
- package/src/client/components/ui/UpdatePrompt.tsx +0 -47
- package/src/client/components/workspace/BookmarksView.tsx +0 -156
- package/src/client/components/workspace/FileBrowser.tsx +0 -174
- package/src/client/components/workspace/FileTree.tsx +0 -129
- package/src/client/components/workspace/FileViewer.tsx +0 -211
- package/src/client/components/workspace/NoteCard.tsx +0 -120
- package/src/client/components/workspace/NotesView.tsx +0 -102
- package/src/client/components/workspace/ScheduledTasksView.tsx +0 -117
- package/src/client/components/workspace/SplitPane.tsx +0 -81
- package/src/client/components/workspace/TabBar.tsx +0 -170
- package/src/client/components/workspace/TaskCard.tsx +0 -159
- package/src/client/components/workspace/TaskEditModal.tsx +0 -129
- package/src/client/components/workspace/TerminalInstance.tsx +0 -171
- package/src/client/components/workspace/TerminalView.tsx +0 -110
- package/src/client/components/workspace/WorkspaceView.tsx +0 -141
- package/src/client/hooks/useAnalytics.ts +0 -84
- package/src/client/hooks/useAttachments.ts +0 -313
- package/src/client/hooks/useBookmarks.ts +0 -57
- package/src/client/hooks/useEditorConfig.ts +0 -28
- package/src/client/hooks/useFocusTrap.ts +0 -74
- package/src/client/hooks/useIdleDetection.ts +0 -50
- package/src/client/hooks/useInstallPrompt.ts +0 -53
- package/src/client/hooks/useMesh.ts +0 -89
- package/src/client/hooks/useNotifications.ts +0 -54
- package/src/client/hooks/useOnline.ts +0 -6
- package/src/client/hooks/useProjectSettings.ts +0 -56
- package/src/client/hooks/useProjects.ts +0 -98
- package/src/client/hooks/usePushNotifications.ts +0 -92
- package/src/client/hooks/useSaveState.ts +0 -65
- package/src/client/hooks/useSession.ts +0 -580
- package/src/client/hooks/useSidebar.ts +0 -90
- package/src/client/hooks/useSkills.ts +0 -30
- package/src/client/hooks/useSpinnerVerb.ts +0 -36
- package/src/client/hooks/useSwipeDrawer.ts +0 -299
- package/src/client/hooks/useTheme.ts +0 -114
- package/src/client/hooks/useTimeTick.ts +0 -35
- package/src/client/hooks/useVoiceRecorder.ts +0 -169
- package/src/client/hooks/useWebSocket.ts +0 -27
- package/src/client/hooks/useWorkspace.ts +0 -57
- package/src/client/lib/theme-derive.ts +0 -196
- package/src/client/lib/workspace-url.ts +0 -219
- package/src/client/main.tsx +0 -10
- package/src/client/providers/WebSocketProvider.tsx +0 -186
- package/src/client/router.tsx +0 -578
- package/src/client/stores/analytics.ts +0 -68
- package/src/client/stores/bookmarks.ts +0 -45
- package/src/client/stores/mesh.ts +0 -78
- package/src/client/stores/session.ts +0 -569
- package/src/client/stores/sidebar.ts +0 -530
- package/src/client/stores/theme.ts +0 -44
- package/src/client/stores/workspace.ts +0 -518
- package/src/client/styles/global.css +0 -391
- package/src/client/styles/theme-vars.css +0 -18
- package/src/client/themes/index.ts +0 -105
- package/src/client/utils/editorUrl.ts +0 -55
- package/src/client/utils/findDuplicateKeys.ts +0 -12
- package/src/client/utils/formatSessionTitle.ts +0 -17
- package/src/client/vite-env.d.ts +0 -6
- package/src/server/analytics/engine.ts +0 -920
- package/src/server/assets.ts +0 -45
- package/src/server/auth/passphrase.ts +0 -78
- package/src/server/config.ts +0 -55
- package/src/server/daemon.ts +0 -567
- package/src/server/features/ralph-loop.ts +0 -173
- package/src/server/features/scheduler.ts +0 -304
- package/src/server/features/sticky-notes.ts +0 -104
- package/src/server/handlers/analytics.ts +0 -39
- package/src/server/handlers/attachment.ts +0 -189
- package/src/server/handlers/bookmarks.ts +0 -50
- package/src/server/handlers/chat.ts +0 -381
- package/src/server/handlers/editor.ts +0 -76
- package/src/server/handlers/fs.ts +0 -251
- package/src/server/handlers/loop.ts +0 -37
- package/src/server/handlers/memory.ts +0 -182
- package/src/server/handlers/mesh.ts +0 -362
- package/src/server/handlers/notes.ts +0 -47
- package/src/server/handlers/plugins.ts +0 -655
- package/src/server/handlers/project-settings.ts +0 -180
- package/src/server/handlers/scheduler.ts +0 -64
- package/src/server/handlers/session.ts +0 -226
- package/src/server/handlers/settings.ts +0 -157
- package/src/server/handlers/skills.ts +0 -378
- package/src/server/handlers/terminal.ts +0 -88
- package/src/server/handlers/themes.ts +0 -121
- package/src/server/handlers/update.ts +0 -133
- package/src/server/identity.ts +0 -56
- package/src/server/index.ts +0 -457
- package/src/server/logger.ts +0 -21
- package/src/server/mesh/connector.ts +0 -419
- package/src/server/mesh/crypto.ts +0 -106
- package/src/server/mesh/discovery.ts +0 -126
- package/src/server/mesh/pairing.ts +0 -123
- package/src/server/mesh/peers.ts +0 -60
- package/src/server/mesh/proxy.ts +0 -106
- package/src/server/mesh/session-sync.ts +0 -107
- package/src/server/project/bookmarks.ts +0 -83
- package/src/server/project/context-breakdown.ts +0 -307
- package/src/server/project/file-browser.ts +0 -106
- package/src/server/project/project-files.ts +0 -267
- package/src/server/project/pty-worker.cjs +0 -83
- package/src/server/project/registry.ts +0 -57
- package/src/server/project/sdk-bridge.ts +0 -1100
- package/src/server/project/session.ts +0 -723
- package/src/server/project/terminal.ts +0 -111
- package/src/server/project/warmup.ts +0 -285
- package/src/server/push.ts +0 -121
- package/src/server/tls.ts +0 -65
- package/src/server/tui.ts +0 -103
- package/src/server/update-checker.ts +0 -147
- package/src/server/ws/broadcast.ts +0 -61
- package/src/server/ws/router.ts +0 -123
- package/src/server/ws/server.ts +0 -2
- package/src/shared/analytics.ts +0 -40
- package/src/shared/messages.ts +0 -1302
- package/src/shared/models.ts +0 -255
- package/src/shared/project-settings.ts +0 -45
- package/tsconfig.json +0 -25
- package/vite.config.ts +0 -71
- /package/{src/server/runtime.ts → dist/server/runtime.js} +0 -0
- /package/{src/shared/constants.ts → dist/shared/constants.js} +0 -0
- /package/{src/shared/index.ts → dist/shared/index.js} +0 -0
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
type Period = "24h" | "7d" | "30d" | "90d" | "all";
|
|
2
|
-
|
|
3
|
-
const PERIODS: Array<{ value: Period; label: string }> = [
|
|
4
|
-
{ value: "24h", label: "24h" },
|
|
5
|
-
{ value: "7d", label: "7d" },
|
|
6
|
-
{ value: "30d", label: "30d" },
|
|
7
|
-
{ value: "90d", label: "90d" },
|
|
8
|
-
{ value: "all", label: "All" },
|
|
9
|
-
];
|
|
10
|
-
|
|
11
|
-
interface PeriodSelectorProps {
|
|
12
|
-
value: Period;
|
|
13
|
-
onChange: (period: Period) => void;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function PeriodSelector({ value, onChange }: PeriodSelectorProps) {
|
|
17
|
-
return (
|
|
18
|
-
<div role="radiogroup" aria-label="Time period" className="flex items-center gap-1">
|
|
19
|
-
{PERIODS.map(function (period) {
|
|
20
|
-
const isActive = period.value === value;
|
|
21
|
-
return (
|
|
22
|
-
<button
|
|
23
|
-
key={period.value}
|
|
24
|
-
role="radio"
|
|
25
|
-
aria-checked={isActive}
|
|
26
|
-
onClick={function () { onChange(period.value); }}
|
|
27
|
-
className={[
|
|
28
|
-
"px-2 py-0.5 rounded border text-[10px] font-mono font-bold uppercase tracking-widest transition-colors cursor-pointer",
|
|
29
|
-
isActive
|
|
30
|
-
? "bg-primary/15 text-primary border-primary/30"
|
|
31
|
-
: "text-base-content/35 border-base-content/8 hover:text-base-content/60 hover:border-base-content/20",
|
|
32
|
-
].join(" ")}
|
|
33
|
-
>
|
|
34
|
-
{period.label}
|
|
35
|
-
</button>
|
|
36
|
-
);
|
|
37
|
-
})}
|
|
38
|
-
</div>
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export type { Period };
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { LineChart, Line, ResponsiveContainer } from "recharts";
|
|
2
|
-
import { useStore } from "@tanstack/react-store";
|
|
3
|
-
import { getAnalyticsStore } from "../../stores/analytics";
|
|
4
|
-
import { getChartColors } from "./chartTokens";
|
|
5
|
-
|
|
6
|
-
function formatTokens(n: number): string {
|
|
7
|
-
if (n >= 1_000_000) return (n / 1_000_000).toFixed(1) + "M";
|
|
8
|
-
if (n >= 1_000) return Math.round(n / 1_000) + "k";
|
|
9
|
-
return String(n);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
interface SparklineProps {
|
|
13
|
-
data: Array<{ v: number }>;
|
|
14
|
-
stroke: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function Sparkline({ data, stroke }: SparklineProps) {
|
|
18
|
-
return (
|
|
19
|
-
<ResponsiveContainer width={60} height={20}>
|
|
20
|
-
<LineChart data={data} margin={{ top: 2, right: 2, left: 2, bottom: 2 }}>
|
|
21
|
-
<Line
|
|
22
|
-
type="monotone"
|
|
23
|
-
dataKey="v"
|
|
24
|
-
stroke={stroke}
|
|
25
|
-
strokeWidth={1.5}
|
|
26
|
-
dot={false}
|
|
27
|
-
isAnimationActive={false}
|
|
28
|
-
/>
|
|
29
|
-
</LineChart>
|
|
30
|
-
</ResponsiveContainer>
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function QuickStats() {
|
|
35
|
-
const analytics = useStore(getAnalyticsStore(), function (s) { return s; });
|
|
36
|
-
const summaryLoaded = analytics.loadedSections.includes("summary");
|
|
37
|
-
|
|
38
|
-
if (!summaryLoaded) {
|
|
39
|
-
return (
|
|
40
|
-
<div className="grid grid-cols-2 sm:grid-cols-4 gap-3">
|
|
41
|
-
{[0, 1, 2, 3].map(function (i) {
|
|
42
|
-
return (
|
|
43
|
-
<div key={i} className="bg-base-content/[0.03] rounded-xl p-3.5 animate-pulse">
|
|
44
|
-
<div className="h-2.5 w-16 bg-base-content/10 rounded mb-3" />
|
|
45
|
-
<div className="h-6 w-12 bg-base-content/10 rounded" />
|
|
46
|
-
</div>
|
|
47
|
-
);
|
|
48
|
-
})}
|
|
49
|
-
</div>
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const d = analytics.data;
|
|
54
|
-
const colors = getChartColors();
|
|
55
|
-
|
|
56
|
-
const costSparkData = (d.costOverTime ?? []).slice(-7).map(function (e) { return { v: e.total }; });
|
|
57
|
-
const sessionsSparkData = (d.sessionsOverTime ?? []).slice(-7).map(function (e) { return { v: e.count }; });
|
|
58
|
-
const tokensSparkData = (d.tokensOverTime ?? []).slice(-7).map(function (e) { return { v: e.input + e.output }; });
|
|
59
|
-
|
|
60
|
-
const totalTokens = (d.totalTokens?.input ?? 0) + (d.totalTokens?.output ?? 0);
|
|
61
|
-
const cacheHitPct = Math.round((d.cacheHitRate ?? 0) * 100);
|
|
62
|
-
|
|
63
|
-
return (
|
|
64
|
-
<div className="grid grid-cols-2 sm:grid-cols-4 gap-3">
|
|
65
|
-
<div className="bg-base-content/[0.03] rounded-xl p-3.5">
|
|
66
|
-
<div className="flex items-center justify-between mb-1">
|
|
67
|
-
<span className="text-[10px] font-mono font-bold uppercase tracking-wider text-base-content/40">Total Spend</span>
|
|
68
|
-
{costSparkData.length > 1 && (
|
|
69
|
-
<div role="img" aria-label={"Cost trend: " + (costSparkData[costSparkData.length - 1].v > costSparkData[0].v ? "increasing" : costSparkData[costSparkData.length - 1].v < costSparkData[0].v ? "decreasing" : "stable")}>
|
|
70
|
-
<Sparkline data={costSparkData} stroke={colors.primary} />
|
|
71
|
-
</div>
|
|
72
|
-
)}
|
|
73
|
-
</div>
|
|
74
|
-
<div className="text-[20px] font-mono text-base-content">${(d.totalCost ?? 0).toFixed(2)}</div>
|
|
75
|
-
</div>
|
|
76
|
-
|
|
77
|
-
<div className="bg-base-content/[0.03] rounded-xl p-3.5">
|
|
78
|
-
<div className="flex items-center justify-between mb-1">
|
|
79
|
-
<span className="text-[10px] font-mono font-bold uppercase tracking-wider text-base-content/40">Sessions</span>
|
|
80
|
-
{sessionsSparkData.length > 1 && (
|
|
81
|
-
<div role="img" aria-label={"Sessions trend: " + (sessionsSparkData[sessionsSparkData.length - 1].v > sessionsSparkData[0].v ? "increasing" : sessionsSparkData[sessionsSparkData.length - 1].v < sessionsSparkData[0].v ? "decreasing" : "stable")}>
|
|
82
|
-
<Sparkline data={sessionsSparkData} stroke={colors.success} />
|
|
83
|
-
</div>
|
|
84
|
-
)}
|
|
85
|
-
</div>
|
|
86
|
-
<div className="text-[20px] font-mono text-base-content">{d.totalSessions ?? 0}</div>
|
|
87
|
-
</div>
|
|
88
|
-
|
|
89
|
-
<div className="bg-base-content/[0.03] rounded-xl p-3.5">
|
|
90
|
-
<div className="flex items-center justify-between mb-1">
|
|
91
|
-
<span className="text-[10px] font-mono font-bold uppercase tracking-wider text-base-content/40">Total Tokens</span>
|
|
92
|
-
{tokensSparkData.length > 1 && (
|
|
93
|
-
<div role="img" aria-label={"Tokens trend: " + (tokensSparkData[tokensSparkData.length - 1].v > tokensSparkData[0].v ? "increasing" : tokensSparkData[tokensSparkData.length - 1].v < tokensSparkData[0].v ? "decreasing" : "stable")}>
|
|
94
|
-
<Sparkline data={tokensSparkData} stroke={colors.warning} />
|
|
95
|
-
</div>
|
|
96
|
-
)}
|
|
97
|
-
</div>
|
|
98
|
-
<div className="text-[20px] font-mono text-base-content">{formatTokens(totalTokens)}</div>
|
|
99
|
-
</div>
|
|
100
|
-
|
|
101
|
-
<div className="bg-base-content/[0.03] rounded-xl p-3.5">
|
|
102
|
-
<div className="mb-1">
|
|
103
|
-
<span className="text-[10px] font-mono font-bold uppercase tracking-wider text-base-content/40">Cache Rate</span>
|
|
104
|
-
</div>
|
|
105
|
-
<div className="text-[20px] font-mono text-base-content mb-2">{cacheHitPct}%</div>
|
|
106
|
-
<div
|
|
107
|
-
className="w-full h-1 rounded-full bg-base-content/10 overflow-hidden"
|
|
108
|
-
role="progressbar"
|
|
109
|
-
aria-valuenow={cacheHitPct}
|
|
110
|
-
aria-valuemin={0}
|
|
111
|
-
aria-valuemax={100}
|
|
112
|
-
aria-label="Cache hit rate"
|
|
113
|
-
>
|
|
114
|
-
<div
|
|
115
|
-
className="h-full rounded-full bg-primary transition-all duration-300"
|
|
116
|
-
style={{ width: cacheHitPct + "%" }}
|
|
117
|
-
/>
|
|
118
|
-
</div>
|
|
119
|
-
</div>
|
|
120
|
-
</div>
|
|
121
|
-
);
|
|
122
|
-
}
|
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Theme-aware chart color tokens.
|
|
3
|
-
*
|
|
4
|
-
* Reads CSS custom properties set by useTheme so every chart
|
|
5
|
-
* automatically adapts when the user switches Base16 themes.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
* import { getChartColors } from "../chartTokens";
|
|
9
|
-
* // inside component render:
|
|
10
|
-
* var colors = getChartColors();
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
function css(prop: string): string {
|
|
14
|
-
return getComputedStyle(document.documentElement).getPropertyValue(prop).trim();
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function oklch(raw: string): string {
|
|
18
|
-
return raw ? "oklch(" + raw + ")" : "";
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface ChartColors {
|
|
22
|
-
/** Primary brand color (base0D — blue) */
|
|
23
|
-
primary: string;
|
|
24
|
-
/** Secondary color (base0E — purple) */
|
|
25
|
-
secondary: string;
|
|
26
|
-
/** Accent / info color (base0C — cyan) */
|
|
27
|
-
accent: string;
|
|
28
|
-
/** Success / green (base0B) */
|
|
29
|
-
success: string;
|
|
30
|
-
/** Warning / yellow (base0A) */
|
|
31
|
-
warning: string;
|
|
32
|
-
/** Error / red (base08) */
|
|
33
|
-
error: string;
|
|
34
|
-
/** Orange (base09) */
|
|
35
|
-
orange: string;
|
|
36
|
-
/** Magenta (base0F) */
|
|
37
|
-
magenta: string;
|
|
38
|
-
|
|
39
|
-
/** Tick label fill — content color at 30% opacity */
|
|
40
|
-
tickFill: string;
|
|
41
|
-
/** Grid stroke — content color at 6% opacity */
|
|
42
|
-
gridStroke: string;
|
|
43
|
-
|
|
44
|
-
/** Model palette keyed by model family */
|
|
45
|
-
model: {
|
|
46
|
-
opus: string;
|
|
47
|
-
sonnet: string;
|
|
48
|
-
haiku: string;
|
|
49
|
-
other: string;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
/** Ordered palette for multi-series charts (8 colors) */
|
|
53
|
-
palette: string[];
|
|
54
|
-
|
|
55
|
-
/** Category colors for tool classification */
|
|
56
|
-
category: Record<string, string>;
|
|
57
|
-
|
|
58
|
-
/** Permission colors */
|
|
59
|
-
permission: {
|
|
60
|
-
allowed: string;
|
|
61
|
-
denied: string;
|
|
62
|
-
alwaysAllowed: string;
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
var _cache: ChartColors | null = null;
|
|
67
|
-
var _cacheKey: string = "";
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Returns chart colors derived from the current CSS theme.
|
|
71
|
-
* Results are cached per theme so repeated calls within
|
|
72
|
-
* the same render cycle are cheap.
|
|
73
|
-
*/
|
|
74
|
-
export function getChartColors(): ChartColors {
|
|
75
|
-
var key = css("--color-primary") + css("--color-base-content") + css("--base0D");
|
|
76
|
-
if (_cache && _cacheKey === key) return _cache;
|
|
77
|
-
|
|
78
|
-
var b08 = css("--base08");
|
|
79
|
-
var b09 = css("--base09");
|
|
80
|
-
var b0A = css("--base0A");
|
|
81
|
-
var b0B = css("--base0B");
|
|
82
|
-
var b0C = css("--base0C");
|
|
83
|
-
var b0D = css("--base0D");
|
|
84
|
-
var b0E = css("--base0E");
|
|
85
|
-
var b0F = css("--base0F");
|
|
86
|
-
|
|
87
|
-
var primary = b0D || oklch(css("--color-primary"));
|
|
88
|
-
var secondary = b0E || oklch(css("--color-secondary"));
|
|
89
|
-
var accent = b0C || oklch(css("--color-accent"));
|
|
90
|
-
var success = b0B || oklch(css("--color-success"));
|
|
91
|
-
var warning = b0A || oklch(css("--color-warning"));
|
|
92
|
-
var error = b08 || oklch(css("--color-error"));
|
|
93
|
-
var orange = b09 || warning;
|
|
94
|
-
var magenta = b0F || secondary;
|
|
95
|
-
var b03 = css("--base03");
|
|
96
|
-
var b04 = css("--base04");
|
|
97
|
-
var b02 = css("--base02");
|
|
98
|
-
|
|
99
|
-
var tickFill = b04 || b03 || "#9ea8c7";
|
|
100
|
-
var gridStroke = b02 || "#44475a";
|
|
101
|
-
|
|
102
|
-
_cache = {
|
|
103
|
-
primary,
|
|
104
|
-
secondary,
|
|
105
|
-
accent,
|
|
106
|
-
success,
|
|
107
|
-
warning,
|
|
108
|
-
error,
|
|
109
|
-
orange,
|
|
110
|
-
magenta,
|
|
111
|
-
|
|
112
|
-
tickFill,
|
|
113
|
-
gridStroke,
|
|
114
|
-
|
|
115
|
-
model: {
|
|
116
|
-
opus: secondary,
|
|
117
|
-
sonnet: primary,
|
|
118
|
-
haiku: success,
|
|
119
|
-
other: warning,
|
|
120
|
-
},
|
|
121
|
-
|
|
122
|
-
palette: [primary, secondary, success, warning, accent, orange, error, magenta],
|
|
123
|
-
|
|
124
|
-
category: {
|
|
125
|
-
Read: success,
|
|
126
|
-
Write: warning,
|
|
127
|
-
Execute: error,
|
|
128
|
-
AI: secondary,
|
|
129
|
-
Other: primary,
|
|
130
|
-
},
|
|
131
|
-
|
|
132
|
-
permission: {
|
|
133
|
-
allowed: success,
|
|
134
|
-
denied: error,
|
|
135
|
-
alwaysAllowed: primary,
|
|
136
|
-
},
|
|
137
|
-
};
|
|
138
|
-
_cacheKey = key;
|
|
139
|
-
return _cache;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
/** Tick style object ready to spread onto Recharts axis components. */
|
|
143
|
-
export function getTickStyle() {
|
|
144
|
-
var c = getChartColors();
|
|
145
|
-
return {
|
|
146
|
-
fontSize: 10,
|
|
147
|
-
fontFamily: "var(--font-mono)",
|
|
148
|
-
fill: c.tickFill,
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Returns a color for a model name by matching against known families.
|
|
154
|
-
*/
|
|
155
|
-
export function getModelColor(model: string): string {
|
|
156
|
-
var c = getChartColors();
|
|
157
|
-
var key = model.toLowerCase();
|
|
158
|
-
if (key.includes("opus")) return c.model.opus;
|
|
159
|
-
if (key.includes("sonnet")) return c.model.sonnet;
|
|
160
|
-
if (key.includes("haiku")) return c.model.haiku;
|
|
161
|
-
return c.model.other;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Generate a dynamic OKLCH color based on the theme's primary hue.
|
|
166
|
-
* Useful for heatmaps and treemaps that derive intensity from data.
|
|
167
|
-
*/
|
|
168
|
-
export function getIntensityColor(intensity: number, hueOverride?: number): string {
|
|
169
|
-
var raw = getComputedStyle(document.documentElement).getPropertyValue("--color-primary").trim();
|
|
170
|
-
var hue = hueOverride ?? 280;
|
|
171
|
-
if (raw) {
|
|
172
|
-
var parts = raw.split(/\s+/);
|
|
173
|
-
if (parts.length >= 3) {
|
|
174
|
-
hue = parseFloat(parts[2]) || hue;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
var lightness = 0.45 - intensity * 0.15;
|
|
178
|
-
var chroma = 0.15 + intensity * 0.12;
|
|
179
|
-
return "oklch(" + lightness + " " + chroma + " " + hue + ")";
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Generate a score-based color using theme hue.
|
|
184
|
-
*/
|
|
185
|
-
export function getScoreColor(score: number, maxScore: number): string {
|
|
186
|
-
var intensity = maxScore > 0 ? Math.min(score / maxScore, 1) : 0;
|
|
187
|
-
return getIntensityColor(intensity);
|
|
188
|
-
}
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import { useState, useRef, useEffect } from "react";
|
|
2
|
-
import { createPortal } from "react-dom";
|
|
3
|
-
import { getChartColors } from "../chartTokens";
|
|
4
|
-
|
|
5
|
-
interface CalendarDatum {
|
|
6
|
-
date: string;
|
|
7
|
-
count: number;
|
|
8
|
-
tokens: number;
|
|
9
|
-
cost: number;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
interface ActivityCalendarProps {
|
|
13
|
-
data: CalendarDatum[];
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
var DAY_LABEL_WIDTH = 28;
|
|
17
|
-
var MONTH_LABEL_HEIGHT = 16;
|
|
18
|
-
|
|
19
|
-
var INTENSITY_OPACITIES = [0.05, 0.15, 0.3, 0.5, 0.8];
|
|
20
|
-
|
|
21
|
-
var MONTH_NAMES = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
|
|
22
|
-
var DAY_LABELS = [
|
|
23
|
-
{ index: 1, label: "Mon" },
|
|
24
|
-
{ index: 3, label: "Wed" },
|
|
25
|
-
{ index: 5, label: "Fri" },
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
function getIntensity(count: number, maxCount: number): number {
|
|
29
|
-
if (count === 0 || maxCount === 0) return -1;
|
|
30
|
-
var ratio = count / maxCount;
|
|
31
|
-
if (ratio <= 0.2) return 0;
|
|
32
|
-
if (ratio <= 0.4) return 1;
|
|
33
|
-
if (ratio <= 0.6) return 2;
|
|
34
|
-
if (ratio <= 0.8) return 3;
|
|
35
|
-
return 4;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function parseDateParts(dateStr: string): { year: number; month: number; day: number } {
|
|
39
|
-
var parts = dateStr.split("-");
|
|
40
|
-
return { year: parseInt(parts[0], 10), month: parseInt(parts[1], 10) - 1, day: parseInt(parts[2], 10) };
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function ActivityCalendar({ data }: ActivityCalendarProps) {
|
|
44
|
-
var colors = getChartColors();
|
|
45
|
-
var PRIMARY_COLOR = colors.primary;
|
|
46
|
-
var [hover, setHover] = useState<{ x: number; y: number; datum: CalendarDatum } | null>(null);
|
|
47
|
-
var containerRef = useRef<HTMLDivElement>(null);
|
|
48
|
-
var [containerWidth, setContainerWidth] = useState(0);
|
|
49
|
-
|
|
50
|
-
useEffect(function () {
|
|
51
|
-
if (!containerRef.current) return;
|
|
52
|
-
let ro = new ResizeObserver(function (entries) {
|
|
53
|
-
setContainerWidth(entries[0].contentRect.width);
|
|
54
|
-
});
|
|
55
|
-
ro.observe(containerRef.current);
|
|
56
|
-
setContainerWidth(containerRef.current.clientWidth);
|
|
57
|
-
return function () { ro.disconnect(); };
|
|
58
|
-
}, []);
|
|
59
|
-
|
|
60
|
-
if (!data || data.length === 0) {
|
|
61
|
-
return (
|
|
62
|
-
<div className="flex flex-col items-center justify-center h-[120px] gap-1">
|
|
63
|
-
<span className="text-base-content/25 font-mono text-[11px]">No activity recorded</span>
|
|
64
|
-
<span className="text-base-content/15 text-[10px]">Sessions will appear as colored cells by day</span>
|
|
65
|
-
</div>
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
var dataMap = new Map<string, CalendarDatum>();
|
|
70
|
-
var maxCount = 0;
|
|
71
|
-
for (var i = 0; i < data.length; i++) {
|
|
72
|
-
dataMap.set(data[i].date, data[i]);
|
|
73
|
-
if (data[i].count > maxCount) maxCount = data[i].count;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
var lastDate = new Date(data[data.length - 1].date + "T00:00:00");
|
|
77
|
-
var startDate = new Date(lastDate);
|
|
78
|
-
startDate.setDate(startDate.getDate() - 364);
|
|
79
|
-
var startDay = startDate.getDay();
|
|
80
|
-
if (startDay !== 0) {
|
|
81
|
-
startDate.setDate(startDate.getDate() - startDay);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
var weeks: Array<Array<{ date: string; datum: CalendarDatum | undefined } | null>> = [];
|
|
85
|
-
var cursor = new Date(startDate);
|
|
86
|
-
var currentWeek: Array<{ date: string; datum: CalendarDatum | undefined } | null> = [];
|
|
87
|
-
|
|
88
|
-
while (cursor <= lastDate) {
|
|
89
|
-
var dow = cursor.getDay();
|
|
90
|
-
if (dow === 0 && currentWeek.length > 0) {
|
|
91
|
-
weeks.push(currentWeek);
|
|
92
|
-
currentWeek = [];
|
|
93
|
-
}
|
|
94
|
-
var key = cursor.getFullYear() + "-" + String(cursor.getMonth() + 1).padStart(2, "0") + "-" + String(cursor.getDate()).padStart(2, "0");
|
|
95
|
-
currentWeek.push({ date: key, datum: dataMap.get(key) });
|
|
96
|
-
cursor.setDate(cursor.getDate() + 1);
|
|
97
|
-
}
|
|
98
|
-
if (currentWeek.length > 0) {
|
|
99
|
-
while (currentWeek.length < 7) currentWeek.push(null);
|
|
100
|
-
weeks.push(currentWeek);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
var monthLabels: Array<{ col: number; label: string }> = [];
|
|
104
|
-
var lastMonth = -1;
|
|
105
|
-
for (var wi = 0; wi < weeks.length; wi++) {
|
|
106
|
-
var firstCell = weeks[wi][0];
|
|
107
|
-
if (!firstCell) continue;
|
|
108
|
-
var parts = parseDateParts(firstCell.date);
|
|
109
|
-
if (parts.month !== lastMonth) {
|
|
110
|
-
monthLabels.push({ col: wi, label: MONTH_NAMES[parts.month] });
|
|
111
|
-
lastMonth = parts.month;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
var availableWidth = (containerWidth || 800) - DAY_LABEL_WIDTH;
|
|
116
|
-
var CELL_STEP = Math.max(3, Math.floor(availableWidth / weeks.length));
|
|
117
|
-
var CELL_GAP = Math.max(1, Math.round(CELL_STEP * 0.15));
|
|
118
|
-
var CELL_SIZE = CELL_STEP - CELL_GAP;
|
|
119
|
-
|
|
120
|
-
var svgWidth = DAY_LABEL_WIDTH + weeks.length * CELL_STEP;
|
|
121
|
-
var svgHeight = MONTH_LABEL_HEIGHT + 7 * CELL_STEP;
|
|
122
|
-
|
|
123
|
-
return (
|
|
124
|
-
<div ref={containerRef} className="relative w-full">
|
|
125
|
-
<svg width="100%" height={svgHeight} viewBox={"0 0 " + svgWidth + " " + svgHeight} className="block">
|
|
126
|
-
{monthLabels.map(function (ml, idx) {
|
|
127
|
-
return (
|
|
128
|
-
<text
|
|
129
|
-
key={idx}
|
|
130
|
-
x={DAY_LABEL_WIDTH + ml.col * CELL_STEP}
|
|
131
|
-
y={10}
|
|
132
|
-
className="fill-base-content/30"
|
|
133
|
-
style={{ fontSize: 10, fontFamily: "var(--font-mono)" }}
|
|
134
|
-
>
|
|
135
|
-
{ml.label}
|
|
136
|
-
</text>
|
|
137
|
-
);
|
|
138
|
-
})}
|
|
139
|
-
|
|
140
|
-
{DAY_LABELS.map(function (dl) {
|
|
141
|
-
return (
|
|
142
|
-
<text
|
|
143
|
-
key={dl.index}
|
|
144
|
-
x={0}
|
|
145
|
-
y={MONTH_LABEL_HEIGHT + dl.index * CELL_STEP + CELL_SIZE - 1}
|
|
146
|
-
className="fill-base-content/30"
|
|
147
|
-
style={{ fontSize: 10, fontFamily: "var(--font-mono)" }}
|
|
148
|
-
>
|
|
149
|
-
{dl.label}
|
|
150
|
-
</text>
|
|
151
|
-
);
|
|
152
|
-
})}
|
|
153
|
-
|
|
154
|
-
{weeks.map(function (week, col) {
|
|
155
|
-
return week.map(function (cell, row) {
|
|
156
|
-
if (!cell) return null;
|
|
157
|
-
var intensity = getIntensity(cell.datum?.count || 0, maxCount);
|
|
158
|
-
var x = DAY_LABEL_WIDTH + col * CELL_STEP;
|
|
159
|
-
var y = MONTH_LABEL_HEIGHT + row * CELL_STEP;
|
|
160
|
-
var opacity = intensity >= 0 ? INTENSITY_OPACITIES[intensity] : 0.05;
|
|
161
|
-
var fillColor = intensity >= 0 ? PRIMARY_COLOR : undefined;
|
|
162
|
-
|
|
163
|
-
return (
|
|
164
|
-
<rect
|
|
165
|
-
key={cell.date}
|
|
166
|
-
x={x}
|
|
167
|
-
y={y}
|
|
168
|
-
width={CELL_SIZE}
|
|
169
|
-
height={CELL_SIZE}
|
|
170
|
-
rx={2}
|
|
171
|
-
ry={2}
|
|
172
|
-
fill={fillColor || "currentColor"}
|
|
173
|
-
opacity={opacity}
|
|
174
|
-
className={fillColor ? "" : "text-base-content/5"}
|
|
175
|
-
onMouseEnter={function (e) {
|
|
176
|
-
setHover({
|
|
177
|
-
x: e.clientX,
|
|
178
|
-
y: e.clientY,
|
|
179
|
-
datum: cell!.datum || { date: cell!.date, count: 0, tokens: 0, cost: 0 },
|
|
180
|
-
});
|
|
181
|
-
}}
|
|
182
|
-
onMouseLeave={function () { setHover(null); }}
|
|
183
|
-
/>
|
|
184
|
-
);
|
|
185
|
-
});
|
|
186
|
-
})}
|
|
187
|
-
</svg>
|
|
188
|
-
|
|
189
|
-
{hover && createPortal(
|
|
190
|
-
<div
|
|
191
|
-
className="fixed z-[9999] rounded-lg border border-base-content/8 bg-base-200 px-3 py-2 shadow-lg pointer-events-none"
|
|
192
|
-
style={{ left: hover.x + 12, top: hover.y - 40 }}
|
|
193
|
-
>
|
|
194
|
-
<p className="text-[10px] font-mono text-base-content/50">{hover.datum.date}</p>
|
|
195
|
-
<div className="text-[11px] font-mono text-base-content/70 space-y-0.5">
|
|
196
|
-
<p><span className="text-base-content/40">sessions </span>{hover.datum.count}</p>
|
|
197
|
-
<p><span className="text-base-content/40">cost </span>${hover.datum.cost.toFixed(4)}</p>
|
|
198
|
-
</div>
|
|
199
|
-
</div>,
|
|
200
|
-
document.body
|
|
201
|
-
)}
|
|
202
|
-
</div>
|
|
203
|
-
);
|
|
204
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AreaChart,
|
|
3
|
-
Area,
|
|
4
|
-
XAxis,
|
|
5
|
-
YAxis,
|
|
6
|
-
CartesianGrid,
|
|
7
|
-
Tooltip,
|
|
8
|
-
ResponsiveContainer,
|
|
9
|
-
} from "recharts";
|
|
10
|
-
import { useChartFullscreen } from "../ChartCard";
|
|
11
|
-
import { getChartColors, getTickStyle } from "../chartTokens";
|
|
12
|
-
|
|
13
|
-
interface CacheEfficiencyDatum {
|
|
14
|
-
date: string;
|
|
15
|
-
rate: number;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
interface CacheEfficiencyChartProps {
|
|
19
|
-
data: CacheEfficiencyDatum[];
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function CustomTooltip({ active, payload, label }: { active?: boolean; payload?: Array<{ value: number }>; label?: string }) {
|
|
23
|
-
if (!active || !payload || payload.length === 0) return null;
|
|
24
|
-
return (
|
|
25
|
-
<div className="rounded-lg border border-base-content/8 bg-base-200 px-3 py-2 shadow-lg">
|
|
26
|
-
<p className="text-[10px] font-mono text-base-content/50 mb-1">{label}</p>
|
|
27
|
-
<p className="text-[11px] font-mono text-base-content">{(payload[0].value * 100).toFixed(1)}%</p>
|
|
28
|
-
</div>
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function CacheEfficiencyChart({ data }: CacheEfficiencyChartProps) {
|
|
33
|
-
const fullscreenHeight = useChartFullscreen();
|
|
34
|
-
const colors = getChartColors();
|
|
35
|
-
const displayData = data.map(function (d) {
|
|
36
|
-
return { date: d.date, rate: d.rate * 100 };
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
return (
|
|
40
|
-
<ResponsiveContainer width="100%" height={fullscreenHeight || 200}>
|
|
41
|
-
<AreaChart data={displayData} margin={{ top: 4, right: 4, left: -15, bottom: 0 }}>
|
|
42
|
-
<defs>
|
|
43
|
-
<linearGradient id="cacheEffGrad" x1="0" y1="0" x2="0" y2="1">
|
|
44
|
-
<stop offset="5%" stopColor={colors.success} stopOpacity={0.8} />
|
|
45
|
-
<stop offset="95%" stopColor={colors.success} stopOpacity={0.2} />
|
|
46
|
-
</linearGradient>
|
|
47
|
-
</defs>
|
|
48
|
-
<CartesianGrid strokeDasharray="3 3" stroke={colors.gridStroke} vertical={false} />
|
|
49
|
-
<XAxis dataKey="date" tick={getTickStyle()} axisLine={false} tickLine={false} />
|
|
50
|
-
<YAxis domain={[0, 100]} tick={getTickStyle()} axisLine={false} tickLine={false} tickFormatter={function (v) { return v + "%"; }} />
|
|
51
|
-
<Tooltip content={<CustomTooltip />} />
|
|
52
|
-
<Area type="monotone" dataKey="rate" stroke={colors.success} fill="url(#cacheEffGrad)" strokeWidth={2} isAnimationActive={false} />
|
|
53
|
-
</AreaChart>
|
|
54
|
-
</ResponsiveContainer>
|
|
55
|
-
);
|
|
56
|
-
}
|