@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,211 +0,0 @@
1
- import React, { useEffect, useRef } from "react";
2
- import { createPortal } from "react-dom";
3
- import {
4
- Settings, FileText, Terminal, ScrollText, Shield, Brain,
5
- Plug, Puzzle, ExternalLink, Copy, Check, FolderOpen,
6
- } from "lucide-react";
7
- import { useProjects } from "../../hooks/useProjects";
8
- import { useSidebar } from "../../hooks/useSidebar";
9
- import { useEditorConfig } from "../../hooks/useEditorConfig";
10
- import { getEditorUrl, isJetBrainsEditor } from "../../utils/editorUrl";
11
- import { useWebSocket } from "../../hooks/useWebSocket";
12
- import { openTab } from "../../stores/workspace";
13
- import { getSidebarStore } from "../../stores/sidebar";
14
- import { useState } from "react";
15
-
16
- interface ProjectDropdownProps {
17
- anchorRef: React.RefObject<HTMLElement | null>;
18
- onClose: () => void;
19
- }
20
-
21
- export function ProjectDropdown(props: ProjectDropdownProps) {
22
- var menuRef = useRef<HTMLDivElement>(null);
23
- var { activeProject } = useProjects();
24
- var sidebar = useSidebar();
25
- var { editorType, wslDistro } = useEditorConfig();
26
- var [copied, setCopied] = useState(false);
27
-
28
- useEffect(function () {
29
- function handleClickOutside(e: MouseEvent) {
30
- if (
31
- menuRef.current &&
32
- !menuRef.current.contains(e.target as Node) &&
33
- props.anchorRef.current &&
34
- !props.anchorRef.current.contains(e.target as Node)
35
- ) {
36
- props.onClose();
37
- }
38
- }
39
- function handleEscape(e: KeyboardEvent) {
40
- if (e.key === "Escape") {
41
- props.onClose();
42
- }
43
- }
44
- document.addEventListener("mousedown", handleClickOutside);
45
- document.addEventListener("keydown", handleEscape);
46
- return function () {
47
- document.removeEventListener("mousedown", handleClickOutside);
48
- document.removeEventListener("keydown", handleEscape);
49
- };
50
- }, [props.onClose, props.anchorRef]);
51
-
52
- var style: React.CSSProperties = {};
53
- if (props.anchorRef.current) {
54
- var rect = props.anchorRef.current.getBoundingClientRect();
55
- style.top = rect.bottom + 4 + "px";
56
- style.left = rect.left + "px";
57
- style.width = Math.max(rect.width, 240) + "px";
58
- }
59
-
60
- function goToSettings(section: string) {
61
- sidebar.openProjectSettings(section as any);
62
- props.onClose();
63
- }
64
-
65
- function handleCopyPath() {
66
- if (activeProject) {
67
- navigator.clipboard.writeText(activeProject.path || "");
68
- setCopied(true);
69
- setTimeout(function () { setCopied(false); }, 1500);
70
- }
71
- }
72
-
73
- var ws = useWebSocket();
74
- var ideUrl = activeProject ? getEditorUrl(editorType, activeProject.path, ".", undefined, wslDistro, activeProject.ideProjectName) : null;
75
-
76
- function handleOpenInIde() {
77
- if (!activeProject || !ideUrl) return;
78
- if (isJetBrainsEditor(editorType) && !activeProject.ideProjectName) {
79
- var handler = function (msg: { type: string; projectSlug?: string; ideProjectName?: string }) {
80
- if (msg.type !== "editor:ensure-project_result") return;
81
- if (msg.projectSlug !== activeProject!.slug) return;
82
- ws.unsubscribe("editor:ensure-project_result", handler as any);
83
- var updatedUrl = getEditorUrl(editorType, activeProject!.path, ".", undefined, wslDistro, msg.ideProjectName);
84
- if (updatedUrl) window.location.href = updatedUrl;
85
- };
86
- ws.subscribe("editor:ensure-project_result", handler as any);
87
- ws.send({ type: "editor:ensure-project", projectSlug: activeProject.slug } as any);
88
- } else {
89
- window.location.href = ideUrl;
90
- }
91
- props.onClose();
92
- }
93
-
94
- function handleOpenTerminal() {
95
- openTab("terminal");
96
- var state = getSidebarStore().state;
97
- if (state.activeView.type !== "chat") {
98
- getSidebarStore().setState(function (s) {
99
- return { ...s, activeView: { type: "chat" } };
100
- });
101
- }
102
- props.onClose();
103
- }
104
-
105
- function handleViewClaudeMd() {
106
- openTab("files");
107
- var state = getSidebarStore().state;
108
- if (state.activeView.type !== "chat") {
109
- getSidebarStore().setState(function (s) {
110
- return { ...s, activeView: { type: "chat" } };
111
- });
112
- }
113
- props.onClose();
114
- }
115
-
116
- if (!activeProject) return null;
117
-
118
- return createPortal(
119
- <div
120
- ref={menuRef}
121
- role="menu"
122
- aria-label="Project actions"
123
- className="fixed z-[9999] bg-base-300 border border-base-content/15 rounded-xl shadow-2xl overflow-hidden"
124
- style={style}
125
- >
126
- <div className="px-3 py-2.5 border-b border-base-content/10">
127
- <div className="text-[13px] font-mono font-bold text-base-content truncate">{activeProject.title}</div>
128
- <div className="text-[10px] text-base-content/30 truncate mt-0.5">{activeProject.path}</div>
129
- </div>
130
-
131
- <div className="px-1.5 py-1.5">
132
- <div className="px-2 pt-1.5 pb-1 text-[10px] font-semibold uppercase tracking-wider text-base-content/25">
133
- Actions
134
- </div>
135
- {ideUrl && (
136
- <button
137
- role="menuitem"
138
- onClick={handleOpenInIde}
139
- className="w-full flex items-center gap-2.5 px-2.5 py-1.5 rounded-lg text-[12px] text-base-content/60 hover:text-base-content hover:bg-base-content/5 transition-colors cursor-pointer"
140
- >
141
- <ExternalLink size={13} className="flex-shrink-0 text-base-content/30" />
142
- Open in IDE
143
- </button>
144
- )}
145
- <button
146
- role="menuitem"
147
- onClick={handleOpenTerminal}
148
- className="w-full flex items-center gap-2.5 px-2.5 py-1.5 rounded-lg text-[12px] text-base-content/60 hover:text-base-content hover:bg-base-content/5 transition-colors"
149
- >
150
- <Terminal size={13} className="flex-shrink-0 text-base-content/30" />
151
- Open terminal
152
- </button>
153
- <button
154
- role="menuitem"
155
- onClick={handleViewClaudeMd}
156
- className="w-full flex items-center gap-2.5 px-2.5 py-1.5 rounded-lg text-[12px] text-base-content/60 hover:text-base-content hover:bg-base-content/5 transition-colors"
157
- >
158
- <FolderOpen size={13} className="flex-shrink-0 text-base-content/30" />
159
- Browse files
160
- </button>
161
- <button
162
- role="menuitem"
163
- onClick={handleCopyPath}
164
- className="w-full flex items-center gap-2.5 px-2.5 py-1.5 rounded-lg text-[12px] text-base-content/60 hover:text-base-content hover:bg-base-content/5 transition-colors"
165
- >
166
- {copied ? (
167
- <Check size={13} className="flex-shrink-0 text-success" />
168
- ) : (
169
- <Copy size={13} className="flex-shrink-0 text-base-content/30" />
170
- )}
171
- {copied ? "Copied!" : "Copy path"}
172
- </button>
173
- </div>
174
-
175
- <div className="px-1.5 py-1.5 border-t border-base-content/10">
176
- <div className="px-2 pt-1.5 pb-1 text-[10px] font-semibold uppercase tracking-wider text-base-content/25">
177
- Settings
178
- </div>
179
- <button role="menuitem" onClick={function () { goToSettings("general"); }} className="w-full flex items-center gap-2.5 px-2.5 py-1.5 rounded-lg text-[12px] text-base-content/60 hover:text-base-content hover:bg-base-content/5 transition-colors">
180
- <Settings size={13} className="flex-shrink-0 text-base-content/30" />
181
- General
182
- </button>
183
- <button role="menuitem" onClick={function () { goToSettings("claude"); }} className="w-full flex items-center gap-2.5 px-2.5 py-1.5 rounded-lg text-[12px] text-base-content/60 hover:text-base-content hover:bg-base-content/5 transition-colors">
184
- <FileText size={13} className="flex-shrink-0 text-base-content/30" />
185
- Claude
186
- </button>
187
- <button role="menuitem" onClick={function () { goToSettings("mcp"); }} className="w-full flex items-center gap-2.5 px-2.5 py-1.5 rounded-lg text-[12px] text-base-content/60 hover:text-base-content hover:bg-base-content/5 transition-colors">
188
- <Plug size={13} className="flex-shrink-0 text-base-content/30" />
189
- MCP Servers
190
- </button>
191
- <button role="menuitem" onClick={function () { goToSettings("skills"); }} className="w-full flex items-center gap-2.5 px-2.5 py-1.5 rounded-lg text-[12px] text-base-content/60 hover:text-base-content hover:bg-base-content/5 transition-colors">
192
- <Puzzle size={13} className="flex-shrink-0 text-base-content/30" />
193
- Skills
194
- </button>
195
- <button role="menuitem" onClick={function () { goToSettings("rules"); }} className="w-full flex items-center gap-2.5 px-2.5 py-1.5 rounded-lg text-[12px] text-base-content/60 hover:text-base-content hover:bg-base-content/5 transition-colors">
196
- <ScrollText size={13} className="flex-shrink-0 text-base-content/30" />
197
- Rules
198
- </button>
199
- <button role="menuitem" onClick={function () { goToSettings("permissions"); }} className="w-full flex items-center gap-2.5 px-2.5 py-1.5 rounded-lg text-[12px] text-base-content/60 hover:text-base-content hover:bg-base-content/5 transition-colors">
200
- <Shield size={13} className="flex-shrink-0 text-base-content/30" />
201
- Permissions
202
- </button>
203
- <button role="menuitem" onClick={function () { goToSettings("memory"); }} className="w-full flex items-center gap-2.5 px-2.5 py-1.5 rounded-lg text-[12px] text-base-content/60 hover:text-base-content hover:bg-base-content/5 transition-colors">
204
- <Brain size={13} className="flex-shrink-0 text-base-content/30" />
205
- Memory
206
- </button>
207
- </div>
208
- </div>,
209
- document.body
210
- );
211
- }
@@ -1,353 +0,0 @@
1
- import { useState } from "react";
2
- import { createPortal } from "react-dom";
3
- import { Plus, Settings, PlusCircle, Trash2, Unplug, RefreshCw } from "lucide-react";
4
- import type { ProjectInfo, NodeInfo } from "#shared";
5
- import { LatticeLogomark } from "../ui/LatticeLogomark";
6
- import { useWebSocket } from "../../hooks/useWebSocket";
7
- import { useSidebar } from "../../hooks/useSidebar";
8
- import { ContextMenu, useContextMenu } from "../ui/ContextMenu";
9
- import type { ContextMenuEntry } from "../ui/ContextMenu";
10
-
11
- function getProjectInitials(title: string): string {
12
- var words = title.trim().split(/[\s\-_]+/);
13
- if (words.length >= 3) {
14
- return (words[0][0] + words[1][0] + words[2][0]).toUpperCase();
15
- }
16
- if (words.length === 2) {
17
- return (words[0][0] + words[1][0]).toUpperCase();
18
- }
19
- return title.slice(0, 3).toUpperCase();
20
- }
21
-
22
- interface ProjectGroup {
23
- slug: string;
24
- title: string;
25
- activeSessions: number;
26
- nodes: Array<{ nodeId: string; nodeName: string; online: boolean; path: string }>;
27
- }
28
-
29
- function groupProjectsBySlug(projects: ProjectInfo[], nodes: NodeInfo[]): ProjectGroup[] {
30
- var groups = new Map<string, ProjectGroup>();
31
- for (var i = 0; i < projects.length; i++) {
32
- var p = projects[i];
33
- var existing = groups.get(p.slug);
34
- var node = nodes.find(function (n) { return n.id === p.nodeId; });
35
- var nodeEntry = {
36
- nodeId: p.nodeId,
37
- nodeName: p.nodeName,
38
- online: node ? node.online : (p.online ?? !p.isRemote),
39
- path: p.path,
40
- };
41
- if (existing) {
42
- existing.nodes.push(nodeEntry);
43
- existing.activeSessions += p.activeSessions ?? 0;
44
- } else {
45
- groups.set(p.slug, { slug: p.slug, title: p.title, activeSessions: p.activeSessions ?? 0, nodes: [nodeEntry] });
46
- }
47
- }
48
- return Array.from(groups.values());
49
- }
50
-
51
- interface ProjectButtonProps {
52
- group: ProjectGroup;
53
- isActive: boolean;
54
- onClick: () => void;
55
- onContextMenu: (e: React.MouseEvent, slug: string) => void;
56
- }
57
-
58
- function ProjectButton(props: ProjectButtonProps) {
59
- var [hovered, setHovered] = useState(false);
60
- var [tooltipTop, setTooltipTop] = useState(0);
61
- var initials = getProjectInitials(props.group.title);
62
-
63
- return (
64
- <div className="relative flex items-center">
65
- {props.isActive && (
66
- <div
67
- className="absolute -left-3 w-[3px] bg-base-content rounded-r-full pointer-events-none"
68
- style={{ height: "32px", top: "50%", transform: "translateY(-50%)" }}
69
- />
70
- )}
71
-
72
- <button
73
- onClick={props.onClick}
74
- onContextMenu={function (e) {
75
- e.preventDefault();
76
- props.onContextMenu(e, props.group.slug);
77
- }}
78
- onMouseEnter={function (e) {
79
- var rect = e.currentTarget.getBoundingClientRect();
80
- setTooltipTop(rect.top + rect.height / 2);
81
- setHovered(true);
82
- }}
83
- onMouseLeave={function () { setHovered(false); }}
84
- className={
85
- "w-[42px] h-[42px] flex items-center justify-center text-[11px] font-bold tracking-[0.03em] cursor-pointer transition-all duration-[120ms] flex-shrink-0 " +
86
- (props.isActive
87
- ? "rounded-xl bg-base-content/10 text-base-content ring-1 ring-base-content/20"
88
- : hovered
89
- ? "rounded-xl bg-base-200 text-base-content/60"
90
- : "rounded-full bg-base-200 text-base-content/40")
91
- }
92
- >
93
- {initials}
94
- </button>
95
-
96
- {props.group.activeSessions > 0 && (
97
- <div className="absolute -top-0.5 -right-0.5 min-w-[14px] h-[14px] rounded-full bg-success/80 text-success-content text-[8px] font-bold flex items-center justify-center pointer-events-none px-0.5">
98
- {props.group.activeSessions}
99
- </div>
100
- )}
101
-
102
- <div className="absolute bottom-0 right-0 flex gap-[2px] pointer-events-none">
103
- {props.group.nodes.map(function (n) {
104
- return (
105
- <div
106
- key={n.nodeId}
107
- className={
108
- "w-[8px] h-[8px] rounded-full border border-base-100 " +
109
- (n.online ? "bg-success/70" : "bg-base-content/20")
110
- }
111
- />
112
- );
113
- })}
114
- </div>
115
-
116
- {hovered && createPortal(
117
- <div
118
- className="pointer-events-none z-[99999] bg-base-300 border border-base-content/20 rounded-lg px-2.5 py-1.5 shadow-xl"
119
- style={{
120
- position: "fixed",
121
- left: "calc(64px + 8px)",
122
- top: tooltipTop + "px",
123
- transform: "translateY(-50%)",
124
- }}
125
- >
126
- <div className="text-[12px] font-bold text-base-content whitespace-nowrap">{props.group.title}</div>
127
- {props.group.nodes.map(function (n) {
128
- return (
129
- <div key={n.nodeId} className="flex items-center gap-1.5 mt-0.5">
130
- <div className={"w-[6px] h-[6px] rounded-full flex-shrink-0 " + (n.online ? "bg-success" : "bg-error")} />
131
- <span className="text-[10px] text-base-content/50 whitespace-nowrap">
132
- {n.nodeName}
133
- {n.path ? " \u00B7 " + n.path : ""}
134
- </span>
135
- </div>
136
- );
137
- })}
138
- </div>,
139
- document.body
140
- )}
141
- </div>
142
- );
143
- }
144
-
145
- function NodeIndicator({ node, onContextMenu }: { node: NodeInfo; onContextMenu: (e: React.MouseEvent, node: NodeInfo) => void }) {
146
- var [hovered, setHovered] = useState(false);
147
- var [tooltipTop, setTooltipTop] = useState(0);
148
- var sidebar = useSidebar();
149
- var initial = node.name.charAt(0).toUpperCase();
150
-
151
- return (
152
- <div className="relative flex items-center">
153
- <button
154
- onClick={function () { sidebar.openSettings("nodes"); }}
155
- onContextMenu={function (e) { e.preventDefault(); onContextMenu(e, node); }}
156
- onMouseEnter={function (e) {
157
- var rect = e.currentTarget.getBoundingClientRect();
158
- setTooltipTop(rect.top + rect.height / 2);
159
- setHovered(true);
160
- }}
161
- onMouseLeave={function () { setHovered(false); }}
162
- className={
163
- "w-[26px] h-[26px] flex items-center justify-center text-[9px] font-semibold rounded-full cursor-pointer transition-all duration-[120ms] flex-shrink-0 border " +
164
- (node.online
165
- ? "border-success/30 bg-base-200/60 text-base-content/40 hover:bg-base-200"
166
- : "border-base-content/10 bg-base-200/30 text-base-content/20 hover:bg-base-200/40")
167
- }
168
- >
169
- {initial}
170
- </button>
171
- {hovered && createPortal(
172
- <div
173
- className="pointer-events-none z-[99999] bg-base-300 border border-base-content/20 rounded-lg px-2.5 py-1.5 shadow-xl"
174
- style={{
175
- position: "fixed",
176
- left: "calc(64px + 8px)",
177
- top: tooltipTop + "px",
178
- transform: "translateY(-50%)",
179
- }}
180
- >
181
- <div className="flex items-center gap-1.5">
182
- <div className={"w-[6px] h-[6px] rounded-full flex-shrink-0 " + (node.online ? "bg-success" : "bg-error")} />
183
- <span className="text-[12px] font-bold text-base-content whitespace-nowrap">{node.name}</span>
184
- </div>
185
- {node.addresses && node.addresses.length > 0 && (
186
- <div className="text-[10px] text-base-content/40 mt-0.5 whitespace-nowrap">
187
- {node.addresses[0]}
188
- </div>
189
- )}
190
- <div className="text-[10px] text-base-content/30 mt-0.5">
191
- {node.projects.length} project{node.projects.length !== 1 ? "s" : ""}
192
- </div>
193
- </div>,
194
- document.body
195
- )}
196
- </div>
197
- );
198
- }
199
-
200
- interface ProjectRailProps {
201
- projects: ProjectInfo[];
202
- nodes: NodeInfo[];
203
- activeProjectSlug: string | null;
204
- onSelectProject: (slug: string) => void;
205
- onDashboardClick: () => void;
206
- isDashboardActive: boolean;
207
- dimmed?: boolean;
208
- }
209
-
210
- export function ProjectRail(props: ProjectRailProps) {
211
- var ws = useWebSocket();
212
- var sidebar = useSidebar();
213
- var groups = groupProjectsBySlug(props.projects, props.nodes);
214
- var localNode = props.nodes.find(function (n) { return n.isLocal; });
215
- var remoteNodes = props.nodes.filter(function (n) { return !n.isLocal; });
216
- var allMeshNodes = localNode ? [localNode].concat(remoteNodes) : remoteNodes;
217
- var projectCtx = useContextMenu<string>();
218
- var nodeCtx = useContextMenu<NodeInfo>();
219
-
220
- function handleNodeContextMenu(e: React.MouseEvent, node: NodeInfo) {
221
- nodeCtx.open(e, node);
222
- }
223
-
224
- function handleContextMenu(e: React.MouseEvent, slug: string) {
225
- projectCtx.open(e, slug);
226
- }
227
-
228
- return (
229
- <div
230
- className={
231
- "w-16 flex-shrink-0 flex flex-col items-center pt-3 pb-16 gap-2 bg-base-100 border-r border-base-300 overflow-y-auto overflow-x-hidden scrollbar-hidden " +
232
- (props.dimmed ? "opacity-60" : "")
233
- }
234
- >
235
- <div className="relative flex items-center">
236
- {props.isDashboardActive && (
237
- <div
238
- className="absolute -left-3 w-[3px] bg-base-content rounded-r-full pointer-events-none"
239
- style={{ height: "32px", top: "50%", transform: "translateY(-50%)" }}
240
- />
241
- )}
242
- <button
243
- onClick={props.onDashboardClick}
244
- className={
245
- "relative w-[42px] h-[42px] flex items-center justify-center cursor-pointer transition-all duration-[120ms] flex-shrink-0 " +
246
- (props.isDashboardActive
247
- ? "rounded-xl bg-base-content/10 text-base-content ring-1 ring-base-content/20"
248
- : "rounded-full bg-base-200 text-base-content/40 hover:rounded-xl hover:bg-base-200 hover:text-base-content/60")
249
- }
250
- title="Lattice Dashboard"
251
- >
252
- <LatticeLogomark size={22} />
253
- <div
254
- className={
255
- "absolute bottom-0 right-0 w-2 h-2 rounded-full border-[1.5px] border-base-100 pointer-events-none " +
256
- (ws.status === "connected"
257
- ? "bg-success"
258
- : ws.status === "connecting"
259
- ? "bg-warning animate-pulse"
260
- : "bg-error")
261
- }
262
- />
263
- </button>
264
- </div>
265
-
266
- <div className="w-6 h-px bg-base-300 my-0.5 flex-shrink-0" />
267
-
268
- {groups.map(function (group) {
269
- return (
270
- <ProjectButton
271
- key={group.slug}
272
- group={group}
273
- isActive={props.activeProjectSlug === group.slug}
274
- onClick={function () { props.onSelectProject(group.slug); }}
275
- onContextMenu={handleContextMenu}
276
- />
277
- );
278
- })}
279
-
280
-
281
- {groups.length > 0 && (
282
- <div className="w-6 h-px bg-base-300 my-0.5 flex-shrink-0" />
283
- )}
284
-
285
- <button
286
- onClick={function () { sidebar.openAddProject(); }}
287
- className="w-[42px] h-[42px] flex items-center justify-center rounded-full border-2 border-dashed border-base-content/25 text-base-content/20 hover:border-base-content/40 hover:text-base-content/40 transition-colors duration-[120ms] flex-shrink-0 cursor-pointer"
288
- title="Add project"
289
- >
290
- <Plus size={18} />
291
- </button>
292
-
293
- {allMeshNodes.length > 0 && (
294
- <div className="w-6 h-px bg-base-300 my-0.5 flex-shrink-0" />
295
- )}
296
-
297
- {allMeshNodes.map(function (node) {
298
- return (
299
- <NodeIndicator key={node.id} node={node} onContextMenu={handleNodeContextMenu} />
300
- );
301
- })}
302
-
303
- <button
304
- onClick={function () { sidebar.openSettings("nodes"); }}
305
- className="w-[26px] h-[26px] flex items-center justify-center rounded-full border border-dashed border-base-content/15 text-base-content/15 hover:border-base-content/30 hover:text-base-content/30 transition-colors duration-[120ms] flex-shrink-0 cursor-pointer"
306
- title="Pair a node"
307
- >
308
- <Plus size={12} />
309
- </button>
310
-
311
- <div className="flex-1" />
312
-
313
- {projectCtx.state !== null && (
314
- <ContextMenu
315
- x={projectCtx.state.x}
316
- y={projectCtx.state.y}
317
- items={[
318
- { label: "Project Settings", icon: <Settings size={14} />, onClick: function () { sidebar.setActiveProjectSlug(projectCtx.state!.data); sidebar.openProjectSettings("general"); } },
319
- { label: "New Session", icon: <PlusCircle size={14} />, onClick: function () { ws.send({ type: "session:create", projectSlug: projectCtx.state!.data }); } },
320
- { type: "divider" },
321
- { label: "Remove Project", icon: <Trash2 size={14} />, danger: true, onClick: function () { sidebar.openConfirmRemove(projectCtx.state!.data); } },
322
- ] as ContextMenuEntry[]}
323
- onClose={projectCtx.close}
324
- label="Project actions"
325
- />
326
- )}
327
-
328
- {nodeCtx.state !== null && (function () {
329
- var node = nodeCtx.state!.data;
330
- var items: ContextMenuEntry[] = [
331
- { label: "Node Settings", icon: <Settings size={14} />, onClick: function () { sidebar.openSettings("nodes"); } },
332
- ];
333
- if (!node.isLocal) {
334
- if (!node.online) {
335
- items.push({ label: "Reconnect", icon: <RefreshCw size={14} />, onClick: function () { ws.send({ type: "mesh:reconnect", nodeId: node.id } as any); } });
336
- }
337
- items.push({ type: "divider" });
338
- items.push({ label: "Unpair", icon: <Unplug size={14} />, danger: true, onClick: function () { ws.send({ type: "mesh:unpair", nodeId: node.id }); } });
339
- }
340
- return (
341
- <ContextMenu
342
- x={nodeCtx.state!.x}
343
- y={nodeCtx.state!.y}
344
- items={items}
345
- onClose={nodeCtx.close}
346
- label="Node actions"
347
- />
348
- );
349
- })()}
350
-
351
- </div>
352
- );
353
- }
@@ -1,52 +0,0 @@
1
- import { useRef, useEffect } from "react";
2
- import { Search, X } from "lucide-react";
3
-
4
- interface SearchFilterProps {
5
- value: string;
6
- onChange: (value: string) => void;
7
- onClose: () => void;
8
- placeholder?: string;
9
- }
10
-
11
- export function SearchFilter(props: SearchFilterProps) {
12
- var inputRef = useRef<HTMLInputElement>(null);
13
-
14
- useEffect(function () {
15
- if (inputRef.current) {
16
- inputRef.current.focus();
17
- }
18
- }, []);
19
-
20
- function handleKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {
21
- if (e.key === "Escape") {
22
- props.onClose();
23
- }
24
- }
25
-
26
- return (
27
- <div className="px-2 pb-1.5 flex-shrink-0">
28
- <div className="flex items-center gap-1.5 bg-base-300 border border-base-content/15 rounded-md px-2 h-7 focus-within:border-primary transition-colors duration-[120ms]">
29
- <Search size={12} className="text-base-content/30 flex-shrink-0" />
30
- <input
31
- ref={inputRef}
32
- type="text"
33
- value={props.value}
34
- onChange={function (e) { props.onChange(e.target.value); }}
35
- onKeyDown={handleKeyDown}
36
- placeholder={props.placeholder || "Search..."}
37
- className="flex-1 bg-transparent text-base-content text-[13px] outline-none min-w-0"
38
- spellCheck={false}
39
- />
40
- {props.value.length > 0 && (
41
- <button
42
- onClick={function () { props.onChange(""); }}
43
- aria-label="Clear search"
44
- className="text-base-content/30 hover:text-base-content flex-shrink-0"
45
- >
46
- <X size={11} />
47
- </button>
48
- )}
49
- </div>
50
- </div>
51
- );
52
- }