@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,36 +0,0 @@
1
- import { useEffect, useState } from "react";
2
- import { useWebSocket } from "./useWebSocket";
3
- import type { ServerMessage, SettingsDataMessage } from "#shared";
4
-
5
- var DEFAULT_VERBS = ["Thinking", "Analyzing", "Processing", "Computing", "Evaluating"];
6
-
7
- export function useSpinnerVerb(active: boolean): string {
8
- var [verbs, setVerbs] = useState<string[]>(DEFAULT_VERBS);
9
- var [currentVerb, setCurrentVerb] = useState(DEFAULT_VERBS[0]);
10
- var ws = useWebSocket();
11
-
12
- useEffect(function () {
13
- function handleSettings(msg: ServerMessage) {
14
- if (msg.type !== "settings:data") return;
15
- var data = msg as SettingsDataMessage;
16
- if (data.spinnerVerbs && data.spinnerVerbs.length > 0) {
17
- setVerbs(data.spinnerVerbs);
18
- }
19
- }
20
- ws.subscribe("settings:data", handleSettings);
21
- return function () { ws.unsubscribe("settings:data", handleSettings); };
22
- }, [ws]);
23
-
24
- useEffect(function () {
25
- if (!active) return;
26
- function pickRandom() {
27
- var idx = Math.floor(Math.random() * verbs.length);
28
- setCurrentVerb(verbs[idx]);
29
- }
30
- pickRandom();
31
- var timer = setInterval(pickRandom, 3000);
32
- return function () { clearInterval(timer); };
33
- }, [active, verbs]);
34
-
35
- return currentVerb;
36
- }
@@ -1,299 +0,0 @@
1
- import { useEffect, useRef } from "react";
2
- import type { RefObject } from "react";
3
-
4
- var LOCK_THRESHOLD = 15;
5
- var SNAP_THRESHOLD = 0.35; // fraction of drawer width to snap open/close
6
- var VELOCITY_THRESHOLD = 0.4; // px/ms — fast flick overrides position
7
- var TRANSITION = "translate 0.25s cubic-bezier(0.4, 0, 0.2, 1)";
8
- var OVERLAY_TRANSITION = "opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1)";
9
- var CONTENT_TRANSITION = "transform 0.25s cubic-bezier(0.4, 0, 0.2, 1)";
10
-
11
- /**
12
- * Discord-style drag-follow drawer. The sidebar follows your finger
13
- * in real time and snaps open/closed on release based on position + velocity.
14
- *
15
- * Works from anywhere on the page. Vertical scrolling is not interrupted.
16
- */
17
- export function useSwipeDrawer(
18
- drawerSideRef: RefObject<HTMLElement | null>,
19
- isOpen: boolean,
20
- onOpen: () => void,
21
- onClose: () => void,
22
- ) {
23
- var stateRef = useRef({ isOpen: isOpen, onOpen: onOpen, onClose: onClose });
24
- stateRef.current = { isOpen: isOpen, onOpen: onOpen, onClose: onClose };
25
-
26
- useEffect(function () {
27
- var startX = 0;
28
- var startY = 0;
29
- var lastX = 0;
30
- var lastTime = 0;
31
- var velocity = 0;
32
- var tracking = false;
33
- var dragging = false; // true once direction locked to horizontal
34
- var direction: "h" | "v" | null = null;
35
-
36
- var panel: HTMLElement | null = null;
37
- var overlay: HTMLElement | null = null;
38
- var content: HTMLElement | null = null;
39
- var drawerWidth = 0;
40
-
41
- function getElements() {
42
- var side = drawerSideRef.current;
43
- if (!side) return false;
44
- // panel = the sidebar content (not the overlay)
45
- panel = side.querySelector(":scope > *:not(.drawer-overlay)") as HTMLElement | null;
46
- overlay = side.querySelector(":scope > .drawer-overlay") as HTMLElement | null;
47
- // content = the main content area (sibling of drawer-side)
48
- var parent = side.parentElement;
49
- if (parent) {
50
- content = parent.querySelector(":scope > .drawer-content") as HTMLElement | null;
51
- }
52
- if (panel) {
53
- drawerWidth = panel.getBoundingClientRect().width;
54
- }
55
- return !!panel;
56
- }
57
-
58
- function setDragStyles(offsetX: number) {
59
- if (!panel) return;
60
- // offsetX: 0 = fully open, -drawerWidth = fully closed
61
- var clamped = Math.max(-drawerWidth, Math.min(0, offsetX));
62
- var progress = 1 + clamped / drawerWidth; // 0 = closed, 1 = open
63
-
64
- panel.style.transition = "none";
65
- panel.style.translate = clamped + "px";
66
-
67
- if (overlay) {
68
- overlay.style.transition = "none";
69
- overlay.style.opacity = String(progress);
70
- }
71
-
72
- if (content) {
73
- var scale = 1 - progress * 0.03;
74
- content.style.transition = "none";
75
- content.style.transform = "scale(" + scale + ")";
76
- content.style.transformOrigin = "left center";
77
- }
78
- }
79
-
80
- function clearDragStyles() {
81
- if (panel) {
82
- panel.style.transition = "";
83
- panel.style.translate = "";
84
- }
85
- if (overlay) {
86
- overlay.style.transition = "";
87
- overlay.style.opacity = "";
88
- }
89
- if (content) {
90
- content.style.transition = "";
91
- content.style.transform = "";
92
- content.style.transformOrigin = "";
93
- }
94
- }
95
-
96
- function animateToOpen() {
97
- if (!panel) return;
98
- panel.style.transition = TRANSITION;
99
- panel.style.translate = "0%";
100
- if (overlay) {
101
- overlay.style.transition = OVERLAY_TRANSITION;
102
- overlay.style.opacity = "1";
103
- }
104
- if (content) {
105
- content.style.transition = CONTENT_TRANSITION;
106
- content.style.transform = "scale(0.97)";
107
- content.style.transformOrigin = "left center";
108
- }
109
- }
110
-
111
- function animateToClosed() {
112
- if (!panel) return;
113
- panel.style.transition = TRANSITION;
114
- panel.style.translate = "-100%";
115
- if (overlay) {
116
- overlay.style.transition = OVERLAY_TRANSITION;
117
- overlay.style.opacity = "0";
118
- }
119
- if (content) {
120
- content.style.transition = CONTENT_TRANSITION;
121
- content.style.transform = "scale(1)";
122
- content.style.transformOrigin = "left center";
123
- }
124
- }
125
-
126
- var cleanupTimer: ReturnType<typeof setTimeout> | null = null;
127
-
128
- function cancelPendingCleanup() {
129
- if (cleanupTimer !== null) {
130
- clearTimeout(cleanupTimer);
131
- cleanupTimer = null;
132
- }
133
- }
134
-
135
- function cleanupAfterAnimation() {
136
- // Cancel any pending cleanup from a previous swipe to avoid races
137
- cancelPendingCleanup();
138
-
139
- // Listen for the transition to actually finish, with a fallback timer
140
- if (panel) {
141
- var handled = false;
142
- function onEnd() {
143
- if (handled) return;
144
- handled = true;
145
- if (panel) panel.removeEventListener("transitionend", onEnd);
146
- cancelPendingCleanup();
147
- clearDragStyles();
148
- }
149
- panel.addEventListener("transitionend", onEnd, { once: true });
150
- // Fallback in case transitionend never fires (e.g. display:none)
151
- cleanupTimer = setTimeout(onEnd, 350);
152
- } else {
153
- clearDragStyles();
154
- }
155
- }
156
-
157
- function onTouchStart(e: TouchEvent) {
158
- if (window.innerWidth >= 1024) return;
159
- var t = e.touches[0];
160
- startX = t.clientX;
161
- startY = t.clientY;
162
- lastX = t.clientX;
163
- lastTime = Date.now();
164
- velocity = 0;
165
- tracking = true;
166
- dragging = false;
167
- direction = null;
168
- }
169
-
170
- function onTouchMove(e: TouchEvent) {
171
- if (!tracking) return;
172
- var t = e.touches[0];
173
- var now = Date.now();
174
-
175
- // Calculate velocity
176
- var dt = now - lastTime;
177
- if (dt > 0) {
178
- velocity = (t.clientX - lastX) / dt;
179
- }
180
- lastX = t.clientX;
181
- lastTime = now;
182
-
183
- // Lock direction
184
- if (direction === null) {
185
- var dx = Math.abs(t.clientX - startX);
186
- var dy = Math.abs(t.clientY - startY);
187
- if (dx >= LOCK_THRESHOLD || dy >= LOCK_THRESHOLD) {
188
- if (dx > dy) {
189
- direction = "h";
190
- dragging = true;
191
- if (!getElements()) {
192
- tracking = false;
193
- return;
194
- }
195
- // Make drawer-side visible during drag if it's currently hidden
196
- var side = drawerSideRef.current;
197
- if (side) {
198
- side.style.visibility = "visible";
199
- side.style.pointerEvents = "auto";
200
- side.style.opacity = "1";
201
- }
202
- } else {
203
- direction = "v";
204
- tracking = false;
205
- return;
206
- }
207
- } else {
208
- return;
209
- }
210
- }
211
-
212
- if (!dragging) return;
213
-
214
- var deltaX = t.clientX - startX;
215
- var isOpen = stateRef.current.isOpen;
216
-
217
- if (isOpen) {
218
- // Dragging from open position: offset relative to 0 (fully open)
219
- setDragStyles(Math.min(0, deltaX));
220
- } else {
221
- // Dragging from closed position: offset relative to -drawerWidth
222
- setDragStyles(-drawerWidth + Math.max(0, deltaX));
223
- }
224
- }
225
-
226
- function onTouchEnd() {
227
- if (!tracking || !dragging) {
228
- tracking = false;
229
- direction = null;
230
- return;
231
- }
232
-
233
- var deltaX = lastX - startX;
234
- var isOpen = stateRef.current.isOpen;
235
-
236
- tracking = false;
237
- dragging = false;
238
- direction = null;
239
-
240
- // Decide: snap open or closed?
241
- // Fast flick overrides position
242
- var shouldOpen: boolean;
243
-
244
- if (Math.abs(velocity) > VELOCITY_THRESHOLD) {
245
- shouldOpen = velocity > 0;
246
- } else if (isOpen) {
247
- // Currently open: close if dragged past threshold
248
- shouldOpen = deltaX > -drawerWidth * SNAP_THRESHOLD;
249
- } else {
250
- // Currently closed: open if dragged past threshold
251
- shouldOpen = deltaX > drawerWidth * SNAP_THRESHOLD;
252
- }
253
-
254
- if (shouldOpen) {
255
- animateToOpen();
256
- if (!isOpen) stateRef.current.onOpen();
257
- } else {
258
- animateToClosed();
259
- if (isOpen) stateRef.current.onClose();
260
- }
261
-
262
- cleanupAfterAnimation();
263
- }
264
-
265
- function onTouchCancel() {
266
- if (dragging) {
267
- clearDragStyles();
268
- // Restore drawer-side to CSS-driven state
269
- var side = drawerSideRef.current;
270
- if (side) {
271
- side.style.visibility = "";
272
- side.style.pointerEvents = "";
273
- side.style.opacity = "";
274
- }
275
- if (content) {
276
- content.style.transition = "";
277
- content.style.transform = "";
278
- content.style.transformOrigin = "";
279
- }
280
- }
281
- tracking = false;
282
- dragging = false;
283
- direction = null;
284
- }
285
-
286
- document.addEventListener("touchstart", onTouchStart, { passive: true });
287
- document.addEventListener("touchmove", onTouchMove, { passive: true });
288
- document.addEventListener("touchend", onTouchEnd, { passive: true });
289
- document.addEventListener("touchcancel", onTouchCancel, { passive: true });
290
-
291
- return function () {
292
- cancelPendingCleanup();
293
- document.removeEventListener("touchstart", onTouchStart);
294
- document.removeEventListener("touchmove", onTouchMove);
295
- document.removeEventListener("touchend", onTouchEnd);
296
- document.removeEventListener("touchcancel", onTouchCancel);
297
- };
298
- }, [drawerSideRef]);
299
- }
@@ -1,114 +0,0 @@
1
- import { useStore } from "@tanstack/react-store";
2
- import { useEffect } from "react";
3
- import { getThemeStore, toggleMode, setThemeForMode } from "../stores/theme";
4
- import { themes, type ThemeEntry } from "../themes/index";
5
-
6
- function hexToOklch(hex: string): string {
7
- var r = parseInt(hex.slice(0, 2), 16) / 255;
8
- var g = parseInt(hex.slice(2, 4), 16) / 255;
9
- var b = parseInt(hex.slice(4, 6), 16) / 255;
10
-
11
- r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;
12
- g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;
13
- b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;
14
-
15
- var x = 0.4124564 * r + 0.3575761 * g + 0.1804375 * b;
16
- var y = 0.2126729 * r + 0.7151522 * g + 0.0721750 * b;
17
- var z = 0.0193339 * r + 0.1191920 * g + 0.9503041 * b;
18
-
19
- var l_ = 0.8189330101 * x + 0.3618667424 * y - 0.1288597137 * z;
20
- var m_ = 0.0329845436 * x + 0.9293118715 * y + 0.0361456387 * z;
21
- var s_ = 0.0482003018 * x + 0.2643662691 * y + 0.6338517070 * z;
22
-
23
- var l3 = Math.cbrt(l_);
24
- var m3 = Math.cbrt(m_);
25
- var s3 = Math.cbrt(s_);
26
-
27
- var L = 0.2104542553 * l3 + 0.7936177850 * m3 - 0.0040720468 * s3;
28
- var a = 1.9779984951 * l3 - 2.4285922050 * m3 + 0.4505937099 * s3;
29
- var bOk = 0.0259040371 * l3 + 0.7827717662 * m3 - 0.8086757660 * s3;
30
-
31
- var C = Math.sqrt(a * a + bOk * bOk);
32
- var h = Math.atan2(bOk, a) * 180 / Math.PI;
33
- if (h < 0) h += 360;
34
-
35
- return (L * 100).toFixed(1) + "% " + C.toFixed(3) + " " + h.toFixed(0);
36
- }
37
-
38
- function contrastContent(hex: string): string {
39
- var r = parseInt(hex.slice(0, 2), 16);
40
- var g = parseInt(hex.slice(2, 4), 16);
41
- var b = parseInt(hex.slice(4, 6), 16);
42
- var lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
43
- return lum > 0.5 ? "15% 0.01 0" : "98% 0.01 0";
44
- }
45
-
46
- function applyTheme(entry: ThemeEntry): void {
47
- var root = document.documentElement;
48
- var t = entry.theme;
49
-
50
- root.style.setProperty("--base00", "#" + t.base00);
51
- root.style.setProperty("--base01", "#" + t.base01);
52
- root.style.setProperty("--base02", "#" + t.base02);
53
- root.style.setProperty("--base03", "#" + t.base03);
54
- root.style.setProperty("--base04", "#" + t.base04);
55
- root.style.setProperty("--base05", "#" + t.base05);
56
- root.style.setProperty("--base06", "#" + t.base06);
57
- root.style.setProperty("--base07", "#" + t.base07);
58
- root.style.setProperty("--base08", "#" + t.base08);
59
- root.style.setProperty("--base09", "#" + t.base09);
60
- root.style.setProperty("--base0A", "#" + t.base0A);
61
- root.style.setProperty("--base0B", "#" + t.base0B);
62
- root.style.setProperty("--base0C", "#" + t.base0C);
63
- root.style.setProperty("--base0D", "#" + t.base0D);
64
- root.style.setProperty("--base0E", "#" + t.base0E);
65
- root.style.setProperty("--base0F", "#" + t.base0F);
66
-
67
- root.style.setProperty("--color-base-100", "oklch(" + hexToOklch(t.base00) + ")");
68
- root.style.setProperty("--color-base-200", "oklch(" + hexToOklch(t.base01) + ")");
69
- root.style.setProperty("--color-base-300", "oklch(" + hexToOklch(t.base02) + ")");
70
- root.style.setProperty("--color-base-content", "oklch(" + hexToOklch(t.base05) + ")");
71
- root.style.setProperty("--color-primary", "oklch(" + hexToOklch(t.base0D) + ")");
72
- root.style.setProperty("--color-primary-content", "oklch(" + contrastContent(t.base0D) + ")");
73
- root.style.setProperty("--color-secondary", "oklch(" + hexToOklch(t.base0E) + ")");
74
- root.style.setProperty("--color-secondary-content", "oklch(" + contrastContent(t.base0E) + ")");
75
- root.style.setProperty("--color-accent", "oklch(" + hexToOklch(t.base0C) + ")");
76
- root.style.setProperty("--color-accent-content", "oklch(" + contrastContent(t.base0C) + ")");
77
- root.style.setProperty("--color-neutral", "oklch(" + hexToOklch(t.base02) + ")");
78
- root.style.setProperty("--color-neutral-content", "oklch(" + hexToOklch(t.base04) + ")");
79
- root.style.setProperty("--color-info", "oklch(" + hexToOklch(t.base0C) + ")");
80
- root.style.setProperty("--color-info-content", "oklch(" + contrastContent(t.base0C) + ")");
81
- root.style.setProperty("--color-success", "oklch(" + hexToOklch(t.base0B) + ")");
82
- root.style.setProperty("--color-success-content", "oklch(" + contrastContent(t.base0B) + ")");
83
- root.style.setProperty("--color-warning", "oklch(" + hexToOklch(t.base0A) + ")");
84
- root.style.setProperty("--color-warning-content", "oklch(" + contrastContent(t.base0A) + ")");
85
- root.style.setProperty("--color-error", "oklch(" + hexToOklch(t.base08) + ")");
86
- root.style.setProperty("--color-error-content", "oklch(" + contrastContent(t.base08) + ")");
87
-
88
- root.dataset.theme = entry.theme.variant === "dark" ? "lattice-dark" : "lattice-light";
89
- root.style.colorScheme = entry.theme.variant === "dark" ? "dark" : "light";
90
- }
91
-
92
- export function useTheme() {
93
- var store = getThemeStore();
94
- var state = useStore(store, function (s) { return s; });
95
-
96
- var currentThemeId = state.mode === "dark" ? state.darkThemeId : state.lightThemeId;
97
- var currentEntry = themes.find(function (e) { return e.id === currentThemeId; }) ?? themes[0];
98
-
99
- useEffect(function () {
100
- applyTheme(currentEntry);
101
- }, [currentEntry]);
102
-
103
- function setTheme(themeId: string): void {
104
- setThemeForMode(themeId);
105
- }
106
-
107
- return {
108
- mode: state.mode,
109
- currentThemeId,
110
- toggleMode,
111
- setTheme,
112
- themes,
113
- };
114
- }
@@ -1,35 +0,0 @@
1
- import { useState, useEffect } from "react";
2
-
3
- var globalTick = 0;
4
- var listeners = new Set<() => void>();
5
- var interval: ReturnType<typeof setInterval> | null = null;
6
-
7
- function startTicker() {
8
- if (interval) return;
9
- interval = setInterval(function () {
10
- globalTick++;
11
- listeners.forEach(function (cb) { cb(); });
12
- }, 60000);
13
- }
14
-
15
- function stopTicker() {
16
- if (listeners.size > 0) return;
17
- if (interval) {
18
- clearInterval(interval);
19
- interval = null;
20
- }
21
- }
22
-
23
- export function useTimeTick(): number {
24
- var [tick, setTick] = useState(globalTick);
25
- useEffect(function () {
26
- function update() { setTick(globalTick); }
27
- listeners.add(update);
28
- startTicker();
29
- return function () {
30
- listeners.delete(update);
31
- stopTicker();
32
- };
33
- }, []);
34
- return tick;
35
- }
@@ -1,169 +0,0 @@
1
- import { useState, useCallback, useRef } from "react";
2
-
3
- interface SpeechRecognitionResult {
4
- readonly transcript: string;
5
- readonly confidence: number;
6
- readonly isFinal: boolean;
7
- }
8
-
9
- interface SpeechRecognitionResultItem {
10
- readonly length: number;
11
- readonly isFinal: boolean;
12
- item(index: number): SpeechRecognitionResult;
13
- [index: number]: SpeechRecognitionResult;
14
- }
15
-
16
- interface SpeechRecognitionResultList {
17
- readonly length: number;
18
- item(index: number): SpeechRecognitionResultItem;
19
- [index: number]: SpeechRecognitionResultItem;
20
- }
21
-
22
- interface SpeechRecognitionEvent extends Event {
23
- readonly resultIndex: number;
24
- readonly results: SpeechRecognitionResultList;
25
- }
26
-
27
- interface SpeechRecognitionErrorEvent extends Event {
28
- readonly error: string;
29
- readonly message: string;
30
- }
31
-
32
- interface SpeechRecognitionLike extends EventTarget {
33
- continuous: boolean;
34
- interimResults: boolean;
35
- lang: string;
36
- start(): void;
37
- stop(): void;
38
- abort(): void;
39
- onresult: ((event: SpeechRecognitionEvent) => void) | null;
40
- onerror: ((event: SpeechRecognitionErrorEvent) => void) | null;
41
- onend: (() => void) | null;
42
- onspeechstart: (() => void) | null;
43
- onspeechend: (() => void) | null;
44
- }
45
-
46
- export interface UseVoiceRecorderReturn {
47
- isRecording: boolean;
48
- isSupported: boolean;
49
- isSpeaking: boolean;
50
- elapsed: number;
51
- interimTranscript: string;
52
- start: () => void;
53
- stop: () => string;
54
- cancel: () => void;
55
- }
56
-
57
- export function useVoiceRecorder(): UseVoiceRecorderReturn {
58
- var [isRecording, setIsRecording] = useState(false);
59
- var [isSpeaking, setIsSpeaking] = useState(false);
60
- var [elapsed, setElapsed] = useState(0);
61
- var [interimTranscript, setInterimTranscript] = useState("");
62
-
63
- var recognitionRef = useRef<SpeechRecognitionLike | null>(null);
64
- var timerRef = useRef<ReturnType<typeof setInterval> | null>(null);
65
- var finalTranscriptRef = useRef("");
66
- var interimTranscriptRef = useRef("");
67
- var startTimeRef = useRef(0);
68
-
69
- interimTranscriptRef.current = interimTranscript;
70
-
71
- var SpeechRecognitionClass = typeof window !== "undefined"
72
- ? (window as unknown as { SpeechRecognition?: new () => SpeechRecognitionLike; webkitSpeechRecognition?: new () => SpeechRecognitionLike }).SpeechRecognition
73
- || (window as unknown as { webkitSpeechRecognition?: new () => SpeechRecognitionLike }).webkitSpeechRecognition
74
- : undefined;
75
-
76
- var isSupported = !!SpeechRecognitionClass;
77
-
78
- var cleanup = useCallback(function () {
79
- if (timerRef.current) {
80
- clearInterval(timerRef.current);
81
- timerRef.current = null;
82
- }
83
- setIsRecording(false);
84
- setIsSpeaking(false);
85
- setElapsed(0);
86
- setInterimTranscript("");
87
- recognitionRef.current = null;
88
- }, []);
89
-
90
- var start = useCallback(function () {
91
- if (!SpeechRecognitionClass || isRecording) return;
92
-
93
- var recognition = new SpeechRecognitionClass();
94
- recognition.continuous = true;
95
- recognition.interimResults = true;
96
- recognition.lang = navigator.language || "en-US";
97
-
98
- recognitionRef.current = recognition;
99
- finalTranscriptRef.current = "";
100
-
101
- recognition.onresult = function (event: SpeechRecognitionEvent) {
102
- var interim = "";
103
- var final = "";
104
- for (var i = 0; i < event.results.length; i++) {
105
- var result = event.results[i];
106
- if (result.isFinal) {
107
- final += result[0].transcript;
108
- } else {
109
- interim += result[0].transcript;
110
- }
111
- }
112
- finalTranscriptRef.current = final;
113
- setInterimTranscript(final + interim);
114
- };
115
-
116
- recognition.onspeechstart = function () {
117
- setIsSpeaking(true);
118
- };
119
-
120
- recognition.onspeechend = function () {
121
- setIsSpeaking(false);
122
- };
123
-
124
- recognition.onerror = function (event: SpeechRecognitionErrorEvent) {
125
- console.error("[voice] Recognition error:", event.error);
126
- cleanup();
127
- };
128
-
129
- recognition.onend = function () {
130
- cleanup();
131
- };
132
-
133
- recognition.start();
134
- setIsRecording(true);
135
- startTimeRef.current = Date.now();
136
-
137
- timerRef.current = setInterval(function () {
138
- setElapsed(Math.floor((Date.now() - startTimeRef.current) / 1000));
139
- }, 1000);
140
- }, [SpeechRecognitionClass, isRecording, cleanup]);
141
-
142
- var stop = useCallback(function (): string {
143
- if (recognitionRef.current) {
144
- recognitionRef.current.stop();
145
- }
146
- var transcript = finalTranscriptRef.current || interimTranscriptRef.current;
147
- cleanup();
148
- return transcript;
149
- }, [cleanup]);
150
-
151
- var cancel = useCallback(function () {
152
- if (recognitionRef.current) {
153
- recognitionRef.current.abort();
154
- }
155
- finalTranscriptRef.current = "";
156
- cleanup();
157
- }, [cleanup]);
158
-
159
- return {
160
- isRecording,
161
- isSupported,
162
- isSpeaking,
163
- elapsed,
164
- interimTranscript,
165
- start,
166
- stop,
167
- cancel,
168
- };
169
- }
@@ -1,27 +0,0 @@
1
- import { createContext, useContext } from "react";
2
- import type { ClientMessage, ServerMessage } from "#shared";
3
-
4
- export type WebSocketStatus = "connecting" | "connected" | "disconnected";
5
-
6
- export interface WebSocketContextValue {
7
- status: WebSocketStatus;
8
- send: (msg: ClientMessage) => void;
9
- subscribe: (type: string, callback: (msg: ServerMessage) => void) => void;
10
- unsubscribe: (type: string, callback: (msg: ServerMessage) => void) => void;
11
- reconnectNow: () => void;
12
- }
13
-
14
- export var WebSocketContext = createContext<WebSocketContextValue | null>(null);
15
-
16
- export function useWebSocket(): WebSocketContextValue {
17
- var ctx = useContext(WebSocketContext);
18
- if (!ctx) {
19
- throw new Error("useWebSocket must be used within a WebSocketProvider");
20
- }
21
- return ctx;
22
- }
23
-
24
- export function getWebSocketUrl(): string {
25
- var protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
26
- return protocol + "//" + window.location.host + "/ws";
27
- }