@cryptiklemur/lattice 4.0.2 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (394) hide show
  1. package/bin/lattice +1 -9
  2. package/dist/client/assets/{angular-html-N8PCEquT.js → angular-html-DKTL-XDO.js} +1 -1
  3. package/dist/client/assets/{angular-ts-CJ8RJIPD.js → angular-ts-tvBzOwQR.js} +1 -1
  4. package/dist/client/assets/{apl-BD6tCLWN.js → apl-CCzl5qFl.js} +1 -1
  5. package/dist/client/assets/{astro-CpIIfBs6.js → astro-DNQTpO2Y.js} +1 -1
  6. package/dist/client/assets/{blade-D3qgnjiV.js → blade-CyJoIMeJ.js} +1 -1
  7. package/dist/client/assets/{c-Dr6ADN_t.js → c-OEwk5KN8.js} +1 -1
  8. package/dist/client/assets/{cobol-BIfDE0Hr.js → cobol-DpHyJzz2.js} +1 -1
  9. package/dist/client/assets/{coffee-DHQ57vfY.js → coffee-BX5dbDzZ.js} +1 -1
  10. package/dist/client/assets/{cpp-CEBY6JOp.js → cpp-BTBjNg2U.js} +1 -1
  11. package/dist/client/assets/{crystal-D125CSmP.js → crystal-CNzZd6DW.js} +1 -1
  12. package/dist/client/assets/{css-CBmrkYSr.js → css-BuKsNmms.js} +1 -1
  13. package/dist/client/assets/{dist-A_mCRD1f.js → dist-CKpDHMy6.js} +2 -2
  14. package/dist/client/assets/{edge-Ccsz7cJW.js → edge-DzhnGgJE.js} +1 -1
  15. package/dist/client/assets/{elixir-Do6gk14X.js → elixir-Dqs0waqF.js} +1 -1
  16. package/dist/client/assets/{elm-Db22zT4C.js → elm-BtWwjxWn.js} +1 -1
  17. package/dist/client/assets/{erb-MXVqAAJD.js → erb-iPD89b4v.js} +1 -1
  18. package/dist/client/assets/{git-rebase-B-LLWBOA.js → git-rebase-BxVNXJL4.js} +1 -1
  19. package/dist/client/assets/{glimmer-js-eWszRU73.js → glimmer-js-BlyCupwF.js} +1 -1
  20. package/dist/client/assets/{glimmer-ts-VQmwGqUp.js → glimmer-ts-DjIxWOS9.js} +1 -1
  21. package/dist/client/assets/{glsl-B8ilOfAl.js → glsl-CGIL-65r.js} +1 -1
  22. package/dist/client/assets/{graphql-DnTqxeOc.js → graphql-DeOn6mNV.js} +1 -1
  23. package/dist/client/assets/{hack-XJsHYSQb.js → hack-DVppeCmS.js} +1 -1
  24. package/dist/client/assets/{haml-CQ7Vqzwp.js → haml-WDhua0Mp.js} +1 -1
  25. package/dist/client/assets/{handlebars-C4szooBf.js → handlebars-i2Fu_9HI.js} +1 -1
  26. package/dist/client/assets/{html-B6EgAiSd.js → html-B1e6oxzK.js} +1 -1
  27. package/dist/client/assets/{html-derivative-DdinogQX.js → html-derivative-MofKXIVd.js} +1 -1
  28. package/dist/client/assets/{http-BSLxCgRq.js → http-Dk6S5pRD.js} +1 -1
  29. package/dist/client/assets/{hurl-pOsTwNfp.js → hurl-CroFYYJG.js} +1 -1
  30. package/dist/client/assets/{index-BHQ_8mvl.js → index-CVu-S6Yk.js} +2 -2
  31. package/dist/client/assets/{java-DRQLiiST.js → java-B89FYjqS.js} +1 -1
  32. package/dist/client/assets/{javascript-DvEK2-47.js → javascript-m6CO1Uiy.js} +1 -1
  33. package/dist/client/assets/{jinja-D2NYJ25y.js → jinja-DC9Wi41X.js} +1 -1
  34. package/dist/client/assets/{jison-DDZaLNAp.js → jison-6xiegwDk.js} +1 -1
  35. package/dist/client/assets/{json-TGR0NIWd.js → json-HA-96-qr.js} +1 -1
  36. package/dist/client/assets/{jsx-BjUoPYga.js → jsx-Wt1a8i8U.js} +1 -1
  37. package/dist/client/assets/{julia-C4gjSpFu.js → julia-7M93VBON.js} +1 -1
  38. package/dist/client/assets/{just-H351x5u_.js → just-CjfDLYLv.js} +1 -1
  39. package/dist/client/assets/{latex-BiTmf6gf.js → latex-CitsJ46x.js} +1 -1
  40. package/dist/client/assets/{liquid-86ufjRy-.js → liquid-C8VIFin8.js} +1 -1
  41. package/dist/client/assets/{lua-BNxR0F_8.js → lua-Ba2N7esc.js} +1 -1
  42. package/dist/client/assets/{marko-CvRxpRjM.js → marko-lTLvb2wu.js} +1 -1
  43. package/dist/client/assets/{mdc-CYbAIy2C.js → mdc-D6IV-8FD.js} +1 -1
  44. package/dist/client/assets/{nginx-egdgMq-F.js → nginx-Ch5AjE6S.js} +1 -1
  45. package/dist/client/assets/{nim-CXBJVz_w.js → nim-WmDDC6LW.js} +1 -1
  46. package/dist/client/assets/{perl-XRfMobzg.js → perl-CQv0gYuq.js} +1 -1
  47. package/dist/client/assets/{php-Br7a8uil.js → php-BJmH0qOB.js} +1 -1
  48. package/dist/client/assets/{pug-BVbbUVvy.js → pug-CsHPkzc9.js} +1 -1
  49. package/dist/client/assets/{qml-ByKvrL1j.js → qml-B36ecArG.js} +1 -1
  50. package/dist/client/assets/{r-mVoV0Ni6.js → r-D5Yi5Z4y.js} +1 -1
  51. package/dist/client/assets/{razor-T5O-9UJL.js → razor-CHAxVq4R.js} +1 -1
  52. package/dist/client/assets/{regexp-CioRuhuN.js → regexp-gfs--3M7.js} +1 -1
  53. package/dist/client/assets/{rst-V__uTudD.js → rst-ugdlp-hl.js} +1 -1
  54. package/dist/client/assets/{ruby-C_PuKPTI.js → ruby-CDRRW37j.js} +1 -1
  55. package/dist/client/assets/{sas-D_DqqQH4.js → sas-DZaNQaIP.js} +1 -1
  56. package/dist/client/assets/{scss-D-TjzZ4c.js → scss-CzWQEplj.js} +1 -1
  57. package/dist/client/assets/{shellscript-E5759VHu.js → shellscript-fgYvpu9N.js} +1 -1
  58. package/dist/client/assets/{shellsession-AESTM-Pv.js → shellsession-BoAohHh7.js} +1 -1
  59. package/dist/client/assets/{soy-QrbrrcDv.js → soy-DBzVgv9x.js} +1 -1
  60. package/dist/client/assets/{sql-0M8VcDHD.js → sql-BYXpAYTs.js} +1 -1
  61. package/dist/client/assets/{stata-CgeIpGtc.js → stata-I71MMY3p.js} +1 -1
  62. package/dist/client/assets/{surrealql-DBGwnZbw.js → surrealql-C9U8_1VO.js} +1 -1
  63. package/dist/client/assets/{svelte-Cv0PvUc_.js → svelte-VOFrPnWT.js} +1 -1
  64. package/dist/client/assets/{templ-B9t7xRE4.js → templ-BIaxAEtC.js} +1 -1
  65. package/dist/client/assets/{tex-DhZZ8dr2.js → tex-D1dwnBE5.js} +1 -1
  66. package/dist/client/assets/{ts-tags-BFv8sbnd.js → ts-tags-C0L2Q0r5.js} +1 -1
  67. package/dist/client/assets/{tsx-CXC9KSbY.js → tsx-BqcycEv1.js} +1 -1
  68. package/dist/client/assets/{twig-CM_OO66r.js → twig-vyWqOhpM.js} +1 -1
  69. package/dist/client/assets/{typescript-BdgOTaoD.js → typescript-B2YbovqG.js} +1 -1
  70. package/dist/client/assets/{vue-BnQhjnCm.js → vue-CbXxGdjo.js} +1 -1
  71. package/dist/client/assets/{vue-html-CNnGecRI.js → vue-html-DDX4KXW7.js} +1 -1
  72. package/dist/client/assets/{vue-vine-DCuMkRhK.js → vue-vine-DsyY1LR5.js} +1 -1
  73. package/dist/client/assets/{xml-CbTD7cB8.js → xml-Ddi0-r0D.js} +1 -1
  74. package/dist/client/assets/{xsl-uOqqo7cf.js → xsl-CsFcZHFS.js} +1 -1
  75. package/dist/client/assets/{yaml-BNrLoH59.js → yaml-tGJWoH6Y.js} +1 -1
  76. package/dist/client/index.html +1 -1
  77. package/dist/client/sw.js +1 -1
  78. package/dist/server/analytics/engine.js +832 -0
  79. package/dist/server/assets.js +39 -0
  80. package/dist/server/auth/passphrase.js +70 -0
  81. package/dist/server/config.js +47 -0
  82. package/dist/server/daemon.js +533 -0
  83. package/dist/server/features/ralph-loop.js +138 -0
  84. package/dist/server/features/scheduler.js +260 -0
  85. package/dist/server/features/sticky-notes.js +99 -0
  86. package/dist/server/handlers/analytics.js +28 -0
  87. package/dist/server/handlers/attachment.js +158 -0
  88. package/dist/server/handlers/bookmarks.js +41 -0
  89. package/dist/server/handlers/chat.js +350 -0
  90. package/dist/server/handlers/editor.js +72 -0
  91. package/dist/server/handlers/fs.js +234 -0
  92. package/dist/server/handlers/loop.js +33 -0
  93. package/dist/server/handlers/memory.js +181 -0
  94. package/dist/server/handlers/mesh.js +322 -0
  95. package/dist/server/handlers/notes.js +36 -0
  96. package/dist/server/handlers/plugins.js +593 -0
  97. package/dist/server/handlers/project-settings.js +166 -0
  98. package/dist/server/handlers/scheduler.js +52 -0
  99. package/dist/server/handlers/session.js +194 -0
  100. package/dist/server/handlers/settings.js +148 -0
  101. package/dist/server/handlers/skills.js +360 -0
  102. package/dist/server/handlers/terminal.js +75 -0
  103. package/dist/server/handlers/themes.js +102 -0
  104. package/dist/server/handlers/update.js +124 -0
  105. package/dist/server/identity.js +45 -0
  106. package/dist/server/index.js +435 -0
  107. package/dist/server/logger.js +20 -0
  108. package/dist/server/mesh/connector.js +355 -0
  109. package/dist/server/mesh/crypto.js +88 -0
  110. package/dist/server/mesh/discovery.js +95 -0
  111. package/dist/server/mesh/pairing.js +104 -0
  112. package/dist/server/mesh/peers.js +54 -0
  113. package/dist/server/mesh/proxy.js +86 -0
  114. package/dist/server/mesh/session-sync.js +85 -0
  115. package/dist/server/project/bookmarks.js +77 -0
  116. package/dist/server/project/context-breakdown.js +279 -0
  117. package/dist/server/project/file-browser.js +97 -0
  118. package/dist/server/project/project-files.js +274 -0
  119. package/dist/server/project/registry.js +51 -0
  120. package/dist/server/project/sdk-bridge.js +960 -0
  121. package/dist/server/project/session.js +696 -0
  122. package/dist/server/project/terminal.js +87 -0
  123. package/dist/server/project/warmup.js +242 -0
  124. package/dist/server/push.js +87 -0
  125. package/dist/server/tls.js +50 -0
  126. package/dist/server/tui.js +83 -0
  127. package/dist/server/update-checker.js +119 -0
  128. package/dist/server/ws/broadcast.js +50 -0
  129. package/dist/server/ws/router.js +105 -0
  130. package/dist/server/ws/server.js +2 -0
  131. package/dist/shared/analytics.js +1 -0
  132. package/dist/shared/messages.js +1 -0
  133. package/dist/shared/models.js +1 -0
  134. package/dist/shared/project-settings.js +1 -0
  135. package/package.json +5 -8
  136. package/themes/alabaster.json +9 -0
  137. package/themes/amoled.json +20 -0
  138. package/themes/ayu-light.json +9 -0
  139. package/themes/catppuccin-latte.json +9 -0
  140. package/themes/catppuccin-mocha.json +9 -0
  141. package/themes/clay-light.json +10 -0
  142. package/themes/clay.json +10 -0
  143. package/themes/dracula.json +9 -0
  144. package/themes/everforest-light.json +9 -0
  145. package/themes/everforest.json +9 -0
  146. package/themes/github-light.json +9 -0
  147. package/themes/gruvbox-dark.json +9 -0
  148. package/themes/gruvbox-light.json +9 -0
  149. package/themes/horizon-light.json +9 -0
  150. package/themes/kanagawa-lotus.json +9 -0
  151. package/themes/kanagawa.json +9 -0
  152. package/themes/modus-operandi.json +9 -0
  153. package/themes/monokai.json +9 -0
  154. package/themes/nightfox.json +9 -0
  155. package/themes/nord-light.json +9 -0
  156. package/themes/nord.json +9 -0
  157. package/themes/one-dark.json +9 -0
  158. package/themes/one-light.json +9 -0
  159. package/themes/palenight.json +9 -0
  160. package/themes/paper.json +9 -0
  161. package/themes/penumbra-light.json +9 -0
  162. package/themes/poimandres.json +9 -0
  163. package/themes/quiet-light.json +9 -0
  164. package/themes/rose-pine-dawn.json +9 -0
  165. package/themes/rose-pine.json +9 -0
  166. package/themes/solarized-dark.json +9 -0
  167. package/themes/solarized-light.json +9 -0
  168. package/themes/synthwave84.json +9 -0
  169. package/themes/tokyo-night-light.json +9 -0
  170. package/themes/tokyo-night.json +9 -0
  171. package/themes/vesper.json +9 -0
  172. package/index.html +0 -20
  173. package/public/icons/icon-192.svg +0 -11
  174. package/public/icons/icon-512.svg +0 -11
  175. package/public/sw-push.js +0 -53
  176. package/src/client/App.tsx +0 -42
  177. package/src/client/commands.ts +0 -36
  178. package/src/client/components/analytics/AnalyticsView.tsx +0 -244
  179. package/src/client/components/analytics/ChartCard.tsx +0 -194
  180. package/src/client/components/analytics/PeriodSelector.tsx +0 -42
  181. package/src/client/components/analytics/QuickStats.tsx +0 -122
  182. package/src/client/components/analytics/chartTokens.ts +0 -188
  183. package/src/client/components/analytics/charts/ActivityCalendar.tsx +0 -204
  184. package/src/client/components/analytics/charts/CacheEfficiencyChart.tsx +0 -56
  185. package/src/client/components/analytics/charts/ContextUtilizationChart.tsx +0 -106
  186. package/src/client/components/analytics/charts/CostAreaChart.tsx +0 -79
  187. package/src/client/components/analytics/charts/CostDistributionChart.tsx +0 -59
  188. package/src/client/components/analytics/charts/CostDonutChart.tsx +0 -84
  189. package/src/client/components/analytics/charts/CumulativeCostChart.tsx +0 -59
  190. package/src/client/components/analytics/charts/DailySummaryCards.tsx +0 -86
  191. package/src/client/components/analytics/charts/HourlyHeatmap.tsx +0 -133
  192. package/src/client/components/analytics/charts/NodeFleetOverview.tsx +0 -89
  193. package/src/client/components/analytics/charts/PermissionBreakdown.tsx +0 -98
  194. package/src/client/components/analytics/charts/ProjectRadar.tsx +0 -126
  195. package/src/client/components/analytics/charts/ResponseTimeScatter.tsx +0 -96
  196. package/src/client/components/analytics/charts/SessionBubbleChart.tsx +0 -114
  197. package/src/client/components/analytics/charts/SessionComplexityList.tsx +0 -65
  198. package/src/client/components/analytics/charts/SessionTimeline.tsx +0 -107
  199. package/src/client/components/analytics/charts/TokenFlowChart.tsx +0 -78
  200. package/src/client/components/analytics/charts/TokenSankeyChart.tsx +0 -93
  201. package/src/client/components/analytics/charts/ToolSunburst.tsx +0 -123
  202. package/src/client/components/analytics/charts/ToolTreemap.tsx +0 -110
  203. package/src/client/components/auth/PassphrasePrompt.tsx +0 -70
  204. package/src/client/components/chat/AttachmentChips.tsx +0 -116
  205. package/src/client/components/chat/ChatInput.tsx +0 -533
  206. package/src/client/components/chat/ChatView.tsx +0 -1076
  207. package/src/client/components/chat/CommandPalette.tsx +0 -162
  208. package/src/client/components/chat/ElicitationCard.tsx +0 -238
  209. package/src/client/components/chat/Message.tsx +0 -825
  210. package/src/client/components/chat/ModelSelector.tsx +0 -108
  211. package/src/client/components/chat/PermissionModeSelector.tsx +0 -41
  212. package/src/client/components/chat/PromptQuestion.tsx +0 -271
  213. package/src/client/components/chat/StatusBar.tsx +0 -50
  214. package/src/client/components/chat/TodoCard.tsx +0 -57
  215. package/src/client/components/chat/ToolGroup.tsx +0 -129
  216. package/src/client/components/chat/ToolResultRenderer.tsx +0 -348
  217. package/src/client/components/chat/VoiceRecorder.tsx +0 -85
  218. package/src/client/components/chat/toolSummary.ts +0 -41
  219. package/src/client/components/dashboard/DashboardView.tsx +0 -200
  220. package/src/client/components/dashboard/ProjectDashboardView.tsx +0 -179
  221. package/src/client/components/mesh/NodeBadge.tsx +0 -24
  222. package/src/client/components/mesh/PairingDialog.tsx +0 -340
  223. package/src/client/components/project-settings/ProjectClaude.tsx +0 -318
  224. package/src/client/components/project-settings/ProjectEnvironment.tsx +0 -235
  225. package/src/client/components/project-settings/ProjectGeneral.tsx +0 -76
  226. package/src/client/components/project-settings/ProjectMcp.tsx +0 -232
  227. package/src/client/components/project-settings/ProjectMemory.tsx +0 -488
  228. package/src/client/components/project-settings/ProjectNotifications.tsx +0 -48
  229. package/src/client/components/project-settings/ProjectPermissions.tsx +0 -209
  230. package/src/client/components/project-settings/ProjectPlugins.tsx +0 -117
  231. package/src/client/components/project-settings/ProjectRules.tsx +0 -286
  232. package/src/client/components/project-settings/ProjectSettingsView.tsx +0 -117
  233. package/src/client/components/project-settings/ProjectSkills.tsx +0 -91
  234. package/src/client/components/settings/Appearance.tsx +0 -275
  235. package/src/client/components/settings/BudgetSettings.tsx +0 -165
  236. package/src/client/components/settings/ClaudeSettings.tsx +0 -175
  237. package/src/client/components/settings/Editor.tsx +0 -123
  238. package/src/client/components/settings/Environment.tsx +0 -185
  239. package/src/client/components/settings/GlobalMcp.tsx +0 -216
  240. package/src/client/components/settings/GlobalMemory.tsx +0 -19
  241. package/src/client/components/settings/GlobalPlugins.tsx +0 -806
  242. package/src/client/components/settings/GlobalRules.tsx +0 -149
  243. package/src/client/components/settings/GlobalSkills.tsx +0 -140
  244. package/src/client/components/settings/MeshStatus.tsx +0 -183
  245. package/src/client/components/settings/Notifications.tsx +0 -123
  246. package/src/client/components/settings/SettingsView.tsx +0 -75
  247. package/src/client/components/settings/SkillMarketplace.tsx +0 -175
  248. package/src/client/components/settings/ThemePreview.tsx +0 -140
  249. package/src/client/components/settings/ThemeWizard.tsx +0 -405
  250. package/src/client/components/settings/mcp-shared.tsx +0 -194
  251. package/src/client/components/settings/skill-shared.tsx +0 -186
  252. package/src/client/components/setup/SetupWizard.tsx +0 -755
  253. package/src/client/components/sidebar/AddProjectModal.tsx +0 -438
  254. package/src/client/components/sidebar/NodeSettingsModal.tsx +0 -206
  255. package/src/client/components/sidebar/ProjectDropdown.tsx +0 -211
  256. package/src/client/components/sidebar/ProjectRail.tsx +0 -353
  257. package/src/client/components/sidebar/SearchFilter.tsx +0 -52
  258. package/src/client/components/sidebar/SessionList.tsx +0 -599
  259. package/src/client/components/sidebar/SettingsSidebar.tsx +0 -139
  260. package/src/client/components/sidebar/Sidebar.tsx +0 -469
  261. package/src/client/components/sidebar/UserIsland.tsx +0 -282
  262. package/src/client/components/sidebar/UserMenu.tsx +0 -107
  263. package/src/client/components/ui/CommandPalette.tsx +0 -321
  264. package/src/client/components/ui/ContextMenu.tsx +0 -153
  265. package/src/client/components/ui/ErrorBoundary.tsx +0 -56
  266. package/src/client/components/ui/IconPicker.tsx +0 -184
  267. package/src/client/components/ui/KeyboardShortcuts.tsx +0 -129
  268. package/src/client/components/ui/LatticeLogomark.tsx +0 -19
  269. package/src/client/components/ui/NodeDisconnectedOverlay.tsx +0 -35
  270. package/src/client/components/ui/PopupMenu.tsx +0 -120
  271. package/src/client/components/ui/SaveFooter.tsx +0 -63
  272. package/src/client/components/ui/Toast.tsx +0 -132
  273. package/src/client/components/ui/UpdateBanner.tsx +0 -110
  274. package/src/client/components/ui/UpdatePrompt.tsx +0 -47
  275. package/src/client/components/workspace/BookmarksView.tsx +0 -156
  276. package/src/client/components/workspace/FileBrowser.tsx +0 -174
  277. package/src/client/components/workspace/FileTree.tsx +0 -129
  278. package/src/client/components/workspace/FileViewer.tsx +0 -211
  279. package/src/client/components/workspace/NoteCard.tsx +0 -120
  280. package/src/client/components/workspace/NotesView.tsx +0 -102
  281. package/src/client/components/workspace/ScheduledTasksView.tsx +0 -117
  282. package/src/client/components/workspace/SplitPane.tsx +0 -81
  283. package/src/client/components/workspace/TabBar.tsx +0 -170
  284. package/src/client/components/workspace/TaskCard.tsx +0 -159
  285. package/src/client/components/workspace/TaskEditModal.tsx +0 -129
  286. package/src/client/components/workspace/TerminalInstance.tsx +0 -171
  287. package/src/client/components/workspace/TerminalView.tsx +0 -110
  288. package/src/client/components/workspace/WorkspaceView.tsx +0 -141
  289. package/src/client/hooks/useAnalytics.ts +0 -84
  290. package/src/client/hooks/useAttachments.ts +0 -313
  291. package/src/client/hooks/useBookmarks.ts +0 -57
  292. package/src/client/hooks/useEditorConfig.ts +0 -28
  293. package/src/client/hooks/useFocusTrap.ts +0 -74
  294. package/src/client/hooks/useIdleDetection.ts +0 -50
  295. package/src/client/hooks/useInstallPrompt.ts +0 -53
  296. package/src/client/hooks/useMesh.ts +0 -89
  297. package/src/client/hooks/useNotifications.ts +0 -54
  298. package/src/client/hooks/useOnline.ts +0 -6
  299. package/src/client/hooks/useProjectSettings.ts +0 -56
  300. package/src/client/hooks/useProjects.ts +0 -98
  301. package/src/client/hooks/usePushNotifications.ts +0 -92
  302. package/src/client/hooks/useSaveState.ts +0 -65
  303. package/src/client/hooks/useSession.ts +0 -580
  304. package/src/client/hooks/useSidebar.ts +0 -90
  305. package/src/client/hooks/useSkills.ts +0 -30
  306. package/src/client/hooks/useSpinnerVerb.ts +0 -36
  307. package/src/client/hooks/useSwipeDrawer.ts +0 -299
  308. package/src/client/hooks/useTheme.ts +0 -114
  309. package/src/client/hooks/useTimeTick.ts +0 -35
  310. package/src/client/hooks/useVoiceRecorder.ts +0 -169
  311. package/src/client/hooks/useWebSocket.ts +0 -27
  312. package/src/client/hooks/useWorkspace.ts +0 -57
  313. package/src/client/lib/theme-derive.ts +0 -196
  314. package/src/client/lib/workspace-url.ts +0 -219
  315. package/src/client/main.tsx +0 -10
  316. package/src/client/providers/WebSocketProvider.tsx +0 -186
  317. package/src/client/router.tsx +0 -578
  318. package/src/client/stores/analytics.ts +0 -68
  319. package/src/client/stores/bookmarks.ts +0 -45
  320. package/src/client/stores/mesh.ts +0 -78
  321. package/src/client/stores/session.ts +0 -569
  322. package/src/client/stores/sidebar.ts +0 -530
  323. package/src/client/stores/theme.ts +0 -44
  324. package/src/client/stores/workspace.ts +0 -518
  325. package/src/client/styles/global.css +0 -391
  326. package/src/client/styles/theme-vars.css +0 -18
  327. package/src/client/themes/index.ts +0 -105
  328. package/src/client/utils/editorUrl.ts +0 -55
  329. package/src/client/utils/findDuplicateKeys.ts +0 -12
  330. package/src/client/utils/formatSessionTitle.ts +0 -17
  331. package/src/client/vite-env.d.ts +0 -6
  332. package/src/server/analytics/engine.ts +0 -920
  333. package/src/server/assets.ts +0 -45
  334. package/src/server/auth/passphrase.ts +0 -78
  335. package/src/server/config.ts +0 -55
  336. package/src/server/daemon.ts +0 -567
  337. package/src/server/features/ralph-loop.ts +0 -173
  338. package/src/server/features/scheduler.ts +0 -304
  339. package/src/server/features/sticky-notes.ts +0 -104
  340. package/src/server/handlers/analytics.ts +0 -39
  341. package/src/server/handlers/attachment.ts +0 -189
  342. package/src/server/handlers/bookmarks.ts +0 -50
  343. package/src/server/handlers/chat.ts +0 -381
  344. package/src/server/handlers/editor.ts +0 -76
  345. package/src/server/handlers/fs.ts +0 -251
  346. package/src/server/handlers/loop.ts +0 -37
  347. package/src/server/handlers/memory.ts +0 -182
  348. package/src/server/handlers/mesh.ts +0 -362
  349. package/src/server/handlers/notes.ts +0 -47
  350. package/src/server/handlers/plugins.ts +0 -655
  351. package/src/server/handlers/project-settings.ts +0 -180
  352. package/src/server/handlers/scheduler.ts +0 -64
  353. package/src/server/handlers/session.ts +0 -226
  354. package/src/server/handlers/settings.ts +0 -157
  355. package/src/server/handlers/skills.ts +0 -378
  356. package/src/server/handlers/terminal.ts +0 -88
  357. package/src/server/handlers/themes.ts +0 -121
  358. package/src/server/handlers/update.ts +0 -133
  359. package/src/server/identity.ts +0 -56
  360. package/src/server/index.ts +0 -457
  361. package/src/server/logger.ts +0 -21
  362. package/src/server/mesh/connector.ts +0 -419
  363. package/src/server/mesh/crypto.ts +0 -106
  364. package/src/server/mesh/discovery.ts +0 -126
  365. package/src/server/mesh/pairing.ts +0 -123
  366. package/src/server/mesh/peers.ts +0 -60
  367. package/src/server/mesh/proxy.ts +0 -106
  368. package/src/server/mesh/session-sync.ts +0 -107
  369. package/src/server/project/bookmarks.ts +0 -83
  370. package/src/server/project/context-breakdown.ts +0 -307
  371. package/src/server/project/file-browser.ts +0 -106
  372. package/src/server/project/project-files.ts +0 -267
  373. package/src/server/project/pty-worker.cjs +0 -83
  374. package/src/server/project/registry.ts +0 -57
  375. package/src/server/project/sdk-bridge.ts +0 -1100
  376. package/src/server/project/session.ts +0 -723
  377. package/src/server/project/terminal.ts +0 -111
  378. package/src/server/project/warmup.ts +0 -285
  379. package/src/server/push.ts +0 -121
  380. package/src/server/tls.ts +0 -65
  381. package/src/server/tui.ts +0 -103
  382. package/src/server/update-checker.ts +0 -147
  383. package/src/server/ws/broadcast.ts +0 -61
  384. package/src/server/ws/router.ts +0 -123
  385. package/src/server/ws/server.ts +0 -2
  386. package/src/shared/analytics.ts +0 -40
  387. package/src/shared/messages.ts +0 -1302
  388. package/src/shared/models.ts +0 -255
  389. package/src/shared/project-settings.ts +0 -45
  390. package/tsconfig.json +0 -25
  391. package/vite.config.ts +0 -71
  392. /package/{src/server/runtime.ts → dist/server/runtime.js} +0 -0
  393. /package/{src/shared/constants.ts → dist/shared/constants.js} +0 -0
  394. /package/{src/shared/index.ts → dist/shared/index.js} +0 -0
@@ -1,117 +0,0 @@
1
- import { useSidebar } from "../../hooks/useSidebar";
2
- import { useProjectSettings } from "../../hooks/useProjectSettings";
3
- import { Menu } from "lucide-react";
4
- import type { ProjectSettingsSection } from "../../stores/sidebar";
5
- import type { ProjectSettings } from "#shared";
6
- import { ProjectGeneral } from "./ProjectGeneral";
7
- import { ProjectClaude } from "./ProjectClaude";
8
- import { ProjectEnvironment } from "./ProjectEnvironment";
9
- import { ProjectPermissions } from "./ProjectPermissions";
10
- import { ProjectSkills } from "./ProjectSkills";
11
- import { ProjectRules } from "./ProjectRules";
12
- import { ProjectMcp } from "./ProjectMcp";
13
- import { ProjectMemory } from "./ProjectMemory";
14
- import { ProjectNotifications } from "./ProjectNotifications";
15
- import { ProjectPlugins } from "./ProjectPlugins";
16
-
17
- var SECTION_CONFIG: Record<string, { title: string }> = {
18
- general: { title: "General" },
19
- notifications: { title: "Notifications" },
20
- claude: { title: "Claude" },
21
- environment: { title: "Environment" },
22
- mcp: { title: "MCP Servers" },
23
- skills: { title: "Skills" },
24
- plugins: { title: "Plugins" },
25
- rules: { title: "Rules" },
26
- permissions: { title: "Permissions" },
27
- memory: { title: "Memory" },
28
- };
29
-
30
- function renderSection(
31
- section: ProjectSettingsSection,
32
- settings: ProjectSettings,
33
- updateSection: (section: string, data: Record<string, unknown>) => void,
34
- projectSlug?: string,
35
- ) {
36
- if (section === "general") {
37
- return <ProjectGeneral settings={settings} updateSection={updateSection} />;
38
- }
39
-
40
- if (section === "claude") {
41
- return <ProjectClaude settings={settings} updateSection={updateSection} />;
42
- }
43
-
44
- if (section === "environment") {
45
- return <ProjectEnvironment settings={settings} updateSection={updateSection} />;
46
- }
47
-
48
- if (section === "permissions") {
49
- return <ProjectPermissions settings={settings} updateSection={updateSection} />;
50
- }
51
-
52
- if (section === "skills") {
53
- return <ProjectSkills settings={settings} projectSlug={projectSlug} />;
54
- }
55
-
56
- if (section === "plugins") {
57
- return <ProjectPlugins settings={settings} updateSection={updateSection} />;
58
- }
59
-
60
- if (section === "rules") {
61
- return <ProjectRules settings={settings} updateSection={updateSection} />;
62
- }
63
-
64
- if (section === "mcp") {
65
- return <ProjectMcp settings={settings} updateSection={updateSection} />;
66
- }
67
-
68
- if (section === "memory") {
69
- return <ProjectMemory projectSlug={projectSlug} />;
70
- }
71
-
72
- if (section === "notifications") {
73
- return <ProjectNotifications projectSlug={projectSlug} />;
74
- }
75
-
76
- return (
77
- <div className="py-2 text-[13px] text-base-content/40">
78
- {section} section coming soon.
79
- </div>
80
- );
81
- }
82
-
83
- export function ProjectSettingsView() {
84
- var { activeView, activeProjectSlug, toggleDrawer } = useSidebar();
85
-
86
- if (activeView.type !== "project-settings") {
87
- return null;
88
- }
89
-
90
- var section = activeView.section;
91
- var config = SECTION_CONFIG[section];
92
- var { settings, loading, error, updateSection } = useProjectSettings(activeProjectSlug);
93
-
94
- return (
95
- <section aria-label="Project Settings" className="flex-1 overflow-auto px-4 sm:px-8 py-4 sm:py-6 max-w-3xl">
96
- {config && (
97
- <div className="mb-6 flex items-center gap-3">
98
- <button
99
- className="btn btn-ghost btn-sm btn-square lg:hidden"
100
- aria-label="Toggle sidebar"
101
- onClick={toggleDrawer}
102
- >
103
- <Menu size={18} />
104
- </button>
105
- <h1 className="text-lg font-mono font-bold text-base-content">{config.title}</h1>
106
- </div>
107
- )}
108
- {loading && (
109
- <div className="text-[13px] text-base-content/40 py-4">Loading...</div>
110
- )}
111
- {error && (
112
- <div className="text-[13px] text-error py-4">{error}</div>
113
- )}
114
- {!loading && !error && settings && renderSection(section, settings, updateSection, activeProjectSlug ?? undefined)}
115
- </section>
116
- );
117
- }
@@ -1,91 +0,0 @@
1
- import { useState, useEffect } from "react";
2
- import { useWebSocket } from "../../hooks/useWebSocket";
3
- import { SkillMarketplace } from "../settings/SkillMarketplace";
4
- import { SkillItem, SkillViewModal } from "../settings/skill-shared";
5
- import type { ProjectSettings, ServerMessage } from "#shared";
6
-
7
- interface ProjectSkillsProps {
8
- settings: ProjectSettings;
9
- projectSlug?: string;
10
- }
11
-
12
- export function ProjectSkills({ settings, projectSlug }: ProjectSkillsProps) {
13
- var { send, subscribe, unsubscribe } = useWebSocket();
14
- var globalSkills = settings.global.skills;
15
- var projectSkills = settings.skills;
16
- var hasAny = globalSkills.length > 0 || projectSkills.length > 0;
17
- var [viewContent, setViewContent] = useState<{ path: string; content: string } | null>(null);
18
-
19
- useEffect(function () {
20
- function handleViewResult(msg: ServerMessage) {
21
- if (msg.type !== "skills:view_result") return;
22
- var data = msg as { type: "skills:view_result"; path: string; content: string };
23
- setViewContent({ path: data.path, content: data.content });
24
- }
25
-
26
- subscribe("skills:view_result", handleViewResult);
27
-
28
- return function () {
29
- unsubscribe("skills:view_result", handleViewResult);
30
- };
31
- }, []);
32
-
33
- function handleView(path: string) {
34
- send({ type: "skills:view", path: path } as any);
35
- }
36
-
37
- return (
38
- <div className="py-2 space-y-6">
39
- {!hasAny && (
40
- <div className="py-12 text-center text-[13px] text-base-content/40">
41
- No skills found.
42
- </div>
43
- )}
44
-
45
- {globalSkills.length > 0 && (
46
- <div>
47
- <div className="text-[12px] font-semibold text-base-content/40 mb-2">Global Skills</div>
48
- <div className="space-y-2">
49
- {globalSkills.map(function (skill: typeof globalSkills[number]) {
50
- return (
51
- <SkillItem
52
- key={skill.path}
53
- skill={skill}
54
- badge="global"
55
- onClick={function () { handleView(skill.path); }}
56
- />
57
- );
58
- })}
59
- </div>
60
- </div>
61
- )}
62
-
63
- {projectSkills.length > 0 && (
64
- <div>
65
- <div className="text-[12px] font-semibold text-base-content/40 mb-2">Project Skills</div>
66
- <div className="space-y-2">
67
- {projectSkills.map(function (skill: typeof projectSkills[number]) {
68
- return (
69
- <SkillItem
70
- key={skill.path}
71
- skill={skill}
72
- onClick={function () { handleView(skill.path); }}
73
- />
74
- );
75
- })}
76
- </div>
77
- </div>
78
- )}
79
-
80
- <SkillMarketplace defaultScope="project" defaultProjectSlug={projectSlug} />
81
-
82
- {viewContent && (
83
- <SkillViewModal
84
- path={viewContent.path}
85
- content={viewContent.content}
86
- onClose={function () { setViewContent(null); }}
87
- />
88
- )}
89
- </div>
90
- );
91
- }
@@ -1,275 +0,0 @@
1
- import { memo, useMemo, useCallback, useState, useEffect } from "react";
2
- import { useTheme } from "../../hooks/useTheme";
3
- import { useWebSocket } from "../../hooks/useWebSocket";
4
- import { Sun, Moon, Check, Plus, Pencil, Trash2, Download } from "lucide-react";
5
- import type { ThemeEntry } from "../../themes/index";
6
- import { ThemeWizard } from "./ThemeWizard";
7
- import { ThemeSwatches } from "./ThemePreview";
8
- import { ContextMenu, useContextMenu } from "../ui/ContextMenu";
9
- import type { ServerMessage } from "#shared";
10
-
11
- var SWATCH_KEYS = [
12
- "base00", "base01", "base02", "base03",
13
- "base04", "base05", "base06", "base07",
14
- "base08", "base09", "base0A", "base0B",
15
- "base0C", "base0D", "base0E", "base0F",
16
- ] as const;
17
-
18
- var ThemeCard = memo(function ThemeCard({
19
- entry,
20
- active,
21
- onSelect,
22
- }: {
23
- entry: ThemeEntry;
24
- active: boolean;
25
- onSelect: (id: string) => void;
26
- }) {
27
- var t = entry.theme;
28
-
29
- function handleClick() {
30
- onSelect(entry.id);
31
- }
32
-
33
- return (
34
- <button
35
- onClick={handleClick}
36
- className={
37
- "flex flex-col gap-2 p-3 sm:p-2.5 px-3 rounded-lg border cursor-pointer text-left transition-colors duration-[120ms] relative focus-visible:ring-2 focus-visible:ring-primary " +
38
- (active
39
- ? "border-primary bg-base-300 shadow-sm"
40
- : "border-base-content/15 bg-base-300 hover:border-base-content/30")
41
- }
42
- >
43
- {active && (
44
- <div className="absolute top-1.5 right-1.5 w-3.5 h-3.5 rounded-full bg-primary flex items-center justify-center">
45
- <Check size={8} className="text-primary-content" strokeWidth={1.8} />
46
- </div>
47
- )}
48
-
49
- <div className="flex gap-[3px] flex-wrap w-[80px]">
50
- {SWATCH_KEYS.map(function (key) {
51
- return (
52
- <div
53
- key={key}
54
- className="w-[10px] h-[10px] rounded-sm flex-shrink-0 ring-1 ring-base-content/10"
55
- style={{ background: "#" + t[key] }}
56
- />
57
- );
58
- })}
59
- </div>
60
-
61
- <div className="text-[12px] font-medium text-base-content">
62
- {t.name}
63
- </div>
64
- </button>
65
- );
66
- });
67
-
68
- function ThemeGroup({
69
- label,
70
- entries,
71
- currentThemeId,
72
- onSelect,
73
- }: {
74
- label: string;
75
- entries: ThemeEntry[];
76
- currentThemeId: string;
77
- onSelect: (id: string) => void;
78
- }) {
79
- if (entries.length === 0) {
80
- return null;
81
- }
82
-
83
- return (
84
- <div className="mb-6">
85
- <div className="text-[11px] font-mono font-bold tracking-[0.1em] uppercase text-base-content/40 mb-3">
86
- {label}
87
- </div>
88
- <div className="grid grid-cols-[repeat(auto-fill,minmax(100px,1fr))] gap-2">
89
- {entries.map(function (entry) {
90
- return (
91
- <ThemeCard
92
- key={entry.id}
93
- entry={entry}
94
- active={entry.id === currentThemeId}
95
- onSelect={onSelect}
96
- />
97
- );
98
- })}
99
- </div>
100
- </div>
101
- );
102
- }
103
-
104
- interface CustomTheme {
105
- name: string;
106
- author: string;
107
- variant: string;
108
- filename: string;
109
- colors: Record<string, string>;
110
- }
111
-
112
- export function Appearance() {
113
- var { mode, currentThemeId, toggleMode, setTheme, themes } = useTheme();
114
- var ws = useWebSocket();
115
- var [wizardOpen, setWizardOpen] = useState(false);
116
- var [editTheme, setEditTheme] = useState<CustomTheme | null>(null);
117
- var [customThemes, setCustomThemes] = useState<CustomTheme[]>([]);
118
- var ctxMenu = useContextMenu<CustomTheme>();
119
-
120
- useEffect(function () {
121
- function handleCustomList(msg: ServerMessage) {
122
- if ((msg as any).type === "theme:custom_list") {
123
- setCustomThemes((msg as any).themes || []);
124
- }
125
- }
126
- function handleSaved(msg: ServerMessage) {
127
- if ((msg as any).type === "theme:saved" || (msg as any).type === "theme:deleted") {
128
- ws.send({ type: "theme:list_custom" } as any);
129
- }
130
- }
131
- ws.subscribe("theme:custom_list", handleCustomList);
132
- ws.subscribe("theme:saved", handleSaved);
133
- ws.subscribe("theme:deleted", handleSaved);
134
- ws.send({ type: "theme:list_custom" } as any);
135
- return function () {
136
- ws.unsubscribe("theme:custom_list", handleCustomList);
137
- ws.unsubscribe("theme:saved", handleSaved);
138
- ws.unsubscribe("theme:deleted", handleSaved);
139
- };
140
- }, []);
141
-
142
- var darkThemes = useMemo(function () {
143
- return themes.filter(function (e) { return e.theme.variant === "dark"; });
144
- }, [themes]);
145
-
146
- var lightThemes = useMemo(function () {
147
- return themes.filter(function (e) { return e.theme.variant === "light"; });
148
- }, [themes]);
149
-
150
- var handleThemeSelect = useCallback(function (id: string) {
151
- setTheme(id);
152
- }, [setTheme]);
153
-
154
- function handleEditCustom(theme: CustomTheme) {
155
- setEditTheme(theme);
156
- setWizardOpen(true);
157
- }
158
-
159
- function handleDeleteCustom(theme: CustomTheme) {
160
- ws.send({ type: "theme:delete", name: theme.filename } as any);
161
- }
162
-
163
- function handleExportCustom(theme: CustomTheme) {
164
- var obj: Record<string, string> = {
165
- name: theme.name,
166
- author: theme.author,
167
- variant: theme.variant,
168
- };
169
- for (var key of Object.keys(theme.colors)) {
170
- obj[key] = theme.colors[key];
171
- }
172
- var blob = new Blob([JSON.stringify(obj, null, 2)], { type: "application/json" });
173
- var url = URL.createObjectURL(blob);
174
- var a = document.createElement("a");
175
- a.href = url;
176
- a.download = theme.filename;
177
- a.click();
178
- URL.revokeObjectURL(url);
179
- }
180
-
181
- return (
182
- <div className="py-2">
183
- <div className="flex items-center justify-between mb-6">
184
- <div className="text-[12px] font-semibold text-base-content/40">Color Mode</div>
185
- <button
186
- onClick={toggleMode}
187
- className="btn btn-ghost btn-sm border border-base-content/20"
188
- >
189
- {mode === "dark" ? (
190
- <>
191
- <Sun size={12} />
192
- Switch to Light
193
- </>
194
- ) : (
195
- <>
196
- <Moon size={12} />
197
- Switch to Dark
198
- </>
199
- )}
200
- </button>
201
- </div>
202
-
203
- <ThemeGroup
204
- label="Dark Themes"
205
- entries={darkThemes}
206
- currentThemeId={currentThemeId}
207
- onSelect={handleThemeSelect}
208
- />
209
-
210
- <ThemeGroup
211
- label="Light Themes"
212
- entries={lightThemes}
213
- currentThemeId={currentThemeId}
214
- onSelect={handleThemeSelect}
215
- />
216
-
217
- <div className="mb-6">
218
- <div className="text-[11px] font-mono font-bold tracking-[0.1em] uppercase text-base-content/40 mb-3">
219
- Custom Themes
220
- </div>
221
- <div className="grid grid-cols-[repeat(auto-fill,minmax(100px,1fr))] gap-2">
222
- {customThemes.map(function (ct) {
223
- return (
224
- <button
225
- key={ct.filename}
226
- onClick={function () { handleEditCustom(ct); }}
227
- onContextMenu={function (e) { ctxMenu.open(e, ct); }}
228
- data-allow-context-menu
229
- className="flex flex-col gap-2 p-3 sm:p-2.5 px-3 rounded-lg border cursor-pointer text-left transition-colors duration-[120ms] relative border-base-content/15 bg-base-300 hover:border-base-content/30"
230
- >
231
- <div className="absolute top-1.5 right-1.5">
232
- <Pencil size={10} className="text-base-content/20" />
233
- </div>
234
- <ThemeSwatches colors={ct.colors} />
235
- <div className="text-[12px] font-medium text-base-content truncate w-full">
236
- {ct.name}
237
- </div>
238
- </button>
239
- );
240
- })}
241
-
242
- <button
243
- onClick={function () { setEditTheme(null); setWizardOpen(true); }}
244
- className="flex flex-col items-center justify-center gap-2 p-3 rounded-lg border-2 border-dashed border-base-content/15 cursor-pointer text-left transition-colors duration-[120ms] hover:border-primary/40 hover:bg-primary/5 min-h-[70px]"
245
- >
246
- <Plus size={18} className="text-base-content/25" />
247
- <div className="text-[11px] text-base-content/30">Create Theme</div>
248
- </button>
249
- </div>
250
- </div>
251
-
252
- {ctxMenu.state && (
253
- <ContextMenu
254
- x={ctxMenu.state.x}
255
- y={ctxMenu.state.y}
256
- onClose={ctxMenu.close}
257
- label="Custom theme actions"
258
- items={[
259
- { label: "Edit", icon: <Pencil size={14} />, onClick: function () { handleEditCustom(ctxMenu.state!.data); } },
260
- { label: "Export JSON", icon: <Download size={14} />, onClick: function () { handleExportCustom(ctxMenu.state!.data); } },
261
- { type: "divider" as const },
262
- { label: "Delete", icon: <Trash2 size={14} />, danger: true, onClick: function () { handleDeleteCustom(ctxMenu.state!.data); } },
263
- ]}
264
- />
265
- )}
266
-
267
- {wizardOpen && (
268
- <ThemeWizard
269
- onClose={function () { setWizardOpen(false); setEditTheme(null); }}
270
- editTheme={editTheme ? { name: editTheme.name, author: editTheme.author, variant: editTheme.variant as "dark" | "light", colors: editTheme.colors } : null}
271
- />
272
- )}
273
- </div>
274
- );
275
- }
@@ -1,165 +0,0 @@
1
- import { useState, useEffect } from "react";
2
- import { useStore } from "@tanstack/react-store";
3
- import { useWebSocket } from "../../hooks/useWebSocket";
4
- import { useSaveState } from "../../hooks/useSaveState";
5
- import { SaveFooter } from "../ui/SaveFooter";
6
- import { getSessionStore, setBudgetStatus } from "../../stores/session";
7
- import type { ServerMessage, SettingsDataMessage, SettingsUpdateMessage } from "#shared";
8
-
9
- var ENFORCEMENT_OPTIONS = [
10
- { id: "warning", label: "Warning", description: "Shows a warning but does not block" },
11
- { id: "soft-block", label: "Confirm", description: "Asks for confirmation before sending" },
12
- { id: "hard-block", label: "Block", description: "Prevents sending until tomorrow" },
13
- ];
14
-
15
- export function BudgetSettings() {
16
- var { send, subscribe, unsubscribe } = useWebSocket();
17
- var budgetStatus = useStore(getSessionStore(), function (s) { return s.budgetStatus; });
18
- var [enabled, setEnabled] = useState(false);
19
- var [dailyLimit, setDailyLimit] = useState(10);
20
- var [enforcement, setEnforcement] = useState("warning");
21
- var save = useSaveState();
22
-
23
- useEffect(function () {
24
- function handleMessage(msg: ServerMessage) {
25
- if (msg.type !== "settings:data") return;
26
- var data = msg as SettingsDataMessage;
27
- var cfg = data.config;
28
-
29
- if (save.savingRef.current) {
30
- save.confirmSave();
31
- if (!cfg.costBudget) {
32
- setBudgetStatus(null);
33
- }
34
- } else {
35
- if (cfg.costBudget) {
36
- setEnabled(true);
37
- setDailyLimit(cfg.costBudget.dailyLimit);
38
- setEnforcement(cfg.costBudget.enforcement);
39
- } else {
40
- setEnabled(false);
41
- setDailyLimit(10);
42
- setEnforcement("warning");
43
- setBudgetStatus(null);
44
- }
45
- save.resetFromServer();
46
- }
47
- }
48
-
49
- subscribe("settings:data", handleMessage);
50
- send({ type: "settings:get" });
51
-
52
- return function () {
53
- unsubscribe("settings:data", handleMessage);
54
- };
55
- }, []);
56
-
57
- function handleSave() {
58
- save.startSave();
59
- var updateMsg: SettingsUpdateMessage = {
60
- type: "settings:update",
61
- settings: {
62
- costBudget: enabled ? { dailyLimit: dailyLimit, enforcement: enforcement as "warning" | "soft-block" | "hard-block" } : null,
63
- } as SettingsUpdateMessage["settings"],
64
- };
65
- send(updateMsg);
66
- }
67
-
68
- return (
69
- <div className="py-2">
70
- <p className="text-[12px] text-base-content/40 mb-5">
71
- Set a daily spending limit to control API costs. The budget resets at midnight.
72
- </p>
73
-
74
- {budgetStatus && (
75
- <div className="mb-5 p-3 rounded-xl bg-base-300 border border-base-content/10">
76
- <div className="text-[11px] text-base-content/40 font-mono mb-1">Today's spend</div>
77
- <div className="text-[18px] font-mono font-bold text-base-content">
78
- ${budgetStatus.dailySpend.toFixed(2)}
79
- {budgetStatus.dailyLimit > 0 && (
80
- <span className="text-[13px] text-base-content/30 font-normal">
81
- {" / $" + budgetStatus.dailyLimit.toFixed(2)}
82
- </span>
83
- )}
84
- </div>
85
- </div>
86
- )}
87
-
88
- <div className="mb-5">
89
- <label className="flex items-center gap-3 cursor-pointer">
90
- <input
91
- type="checkbox"
92
- checked={enabled}
93
- onChange={function (e) {
94
- setEnabled(e.target.checked);
95
- save.markDirty();
96
- }}
97
- className="toggle toggle-sm toggle-primary"
98
- />
99
- <span className="text-[13px] text-base-content">Enable daily budget</span>
100
- </label>
101
- </div>
102
-
103
- {enabled && (
104
- <>
105
- <div className="mb-5">
106
- <label htmlFor="budget-daily-limit" className="block text-[12px] font-semibold text-base-content/40 mb-2">
107
- Daily limit (USD)
108
- </label>
109
- <input
110
- id="budget-daily-limit"
111
- type="number"
112
- min={0.01}
113
- step={0.5}
114
- value={dailyLimit}
115
- onChange={function (e) {
116
- var val = parseFloat(e.target.value);
117
- if (!isNaN(val) && val > 0) {
118
- setDailyLimit(val);
119
- save.markDirty();
120
- }
121
- }}
122
- className="w-full 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]"
123
- />
124
- </div>
125
-
126
- <div className="mb-6" role="radiogroup" aria-label="Enforcement mode">
127
- <div className="text-[12px] font-semibold text-base-content/40 mb-2">Enforcement</div>
128
- <div className="flex flex-col gap-2">
129
- {ENFORCEMENT_OPTIONS.map(function (opt) {
130
- var active = enforcement === opt.id;
131
- return (
132
- <button
133
- key={opt.id}
134
- role="radio"
135
- aria-checked={active}
136
- onClick={function () {
137
- setEnforcement(opt.id);
138
- save.markDirty();
139
- }}
140
- className={
141
- "w-full text-left px-3 py-2.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 " +
142
- (active
143
- ? "border-primary bg-base-300 text-base-content"
144
- : "border-base-content/15 bg-base-300 text-base-content/40 hover:border-base-content/30 hover:text-base-content/60")
145
- }
146
- >
147
- <div className="font-semibold">{opt.label}</div>
148
- <div className={"text-[11px] mt-0.5 " + (active ? "text-base-content/50" : "text-base-content/30")}>{opt.description}</div>
149
- </button>
150
- );
151
- })}
152
- </div>
153
- </div>
154
- </>
155
- )}
156
-
157
- <SaveFooter
158
- dirty={save.dirty}
159
- saving={save.saving}
160
- saveState={save.saveState}
161
- onSave={handleSave}
162
- />
163
- </div>
164
- );
165
- }