@cryptiklemur/lattice 4.0.2 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/bin/lattice +1 -9
  2. package/dist/client/assets/{angular-html-N8PCEquT.js → angular-html-DKTL-XDO.js} +1 -1
  3. package/dist/client/assets/{angular-ts-CJ8RJIPD.js → angular-ts-tvBzOwQR.js} +1 -1
  4. package/dist/client/assets/{apl-BD6tCLWN.js → apl-CCzl5qFl.js} +1 -1
  5. package/dist/client/assets/{astro-CpIIfBs6.js → astro-DNQTpO2Y.js} +1 -1
  6. package/dist/client/assets/{blade-D3qgnjiV.js → blade-CyJoIMeJ.js} +1 -1
  7. package/dist/client/assets/{c-Dr6ADN_t.js → c-OEwk5KN8.js} +1 -1
  8. package/dist/client/assets/{cobol-BIfDE0Hr.js → cobol-DpHyJzz2.js} +1 -1
  9. package/dist/client/assets/{coffee-DHQ57vfY.js → coffee-BX5dbDzZ.js} +1 -1
  10. package/dist/client/assets/{cpp-CEBY6JOp.js → cpp-BTBjNg2U.js} +1 -1
  11. package/dist/client/assets/{crystal-D125CSmP.js → crystal-CNzZd6DW.js} +1 -1
  12. package/dist/client/assets/{css-CBmrkYSr.js → css-BuKsNmms.js} +1 -1
  13. package/dist/client/assets/{dist-A_mCRD1f.js → dist-CKpDHMy6.js} +2 -2
  14. package/dist/client/assets/{edge-Ccsz7cJW.js → edge-DzhnGgJE.js} +1 -1
  15. package/dist/client/assets/{elixir-Do6gk14X.js → elixir-Dqs0waqF.js} +1 -1
  16. package/dist/client/assets/{elm-Db22zT4C.js → elm-BtWwjxWn.js} +1 -1
  17. package/dist/client/assets/{erb-MXVqAAJD.js → erb-iPD89b4v.js} +1 -1
  18. package/dist/client/assets/{git-rebase-B-LLWBOA.js → git-rebase-BxVNXJL4.js} +1 -1
  19. package/dist/client/assets/{glimmer-js-eWszRU73.js → glimmer-js-BlyCupwF.js} +1 -1
  20. package/dist/client/assets/{glimmer-ts-VQmwGqUp.js → glimmer-ts-DjIxWOS9.js} +1 -1
  21. package/dist/client/assets/{glsl-B8ilOfAl.js → glsl-CGIL-65r.js} +1 -1
  22. package/dist/client/assets/{graphql-DnTqxeOc.js → graphql-DeOn6mNV.js} +1 -1
  23. package/dist/client/assets/{hack-XJsHYSQb.js → hack-DVppeCmS.js} +1 -1
  24. package/dist/client/assets/{haml-CQ7Vqzwp.js → haml-WDhua0Mp.js} +1 -1
  25. package/dist/client/assets/{handlebars-C4szooBf.js → handlebars-i2Fu_9HI.js} +1 -1
  26. package/dist/client/assets/{html-B6EgAiSd.js → html-B1e6oxzK.js} +1 -1
  27. package/dist/client/assets/{html-derivative-DdinogQX.js → html-derivative-MofKXIVd.js} +1 -1
  28. package/dist/client/assets/{http-BSLxCgRq.js → http-Dk6S5pRD.js} +1 -1
  29. package/dist/client/assets/{hurl-pOsTwNfp.js → hurl-CroFYYJG.js} +1 -1
  30. package/dist/client/assets/{index-BHQ_8mvl.js → index-CVu-S6Yk.js} +2 -2
  31. package/dist/client/assets/{java-DRQLiiST.js → java-B89FYjqS.js} +1 -1
  32. package/dist/client/assets/{javascript-DvEK2-47.js → javascript-m6CO1Uiy.js} +1 -1
  33. package/dist/client/assets/{jinja-D2NYJ25y.js → jinja-DC9Wi41X.js} +1 -1
  34. package/dist/client/assets/{jison-DDZaLNAp.js → jison-6xiegwDk.js} +1 -1
  35. package/dist/client/assets/{json-TGR0NIWd.js → json-HA-96-qr.js} +1 -1
  36. package/dist/client/assets/{jsx-BjUoPYga.js → jsx-Wt1a8i8U.js} +1 -1
  37. package/dist/client/assets/{julia-C4gjSpFu.js → julia-7M93VBON.js} +1 -1
  38. package/dist/client/assets/{just-H351x5u_.js → just-CjfDLYLv.js} +1 -1
  39. package/dist/client/assets/{latex-BiTmf6gf.js → latex-CitsJ46x.js} +1 -1
  40. package/dist/client/assets/{liquid-86ufjRy-.js → liquid-C8VIFin8.js} +1 -1
  41. package/dist/client/assets/{lua-BNxR0F_8.js → lua-Ba2N7esc.js} +1 -1
  42. package/dist/client/assets/{marko-CvRxpRjM.js → marko-lTLvb2wu.js} +1 -1
  43. package/dist/client/assets/{mdc-CYbAIy2C.js → mdc-D6IV-8FD.js} +1 -1
  44. package/dist/client/assets/{nginx-egdgMq-F.js → nginx-Ch5AjE6S.js} +1 -1
  45. package/dist/client/assets/{nim-CXBJVz_w.js → nim-WmDDC6LW.js} +1 -1
  46. package/dist/client/assets/{perl-XRfMobzg.js → perl-CQv0gYuq.js} +1 -1
  47. package/dist/client/assets/{php-Br7a8uil.js → php-BJmH0qOB.js} +1 -1
  48. package/dist/client/assets/{pug-BVbbUVvy.js → pug-CsHPkzc9.js} +1 -1
  49. package/dist/client/assets/{qml-ByKvrL1j.js → qml-B36ecArG.js} +1 -1
  50. package/dist/client/assets/{r-mVoV0Ni6.js → r-D5Yi5Z4y.js} +1 -1
  51. package/dist/client/assets/{razor-T5O-9UJL.js → razor-CHAxVq4R.js} +1 -1
  52. package/dist/client/assets/{regexp-CioRuhuN.js → regexp-gfs--3M7.js} +1 -1
  53. package/dist/client/assets/{rst-V__uTudD.js → rst-ugdlp-hl.js} +1 -1
  54. package/dist/client/assets/{ruby-C_PuKPTI.js → ruby-CDRRW37j.js} +1 -1
  55. package/dist/client/assets/{sas-D_DqqQH4.js → sas-DZaNQaIP.js} +1 -1
  56. package/dist/client/assets/{scss-D-TjzZ4c.js → scss-CzWQEplj.js} +1 -1
  57. package/dist/client/assets/{shellscript-E5759VHu.js → shellscript-fgYvpu9N.js} +1 -1
  58. package/dist/client/assets/{shellsession-AESTM-Pv.js → shellsession-BoAohHh7.js} +1 -1
  59. package/dist/client/assets/{soy-QrbrrcDv.js → soy-DBzVgv9x.js} +1 -1
  60. package/dist/client/assets/{sql-0M8VcDHD.js → sql-BYXpAYTs.js} +1 -1
  61. package/dist/client/assets/{stata-CgeIpGtc.js → stata-I71MMY3p.js} +1 -1
  62. package/dist/client/assets/{surrealql-DBGwnZbw.js → surrealql-C9U8_1VO.js} +1 -1
  63. package/dist/client/assets/{svelte-Cv0PvUc_.js → svelte-VOFrPnWT.js} +1 -1
  64. package/dist/client/assets/{templ-B9t7xRE4.js → templ-BIaxAEtC.js} +1 -1
  65. package/dist/client/assets/{tex-DhZZ8dr2.js → tex-D1dwnBE5.js} +1 -1
  66. package/dist/client/assets/{ts-tags-BFv8sbnd.js → ts-tags-C0L2Q0r5.js} +1 -1
  67. package/dist/client/assets/{tsx-CXC9KSbY.js → tsx-BqcycEv1.js} +1 -1
  68. package/dist/client/assets/{twig-CM_OO66r.js → twig-vyWqOhpM.js} +1 -1
  69. package/dist/client/assets/{typescript-BdgOTaoD.js → typescript-B2YbovqG.js} +1 -1
  70. package/dist/client/assets/{vue-BnQhjnCm.js → vue-CbXxGdjo.js} +1 -1
  71. package/dist/client/assets/{vue-html-CNnGecRI.js → vue-html-DDX4KXW7.js} +1 -1
  72. package/dist/client/assets/{vue-vine-DCuMkRhK.js → vue-vine-DsyY1LR5.js} +1 -1
  73. package/dist/client/assets/{xml-CbTD7cB8.js → xml-Ddi0-r0D.js} +1 -1
  74. package/dist/client/assets/{xsl-uOqqo7cf.js → xsl-CsFcZHFS.js} +1 -1
  75. package/dist/client/assets/{yaml-BNrLoH59.js → yaml-tGJWoH6Y.js} +1 -1
  76. package/dist/client/index.html +1 -1
  77. package/dist/client/sw.js +1 -1
  78. package/dist/server/analytics/engine.js +832 -0
  79. package/dist/server/assets.js +39 -0
  80. package/dist/server/auth/passphrase.js +70 -0
  81. package/dist/server/config.js +47 -0
  82. package/dist/server/daemon.js +535 -0
  83. package/dist/server/features/ralph-loop.js +138 -0
  84. package/dist/server/features/scheduler.js +260 -0
  85. package/dist/server/features/sticky-notes.js +99 -0
  86. package/dist/server/handlers/analytics.js +28 -0
  87. package/dist/server/handlers/attachment.js +158 -0
  88. package/dist/server/handlers/bookmarks.js +41 -0
  89. package/dist/server/handlers/chat.js +350 -0
  90. package/dist/server/handlers/editor.js +72 -0
  91. package/dist/server/handlers/fs.js +234 -0
  92. package/dist/server/handlers/loop.js +33 -0
  93. package/dist/server/handlers/memory.js +181 -0
  94. package/dist/server/handlers/mesh.js +322 -0
  95. package/dist/server/handlers/notes.js +36 -0
  96. package/dist/server/handlers/plugins.js +593 -0
  97. package/dist/server/handlers/project-settings.js +166 -0
  98. package/dist/server/handlers/scheduler.js +52 -0
  99. package/dist/server/handlers/session.js +194 -0
  100. package/dist/server/handlers/settings.js +148 -0
  101. package/dist/server/handlers/skills.js +360 -0
  102. package/dist/server/handlers/terminal.js +75 -0
  103. package/dist/server/handlers/themes.js +102 -0
  104. package/dist/server/handlers/update.js +124 -0
  105. package/dist/server/identity.js +45 -0
  106. package/dist/server/index.js +435 -0
  107. package/dist/server/logger.js +20 -0
  108. package/dist/server/mesh/connector.js +355 -0
  109. package/dist/server/mesh/crypto.js +88 -0
  110. package/dist/server/mesh/discovery.js +95 -0
  111. package/dist/server/mesh/pairing.js +104 -0
  112. package/dist/server/mesh/peers.js +54 -0
  113. package/dist/server/mesh/proxy.js +86 -0
  114. package/dist/server/mesh/session-sync.js +85 -0
  115. package/dist/server/project/bookmarks.js +77 -0
  116. package/dist/server/project/context-breakdown.js +279 -0
  117. package/dist/server/project/file-browser.js +97 -0
  118. package/dist/server/project/project-files.js +274 -0
  119. package/dist/server/project/registry.js +51 -0
  120. package/dist/server/project/sdk-bridge.js +960 -0
  121. package/dist/server/project/session.js +696 -0
  122. package/dist/server/project/terminal.js +87 -0
  123. package/dist/server/project/warmup.js +242 -0
  124. package/dist/server/push.js +87 -0
  125. package/dist/server/tls.js +50 -0
  126. package/dist/server/tui.js +83 -0
  127. package/dist/server/update-checker.js +119 -0
  128. package/dist/server/ws/broadcast.js +50 -0
  129. package/dist/server/ws/router.js +105 -0
  130. package/dist/server/ws/server.js +2 -0
  131. package/dist/shared/analytics.js +1 -0
  132. package/dist/shared/messages.js +1 -0
  133. package/dist/shared/models.js +1 -0
  134. package/dist/shared/project-settings.js +1 -0
  135. package/package.json +5 -8
  136. package/themes/alabaster.json +9 -0
  137. package/themes/amoled.json +20 -0
  138. package/themes/ayu-light.json +9 -0
  139. package/themes/catppuccin-latte.json +9 -0
  140. package/themes/catppuccin-mocha.json +9 -0
  141. package/themes/clay-light.json +10 -0
  142. package/themes/clay.json +10 -0
  143. package/themes/dracula.json +9 -0
  144. package/themes/everforest-light.json +9 -0
  145. package/themes/everforest.json +9 -0
  146. package/themes/github-light.json +9 -0
  147. package/themes/gruvbox-dark.json +9 -0
  148. package/themes/gruvbox-light.json +9 -0
  149. package/themes/horizon-light.json +9 -0
  150. package/themes/kanagawa-lotus.json +9 -0
  151. package/themes/kanagawa.json +9 -0
  152. package/themes/modus-operandi.json +9 -0
  153. package/themes/monokai.json +9 -0
  154. package/themes/nightfox.json +9 -0
  155. package/themes/nord-light.json +9 -0
  156. package/themes/nord.json +9 -0
  157. package/themes/one-dark.json +9 -0
  158. package/themes/one-light.json +9 -0
  159. package/themes/palenight.json +9 -0
  160. package/themes/paper.json +9 -0
  161. package/themes/penumbra-light.json +9 -0
  162. package/themes/poimandres.json +9 -0
  163. package/themes/quiet-light.json +9 -0
  164. package/themes/rose-pine-dawn.json +9 -0
  165. package/themes/rose-pine.json +9 -0
  166. package/themes/solarized-dark.json +9 -0
  167. package/themes/solarized-light.json +9 -0
  168. package/themes/synthwave84.json +9 -0
  169. package/themes/tokyo-night-light.json +9 -0
  170. package/themes/tokyo-night.json +9 -0
  171. package/themes/vesper.json +9 -0
  172. package/index.html +0 -20
  173. package/public/icons/icon-192.svg +0 -11
  174. package/public/icons/icon-512.svg +0 -11
  175. package/public/sw-push.js +0 -53
  176. package/src/client/App.tsx +0 -42
  177. package/src/client/commands.ts +0 -36
  178. package/src/client/components/analytics/AnalyticsView.tsx +0 -244
  179. package/src/client/components/analytics/ChartCard.tsx +0 -194
  180. package/src/client/components/analytics/PeriodSelector.tsx +0 -42
  181. package/src/client/components/analytics/QuickStats.tsx +0 -122
  182. package/src/client/components/analytics/chartTokens.ts +0 -188
  183. package/src/client/components/analytics/charts/ActivityCalendar.tsx +0 -204
  184. package/src/client/components/analytics/charts/CacheEfficiencyChart.tsx +0 -56
  185. package/src/client/components/analytics/charts/ContextUtilizationChart.tsx +0 -106
  186. package/src/client/components/analytics/charts/CostAreaChart.tsx +0 -79
  187. package/src/client/components/analytics/charts/CostDistributionChart.tsx +0 -59
  188. package/src/client/components/analytics/charts/CostDonutChart.tsx +0 -84
  189. package/src/client/components/analytics/charts/CumulativeCostChart.tsx +0 -59
  190. package/src/client/components/analytics/charts/DailySummaryCards.tsx +0 -86
  191. package/src/client/components/analytics/charts/HourlyHeatmap.tsx +0 -133
  192. package/src/client/components/analytics/charts/NodeFleetOverview.tsx +0 -89
  193. package/src/client/components/analytics/charts/PermissionBreakdown.tsx +0 -98
  194. package/src/client/components/analytics/charts/ProjectRadar.tsx +0 -126
  195. package/src/client/components/analytics/charts/ResponseTimeScatter.tsx +0 -96
  196. package/src/client/components/analytics/charts/SessionBubbleChart.tsx +0 -114
  197. package/src/client/components/analytics/charts/SessionComplexityList.tsx +0 -65
  198. package/src/client/components/analytics/charts/SessionTimeline.tsx +0 -107
  199. package/src/client/components/analytics/charts/TokenFlowChart.tsx +0 -78
  200. package/src/client/components/analytics/charts/TokenSankeyChart.tsx +0 -93
  201. package/src/client/components/analytics/charts/ToolSunburst.tsx +0 -123
  202. package/src/client/components/analytics/charts/ToolTreemap.tsx +0 -110
  203. package/src/client/components/auth/PassphrasePrompt.tsx +0 -70
  204. package/src/client/components/chat/AttachmentChips.tsx +0 -116
  205. package/src/client/components/chat/ChatInput.tsx +0 -533
  206. package/src/client/components/chat/ChatView.tsx +0 -1076
  207. package/src/client/components/chat/CommandPalette.tsx +0 -162
  208. package/src/client/components/chat/ElicitationCard.tsx +0 -238
  209. package/src/client/components/chat/Message.tsx +0 -825
  210. package/src/client/components/chat/ModelSelector.tsx +0 -108
  211. package/src/client/components/chat/PermissionModeSelector.tsx +0 -41
  212. package/src/client/components/chat/PromptQuestion.tsx +0 -271
  213. package/src/client/components/chat/StatusBar.tsx +0 -50
  214. package/src/client/components/chat/TodoCard.tsx +0 -57
  215. package/src/client/components/chat/ToolGroup.tsx +0 -129
  216. package/src/client/components/chat/ToolResultRenderer.tsx +0 -348
  217. package/src/client/components/chat/VoiceRecorder.tsx +0 -85
  218. package/src/client/components/chat/toolSummary.ts +0 -41
  219. package/src/client/components/dashboard/DashboardView.tsx +0 -200
  220. package/src/client/components/dashboard/ProjectDashboardView.tsx +0 -179
  221. package/src/client/components/mesh/NodeBadge.tsx +0 -24
  222. package/src/client/components/mesh/PairingDialog.tsx +0 -340
  223. package/src/client/components/project-settings/ProjectClaude.tsx +0 -318
  224. package/src/client/components/project-settings/ProjectEnvironment.tsx +0 -235
  225. package/src/client/components/project-settings/ProjectGeneral.tsx +0 -76
  226. package/src/client/components/project-settings/ProjectMcp.tsx +0 -232
  227. package/src/client/components/project-settings/ProjectMemory.tsx +0 -488
  228. package/src/client/components/project-settings/ProjectNotifications.tsx +0 -48
  229. package/src/client/components/project-settings/ProjectPermissions.tsx +0 -209
  230. package/src/client/components/project-settings/ProjectPlugins.tsx +0 -117
  231. package/src/client/components/project-settings/ProjectRules.tsx +0 -286
  232. package/src/client/components/project-settings/ProjectSettingsView.tsx +0 -117
  233. package/src/client/components/project-settings/ProjectSkills.tsx +0 -91
  234. package/src/client/components/settings/Appearance.tsx +0 -275
  235. package/src/client/components/settings/BudgetSettings.tsx +0 -165
  236. package/src/client/components/settings/ClaudeSettings.tsx +0 -175
  237. package/src/client/components/settings/Editor.tsx +0 -123
  238. package/src/client/components/settings/Environment.tsx +0 -185
  239. package/src/client/components/settings/GlobalMcp.tsx +0 -216
  240. package/src/client/components/settings/GlobalMemory.tsx +0 -19
  241. package/src/client/components/settings/GlobalPlugins.tsx +0 -806
  242. package/src/client/components/settings/GlobalRules.tsx +0 -149
  243. package/src/client/components/settings/GlobalSkills.tsx +0 -140
  244. package/src/client/components/settings/MeshStatus.tsx +0 -183
  245. package/src/client/components/settings/Notifications.tsx +0 -123
  246. package/src/client/components/settings/SettingsView.tsx +0 -75
  247. package/src/client/components/settings/SkillMarketplace.tsx +0 -175
  248. package/src/client/components/settings/ThemePreview.tsx +0 -140
  249. package/src/client/components/settings/ThemeWizard.tsx +0 -405
  250. package/src/client/components/settings/mcp-shared.tsx +0 -194
  251. package/src/client/components/settings/skill-shared.tsx +0 -186
  252. package/src/client/components/setup/SetupWizard.tsx +0 -755
  253. package/src/client/components/sidebar/AddProjectModal.tsx +0 -438
  254. package/src/client/components/sidebar/NodeSettingsModal.tsx +0 -206
  255. package/src/client/components/sidebar/ProjectDropdown.tsx +0 -211
  256. package/src/client/components/sidebar/ProjectRail.tsx +0 -353
  257. package/src/client/components/sidebar/SearchFilter.tsx +0 -52
  258. package/src/client/components/sidebar/SessionList.tsx +0 -599
  259. package/src/client/components/sidebar/SettingsSidebar.tsx +0 -139
  260. package/src/client/components/sidebar/Sidebar.tsx +0 -469
  261. package/src/client/components/sidebar/UserIsland.tsx +0 -282
  262. package/src/client/components/sidebar/UserMenu.tsx +0 -107
  263. package/src/client/components/ui/CommandPalette.tsx +0 -321
  264. package/src/client/components/ui/ContextMenu.tsx +0 -153
  265. package/src/client/components/ui/ErrorBoundary.tsx +0 -56
  266. package/src/client/components/ui/IconPicker.tsx +0 -184
  267. package/src/client/components/ui/KeyboardShortcuts.tsx +0 -129
  268. package/src/client/components/ui/LatticeLogomark.tsx +0 -19
  269. package/src/client/components/ui/NodeDisconnectedOverlay.tsx +0 -35
  270. package/src/client/components/ui/PopupMenu.tsx +0 -120
  271. package/src/client/components/ui/SaveFooter.tsx +0 -63
  272. package/src/client/components/ui/Toast.tsx +0 -132
  273. package/src/client/components/ui/UpdateBanner.tsx +0 -110
  274. package/src/client/components/ui/UpdatePrompt.tsx +0 -47
  275. package/src/client/components/workspace/BookmarksView.tsx +0 -156
  276. package/src/client/components/workspace/FileBrowser.tsx +0 -174
  277. package/src/client/components/workspace/FileTree.tsx +0 -129
  278. package/src/client/components/workspace/FileViewer.tsx +0 -211
  279. package/src/client/components/workspace/NoteCard.tsx +0 -120
  280. package/src/client/components/workspace/NotesView.tsx +0 -102
  281. package/src/client/components/workspace/ScheduledTasksView.tsx +0 -117
  282. package/src/client/components/workspace/SplitPane.tsx +0 -81
  283. package/src/client/components/workspace/TabBar.tsx +0 -170
  284. package/src/client/components/workspace/TaskCard.tsx +0 -159
  285. package/src/client/components/workspace/TaskEditModal.tsx +0 -129
  286. package/src/client/components/workspace/TerminalInstance.tsx +0 -171
  287. package/src/client/components/workspace/TerminalView.tsx +0 -110
  288. package/src/client/components/workspace/WorkspaceView.tsx +0 -141
  289. package/src/client/hooks/useAnalytics.ts +0 -84
  290. package/src/client/hooks/useAttachments.ts +0 -313
  291. package/src/client/hooks/useBookmarks.ts +0 -57
  292. package/src/client/hooks/useEditorConfig.ts +0 -28
  293. package/src/client/hooks/useFocusTrap.ts +0 -74
  294. package/src/client/hooks/useIdleDetection.ts +0 -50
  295. package/src/client/hooks/useInstallPrompt.ts +0 -53
  296. package/src/client/hooks/useMesh.ts +0 -89
  297. package/src/client/hooks/useNotifications.ts +0 -54
  298. package/src/client/hooks/useOnline.ts +0 -6
  299. package/src/client/hooks/useProjectSettings.ts +0 -56
  300. package/src/client/hooks/useProjects.ts +0 -98
  301. package/src/client/hooks/usePushNotifications.ts +0 -92
  302. package/src/client/hooks/useSaveState.ts +0 -65
  303. package/src/client/hooks/useSession.ts +0 -580
  304. package/src/client/hooks/useSidebar.ts +0 -90
  305. package/src/client/hooks/useSkills.ts +0 -30
  306. package/src/client/hooks/useSpinnerVerb.ts +0 -36
  307. package/src/client/hooks/useSwipeDrawer.ts +0 -299
  308. package/src/client/hooks/useTheme.ts +0 -114
  309. package/src/client/hooks/useTimeTick.ts +0 -35
  310. package/src/client/hooks/useVoiceRecorder.ts +0 -169
  311. package/src/client/hooks/useWebSocket.ts +0 -27
  312. package/src/client/hooks/useWorkspace.ts +0 -57
  313. package/src/client/lib/theme-derive.ts +0 -196
  314. package/src/client/lib/workspace-url.ts +0 -219
  315. package/src/client/main.tsx +0 -10
  316. package/src/client/providers/WebSocketProvider.tsx +0 -186
  317. package/src/client/router.tsx +0 -578
  318. package/src/client/stores/analytics.ts +0 -68
  319. package/src/client/stores/bookmarks.ts +0 -45
  320. package/src/client/stores/mesh.ts +0 -78
  321. package/src/client/stores/session.ts +0 -569
  322. package/src/client/stores/sidebar.ts +0 -530
  323. package/src/client/stores/theme.ts +0 -44
  324. package/src/client/stores/workspace.ts +0 -518
  325. package/src/client/styles/global.css +0 -391
  326. package/src/client/styles/theme-vars.css +0 -18
  327. package/src/client/themes/index.ts +0 -105
  328. package/src/client/utils/editorUrl.ts +0 -55
  329. package/src/client/utils/findDuplicateKeys.ts +0 -12
  330. package/src/client/utils/formatSessionTitle.ts +0 -17
  331. package/src/client/vite-env.d.ts +0 -6
  332. package/src/server/analytics/engine.ts +0 -920
  333. package/src/server/assets.ts +0 -45
  334. package/src/server/auth/passphrase.ts +0 -78
  335. package/src/server/config.ts +0 -55
  336. package/src/server/daemon.ts +0 -567
  337. package/src/server/features/ralph-loop.ts +0 -173
  338. package/src/server/features/scheduler.ts +0 -304
  339. package/src/server/features/sticky-notes.ts +0 -104
  340. package/src/server/handlers/analytics.ts +0 -39
  341. package/src/server/handlers/attachment.ts +0 -189
  342. package/src/server/handlers/bookmarks.ts +0 -50
  343. package/src/server/handlers/chat.ts +0 -381
  344. package/src/server/handlers/editor.ts +0 -76
  345. package/src/server/handlers/fs.ts +0 -251
  346. package/src/server/handlers/loop.ts +0 -37
  347. package/src/server/handlers/memory.ts +0 -182
  348. package/src/server/handlers/mesh.ts +0 -362
  349. package/src/server/handlers/notes.ts +0 -47
  350. package/src/server/handlers/plugins.ts +0 -655
  351. package/src/server/handlers/project-settings.ts +0 -180
  352. package/src/server/handlers/scheduler.ts +0 -64
  353. package/src/server/handlers/session.ts +0 -226
  354. package/src/server/handlers/settings.ts +0 -157
  355. package/src/server/handlers/skills.ts +0 -378
  356. package/src/server/handlers/terminal.ts +0 -88
  357. package/src/server/handlers/themes.ts +0 -121
  358. package/src/server/handlers/update.ts +0 -133
  359. package/src/server/identity.ts +0 -56
  360. package/src/server/index.ts +0 -457
  361. package/src/server/logger.ts +0 -21
  362. package/src/server/mesh/connector.ts +0 -419
  363. package/src/server/mesh/crypto.ts +0 -106
  364. package/src/server/mesh/discovery.ts +0 -126
  365. package/src/server/mesh/pairing.ts +0 -123
  366. package/src/server/mesh/peers.ts +0 -60
  367. package/src/server/mesh/proxy.ts +0 -106
  368. package/src/server/mesh/session-sync.ts +0 -107
  369. package/src/server/project/bookmarks.ts +0 -83
  370. package/src/server/project/context-breakdown.ts +0 -307
  371. package/src/server/project/file-browser.ts +0 -106
  372. package/src/server/project/project-files.ts +0 -267
  373. package/src/server/project/pty-worker.cjs +0 -83
  374. package/src/server/project/registry.ts +0 -57
  375. package/src/server/project/sdk-bridge.ts +0 -1100
  376. package/src/server/project/session.ts +0 -723
  377. package/src/server/project/terminal.ts +0 -111
  378. package/src/server/project/warmup.ts +0 -285
  379. package/src/server/push.ts +0 -121
  380. package/src/server/tls.ts +0 -65
  381. package/src/server/tui.ts +0 -103
  382. package/src/server/update-checker.ts +0 -147
  383. package/src/server/ws/broadcast.ts +0 -61
  384. package/src/server/ws/router.ts +0 -123
  385. package/src/server/ws/server.ts +0 -2
  386. package/src/shared/analytics.ts +0 -40
  387. package/src/shared/messages.ts +0 -1302
  388. package/src/shared/models.ts +0 -255
  389. package/src/shared/project-settings.ts +0 -45
  390. package/tsconfig.json +0 -25
  391. package/vite.config.ts +0 -71
  392. /package/{src/server/runtime.ts → dist/server/runtime.js} +0 -0
  393. /package/{src/shared/constants.ts → dist/shared/constants.js} +0 -0
  394. /package/{src/shared/index.ts → dist/shared/index.js} +0 -0
@@ -1,755 +0,0 @@
1
- import { useState, useEffect } from "react";
2
- import { ArrowRight, ChevronRight, ChevronLeft, Server, Palette, Lock, Folder, Info, Moon, Sun, Check, CheckCircle } from "lucide-react";
3
- import { useTheme } from "../../hooks/useTheme";
4
- import { useWebSocket } from "../../hooks/useWebSocket";
5
- import { themes } from "../../themes/index";
6
- import type { ThemeEntry } from "../../themes/index";
7
- import { LatticeLogomark } from "../ui/LatticeLogomark";
8
-
9
- var POPULAR_DARK_THEMES = ["dracula", "catppuccin-mocha", "tokyo-night", "one-dark", "amoled"];
10
- var POPULAR_LIGHT_THEMES = ["ayu-light", "catppuccin-latte", "github-light", "one-light", "rose-pine-dawn"];
11
-
12
- var TOTAL_STEPS = 6;
13
-
14
- interface SetupWizardProps {
15
- onComplete: () => void;
16
- }
17
-
18
- export function SetupWizard(props: SetupWizardProps) {
19
- var [step, setStep] = useState(1);
20
- var [prevStep, setPrevStep] = useState(1);
21
- var [animating, setAnimating] = useState(false);
22
- var [nodeName, setNodeName] = useState("");
23
- var [passphrase, setPassphrase] = useState("");
24
- var [passphraseConfirm, setPassphraseConfirm] = useState("");
25
- var [passphraseError, setPassphraseError] = useState("");
26
- var [projectPath, setProjectPath] = useState("");
27
- var [projectTitle, setProjectTitle] = useState("");
28
- var [configured, setConfigured] = useState<string[]>([]);
29
-
30
- var theme = useTheme();
31
- var ws = useWebSocket();
32
-
33
- function navigateTo(next: number) {
34
- if (animating) return;
35
- setPrevStep(step);
36
- setAnimating(true);
37
- setTimeout(function () {
38
- setStep(next);
39
- setAnimating(false);
40
- }, 180);
41
- }
42
-
43
- function goNext() {
44
- navigateTo(Math.min(step + 1, TOTAL_STEPS));
45
- }
46
-
47
- function goBack() {
48
- navigateTo(Math.max(step - 1, 1));
49
- }
50
-
51
- function skipToNext() {
52
- goNext();
53
- }
54
-
55
- function handleNameNext() {
56
- var name = nodeName.trim();
57
- if (name.length > 0) {
58
- ws.send({ type: "settings:update", settings: { name } });
59
- setConfigured(function (c) { return [...c.filter(function (x) { return x !== "name"; }), "name: " + name]; });
60
- }
61
- goNext();
62
- }
63
-
64
- function handleAppearanceNext() {
65
- setConfigured(function (c) {
66
- var label = "theme: " + theme.currentThemeId + " (" + theme.mode + ")";
67
- return [...c.filter(function (x) { return !x.startsWith("theme:"); }), label];
68
- });
69
- goNext();
70
- }
71
-
72
- function handleSecurityNext() {
73
- if (passphrase.length === 0) {
74
- goNext();
75
- return;
76
- }
77
- if (passphrase !== passphraseConfirm) {
78
- setPassphraseError("Passphrases do not match");
79
- return;
80
- }
81
- ws.send({ type: "settings:update", settings: { passphraseHash: passphrase } });
82
- setConfigured(function (c) { return [...c.filter(function (x) { return x !== "security"; }), "security: passphrase set"]; });
83
- goNext();
84
- }
85
-
86
- function handleProjectNext() {
87
- var path = projectPath.trim();
88
- if (path.length > 0) {
89
- var derivedName = path.replace(/\/+$/, "").split("/").pop() || path;
90
- var title = projectTitle.trim() || derivedName;
91
- ws.send({ type: "settings:update", settings: { projects: [{ path: path, slug: "", title: title, env: {} }] } });
92
- setConfigured(function (c) { return [...c.filter(function (x) { return !x.startsWith("project:"); }), "project: " + title]; });
93
- }
94
- goNext();
95
- }
96
-
97
- function handleDone() {
98
- ws.send({ type: "settings:update", settings: { setupComplete: true } });
99
- props.onComplete();
100
- }
101
-
102
- var darkQuickPicks = themes.filter(function (e: ThemeEntry) { return POPULAR_DARK_THEMES.includes(e.id); });
103
- var lightQuickPicks = themes.filter(function (e: ThemeEntry) { return POPULAR_LIGHT_THEMES.includes(e.id); });
104
- var isForward = step > prevStep;
105
-
106
- return (
107
- <div className="fixed inset-0 z-[9999] flex items-center justify-center bg-base-100 transition-colors duration-300">
108
- <style>{wizardCSS}</style>
109
-
110
- {step === 1 ? (
111
- <div className="relative w-full max-w-[520px] px-6 py-12 flex flex-col items-center text-center">
112
- <div
113
- className="fixed inset-0 pointer-events-none z-0"
114
- aria-hidden="true"
115
- style={{
116
- backgroundImage: "linear-gradient(oklch(from var(--color-primary) l c h / 0.07) 1px, transparent 1px), linear-gradient(90deg, oklch(from var(--color-primary) l c h / 0.07) 1px, transparent 1px)",
117
- backgroundSize: "40px 40px",
118
- animation: "wizard-grid-shift 8s linear infinite",
119
- }}
120
- />
121
- <div className="relative z-[1] flex flex-col items-center gap-0">
122
- <div className="wizard-fade-in text-primary" style={{ animationDelay: "0ms" }}>
123
- <LatticeLogomark size={64} />
124
- </div>
125
- <h1
126
- className="wizard-fade-in font-mono font-bold text-base-content leading-none mt-5 mb-0"
127
- style={{ fontSize: "clamp(48px, 10vw, 72px)", letterSpacing: "-0.04em", animationDelay: "80ms" }}
128
- >
129
- Lattice
130
- </h1>
131
- <p className="wizard-fade-in text-[17px] text-base-content/60 mt-3 mb-8 tracking-[0.01em]" style={{ animationDelay: "160ms" }}>
132
- One dashboard. Every machine.
133
- </p>
134
- <div className="wizard-fade-in" style={{ animationDelay: "240ms" }}>
135
- <TerminalPreview />
136
- </div>
137
- <div className="wizard-fade-in" style={{ animationDelay: "320ms" }}>
138
- <button
139
- onClick={goNext}
140
- className="wizard-btn-primary btn btn-primary inline-flex items-center gap-2 mt-7 h-[52px] px-8 text-[15px] font-semibold cursor-pointer"
141
- >
142
- Get Started
143
- <ArrowRight size={16} />
144
- </button>
145
- </div>
146
- <p className="wizard-fade-in text-[12px] text-base-content/30 mt-4" style={{ animationDelay: "380ms" }}>
147
- Takes about 2 minutes
148
- </p>
149
- </div>
150
- </div>
151
- ) : (
152
- <div className="w-[480px] max-w-[calc(100vw-24px)] bg-base-200 border border-base-300 rounded-xl flex flex-col overflow-hidden shadow-2xl">
153
- <div className="flex items-center justify-between px-6 py-4 border-b border-base-300 bg-base-100">
154
- <div className="flex items-center gap-1.5">
155
- {Array.from({ length: TOTAL_STEPS - 1 }, function (_, i) {
156
- var dotStep = i + 2;
157
- var isComplete = step > dotStep;
158
- var isActive = step === dotStep;
159
- return (
160
- <div
161
- key={i}
162
- className="h-1.5 rounded-full transition-all duration-[250ms]"
163
- style={{
164
- background: (isComplete || isActive) ? "var(--color-primary)" : "var(--color-base-300)",
165
- opacity: isActive ? 1 : isComplete ? 0.7 : 0.35,
166
- width: isActive ? "24px" : "8px",
167
- }}
168
- />
169
- );
170
- })}
171
- </div>
172
- <span className="text-[11px] text-base-content/40 font-mono tracking-[0.06em]">
173
- {step - 1} / {TOTAL_STEPS - 1}
174
- </span>
175
- </div>
176
-
177
- <div
178
- className={"px-7 pt-7 pb-2 flex-1 min-h-[320px] " + (animating ? (isForward ? "wizard-slide-out-left" : "wizard-slide-out-right") : (isForward ? "wizard-slide-in-right" : "wizard-slide-in-left"))}
179
- key={step}
180
- >
181
- {step === 2 && (
182
- <NameStep value={nodeName} onChange={setNodeName} />
183
- )}
184
- {step === 3 && (
185
- <AppearanceStep
186
- theme={theme}
187
- darkQuickPicks={darkQuickPicks}
188
- lightQuickPicks={lightQuickPicks}
189
- />
190
- )}
191
- {step === 4 && (
192
- <SecurityStep
193
- passphrase={passphrase}
194
- passphraseConfirm={passphraseConfirm}
195
- error={passphraseError}
196
- onPassphraseChange={function (v: string) {
197
- setPassphrase(v);
198
- setPassphraseError("");
199
- }}
200
- onConfirmChange={function (v: string) {
201
- setPassphraseConfirm(v);
202
- setPassphraseError("");
203
- }}
204
- />
205
- )}
206
- {step === 5 && (
207
- <ProjectStep
208
- path={projectPath}
209
- title={projectTitle}
210
- onPathChange={setProjectPath}
211
- onTitleChange={setProjectTitle}
212
- />
213
- )}
214
- {step === 6 && <DoneStep configured={configured} />}
215
- </div>
216
-
217
- <div className="flex items-center gap-2 px-6 py-4 border-t border-base-300 bg-base-100">
218
- {step >= 2 && step < TOTAL_STEPS && (
219
- <button onClick={goBack} className="wizard-btn-back btn btn-ghost btn-sm gap-1 text-base-content/40">
220
- <ChevronLeft size={14} />
221
- Back
222
- </button>
223
- )}
224
- <div className="flex items-center gap-2 ml-auto">
225
- {step === 2 && (
226
- <button onClick={skipToNext} className="wizard-btn-skip btn btn-ghost btn-sm text-base-content/40">Skip</button>
227
- )}
228
- {step === 3 && (
229
- <button onClick={handleAppearanceNext} className="wizard-btn-primary btn btn-primary btn-sm gap-1">
230
- Continue
231
- <ChevronRight size={14} />
232
- </button>
233
- )}
234
- {step === 4 && (
235
- <>
236
- <button onClick={skipToNext} className="wizard-btn-skip btn btn-ghost btn-sm text-base-content/40">Skip</button>
237
- <button onClick={handleSecurityNext} className="wizard-btn-primary btn btn-primary btn-sm gap-1">
238
- Continue
239
- <ChevronRight size={14} />
240
- </button>
241
- </>
242
- )}
243
- {step === 5 && (
244
- <>
245
- <button onClick={skipToNext} className="wizard-btn-skip btn btn-ghost btn-sm text-base-content/40">Skip</button>
246
- <button onClick={handleProjectNext} className="wizard-btn-primary btn btn-primary btn-sm gap-1">
247
- Add &amp; Continue
248
- <ChevronRight size={14} />
249
- </button>
250
- </>
251
- )}
252
- {step === 6 && (
253
- <button onClick={handleDone} className="wizard-btn-done btn btn-success btn-sm gap-2 font-bold">
254
- Open Dashboard
255
- <ArrowRight size={16} />
256
- </button>
257
- )}
258
- {step === 2 && (
259
- <button onClick={handleNameNext} className="wizard-btn-primary btn btn-primary btn-sm gap-1">
260
- Continue
261
- <ChevronRight size={14} />
262
- </button>
263
- )}
264
- </div>
265
- </div>
266
- </div>
267
- )}
268
- </div>
269
- );
270
- }
271
-
272
- function TerminalPreview() {
273
- var [visible, setVisible] = useState(0);
274
- var lines = [
275
- { prefix: "$ ", text: "lattice", color: "var(--color-base-content)" },
276
- { prefix: "", text: " [lattice] Daemon started (PID 4821)", color: "oklch(from var(--color-base-content) l c h / 0.5)" },
277
- { prefix: "", text: " [lattice] Listening on https://0.0.0.0:7654", color: "var(--color-success)" },
278
- { prefix: "", text: " [discovery] Found 2 nodes on mesh", color: "var(--color-primary)" },
279
- ];
280
-
281
- useEffect(function () {
282
- var timers: ReturnType<typeof setTimeout>[] = [];
283
- lines.forEach(function (_, i) {
284
- timers.push(setTimeout(function () { setVisible(i + 1); }, 600 + i * 600));
285
- });
286
- return function () { timers.forEach(clearTimeout); };
287
- }, []);
288
-
289
- return (
290
- <div className="w-[380px] max-w-[calc(100vw-48px)] bg-base-200 border border-base-300 rounded-xl overflow-hidden shadow-2xl">
291
- <div className="flex items-center gap-1.5 px-3.5 py-2.5 bg-base-300 border-b border-base-300">
292
- <span className="w-2.5 h-2.5 rounded-full bg-error opacity-80 flex-shrink-0" />
293
- <span className="w-2.5 h-2.5 rounded-full bg-warning opacity-80 flex-shrink-0" />
294
- <span className="w-2.5 h-2.5 rounded-full bg-success opacity-80 flex-shrink-0" />
295
- <span className="text-[11px] text-base-content/40 font-mono mx-auto tracking-[0.02em]">lattice — zsh</span>
296
- </div>
297
- <div className="px-4 py-3.5 flex flex-col gap-1 min-h-[96px]">
298
- {lines.map(function (line, i) {
299
- return (
300
- <div
301
- key={i}
302
- className="text-[12px] font-mono leading-relaxed whitespace-pre transition-all duration-200"
303
- style={{
304
- opacity: i < visible ? 1 : 0,
305
- transform: i < visible ? "translateY(0)" : "translateY(4px)",
306
- color: line.color,
307
- }}
308
- >
309
- {line.prefix && <span style={{ color: "var(--color-primary)" }}>{line.prefix}</span>}
310
- <span>{line.text}</span>
311
- </div>
312
- );
313
- })}
314
- <div className="flex items-center gap-0.5 text-[12px] font-mono mt-0.5">
315
- <span style={{ color: "var(--color-primary)" }}>$ </span>
316
- <span
317
- className="inline-block w-2 h-3.5 rounded-[1px] align-middle opacity-90"
318
- style={{ background: "var(--color-primary)", animation: "wizard-cursor-blink 1s step-end infinite" }}
319
- />
320
- </div>
321
- </div>
322
- </div>
323
- );
324
- }
325
-
326
- interface NameStepProps {
327
- value: string;
328
- onChange: (v: string) => void;
329
- }
330
-
331
- function NameStep(props: NameStepProps) {
332
- var displayName = props.value.trim() || "this-machine";
333
- return (
334
- <div className="flex flex-col">
335
- <div className="flex items-center mb-3.5">
336
- <Server size={22} className="text-primary" />
337
- </div>
338
- <h2 className="font-mono text-[22px] font-bold text-base-content tracking-tight mb-2 leading-tight">
339
- Name this machine
340
- </h2>
341
- <p className="text-[13px] text-base-content/60 leading-relaxed mb-5">
342
- Give this node a recognizable name. It appears in your mesh when you connect multiple computers.
343
- </p>
344
- <fieldset className="fieldset mb-3.5">
345
- <legend className="fieldset-legend text-[11px] font-semibold text-base-content/40 uppercase tracking-[0.08em]">
346
- Machine name
347
- </legend>
348
- <div className="flex items-center gap-2 bg-base-300 border border-base-content/20 rounded-md px-3 h-[44px] focus-within:border-primary transition-colors duration-[120ms]">
349
- <span className="text-primary font-mono font-bold text-[16px]">&gt;</span>
350
- <input
351
- type="text"
352
- value={props.value}
353
- onChange={function (e) { props.onChange(e.target.value); }}
354
- placeholder="my-laptop"
355
- aria-label="Machine name"
356
- className="flex-1 bg-transparent text-base-content font-mono text-[14px] outline-none"
357
- autoFocus
358
- spellCheck={false}
359
- />
360
- </div>
361
- </fieldset>
362
- <div className="flex items-center gap-2 px-3 py-2 bg-base-300 border border-base-content/10 rounded-md">
363
- <span className="text-[10px] uppercase tracking-[0.08em] text-base-content/40 font-semibold">Preview</span>
364
- <span className="font-mono text-[13px] font-semibold text-base-content">{displayName}</span>
365
- <span className="text-base-content/30 text-[12px]">will appear on your mesh</span>
366
- </div>
367
- </div>
368
- );
369
- }
370
-
371
- interface AppearanceStepProps {
372
- theme: ReturnType<typeof useTheme>;
373
- darkQuickPicks: ThemeEntry[];
374
- lightQuickPicks: ThemeEntry[];
375
- }
376
-
377
- function AppearanceStep(props: AppearanceStepProps) {
378
- var { theme, darkQuickPicks, lightQuickPicks } = props;
379
- var quickPicks = theme.mode === "dark" ? darkQuickPicks : lightQuickPicks;
380
-
381
- return (
382
- <div className="flex flex-col">
383
- <div className="flex items-center mb-3.5">
384
- <Palette size={22} className="text-primary" />
385
- </div>
386
- <h2 className="font-mono text-[22px] font-bold text-base-content tracking-tight mb-2 leading-tight">
387
- Choose appearance
388
- </h2>
389
- <p className="text-[13px] text-base-content/60 leading-relaxed mb-4">
390
- Pick a color theme. You can always change this in settings.
391
- </p>
392
-
393
- <div className="flex gap-1.5 mb-4 p-1 bg-base-300 rounded-lg w-fit">
394
- <button
395
- onClick={function () { if (theme.mode !== "dark") { theme.toggleMode(); } }}
396
- className={
397
- "flex items-center gap-1.5 px-3 py-1.5 rounded-md text-[13px] font-medium transition-all duration-[120ms] cursor-pointer " +
398
- (theme.mode === "dark" ? "bg-primary text-primary-content" : "text-base-content/60 hover:text-base-content")
399
- }
400
- >
401
- <Moon size={13} />
402
- Dark
403
- </button>
404
- <button
405
- onClick={function () { if (theme.mode !== "light") { theme.toggleMode(); } }}
406
- className={
407
- "flex items-center gap-1.5 px-3 py-1.5 rounded-md text-[13px] font-medium transition-all duration-[120ms] cursor-pointer " +
408
- (theme.mode === "light" ? "bg-primary text-primary-content" : "text-base-content/60 hover:text-base-content")
409
- }
410
- >
411
- <Sun size={13} />
412
- Light
413
- </button>
414
- </div>
415
-
416
- <div className="grid gap-2 mb-4" style={{ gridTemplateColumns: "repeat(auto-fill, minmax(80px, 1fr))" }}>
417
- {quickPicks.map(function (entry: ThemeEntry) {
418
- var isActive = entry.id === theme.currentThemeId;
419
- var bg = "#" + entry.theme.base00;
420
- var accent = "#" + entry.theme.base0D;
421
- var text = "#" + entry.theme.base05;
422
- var red = "#" + entry.theme.base08;
423
- var green = "#" + entry.theme.base0B;
424
- return (
425
- <button
426
- key={entry.id}
427
- onClick={function () { theme.setTheme(entry.id); }}
428
- title={entry.theme.name}
429
- className={
430
- "relative flex flex-col gap-1.5 p-0 rounded-md overflow-hidden cursor-pointer border-2 transition-all duration-[120ms] " +
431
- (isActive ? "border-primary" : "border-transparent hover:border-base-content/20")
432
- }
433
- >
434
- <div className="w-full h-[48px] flex flex-col" style={{ background: bg }}>
435
- <div className="flex items-center gap-1 px-1.5 py-1" style={{ background: "#" + entry.theme.base01 }}>
436
- <span className="w-1.5 h-1.5 rounded-full" style={{ background: red }} />
437
- <span className="w-6 h-1 rounded" style={{ background: accent, opacity: 0.7 }} />
438
- </div>
439
- <div className="flex flex-col gap-[3px] px-1.5 py-1">
440
- <div className="h-[3px] rounded w-[80%]" style={{ background: accent, opacity: 0.8 }} />
441
- <div className="h-[3px] rounded w-[60%]" style={{ background: text, opacity: 0.4 }} />
442
- <div className="h-[3px] rounded w-[70%]" style={{ background: green, opacity: 0.6 }} />
443
- </div>
444
- </div>
445
- <span className="text-[10px] text-base-content/60 truncate px-1.5 pb-1">{entry.theme.name}</span>
446
- {isActive && (
447
- <div className="absolute top-1 right-1 w-3.5 h-3.5 rounded-full bg-primary flex items-center justify-center">
448
- <Check size={8} className="text-primary-content" />
449
- </div>
450
- )}
451
- </button>
452
- );
453
- })}
454
- </div>
455
-
456
- <div className="rounded-lg border border-base-300 overflow-hidden transition-all duration-300">
457
- <div className="text-[9px] font-mono tracking-[0.05em] uppercase text-base-content/40 px-2.5 py-1.5 bg-base-300 border-b border-base-300 transition-all duration-300">
458
- Preview
459
- </div>
460
- <div className="flex h-[100px] bg-base-100 transition-all duration-300">
461
- <div className="w-[72px] flex-shrink-0 border-r border-base-300 p-2 flex flex-col gap-1">
462
- <div className="text-[8px] font-mono text-base-content/30 uppercase tracking-[0.05em] mb-0.5">Projects</div>
463
- <div className="h-1.5 w-[90%] rounded bg-primary opacity-80" />
464
- <div className="h-1.5 w-[70%] rounded bg-base-300" />
465
- <div className="h-1.5 w-[80%] rounded bg-base-300" />
466
- </div>
467
- <div className="flex-1 p-2.5 flex flex-col gap-1.5">
468
- <div className="text-[9px] font-mono font-semibold text-base-content">New Session</div>
469
- <div className="flex-1 flex flex-col gap-[3px] justify-center">
470
- <div className="flex gap-1 items-start">
471
- <div className="w-3 h-3 rounded-full bg-primary flex-shrink-0 opacity-60" />
472
- <div className="flex flex-col gap-0.5">
473
- <div className="h-1 w-[120px] rounded bg-base-content/20" />
474
- <div className="h-1 w-[80px] rounded bg-base-content/15" />
475
- </div>
476
- </div>
477
- </div>
478
- <div className="h-[18px] rounded bg-base-200 border border-base-300" />
479
- </div>
480
- </div>
481
- </div>
482
- </div>
483
- );
484
- }
485
-
486
- interface SecurityStepProps {
487
- passphrase: string;
488
- passphraseConfirm: string;
489
- error: string;
490
- onPassphraseChange: (v: string) => void;
491
- onConfirmChange: (v: string) => void;
492
- }
493
-
494
- function SecurityStep(props: SecurityStepProps) {
495
- var strength = getPassphraseStrength(props.passphrase);
496
-
497
- return (
498
- <div className="flex flex-col">
499
- <div className="flex items-center mb-3.5">
500
- <Lock size={22} className="text-primary" />
501
- </div>
502
- <h2 className="font-mono text-[22px] font-bold text-base-content tracking-tight mb-2 leading-tight">
503
- Set a passphrase
504
- </h2>
505
-
506
- <div className="flex gap-2 p-3 bg-base-300 border border-base-300 rounded-md mb-4">
507
- <Info size={16} className="text-base-content/40 flex-shrink-0 mt-[1px]" />
508
- <p className="text-[12px] text-base-content/50 leading-relaxed">
509
- Optional. Protects your dashboard on shared networks. Node-to-node connections use separate key-based auth.
510
- </p>
511
- </div>
512
-
513
- <fieldset className="fieldset mb-3.5">
514
- <legend className="fieldset-legend text-[11px] font-semibold text-base-content/40 uppercase tracking-[0.08em]">
515
- Passphrase
516
- </legend>
517
- <input
518
- type="password"
519
- value={props.passphrase}
520
- onChange={function (e) { props.onPassphraseChange(e.target.value); }}
521
- placeholder="Leave blank to skip"
522
- aria-label="Passphrase"
523
- className="input input-bordered w-full bg-base-300 text-base-content text-[14px] focus:border-primary"
524
- autoFocus
525
- />
526
- {props.passphrase.length > 0 && (
527
- <div className="flex items-center gap-2 mt-1.5">
528
- <div className="flex-1 h-1 bg-base-300 rounded-full overflow-hidden">
529
- <div
530
- className="h-full rounded-full transition-all duration-200"
531
- style={{ width: strength.pct + "%", background: strength.color }}
532
- />
533
- </div>
534
- <span className="text-[11px] font-semibold" style={{ color: strength.color }}>{strength.label}</span>
535
- </div>
536
- )}
537
- </fieldset>
538
-
539
- {props.passphrase.length > 0 && (
540
- <fieldset className="fieldset mb-3.5">
541
- <legend className="fieldset-legend text-[11px] font-semibold text-base-content/40 uppercase tracking-[0.08em]">
542
- Confirm passphrase
543
- </legend>
544
- <input
545
- type="password"
546
- value={props.passphraseConfirm}
547
- onChange={function (e) { props.onConfirmChange(e.target.value); }}
548
- placeholder="Repeat passphrase"
549
- aria-label="Confirm passphrase"
550
- className={
551
- "input input-bordered w-full bg-base-300 text-base-content text-[14px] focus:border-primary " +
552
- (props.error ? "border-error" : "")
553
- }
554
- />
555
- </fieldset>
556
- )}
557
-
558
- {props.error && (
559
- <p className="text-[12px] text-error mt-1">{props.error}</p>
560
- )}
561
- </div>
562
- );
563
- }
564
-
565
- function getPassphraseStrength(p: string) {
566
- if (p.length === 0) return { pct: 0, label: "", color: "oklch(from var(--color-base-content) l c h / 0.5)" };
567
- if (p.length < 8) return { pct: 25, label: "Weak", color: "var(--color-error)" };
568
- if (p.length < 14) return { pct: 55, label: "Fair", color: "var(--color-warning)" };
569
- if (p.length < 20) return { pct: 80, label: "Good", color: "var(--color-primary)" };
570
- return { pct: 100, label: "Strong", color: "var(--color-success)" };
571
- }
572
-
573
- interface ProjectStepProps {
574
- path: string;
575
- title: string;
576
- onPathChange: (v: string) => void;
577
- onTitleChange: (v: string) => void;
578
- }
579
-
580
- function ProjectStep(props: ProjectStepProps) {
581
- return (
582
- <div className="flex flex-col">
583
- <div className="flex items-center mb-3.5">
584
- <Folder size={22} className="text-primary" />
585
- </div>
586
- <h2 className="font-mono text-[22px] font-bold text-base-content tracking-tight mb-2 leading-tight">
587
- Add your first project
588
- </h2>
589
- <p className="text-[13px] text-base-content/60 leading-relaxed mb-5">
590
- Point Lattice at a local directory. Claude runs inside that workspace. Add more projects from the sidebar anytime.
591
- </p>
592
- <fieldset className="fieldset mb-3.5">
593
- <legend className="fieldset-legend text-[11px] font-semibold text-base-content/40 uppercase tracking-[0.08em]">
594
- Project path
595
- </legend>
596
- <input
597
- type="text"
598
- value={props.path}
599
- onChange={function (e) { props.onPathChange(e.target.value); }}
600
- placeholder="/home/you/projects/my-app"
601
- aria-label="Project path"
602
- className="input input-bordered w-full bg-base-300 text-base-content font-mono text-[14px] focus:border-primary"
603
- autoFocus
604
- spellCheck={false}
605
- />
606
- <p className="fieldset-label text-[11px] text-base-content/30 mt-1">
607
- Absolute path to a local directory on this machine.
608
- </p>
609
- </fieldset>
610
- <fieldset className="fieldset mb-3.5">
611
- <legend className="fieldset-legend text-[11px] font-semibold text-base-content/40 uppercase tracking-[0.08em]">
612
- Display name <span className="font-normal normal-case tracking-normal">(optional)</span>
613
- </legend>
614
- <input
615
- type="text"
616
- value={props.title}
617
- onChange={function (e) { props.onTitleChange(e.target.value); }}
618
- placeholder={props.path ? (props.path.replace(/\/+$/, "").split("/").pop() || "My App") : "My App"}
619
- aria-label="Display name"
620
- className="input input-bordered w-full bg-base-300 text-base-content text-[14px] focus:border-primary"
621
- />
622
- </fieldset>
623
- </div>
624
- );
625
- }
626
-
627
- interface DoneStepProps {
628
- configured: string[];
629
- }
630
-
631
- function DoneStep(props: DoneStepProps) {
632
- return (
633
- <div className="flex flex-col items-center text-center">
634
- <div className="wizard-check-pop mb-4">
635
- <CheckCircle size={36} className="text-success" strokeWidth={1.5} aria-hidden="true" />
636
- </div>
637
- <h2 className="font-mono text-[26px] font-bold text-base-content tracking-tight mb-2">
638
- You're all set
639
- </h2>
640
- <p className="text-[13px] text-base-content/60 leading-relaxed mb-5">
641
- Lattice is configured and ready to go.
642
- </p>
643
-
644
- {props.configured.length > 0 ? (
645
- <ul className="list-none p-0 m-0 flex flex-col gap-1.5 text-left w-full">
646
- {props.configured.map(function (item: string, i: number) {
647
- return (
648
- <li key={i} className="wizard-fade-in flex items-center gap-2 bg-base-300 px-3 py-2 rounded-md" data-delay={i * 60}>
649
- <span className="w-4 h-4 rounded-full bg-success/20 text-success flex items-center justify-center flex-shrink-0">
650
- <Check size={10} />
651
- </span>
652
- <span className="font-mono text-[12px] text-base-content/60">{item}</span>
653
- </li>
654
- );
655
- })}
656
- </ul>
657
- ) : (
658
- <p className="text-[11px] text-base-content/30">
659
- Everything was skipped — configure it from settings anytime.
660
- </p>
661
- )}
662
- </div>
663
- );
664
- }
665
-
666
- var wizardCSS = `
667
- @keyframes wizard-fade-in {
668
- from { opacity: 0; transform: translateY(12px); }
669
- to { opacity: 1; transform: translateY(0); }
670
- }
671
- @keyframes wizard-slide-in-right {
672
- from { opacity: 0; transform: translateX(24px); }
673
- to { opacity: 1; transform: translateX(0); }
674
- }
675
- @keyframes wizard-slide-in-left {
676
- from { opacity: 0; transform: translateX(-24px); }
677
- to { opacity: 1; transform: translateX(0); }
678
- }
679
- @keyframes wizard-slide-out-left {
680
- from { opacity: 1; transform: translateX(0); }
681
- to { opacity: 0; transform: translateX(-24px); }
682
- }
683
- @keyframes wizard-slide-out-right {
684
- from { opacity: 1; transform: translateX(0); }
685
- to { opacity: 0; transform: translateX(24px); }
686
- }
687
- @keyframes wizard-check-pop {
688
- 0% { transform: scale(0.5); opacity: 0; }
689
- 70% { transform: scale(1.15); }
690
- 100% { transform: scale(1); opacity: 1; }
691
- }
692
- @keyframes wizard-cursor-blink {
693
- 0%, 100% { opacity: 1; }
694
- 50% { opacity: 0; }
695
- }
696
- @keyframes wizard-grid-shift {
697
- 0% { background-position: 0 0; }
698
- 100% { background-position: 40px 40px; }
699
- }
700
- .wizard-fade-in {
701
- animation: wizard-fade-in 400ms ease both;
702
- }
703
- .wizard-slide-in-right {
704
- animation: wizard-slide-in-right 220ms ease both;
705
- }
706
- .wizard-slide-in-left {
707
- animation: wizard-slide-in-left 220ms ease both;
708
- }
709
- .wizard-slide-out-left {
710
- animation: wizard-slide-out-left 180ms ease both;
711
- }
712
- .wizard-slide-out-right {
713
- animation: wizard-slide-out-right 180ms ease both;
714
- }
715
- .wizard-check-pop {
716
- animation: wizard-check-pop 500ms cubic-bezier(0.175, 0.885, 0.32, 1.275) both;
717
- }
718
- .wizard-btn-primary {
719
- transition: background 150ms ease, transform 100ms ease, box-shadow 150ms ease !important;
720
- }
721
- .wizard-btn-primary:hover {
722
- transform: translateY(-1px);
723
- box-shadow: 0 4px 16px oklch(from var(--color-primary) l c h / 0.35);
724
- }
725
- .wizard-btn-primary:active {
726
- transform: translateY(0);
727
- }
728
- .wizard-btn-done {
729
- transition: background 150ms ease, transform 100ms ease, box-shadow 150ms ease !important;
730
- }
731
- .wizard-btn-done:hover {
732
- filter: brightness(1.08);
733
- transform: translateY(-1px);
734
- box-shadow: 0 4px 20px oklch(from var(--color-success) l c h / 0.4);
735
- }
736
- .wizard-btn-done:active {
737
- transform: translateY(0);
738
- }
739
- @media (prefers-reduced-motion: reduce) {
740
- .wizard-fade-in,
741
- .wizard-slide-in-right,
742
- .wizard-slide-in-left,
743
- .wizard-slide-out-left,
744
- .wizard-slide-out-right,
745
- .wizard-check-pop {
746
- animation: none !important;
747
- opacity: 1 !important;
748
- transform: none !important;
749
- }
750
- .wizard-btn-primary:hover,
751
- .wizard-btn-done:hover {
752
- transform: none !important;
753
- }
754
- }
755
- `;