@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,318 +0,0 @@
1
- import { useState, useEffect } from "react";
2
- import { ChevronDown, ChevronRight } from "lucide-react";
3
- import { SaveFooter } from "../ui/SaveFooter";
4
- import { useSaveState } from "../../hooks/useSaveState";
5
- import type { ProjectSettings, ThinkingConfig } from "#shared";
6
-
7
- var CLAUDE_MODELS = [
8
- { id: "claude-opus-4-6", label: "Claude Opus 4.6" },
9
- { id: "claude-sonnet-4-6", label: "Claude Sonnet 4.6" },
10
- { id: "claude-haiku-4-5", label: "Claude Haiku 4.5" },
11
- { id: "claude-opus-4-5", label: "Claude Opus 4.5" },
12
- { id: "claude-sonnet-4-5", label: "Claude Sonnet 4.5" },
13
- ];
14
-
15
- var EFFORT_LEVELS = [
16
- { id: "low", label: "Low" },
17
- { id: "normal", label: "Normal" },
18
- { id: "high", label: "High" },
19
- { id: "max", label: "Max" },
20
- ];
21
-
22
- var THINKING_MODES = [
23
- { id: "adaptive", label: "Adaptive" },
24
- { id: "enabled", label: "Enabled" },
25
- { id: "disabled", label: "Disabled" },
26
- ];
27
-
28
- var PERMISSION_MODES = [
29
- { id: "default", label: "Default" },
30
- { id: "acceptEdits", label: "Accept Edits" },
31
- { id: "plan", label: "Plan" },
32
- { id: "dontAsk", label: "Don't Ask" },
33
- ];
34
-
35
- function thinkingLabel(t?: ThinkingConfig): string {
36
- if (!t) return "Adaptive";
37
- if (t.type === "adaptive") return "Adaptive";
38
- if (t.type === "enabled") return "Enabled";
39
- return "Disabled";
40
- }
41
-
42
- function modelLabel(id: string): string {
43
- var found = CLAUDE_MODELS.find(function (m) { return m.id === id; });
44
- return found ? found.label : id;
45
- }
46
-
47
- interface ProjectClaudeProps {
48
- settings: ProjectSettings;
49
- updateSection: (section: string, data: Record<string, unknown>) => void;
50
- }
51
-
52
- export function ProjectClaude({ settings, updateSection }: ProjectClaudeProps) {
53
- var [claudeMd, setClaudeMd] = useState(settings.claudeMd ?? "");
54
- var [defaultModel, setDefaultModel] = useState<string | undefined>(settings.defaultModel);
55
- var [defaultEffort, setDefaultEffort] = useState<string | undefined>(settings.defaultEffort);
56
- var [thinking, setThinking] = useState<ThinkingConfig | undefined>(settings.thinking);
57
- var [permissionMode, setPermissionMode] = useState<string | undefined>(settings.permissionMode);
58
- var [budgetTokens, setBudgetTokens] = useState<number>(
59
- settings.thinking?.type === "enabled" ? (settings.thinking.budgetTokens ?? 10000) : 10000,
60
- );
61
- var [showGlobalMd, setShowGlobalMd] = useState(false);
62
- var save = useSaveState();
63
-
64
- useEffect(function () {
65
- if (save.savingRef.current) {
66
- save.confirmSave();
67
- } else {
68
- setClaudeMd(settings.claudeMd ?? "");
69
- setDefaultModel(settings.defaultModel);
70
- setDefaultEffort(settings.defaultEffort);
71
- setThinking(settings.thinking);
72
- setPermissionMode(settings.permissionMode);
73
- if (settings.thinking?.type === "enabled") {
74
- setBudgetTokens(settings.thinking.budgetTokens ?? 10000);
75
- }
76
- save.resetFromServer();
77
- }
78
- }, [settings]);
79
-
80
- function handleSave() {
81
- save.startSave();
82
- var thinkingValue: ThinkingConfig | undefined = thinking;
83
- if (thinkingValue?.type === "enabled") {
84
- thinkingValue = { type: "enabled", budgetTokens };
85
- }
86
- updateSection("claude", {
87
- claudeMd: claudeMd || undefined,
88
- defaultModel,
89
- defaultEffort,
90
- thinking: thinkingValue,
91
- permissionMode,
92
- });
93
- }
94
-
95
- var globalModel = settings.global.defaultModel || CLAUDE_MODELS[0].id;
96
- var globalEffort = settings.global.defaultEffort || "normal";
97
-
98
- return (
99
- <div className="py-2 space-y-6">
100
- <div>
101
- <label htmlFor="project-claude-md" className="block text-[12px] font-semibold text-base-content/40 mb-2">
102
- Project CLAUDE.md
103
- </label>
104
- <textarea
105
- id="project-claude-md"
106
- value={claudeMd}
107
- onChange={function (e) { setClaudeMd(e.target.value); save.markDirty(); }}
108
- placeholder="# Project-specific instructions for Claude..."
109
- rows={10}
110
- className="w-full px-3 py-2.5 bg-base-300 border border-base-content/15 rounded-xl text-base-content text-[12px] font-mono leading-relaxed resize-y focus:border-primary focus-visible:outline-none transition-colors duration-[120ms]"
111
- />
112
- {(function () {
113
- var lineCount = claudeMd ? claudeMd.split("\n").length : 0;
114
- var overLimit = lineCount > 200;
115
- return (
116
- <div className="flex items-center justify-between mt-1.5">
117
- <div className={"text-[11px] " + (overLimit ? "text-warning" : "text-base-content/25")}>
118
- {lineCount} line{lineCount !== 1 ? "s" : ""}{overLimit ? " — consider moving content to rules or imports" : ""}
119
- </div>
120
- {overLimit && (
121
- <div className="text-[10px] text-warning/70">soft limit: 200 lines</div>
122
- )}
123
- </div>
124
- );
125
- })()}
126
- <button
127
- type="button"
128
- onClick={function () { setShowGlobalMd(!showGlobalMd); }}
129
- className="flex items-center gap-1.5 mt-2 text-[11px] text-base-content/40 hover:text-base-content/60 transition-colors"
130
- >
131
- {showGlobalMd
132
- ? <ChevronDown size={12} />
133
- : <ChevronRight size={12} />}
134
- Global CLAUDE.md (inherited)
135
- </button>
136
- {showGlobalMd && (
137
- <textarea
138
- readOnly
139
- value={settings.global.claudeMd}
140
- rows={8}
141
- className="w-full mt-2 px-3 py-2.5 bg-base-300 border border-base-content/15 rounded-xl text-base-content/30 text-[12px] font-mono leading-relaxed resize-y cursor-default focus-visible:outline-none"
142
- />
143
- )}
144
- </div>
145
-
146
- <div>
147
- <label htmlFor="project-default-model" className="block text-[12px] font-semibold text-base-content/40 mb-2">
148
- Default Model
149
- </label>
150
- <select
151
- id="project-default-model"
152
- value={defaultModel ?? ""}
153
- onChange={function (e) {
154
- var val = e.target.value || undefined;
155
- setDefaultModel(val);
156
- save.markDirty();
157
- }}
158
- className="w-full h-9 px-3 bg-base-300 border border-base-content/15 rounded-xl text-base-content text-[13px] focus:border-primary focus-visible:outline-none transition-colors duration-[120ms]"
159
- >
160
- <option value="" className="bg-base-300">
161
- Use global default ({modelLabel(globalModel)})
162
- </option>
163
- {CLAUDE_MODELS.map(function (m) {
164
- return (
165
- <option key={m.id} value={m.id} className="bg-base-300">
166
- {m.label}
167
- </option>
168
- );
169
- })}
170
- </select>
171
- {defaultModel && (
172
- <button
173
- type="button"
174
- onClick={function () { setDefaultModel(undefined); save.markDirty(); }}
175
- className="mt-1.5 text-[11px] text-primary/70 hover:text-primary transition-colors"
176
- >
177
- Clear override
178
- </button>
179
- )}
180
- </div>
181
-
182
- <div role="radiogroup" aria-label="Default Effort">
183
- <div className="text-[12px] font-semibold text-base-content/40 mb-2">Default Effort</div>
184
- <div className="flex gap-2">
185
- <button
186
- role="radio"
187
- aria-checked={defaultEffort === undefined}
188
- onClick={function () { setDefaultEffort(undefined); save.markDirty(); }}
189
- className={
190
- "flex-1 py-2.5 sm:py-1.5 rounded-lg border text-[12px] transition-colors duration-[120ms] cursor-pointer focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1 focus-visible:ring-offset-base-100 " +
191
- (defaultEffort === undefined
192
- ? "border-primary bg-base-300 text-base-content font-semibold"
193
- : "border-base-content/15 bg-base-300 text-base-content/40 hover:border-base-content/30 hover:text-base-content/60")
194
- }
195
- >
196
- Global ({globalEffort})
197
- </button>
198
- {EFFORT_LEVELS.map(function (e) {
199
- var active = defaultEffort === e.id;
200
- return (
201
- <button
202
- key={e.id}
203
- role="radio"
204
- aria-checked={active}
205
- onClick={function () { setDefaultEffort(e.id); save.markDirty(); }}
206
- className={
207
- "flex-1 py-2.5 sm:py-1.5 rounded-lg border text-[12px] transition-colors duration-[120ms] cursor-pointer focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1 focus-visible:ring-offset-base-100 " +
208
- (active
209
- ? "border-primary bg-base-300 text-base-content font-semibold"
210
- : "border-base-content/15 bg-base-300 text-base-content/40 hover:border-base-content/30 hover:text-base-content/60")
211
- }
212
- >
213
- {e.label}
214
- </button>
215
- );
216
- })}
217
- </div>
218
- </div>
219
-
220
- <div role="radiogroup" aria-label="Thinking Mode">
221
- <div className="text-[12px] font-semibold text-base-content/40 mb-2">Thinking Mode</div>
222
- <div className="flex gap-2">
223
- <button
224
- role="radio"
225
- aria-checked={thinking === undefined}
226
- onClick={function () { setThinking(undefined); save.markDirty(); }}
227
- className={
228
- "flex-1 py-2.5 sm:py-1.5 rounded-lg border text-[12px] transition-colors duration-[120ms] cursor-pointer focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1 focus-visible:ring-offset-base-100 " +
229
- (thinking === undefined
230
- ? "border-primary bg-base-300 text-base-content font-semibold"
231
- : "border-base-content/15 bg-base-300 text-base-content/40 hover:border-base-content/30 hover:text-base-content/60")
232
- }
233
- >
234
- Global ({thinkingLabel(settings.global.thinking)})
235
- </button>
236
- {THINKING_MODES.map(function (t) {
237
- var active = thinking?.type === t.id;
238
- return (
239
- <button
240
- key={t.id}
241
- role="radio"
242
- aria-checked={active}
243
- onClick={function () {
244
- var cfg: ThinkingConfig = t.id === "enabled"
245
- ? { type: "enabled", budgetTokens }
246
- : { type: t.id as "adaptive" | "disabled" };
247
- setThinking(cfg);
248
- save.markDirty();
249
- }}
250
- className={
251
- "flex-1 py-2.5 sm:py-1.5 rounded-lg border text-[12px] transition-colors duration-[120ms] cursor-pointer focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1 focus-visible:ring-offset-base-100 " +
252
- (active
253
- ? "border-primary bg-base-300 text-base-content font-semibold"
254
- : "border-base-content/15 bg-base-300 text-base-content/40 hover:border-base-content/30 hover:text-base-content/60")
255
- }
256
- >
257
- {t.label}
258
- </button>
259
- );
260
- })}
261
- </div>
262
- {thinking?.type === "enabled" && (
263
- <div className="mt-3">
264
- <label htmlFor="budget-tokens" className="block text-[11px] text-base-content/40 mb-1.5">
265
- Budget Tokens
266
- </label>
267
- <input
268
- id="budget-tokens"
269
- type="number"
270
- min={1000}
271
- step={1000}
272
- value={budgetTokens}
273
- onChange={function (e) {
274
- var val = parseInt(e.target.value, 10);
275
- if (!isNaN(val)) {
276
- setBudgetTokens(val);
277
- setThinking({ type: "enabled", budgetTokens: val });
278
- save.markDirty();
279
- }
280
- }}
281
- className="w-48 h-9 px-3 bg-base-300 border border-base-content/15 rounded-xl text-base-content text-[13px] font-mono focus:border-primary focus-visible:outline-none transition-colors duration-[120ms]"
282
- />
283
- </div>
284
- )}
285
- </div>
286
-
287
- <div role="radiogroup" aria-label="Permission Mode">
288
- <div className="text-[12px] font-semibold text-base-content/40 mb-2">Permission Mode</div>
289
- <div className="flex gap-2">
290
- {PERMISSION_MODES.map(function (p) {
291
- var active = (permissionMode ?? "default") === p.id;
292
- return (
293
- <button
294
- key={p.id}
295
- role="radio"
296
- aria-checked={active}
297
- onClick={function () {
298
- setPermissionMode(p.id === "default" ? undefined : p.id);
299
- save.markDirty();
300
- }}
301
- className={
302
- "flex-1 py-2.5 sm:py-1.5 rounded-lg border text-[12px] transition-colors duration-[120ms] cursor-pointer focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1 focus-visible:ring-offset-base-100 " +
303
- (active
304
- ? "border-primary bg-base-300 text-base-content font-semibold"
305
- : "border-base-content/15 bg-base-300 text-base-content/40 hover:border-base-content/30 hover:text-base-content/60")
306
- }
307
- >
308
- {p.label}
309
- </button>
310
- );
311
- })}
312
- </div>
313
- </div>
314
-
315
- <SaveFooter dirty={save.dirty} saving={save.saving} saveState={save.saveState} onSave={handleSave} />
316
- </div>
317
- );
318
- }
@@ -1,235 +0,0 @@
1
- import { useState, useEffect, useMemo } from "react";
2
- import { X, Plus, AlertTriangle } from "lucide-react";
3
- import { SaveFooter } from "../ui/SaveFooter";
4
- import { useSaveState } from "../../hooks/useSaveState";
5
- import { findDuplicateKeys } from "../../utils/findDuplicateKeys";
6
- import type { ProjectSettings } from "#shared";
7
-
8
- interface EnvEntry {
9
- id: string;
10
- key: string;
11
- value: string;
12
- }
13
-
14
- function genId(): string {
15
- return Math.random().toString(36).slice(2, 10);
16
- }
17
-
18
- function entriesToEnv(entries: EnvEntry[]): Record<string, string> {
19
- var env: Record<string, string> = {};
20
- entries.forEach(function (e) {
21
- if (e.key.trim()) {
22
- env[e.key.trim()] = e.value;
23
- }
24
- });
25
- return env;
26
- }
27
-
28
- function envToEntries(env: Record<string, string>): EnvEntry[] {
29
- return Object.entries(env).map(function ([k, v]) {
30
- return { id: genId(), key: k, value: v };
31
- });
32
- }
33
-
34
- export function ProjectEnvironment({
35
- settings,
36
- updateSection,
37
- }: {
38
- settings: ProjectSettings;
39
- updateSection: (section: string, data: Record<string, unknown>) => void;
40
- }) {
41
- var globalEnv = settings.global.env ?? {};
42
- var globalEntries = Object.entries(globalEnv);
43
-
44
- var [entries, setEntries] = useState<EnvEntry[]>(function () {
45
- return envToEntries(settings.env ?? {});
46
- });
47
- var save = useSaveState();
48
-
49
- useEffect(function () {
50
- if (save.savingRef.current) {
51
- save.confirmSave();
52
- } else {
53
- setEntries(envToEntries(settings.env ?? {}));
54
- save.resetFromServer();
55
- }
56
- }, [settings]);
57
-
58
- var globalKeySet = useMemo(function () {
59
- return new Set(Object.keys(globalEnv));
60
- }, [globalEnv]);
61
-
62
- var duplicateKeys = useMemo(function () {
63
- return findDuplicateKeys(entries);
64
- }, [entries]);
65
- var hasDuplicates = duplicateKeys.size > 0;
66
-
67
- function handleAddRow() {
68
- setEntries(function (prev) {
69
- return [...prev, { id: genId(), key: "", value: "" }];
70
- });
71
- save.markDirty();
72
- }
73
-
74
- function handleDelete(id: string) {
75
- setEntries(function (prev) {
76
- return prev.filter(function (e) { return e.id !== id; });
77
- });
78
- save.markDirty();
79
- }
80
-
81
- function handleKeyChange(id: string, key: string) {
82
- setEntries(function (prev) {
83
- return prev.map(function (e) {
84
- return e.id === id ? { ...e, key } : e;
85
- });
86
- });
87
- save.markDirty();
88
- }
89
-
90
- function handleValueChange(id: string, value: string) {
91
- setEntries(function (prev) {
92
- return prev.map(function (e) {
93
- return e.id === id ? { ...e, value } : e;
94
- });
95
- });
96
- save.markDirty();
97
- }
98
-
99
- function handleSave() {
100
- save.startSave();
101
- updateSection("environment", { env: entriesToEnv(entries) });
102
- }
103
-
104
- var inputClass = "w-full h-9 sm:h-7 px-3 bg-base-300 border border-base-content/15 rounded-xl text-base-content font-mono text-[12px] focus:border-primary focus-visible:outline-none transition-colors duration-[120ms]";
105
-
106
- return (
107
- <div className="py-2">
108
- <div className="mb-6">
109
- <h2 className="text-[12px] font-semibold text-base-content/40 mb-3">
110
- Global Variables
111
- </h2>
112
- {globalEntries.length === 0 && (
113
- <div className="py-4 text-center text-[13px] text-base-content/30">
114
- No global environment variables.
115
- </div>
116
- )}
117
- {globalEntries.length > 0 && (
118
- <div className="flex flex-col gap-1.5">
119
- {globalEntries.map(function ([k, v]) {
120
- return (
121
- <div
122
- key={k}
123
- className="flex flex-col sm:grid sm:grid-cols-[1fr_1fr_auto] gap-1.5 sm:items-center"
124
- >
125
- <div className="h-9 sm:h-7 px-3 bg-base-300/50 border border-base-content/10 rounded-xl flex items-center font-mono text-[12px] text-base-content/40">
126
- {k}
127
- </div>
128
- <div className="flex gap-1.5 items-center">
129
- <div className="h-9 sm:h-7 px-3 bg-base-300/50 border border-base-content/10 rounded-xl flex items-center font-mono text-[12px] text-base-content/40 w-full">
130
- {String(v)}
131
- </div>
132
- </div>
133
- <span className="text-[10px] uppercase tracking-wider text-base-content/30 w-7 text-center hidden sm:block">
134
- global
135
- </span>
136
- </div>
137
- );
138
- })}
139
- </div>
140
- )}
141
- </div>
142
-
143
- <div>
144
- <h2 className="text-[12px] font-semibold text-base-content/40 mb-3">
145
- Project Variables
146
- </h2>
147
- <div className="flex flex-col gap-3 sm:gap-1.5 mb-3">
148
- {entries.length === 0 && (
149
- <div className="py-4 text-center text-[13px] text-base-content/30">
150
- No project environment variables.
151
- </div>
152
- )}
153
- {entries.map(function (entry, idx) {
154
- var isDupe = entry.key.trim() !== "" && duplicateKeys.has(entry.key.trim());
155
- var overridesGlobal = entry.key.trim() !== "" && globalKeySet.has(entry.key.trim());
156
- return (
157
- <div
158
- key={entry.id}
159
- className="flex flex-col sm:grid sm:grid-cols-[1fr_1fr_auto] gap-1.5 sm:items-center"
160
- >
161
- <div className="relative">
162
- <input
163
- type="text"
164
- value={entry.key}
165
- onChange={function (e) { handleKeyChange(entry.id, e.target.value); }}
166
- placeholder="VARIABLE_NAME"
167
- aria-label={"Variable name for row " + (idx + 1)}
168
- aria-invalid={isDupe}
169
- className={
170
- "w-full h-9 sm:h-7 px-3 bg-base-300 border rounded-xl text-base-content font-mono text-[12px] focus:border-primary focus-visible:outline-none transition-colors duration-[120ms] " +
171
- (isDupe ? "border-warning" : "border-base-content/15")
172
- }
173
- />
174
- {isDupe && (
175
- <div className="flex items-center gap-1 mt-0.5 text-[10px] text-warning sm:absolute sm:-bottom-3.5 sm:left-0" role="alert">
176
- <AlertTriangle size={9} />
177
- Duplicate key
178
- </div>
179
- )}
180
- {!isDupe && overridesGlobal && (
181
- <div className="flex items-center gap-1 mt-0.5 text-[10px] text-warning/70 sm:absolute sm:-bottom-3.5 sm:left-0">
182
- overrides global
183
- </div>
184
- )}
185
- </div>
186
- <div className="flex gap-1.5 items-center">
187
- <input
188
- type="text"
189
- value={entry.value}
190
- onChange={function (e) { handleValueChange(entry.id, e.target.value); }}
191
- placeholder="value"
192
- aria-label={"Value for " + (entry.key || "row " + (idx + 1))}
193
- className={inputClass}
194
- />
195
- <button
196
- onClick={function () { handleDelete(entry.id); }}
197
- aria-label={"Delete " + (entry.key || "row " + (idx + 1))}
198
- title="Delete"
199
- className="btn btn-ghost btn-xs btn-square text-base-content/30 hover:text-error w-9 h-9 flex-shrink-0 sm:hidden focus-visible:ring-2 focus-visible:ring-primary"
200
- >
201
- <X size={14} />
202
- </button>
203
- </div>
204
- <button
205
- onClick={function () { handleDelete(entry.id); }}
206
- aria-label={"Delete " + (entry.key || "row " + (idx + 1))}
207
- title="Delete"
208
- className="btn btn-ghost btn-xs btn-square text-base-content/30 hover:text-error w-7 h-7 hidden sm:flex focus-visible:ring-2 focus-visible:ring-primary"
209
- >
210
- <X size={12} />
211
- </button>
212
- </div>
213
- );
214
- })}
215
- </div>
216
-
217
- <button
218
- onClick={handleAddRow}
219
- className="flex items-center gap-1.5 px-3 py-2.5 sm:py-1.5 rounded-xl border border-dashed border-base-content/20 bg-transparent text-base-content/40 text-[12px] hover:text-base-content/60 hover:border-base-content/30 transition-colors duration-[120ms] mb-5 cursor-pointer focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1 focus-visible:ring-offset-base-100"
220
- >
221
- <Plus size={12} />
222
- Add Variable
223
- </button>
224
-
225
- <SaveFooter
226
- dirty={save.dirty}
227
- saving={save.saving}
228
- saveState={save.saveState}
229
- onSave={handleSave}
230
- extraStatus={hasDuplicates ? "Duplicate keys will be merged" : undefined}
231
- />
232
- </div>
233
- </div>
234
- );
235
- }
@@ -1,76 +0,0 @@
1
- import { useState, useEffect } from "react";
2
- import { IconPicker } from "../ui/IconPicker";
3
- import { SaveFooter } from "../ui/SaveFooter";
4
- import { useSaveState } from "../../hooks/useSaveState";
5
- import type { ProjectSettings, ProjectIcon } from "#shared";
6
-
7
- interface ProjectGeneralProps {
8
- settings: ProjectSettings;
9
- updateSection: (section: string, data: Record<string, unknown>) => void;
10
- }
11
-
12
- export function ProjectGeneral({ settings, updateSection }: ProjectGeneralProps) {
13
- var [title, setTitle] = useState(settings.title);
14
- var [icon, setIcon] = useState<ProjectIcon | undefined>(settings.icon);
15
- var save = useSaveState();
16
-
17
- useEffect(function () {
18
- if (save.savingRef.current) {
19
- save.confirmSave();
20
- } else {
21
- setTitle(settings.title);
22
- setIcon(settings.icon);
23
- save.resetFromServer();
24
- }
25
- }, [settings]);
26
-
27
- function handleTitleChange(value: string) {
28
- setTitle(value);
29
- save.markDirty();
30
- }
31
-
32
- function handleIconChange(value: ProjectIcon) {
33
- setIcon(value);
34
- save.markDirty();
35
- }
36
-
37
- function handleSave() {
38
- save.startSave();
39
- updateSection("general", { title, icon });
40
- }
41
-
42
- return (
43
- <div className="py-2">
44
- <div className="mb-5">
45
- <label htmlFor="project-title" className="block text-[12px] font-semibold text-base-content/40 mb-2">
46
- Display Name
47
- </label>
48
- <input
49
- id="project-title"
50
- type="text"
51
- value={title}
52
- onChange={function (e) { handleTitleChange(e.target.value); }}
53
- className="w-full h-9 px-3 bg-base-300 border border-base-content/15 rounded-xl text-base-content text-[13px] focus:border-primary focus-visible:outline-none transition-colors duration-[120ms]"
54
- />
55
- </div>
56
-
57
- <div className="mb-5">
58
- <div className="block text-[12px] font-semibold text-base-content/40 mb-2">
59
- Icon
60
- </div>
61
- <IconPicker value={icon} onChange={handleIconChange} />
62
- </div>
63
-
64
- <div className="mb-6">
65
- <div className="block text-[12px] font-semibold text-base-content/40 mb-2">
66
- Project Path
67
- </div>
68
- <div className="w-full h-9 px-3 bg-base-300 border border-base-content/15 rounded-xl text-base-content/60 text-[12px] font-mono flex items-center select-all">
69
- {settings.path}
70
- </div>
71
- </div>
72
-
73
- <SaveFooter dirty={save.dirty} saving={save.saving} saveState={save.saveState} onSave={handleSave} />
74
- </div>
75
- );
76
- }