@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.
Files changed (394) hide show
  1. package/bin/lattice +1 -9
  2. package/dist/client/assets/{angular-html-N8PCEquT.js → angular-html-DKTL-XDO.js} +1 -1
  3. package/dist/client/assets/{angular-ts-CJ8RJIPD.js → angular-ts-tvBzOwQR.js} +1 -1
  4. package/dist/client/assets/{apl-BD6tCLWN.js → apl-CCzl5qFl.js} +1 -1
  5. package/dist/client/assets/{astro-CpIIfBs6.js → astro-DNQTpO2Y.js} +1 -1
  6. package/dist/client/assets/{blade-D3qgnjiV.js → blade-CyJoIMeJ.js} +1 -1
  7. package/dist/client/assets/{c-Dr6ADN_t.js → c-OEwk5KN8.js} +1 -1
  8. package/dist/client/assets/{cobol-BIfDE0Hr.js → cobol-DpHyJzz2.js} +1 -1
  9. package/dist/client/assets/{coffee-DHQ57vfY.js → coffee-BX5dbDzZ.js} +1 -1
  10. package/dist/client/assets/{cpp-CEBY6JOp.js → cpp-BTBjNg2U.js} +1 -1
  11. package/dist/client/assets/{crystal-D125CSmP.js → crystal-CNzZd6DW.js} +1 -1
  12. package/dist/client/assets/{css-CBmrkYSr.js → css-BuKsNmms.js} +1 -1
  13. package/dist/client/assets/{dist-A_mCRD1f.js → dist-CKpDHMy6.js} +2 -2
  14. package/dist/client/assets/{edge-Ccsz7cJW.js → edge-DzhnGgJE.js} +1 -1
  15. package/dist/client/assets/{elixir-Do6gk14X.js → elixir-Dqs0waqF.js} +1 -1
  16. package/dist/client/assets/{elm-Db22zT4C.js → elm-BtWwjxWn.js} +1 -1
  17. package/dist/client/assets/{erb-MXVqAAJD.js → erb-iPD89b4v.js} +1 -1
  18. package/dist/client/assets/{git-rebase-B-LLWBOA.js → git-rebase-BxVNXJL4.js} +1 -1
  19. package/dist/client/assets/{glimmer-js-eWszRU73.js → glimmer-js-BlyCupwF.js} +1 -1
  20. package/dist/client/assets/{glimmer-ts-VQmwGqUp.js → glimmer-ts-DjIxWOS9.js} +1 -1
  21. package/dist/client/assets/{glsl-B8ilOfAl.js → glsl-CGIL-65r.js} +1 -1
  22. package/dist/client/assets/{graphql-DnTqxeOc.js → graphql-DeOn6mNV.js} +1 -1
  23. package/dist/client/assets/{hack-XJsHYSQb.js → hack-DVppeCmS.js} +1 -1
  24. package/dist/client/assets/{haml-CQ7Vqzwp.js → haml-WDhua0Mp.js} +1 -1
  25. package/dist/client/assets/{handlebars-C4szooBf.js → handlebars-i2Fu_9HI.js} +1 -1
  26. package/dist/client/assets/{html-B6EgAiSd.js → html-B1e6oxzK.js} +1 -1
  27. package/dist/client/assets/{html-derivative-DdinogQX.js → html-derivative-MofKXIVd.js} +1 -1
  28. package/dist/client/assets/{http-BSLxCgRq.js → http-Dk6S5pRD.js} +1 -1
  29. package/dist/client/assets/{hurl-pOsTwNfp.js → hurl-CroFYYJG.js} +1 -1
  30. package/dist/client/assets/{index-BHQ_8mvl.js → index-CVu-S6Yk.js} +2 -2
  31. package/dist/client/assets/{java-DRQLiiST.js → java-B89FYjqS.js} +1 -1
  32. package/dist/client/assets/{javascript-DvEK2-47.js → javascript-m6CO1Uiy.js} +1 -1
  33. package/dist/client/assets/{jinja-D2NYJ25y.js → jinja-DC9Wi41X.js} +1 -1
  34. package/dist/client/assets/{jison-DDZaLNAp.js → jison-6xiegwDk.js} +1 -1
  35. package/dist/client/assets/{json-TGR0NIWd.js → json-HA-96-qr.js} +1 -1
  36. package/dist/client/assets/{jsx-BjUoPYga.js → jsx-Wt1a8i8U.js} +1 -1
  37. package/dist/client/assets/{julia-C4gjSpFu.js → julia-7M93VBON.js} +1 -1
  38. package/dist/client/assets/{just-H351x5u_.js → just-CjfDLYLv.js} +1 -1
  39. package/dist/client/assets/{latex-BiTmf6gf.js → latex-CitsJ46x.js} +1 -1
  40. package/dist/client/assets/{liquid-86ufjRy-.js → liquid-C8VIFin8.js} +1 -1
  41. package/dist/client/assets/{lua-BNxR0F_8.js → lua-Ba2N7esc.js} +1 -1
  42. package/dist/client/assets/{marko-CvRxpRjM.js → marko-lTLvb2wu.js} +1 -1
  43. package/dist/client/assets/{mdc-CYbAIy2C.js → mdc-D6IV-8FD.js} +1 -1
  44. package/dist/client/assets/{nginx-egdgMq-F.js → nginx-Ch5AjE6S.js} +1 -1
  45. package/dist/client/assets/{nim-CXBJVz_w.js → nim-WmDDC6LW.js} +1 -1
  46. package/dist/client/assets/{perl-XRfMobzg.js → perl-CQv0gYuq.js} +1 -1
  47. package/dist/client/assets/{php-Br7a8uil.js → php-BJmH0qOB.js} +1 -1
  48. package/dist/client/assets/{pug-BVbbUVvy.js → pug-CsHPkzc9.js} +1 -1
  49. package/dist/client/assets/{qml-ByKvrL1j.js → qml-B36ecArG.js} +1 -1
  50. package/dist/client/assets/{r-mVoV0Ni6.js → r-D5Yi5Z4y.js} +1 -1
  51. package/dist/client/assets/{razor-T5O-9UJL.js → razor-CHAxVq4R.js} +1 -1
  52. package/dist/client/assets/{regexp-CioRuhuN.js → regexp-gfs--3M7.js} +1 -1
  53. package/dist/client/assets/{rst-V__uTudD.js → rst-ugdlp-hl.js} +1 -1
  54. package/dist/client/assets/{ruby-C_PuKPTI.js → ruby-CDRRW37j.js} +1 -1
  55. package/dist/client/assets/{sas-D_DqqQH4.js → sas-DZaNQaIP.js} +1 -1
  56. package/dist/client/assets/{scss-D-TjzZ4c.js → scss-CzWQEplj.js} +1 -1
  57. package/dist/client/assets/{shellscript-E5759VHu.js → shellscript-fgYvpu9N.js} +1 -1
  58. package/dist/client/assets/{shellsession-AESTM-Pv.js → shellsession-BoAohHh7.js} +1 -1
  59. package/dist/client/assets/{soy-QrbrrcDv.js → soy-DBzVgv9x.js} +1 -1
  60. package/dist/client/assets/{sql-0M8VcDHD.js → sql-BYXpAYTs.js} +1 -1
  61. package/dist/client/assets/{stata-CgeIpGtc.js → stata-I71MMY3p.js} +1 -1
  62. package/dist/client/assets/{surrealql-DBGwnZbw.js → surrealql-C9U8_1VO.js} +1 -1
  63. package/dist/client/assets/{svelte-Cv0PvUc_.js → svelte-VOFrPnWT.js} +1 -1
  64. package/dist/client/assets/{templ-B9t7xRE4.js → templ-BIaxAEtC.js} +1 -1
  65. package/dist/client/assets/{tex-DhZZ8dr2.js → tex-D1dwnBE5.js} +1 -1
  66. package/dist/client/assets/{ts-tags-BFv8sbnd.js → ts-tags-C0L2Q0r5.js} +1 -1
  67. package/dist/client/assets/{tsx-CXC9KSbY.js → tsx-BqcycEv1.js} +1 -1
  68. package/dist/client/assets/{twig-CM_OO66r.js → twig-vyWqOhpM.js} +1 -1
  69. package/dist/client/assets/{typescript-BdgOTaoD.js → typescript-B2YbovqG.js} +1 -1
  70. package/dist/client/assets/{vue-BnQhjnCm.js → vue-CbXxGdjo.js} +1 -1
  71. package/dist/client/assets/{vue-html-CNnGecRI.js → vue-html-DDX4KXW7.js} +1 -1
  72. package/dist/client/assets/{vue-vine-DCuMkRhK.js → vue-vine-DsyY1LR5.js} +1 -1
  73. package/dist/client/assets/{xml-CbTD7cB8.js → xml-Ddi0-r0D.js} +1 -1
  74. package/dist/client/assets/{xsl-uOqqo7cf.js → xsl-CsFcZHFS.js} +1 -1
  75. package/dist/client/assets/{yaml-BNrLoH59.js → yaml-tGJWoH6Y.js} +1 -1
  76. package/dist/client/index.html +1 -1
  77. package/dist/client/sw.js +1 -1
  78. package/dist/server/analytics/engine.js +832 -0
  79. package/dist/server/assets.js +39 -0
  80. package/dist/server/auth/passphrase.js +70 -0
  81. package/dist/server/config.js +47 -0
  82. package/dist/server/daemon.js +535 -0
  83. package/dist/server/features/ralph-loop.js +138 -0
  84. package/dist/server/features/scheduler.js +260 -0
  85. package/dist/server/features/sticky-notes.js +99 -0
  86. package/dist/server/handlers/analytics.js +28 -0
  87. package/dist/server/handlers/attachment.js +158 -0
  88. package/dist/server/handlers/bookmarks.js +41 -0
  89. package/dist/server/handlers/chat.js +350 -0
  90. package/dist/server/handlers/editor.js +72 -0
  91. package/dist/server/handlers/fs.js +234 -0
  92. package/dist/server/handlers/loop.js +33 -0
  93. package/dist/server/handlers/memory.js +181 -0
  94. package/dist/server/handlers/mesh.js +322 -0
  95. package/dist/server/handlers/notes.js +36 -0
  96. package/dist/server/handlers/plugins.js +593 -0
  97. package/dist/server/handlers/project-settings.js +166 -0
  98. package/dist/server/handlers/scheduler.js +52 -0
  99. package/dist/server/handlers/session.js +194 -0
  100. package/dist/server/handlers/settings.js +148 -0
  101. package/dist/server/handlers/skills.js +360 -0
  102. package/dist/server/handlers/terminal.js +75 -0
  103. package/dist/server/handlers/themes.js +102 -0
  104. package/dist/server/handlers/update.js +124 -0
  105. package/dist/server/identity.js +45 -0
  106. package/dist/server/index.js +435 -0
  107. package/dist/server/logger.js +20 -0
  108. package/dist/server/mesh/connector.js +355 -0
  109. package/dist/server/mesh/crypto.js +88 -0
  110. package/dist/server/mesh/discovery.js +95 -0
  111. package/dist/server/mesh/pairing.js +104 -0
  112. package/dist/server/mesh/peers.js +54 -0
  113. package/dist/server/mesh/proxy.js +86 -0
  114. package/dist/server/mesh/session-sync.js +85 -0
  115. package/dist/server/project/bookmarks.js +77 -0
  116. package/dist/server/project/context-breakdown.js +279 -0
  117. package/dist/server/project/file-browser.js +97 -0
  118. package/dist/server/project/project-files.js +274 -0
  119. package/dist/server/project/registry.js +51 -0
  120. package/dist/server/project/sdk-bridge.js +960 -0
  121. package/dist/server/project/session.js +696 -0
  122. package/dist/server/project/terminal.js +87 -0
  123. package/dist/server/project/warmup.js +242 -0
  124. package/dist/server/push.js +87 -0
  125. package/dist/server/tls.js +50 -0
  126. package/dist/server/tui.js +83 -0
  127. package/dist/server/update-checker.js +119 -0
  128. package/dist/server/ws/broadcast.js +50 -0
  129. package/dist/server/ws/router.js +105 -0
  130. package/dist/server/ws/server.js +2 -0
  131. package/dist/shared/analytics.js +1 -0
  132. package/dist/shared/messages.js +1 -0
  133. package/dist/shared/models.js +1 -0
  134. package/dist/shared/project-settings.js +1 -0
  135. package/package.json +5 -8
  136. package/themes/alabaster.json +9 -0
  137. package/themes/amoled.json +20 -0
  138. package/themes/ayu-light.json +9 -0
  139. package/themes/catppuccin-latte.json +9 -0
  140. package/themes/catppuccin-mocha.json +9 -0
  141. package/themes/clay-light.json +10 -0
  142. package/themes/clay.json +10 -0
  143. package/themes/dracula.json +9 -0
  144. package/themes/everforest-light.json +9 -0
  145. package/themes/everforest.json +9 -0
  146. package/themes/github-light.json +9 -0
  147. package/themes/gruvbox-dark.json +9 -0
  148. package/themes/gruvbox-light.json +9 -0
  149. package/themes/horizon-light.json +9 -0
  150. package/themes/kanagawa-lotus.json +9 -0
  151. package/themes/kanagawa.json +9 -0
  152. package/themes/modus-operandi.json +9 -0
  153. package/themes/monokai.json +9 -0
  154. package/themes/nightfox.json +9 -0
  155. package/themes/nord-light.json +9 -0
  156. package/themes/nord.json +9 -0
  157. package/themes/one-dark.json +9 -0
  158. package/themes/one-light.json +9 -0
  159. package/themes/palenight.json +9 -0
  160. package/themes/paper.json +9 -0
  161. package/themes/penumbra-light.json +9 -0
  162. package/themes/poimandres.json +9 -0
  163. package/themes/quiet-light.json +9 -0
  164. package/themes/rose-pine-dawn.json +9 -0
  165. package/themes/rose-pine.json +9 -0
  166. package/themes/solarized-dark.json +9 -0
  167. package/themes/solarized-light.json +9 -0
  168. package/themes/synthwave84.json +9 -0
  169. package/themes/tokyo-night-light.json +9 -0
  170. package/themes/tokyo-night.json +9 -0
  171. package/themes/vesper.json +9 -0
  172. package/index.html +0 -20
  173. package/public/icons/icon-192.svg +0 -11
  174. package/public/icons/icon-512.svg +0 -11
  175. package/public/sw-push.js +0 -53
  176. package/src/client/App.tsx +0 -42
  177. package/src/client/commands.ts +0 -36
  178. package/src/client/components/analytics/AnalyticsView.tsx +0 -244
  179. package/src/client/components/analytics/ChartCard.tsx +0 -194
  180. package/src/client/components/analytics/PeriodSelector.tsx +0 -42
  181. package/src/client/components/analytics/QuickStats.tsx +0 -122
  182. package/src/client/components/analytics/chartTokens.ts +0 -188
  183. package/src/client/components/analytics/charts/ActivityCalendar.tsx +0 -204
  184. package/src/client/components/analytics/charts/CacheEfficiencyChart.tsx +0 -56
  185. package/src/client/components/analytics/charts/ContextUtilizationChart.tsx +0 -106
  186. package/src/client/components/analytics/charts/CostAreaChart.tsx +0 -79
  187. package/src/client/components/analytics/charts/CostDistributionChart.tsx +0 -59
  188. package/src/client/components/analytics/charts/CostDonutChart.tsx +0 -84
  189. package/src/client/components/analytics/charts/CumulativeCostChart.tsx +0 -59
  190. package/src/client/components/analytics/charts/DailySummaryCards.tsx +0 -86
  191. package/src/client/components/analytics/charts/HourlyHeatmap.tsx +0 -133
  192. package/src/client/components/analytics/charts/NodeFleetOverview.tsx +0 -89
  193. package/src/client/components/analytics/charts/PermissionBreakdown.tsx +0 -98
  194. package/src/client/components/analytics/charts/ProjectRadar.tsx +0 -126
  195. package/src/client/components/analytics/charts/ResponseTimeScatter.tsx +0 -96
  196. package/src/client/components/analytics/charts/SessionBubbleChart.tsx +0 -114
  197. package/src/client/components/analytics/charts/SessionComplexityList.tsx +0 -65
  198. package/src/client/components/analytics/charts/SessionTimeline.tsx +0 -107
  199. package/src/client/components/analytics/charts/TokenFlowChart.tsx +0 -78
  200. package/src/client/components/analytics/charts/TokenSankeyChart.tsx +0 -93
  201. package/src/client/components/analytics/charts/ToolSunburst.tsx +0 -123
  202. package/src/client/components/analytics/charts/ToolTreemap.tsx +0 -110
  203. package/src/client/components/auth/PassphrasePrompt.tsx +0 -70
  204. package/src/client/components/chat/AttachmentChips.tsx +0 -116
  205. package/src/client/components/chat/ChatInput.tsx +0 -533
  206. package/src/client/components/chat/ChatView.tsx +0 -1076
  207. package/src/client/components/chat/CommandPalette.tsx +0 -162
  208. package/src/client/components/chat/ElicitationCard.tsx +0 -238
  209. package/src/client/components/chat/Message.tsx +0 -825
  210. package/src/client/components/chat/ModelSelector.tsx +0 -108
  211. package/src/client/components/chat/PermissionModeSelector.tsx +0 -41
  212. package/src/client/components/chat/PromptQuestion.tsx +0 -271
  213. package/src/client/components/chat/StatusBar.tsx +0 -50
  214. package/src/client/components/chat/TodoCard.tsx +0 -57
  215. package/src/client/components/chat/ToolGroup.tsx +0 -129
  216. package/src/client/components/chat/ToolResultRenderer.tsx +0 -348
  217. package/src/client/components/chat/VoiceRecorder.tsx +0 -85
  218. package/src/client/components/chat/toolSummary.ts +0 -41
  219. package/src/client/components/dashboard/DashboardView.tsx +0 -200
  220. package/src/client/components/dashboard/ProjectDashboardView.tsx +0 -179
  221. package/src/client/components/mesh/NodeBadge.tsx +0 -24
  222. package/src/client/components/mesh/PairingDialog.tsx +0 -340
  223. package/src/client/components/project-settings/ProjectClaude.tsx +0 -318
  224. package/src/client/components/project-settings/ProjectEnvironment.tsx +0 -235
  225. package/src/client/components/project-settings/ProjectGeneral.tsx +0 -76
  226. package/src/client/components/project-settings/ProjectMcp.tsx +0 -232
  227. package/src/client/components/project-settings/ProjectMemory.tsx +0 -488
  228. package/src/client/components/project-settings/ProjectNotifications.tsx +0 -48
  229. package/src/client/components/project-settings/ProjectPermissions.tsx +0 -209
  230. package/src/client/components/project-settings/ProjectPlugins.tsx +0 -117
  231. package/src/client/components/project-settings/ProjectRules.tsx +0 -286
  232. package/src/client/components/project-settings/ProjectSettingsView.tsx +0 -117
  233. package/src/client/components/project-settings/ProjectSkills.tsx +0 -91
  234. package/src/client/components/settings/Appearance.tsx +0 -275
  235. package/src/client/components/settings/BudgetSettings.tsx +0 -165
  236. package/src/client/components/settings/ClaudeSettings.tsx +0 -175
  237. package/src/client/components/settings/Editor.tsx +0 -123
  238. package/src/client/components/settings/Environment.tsx +0 -185
  239. package/src/client/components/settings/GlobalMcp.tsx +0 -216
  240. package/src/client/components/settings/GlobalMemory.tsx +0 -19
  241. package/src/client/components/settings/GlobalPlugins.tsx +0 -806
  242. package/src/client/components/settings/GlobalRules.tsx +0 -149
  243. package/src/client/components/settings/GlobalSkills.tsx +0 -140
  244. package/src/client/components/settings/MeshStatus.tsx +0 -183
  245. package/src/client/components/settings/Notifications.tsx +0 -123
  246. package/src/client/components/settings/SettingsView.tsx +0 -75
  247. package/src/client/components/settings/SkillMarketplace.tsx +0 -175
  248. package/src/client/components/settings/ThemePreview.tsx +0 -140
  249. package/src/client/components/settings/ThemeWizard.tsx +0 -405
  250. package/src/client/components/settings/mcp-shared.tsx +0 -194
  251. package/src/client/components/settings/skill-shared.tsx +0 -186
  252. package/src/client/components/setup/SetupWizard.tsx +0 -755
  253. package/src/client/components/sidebar/AddProjectModal.tsx +0 -438
  254. package/src/client/components/sidebar/NodeSettingsModal.tsx +0 -206
  255. package/src/client/components/sidebar/ProjectDropdown.tsx +0 -211
  256. package/src/client/components/sidebar/ProjectRail.tsx +0 -353
  257. package/src/client/components/sidebar/SearchFilter.tsx +0 -52
  258. package/src/client/components/sidebar/SessionList.tsx +0 -599
  259. package/src/client/components/sidebar/SettingsSidebar.tsx +0 -139
  260. package/src/client/components/sidebar/Sidebar.tsx +0 -469
  261. package/src/client/components/sidebar/UserIsland.tsx +0 -282
  262. package/src/client/components/sidebar/UserMenu.tsx +0 -107
  263. package/src/client/components/ui/CommandPalette.tsx +0 -321
  264. package/src/client/components/ui/ContextMenu.tsx +0 -153
  265. package/src/client/components/ui/ErrorBoundary.tsx +0 -56
  266. package/src/client/components/ui/IconPicker.tsx +0 -184
  267. package/src/client/components/ui/KeyboardShortcuts.tsx +0 -129
  268. package/src/client/components/ui/LatticeLogomark.tsx +0 -19
  269. package/src/client/components/ui/NodeDisconnectedOverlay.tsx +0 -35
  270. package/src/client/components/ui/PopupMenu.tsx +0 -120
  271. package/src/client/components/ui/SaveFooter.tsx +0 -63
  272. package/src/client/components/ui/Toast.tsx +0 -132
  273. package/src/client/components/ui/UpdateBanner.tsx +0 -110
  274. package/src/client/components/ui/UpdatePrompt.tsx +0 -47
  275. package/src/client/components/workspace/BookmarksView.tsx +0 -156
  276. package/src/client/components/workspace/FileBrowser.tsx +0 -174
  277. package/src/client/components/workspace/FileTree.tsx +0 -129
  278. package/src/client/components/workspace/FileViewer.tsx +0 -211
  279. package/src/client/components/workspace/NoteCard.tsx +0 -120
  280. package/src/client/components/workspace/NotesView.tsx +0 -102
  281. package/src/client/components/workspace/ScheduledTasksView.tsx +0 -117
  282. package/src/client/components/workspace/SplitPane.tsx +0 -81
  283. package/src/client/components/workspace/TabBar.tsx +0 -170
  284. package/src/client/components/workspace/TaskCard.tsx +0 -159
  285. package/src/client/components/workspace/TaskEditModal.tsx +0 -129
  286. package/src/client/components/workspace/TerminalInstance.tsx +0 -171
  287. package/src/client/components/workspace/TerminalView.tsx +0 -110
  288. package/src/client/components/workspace/WorkspaceView.tsx +0 -141
  289. package/src/client/hooks/useAnalytics.ts +0 -84
  290. package/src/client/hooks/useAttachments.ts +0 -313
  291. package/src/client/hooks/useBookmarks.ts +0 -57
  292. package/src/client/hooks/useEditorConfig.ts +0 -28
  293. package/src/client/hooks/useFocusTrap.ts +0 -74
  294. package/src/client/hooks/useIdleDetection.ts +0 -50
  295. package/src/client/hooks/useInstallPrompt.ts +0 -53
  296. package/src/client/hooks/useMesh.ts +0 -89
  297. package/src/client/hooks/useNotifications.ts +0 -54
  298. package/src/client/hooks/useOnline.ts +0 -6
  299. package/src/client/hooks/useProjectSettings.ts +0 -56
  300. package/src/client/hooks/useProjects.ts +0 -98
  301. package/src/client/hooks/usePushNotifications.ts +0 -92
  302. package/src/client/hooks/useSaveState.ts +0 -65
  303. package/src/client/hooks/useSession.ts +0 -580
  304. package/src/client/hooks/useSidebar.ts +0 -90
  305. package/src/client/hooks/useSkills.ts +0 -30
  306. package/src/client/hooks/useSpinnerVerb.ts +0 -36
  307. package/src/client/hooks/useSwipeDrawer.ts +0 -299
  308. package/src/client/hooks/useTheme.ts +0 -114
  309. package/src/client/hooks/useTimeTick.ts +0 -35
  310. package/src/client/hooks/useVoiceRecorder.ts +0 -169
  311. package/src/client/hooks/useWebSocket.ts +0 -27
  312. package/src/client/hooks/useWorkspace.ts +0 -57
  313. package/src/client/lib/theme-derive.ts +0 -196
  314. package/src/client/lib/workspace-url.ts +0 -219
  315. package/src/client/main.tsx +0 -10
  316. package/src/client/providers/WebSocketProvider.tsx +0 -186
  317. package/src/client/router.tsx +0 -578
  318. package/src/client/stores/analytics.ts +0 -68
  319. package/src/client/stores/bookmarks.ts +0 -45
  320. package/src/client/stores/mesh.ts +0 -78
  321. package/src/client/stores/session.ts +0 -569
  322. package/src/client/stores/sidebar.ts +0 -530
  323. package/src/client/stores/theme.ts +0 -44
  324. package/src/client/stores/workspace.ts +0 -518
  325. package/src/client/styles/global.css +0 -391
  326. package/src/client/styles/theme-vars.css +0 -18
  327. package/src/client/themes/index.ts +0 -105
  328. package/src/client/utils/editorUrl.ts +0 -55
  329. package/src/client/utils/findDuplicateKeys.ts +0 -12
  330. package/src/client/utils/formatSessionTitle.ts +0 -17
  331. package/src/client/vite-env.d.ts +0 -6
  332. package/src/server/analytics/engine.ts +0 -920
  333. package/src/server/assets.ts +0 -45
  334. package/src/server/auth/passphrase.ts +0 -78
  335. package/src/server/config.ts +0 -55
  336. package/src/server/daemon.ts +0 -567
  337. package/src/server/features/ralph-loop.ts +0 -173
  338. package/src/server/features/scheduler.ts +0 -304
  339. package/src/server/features/sticky-notes.ts +0 -104
  340. package/src/server/handlers/analytics.ts +0 -39
  341. package/src/server/handlers/attachment.ts +0 -189
  342. package/src/server/handlers/bookmarks.ts +0 -50
  343. package/src/server/handlers/chat.ts +0 -381
  344. package/src/server/handlers/editor.ts +0 -76
  345. package/src/server/handlers/fs.ts +0 -251
  346. package/src/server/handlers/loop.ts +0 -37
  347. package/src/server/handlers/memory.ts +0 -182
  348. package/src/server/handlers/mesh.ts +0 -362
  349. package/src/server/handlers/notes.ts +0 -47
  350. package/src/server/handlers/plugins.ts +0 -655
  351. package/src/server/handlers/project-settings.ts +0 -180
  352. package/src/server/handlers/scheduler.ts +0 -64
  353. package/src/server/handlers/session.ts +0 -226
  354. package/src/server/handlers/settings.ts +0 -157
  355. package/src/server/handlers/skills.ts +0 -378
  356. package/src/server/handlers/terminal.ts +0 -88
  357. package/src/server/handlers/themes.ts +0 -121
  358. package/src/server/handlers/update.ts +0 -133
  359. package/src/server/identity.ts +0 -56
  360. package/src/server/index.ts +0 -457
  361. package/src/server/logger.ts +0 -21
  362. package/src/server/mesh/connector.ts +0 -419
  363. package/src/server/mesh/crypto.ts +0 -106
  364. package/src/server/mesh/discovery.ts +0 -126
  365. package/src/server/mesh/pairing.ts +0 -123
  366. package/src/server/mesh/peers.ts +0 -60
  367. package/src/server/mesh/proxy.ts +0 -106
  368. package/src/server/mesh/session-sync.ts +0 -107
  369. package/src/server/project/bookmarks.ts +0 -83
  370. package/src/server/project/context-breakdown.ts +0 -307
  371. package/src/server/project/file-browser.ts +0 -106
  372. package/src/server/project/project-files.ts +0 -267
  373. package/src/server/project/pty-worker.cjs +0 -83
  374. package/src/server/project/registry.ts +0 -57
  375. package/src/server/project/sdk-bridge.ts +0 -1100
  376. package/src/server/project/session.ts +0 -723
  377. package/src/server/project/terminal.ts +0 -111
  378. package/src/server/project/warmup.ts +0 -285
  379. package/src/server/push.ts +0 -121
  380. package/src/server/tls.ts +0 -65
  381. package/src/server/tui.ts +0 -103
  382. package/src/server/update-checker.ts +0 -147
  383. package/src/server/ws/broadcast.ts +0 -61
  384. package/src/server/ws/router.ts +0 -123
  385. package/src/server/ws/server.ts +0 -2
  386. package/src/shared/analytics.ts +0 -40
  387. package/src/shared/messages.ts +0 -1302
  388. package/src/shared/models.ts +0 -255
  389. package/src/shared/project-settings.ts +0 -45
  390. package/tsconfig.json +0 -25
  391. package/vite.config.ts +0 -71
  392. /package/{src/server/runtime.ts → dist/server/runtime.js} +0 -0
  393. /package/{src/shared/constants.ts → dist/shared/constants.js} +0 -0
  394. /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
- });
@@ -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
- }
@@ -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
- }