@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
@@ -1,42 +0,0 @@
1
- type Period = "24h" | "7d" | "30d" | "90d" | "all";
2
-
3
- const PERIODS: Array<{ value: Period; label: string }> = [
4
- { value: "24h", label: "24h" },
5
- { value: "7d", label: "7d" },
6
- { value: "30d", label: "30d" },
7
- { value: "90d", label: "90d" },
8
- { value: "all", label: "All" },
9
- ];
10
-
11
- interface PeriodSelectorProps {
12
- value: Period;
13
- onChange: (period: Period) => void;
14
- }
15
-
16
- export function PeriodSelector({ value, onChange }: PeriodSelectorProps) {
17
- return (
18
- <div role="radiogroup" aria-label="Time period" className="flex items-center gap-1">
19
- {PERIODS.map(function (period) {
20
- const isActive = period.value === value;
21
- return (
22
- <button
23
- key={period.value}
24
- role="radio"
25
- aria-checked={isActive}
26
- onClick={function () { onChange(period.value); }}
27
- className={[
28
- "px-2 py-0.5 rounded border text-[10px] font-mono font-bold uppercase tracking-widest transition-colors cursor-pointer",
29
- isActive
30
- ? "bg-primary/15 text-primary border-primary/30"
31
- : "text-base-content/35 border-base-content/8 hover:text-base-content/60 hover:border-base-content/20",
32
- ].join(" ")}
33
- >
34
- {period.label}
35
- </button>
36
- );
37
- })}
38
- </div>
39
- );
40
- }
41
-
42
- export type { Period };
@@ -1,122 +0,0 @@
1
- import { LineChart, Line, ResponsiveContainer } from "recharts";
2
- import { useStore } from "@tanstack/react-store";
3
- import { getAnalyticsStore } from "../../stores/analytics";
4
- import { getChartColors } from "./chartTokens";
5
-
6
- function formatTokens(n: number): string {
7
- if (n >= 1_000_000) return (n / 1_000_000).toFixed(1) + "M";
8
- if (n >= 1_000) return Math.round(n / 1_000) + "k";
9
- return String(n);
10
- }
11
-
12
- interface SparklineProps {
13
- data: Array<{ v: number }>;
14
- stroke: string;
15
- }
16
-
17
- function Sparkline({ data, stroke }: SparklineProps) {
18
- return (
19
- <ResponsiveContainer width={60} height={20}>
20
- <LineChart data={data} margin={{ top: 2, right: 2, left: 2, bottom: 2 }}>
21
- <Line
22
- type="monotone"
23
- dataKey="v"
24
- stroke={stroke}
25
- strokeWidth={1.5}
26
- dot={false}
27
- isAnimationActive={false}
28
- />
29
- </LineChart>
30
- </ResponsiveContainer>
31
- );
32
- }
33
-
34
- export function QuickStats() {
35
- const analytics = useStore(getAnalyticsStore(), function (s) { return s; });
36
- const summaryLoaded = analytics.loadedSections.includes("summary");
37
-
38
- if (!summaryLoaded) {
39
- return (
40
- <div className="grid grid-cols-2 sm:grid-cols-4 gap-3">
41
- {[0, 1, 2, 3].map(function (i) {
42
- return (
43
- <div key={i} className="bg-base-content/[0.03] rounded-xl p-3.5 animate-pulse">
44
- <div className="h-2.5 w-16 bg-base-content/10 rounded mb-3" />
45
- <div className="h-6 w-12 bg-base-content/10 rounded" />
46
- </div>
47
- );
48
- })}
49
- </div>
50
- );
51
- }
52
-
53
- const d = analytics.data;
54
- const colors = getChartColors();
55
-
56
- const costSparkData = (d.costOverTime ?? []).slice(-7).map(function (e) { return { v: e.total }; });
57
- const sessionsSparkData = (d.sessionsOverTime ?? []).slice(-7).map(function (e) { return { v: e.count }; });
58
- const tokensSparkData = (d.tokensOverTime ?? []).slice(-7).map(function (e) { return { v: e.input + e.output }; });
59
-
60
- const totalTokens = (d.totalTokens?.input ?? 0) + (d.totalTokens?.output ?? 0);
61
- const cacheHitPct = Math.round((d.cacheHitRate ?? 0) * 100);
62
-
63
- return (
64
- <div className="grid grid-cols-2 sm:grid-cols-4 gap-3">
65
- <div className="bg-base-content/[0.03] rounded-xl p-3.5">
66
- <div className="flex items-center justify-between mb-1">
67
- <span className="text-[10px] font-mono font-bold uppercase tracking-wider text-base-content/40">Total Spend</span>
68
- {costSparkData.length > 1 && (
69
- <div role="img" aria-label={"Cost trend: " + (costSparkData[costSparkData.length - 1].v > costSparkData[0].v ? "increasing" : costSparkData[costSparkData.length - 1].v < costSparkData[0].v ? "decreasing" : "stable")}>
70
- <Sparkline data={costSparkData} stroke={colors.primary} />
71
- </div>
72
- )}
73
- </div>
74
- <div className="text-[20px] font-mono text-base-content">${(d.totalCost ?? 0).toFixed(2)}</div>
75
- </div>
76
-
77
- <div className="bg-base-content/[0.03] rounded-xl p-3.5">
78
- <div className="flex items-center justify-between mb-1">
79
- <span className="text-[10px] font-mono font-bold uppercase tracking-wider text-base-content/40">Sessions</span>
80
- {sessionsSparkData.length > 1 && (
81
- <div role="img" aria-label={"Sessions trend: " + (sessionsSparkData[sessionsSparkData.length - 1].v > sessionsSparkData[0].v ? "increasing" : sessionsSparkData[sessionsSparkData.length - 1].v < sessionsSparkData[0].v ? "decreasing" : "stable")}>
82
- <Sparkline data={sessionsSparkData} stroke={colors.success} />
83
- </div>
84
- )}
85
- </div>
86
- <div className="text-[20px] font-mono text-base-content">{d.totalSessions ?? 0}</div>
87
- </div>
88
-
89
- <div className="bg-base-content/[0.03] rounded-xl p-3.5">
90
- <div className="flex items-center justify-between mb-1">
91
- <span className="text-[10px] font-mono font-bold uppercase tracking-wider text-base-content/40">Total Tokens</span>
92
- {tokensSparkData.length > 1 && (
93
- <div role="img" aria-label={"Tokens trend: " + (tokensSparkData[tokensSparkData.length - 1].v > tokensSparkData[0].v ? "increasing" : tokensSparkData[tokensSparkData.length - 1].v < tokensSparkData[0].v ? "decreasing" : "stable")}>
94
- <Sparkline data={tokensSparkData} stroke={colors.warning} />
95
- </div>
96
- )}
97
- </div>
98
- <div className="text-[20px] font-mono text-base-content">{formatTokens(totalTokens)}</div>
99
- </div>
100
-
101
- <div className="bg-base-content/[0.03] rounded-xl p-3.5">
102
- <div className="mb-1">
103
- <span className="text-[10px] font-mono font-bold uppercase tracking-wider text-base-content/40">Cache Rate</span>
104
- </div>
105
- <div className="text-[20px] font-mono text-base-content mb-2">{cacheHitPct}%</div>
106
- <div
107
- className="w-full h-1 rounded-full bg-base-content/10 overflow-hidden"
108
- role="progressbar"
109
- aria-valuenow={cacheHitPct}
110
- aria-valuemin={0}
111
- aria-valuemax={100}
112
- aria-label="Cache hit rate"
113
- >
114
- <div
115
- className="h-full rounded-full bg-primary transition-all duration-300"
116
- style={{ width: cacheHitPct + "%" }}
117
- />
118
- </div>
119
- </div>
120
- </div>
121
- );
122
- }
@@ -1,188 +0,0 @@
1
- /**
2
- * Theme-aware chart color tokens.
3
- *
4
- * Reads CSS custom properties set by useTheme so every chart
5
- * automatically adapts when the user switches Base16 themes.
6
- *
7
- * Usage:
8
- * import { getChartColors } from "../chartTokens";
9
- * // inside component render:
10
- * var colors = getChartColors();
11
- */
12
-
13
- function css(prop: string): string {
14
- return getComputedStyle(document.documentElement).getPropertyValue(prop).trim();
15
- }
16
-
17
- function oklch(raw: string): string {
18
- return raw ? "oklch(" + raw + ")" : "";
19
- }
20
-
21
- export interface ChartColors {
22
- /** Primary brand color (base0D — blue) */
23
- primary: string;
24
- /** Secondary color (base0E — purple) */
25
- secondary: string;
26
- /** Accent / info color (base0C — cyan) */
27
- accent: string;
28
- /** Success / green (base0B) */
29
- success: string;
30
- /** Warning / yellow (base0A) */
31
- warning: string;
32
- /** Error / red (base08) */
33
- error: string;
34
- /** Orange (base09) */
35
- orange: string;
36
- /** Magenta (base0F) */
37
- magenta: string;
38
-
39
- /** Tick label fill — content color at 30% opacity */
40
- tickFill: string;
41
- /** Grid stroke — content color at 6% opacity */
42
- gridStroke: string;
43
-
44
- /** Model palette keyed by model family */
45
- model: {
46
- opus: string;
47
- sonnet: string;
48
- haiku: string;
49
- other: string;
50
- };
51
-
52
- /** Ordered palette for multi-series charts (8 colors) */
53
- palette: string[];
54
-
55
- /** Category colors for tool classification */
56
- category: Record<string, string>;
57
-
58
- /** Permission colors */
59
- permission: {
60
- allowed: string;
61
- denied: string;
62
- alwaysAllowed: string;
63
- };
64
- }
65
-
66
- var _cache: ChartColors | null = null;
67
- var _cacheKey: string = "";
68
-
69
- /**
70
- * Returns chart colors derived from the current CSS theme.
71
- * Results are cached per theme so repeated calls within
72
- * the same render cycle are cheap.
73
- */
74
- export function getChartColors(): ChartColors {
75
- var key = css("--color-primary") + css("--color-base-content") + css("--base0D");
76
- if (_cache && _cacheKey === key) return _cache;
77
-
78
- var b08 = css("--base08");
79
- var b09 = css("--base09");
80
- var b0A = css("--base0A");
81
- var b0B = css("--base0B");
82
- var b0C = css("--base0C");
83
- var b0D = css("--base0D");
84
- var b0E = css("--base0E");
85
- var b0F = css("--base0F");
86
-
87
- var primary = b0D || oklch(css("--color-primary"));
88
- var secondary = b0E || oklch(css("--color-secondary"));
89
- var accent = b0C || oklch(css("--color-accent"));
90
- var success = b0B || oklch(css("--color-success"));
91
- var warning = b0A || oklch(css("--color-warning"));
92
- var error = b08 || oklch(css("--color-error"));
93
- var orange = b09 || warning;
94
- var magenta = b0F || secondary;
95
- var b03 = css("--base03");
96
- var b04 = css("--base04");
97
- var b02 = css("--base02");
98
-
99
- var tickFill = b04 || b03 || "#9ea8c7";
100
- var gridStroke = b02 || "#44475a";
101
-
102
- _cache = {
103
- primary,
104
- secondary,
105
- accent,
106
- success,
107
- warning,
108
- error,
109
- orange,
110
- magenta,
111
-
112
- tickFill,
113
- gridStroke,
114
-
115
- model: {
116
- opus: secondary,
117
- sonnet: primary,
118
- haiku: success,
119
- other: warning,
120
- },
121
-
122
- palette: [primary, secondary, success, warning, accent, orange, error, magenta],
123
-
124
- category: {
125
- Read: success,
126
- Write: warning,
127
- Execute: error,
128
- AI: secondary,
129
- Other: primary,
130
- },
131
-
132
- permission: {
133
- allowed: success,
134
- denied: error,
135
- alwaysAllowed: primary,
136
- },
137
- };
138
- _cacheKey = key;
139
- return _cache;
140
- }
141
-
142
- /** Tick style object ready to spread onto Recharts axis components. */
143
- export function getTickStyle() {
144
- var c = getChartColors();
145
- return {
146
- fontSize: 10,
147
- fontFamily: "var(--font-mono)",
148
- fill: c.tickFill,
149
- };
150
- }
151
-
152
- /**
153
- * Returns a color for a model name by matching against known families.
154
- */
155
- export function getModelColor(model: string): string {
156
- var c = getChartColors();
157
- var key = model.toLowerCase();
158
- if (key.includes("opus")) return c.model.opus;
159
- if (key.includes("sonnet")) return c.model.sonnet;
160
- if (key.includes("haiku")) return c.model.haiku;
161
- return c.model.other;
162
- }
163
-
164
- /**
165
- * Generate a dynamic OKLCH color based on the theme's primary hue.
166
- * Useful for heatmaps and treemaps that derive intensity from data.
167
- */
168
- export function getIntensityColor(intensity: number, hueOverride?: number): string {
169
- var raw = getComputedStyle(document.documentElement).getPropertyValue("--color-primary").trim();
170
- var hue = hueOverride ?? 280;
171
- if (raw) {
172
- var parts = raw.split(/\s+/);
173
- if (parts.length >= 3) {
174
- hue = parseFloat(parts[2]) || hue;
175
- }
176
- }
177
- var lightness = 0.45 - intensity * 0.15;
178
- var chroma = 0.15 + intensity * 0.12;
179
- return "oklch(" + lightness + " " + chroma + " " + hue + ")";
180
- }
181
-
182
- /**
183
- * Generate a score-based color using theme hue.
184
- */
185
- export function getScoreColor(score: number, maxScore: number): string {
186
- var intensity = maxScore > 0 ? Math.min(score / maxScore, 1) : 0;
187
- return getIntensityColor(intensity);
188
- }
@@ -1,204 +0,0 @@
1
- import { useState, useRef, useEffect } from "react";
2
- import { createPortal } from "react-dom";
3
- import { getChartColors } from "../chartTokens";
4
-
5
- interface CalendarDatum {
6
- date: string;
7
- count: number;
8
- tokens: number;
9
- cost: number;
10
- }
11
-
12
- interface ActivityCalendarProps {
13
- data: CalendarDatum[];
14
- }
15
-
16
- var DAY_LABEL_WIDTH = 28;
17
- var MONTH_LABEL_HEIGHT = 16;
18
-
19
- var INTENSITY_OPACITIES = [0.05, 0.15, 0.3, 0.5, 0.8];
20
-
21
- var MONTH_NAMES = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
22
- var DAY_LABELS = [
23
- { index: 1, label: "Mon" },
24
- { index: 3, label: "Wed" },
25
- { index: 5, label: "Fri" },
26
- ];
27
-
28
- function getIntensity(count: number, maxCount: number): number {
29
- if (count === 0 || maxCount === 0) return -1;
30
- var ratio = count / maxCount;
31
- if (ratio <= 0.2) return 0;
32
- if (ratio <= 0.4) return 1;
33
- if (ratio <= 0.6) return 2;
34
- if (ratio <= 0.8) return 3;
35
- return 4;
36
- }
37
-
38
- function parseDateParts(dateStr: string): { year: number; month: number; day: number } {
39
- var parts = dateStr.split("-");
40
- return { year: parseInt(parts[0], 10), month: parseInt(parts[1], 10) - 1, day: parseInt(parts[2], 10) };
41
- }
42
-
43
- export function ActivityCalendar({ data }: ActivityCalendarProps) {
44
- var colors = getChartColors();
45
- var PRIMARY_COLOR = colors.primary;
46
- var [hover, setHover] = useState<{ x: number; y: number; datum: CalendarDatum } | null>(null);
47
- var containerRef = useRef<HTMLDivElement>(null);
48
- var [containerWidth, setContainerWidth] = useState(0);
49
-
50
- useEffect(function () {
51
- if (!containerRef.current) return;
52
- let ro = new ResizeObserver(function (entries) {
53
- setContainerWidth(entries[0].contentRect.width);
54
- });
55
- ro.observe(containerRef.current);
56
- setContainerWidth(containerRef.current.clientWidth);
57
- return function () { ro.disconnect(); };
58
- }, []);
59
-
60
- if (!data || data.length === 0) {
61
- return (
62
- <div className="flex flex-col items-center justify-center h-[120px] gap-1">
63
- <span className="text-base-content/25 font-mono text-[11px]">No activity recorded</span>
64
- <span className="text-base-content/15 text-[10px]">Sessions will appear as colored cells by day</span>
65
- </div>
66
- );
67
- }
68
-
69
- var dataMap = new Map<string, CalendarDatum>();
70
- var maxCount = 0;
71
- for (var i = 0; i < data.length; i++) {
72
- dataMap.set(data[i].date, data[i]);
73
- if (data[i].count > maxCount) maxCount = data[i].count;
74
- }
75
-
76
- var lastDate = new Date(data[data.length - 1].date + "T00:00:00");
77
- var startDate = new Date(lastDate);
78
- startDate.setDate(startDate.getDate() - 364);
79
- var startDay = startDate.getDay();
80
- if (startDay !== 0) {
81
- startDate.setDate(startDate.getDate() - startDay);
82
- }
83
-
84
- var weeks: Array<Array<{ date: string; datum: CalendarDatum | undefined } | null>> = [];
85
- var cursor = new Date(startDate);
86
- var currentWeek: Array<{ date: string; datum: CalendarDatum | undefined } | null> = [];
87
-
88
- while (cursor <= lastDate) {
89
- var dow = cursor.getDay();
90
- if (dow === 0 && currentWeek.length > 0) {
91
- weeks.push(currentWeek);
92
- currentWeek = [];
93
- }
94
- var key = cursor.getFullYear() + "-" + String(cursor.getMonth() + 1).padStart(2, "0") + "-" + String(cursor.getDate()).padStart(2, "0");
95
- currentWeek.push({ date: key, datum: dataMap.get(key) });
96
- cursor.setDate(cursor.getDate() + 1);
97
- }
98
- if (currentWeek.length > 0) {
99
- while (currentWeek.length < 7) currentWeek.push(null);
100
- weeks.push(currentWeek);
101
- }
102
-
103
- var monthLabels: Array<{ col: number; label: string }> = [];
104
- var lastMonth = -1;
105
- for (var wi = 0; wi < weeks.length; wi++) {
106
- var firstCell = weeks[wi][0];
107
- if (!firstCell) continue;
108
- var parts = parseDateParts(firstCell.date);
109
- if (parts.month !== lastMonth) {
110
- monthLabels.push({ col: wi, label: MONTH_NAMES[parts.month] });
111
- lastMonth = parts.month;
112
- }
113
- }
114
-
115
- var availableWidth = (containerWidth || 800) - DAY_LABEL_WIDTH;
116
- var CELL_STEP = Math.max(3, Math.floor(availableWidth / weeks.length));
117
- var CELL_GAP = Math.max(1, Math.round(CELL_STEP * 0.15));
118
- var CELL_SIZE = CELL_STEP - CELL_GAP;
119
-
120
- var svgWidth = DAY_LABEL_WIDTH + weeks.length * CELL_STEP;
121
- var svgHeight = MONTH_LABEL_HEIGHT + 7 * CELL_STEP;
122
-
123
- return (
124
- <div ref={containerRef} className="relative w-full">
125
- <svg width="100%" height={svgHeight} viewBox={"0 0 " + svgWidth + " " + svgHeight} className="block">
126
- {monthLabels.map(function (ml, idx) {
127
- return (
128
- <text
129
- key={idx}
130
- x={DAY_LABEL_WIDTH + ml.col * CELL_STEP}
131
- y={10}
132
- className="fill-base-content/30"
133
- style={{ fontSize: 10, fontFamily: "var(--font-mono)" }}
134
- >
135
- {ml.label}
136
- </text>
137
- );
138
- })}
139
-
140
- {DAY_LABELS.map(function (dl) {
141
- return (
142
- <text
143
- key={dl.index}
144
- x={0}
145
- y={MONTH_LABEL_HEIGHT + dl.index * CELL_STEP + CELL_SIZE - 1}
146
- className="fill-base-content/30"
147
- style={{ fontSize: 10, fontFamily: "var(--font-mono)" }}
148
- >
149
- {dl.label}
150
- </text>
151
- );
152
- })}
153
-
154
- {weeks.map(function (week, col) {
155
- return week.map(function (cell, row) {
156
- if (!cell) return null;
157
- var intensity = getIntensity(cell.datum?.count || 0, maxCount);
158
- var x = DAY_LABEL_WIDTH + col * CELL_STEP;
159
- var y = MONTH_LABEL_HEIGHT + row * CELL_STEP;
160
- var opacity = intensity >= 0 ? INTENSITY_OPACITIES[intensity] : 0.05;
161
- var fillColor = intensity >= 0 ? PRIMARY_COLOR : undefined;
162
-
163
- return (
164
- <rect
165
- key={cell.date}
166
- x={x}
167
- y={y}
168
- width={CELL_SIZE}
169
- height={CELL_SIZE}
170
- rx={2}
171
- ry={2}
172
- fill={fillColor || "currentColor"}
173
- opacity={opacity}
174
- className={fillColor ? "" : "text-base-content/5"}
175
- onMouseEnter={function (e) {
176
- setHover({
177
- x: e.clientX,
178
- y: e.clientY,
179
- datum: cell!.datum || { date: cell!.date, count: 0, tokens: 0, cost: 0 },
180
- });
181
- }}
182
- onMouseLeave={function () { setHover(null); }}
183
- />
184
- );
185
- });
186
- })}
187
- </svg>
188
-
189
- {hover && createPortal(
190
- <div
191
- className="fixed z-[9999] rounded-lg border border-base-content/8 bg-base-200 px-3 py-2 shadow-lg pointer-events-none"
192
- style={{ left: hover.x + 12, top: hover.y - 40 }}
193
- >
194
- <p className="text-[10px] font-mono text-base-content/50">{hover.datum.date}</p>
195
- <div className="text-[11px] font-mono text-base-content/70 space-y-0.5">
196
- <p><span className="text-base-content/40">sessions </span>{hover.datum.count}</p>
197
- <p><span className="text-base-content/40">cost </span>${hover.datum.cost.toFixed(4)}</p>
198
- </div>
199
- </div>,
200
- document.body
201
- )}
202
- </div>
203
- );
204
- }
@@ -1,56 +0,0 @@
1
- import {
2
- AreaChart,
3
- Area,
4
- XAxis,
5
- YAxis,
6
- CartesianGrid,
7
- Tooltip,
8
- ResponsiveContainer,
9
- } from "recharts";
10
- import { useChartFullscreen } from "../ChartCard";
11
- import { getChartColors, getTickStyle } from "../chartTokens";
12
-
13
- interface CacheEfficiencyDatum {
14
- date: string;
15
- rate: number;
16
- }
17
-
18
- interface CacheEfficiencyChartProps {
19
- data: CacheEfficiencyDatum[];
20
- }
21
-
22
- function CustomTooltip({ active, payload, label }: { active?: boolean; payload?: Array<{ value: number }>; label?: string }) {
23
- if (!active || !payload || payload.length === 0) return null;
24
- return (
25
- <div className="rounded-lg border border-base-content/8 bg-base-200 px-3 py-2 shadow-lg">
26
- <p className="text-[10px] font-mono text-base-content/50 mb-1">{label}</p>
27
- <p className="text-[11px] font-mono text-base-content">{(payload[0].value * 100).toFixed(1)}%</p>
28
- </div>
29
- );
30
- }
31
-
32
- export function CacheEfficiencyChart({ data }: CacheEfficiencyChartProps) {
33
- const fullscreenHeight = useChartFullscreen();
34
- const colors = getChartColors();
35
- const displayData = data.map(function (d) {
36
- return { date: d.date, rate: d.rate * 100 };
37
- });
38
-
39
- return (
40
- <ResponsiveContainer width="100%" height={fullscreenHeight || 200}>
41
- <AreaChart data={displayData} margin={{ top: 4, right: 4, left: -15, bottom: 0 }}>
42
- <defs>
43
- <linearGradient id="cacheEffGrad" x1="0" y1="0" x2="0" y2="1">
44
- <stop offset="5%" stopColor={colors.success} stopOpacity={0.8} />
45
- <stop offset="95%" stopColor={colors.success} stopOpacity={0.2} />
46
- </linearGradient>
47
- </defs>
48
- <CartesianGrid strokeDasharray="3 3" stroke={colors.gridStroke} vertical={false} />
49
- <XAxis dataKey="date" tick={getTickStyle()} axisLine={false} tickLine={false} />
50
- <YAxis domain={[0, 100]} tick={getTickStyle()} axisLine={false} tickLine={false} tickFormatter={function (v) { return v + "%"; }} />
51
- <Tooltip content={<CustomTooltip />} />
52
- <Area type="monotone" dataKey="rate" stroke={colors.success} fill="url(#cacheEffGrad)" strokeWidth={2} isAnimationActive={false} />
53
- </AreaChart>
54
- </ResponsiveContainer>
55
- );
56
- }