@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,806 +0,0 @@
1
- import { useState, useEffect, useCallback, useRef } from "react";
2
- import {
3
- Blocks, Trash2, RefreshCw, Loader2, X, Download, Search,
4
- ChevronRight, Package, Webhook, ScrollText, Puzzle, ExternalLink,
5
- AlertTriangle,
6
- } from "lucide-react";
7
- import { useWebSocket } from "../../hooks/useWebSocket";
8
- import type {
9
- ServerMessage,
10
- PluginInfo,
11
- PluginDetails,
12
- PluginError,
13
- PluginMarketplaceInfo,
14
- MarketplacePluginEntry,
15
- } from "#shared";
16
-
17
- export function GlobalPlugins() {
18
- var { send, subscribe, unsubscribe } = useWebSocket();
19
- var [plugins, setPlugins] = useState<PluginInfo[]>([]);
20
- var [marketplaces, setMarketplaces] = useState<PluginMarketplaceInfo[]>([]);
21
- var [loaded, setLoaded] = useState(false);
22
- var [detailPlugin, setDetailPlugin] = useState<PluginDetails | null>(null);
23
- var [searchQuery, setSearchQuery] = useState("");
24
- var [searchResults, setSearchResults] = useState<MarketplacePluginEntry[]>([]);
25
- var [searching, setSearching] = useState(false);
26
- var [hasSearched, setHasSearched] = useState(false);
27
- var [installingKey, setInstallingKey] = useState<string | null>(null);
28
- var [uninstallingKey, setUninstallingKey] = useState<string | null>(null);
29
- var [updatingKey, setUpdatingKey] = useState<string | null>(null);
30
- var [confirmUninstall, setConfirmUninstall] = useState<string | null>(null);
31
- var [actionMessage, setActionMessage] = useState<{ text: string; success: boolean } | null>(null);
32
- var [pluginErrors, setPluginErrors] = useState<PluginError[]>([]);
33
- var [discoverPlugins, setDiscoverPlugins] = useState<MarketplacePluginEntry[]>([]);
34
- var [discoverLoaded, setDiscoverLoaded] = useState(false);
35
- var searchTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
36
-
37
- useEffect(function () {
38
- function handleListResult(msg: ServerMessage) {
39
- if (msg.type !== "plugin:list_result") return;
40
- var data = msg as { type: "plugin:list_result"; plugins: PluginInfo[] };
41
- setPlugins(data.plugins);
42
- setLoaded(true);
43
- }
44
-
45
- function handleMarketplacesResult(msg: ServerMessage) {
46
- if (msg.type !== "plugin:marketplaces_result") return;
47
- var data = msg as { type: "plugin:marketplaces_result"; marketplaces: PluginMarketplaceInfo[] };
48
- setMarketplaces(data.marketplaces);
49
- }
50
-
51
- function handleSearchResult(msg: ServerMessage) {
52
- if (msg.type !== "plugin:search_result") return;
53
- var data = msg as { type: "plugin:search_result"; query: string; plugins: MarketplacePluginEntry[]; count: number };
54
- setSearchResults(data.plugins);
55
- setSearching(false);
56
- setHasSearched(true);
57
- }
58
-
59
- function handleInstallResult(msg: ServerMessage) {
60
- if (msg.type !== "plugin:install_result") return;
61
- var data = msg as { type: "plugin:install_result"; success: boolean; message?: string };
62
- setInstallingKey(null);
63
- showAction(data.message ?? (data.success ? "Installed" : "Install failed"), data.success);
64
- }
65
-
66
- function handleUninstallResult(msg: ServerMessage) {
67
- if (msg.type !== "plugin:uninstall_result") return;
68
- var data = msg as { type: "plugin:uninstall_result"; success: boolean; message?: string };
69
- setUninstallingKey(null);
70
- showAction(data.message ?? (data.success ? "Uninstalled" : "Uninstall failed"), data.success);
71
- }
72
-
73
- function handleUpdateResult(msg: ServerMessage) {
74
- if (msg.type !== "plugin:update_result") return;
75
- var data = msg as { type: "plugin:update_result"; success: boolean; message?: string };
76
- setUpdatingKey(null);
77
- showAction(data.message ?? (data.success ? "Updated" : "Update failed"), data.success);
78
- }
79
-
80
- function handleDetailsResult(msg: ServerMessage) {
81
- if (msg.type !== "plugin:details_result") return;
82
- var data = msg as { type: "plugin:details_result"; plugin: PluginDetails | null };
83
- setDetailPlugin(data.plugin);
84
- }
85
-
86
- function handleErrorsResult(msg: ServerMessage) {
87
- if (msg.type !== "plugin:errors_result") return;
88
- var data = msg as { type: "plugin:errors_result"; errors: PluginError[] };
89
- setPluginErrors(data.errors);
90
- }
91
-
92
- function handleDiscoverResult(msg: ServerMessage) {
93
- if (msg.type !== "plugin:discover_result") return;
94
- var data = msg as { type: "plugin:discover_result"; plugins: MarketplacePluginEntry[] };
95
- setDiscoverPlugins(data.plugins);
96
- setDiscoverLoaded(true);
97
- }
98
-
99
- subscribe("plugin:list_result", handleListResult);
100
- subscribe("plugin:marketplaces_result", handleMarketplacesResult);
101
- subscribe("plugin:search_result", handleSearchResult);
102
- subscribe("plugin:install_result", handleInstallResult);
103
- subscribe("plugin:uninstall_result", handleUninstallResult);
104
- subscribe("plugin:update_result", handleUpdateResult);
105
- subscribe("plugin:details_result", handleDetailsResult);
106
- subscribe("plugin:errors_result", handleErrorsResult);
107
- subscribe("plugin:discover_result", handleDiscoverResult);
108
-
109
- send({ type: "plugin:list" } as any);
110
- send({ type: "plugin:marketplaces" } as any);
111
- send({ type: "plugin:errors" } as any);
112
- send({ type: "plugin:discover" } as any);
113
-
114
- return function () {
115
- unsubscribe("plugin:list_result", handleListResult);
116
- unsubscribe("plugin:marketplaces_result", handleMarketplacesResult);
117
- unsubscribe("plugin:search_result", handleSearchResult);
118
- unsubscribe("plugin:install_result", handleInstallResult);
119
- unsubscribe("plugin:uninstall_result", handleUninstallResult);
120
- unsubscribe("plugin:update_result", handleUpdateResult);
121
- unsubscribe("plugin:details_result", handleDetailsResult);
122
- unsubscribe("plugin:errors_result", handleErrorsResult);
123
- unsubscribe("plugin:discover_result", handleDiscoverResult);
124
- };
125
- }, []);
126
-
127
- function showAction(text: string, success: boolean) {
128
- setActionMessage({ text, success });
129
- setTimeout(function () { setActionMessage(null); }, 3000);
130
- }
131
-
132
- function handleViewDetails(plugin: PluginInfo) {
133
- send({ type: "plugin:details", name: plugin.name, marketplace: plugin.marketplace } as any);
134
- }
135
-
136
- function handleInstall(name: string, marketplace: string) {
137
- var key = name + "@" + marketplace;
138
- setInstallingKey(key);
139
- send({ type: "plugin:install", name: name, marketplace: marketplace } as any);
140
- }
141
-
142
- function handleUninstall(plugin: PluginInfo) {
143
- setUninstallingKey(plugin.key);
144
- setConfirmUninstall(null);
145
- send({ type: "plugin:uninstall", name: plugin.name, marketplace: plugin.marketplace } as any);
146
- }
147
-
148
- function handleUpdate(plugin: PluginInfo) {
149
- setUpdatingKey(plugin.key);
150
- send({ type: "plugin:update", name: plugin.name, marketplace: plugin.marketplace } as any);
151
- }
152
-
153
- var handleSearchInput = useCallback(function (value: string) {
154
- setSearchQuery(value);
155
- if (searchTimerRef.current) clearTimeout(searchTimerRef.current);
156
- if (!value.trim()) {
157
- setSearchResults([]);
158
- setHasSearched(false);
159
- setSearching(false);
160
- return;
161
- }
162
- setSearching(true);
163
- searchTimerRef.current = setTimeout(function () {
164
- send({ type: "plugin:search", query: value.trim() } as any);
165
- }, 300);
166
- }, [send]);
167
-
168
- if (!loaded) {
169
- return (
170
- <div className="py-4 space-y-3 animate-pulse">
171
- {[0, 1, 2].map(function (i) { return <div key={i} className="bg-base-content/[0.03] rounded-xl h-16" />; })}
172
- </div>
173
- );
174
- }
175
-
176
- return (
177
- <div className="py-2 space-y-8">
178
- {actionMessage && (
179
- <div className={
180
- "text-[12px] px-3 py-2 rounded-lg border " +
181
- (actionMessage.success
182
- ? "bg-success/10 border-success/20 text-success"
183
- : "bg-error/10 border-error/20 text-error")
184
- }>
185
- {actionMessage.text}
186
- </div>
187
- )}
188
-
189
- {pluginErrors.length > 0 && (
190
- <PluginErrorsSection errors={pluginErrors} />
191
- )}
192
-
193
- <InstalledPlugins
194
- plugins={plugins}
195
- updatingKey={updatingKey}
196
- uninstallingKey={uninstallingKey}
197
- confirmUninstall={confirmUninstall}
198
- onViewDetails={handleViewDetails}
199
- onUpdate={handleUpdate}
200
- onUninstall={handleUninstall}
201
- onConfirmUninstall={setConfirmUninstall}
202
- />
203
-
204
- <MarketplaceSearch
205
- query={searchQuery}
206
- results={searchResults}
207
- searching={searching}
208
- hasSearched={hasSearched}
209
- installingKey={installingKey}
210
- installedKeys={new Set(plugins.map(function (p) { return p.key; }))}
211
- onSearch={handleSearchInput}
212
- onInstall={handleInstall}
213
- />
214
-
215
- <DiscoverSection
216
- plugins={discoverPlugins}
217
- loaded={discoverLoaded}
218
- installingKey={installingKey}
219
- installedKeys={new Set(plugins.map(function (p) { return p.key; }))}
220
- onInstall={handleInstall}
221
- />
222
-
223
- <MarketplaceList marketplaces={marketplaces} />
224
-
225
- {detailPlugin && (
226
- <PluginDetailModal
227
- plugin={detailPlugin}
228
- onClose={function () { setDetailPlugin(null); }}
229
- />
230
- )}
231
- </div>
232
- );
233
- }
234
-
235
- function InstalledPlugins({
236
- plugins,
237
- updatingKey,
238
- uninstallingKey,
239
- confirmUninstall,
240
- onViewDetails,
241
- onUpdate,
242
- onUninstall,
243
- onConfirmUninstall,
244
- }: {
245
- plugins: PluginInfo[];
246
- updatingKey: string | null;
247
- uninstallingKey: string | null;
248
- confirmUninstall: string | null;
249
- onViewDetails: (p: PluginInfo) => void;
250
- onUpdate: (p: PluginInfo) => void;
251
- onUninstall: (p: PluginInfo) => void;
252
- onConfirmUninstall: (key: string | null) => void;
253
- }) {
254
- return (
255
- <div>
256
- <div className="text-[12px] font-semibold text-base-content/40 mb-2">Installed Plugins</div>
257
- {plugins.length === 0 ? (
258
- <div className="py-6 text-center">
259
- <div className="text-[12px] text-base-content/30 mb-0.5">No plugins installed</div>
260
- <div className="text-[11px] text-base-content/20">Browse the marketplace or search below to add plugins.</div>
261
- </div>
262
- ) : (
263
- <div className="space-y-2">
264
- {plugins.map(function (plugin) {
265
- return (
266
- <PluginCard
267
- key={plugin.key}
268
- plugin={plugin}
269
- isUpdating={updatingKey === plugin.key}
270
- isUninstalling={uninstallingKey === plugin.key}
271
- isConfirmingUninstall={confirmUninstall === plugin.key}
272
- onViewDetails={function () { onViewDetails(plugin); }}
273
- onUpdate={function () { onUpdate(plugin); }}
274
- onUninstall={function () { onUninstall(plugin); }}
275
- onConfirmUninstall={function () { onConfirmUninstall(plugin.key); }}
276
- onCancelUninstall={function () { onConfirmUninstall(null); }}
277
- />
278
- );
279
- })}
280
- </div>
281
- )}
282
- </div>
283
- );
284
- }
285
-
286
- function PluginCard({
287
- plugin,
288
- isUpdating,
289
- isUninstalling,
290
- isConfirmingUninstall,
291
- onViewDetails,
292
- onUpdate,
293
- onUninstall,
294
- onConfirmUninstall,
295
- onCancelUninstall,
296
- }: {
297
- plugin: PluginInfo;
298
- isUpdating: boolean;
299
- isUninstalling: boolean;
300
- isConfirmingUninstall: boolean;
301
- onViewDetails: () => void;
302
- onUpdate: () => void;
303
- onUninstall: () => void;
304
- onConfirmUninstall: () => void;
305
- onCancelUninstall: () => void;
306
- }) {
307
- return (
308
- <div
309
- onClick={onViewDetails}
310
- className="flex items-start gap-3 px-3 py-2.5 bg-base-300 border border-base-content/15 rounded-xl cursor-pointer hover:border-base-content/30 hover:bg-base-300/80 transition-colors duration-[120ms]"
311
- role="button"
312
- tabIndex={0}
313
- onKeyDown={function (e) { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); onViewDetails(); } }}
314
- >
315
- <Blocks size={14} className="text-base-content/25 mt-0.5 flex-shrink-0" />
316
- <div className="flex-1 min-w-0">
317
- <div className="flex items-center gap-2">
318
- <span className="text-[13px] font-bold text-base-content truncate">{plugin.name}</span>
319
- <span className="shrink-0 text-[10px] font-mono px-1.5 py-0.5 rounded-md bg-base-content/8 text-base-content/40">
320
- v{plugin.version}
321
- </span>
322
- </div>
323
- <div className="flex items-center gap-3 mt-0.5">
324
- <span className="text-[11px] text-base-content/30">{plugin.marketplace}</span>
325
- <span className="text-[11px] text-base-content/25">
326
- {plugin.skillCount} skill{plugin.skillCount !== 1 ? "s" : ""}
327
- {plugin.hookCount > 0 ? ", " + plugin.hookCount + " hook" + (plugin.hookCount !== 1 ? "s" : "") : ""}
328
- {plugin.ruleCount > 0 ? ", " + plugin.ruleCount + " rule" + (plugin.ruleCount !== 1 ? "s" : "") : ""}
329
- </span>
330
- </div>
331
- {plugin.description && (
332
- <div className="text-[12px] text-base-content/40 mt-0.5 line-clamp-1">{plugin.description}</div>
333
- )}
334
- </div>
335
- <div className="flex gap-1 flex-shrink-0 mt-0.5" onClick={function (e) { e.stopPropagation(); }}>
336
- {isUpdating ? (
337
- <Loader2 size={12} className="text-primary animate-spin mt-1 mx-1" />
338
- ) : (
339
- <button
340
- onClick={onUpdate}
341
- aria-label={"Update " + plugin.name}
342
- className="btn btn-ghost btn-xs btn-square text-base-content/30 hover:text-info focus-visible:ring-2 focus-visible:ring-primary"
343
- >
344
- <RefreshCw size={12} />
345
- </button>
346
- )}
347
- {isConfirmingUninstall ? (
348
- <div className="flex gap-1">
349
- <button
350
- onClick={onUninstall}
351
- className="btn btn-error btn-xs"
352
- disabled={isUninstalling}
353
- >
354
- {isUninstalling ? <Loader2 size={10} className="animate-spin" /> : "Remove"}
355
- </button>
356
- <button onClick={onCancelUninstall} className="btn btn-ghost btn-xs">
357
- Cancel
358
- </button>
359
- </div>
360
- ) : (
361
- <button
362
- onClick={onConfirmUninstall}
363
- aria-label={"Remove " + plugin.name}
364
- className="btn btn-ghost btn-xs btn-square text-base-content/30 hover:text-error focus-visible:ring-2 focus-visible:ring-primary"
365
- >
366
- <Trash2 size={12} />
367
- </button>
368
- )}
369
- </div>
370
- </div>
371
- );
372
- }
373
-
374
- function MarketplaceSearch({
375
- query,
376
- results,
377
- searching,
378
- hasSearched,
379
- installingKey,
380
- installedKeys,
381
- onSearch,
382
- onInstall,
383
- }: {
384
- query: string;
385
- results: MarketplacePluginEntry[];
386
- searching: boolean;
387
- hasSearched: boolean;
388
- installingKey: string | null;
389
- installedKeys: Set<string>;
390
- onSearch: (q: string) => void;
391
- onInstall: (name: string, marketplace: string) => void;
392
- }) {
393
- return (
394
- <div>
395
- <div className="text-[12px] font-semibold text-base-content/40 mb-2">Browse Marketplace</div>
396
- <div className="relative mb-3">
397
- <Search size={13} className="absolute left-3 top-1/2 -translate-y-1/2 text-base-content/30 pointer-events-none" />
398
- <input
399
- type="text"
400
- value={query}
401
- onChange={function (e) { onSearch(e.target.value); }}
402
- placeholder="Search plugins..."
403
- className="w-full bg-base-300 border border-base-content/15 rounded-xl pl-8 pr-3 py-2.5 text-[13px] text-base-content placeholder:text-base-content/30 focus:outline-none focus:border-primary transition-colors"
404
- />
405
- {searching && (
406
- <Loader2 size={13} className="absolute right-3 top-1/2 -translate-y-1/2 text-primary animate-spin" />
407
- )}
408
- </div>
409
-
410
- {hasSearched && results.length === 0 && !searching && (
411
- <div className="py-4 text-center text-[13px] text-base-content/30">
412
- No plugins found for "{query}"
413
- </div>
414
- )}
415
-
416
- {results.length > 0 && (
417
- <div className="space-y-2">
418
- {results.map(function (entry) {
419
- var key = entry.name + "@" + entry.marketplace;
420
- var isInstalled = installedKeys.has(key);
421
- var isInstalling = installingKey === key;
422
- return (
423
- <div
424
- key={key}
425
- className="flex items-start gap-3 px-3 py-2.5 bg-base-300/50 border border-base-content/10 rounded-xl"
426
- >
427
- <Package size={14} className="text-base-content/20 mt-0.5 flex-shrink-0" />
428
- <div className="flex-1 min-w-0">
429
- <div className="flex items-center gap-2">
430
- <span className="text-[13px] font-bold text-base-content truncate">{entry.name}</span>
431
- <span className="text-[10px] font-mono text-base-content/30">{entry.marketplace}</span>
432
- </div>
433
- {entry.description && (
434
- <div className="text-[12px] text-base-content/40 mt-0.5 line-clamp-2">{entry.description}</div>
435
- )}
436
- <div className="flex items-center gap-3 mt-1">
437
- {entry.author && (
438
- <span className="text-[10px] text-base-content/25">{entry.author.name}</span>
439
- )}
440
- {entry.installs != null && entry.installs > 0 && (
441
- <span className="text-[10px] text-base-content/25 flex items-center gap-0.5">
442
- <Download size={9} />
443
- {formatInstalls(entry.installs)}
444
- </span>
445
- )}
446
- </div>
447
- </div>
448
- <div className="flex-shrink-0 mt-0.5" onClick={function (e) { e.stopPropagation(); }}>
449
- {isInstalled ? (
450
- <span className="text-[10px] font-mono px-2 py-1 rounded-md bg-success/10 text-success/70">
451
- Installed
452
- </span>
453
- ) : isInstalling ? (
454
- <Loader2 size={14} className="text-primary animate-spin mx-2" />
455
- ) : (
456
- <button
457
- onClick={function () { onInstall(entry.name, entry.marketplace); }}
458
- className="btn btn-primary btn-xs"
459
- >
460
- Install
461
- </button>
462
- )}
463
- </div>
464
- </div>
465
- );
466
- })}
467
- </div>
468
- )}
469
- </div>
470
- );
471
- }
472
-
473
- function MarketplaceList({ marketplaces }: { marketplaces: PluginMarketplaceInfo[] }) {
474
- if (marketplaces.length === 0) return null;
475
- return (
476
- <div>
477
- <div className="text-[12px] font-semibold text-base-content/40 mb-2">Registered Marketplaces</div>
478
- <div className="space-y-1.5">
479
- {marketplaces.map(function (m) {
480
- return (
481
- <div key={m.name} className="flex items-center gap-2.5 px-3 py-2 bg-base-300/30 border border-base-content/10 rounded-lg">
482
- <Package size={12} className="text-base-content/20 flex-shrink-0" />
483
- <div className="flex-1 min-w-0">
484
- <span className="text-[12px] font-bold text-base-content/60">{m.name}</span>
485
- <span className="text-[11px] text-base-content/25 ml-2">{m.source.repo}</span>
486
- </div>
487
- </div>
488
- );
489
- })}
490
- </div>
491
- </div>
492
- );
493
- }
494
-
495
- function PluginDetailModal({ plugin, onClose }: { plugin: PluginDetails; onClose: () => void }) {
496
- useEffect(function () {
497
- function handleKeyDown(e: KeyboardEvent) {
498
- if (e.key === "Escape") onClose();
499
- }
500
- document.addEventListener("keydown", handleKeyDown);
501
- return function () { document.removeEventListener("keydown", handleKeyDown); };
502
- }, [onClose]);
503
-
504
- return (
505
- <div className="fixed inset-0 z-50 flex items-center justify-center" role="dialog" aria-modal="true" aria-label={"Plugin: " + plugin.name}>
506
- <div className="absolute inset-0 bg-base-content/50" onClick={onClose} />
507
- <div className="relative bg-base-200 border border-base-content/15 rounded-2xl shadow-2xl w-full max-w-2xl mx-4 max-h-[80vh] flex flex-col overflow-hidden">
508
- <div className="flex items-center justify-between px-5 py-4 border-b border-base-content/15 flex-shrink-0">
509
- <div className="flex items-center gap-2.5 min-w-0">
510
- <Blocks size={16} className="text-primary flex-shrink-0" />
511
- <div className="min-w-0">
512
- <h2 className="text-[15px] font-mono font-bold text-base-content truncate">{plugin.name}</h2>
513
- <div className="flex items-center gap-2 mt-0.5">
514
- <span className="text-[10px] font-mono text-base-content/40">v{plugin.version}</span>
515
- <span className="text-[10px] text-base-content/30">{plugin.marketplace}</span>
516
- </div>
517
- </div>
518
- </div>
519
- <button
520
- onClick={onClose}
521
- aria-label="Close"
522
- className="btn btn-ghost btn-xs btn-square text-base-content/40 hover:text-base-content"
523
- >
524
- <X size={16} />
525
- </button>
526
- </div>
527
-
528
- <div className="overflow-y-auto flex-1">
529
- <div className="px-5 py-3 border-b border-base-content/10 bg-base-300/30">
530
- <div className="flex flex-wrap gap-x-6 gap-y-1.5">
531
- {plugin.author && (
532
- <MetaItem label="Author" value={plugin.author.name} />
533
- )}
534
- {plugin.license && (
535
- <MetaItem label="License" value={plugin.license} />
536
- )}
537
- <MetaItem label="Installed" value={formatDate(plugin.installedAt)} />
538
- <MetaItem label="Updated" value={formatDate(plugin.lastUpdated)} />
539
- {plugin.homepage && (
540
- <a
541
- href={plugin.homepage}
542
- target="_blank"
543
- rel="noopener noreferrer"
544
- className="flex items-center gap-1 text-[11px] text-primary/60 hover:text-primary transition-colors"
545
- >
546
- <ExternalLink size={10} />
547
- Homepage
548
- </a>
549
- )}
550
- </div>
551
- </div>
552
-
553
- {plugin.description && (
554
- <div className="px-5 py-3 border-b border-base-content/10">
555
- <p className="text-[13px] text-base-content/60">{plugin.description}</p>
556
- </div>
557
- )}
558
-
559
- {plugin.keywords && plugin.keywords.length > 0 && (
560
- <div className="px-5 py-3 border-b border-base-content/10">
561
- <div className="flex flex-wrap gap-1.5">
562
- {plugin.keywords.map(function (kw) {
563
- return (
564
- <span key={kw} className="text-[10px] font-mono px-1.5 py-0.5 rounded-md bg-base-content/8 text-base-content/40">
565
- {kw}
566
- </span>
567
- );
568
- })}
569
- </div>
570
- </div>
571
- )}
572
-
573
- {plugin.skills.length > 0 && (
574
- <div className="px-5 py-3 border-b border-base-content/10">
575
- <div className="flex items-center gap-1.5 mb-2">
576
- <Puzzle size={12} className="text-base-content/30" />
577
- <span className="text-[11px] font-bold text-base-content/40 uppercase tracking-wider">
578
- Skills ({plugin.skills.length})
579
- </span>
580
- </div>
581
- <div className="space-y-1.5">
582
- {plugin.skills.map(function (skill) {
583
- return (
584
- <div key={skill.name} className="flex items-start gap-2 py-1">
585
- <ChevronRight size={10} className="text-base-content/20 mt-0.5 flex-shrink-0" />
586
- <div className="min-w-0">
587
- <span className="text-[12px] font-bold text-base-content/70">{skill.name}</span>
588
- {skill.description && (
589
- <div className="text-[11px] text-base-content/35 line-clamp-1">{skill.description}</div>
590
- )}
591
- </div>
592
- </div>
593
- );
594
- })}
595
- </div>
596
- </div>
597
- )}
598
-
599
- {Object.keys(plugin.hooks).length > 0 && (
600
- <div className="px-5 py-3 border-b border-base-content/10">
601
- <div className="flex items-center gap-1.5 mb-2">
602
- <Webhook size={12} className="text-base-content/30" />
603
- <span className="text-[11px] font-bold text-base-content/40 uppercase tracking-wider">
604
- Hooks ({Object.keys(plugin.hooks).length})
605
- </span>
606
- </div>
607
- <div className="space-y-1">
608
- {Object.keys(plugin.hooks).map(function (hookName) {
609
- return (
610
- <div key={hookName} className="flex items-center gap-2 py-0.5">
611
- <ChevronRight size={10} className="text-base-content/20 flex-shrink-0" />
612
- <span className="text-[12px] font-mono text-base-content/50">{hookName}</span>
613
- </div>
614
- );
615
- })}
616
- </div>
617
- </div>
618
- )}
619
-
620
- {plugin.rules.length > 0 && (
621
- <div className="px-5 py-3">
622
- <div className="flex items-center gap-1.5 mb-2">
623
- <ScrollText size={12} className="text-base-content/30" />
624
- <span className="text-[11px] font-bold text-base-content/40 uppercase tracking-wider">
625
- Rules ({plugin.rules.length})
626
- </span>
627
- </div>
628
- <div className="space-y-1">
629
- {plugin.rules.map(function (rule) {
630
- return (
631
- <div key={rule} className="flex items-center gap-2 py-0.5">
632
- <ChevronRight size={10} className="text-base-content/20 flex-shrink-0" />
633
- <span className="text-[12px] font-mono text-base-content/50">{rule}</span>
634
- </div>
635
- );
636
- })}
637
- </div>
638
- </div>
639
- )}
640
- </div>
641
-
642
- <div className="px-5 py-3 border-t border-base-content/15 flex-shrink-0">
643
- <div className="text-[11px] font-mono text-base-content/30 truncate">
644
- {plugin.gitCommitSha.slice(0, 8)} &middot; {plugin.installPath}
645
- </div>
646
- </div>
647
- </div>
648
- </div>
649
- );
650
- }
651
-
652
- function PluginErrorsSection({ errors }: { errors: PluginError[] }) {
653
- return (
654
- <div>
655
- <div className="flex items-center gap-1.5 mb-2">
656
- <AlertTriangle size={12} className="text-warning" />
657
- <span className="text-[12px] font-semibold text-warning/80">
658
- Errors ({errors.length})
659
- </span>
660
- </div>
661
- <div className="space-y-2">
662
- {errors.map(function (err) {
663
- return (
664
- <div key={err.key} className="px-3 py-2.5 bg-warning/5 border border-warning/20 rounded-xl">
665
- <div className="flex items-center gap-2 mb-1">
666
- <span className="text-[13px] font-bold text-base-content">{err.name}</span>
667
- <span className="text-[10px] font-mono text-base-content/30">{err.marketplace}</span>
668
- </div>
669
- {err.errors.map(function (e, i) {
670
- return (
671
- <div key={i} className="flex items-start gap-1.5 mt-0.5">
672
- <AlertTriangle size={10} className="text-warning/60 mt-0.5 flex-shrink-0" />
673
- <span className="text-[12px] text-warning/70">{e}</span>
674
- </div>
675
- );
676
- })}
677
- </div>
678
- );
679
- })}
680
- </div>
681
- </div>
682
- );
683
- }
684
-
685
- function DiscoverSection({
686
- plugins,
687
- loaded,
688
- installingKey,
689
- installedKeys,
690
- onInstall,
691
- }: {
692
- plugins: MarketplacePluginEntry[];
693
- loaded: boolean;
694
- installingKey: string | null;
695
- installedKeys: Set<string>;
696
- onInstall: (name: string, marketplace: string) => void;
697
- }) {
698
- var [showAll, setShowAll] = useState(false);
699
- var INITIAL_COUNT = 12;
700
-
701
- if (!loaded) return null;
702
- if (plugins.length === 0) return null;
703
-
704
- var visible = showAll ? plugins : plugins.slice(0, INITIAL_COUNT);
705
-
706
- return (
707
- <div>
708
- <div className="flex items-center justify-between mb-2">
709
- <div className="text-[12px] font-semibold text-base-content/40">
710
- Discover ({plugins.length} available)
711
- </div>
712
- </div>
713
- <div className="space-y-2">
714
- {visible.map(function (entry) {
715
- var key = entry.name + "@" + entry.marketplace;
716
- var isInstalled = installedKeys.has(key);
717
- var isInstalling = installingKey === key;
718
- return (
719
- <div
720
- key={key}
721
- className="flex items-start gap-3 px-3 py-2.5 bg-base-300/50 border border-base-content/10 rounded-xl"
722
- >
723
- <Package size={14} className="text-base-content/20 mt-0.5 flex-shrink-0" />
724
- <div className="flex-1 min-w-0">
725
- <div className="flex items-center gap-2">
726
- <span className="text-[13px] font-bold text-base-content truncate">{entry.name}</span>
727
- <span className="text-[10px] font-mono text-base-content/30">{entry.marketplace}</span>
728
- </div>
729
- {entry.description && (
730
- <div className="text-[12px] text-base-content/40 mt-0.5 line-clamp-2">{entry.description}</div>
731
- )}
732
- <div className="flex items-center gap-3 mt-1">
733
- {entry.author && (
734
- <span className="text-[10px] text-base-content/25">{entry.author.name}</span>
735
- )}
736
- {entry.installs != null && entry.installs > 0 && (
737
- <span className="text-[10px] text-base-content/25 flex items-center gap-0.5">
738
- <Download size={9} />
739
- {formatInstalls(entry.installs)}
740
- </span>
741
- )}
742
- </div>
743
- </div>
744
- <div className="flex-shrink-0 mt-0.5" onClick={function (e) { e.stopPropagation(); }}>
745
- {isInstalled ? (
746
- <span className="text-[10px] font-mono px-2 py-1 rounded-md bg-success/10 text-success/70">
747
- Installed
748
- </span>
749
- ) : isInstalling ? (
750
- <Loader2 size={14} className="text-primary animate-spin mx-2" />
751
- ) : (
752
- <button
753
- onClick={function () { onInstall(entry.name, entry.marketplace); }}
754
- className="btn btn-primary btn-xs"
755
- >
756
- Install
757
- </button>
758
- )}
759
- </div>
760
- </div>
761
- );
762
- })}
763
- </div>
764
- {!showAll && plugins.length > INITIAL_COUNT && (
765
- <button
766
- onClick={function () { setShowAll(true); }}
767
- className="mt-3 text-[12px] text-primary/60 hover:text-primary transition-colors"
768
- >
769
- Show all {plugins.length} plugins
770
- </button>
771
- )}
772
- {showAll && plugins.length > INITIAL_COUNT && (
773
- <button
774
- onClick={function () { setShowAll(false); }}
775
- className="mt-3 text-[12px] text-primary/60 hover:text-primary transition-colors"
776
- >
777
- Show less
778
- </button>
779
- )}
780
- </div>
781
- );
782
- }
783
-
784
- function MetaItem({ label, value }: { label: string; value: string }) {
785
- return (
786
- <div className="flex items-baseline gap-1.5">
787
- <span className="text-[11px] font-mono text-base-content/35 uppercase tracking-wider">{label}</span>
788
- <span className="text-[12px] text-base-content/70">{value}</span>
789
- </div>
790
- );
791
- }
792
-
793
- function formatInstalls(count: number): string {
794
- if (count >= 1000000) return (count / 1000000).toFixed(1) + "M";
795
- if (count >= 1000) return (count / 1000).toFixed(1) + "k";
796
- return String(count);
797
- }
798
-
799
- function formatDate(iso: string): string {
800
- try {
801
- var d = new Date(iso);
802
- return d.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric" });
803
- } catch {
804
- return iso;
805
- }
806
- }