@cryptiklemur/lattice 4.0.2 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +533 -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
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Vesper",
|
|
3
|
+
"author": "Rauno Freiberg",
|
|
4
|
+
"variant": "dark",
|
|
5
|
+
"base00": "101010", "base01": "1a1a1a", "base02": "232323", "base03": "505050",
|
|
6
|
+
"base04": "7a7a7a", "base05": "b0b0b0", "base06": "d1d1d1", "base07": "ffffff",
|
|
7
|
+
"base08": "f5a191", "base09": "ffc799", "base0A": "ffd6a0", "base0B": "99d1a4",
|
|
8
|
+
"base0C": "a3d2df", "base0D": "88c4e8", "base0E": "c9a0dc", "base0F": "f5a191"
|
|
9
|
+
}
|
package/index.html
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
|
|
6
|
-
<meta name="theme-color" content="#0d0d0d" />
|
|
7
|
-
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
8
|
-
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
|
9
|
-
<meta name="apple-mobile-web-app-title" content="Lattice" />
|
|
10
|
-
<link rel="apple-touch-icon" href="/icons/icon-192.svg" />
|
|
11
|
-
<title>Lattice</title>
|
|
12
|
-
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
|
13
|
-
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
14
|
-
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;0,700;1,400&family=IBM+Plex+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400&display=swap" rel="stylesheet" />
|
|
15
|
-
</head>
|
|
16
|
-
<body>
|
|
17
|
-
<div id="root"></div>
|
|
18
|
-
<script type="module" src="/src/client/main.tsx"></script>
|
|
19
|
-
</body>
|
|
20
|
-
</html>
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192" width="192" height="192">
|
|
2
|
-
<rect width="192" height="192" rx="24" fill="#0d0d0d"/>
|
|
3
|
-
<g fill="#e0e0e0">
|
|
4
|
-
<rect x="40" y="60" width="112" height="8" rx="4"/>
|
|
5
|
-
<rect x="40" y="92" width="80" height="8" rx="4"/>
|
|
6
|
-
<rect x="40" y="124" width="96" height="8" rx="4"/>
|
|
7
|
-
<circle cx="152" cy="148" r="20" fill="#4a9eff"/>
|
|
8
|
-
<rect x="148" y="136" width="8" height="12" rx="2" fill="#0d0d0d"/>
|
|
9
|
-
<rect x="144" y="148" width="16" height="8" rx="2" fill="#0d0d0d"/>
|
|
10
|
-
</g>
|
|
11
|
-
</svg>
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
|
|
2
|
-
<rect width="512" height="512" rx="64" fill="#0d0d0d"/>
|
|
3
|
-
<g fill="#e0e0e0">
|
|
4
|
-
<rect x="100" y="160" width="312" height="20" rx="10"/>
|
|
5
|
-
<rect x="100" y="246" width="220" height="20" rx="10"/>
|
|
6
|
-
<rect x="100" y="332" width="264" height="20" rx="10"/>
|
|
7
|
-
<circle cx="412" cy="392" r="56" fill="#4a9eff"/>
|
|
8
|
-
<rect x="400" y="360" width="24" height="32" rx="6" fill="#0d0d0d"/>
|
|
9
|
-
<rect x="388" y="392" width="48" height="24" rx="6" fill="#0d0d0d"/>
|
|
10
|
-
</g>
|
|
11
|
-
</svg>
|
package/public/sw-push.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
self.addEventListener("push", function (event) {
|
|
2
|
-
if (!event.data) return;
|
|
3
|
-
|
|
4
|
-
var data;
|
|
5
|
-
try {
|
|
6
|
-
data = event.data.json();
|
|
7
|
-
} catch (e) {
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
event.waitUntil(
|
|
12
|
-
self.clients.matchAll({ type: "window", includeUncontrolled: true }).then(function (clientList) {
|
|
13
|
-
if (data.type === "done") {
|
|
14
|
-
for (var i = 0; i < clientList.length; i++) {
|
|
15
|
-
if (clientList[i].focused || clientList[i].visibilityState === "visible") {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
var title = data.title || "Lattice";
|
|
22
|
-
var options = {
|
|
23
|
-
body: data.body || "",
|
|
24
|
-
icon: "/icons/icon-192.png",
|
|
25
|
-
badge: "/icons/icon-192.png",
|
|
26
|
-
tag: data.type + "-" + (data.sessionId || "general"),
|
|
27
|
-
data: {
|
|
28
|
-
type: data.type,
|
|
29
|
-
sessionId: data.sessionId,
|
|
30
|
-
projectSlug: data.projectSlug,
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
return self.registration.showNotification(title, options);
|
|
35
|
-
})
|
|
36
|
-
);
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
self.addEventListener("notificationclick", function (event) {
|
|
40
|
-
event.notification.close();
|
|
41
|
-
|
|
42
|
-
event.waitUntil(
|
|
43
|
-
self.clients.matchAll({ type: "window", includeUncontrolled: true }).then(function (clientList) {
|
|
44
|
-
for (var i = 0; i < clientList.length; i++) {
|
|
45
|
-
if (clientList[i].url.includes(self.location.origin)) {
|
|
46
|
-
clientList[i].focus();
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return self.clients.openWindow("/");
|
|
51
|
-
})
|
|
52
|
-
);
|
|
53
|
-
});
|
package/src/client/App.tsx
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { useEffect } from "react";
|
|
2
|
-
import { RouterProvider } from "@tanstack/react-router";
|
|
3
|
-
import { router } from "./router";
|
|
4
|
-
import { WebSocketProvider } from "./providers/WebSocketProvider";
|
|
5
|
-
import { ErrorBoundary } from "./components/ui/ErrorBoundary";
|
|
6
|
-
import { Toast, useToastState } from "./components/ui/Toast";
|
|
7
|
-
import { CommandPalette } from "./components/ui/CommandPalette";
|
|
8
|
-
import { KeyboardShortcuts } from "./components/ui/KeyboardShortcuts";
|
|
9
|
-
import { UpdatePrompt } from "./components/ui/UpdatePrompt";
|
|
10
|
-
|
|
11
|
-
function AppInner() {
|
|
12
|
-
var { items, dismiss } = useToastState();
|
|
13
|
-
|
|
14
|
-
useEffect(function () {
|
|
15
|
-
function blockContextMenu(e: MouseEvent) {
|
|
16
|
-
if ((e.target as HTMLElement).closest("[data-allow-context-menu]")) return;
|
|
17
|
-
e.preventDefault();
|
|
18
|
-
}
|
|
19
|
-
document.addEventListener("contextmenu", blockContextMenu);
|
|
20
|
-
return function () { document.removeEventListener("contextmenu", blockContextMenu); };
|
|
21
|
-
}, []);
|
|
22
|
-
|
|
23
|
-
return (
|
|
24
|
-
<>
|
|
25
|
-
<RouterProvider router={router} />
|
|
26
|
-
<CommandPalette />
|
|
27
|
-
<KeyboardShortcuts />
|
|
28
|
-
<Toast items={items} onDismiss={dismiss} />
|
|
29
|
-
<UpdatePrompt />
|
|
30
|
-
</>
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function App() {
|
|
35
|
-
return (
|
|
36
|
-
<ErrorBoundary>
|
|
37
|
-
<WebSocketProvider>
|
|
38
|
-
<AppInner />
|
|
39
|
-
</WebSocketProvider>
|
|
40
|
-
</ErrorBoundary>
|
|
41
|
-
);
|
|
42
|
-
}
|
package/src/client/commands.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
export type CommandHandler = "client" | "passthrough";
|
|
2
|
-
|
|
3
|
-
export interface SlashCommand {
|
|
4
|
-
name: string;
|
|
5
|
-
description: string;
|
|
6
|
-
aliases?: string[];
|
|
7
|
-
args?: string;
|
|
8
|
-
category: "command" | "skill";
|
|
9
|
-
handler: CommandHandler;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export var builtinCommands: SlashCommand[] = [
|
|
13
|
-
{ name: "clear", description: "Clear conversation, start new session", aliases: ["reset", "new"], category: "command", handler: "client" },
|
|
14
|
-
{ name: "compact", description: "Compact conversation context", args: "[instructions]", category: "command", handler: "passthrough" },
|
|
15
|
-
{ name: "cost", description: "Show token usage and estimated cost", category: "command", handler: "client" },
|
|
16
|
-
{ name: "model", description: "Switch Claude model", args: "[model]", category: "command", handler: "client" },
|
|
17
|
-
{ name: "effort", description: "Set effort level", args: "[low|medium|high|max]", category: "command", handler: "client" },
|
|
18
|
-
{ name: "help", description: "Show available commands", category: "command", handler: "client" },
|
|
19
|
-
{ name: "fast", description: "Toggle fast mode", args: "[on|off]", category: "command", handler: "client" },
|
|
20
|
-
{ name: "copy", description: "Copy last assistant response", category: "command", handler: "client" },
|
|
21
|
-
{ name: "export", description: "Export conversation as text file", category: "command", handler: "client" },
|
|
22
|
-
{ name: "rename", description: "Rename current session", args: "[name]", category: "command", handler: "client" },
|
|
23
|
-
{ name: "context", description: "Show context breakdown", category: "command", handler: "client" },
|
|
24
|
-
{ name: "theme", description: "Open appearance settings", category: "command", handler: "client" },
|
|
25
|
-
{ name: "config", description: "Open settings", aliases: ["settings"], category: "command", handler: "client" },
|
|
26
|
-
{ name: "permissions", description: "Open permissions settings", aliases: ["allowed-tools"], category: "command", handler: "client" },
|
|
27
|
-
{ name: "memory", description: "Open memory settings", category: "command", handler: "client" },
|
|
28
|
-
{ name: "skills", description: "Open skills settings", category: "command", handler: "client" },
|
|
29
|
-
{ name: "plan", description: "Enter plan mode", category: "command", handler: "client" },
|
|
30
|
-
{ name: "diff", description: "Show last git diff", category: "command", handler: "passthrough" },
|
|
31
|
-
{ name: "init", description: "Generate CLAUDE.md", category: "command", handler: "passthrough" },
|
|
32
|
-
{ name: "review", description: "Review code", category: "command", handler: "passthrough" },
|
|
33
|
-
{ name: "pr-comments", description: "Fetch PR comments", args: "[PR]", category: "command", handler: "passthrough" },
|
|
34
|
-
{ name: "security-review", description: "Security review of recent changes", category: "command", handler: "passthrough" },
|
|
35
|
-
{ name: "btw", description: "Ask a side question", args: "<question>", category: "command", handler: "passthrough" },
|
|
36
|
-
];
|
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
import { Component } from "react";
|
|
2
|
-
import { BarChart3 } from "lucide-react";
|
|
3
|
-
import { useAnalytics } from "../../hooks/useAnalytics";
|
|
4
|
-
import { useMesh } from "../../hooks/useMesh";
|
|
5
|
-
|
|
6
|
-
class ChartErrorBoundary extends Component<{ children: React.ReactNode; name: string }, { hasError: boolean }> {
|
|
7
|
-
constructor(props: { children: React.ReactNode; name: string }) {
|
|
8
|
-
super(props);
|
|
9
|
-
this.state = { hasError: false };
|
|
10
|
-
}
|
|
11
|
-
static getDerivedStateFromError() {
|
|
12
|
-
return { hasError: true };
|
|
13
|
-
}
|
|
14
|
-
render() {
|
|
15
|
-
if (this.state.hasError) {
|
|
16
|
-
return (
|
|
17
|
-
<div className="flex flex-col items-center justify-center h-[200px] gap-3">
|
|
18
|
-
<span className="text-base-content/30 font-mono text-[12px]">Unable to load chart</span>
|
|
19
|
-
<button
|
|
20
|
-
onClick={() => this.setState({ hasError: false })}
|
|
21
|
-
className="text-[11px] font-mono text-primary/60 hover:text-primary transition-colors cursor-pointer px-3 py-1 rounded-md border border-primary/20 hover:border-primary/40"
|
|
22
|
-
>
|
|
23
|
-
Retry
|
|
24
|
-
</button>
|
|
25
|
-
</div>
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
return this.props.children;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function SectionHeader(props: { label: string }) {
|
|
33
|
-
return (
|
|
34
|
-
<div className="flex items-center gap-3 mb-1">
|
|
35
|
-
<div className="h-px flex-1 bg-base-content/10" />
|
|
36
|
-
<span className="text-[10px] font-mono font-bold uppercase tracking-[0.15em] text-base-content/40">{props.label}</span>
|
|
37
|
-
<div className="h-px flex-1 bg-base-content/10" />
|
|
38
|
-
</div>
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
import { PeriodSelector } from "./PeriodSelector";
|
|
43
|
-
import { ChartCard } from "./ChartCard";
|
|
44
|
-
import { QuickStats } from "./QuickStats";
|
|
45
|
-
import { CostAreaChart } from "./charts/CostAreaChart";
|
|
46
|
-
import { CumulativeCostChart } from "./charts/CumulativeCostChart";
|
|
47
|
-
import { CostDonutChart } from "./charts/CostDonutChart";
|
|
48
|
-
import { CostDistributionChart } from "./charts/CostDistributionChart";
|
|
49
|
-
import { SessionBubbleChart } from "./charts/SessionBubbleChart";
|
|
50
|
-
import { TokenFlowChart } from "./charts/TokenFlowChart";
|
|
51
|
-
import { CacheEfficiencyChart } from "./charts/CacheEfficiencyChart";
|
|
52
|
-
import { ResponseTimeScatter } from "./charts/ResponseTimeScatter";
|
|
53
|
-
import { ContextUtilizationChart } from "./charts/ContextUtilizationChart";
|
|
54
|
-
import { TokenSankeyChart } from "./charts/TokenSankeyChart";
|
|
55
|
-
import { ActivityCalendar } from "./charts/ActivityCalendar";
|
|
56
|
-
import { HourlyHeatmap } from "./charts/HourlyHeatmap";
|
|
57
|
-
import { SessionTimeline } from "./charts/SessionTimeline";
|
|
58
|
-
import { DailySummaryCards } from "./charts/DailySummaryCards";
|
|
59
|
-
import { ProjectRadar } from "./charts/ProjectRadar";
|
|
60
|
-
import { SessionComplexityList } from "./charts/SessionComplexityList";
|
|
61
|
-
import { NodeFleetOverview } from "./charts/NodeFleetOverview";
|
|
62
|
-
import type { AnalyticsSectionName } from "#shared";
|
|
63
|
-
|
|
64
|
-
export function AnalyticsView() {
|
|
65
|
-
const analytics = useAnalytics();
|
|
66
|
-
const mesh = useMesh();
|
|
67
|
-
const nodes = mesh.nodes;
|
|
68
|
-
const hasAnyData = analytics.loadedSections.length > 0;
|
|
69
|
-
const isLoading = analytics.loading;
|
|
70
|
-
|
|
71
|
-
function sectionLoading(name: AnalyticsSectionName): boolean {
|
|
72
|
-
return isLoading && !analytics.loadedSections.includes(name);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return (
|
|
76
|
-
<div className="flex flex-col h-full overflow-hidden bg-base-100 bg-lattice-grid">
|
|
77
|
-
<div className="flex items-center justify-between px-4 h-11 border-b border-base-300 flex-shrink-0">
|
|
78
|
-
<div className="flex items-center gap-2.5">
|
|
79
|
-
<h1 className="text-[13px] font-mono font-bold text-base-content/90">Analytics</h1>
|
|
80
|
-
{isLoading && hasAnyData && (
|
|
81
|
-
<span className="w-3.5 h-3.5 border-2 border-base-content/15 border-t-primary/60 rounded-full animate-spin" />
|
|
82
|
-
)}
|
|
83
|
-
</div>
|
|
84
|
-
<PeriodSelector value={analytics.period} onChange={analytics.setPeriod} />
|
|
85
|
-
</div>
|
|
86
|
-
|
|
87
|
-
<div className="flex-1 overflow-y-auto px-3 py-3 sm:px-6 sm:py-4">
|
|
88
|
-
{analytics.error && (
|
|
89
|
-
<div className="text-center text-error/60 py-20 font-mono text-[13px]">{analytics.error}</div>
|
|
90
|
-
)}
|
|
91
|
-
|
|
92
|
-
{!analytics.error && !isLoading && !hasAnyData && (
|
|
93
|
-
<div className="flex flex-col items-center justify-center py-20 gap-6 max-w-[400px] mx-auto">
|
|
94
|
-
<div className="w-16 h-16 rounded-2xl bg-primary/8 flex items-center justify-center">
|
|
95
|
-
<BarChart3 size={28} className="text-primary/40" />
|
|
96
|
-
</div>
|
|
97
|
-
<div className="text-center">
|
|
98
|
-
<p className="text-[15px] font-mono font-semibold text-base-content/60 mb-2">No analytics data yet</p>
|
|
99
|
-
<p className="text-[13px] text-base-content/30 leading-relaxed">
|
|
100
|
-
Analytics tracks your spending, token usage, cache efficiency, and session patterns across all projects. Start a Claude session to see your first data here.
|
|
101
|
-
</p>
|
|
102
|
-
</div>
|
|
103
|
-
<div className="flex flex-col gap-2 text-[11px] text-base-content/25 font-mono">
|
|
104
|
-
<div className="flex items-center gap-2">
|
|
105
|
-
<div className="w-1 h-1 rounded-full bg-primary/40" />
|
|
106
|
-
<span>Spending trends and cost breakdowns</span>
|
|
107
|
-
</div>
|
|
108
|
-
<div className="flex items-center gap-2">
|
|
109
|
-
<div className="w-1 h-1 rounded-full bg-primary/40" />
|
|
110
|
-
<span>Cache hit rates and response speed</span>
|
|
111
|
-
</div>
|
|
112
|
-
<div className="flex items-center gap-2">
|
|
113
|
-
<div className="w-1 h-1 rounded-full bg-primary/40" />
|
|
114
|
-
<span>Activity patterns and session complexity</span>
|
|
115
|
-
</div>
|
|
116
|
-
</div>
|
|
117
|
-
</div>
|
|
118
|
-
)}
|
|
119
|
-
|
|
120
|
-
{(isLoading || hasAnyData) && (
|
|
121
|
-
<div className="flex flex-col max-w-[1200px] mx-auto pb-12">
|
|
122
|
-
<QuickStats />
|
|
123
|
-
|
|
124
|
-
<section className="flex flex-col gap-3 mt-8">
|
|
125
|
-
<SectionHeader label="Spending" />
|
|
126
|
-
<ChartCard title="Spending Over Time" loading={sectionLoading("summary")} skeletonHeight={240}>
|
|
127
|
-
<ChartErrorBoundary name="CostArea">
|
|
128
|
-
<CostAreaChart data={analytics.data?.costOverTime ?? []} />
|
|
129
|
-
</ChartErrorBoundary>
|
|
130
|
-
</ChartCard>
|
|
131
|
-
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
|
|
132
|
-
<ChartCard title="Spend by Model" loading={sectionLoading("spending")}>
|
|
133
|
-
<ChartErrorBoundary name="CostDonut">
|
|
134
|
-
<CostDonutChart modelUsage={analytics.data?.modelUsage ?? []} totalCost={analytics.data?.totalCost ?? 0} />
|
|
135
|
-
</ChartErrorBoundary>
|
|
136
|
-
</ChartCard>
|
|
137
|
-
<ChartCard title="Running Total" loading={sectionLoading("summary")}>
|
|
138
|
-
<ChartErrorBoundary name="CumulativeCost">
|
|
139
|
-
<CumulativeCostChart data={analytics.data?.cumulativeCost ?? []} />
|
|
140
|
-
</ChartErrorBoundary>
|
|
141
|
-
</ChartCard>
|
|
142
|
-
</div>
|
|
143
|
-
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
|
|
144
|
-
<ChartCard title="Session Cost Ranges" loading={sectionLoading("spending")}>
|
|
145
|
-
<ChartErrorBoundary name="CostDistribution">
|
|
146
|
-
<CostDistributionChart data={analytics.data?.costDistribution ?? []} />
|
|
147
|
-
</ChartErrorBoundary>
|
|
148
|
-
</ChartCard>
|
|
149
|
-
<ChartCard title="Cost per Session" loading={sectionLoading("spending")}>
|
|
150
|
-
<ChartErrorBoundary name="SessionBubble">
|
|
151
|
-
<SessionBubbleChart data={analytics.data?.sessionBubbles ?? []} />
|
|
152
|
-
</ChartErrorBoundary>
|
|
153
|
-
</ChartCard>
|
|
154
|
-
</div>
|
|
155
|
-
</section>
|
|
156
|
-
|
|
157
|
-
<section className="flex flex-col gap-3 mt-10">
|
|
158
|
-
<SectionHeader label="Usage & Speed" />
|
|
159
|
-
<ChartCard title="Token Usage Over Time" loading={sectionLoading("summary")} skeletonHeight={240}>
|
|
160
|
-
<ChartErrorBoundary name="TokenFlow">
|
|
161
|
-
<TokenFlowChart data={analytics.data?.tokensOverTime ?? []} />
|
|
162
|
-
</ChartErrorBoundary>
|
|
163
|
-
</ChartCard>
|
|
164
|
-
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
|
|
165
|
-
<ChartCard title="Cache Hit Rate" loading={sectionLoading("summary")}>
|
|
166
|
-
<ChartErrorBoundary name="CacheEfficiency">
|
|
167
|
-
<CacheEfficiencyChart data={analytics.data?.cacheHitRateOverTime ?? []} />
|
|
168
|
-
</ChartErrorBoundary>
|
|
169
|
-
</ChartCard>
|
|
170
|
-
<ChartCard title="Response Speed" loading={sectionLoading("usage")}>
|
|
171
|
-
<ChartErrorBoundary name="ResponseTime">
|
|
172
|
-
<ResponseTimeScatter data={analytics.data?.responseTimeData ?? []} />
|
|
173
|
-
</ChartErrorBoundary>
|
|
174
|
-
</ChartCard>
|
|
175
|
-
</div>
|
|
176
|
-
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
|
|
177
|
-
<ChartCard title="Context Utilization" loading={sectionLoading("usage")}>
|
|
178
|
-
<ChartErrorBoundary name="ContextUtilization">
|
|
179
|
-
<ContextUtilizationChart data={analytics.data?.contextUtilization ?? []} />
|
|
180
|
-
</ChartErrorBoundary>
|
|
181
|
-
</ChartCard>
|
|
182
|
-
<ChartCard title="Token Breakdown" loading={sectionLoading("usage")}>
|
|
183
|
-
<ChartErrorBoundary name="Sankey">
|
|
184
|
-
<TokenSankeyChart data={analytics.data?.tokenFlowSankey ?? { nodes: [], links: [] }} />
|
|
185
|
-
</ChartErrorBoundary>
|
|
186
|
-
</ChartCard>
|
|
187
|
-
</div>
|
|
188
|
-
</section>
|
|
189
|
-
|
|
190
|
-
<section className="flex flex-col gap-3 mt-10">
|
|
191
|
-
<SectionHeader label="Activity" />
|
|
192
|
-
<ChartCard title="Activity Calendar" loading={sectionLoading("activity")} skeletonHeight={160}>
|
|
193
|
-
<ChartErrorBoundary name="Calendar">
|
|
194
|
-
<ActivityCalendar data={analytics.data?.activityCalendar ?? []} />
|
|
195
|
-
</ChartErrorBoundary>
|
|
196
|
-
</ChartCard>
|
|
197
|
-
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
|
|
198
|
-
<ChartCard title="Peak Hours" loading={sectionLoading("activity")}>
|
|
199
|
-
<ChartErrorBoundary name="HourlyHeatmap">
|
|
200
|
-
<HourlyHeatmap data={analytics.data?.hourlyHeatmap ?? []} />
|
|
201
|
-
</ChartErrorBoundary>
|
|
202
|
-
</ChartCard>
|
|
203
|
-
<ChartCard title="Session Timeline" loading={sectionLoading("activity")}>
|
|
204
|
-
<ChartErrorBoundary name="Timeline">
|
|
205
|
-
<SessionTimeline data={analytics.data?.sessionTimeline ?? []} />
|
|
206
|
-
</ChartErrorBoundary>
|
|
207
|
-
</ChartCard>
|
|
208
|
-
</div>
|
|
209
|
-
<ChartCard title="Daily Summary" loading={sectionLoading("activity")} skeletonHeight={120}>
|
|
210
|
-
<ChartErrorBoundary name="DailySummary">
|
|
211
|
-
<DailySummaryCards data={analytics.data?.dailySummaries ?? []} />
|
|
212
|
-
</ChartErrorBoundary>
|
|
213
|
-
</ChartCard>
|
|
214
|
-
</section>
|
|
215
|
-
|
|
216
|
-
<section className="flex flex-col gap-3 mt-10">
|
|
217
|
-
<SectionHeader label="Projects" />
|
|
218
|
-
<div className="grid grid-cols-1 md:grid-cols-2 gap-3">
|
|
219
|
-
<ChartCard title="Project Comparison" loading={sectionLoading("projects")}>
|
|
220
|
-
<ChartErrorBoundary name="Radar">
|
|
221
|
-
<ProjectRadar data={analytics.data?.projectRadar ?? []} />
|
|
222
|
-
</ChartErrorBoundary>
|
|
223
|
-
</ChartCard>
|
|
224
|
-
<ChartCard title="Session Complexity" loading={sectionLoading("projects")}>
|
|
225
|
-
<ChartErrorBoundary name="Complexity">
|
|
226
|
-
<SessionComplexityList data={analytics.data?.sessionComplexity ?? []} />
|
|
227
|
-
</ChartErrorBoundary>
|
|
228
|
-
</ChartCard>
|
|
229
|
-
</div>
|
|
230
|
-
</section>
|
|
231
|
-
|
|
232
|
-
<SectionHeader label="Fleet" />
|
|
233
|
-
|
|
234
|
-
<ChartCard title="Node Fleet" loading={false} skeletonHeight={120}>
|
|
235
|
-
<ChartErrorBoundary name="Fleet">
|
|
236
|
-
<NodeFleetOverview nodes={nodes} />
|
|
237
|
-
</ChartErrorBoundary>
|
|
238
|
-
</ChartCard>
|
|
239
|
-
</div>
|
|
240
|
-
)}
|
|
241
|
-
</div>
|
|
242
|
-
</div>
|
|
243
|
-
);
|
|
244
|
-
}
|
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
import { useState, useEffect, useRef, createContext, useContext, useCallback } from "react";
|
|
2
|
-
import { useFocusTrap } from "../../hooks/useFocusTrap";
|
|
3
|
-
import { Maximize2, Minimize2 } from "lucide-react";
|
|
4
|
-
import type { ReactNode } from "react";
|
|
5
|
-
|
|
6
|
-
const ChartFullscreenContext = createContext<number | false>(false);
|
|
7
|
-
|
|
8
|
-
export function useChartFullscreen(): number | false {
|
|
9
|
-
return useContext(ChartFullscreenContext);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function useViewportChartHeight(): number {
|
|
13
|
-
const [h, setH] = useState(Math.round(window.innerHeight * 0.5));
|
|
14
|
-
useEffect(function () {
|
|
15
|
-
function onResize() { setH(Math.round(window.innerHeight * 0.5)); }
|
|
16
|
-
window.addEventListener("resize", onResize);
|
|
17
|
-
return function () { window.removeEventListener("resize", onResize); };
|
|
18
|
-
}, []);
|
|
19
|
-
return h;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
interface ChartCardProps {
|
|
23
|
-
title: string;
|
|
24
|
-
children: ReactNode;
|
|
25
|
-
className?: string;
|
|
26
|
-
action?: ReactNode;
|
|
27
|
-
loading?: boolean;
|
|
28
|
-
skeletonHeight?: number;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function ChartCard(props: ChartCardProps) {
|
|
32
|
-
const [isFullscreen, setIsFullscreen] = useState(false);
|
|
33
|
-
const chartHeight = useViewportChartHeight();
|
|
34
|
-
const cardRef = useRef<HTMLDivElement>(null);
|
|
35
|
-
const [originRect, setOriginRect] = useState<DOMRect | null>(null);
|
|
36
|
-
const [animating, setAnimating] = useState(false);
|
|
37
|
-
const fullscreenModalRef = useRef<HTMLDivElement>(null);
|
|
38
|
-
const closeFullscreenCb = useCallback(function () { closeFullscreen(); }, []);
|
|
39
|
-
useFocusTrap(fullscreenModalRef, closeFullscreenCb, isFullscreen);
|
|
40
|
-
|
|
41
|
-
function openFullscreen() {
|
|
42
|
-
if (cardRef.current) {
|
|
43
|
-
setOriginRect(cardRef.current.getBoundingClientRect());
|
|
44
|
-
}
|
|
45
|
-
setAnimating(true);
|
|
46
|
-
setIsFullscreen(true);
|
|
47
|
-
requestAnimationFrame(function () {
|
|
48
|
-
requestAnimationFrame(function () {
|
|
49
|
-
setAnimating(false);
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function closeFullscreen() {
|
|
55
|
-
setAnimating(true);
|
|
56
|
-
setTimeout(function () {
|
|
57
|
-
setIsFullscreen(false);
|
|
58
|
-
setAnimating(false);
|
|
59
|
-
setOriginRect(null);
|
|
60
|
-
}, 250);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
useEffect(function () {
|
|
64
|
-
if (isFullscreen) {
|
|
65
|
-
document.body.style.overflow = "hidden";
|
|
66
|
-
} else {
|
|
67
|
-
document.body.style.overflow = "";
|
|
68
|
-
}
|
|
69
|
-
return function () { document.body.style.overflow = ""; };
|
|
70
|
-
}, [isFullscreen]);
|
|
71
|
-
|
|
72
|
-
const cardContent = (
|
|
73
|
-
<>
|
|
74
|
-
<div className="flex items-center justify-between mb-3 sm:mb-4">
|
|
75
|
-
<span className="text-[11px] font-mono font-bold uppercase tracking-wider text-base-content/40">
|
|
76
|
-
{props.title}
|
|
77
|
-
</span>
|
|
78
|
-
<div className="flex items-center gap-2">
|
|
79
|
-
{props.action && <div>{props.action}</div>}
|
|
80
|
-
<button
|
|
81
|
-
onClick={function () {
|
|
82
|
-
if (isFullscreen) {
|
|
83
|
-
closeFullscreen();
|
|
84
|
-
} else {
|
|
85
|
-
openFullscreen();
|
|
86
|
-
}
|
|
87
|
-
}}
|
|
88
|
-
className="opacity-0 group-hover:opacity-100 text-base-content/20 hover:text-base-content/50 transition-all duration-200 cursor-pointer p-0.5 rounded hover:bg-base-content/5"
|
|
89
|
-
aria-label={isFullscreen ? "Exit fullscreen" : "Fullscreen"}
|
|
90
|
-
title={isFullscreen ? "Exit fullscreen (Esc)" : "Fullscreen"}
|
|
91
|
-
>
|
|
92
|
-
{isFullscreen ? <Minimize2 size={12} /> : <Maximize2 size={12} />}
|
|
93
|
-
</button>
|
|
94
|
-
</div>
|
|
95
|
-
</div>
|
|
96
|
-
<div role="img" aria-label={props.title}>
|
|
97
|
-
{props.loading
|
|
98
|
-
? <div className="rounded-lg bg-base-content/[0.04] animate-pulse" style={{ height: (props.skeletonHeight ?? 200) + "px" }} />
|
|
99
|
-
: props.children}
|
|
100
|
-
</div>
|
|
101
|
-
</>
|
|
102
|
-
);
|
|
103
|
-
|
|
104
|
-
if (isFullscreen) {
|
|
105
|
-
const overlayStyle: React.CSSProperties = {
|
|
106
|
-
transition: "opacity 250ms cubic-bezier(0.4, 0, 0.2, 1)",
|
|
107
|
-
opacity: animating ? 0 : 1,
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
const modalStyle: React.CSSProperties = {
|
|
111
|
-
transition: "all 250ms cubic-bezier(0.4, 0, 0.2, 1)",
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
if (animating && originRect) {
|
|
115
|
-
modalStyle.position = "fixed";
|
|
116
|
-
modalStyle.top = originRect.top + "px";
|
|
117
|
-
modalStyle.left = originRect.left + "px";
|
|
118
|
-
modalStyle.width = originRect.width + "px";
|
|
119
|
-
modalStyle.height = originRect.height + "px";
|
|
120
|
-
modalStyle.opacity = 0;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return (
|
|
124
|
-
<>
|
|
125
|
-
<div
|
|
126
|
-
ref={cardRef}
|
|
127
|
-
aria-label={props.title}
|
|
128
|
-
className={"rounded-xl border border-base-content/8 bg-base-300/50 p-3 sm:p-4 invisible " + (props.className || "")}
|
|
129
|
-
>
|
|
130
|
-
{cardContent}
|
|
131
|
-
</div>
|
|
132
|
-
|
|
133
|
-
<div
|
|
134
|
-
className="fixed inset-0 z-[9998] bg-base-content/60 backdrop-blur-sm"
|
|
135
|
-
style={overlayStyle}
|
|
136
|
-
onClick={closeFullscreen}
|
|
137
|
-
/>
|
|
138
|
-
<div
|
|
139
|
-
ref={fullscreenModalRef}
|
|
140
|
-
className="fixed inset-0 z-[9999] flex items-center justify-center p-8"
|
|
141
|
-
style={{ pointerEvents: "none" }}
|
|
142
|
-
role="dialog"
|
|
143
|
-
aria-modal="true"
|
|
144
|
-
aria-label={props.title + " (fullscreen)"}
|
|
145
|
-
>
|
|
146
|
-
<div
|
|
147
|
-
className="w-full max-w-[1100px] rounded-2xl border border-base-content/10 bg-base-200 shadow-2xl overflow-hidden flex flex-col"
|
|
148
|
-
style={Object.assign(
|
|
149
|
-
{ maxHeight: "65vh", pointerEvents: "auto" as const },
|
|
150
|
-
animating
|
|
151
|
-
? { opacity: 0, transform: "scale(0.95)", transition: "all 250ms cubic-bezier(0.4, 0, 0.2, 1)" }
|
|
152
|
-
: { opacity: 1, transform: "scale(1)", transition: "all 250ms cubic-bezier(0.4, 0, 0.2, 1)" }
|
|
153
|
-
)}
|
|
154
|
-
>
|
|
155
|
-
<div className="flex items-center justify-between px-6 py-3 border-b border-base-content/8 flex-shrink-0">
|
|
156
|
-
<span className="text-[12px] font-mono font-bold uppercase tracking-widest text-base-content/50">
|
|
157
|
-
{props.title}
|
|
158
|
-
</span>
|
|
159
|
-
<div className="flex items-center gap-3">
|
|
160
|
-
{props.action && <div>{props.action}</div>}
|
|
161
|
-
<button
|
|
162
|
-
onClick={closeFullscreen}
|
|
163
|
-
className="text-base-content/30 hover:text-base-content/60 transition-colors cursor-pointer p-1 rounded-lg hover:bg-base-content/5"
|
|
164
|
-
aria-label="Exit fullscreen"
|
|
165
|
-
>
|
|
166
|
-
<Minimize2 size={16} />
|
|
167
|
-
</button>
|
|
168
|
-
</div>
|
|
169
|
-
</div>
|
|
170
|
-
<div className="flex-1 p-6 overflow-auto min-h-0">
|
|
171
|
-
<ChartFullscreenContext.Provider value={chartHeight}>
|
|
172
|
-
<div style={{ height: chartHeight + "px" }}>
|
|
173
|
-
{props.loading
|
|
174
|
-
? <div className="rounded-lg bg-base-content/[0.04] animate-pulse h-full" />
|
|
175
|
-
: props.children}
|
|
176
|
-
</div>
|
|
177
|
-
</ChartFullscreenContext.Provider>
|
|
178
|
-
</div>
|
|
179
|
-
</div>
|
|
180
|
-
</div>
|
|
181
|
-
</>
|
|
182
|
-
);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
return (
|
|
186
|
-
<div
|
|
187
|
-
ref={cardRef}
|
|
188
|
-
aria-label={props.title}
|
|
189
|
-
className={"group rounded-xl border border-base-content/8 bg-base-300/50 p-3 sm:p-4 cursor-pointer hover:border-base-content/12 transition-all duration-200 " + (props.className || "")}
|
|
190
|
-
>
|
|
191
|
-
{cardContent}
|
|
192
|
-
</div>
|
|
193
|
-
);
|
|
194
|
-
}
|