@cryptiklemur/lattice 4.0.2 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +533 -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,139 +0,0 @@
1
- import { ArrowLeft, Palette, FileText, Terminal, Plug, Puzzle, Blocks, Network, Settings, ScrollText, Shield, Brain, MonitorCog, Bell, Wallet } from "lucide-react";
2
- import { useSidebar } from "../../hooks/useSidebar";
3
- import type { SettingsSection, ProjectSettingsSection } from "../../stores/sidebar";
4
-
5
- interface SettingsSidebarProps {
6
- projectName: string;
7
- onBack: () => void;
8
- }
9
-
10
- var SETTINGS_NAV = [
11
- {
12
- group: "",
13
- items: [
14
- { id: "appearance" as SettingsSection, label: "Appearance", icon: <Palette size={14} /> },
15
- { id: "notifications" as SettingsSection, label: "Notifications", icon: <Bell size={14} /> },
16
- ],
17
- },
18
- {
19
- group: "CLAUDE",
20
- items: [
21
- { id: "claude" as SettingsSection, label: "Model & Prompts", icon: <FileText size={14} /> },
22
- { id: "budget" as SettingsSection, label: "Budget", icon: <Wallet size={14} /> },
23
- { id: "environment" as SettingsSection, label: "Environment", icon: <Terminal size={14} /> },
24
- { id: "editor" as SettingsSection, label: "Editor", icon: <MonitorCog size={14} /> },
25
- ],
26
- },
27
- {
28
- group: "EXTENSIONS",
29
- items: [
30
- { id: "plugins" as SettingsSection, label: "Plugins", icon: <Blocks size={14} /> },
31
- { id: "skills" as SettingsSection, label: "Skills", icon: <Puzzle size={14} /> },
32
- { id: "mcp" as SettingsSection, label: "MCP Servers", icon: <Plug size={14} /> },
33
- { id: "rules" as SettingsSection, label: "Rules", icon: <ScrollText size={14} /> },
34
- { id: "memory" as SettingsSection, label: "Memory", icon: <Brain size={14} /> },
35
- ],
36
- },
37
- {
38
- group: "MESH",
39
- items: [
40
- { id: "nodes" as SettingsSection, label: "Nodes", icon: <Network size={14} /> },
41
- ],
42
- },
43
- ];
44
-
45
- var PROJECT_SETTINGS_NAV = [
46
- {
47
- group: "",
48
- items: [
49
- { id: "general" as ProjectSettingsSection, label: "General", icon: <Settings size={14} /> },
50
- { id: "notifications" as ProjectSettingsSection, label: "Notifications", icon: <Bell size={14} /> },
51
- { id: "claude" as ProjectSettingsSection, label: "Claude", icon: <FileText size={14} /> },
52
- { id: "environment" as ProjectSettingsSection, label: "Environment", icon: <Terminal size={14} /> },
53
- ],
54
- },
55
- {
56
- group: "EXTENSIONS",
57
- items: [
58
- { id: "plugins" as ProjectSettingsSection, label: "Plugins", icon: <Blocks size={14} /> },
59
- { id: "skills" as ProjectSettingsSection, label: "Skills", icon: <Puzzle size={14} /> },
60
- { id: "mcp" as ProjectSettingsSection, label: "MCP Servers", icon: <Plug size={14} /> },
61
- { id: "rules" as ProjectSettingsSection, label: "Rules", icon: <ScrollText size={14} /> },
62
- { id: "permissions" as ProjectSettingsSection, label: "Permissions", icon: <Shield size={14} /> },
63
- { id: "memory" as ProjectSettingsSection, label: "Memory", icon: <Brain size={14} /> },
64
- ],
65
- },
66
- ];
67
-
68
- export function SettingsSidebar({ projectName, onBack }: SettingsSidebarProps) {
69
- var { activeView, setSettingsSection, setProjectSettingsSection } = useSidebar();
70
- var isProjectSettings = activeView.type === "project-settings";
71
- var activeSection = activeView.type === "settings"
72
- ? activeView.section
73
- : activeView.type === "project-settings"
74
- ? activeView.section
75
- : null;
76
-
77
- var nav = isProjectSettings ? PROJECT_SETTINGS_NAV : SETTINGS_NAV;
78
- var headerLabel = isProjectSettings ? "Project Settings" : "Settings";
79
-
80
- function handleItemClick(id: string) {
81
- if (isProjectSettings) {
82
- setProjectSettingsSection(id as ProjectSettingsSection);
83
- } else {
84
- setSettingsSection(id as SettingsSection);
85
- }
86
- }
87
-
88
- return (
89
- <div className="flex flex-col h-full w-full overflow-hidden bg-base-200">
90
- <div className="px-4 h-12 border-b border-base-300 flex-shrink-0 flex items-center">
91
- <span className="text-[13px] font-mono font-bold text-base-content">{headerLabel}</span>
92
- </div>
93
-
94
- <div className="flex flex-col flex-1 overflow-y-auto min-h-0 py-2 pb-16">
95
- {nav.map(function (group) {
96
- return (
97
- <div key={group.group || "ungrouped"} className="mb-2">
98
- {group.group && (
99
- <div className="px-4 pt-3 pb-1">
100
- <span className="text-[10px] font-bold tracking-wider uppercase text-base-content/40">
101
- {group.group}
102
- </span>
103
- </div>
104
- )}
105
- {group.items.map(function (item) {
106
- var isActive = activeSection === item.id;
107
- return (
108
- <button
109
- key={item.id}
110
- onClick={function () { handleItemClick(item.id); }}
111
- className={
112
- "w-full flex items-center gap-2.5 px-4 py-2.5 sm:py-1.5 text-[13px] transition-colors duration-[100ms] text-left " +
113
- (isActive
114
- ? "bg-base-content/8 text-base-content font-medium"
115
- : "text-base-content/55 hover:bg-base-content/5 hover:text-base-content")
116
- }
117
- >
118
- {item.icon}
119
- {item.label}
120
- </button>
121
- );
122
- })}
123
- </div>
124
- );
125
- })}
126
- </div>
127
-
128
- <div className="border-t border-base-300 flex-shrink-0">
129
- <button
130
- onClick={onBack}
131
- className="w-full flex items-center gap-2 px-4 py-3.5 sm:py-3 text-[12px] text-base-content/50 hover:text-base-content transition-colors duration-[100ms]"
132
- >
133
- <ArrowLeft size={13} />
134
- Back to {projectName}
135
- </button>
136
- </div>
137
- </div>
138
- );
139
- }
@@ -1,469 +0,0 @@
1
- import { useState, useEffect, useRef } from "react";
2
- import { Plus, ChevronDown, Search, LayoutDashboard, FolderOpen, TerminalSquare, StickyNote, Calendar, BarChart3, Bookmark, Settings, Network } from "lucide-react";
3
- import { LatticeLogomark } from "../ui/LatticeLogomark";
4
- import type { SessionSummary, ServerMessage, SettingsDataMessage } from "#shared";
5
- import type { DateRange } from "./SessionList";
6
- import { useProjects } from "../../hooks/useProjects";
7
- import { useMesh } from "../../hooks/useMesh";
8
- import { useWebSocket } from "../../hooks/useWebSocket";
9
- import { useSidebar } from "../../hooks/useSidebar";
10
- import { useSession } from "../../hooks/useSession";
11
- import { clearSession } from "../../stores/session";
12
- import { useOnline } from "../../hooks/useOnline";
13
- import { openTab, openSessionTab, closeTab, getWorkspaceStore } from "../../stores/workspace";
14
- import { getSidebarStore, goToAnalytics, openSettings } from "../../stores/sidebar";
15
- import { ProjectRail } from "./ProjectRail";
16
- import { SessionList } from "./SessionList";
17
- import { UserIsland } from "./UserIsland";
18
- import { UserMenu } from "./UserMenu";
19
- import { SearchFilter } from "./SearchFilter";
20
- import { ProjectDropdown } from "./ProjectDropdown";
21
- import { SettingsSidebar } from "./SettingsSidebar";
22
-
23
- type DatePreset = "all" | "today" | "yesterday" | "week" | "month" | "custom";
24
-
25
- var DATE_PRESET_LABELS: Record<DatePreset, string> = {
26
- all: "All time",
27
- today: "Today",
28
- yesterday: "Yesterday",
29
- week: "This week",
30
- month: "This month",
31
- custom: "Custom",
32
- };
33
-
34
- function computeDateRange(preset: DatePreset, customFrom?: string, customTo?: string): DateRange {
35
- if (preset === "all") return {};
36
- var now = new Date();
37
- var todayStart = new Date(now);
38
- todayStart.setHours(0, 0, 0, 0);
39
-
40
- if (preset === "today") {
41
- return { from: todayStart.getTime() };
42
- }
43
- if (preset === "yesterday") {
44
- var yesterdayStart = new Date(todayStart);
45
- yesterdayStart.setDate(yesterdayStart.getDate() - 1);
46
- return { from: yesterdayStart.getTime(), to: todayStart.getTime() };
47
- }
48
- if (preset === "week") {
49
- var weekStart = new Date(todayStart);
50
- weekStart.setDate(weekStart.getDate() - weekStart.getDay());
51
- return { from: weekStart.getTime() };
52
- }
53
- if (preset === "month") {
54
- var monthStart = new Date(todayStart.getFullYear(), todayStart.getMonth(), 1);
55
- return { from: monthStart.getTime() };
56
- }
57
- if (preset === "custom") {
58
- var range: DateRange = {};
59
- if (customFrom) {
60
- range.from = new Date(customFrom + "T00:00:00").getTime();
61
- }
62
- if (customTo) {
63
- var toDate = new Date(customTo + "T23:59:59");
64
- range.to = toDate.getTime() + 999;
65
- }
66
- return range;
67
- }
68
- return {};
69
- }
70
-
71
- function DateRangeDropdown({ dateRange, onChange }: { dateRange: DateRange; onChange: (r: DateRange, preset: DatePreset) => void }) {
72
- var [open, setOpen] = useState(false);
73
- var [preset, setPreset] = useState<DatePreset>("all");
74
- var [customFrom, setCustomFrom] = useState("");
75
- var [customTo, setCustomTo] = useState("");
76
- var dropdownRef = useRef<HTMLDivElement>(null);
77
-
78
- useEffect(function () {
79
- if (!open) return;
80
- function dismiss(e: MouseEvent) {
81
- if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node)) {
82
- setOpen(false);
83
- }
84
- }
85
- document.addEventListener("mousedown", dismiss);
86
- return function () { document.removeEventListener("mousedown", dismiss); };
87
- }, [open]);
88
-
89
- function handlePreset(p: DatePreset) {
90
- setPreset(p);
91
- if (p !== "custom") {
92
- onChange(computeDateRange(p), p);
93
- setOpen(false);
94
- }
95
- }
96
-
97
- function handleCustomApply() {
98
- onChange(computeDateRange("custom", customFrom, customTo), "custom");
99
- setOpen(false);
100
- }
101
-
102
- var hasFilter = preset !== "all";
103
-
104
- return (
105
- <div ref={dropdownRef} className="relative">
106
- <button
107
- type="button"
108
- onClick={function () { setOpen(function (v) { return !v; }); }}
109
- className={"btn btn-ghost btn-xs btn-square " + (hasFilter ? "text-primary" : "text-base-content/40 hover:text-base-content")}
110
- aria-label="Filter by date"
111
- title={DATE_PRESET_LABELS[preset]}
112
- >
113
- <Calendar size={13} />
114
- </button>
115
- {open && (
116
- <div className="absolute top-full right-0 mt-1 z-[9999] bg-base-300 border border-base-content/15 rounded-lg shadow-xl min-w-[180px] py-1">
117
- {(["all", "today", "yesterday", "week", "month", "custom"] as DatePreset[]).map(function (p) {
118
- return (
119
- <button
120
- key={p}
121
- type="button"
122
- onClick={function () { handlePreset(p); }}
123
- className={
124
- "block w-full text-left px-3 py-1.5 text-[12px] transition-colors duration-75 " +
125
- (preset === p ? "text-primary bg-primary/10" : "text-base-content/70 hover:bg-base-content/5 hover:text-base-content")
126
- }
127
- >
128
- {DATE_PRESET_LABELS[p]}
129
- </button>
130
- );
131
- })}
132
- {preset === "custom" && (
133
- <div className="px-3 py-2 border-t border-base-content/10 flex flex-col gap-1.5">
134
- <label className="text-[10px] text-base-content/40 uppercase tracking-wider">From</label>
135
- <input
136
- type="date"
137
- value={customFrom}
138
- onChange={function (e) { setCustomFrom(e.target.value); }}
139
- className="h-7 px-2 bg-base-200 border border-base-content/15 rounded text-base-content text-[12px] focus:border-primary focus-visible:outline-none transition-colors [color-scheme:dark]"
140
- />
141
- <label className="text-[10px] text-base-content/40 uppercase tracking-wider">To</label>
142
- <input
143
- type="date"
144
- value={customTo}
145
- onChange={function (e) { setCustomTo(e.target.value); }}
146
- className="h-7 px-2 bg-base-200 border border-base-content/15 rounded text-base-content text-[12px] focus:border-primary focus-visible:outline-none transition-colors [color-scheme:dark]"
147
- />
148
- <button
149
- type="button"
150
- onClick={handleCustomApply}
151
- className="btn btn-xs btn-primary mt-1"
152
- >
153
- Apply
154
- </button>
155
- </div>
156
- )}
157
- </div>
158
- )}
159
- </div>
160
- );
161
- }
162
-
163
- function SectionLabel({ label, actions }: { label: string; actions?: React.ReactNode }) {
164
- return (
165
- <div className="px-4 pt-4 pb-2 flex items-center justify-between flex-shrink-0 select-none">
166
- <h2 className="text-xs font-bold tracking-wider uppercase text-base-content/40">
167
- {label}
168
- </h2>
169
- {actions && (
170
- <div className="flex items-center gap-0.5">
171
- {actions}
172
- </div>
173
- )}
174
- </div>
175
- );
176
- }
177
-
178
- export function Sidebar({ onSessionSelect }: { onSessionSelect?: () => void }) {
179
- var { projects, activeProject } = useProjects();
180
- var { nodes } = useMesh();
181
- var ws = useWebSocket();
182
- var online = useOnline();
183
- var sidebar = useSidebar();
184
- var session = useSession();
185
- var [sessionSearch, setSessionSearch] = useState<string>("");
186
- var [sessionSearchOpen, setSessionSearchOpen] = useState<boolean>(false);
187
- var [sessionDateRange, setSessionDateRange] = useState<DateRange>({});
188
- var userIslandRef = useRef<HTMLElement | null>(null);
189
- var projectHeaderRef = useRef<HTMLElement | null>(null);
190
-
191
- var localNode = nodes.find(function (n) { return n.isLocal; });
192
- var [configNodeName, setConfigNodeName] = useState("");
193
-
194
- useEffect(function () {
195
- function handleSettingsData(msg: ServerMessage) {
196
- if (msg.type !== "settings:data") return;
197
- var data = msg as SettingsDataMessage;
198
- if (data.config.name) {
199
- setConfigNodeName(data.config.name);
200
- }
201
- }
202
- ws.subscribe("settings:data", handleSettingsData);
203
- ws.send({ type: "settings:get" });
204
- return function () {
205
- ws.unsubscribe("settings:data", handleSettingsData);
206
- };
207
- }, []);
208
-
209
- var localNodeName = localNode ? localNode.name : configNodeName;
210
- var initialActivatedRef = useRef<boolean>(false);
211
-
212
- useEffect(function () {
213
- if (initialActivatedRef.current) return;
214
- if (!sidebar.activeProjectSlug || !sidebar.activeSessionId) return;
215
- if (!activeProject) return;
216
- initialActivatedRef.current = true;
217
- const wsState = getWorkspaceStore().state;
218
- const alreadyHasTab = wsState.tabs.some(function (t) {
219
- return t.type === "chat" && t.sessionId === sidebar.activeSessionId;
220
- });
221
- if (!alreadyHasTab) {
222
- openSessionTab(sidebar.activeSessionId, sidebar.activeProjectSlug, "Session");
223
- }
224
- session.activateSession(sidebar.activeProjectSlug, sidebar.activeSessionId);
225
- }, [sidebar.activeProjectSlug, sidebar.activeSessionId, activeProject]);
226
-
227
- // Ctrl/Cmd+K is handled by the global CommandPalette
228
-
229
- function handleSessionActivate(s: SessionSummary) {
230
- if (activeProject) {
231
- openSessionTab(s.id, activeProject.slug, s.title);
232
- session.activateSession(activeProject.slug, s.id);
233
- }
234
- sidebar.closeMenus();
235
- if (onSessionSelect) {
236
- onSessionSelect();
237
- }
238
- }
239
-
240
- function handleNewSession() {
241
- if (!activeProject?.slug) {
242
- return;
243
- }
244
- ws.send({ type: "session:create", projectSlug: activeProject.slug });
245
- }
246
-
247
- return (
248
- <div className="flex flex-row h-full w-full overflow-hidden relative">
249
- <ProjectRail
250
- projects={projects}
251
- nodes={nodes}
252
- activeProjectSlug={sidebar.activeProjectSlug}
253
- onSelectProject={sidebar.setActiveProjectSlug}
254
- onDashboardClick={sidebar.goToDashboard}
255
- isDashboardActive={sidebar.activeView.type === "dashboard"}
256
- dimmed={sidebar.sidebarMode === "settings"}
257
- />
258
- <div className="flex flex-col flex-1 overflow-hidden min-h-0 bg-base-200 border-r border-base-300">
259
- {sidebar.sidebarMode === "project" ? (
260
- <>
261
- {(sidebar.activeView.type === "dashboard" || (sidebar.activeView.type === "analytics" && !sidebar.activeProjectSlug)) ? (
262
- <>
263
- <div className="px-4 h-12 border-b border-base-300 flex-shrink-0 flex items-center gap-2">
264
- <LatticeLogomark size={18} />
265
- <span className="text-[13px] font-mono font-bold text-base-content/90">
266
- Lattice
267
- </span>
268
- </div>
269
- <div className="flex-1 overflow-auto px-4 py-3 pb-16">
270
- <div className="flex flex-col gap-0.5 mb-3">
271
- <button
272
- type="button"
273
- onClick={function () {
274
- var store = getWorkspaceStore();
275
- var state = store.state;
276
- var activePane = state.panes.find(function (p) { return p.id === state.activePaneId; });
277
- var activeTab = activePane ? state.tabs.find(function (t) { return t.id === activePane!.activeTabId; }) : null;
278
- if (activeTab && activeTab.id !== "chat") {
279
- closeTab(activeTab.id);
280
- }
281
- }}
282
- className="flex items-center gap-2 w-full px-2 py-1.5 rounded-lg text-[11px] text-base-content/40 hover:text-base-content/70 hover:bg-base-300/30 transition-colors"
283
- >
284
- <LayoutDashboard size={12} />
285
- <span className="font-mono tracking-wide">Dashboard</span>
286
- </button>
287
- <button
288
- type="button"
289
- onClick={goToAnalytics}
290
- className="flex items-center gap-2 w-full px-2 py-1.5 rounded-lg text-[11px] text-base-content/40 hover:text-base-content/70 hover:bg-base-300/30 transition-colors"
291
- >
292
- <BarChart3 size={12} />
293
- <span className="font-mono tracking-wide">Global Analytics</span>
294
- </button>
295
- <button
296
- type="button"
297
- onClick={function () { openSettings("nodes"); }}
298
- className="flex items-center gap-2 w-full px-2 py-1.5 rounded-lg text-[11px] text-base-content/40 hover:text-base-content/70 hover:bg-base-300/30 transition-colors"
299
- >
300
- <Network size={12} />
301
- <span className="font-mono tracking-wide">Nodes</span>
302
- </button>
303
- <button
304
- type="button"
305
- onClick={function () { openSettings("appearance"); }}
306
- className="flex items-center gap-2 w-full px-2 py-1.5 rounded-lg text-[11px] text-base-content/40 hover:text-base-content/70 hover:bg-base-300/30 transition-colors"
307
- >
308
- <Settings size={12} />
309
- <span className="font-mono tracking-wide">Settings</span>
310
- </button>
311
- </div>
312
- <SectionLabel label="Projects" />
313
- {projects.length === 0 && nodes.some(function (n) { return !n.isLocal && n.online; }) ? (
314
- <div className="flex items-center gap-2 text-[12px] text-base-content/25 px-4">
315
- <span className="w-1.5 h-1.5 rounded-full bg-base-content/30 animate-pulse flex-shrink-0" />
316
- Syncing remote projects...
317
- </div>
318
- ) : (
319
- <div className="text-[12px] text-base-content/25 px-4">
320
- Select a project from the rail to view sessions.
321
- </div>
322
- )}
323
- </div>
324
- </>
325
- ) : (
326
- <>
327
- <button
328
- type="button"
329
- ref={function (el) { projectHeaderRef.current = el; }}
330
- onClick={sidebar.toggleProjectDropdown}
331
- aria-label="Switch project"
332
- aria-expanded={sidebar.projectDropdownOpen}
333
- className={"w-full px-4 border-b border-base-300 flex-shrink-0 flex items-center justify-between cursor-pointer hover:bg-base-300/30 transition-colors text-left " + (activeProject?.isRemote ? "h-14 py-2" : "h-12 py-2.5")}
334
- >
335
- <div className="min-w-0">
336
- <div className="text-[13px] font-mono font-bold text-base-content/90 truncate">
337
- {activeProject?.title ?? (projects.length === 0 ? "Loading..." : "No Project")}
338
- </div>
339
- {activeProject?.isRemote && (
340
- <div className="text-[10px] text-base-content/30 font-mono">
341
- on {activeProject.nodeName}
342
- </div>
343
- )}
344
- </div>
345
- <ChevronDown size={14} className="text-base-content/30 flex-shrink-0" />
346
- </button>
347
-
348
- <button
349
- type="button"
350
- onClick={function () { sidebar.goToProjectDashboard(); }}
351
- className="flex items-center gap-2 mx-3 mt-2 px-2 py-1.5 rounded-lg text-[11px] text-base-content/40 hover:text-base-content/70 hover:bg-base-300/30 transition-colors"
352
- >
353
- <LayoutDashboard size={12} />
354
- <span className="font-mono tracking-wide">Dashboard</span>
355
- </button>
356
-
357
- <div className="flex flex-col gap-0.5 mx-3 mt-1">
358
- {[
359
- { type: "files" as const, icon: FolderOpen, label: "Files", localOnly: true },
360
- { type: "terminal" as const, icon: TerminalSquare, label: "Terminal", localOnly: true },
361
- { type: "notes" as const, icon: StickyNote, label: "Notes", localOnly: false },
362
- ].map(function (item) {
363
- var isDisabled = item.localOnly && activeProject?.isRemote;
364
- return (
365
- <button
366
- key={item.type}
367
- type="button"
368
- disabled={!!isDisabled}
369
- onClick={function () {
370
- if (isDisabled) return;
371
- openTab(item.type);
372
- var state = getSidebarStore().state;
373
- if (state.activeView.type !== "chat") {
374
- getSidebarStore().setState(function (s) {
375
- return { ...s, activeView: { type: "chat" } };
376
- });
377
- }
378
- }}
379
- className={
380
- "flex items-center gap-2 px-2 py-1.5 rounded-lg text-[11px] transition-colors " +
381
- (isDisabled
382
- ? "text-base-content/15 cursor-not-allowed"
383
- : "text-base-content/40 hover:text-base-content/70 hover:bg-base-300/30")
384
- }
385
- title={isDisabled ? "Not available for remote projects" : undefined}
386
- >
387
- <item.icon size={12} />
388
- <span className="font-mono tracking-wide">{item.label}</span>
389
- </button>
390
- );
391
- })}
392
- <button
393
- type="button"
394
- onClick={function () { openTab("analytics"); }}
395
- className="flex items-center gap-2 px-2 py-1.5 rounded-lg text-[11px] text-base-content/40 hover:text-base-content/70 hover:bg-base-300/30 transition-colors"
396
- >
397
- <BarChart3 size={12} />
398
- <span className="font-mono tracking-wide">Analytics</span>
399
- </button>
400
- </div>
401
-
402
- <SectionLabel
403
- label="Sessions"
404
- actions={
405
- <>
406
- <button onClick={function () { setSessionSearchOpen(function (v) { return !v; }); }} className="btn btn-ghost btn-xs btn-square text-base-content/40 hover:text-base-content" aria-label="Search sessions">
407
- <Search size={13} />
408
- </button>
409
- <DateRangeDropdown
410
- dateRange={sessionDateRange}
411
- onChange={function (r) { setSessionDateRange(r); }}
412
- />
413
- <button onClick={handleNewSession} disabled={!online} className="btn btn-ghost btn-xs btn-square text-base-content/40 hover:text-base-content" aria-label="New session">
414
- <Plus size={13} />
415
- </button>
416
- </>
417
- }
418
- />
419
- {sessionSearchOpen && (
420
- <SearchFilter
421
- value={sessionSearch}
422
- onChange={setSessionSearch}
423
- onClose={function () { setSessionSearchOpen(false); setSessionSearch(""); }}
424
- placeholder="Filter sessions..."
425
- />
426
- )}
427
- <SessionList
428
- projectSlug={activeProject?.slug ?? null}
429
- activeSessionId={session.activeSessionId}
430
- onSessionActivate={handleSessionActivate}
431
- onSessionDeactivate={clearSession}
432
- filter={sessionSearch}
433
- dateRange={sessionDateRange}
434
- />
435
- </>
436
- )}
437
-
438
- </>
439
- ) : (
440
- <SettingsSidebar
441
- projectName={activeProject?.title ?? "Dashboard"}
442
- onBack={sidebar.exitSettings}
443
- />
444
- )}
445
- </div>
446
-
447
- <div
448
- ref={function (el) { userIslandRef.current = el; }}
449
- className="absolute bottom-2 left-2 right-2 z-10 bg-base-300 border border-base-content/15 rounded-xl shadow-lg"
450
- >
451
- <UserIsland nodeName={localNodeName} onClick={sidebar.toggleUserMenu} />
452
- </div>
453
-
454
- {sidebar.userMenuOpen && (
455
- <UserMenu
456
- anchorRef={userIslandRef}
457
- onClose={sidebar.closeMenus}
458
- onOpenNodeSettings={sidebar.openNodeSettings}
459
- />
460
- )}
461
- {sidebar.projectDropdownOpen && (
462
- <ProjectDropdown
463
- anchorRef={projectHeaderRef}
464
- onClose={sidebar.closeMenus}
465
- />
466
- )}
467
- </div>
468
- );
469
- }