@cryptiklemur/lattice 4.0.1 → 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 -454
  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,108 +0,0 @@
1
- import { useState, useEffect } from "react";
2
- import { useWebSocket } from "../../hooks/useWebSocket";
3
- import { getAvailableModels, setAvailableModels, type ModelOption } from "../../stores/session";
4
-
5
- interface ModelSelectorState {
6
- model: string;
7
- effort: string;
8
- }
9
-
10
- var FALLBACK_MODELS: ModelOption[] = [
11
- { value: "default", displayName: "Default" },
12
- { value: "opus", displayName: "Opus" },
13
- { value: "sonnet", displayName: "Sonnet" },
14
- { value: "haiku", displayName: "Haiku" },
15
- ];
16
-
17
- var EFFORT_OPTIONS = [
18
- { value: "low", label: "Effort: Low" },
19
- { value: "medium", label: "Effort: Medium" },
20
- { value: "high", label: "Effort: High" },
21
- { value: "max", label: "Effort: Max" },
22
- ];
23
-
24
- interface ModelSelectorProps {
25
- onChange?: (state: ModelSelectorState) => void;
26
- }
27
-
28
- export function ModelSelector(props: ModelSelectorProps) {
29
- var [model, setModel] = useState<string>("default");
30
- var [effort, setEffort] = useState<string>("medium");
31
- var [models, setModels] = useState<ModelOption[]>(function () {
32
- var warmup = getAvailableModels();
33
- return warmup.length > 0 ? warmup : FALLBACK_MODELS;
34
- });
35
- var ws = useWebSocket();
36
-
37
- useEffect(function () {
38
- function handleWarmupModels(msg: { type: string; models?: ModelOption[] }) {
39
- if (msg.type === "warmup:models" && msg.models && msg.models.length > 0) {
40
- setAvailableModels(msg.models);
41
- setModels(msg.models);
42
- }
43
- }
44
- ws.subscribe("warmup:models", handleWarmupModels as any);
45
- return function () {
46
- ws.unsubscribe("warmup:models", handleWarmupModels as any);
47
- };
48
- }, [ws]);
49
-
50
- function handleModelChange(e: React.ChangeEvent<HTMLSelectElement>) {
51
- var val = e.currentTarget.value;
52
- setModel(val);
53
- ws.send({ type: "chat:set_model", model: val } as any);
54
- if (props.onChange) {
55
- props.onChange({ model: val, effort });
56
- }
57
- }
58
-
59
- function handleEffortChange(e: React.ChangeEvent<HTMLSelectElement>) {
60
- var val = e.currentTarget.value;
61
- setEffort(val);
62
- if (props.onChange) {
63
- props.onChange({ model, effort: val });
64
- }
65
- }
66
-
67
- return (
68
- <div className="flex items-center gap-0.5 font-mono text-[10px]">
69
- <select
70
- value={model}
71
- onChange={handleModelChange}
72
- title="Select model"
73
- aria-label="Model"
74
- className={
75
- "select select-xs select-ghost font-mono text-[10px] min-h-0 h-6 min-w-0 w-auto " +
76
- (model === "default" ? "text-base-content/40" : "text-primary")
77
- }
78
- >
79
- {models.map(function (opt) {
80
- return (
81
- <option key={opt.value} value={opt.value}>
82
- {"Model: " + opt.displayName}
83
- </option>
84
- );
85
- })}
86
- </select>
87
- <span className="text-base-content/20">·</span>
88
- <select
89
- value={effort}
90
- onChange={handleEffortChange}
91
- title="Select effort"
92
- aria-label="Effort level"
93
- className={
94
- "select select-xs select-ghost font-mono text-[10px] min-h-0 h-6 min-w-0 w-auto " +
95
- (effort === "medium" ? "text-base-content/40" : "text-primary")
96
- }
97
- >
98
- {EFFORT_OPTIONS.map(function (opt) {
99
- return (
100
- <option key={opt.value} value={opt.value}>
101
- {opt.label}
102
- </option>
103
- );
104
- })}
105
- </select>
106
- </div>
107
- );
108
- }
@@ -1,41 +0,0 @@
1
- import { useState } from "react";
2
- import { useWebSocket } from "../../hooks/useWebSocket";
3
-
4
- var MODE_OPTIONS = [
5
- { value: "default", label: "Mode: Default" },
6
- { value: "acceptEdits", label: "Mode: Accept Edits" },
7
- { value: "plan", label: "Mode: Plan" },
8
- { value: "dontAsk", label: "Mode: Don't Ask" },
9
- ];
10
-
11
- export function PermissionModeSelector() {
12
- var [mode, setMode] = useState<string>("default");
13
- var { send } = useWebSocket();
14
-
15
- function handleChange(e: React.ChangeEvent<HTMLSelectElement>) {
16
- var val = e.currentTarget.value;
17
- setMode(val);
18
- send({ type: "chat:set_permission_mode", mode: val as "default" | "acceptEdits" | "plan" | "dontAsk" });
19
- }
20
-
21
- return (
22
- <select
23
- value={mode}
24
- onChange={handleChange}
25
- title="Permission mode"
26
- aria-label="Permission mode"
27
- className={
28
- "select select-xs select-ghost font-mono text-[10px] min-h-0 h-6 min-w-0 w-auto " +
29
- (mode === "default" ? "text-base-content/40" : "text-primary")
30
- }
31
- >
32
- {MODE_OPTIONS.map(function (opt) {
33
- return (
34
- <option key={opt.value} value={opt.value}>
35
- {opt.label}
36
- </option>
37
- );
38
- })}
39
- </select>
40
- );
41
- }
@@ -1,271 +0,0 @@
1
- import { useState, useRef, useEffect } from "react";
2
- import { Check, Circle, CheckCircle2, MessageCircleQuestion, ChevronDown, Send } from "lucide-react";
3
- import type { HistoryMessage } from "#shared";
4
- import { useWebSocket } from "../../hooks/useWebSocket";
5
- import { resolvePromptQuestion } from "../../stores/session";
6
-
7
- interface PromptQuestionProps {
8
- message: HistoryMessage;
9
- }
10
-
11
- var LETTERS = ["A", "B", "C", "D"];
12
-
13
- export function PromptQuestion(props: PromptQuestionProps) {
14
- var msg = props.message;
15
- var { send } = useWebSocket();
16
- var [otherText, setOtherText] = useState("");
17
- var [selectedMulti, setSelectedMulti] = useState<Set<string>>(new Set());
18
- var [focusIndex, setFocusIndex] = useState(-1);
19
- var [expanded, setExpanded] = useState(false);
20
- var optionsRef = useRef<HTMLDivElement>(null);
21
-
22
- var questions = msg.promptQuestions || [];
23
- var answers = msg.promptAnswers;
24
- var status = msg.promptStatus || "pending";
25
- var requestId = msg.toolId || "";
26
-
27
- useEffect(function () {
28
- if (status === "pending" && optionsRef.current) {
29
- var firstBtn = optionsRef.current.querySelector("button");
30
- if (firstBtn) firstBtn.focus();
31
- }
32
- }, [status]);
33
-
34
- function submitAnswer(questionText: string, answer: string) {
35
- var answerMap: Record<string, string> = {};
36
- answerMap[questionText] = answer;
37
- resolvePromptQuestion(requestId, answerMap);
38
- send({
39
- type: "chat:prompt_response",
40
- requestId: requestId,
41
- answers: answerMap,
42
- });
43
- }
44
-
45
- function submitMultiSelect(questionText: string) {
46
- var parts = Array.from(selectedMulti);
47
- if (otherText.trim()) parts.push(otherText.trim());
48
- submitAnswer(questionText, parts.join(", "));
49
- }
50
-
51
- function submitOther(questionText: string) {
52
- if (!otherText.trim()) return;
53
- submitAnswer(questionText, otherText.trim());
54
- }
55
-
56
- function handleKeyDown(e: React.KeyboardEvent, optionCount: number, q: { question: string; multiSelect: boolean }, options: Array<{ label: string }>) {
57
- if (e.key === "ArrowDown" || e.key === "ArrowRight") {
58
- e.preventDefault();
59
- var next = focusIndex < optionCount - 1 ? focusIndex + 1 : 0;
60
- setFocusIndex(next);
61
- var btns = optionsRef.current?.querySelectorAll("[data-option]");
62
- if (btns && btns[next]) (btns[next] as HTMLElement).focus();
63
- }
64
- if (e.key === "ArrowUp" || e.key === "ArrowLeft") {
65
- e.preventDefault();
66
- var prev = focusIndex > 0 ? focusIndex - 1 : optionCount - 1;
67
- setFocusIndex(prev);
68
- var btns = optionsRef.current?.querySelectorAll("[data-option]");
69
- if (btns && btns[prev]) (btns[prev] as HTMLElement).focus();
70
- }
71
- if (e.key === "Enter" && !q.multiSelect && focusIndex >= 0 && focusIndex < options.length) {
72
- e.preventDefault();
73
- submitAnswer(q.question, options[focusIndex].label);
74
- }
75
- }
76
-
77
- if (status === "answered" && answers) {
78
- var firstAnswer = Object.entries(answers)[0];
79
- var answeredQuestion = questions.length > 0 ? questions[0] : null;
80
- return (
81
- <div className="px-5 py-1.5" aria-live="polite">
82
- <div
83
- className="rounded-xl border border-success/15 bg-base-300/40 overflow-hidden cursor-pointer transition-colors hover:bg-base-300/60"
84
- onClick={function () { setExpanded(!expanded); }}
85
- >
86
- <div className="flex items-center gap-2.5 px-4 py-2.5">
87
- <CheckCircle2 size={15} className="text-success/60 flex-shrink-0" />
88
- {answeredQuestion && (
89
- <span className="text-[10px] font-mono font-semibold uppercase tracking-wider text-base-content/30">{answeredQuestion.header}</span>
90
- )}
91
- <span className="text-[12px] text-base-content/50">{firstAnswer ? firstAnswer[0] : ""}</span>
92
- <span className="flex-1" />
93
- <span className="text-[12px] font-medium text-base-content/70">{firstAnswer ? String(firstAnswer[1]) : ""}</span>
94
- <ChevronDown
95
- size={12}
96
- className={"text-base-content/25 transition-transform duration-200 " + (expanded ? "rotate-180" : "")}
97
- />
98
- </div>
99
-
100
- {expanded && answeredQuestion && (
101
- <div className="px-4 pb-3 border-t border-base-content/5">
102
- <div className="flex flex-col gap-1 pt-2">
103
- {answeredQuestion!.options.map(function (opt: { label: string; description: string; preview?: string }, oi: number) {
104
- var isChosen = firstAnswer && firstAnswer[1] === opt.label;
105
- return (
106
- <div
107
- key={oi}
108
- className={
109
- "flex items-center gap-2.5 px-3 py-1.5 rounded-lg text-[12px] " +
110
- (isChosen ? "bg-success/8 text-base-content/70" : "text-base-content/30")
111
- }
112
- >
113
- <span className={
114
- "w-5 h-5 rounded-md flex items-center justify-center text-[10px] font-mono font-bold flex-shrink-0 " +
115
- (isChosen ? "bg-success/20 text-success/80" : "bg-base-content/5 text-base-content/20")
116
- }>
117
- {LETTERS[oi] || ""}
118
- </span>
119
- <span className={isChosen ? "font-medium" : ""}>{opt.label}</span>
120
- {isChosen && <Check size={12} className="text-success/60 ml-auto" />}
121
- </div>
122
- );
123
- })}
124
- </div>
125
- </div>
126
- )}
127
- </div>
128
- </div>
129
- );
130
- }
131
-
132
- if (status === "timed_out") {
133
- return (
134
- <div className="px-5 py-1.5">
135
- <div className="flex items-center gap-2.5 px-4 py-2.5 rounded-xl bg-warning/5 border border-warning/15 text-[12px] text-warning/50 font-mono">
136
- <Circle size={13} className="flex-shrink-0" />
137
- Prompt timed out — no response sent
138
- </div>
139
- </div>
140
- );
141
- }
142
-
143
- return (
144
- <div className="px-5 py-2" aria-live="polite">
145
- {questions.map(function (q: typeof questions[number], qi: number) {
146
- return (
147
- <div
148
- key={qi}
149
- className="rounded-xl border border-primary/15 bg-base-300/50 overflow-hidden shadow-[0_2px_8px_oklch(from_var(--color-primary)_l_c_h/0.06)]"
150
- >
151
- <div className="flex items-center gap-2.5 px-4 py-2.5 border-b border-base-content/5 bg-base-content/[0.02]">
152
- <MessageCircleQuestion size={14} className="text-primary/40 flex-shrink-0" />
153
- <span className="text-[10px] font-mono font-bold uppercase tracking-widest text-primary/35">{q.header}</span>
154
- <span className="flex-1" />
155
- <span className="text-[9px] font-mono text-base-content/20">select one</span>
156
- </div>
157
-
158
- <div className="px-4 py-3.5">
159
- <div className="text-[13px] text-base-content/80 mb-3.5 leading-relaxed">{q.question}</div>
160
-
161
- <div
162
- ref={optionsRef}
163
- className="flex flex-col gap-1.5"
164
- role={q.multiSelect ? "group" : "radiogroup"}
165
- aria-label={q.question}
166
- onKeyDown={function (e) { handleKeyDown(e, q.options.length, q, q.options); }}
167
- >
168
- {q.options.map(function (opt: typeof q.options[number], oi: number) {
169
- var isSelected = selectedMulti.has(opt.label);
170
- var isFocused = focusIndex === oi;
171
- return (
172
- <button
173
- key={oi}
174
- data-option={oi}
175
- role={q.multiSelect ? "checkbox" : "radio"}
176
- aria-checked={isSelected}
177
- tabIndex={q.multiSelect ? 0 : (isFocused || (focusIndex === -1 && oi === 0) ? 0 : -1)}
178
- onFocus={function () { setFocusIndex(oi); }}
179
- onClick={function () {
180
- if (q.multiSelect) {
181
- setSelectedMulti(function (prev) {
182
- var next = new Set(prev);
183
- if (next.has(opt.label)) {
184
- next.delete(opt.label);
185
- } else {
186
- next.add(opt.label);
187
- }
188
- return next;
189
- });
190
- } else {
191
- submitAnswer(q.question, opt.label);
192
- }
193
- }}
194
- className={
195
- "group text-left flex items-start gap-3 px-3.5 py-2.5 rounded-lg text-[12px] cursor-pointer transition-all duration-150 outline-none " +
196
- (isSelected
197
- ? "bg-primary/10 border border-primary/25 text-base-content/85 shadow-[0_0_0_1px_oklch(from_var(--color-primary)_l_c_h/0.1)]"
198
- : "bg-base-content/[0.02] border border-base-content/8 text-base-content/60 hover:bg-base-content/5 hover:border-base-content/15 hover:text-base-content/75") +
199
- " focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-1 focus-visible:ring-offset-base-300"
200
- }
201
- >
202
- <span className={
203
- "w-5 h-5 rounded-md flex items-center justify-center text-[10px] font-mono font-bold flex-shrink-0 mt-px transition-colors duration-150 " +
204
- (isSelected
205
- ? "bg-primary/25 text-primary"
206
- : "bg-base-content/6 text-base-content/30 group-hover:bg-base-content/10 group-hover:text-base-content/45")
207
- }>
208
- {q.multiSelect
209
- ? (isSelected ? <Check size={11} /> : LETTERS[oi] || "")
210
- : LETTERS[oi] || ""
211
- }
212
- </span>
213
- <div className="flex-1 min-w-0">
214
- <div className="font-medium leading-snug">{opt.label}</div>
215
- {opt.description && (
216
- <div className="text-[11px] text-base-content/35 mt-0.5 leading-relaxed group-hover:text-base-content/45 transition-colors duration-150">{opt.description}</div>
217
- )}
218
- </div>
219
- </button>
220
- );
221
- })}
222
-
223
- <div className="flex items-center gap-2 mt-1.5 pt-1.5 border-t border-base-content/5">
224
- <input
225
- type="text"
226
- placeholder="Other..."
227
- value={otherText}
228
- onChange={function (e) { setOtherText(e.target.value); }}
229
- onKeyDown={function (e) {
230
- if (e.key === "Enter" && !q.multiSelect) {
231
- submitOther(q.question);
232
- }
233
- }}
234
- aria-label="Custom answer"
235
- className="flex-1 bg-base-content/[0.02] border border-base-content/8 rounded-lg px-3 py-2 text-[12px] text-base-content/60 placeholder:text-base-content/20 outline-none focus:border-primary/30 focus:bg-base-content/[0.04] transition-colors duration-150"
236
- />
237
- {!q.multiSelect && otherText.trim() && (
238
- <button
239
- onClick={function () { submitOther(q.question); }}
240
- className="flex items-center gap-1.5 px-3 py-2 rounded-lg bg-primary/15 text-primary text-[11px] font-medium hover:bg-primary/25 transition-colors duration-150 cursor-pointer focus-visible:ring-2 focus-visible:ring-primary/40"
241
- aria-label="Submit custom answer"
242
- >
243
- <Send size={10} />
244
- Send
245
- </button>
246
- )}
247
- </div>
248
-
249
- {q.multiSelect && (
250
- <button
251
- onClick={function () { submitMultiSelect(q.question); }}
252
- disabled={selectedMulti.size === 0 && !otherText.trim()}
253
- className={
254
- "mt-1 flex items-center justify-center gap-2 px-4 py-2.5 rounded-lg text-[12px] font-medium transition-all duration-150 cursor-pointer " +
255
- (selectedMulti.size > 0 || otherText.trim()
256
- ? "bg-primary text-primary-content hover:bg-primary/85 shadow-sm focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2 focus-visible:ring-offset-base-300"
257
- : "bg-base-content/5 text-base-content/20 cursor-not-allowed")
258
- }
259
- >
260
- <Send size={12} />
261
- Submit ({selectedMulti.size} selected)
262
- </button>
263
- )}
264
- </div>
265
- </div>
266
- </div>
267
- );
268
- })}
269
- </div>
270
- );
271
- }
@@ -1,50 +0,0 @@
1
- import { Brain, Wrench } from "lucide-react";
2
-
3
- interface StatusBarProps {
4
- status: {
5
- phase: string;
6
- toolName?: string;
7
- elapsed?: number;
8
- summary?: string;
9
- } | null;
10
- }
11
-
12
- export function StatusBar(props: StatusBarProps) {
13
- var active = props.status !== null;
14
-
15
- return (
16
- <div
17
- className="grid transition-all duration-200 ease-out"
18
- style={{ gridTemplateRows: active ? "1fr" : "0fr" }}
19
- >
20
- <div className="overflow-hidden">
21
- <div className="flex items-center gap-2 px-5 h-7 text-[12px] font-mono text-base-content/50 border-t border-base-300 bg-base-200">
22
- {props.status && (
23
- <>
24
- {props.status.phase === "thinking" ? (
25
- <Brain size={12} className="text-primary animate-pulse" />
26
- ) : (
27
- <Wrench size={12} className="text-primary" />
28
- )}
29
- <span className="truncate">
30
- {props.status.phase === "thinking"
31
- ? "Thinking..."
32
- : props.status.toolName || "Processing..."}
33
- </span>
34
- {props.status.summary && (
35
- <span className="text-base-content/30 truncate">
36
- {props.status.summary}
37
- </span>
38
- )}
39
- {props.status.elapsed != null && (
40
- <span className="text-base-content/30 ml-auto flex-shrink-0">
41
- {(props.status.elapsed / 1000).toFixed(1)}s
42
- </span>
43
- )}
44
- </>
45
- )}
46
- </div>
47
- </div>
48
- </div>
49
- );
50
- }
@@ -1,57 +0,0 @@
1
- import { Circle, CircleDot, CheckCircle2, ListTodo } from "lucide-react";
2
- import type { HistoryMessage } from "#shared";
3
-
4
- interface TodoCardProps {
5
- message: HistoryMessage;
6
- }
7
-
8
- function StatusIcon(props: { status: string }) {
9
- if (props.status === "completed") {
10
- return <CheckCircle2 size={13} className="text-success/70 flex-shrink-0" />;
11
- }
12
- if (props.status === "in_progress") {
13
- return <CircleDot size={13} className="text-primary/70 flex-shrink-0 animate-pulse" />;
14
- }
15
- return <Circle size={13} className="text-base-content/25 flex-shrink-0" />;
16
- }
17
-
18
- export function TodoCard(props: TodoCardProps) {
19
- var todos = props.message.todos || [];
20
- if (todos.length === 0) return null;
21
-
22
- var completed = todos.filter(function (t: typeof todos[number]) { return t.status === "completed"; }).length;
23
- var total = todos.length;
24
-
25
- return (
26
- <div className="px-5 py-2">
27
- <div className="rounded-xl border border-base-content/8 bg-base-300/60 overflow-hidden shadow-sm">
28
- <div className="flex items-center gap-2 px-4 py-2 border-b border-base-content/6 bg-base-content/3">
29
- <ListTodo size={14} className="text-base-content/40 flex-shrink-0" />
30
- <span className="text-[10px] font-mono font-semibold uppercase tracking-wider text-base-content/35">Tasks</span>
31
- <span className="text-[10px] font-mono text-base-content/25">{completed}/{total}</span>
32
- </div>
33
-
34
- <div className="px-3 py-2">
35
- {todos.map(function (todo: typeof todos[number]) {
36
- return (
37
- <div
38
- key={todo.id}
39
- className={
40
- "flex items-start gap-2 px-2 py-1.5 rounded-md text-[12px] " +
41
- (todo.status === "completed" ? "text-base-content/35" : "text-base-content/65")
42
- }
43
- >
44
- <div className="mt-0.5">
45
- <StatusIcon status={todo.status} />
46
- </div>
47
- <span className={todo.status === "completed" ? "line-through" : ""}>
48
- {todo.content}
49
- </span>
50
- </div>
51
- );
52
- })}
53
- </div>
54
- </div>
55
- </div>
56
- );
57
- }
@@ -1,129 +0,0 @@
1
- import { useState } from "react";
2
- import { Wrench, ChevronDown, Check, FileText, Search, Terminal, Pencil, FolderOpen } from "lucide-react";
3
- import type { HistoryMessage } from "#shared";
4
- import { ToolResultRenderer } from "./ToolResultRenderer";
5
- import { formatToolSummary } from "./toolSummary";
6
-
7
- var TOOL_ICONS: Record<string, typeof Wrench> = {
8
- Read: FileText,
9
- Grep: Search,
10
- Glob: Search,
11
- Bash: Terminal,
12
- Write: Pencil,
13
- Edit: Pencil,
14
- MultiEdit: Pencil,
15
- LS: FolderOpen,
16
- };
17
-
18
- function getToolIcon(name: string) {
19
- return TOOL_ICONS[name] || Wrench;
20
- }
21
-
22
-
23
-
24
- function ToolDetail(props: { tool: HistoryMessage }) {
25
- var tool = props.tool;
26
- var [detailOpen, setDetailOpen] = useState(false);
27
- var hasResult = Boolean(tool.content);
28
-
29
- var parsedArgs = tool.args || "";
30
- try {
31
- if (tool.args) {
32
- parsedArgs = JSON.stringify(JSON.parse(tool.args), null, 2);
33
- }
34
- } catch {
35
- parsedArgs = tool.args || "";
36
- }
37
-
38
- var Icon = getToolIcon(tool.name || "");
39
- var summary = formatToolSummary(tool.name || "", tool.args || "");
40
-
41
- return (
42
- <div className="border-t border-base-content/6 first:border-t-0">
43
- <button
44
- type="button"
45
- onClick={function () { setDetailOpen(function (v) { return !v; }); }}
46
- className="flex items-center gap-2 w-full px-2.5 py-1.5 hover:bg-base-content/5 transition-colors cursor-pointer text-left"
47
- >
48
- <Icon size={11} className={hasResult ? "text-base-content/25 flex-shrink-0" : "text-primary/60 flex-shrink-0"} />
49
- <span className="font-mono text-[11px] text-base-content/60 flex-shrink-0">{tool.name}</span>
50
- {summary && (
51
- <span className="text-[10px] text-base-content/30 truncate min-w-0 flex-1">{summary}</span>
52
- )}
53
- {!summary && <span className="flex-1" />}
54
- {hasResult ? (
55
- <Check size={10} className="text-success/40 flex-shrink-0" />
56
- ) : (
57
- <span className="text-[10px] text-primary/70 flex-shrink-0">running</span>
58
- )}
59
- <ChevronDown
60
- size={10}
61
- className={"text-base-content/25 transition-transform duration-150 flex-shrink-0 " + (detailOpen ? "rotate-180" : "")}
62
- />
63
- </button>
64
-
65
- {detailOpen && (
66
- <div className="pb-1">
67
- <ToolResultRenderer toolName={tool.name || ""} args={tool.args || ""} result={tool.content || ""} />
68
- {!(tool.name === "Edit" || tool.name === "MultiEdit") && parsedArgs && (
69
- <div className="px-2.5 py-1.5 border-t border-base-content/6">
70
- <div className="text-[9px] text-base-content/25 uppercase tracking-wider font-semibold mb-0.5">Args</div>
71
- <pre className="font-mono text-[11px] text-base-content/45 whitespace-pre-wrap break-words m-0 leading-relaxed bg-base-100/50 rounded-md p-2 max-h-[120px] overflow-y-auto">
72
- {parsedArgs}
73
- </pre>
74
- </div>
75
- )}
76
- </div>
77
- )}
78
- </div>
79
- );
80
- }
81
-
82
- interface ToolGroupProps {
83
- tools: HistoryMessage[];
84
- }
85
-
86
- export function ToolGroup(props: ToolGroupProps) {
87
- var [expanded, setExpanded] = useState(false);
88
- var tools = props.tools;
89
- var allDone = tools.every(function (t) { return Boolean(t.content); });
90
- var uniqueNames = Array.from(new Set(tools.map(function (t) { return t.name || "unknown"; })));
91
- var summary = uniqueNames.length <= 3
92
- ? uniqueNames.join(", ")
93
- : uniqueNames.slice(0, 2).join(", ") + " + " + (uniqueNames.length - 2) + " more";
94
-
95
- return (
96
- <div className="ml-14 mr-5 py-0.5 max-w-[95%] sm:max-w-[85%]">
97
- <div className={"rounded-lg border text-[12px] overflow-hidden " + (allDone ? "bg-base-200/50 border-base-content/8" : "bg-base-200/70 border-primary/20")}>
98
- <button
99
- type="button"
100
- onClick={function () { setExpanded(function (v) { return !v; }); }}
101
- className="flex items-center gap-2 w-full py-1.5 px-2.5 hover:bg-base-content/5 transition-colors duration-100 cursor-pointer outline-none focus-visible:ring-2 focus-visible:ring-primary/30 focus-visible:ring-inset"
102
- >
103
- <Wrench size={11} className={allDone ? "text-base-content/30" : "text-primary/70"} />
104
- <span className="font-mono font-medium text-base-content/70 flex-1 text-left">
105
- Ran {tools.length} commands
106
- </span>
107
- <span className="text-[10px] text-base-content/40 truncate max-w-[200px]">{summary}</span>
108
- {allDone ? (
109
- <Check size={11} className="text-success/50 flex-shrink-0" />
110
- ) : (
111
- <span className="text-[10px] text-primary/70 flex-shrink-0">running</span>
112
- )}
113
- <ChevronDown
114
- size={11}
115
- className={"text-base-content/30 transition-transform duration-150 flex-shrink-0 " + (expanded ? "rotate-180" : "")}
116
- />
117
- </button>
118
-
119
- {expanded && (
120
- <div className="border-t border-base-content/8">
121
- {tools.map(function (tool, i) {
122
- return <ToolDetail key={tool.toolId || (tool.name + "-" + i)} tool={tool} />;
123
- })}
124
- </div>
125
- )}
126
- </div>
127
- </div>
128
- );
129
- }