@peers-app/peers-ui 0.14.0 → 0.15.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 (438) hide show
  1. package/.github/workflows/publish.yml +8 -5
  2. package/babel.config.js +4 -4
  3. package/biome.json +191 -0
  4. package/dist/command-palette/command-palette-ui.d.ts +1 -2
  5. package/dist/command-palette/command-palette-ui.js +175 -244
  6. package/dist/command-palette/command-palette.js +65 -64
  7. package/dist/components/chat-overlay.d.ts +2 -2
  8. package/dist/components/chat-overlay.js +160 -217
  9. package/dist/components/checkbox.d.ts +5 -4
  10. package/dist/components/checkbox.js +4 -7
  11. package/dist/components/group-switcher.d.ts +1 -2
  12. package/dist/components/group-switcher.js +119 -159
  13. package/dist/components/input-date.d.ts +3 -3
  14. package/dist/components/input-date.js +6 -6
  15. package/dist/components/input-number.d.ts +7 -6
  16. package/dist/components/input-number.js +25 -20
  17. package/dist/components/input.d.ts +5 -4
  18. package/dist/components/input.js +4 -7
  19. package/dist/components/inverse-lazy-list.d.ts +3 -3
  20. package/dist/components/inverse-lazy-list.js +13 -47
  21. package/dist/components/io-schema-values.d.ts +5 -6
  22. package/dist/components/io-schema-values.js +28 -65
  23. package/dist/components/io-schema.d.ts +4 -5
  24. package/dist/components/io-schema.js +42 -79
  25. package/dist/components/lazy-list.d.ts +3 -3
  26. package/dist/components/lazy-list.js +38 -58
  27. package/dist/components/list-screen.d.ts +3 -8
  28. package/dist/components/list-screen.js +28 -23
  29. package/dist/components/loading-indicator.d.ts +1 -2
  30. package/dist/components/loading-indicator.js +2 -6
  31. package/dist/components/markdown-editor/autolink-plugin.js +5 -8
  32. package/dist/components/markdown-editor/editor-inline.d.ts +2 -3
  33. package/dist/components/markdown-editor/editor-inline.js +2 -6
  34. package/dist/components/markdown-editor/editor.d.ts +6 -6
  35. package/dist/components/markdown-editor/editor.js +9 -19
  36. package/dist/components/markdown-editor/markdown-plugin.d.ts +1 -1
  37. package/dist/components/markdown-editor/markdown-plugin.js +20 -21
  38. package/dist/components/markdown-editor/mention-node.d.ts +2 -2
  39. package/dist/components/markdown-editor/mention-node.js +24 -24
  40. package/dist/components/markdown-editor/mentions-plugin.d.ts +2 -2
  41. package/dist/components/markdown-editor/mentions-plugin.js +61 -62
  42. package/dist/components/markdown-editor/theme.js +28 -28
  43. package/dist/components/markdown-editor/toolbar.d.ts +2 -3
  44. package/dist/components/markdown-editor/toolbar.js +32 -49
  45. package/dist/components/markdown-with-mentions.d.ts +1 -1
  46. package/dist/components/markdown-with-mentions.js +43 -43
  47. package/dist/components/message-logs/message-logs.d.ts +1 -2
  48. package/dist/components/message-logs/message-logs.js +91 -116
  49. package/dist/components/messages/avatar.d.ts +3 -4
  50. package/dist/components/messages/avatar.js +37 -46
  51. package/dist/components/messages/channel-message-list.d.ts +5 -6
  52. package/dist/components/messages/channel-message-list.js +34 -34
  53. package/dist/components/messages/channel-view.d.ts +1 -2
  54. package/dist/components/messages/channel-view.js +23 -57
  55. package/dist/components/messages/message-compose.d.ts +3 -4
  56. package/dist/components/messages/message-compose.js +27 -38
  57. package/dist/components/messages/message-display.d.ts +2 -3
  58. package/dist/components/messages/message-display.js +42 -95
  59. package/dist/components/messages/thread-message-list.d.ts +4 -5
  60. package/dist/components/messages/thread-message-list.js +29 -29
  61. package/dist/components/router.d.ts +1 -2
  62. package/dist/components/router.js +58 -66
  63. package/dist/components/save-button.d.ts +3 -3
  64. package/dist/components/save-button.js +23 -33
  65. package/dist/components/sortable-list.d.ts +11 -12
  66. package/dist/components/sortable-list.js +42 -22
  67. package/dist/components/tabs.d.ts +3 -3
  68. package/dist/components/tabs.js +16 -47
  69. package/dist/components/tooltip.d.ts +4 -4
  70. package/dist/components/tooltip.js +4 -9
  71. package/dist/components/trust-level-badge.d.ts +2 -3
  72. package/dist/components/trust-level-badge.js +16 -16
  73. package/dist/components/trust-level-dropdown.d.ts +3 -4
  74. package/dist/components/trust-level-dropdown.js +32 -55
  75. package/dist/components/typeahead.d.ts +3 -3
  76. package/dist/components/typeahead.js +48 -89
  77. package/dist/components/voice-indicator.d.ts +2 -2
  78. package/dist/components/voice-indicator.js +93 -106
  79. package/dist/components/voice-subscribe-events.d.ts +32 -0
  80. package/dist/components/voice-subscribe-events.js +2 -0
  81. package/dist/globals.d.ts +3 -5
  82. package/dist/globals.js +22 -33
  83. package/dist/hooks.d.ts +5 -5
  84. package/dist/hooks.js +22 -12
  85. package/dist/hooks.test.js +129 -145
  86. package/dist/index.d.ts +9 -8
  87. package/dist/index.js +13 -12
  88. package/dist/mention-configs.d.ts +2 -2
  89. package/dist/mention-configs.js +55 -42
  90. package/dist/screens/assistants/assistant-config.d.ts +2 -3
  91. package/dist/screens/assistants/assistant-config.js +9 -22
  92. package/dist/screens/assistants/assistant-details.d.ts +1 -2
  93. package/dist/screens/assistants/assistant-details.js +13 -28
  94. package/dist/screens/assistants/assistant-info.d.ts +2 -3
  95. package/dist/screens/assistants/assistant-info.js +3 -17
  96. package/dist/screens/assistants/assistant-list.d.ts +1 -2
  97. package/dist/screens/assistants/assistant-list.js +15 -56
  98. package/dist/screens/assistants/assistant-tools.d.ts +2 -3
  99. package/dist/screens/assistants/assistant-tools.js +10 -24
  100. package/dist/screens/console-logs/console-logs-list.d.ts +1 -2
  101. package/dist/screens/console-logs/console-logs-list.js +130 -134
  102. package/dist/screens/console-logs/log-display.d.ts +2 -3
  103. package/dist/screens/console-logs/log-display.js +40 -42
  104. package/dist/screens/console-logs/log-filters.d.ts +1 -2
  105. package/dist/screens/console-logs/log-filters.js +2 -24
  106. package/dist/screens/console-logs/mobile-log-card.d.ts +2 -3
  107. package/dist/screens/console-logs/mobile-log-card.js +64 -67
  108. package/dist/screens/console-logs/resizable-table-header.d.ts +1 -2
  109. package/dist/screens/console-logs/resizable-table-header.js +31 -67
  110. package/dist/screens/contacts/contact-details.d.ts +1 -2
  111. package/dist/screens/contacts/contact-details.js +16 -46
  112. package/dist/screens/contacts/contact-list.d.ts +1 -2
  113. package/dist/screens/contacts/contact-list.js +44 -103
  114. package/dist/screens/contacts/index.d.ts +4 -4
  115. package/dist/screens/contacts/index.js +1 -1
  116. package/dist/screens/contacts/user-connect.d.ts +1 -2
  117. package/dist/screens/contacts/user-connect.js +85 -186
  118. package/dist/screens/data-explorer/data-explorer.d.ts +1 -2
  119. package/dist/screens/data-explorer/data-explorer.js +61 -181
  120. package/dist/screens/data-explorer/index.d.ts +2 -2
  121. package/dist/screens/data-explorer/query-executor.d.ts +1 -2
  122. package/dist/screens/data-explorer/query-executor.js +56 -166
  123. package/dist/screens/groups/group-details.d.ts +1 -2
  124. package/dist/screens/groups/group-details.js +27 -122
  125. package/dist/screens/groups/group-invite-listener.d.ts +2 -3
  126. package/dist/screens/groups/group-invite-listener.js +8 -104
  127. package/dist/screens/groups/group-list.d.ts +1 -2
  128. package/dist/screens/groups/group-list.js +56 -133
  129. package/dist/screens/groups/group-members.d.ts +2 -3
  130. package/dist/screens/groups/group-members.js +62 -132
  131. package/dist/screens/groups/index.d.ts +4 -4
  132. package/dist/screens/groups/index.js +1 -1
  133. package/dist/screens/join-group/index.d.ts +2 -2
  134. package/dist/screens/join-group/join-group.d.ts +1 -2
  135. package/dist/screens/join-group/join-group.js +9 -109
  136. package/dist/screens/network-viewer/connection-troubleshooter.d.ts +2 -3
  137. package/dist/screens/network-viewer/connection-troubleshooter.js +89 -193
  138. package/dist/screens/network-viewer/cpu-usage-graph.d.ts +1 -2
  139. package/dist/screens/network-viewer/cpu-usage-graph.js +60 -99
  140. package/dist/screens/network-viewer/device-details-modal.d.ts +1 -2
  141. package/dist/screens/network-viewer/device-details-modal.js +25 -177
  142. package/dist/screens/network-viewer/group-details-modal.d.ts +1 -2
  143. package/dist/screens/network-viewer/group-details-modal.js +31 -142
  144. package/dist/screens/network-viewer/index.d.ts +4 -4
  145. package/dist/screens/network-viewer/index.js +3 -3
  146. package/dist/screens/network-viewer/network-viewer-ipc.d.ts +22 -0
  147. package/dist/screens/network-viewer/network-viewer-ipc.js +6 -0
  148. package/dist/screens/network-viewer/network-viewer.d.ts +1 -2
  149. package/dist/screens/network-viewer/network-viewer.js +91 -296
  150. package/dist/screens/network-viewer/usage-graph.d.ts +1 -2
  151. package/dist/screens/network-viewer/usage-graph.js +78 -110
  152. package/dist/screens/packages/package-details.d.ts +1 -2
  153. package/dist/screens/packages/package-details.js +35 -41
  154. package/dist/screens/packages/package-info.d.ts +2 -2
  155. package/dist/screens/packages/package-info.js +33 -86
  156. package/dist/screens/packages/package-list.d.ts +1 -2
  157. package/dist/screens/packages/package-list.js +42 -106
  158. package/dist/screens/packages/package-new-local.d.ts +1 -2
  159. package/dist/screens/packages/package-new-local.js +13 -19
  160. package/dist/screens/packages/package-versions.d.ts +2 -3
  161. package/dist/screens/packages/package-versions.js +29 -96
  162. package/dist/screens/peer-types/peer-type-details.d.ts +3 -4
  163. package/dist/screens/peer-types/peer-type-details.js +26 -78
  164. package/dist/screens/peer-types/peer-type-list.d.ts +1 -2
  165. package/dist/screens/peer-types/peer-type-list.js +13 -24
  166. package/dist/screens/search/global-search.d.ts +1 -2
  167. package/dist/screens/search/global-search.js +104 -182
  168. package/dist/screens/settings/color-mode-dropdown.d.ts +3 -4
  169. package/dist/screens/settings/color-mode-dropdown.js +18 -37
  170. package/dist/screens/settings/settings-page.d.ts +1 -1
  171. package/dist/screens/settings/settings-page.js +86 -213
  172. package/dist/screens/settings/voice-settings-agent.d.ts +1 -1
  173. package/dist/screens/settings/voice-settings-agent.js +7 -44
  174. package/dist/screens/settings/voice-settings-api-keys.d.ts +2 -2
  175. package/dist/screens/settings/voice-settings-api-keys.js +2 -29
  176. package/dist/screens/settings/voice-settings-output.d.ts +2 -2
  177. package/dist/screens/settings/voice-settings-output.js +2 -40
  178. package/dist/screens/settings/voice-settings-providers.d.ts +2 -2
  179. package/dist/screens/settings/voice-settings-providers.js +2 -19
  180. package/dist/screens/settings/voice-settings-types.d.ts +4 -4
  181. package/dist/screens/settings/voice-settings-types.js +31 -31
  182. package/dist/screens/settings/voice-settings-wake-word.d.ts +2 -2
  183. package/dist/screens/settings/voice-settings-wake-word.js +2 -33
  184. package/dist/screens/settings/voice-settings.d.ts +1 -1
  185. package/dist/screens/settings/voice-settings.js +35 -112
  186. package/dist/screens/setup-user.d.ts +1 -2
  187. package/dist/screens/setup-user.js +38 -116
  188. package/dist/screens/tools/tool-code.d.ts +2 -3
  189. package/dist/screens/tools/tool-code.js +9 -13
  190. package/dist/screens/tools/tool-details.d.ts +1 -2
  191. package/dist/screens/tools/tool-details.js +26 -39
  192. package/dist/screens/tools/tool-info.d.ts +2 -3
  193. package/dist/screens/tools/tool-info.js +9 -48
  194. package/dist/screens/tools/tool-list.d.ts +1 -2
  195. package/dist/screens/tools/tool-list.js +33 -65
  196. package/dist/screens/tools/tool-schema.d.ts +2 -3
  197. package/dist/screens/tools/tool-schema.js +2 -13
  198. package/dist/screens/tools/tool-test-details.d.ts +1 -2
  199. package/dist/screens/tools/tool-test-details.js +12 -28
  200. package/dist/screens/tools/tool-test-list.d.ts +1 -2
  201. package/dist/screens/tools/tool-test-list.js +17 -56
  202. package/dist/screens/variables/variable-details.d.ts +1 -2
  203. package/dist/screens/variables/variable-details.js +19 -86
  204. package/dist/screens/variables/variable-list.d.ts +1 -2
  205. package/dist/screens/variables/variable-list.js +16 -27
  206. package/dist/screens/welcome-modal.d.ts +1 -2
  207. package/dist/screens/welcome-modal.js +44 -111
  208. package/dist/screens/workflows/workflow-details.d.ts +1 -2
  209. package/dist/screens/workflows/workflow-details.js +17 -31
  210. package/dist/screens/workflows/workflow-info.d.ts +2 -3
  211. package/dist/screens/workflows/workflow-info.js +2 -9
  212. package/dist/screens/workflows/workflow-instructions.d.ts +2 -3
  213. package/dist/screens/workflows/workflow-instructions.js +23 -55
  214. package/dist/screens/workflows/workflow-list.d.ts +1 -2
  215. package/dist/screens/workflows/workflow-list.js +23 -62
  216. package/dist/setupTests.d.ts +1 -1
  217. package/dist/setupTests.js +10 -11
  218. package/dist/system-apps/assistants.app.d.ts +1 -1
  219. package/dist/system-apps/assistants.app.js +3 -3
  220. package/dist/system-apps/console-logs.app.d.ts +1 -1
  221. package/dist/system-apps/console-logs.app.js +3 -3
  222. package/dist/system-apps/contacts.app.d.ts +1 -1
  223. package/dist/system-apps/contacts.app.js +4 -4
  224. package/dist/system-apps/data-explorer.app.d.ts +1 -1
  225. package/dist/system-apps/data-explorer.app.js +4 -4
  226. package/dist/system-apps/groups.app.d.ts +1 -1
  227. package/dist/system-apps/groups.app.js +4 -4
  228. package/dist/system-apps/index.d.ts +17 -17
  229. package/dist/system-apps/index.js +52 -52
  230. package/dist/system-apps/join-group.app.d.ts +1 -1
  231. package/dist/system-apps/join-group.app.js +4 -4
  232. package/dist/system-apps/mobile-settings.app.d.ts +1 -1
  233. package/dist/system-apps/mobile-settings.app.js +3 -3
  234. package/dist/system-apps/network-viewer.app.d.ts +1 -1
  235. package/dist/system-apps/network-viewer.app.js +4 -4
  236. package/dist/system-apps/packages.app.d.ts +1 -1
  237. package/dist/system-apps/packages.app.js +3 -3
  238. package/dist/system-apps/search.app.d.ts +1 -1
  239. package/dist/system-apps/search.app.js +4 -4
  240. package/dist/system-apps/settings.app.d.ts +1 -1
  241. package/dist/system-apps/settings.app.js +3 -3
  242. package/dist/system-apps/threads.app.d.ts +1 -1
  243. package/dist/system-apps/threads.app.js +3 -3
  244. package/dist/system-apps/tools.app.d.ts +1 -1
  245. package/dist/system-apps/tools.app.js +3 -3
  246. package/dist/system-apps/types.app.d.ts +1 -1
  247. package/dist/system-apps/types.app.js +3 -3
  248. package/dist/system-apps/variables.app.d.ts +1 -1
  249. package/dist/system-apps/variables.app.js +3 -3
  250. package/dist/system-apps/workflows.app.d.ts +1 -1
  251. package/dist/system-apps/workflows.app.js +3 -3
  252. package/dist/tabs-layout/tabs-layout.d.ts +2 -3
  253. package/dist/tabs-layout/tabs-layout.js +215 -246
  254. package/dist/tabs-layout/tabs-state.d.ts +2 -2
  255. package/dist/tabs-layout/tabs-state.js +73 -61
  256. package/dist/ui-defaults/index.d.ts +2 -2
  257. package/dist/ui-defaults/list-screen.d.ts +2 -3
  258. package/dist/ui-defaults/list-screen.js +33 -37
  259. package/dist/ui-defaults/markdown-field.js +24 -56
  260. package/dist/ui-router/routes-loader.d.ts +1 -1
  261. package/dist/ui-router/routes-loader.js +17 -13
  262. package/dist/ui-router/ui-loader.d.ts +6 -6
  263. package/dist/ui-router/ui-loader.js +172 -268
  264. package/dist/utils.js +49 -39
  265. package/jest.config.js +16 -16
  266. package/package.json +16 -14
  267. package/src/command-palette/command-palette-ui.tsx +261 -237
  268. package/src/command-palette/command-palette.ts +81 -78
  269. package/src/components/chat-overlay.tsx +366 -261
  270. package/src/components/checkbox.tsx +15 -12
  271. package/src/components/group-switcher.tsx +150 -105
  272. package/src/components/input-date.tsx +17 -16
  273. package/src/components/input-number.tsx +47 -31
  274. package/src/components/input.tsx +15 -12
  275. package/src/components/inverse-lazy-list.tsx +14 -13
  276. package/src/components/io-schema-values.tsx +51 -69
  277. package/src/components/io-schema.tsx +94 -69
  278. package/src/components/lazy-list.tsx +51 -34
  279. package/src/components/list-screen.tsx +51 -35
  280. package/src/components/loading-indicator.tsx +2 -4
  281. package/src/components/markdown-editor/autolink-plugin.tsx +4 -11
  282. package/src/components/markdown-editor/editor-inline.tsx +3 -4
  283. package/src/components/markdown-editor/editor.tsx +53 -51
  284. package/src/components/markdown-editor/markdown-plugin.tsx +48 -40
  285. package/src/components/markdown-editor/mention-node.ts +39 -38
  286. package/src/components/markdown-editor/mentions-plugin.tsx +99 -101
  287. package/src/components/markdown-editor/theme.ts +28 -29
  288. package/src/components/markdown-editor/toolbar.tsx +53 -47
  289. package/src/components/markdown-with-mentions.tsx +56 -46
  290. package/src/components/message-logs/message-logs.tsx +225 -165
  291. package/src/components/messages/avatar.tsx +70 -52
  292. package/src/components/messages/channel-message-list.tsx +80 -68
  293. package/src/components/messages/channel-view.tsx +34 -33
  294. package/src/components/messages/message-compose.tsx +84 -67
  295. package/src/components/messages/message-display.tsx +103 -89
  296. package/src/components/messages/thread-message-list.tsx +53 -44
  297. package/src/components/router.tsx +42 -43
  298. package/src/components/save-button.tsx +43 -39
  299. package/src/components/sortable-list.tsx +77 -49
  300. package/src/components/tabs.tsx +31 -31
  301. package/src/components/tooltip.tsx +21 -28
  302. package/src/components/trust-level-badge.tsx +15 -11
  303. package/src/components/trust-level-dropdown.tsx +49 -19
  304. package/src/components/typeahead.tsx +57 -59
  305. package/src/components/voice-indicator.tsx +158 -141
  306. package/src/components/voice-subscribe-events.ts +20 -0
  307. package/src/globals.tsx +42 -40
  308. package/src/hooks.test.tsx +141 -134
  309. package/src/hooks.ts +80 -48
  310. package/src/index.tsx +17 -10
  311. package/src/mention-configs.ts +122 -68
  312. package/src/screens/assistants/assistant-config.tsx +28 -18
  313. package/src/screens/assistants/assistant-details.tsx +35 -36
  314. package/src/screens/assistants/assistant-info.tsx +16 -11
  315. package/src/screens/assistants/assistant-list.tsx +37 -34
  316. package/src/screens/assistants/assistant-tools.tsx +41 -20
  317. package/src/screens/console-logs/console-logs-list.tsx +173 -140
  318. package/src/screens/console-logs/log-display.tsx +65 -38
  319. package/src/screens/console-logs/log-filters.tsx +4 -3
  320. package/src/screens/console-logs/mobile-log-card.tsx +78 -71
  321. package/src/screens/console-logs/resizable-table-header.tsx +29 -21
  322. package/src/screens/contacts/contact-details.tsx +29 -30
  323. package/src/screens/contacts/contact-list.tsx +71 -60
  324. package/src/screens/contacts/index.ts +5 -5
  325. package/src/screens/contacts/user-connect.tsx +177 -171
  326. package/src/screens/data-explorer/data-explorer.tsx +134 -98
  327. package/src/screens/data-explorer/index.ts +2 -3
  328. package/src/screens/data-explorer/query-executor.tsx +90 -80
  329. package/src/screens/groups/group-details.tsx +120 -101
  330. package/src/screens/groups/group-invite-listener.tsx +34 -37
  331. package/src/screens/groups/group-list.tsx +119 -103
  332. package/src/screens/groups/group-members.tsx +225 -164
  333. package/src/screens/groups/index.ts +5 -6
  334. package/src/screens/join-group/index.ts +2 -2
  335. package/src/screens/join-group/join-group.tsx +41 -39
  336. package/src/screens/network-viewer/connection-troubleshooter.tsx +145 -104
  337. package/src/screens/network-viewer/cpu-usage-graph.tsx +39 -43
  338. package/src/screens/network-viewer/device-details-modal.tsx +46 -59
  339. package/src/screens/network-viewer/group-details-modal.tsx +68 -49
  340. package/src/screens/network-viewer/index.ts +4 -5
  341. package/src/screens/network-viewer/network-viewer-ipc.ts +23 -0
  342. package/src/screens/network-viewer/network-viewer.tsx +261 -236
  343. package/src/screens/network-viewer/usage-graph.tsx +57 -49
  344. package/src/screens/packages/package-details.tsx +43 -35
  345. package/src/screens/packages/package-info.tsx +107 -66
  346. package/src/screens/packages/package-list.tsx +175 -98
  347. package/src/screens/packages/package-new-local.tsx +28 -26
  348. package/src/screens/packages/package-versions.tsx +102 -77
  349. package/src/screens/peer-types/peer-type-details.tsx +60 -50
  350. package/src/screens/peer-types/peer-type-list.tsx +20 -30
  351. package/src/screens/search/global-search.tsx +153 -137
  352. package/src/screens/settings/color-mode-dropdown.tsx +52 -35
  353. package/src/screens/settings/settings-page.tsx +215 -141
  354. package/src/screens/settings/voice-settings-agent.tsx +13 -12
  355. package/src/screens/settings/voice-settings-api-keys.tsx +14 -12
  356. package/src/screens/settings/voice-settings-output.tsx +12 -11
  357. package/src/screens/settings/voice-settings-providers.tsx +7 -3
  358. package/src/screens/settings/voice-settings-types.ts +52 -49
  359. package/src/screens/settings/voice-settings-wake-word.tsx +25 -9
  360. package/src/screens/settings/voice-settings.tsx +66 -43
  361. package/src/screens/setup-user.tsx +88 -41
  362. package/src/screens/tools/tool-code.tsx +12 -17
  363. package/src/screens/tools/tool-details.tsx +28 -28
  364. package/src/screens/tools/tool-info.tsx +14 -19
  365. package/src/screens/tools/tool-list.tsx +58 -40
  366. package/src/screens/tools/tool-schema.tsx +16 -9
  367. package/src/screens/tools/tool-test-details.tsx +11 -22
  368. package/src/screens/tools/tool-test-list.tsx +29 -30
  369. package/src/screens/variables/variable-details.tsx +63 -51
  370. package/src/screens/variables/variable-list.tsx +29 -30
  371. package/src/screens/welcome-modal.tsx +68 -48
  372. package/src/screens/workflows/workflow-details.tsx +40 -30
  373. package/src/screens/workflows/workflow-info.tsx +4 -11
  374. package/src/screens/workflows/workflow-instructions.tsx +35 -28
  375. package/src/screens/workflows/workflow-list.tsx +50 -40
  376. package/src/setupTests.ts +14 -13
  377. package/src/system-apps/assistants.app.ts +5 -5
  378. package/src/system-apps/console-logs.app.ts +4 -4
  379. package/src/system-apps/contacts.app.ts +6 -6
  380. package/src/system-apps/data-explorer.app.ts +5 -5
  381. package/src/system-apps/groups.app.ts +6 -6
  382. package/src/system-apps/index.ts +49 -49
  383. package/src/system-apps/join-group.app.ts +5 -5
  384. package/src/system-apps/mobile-settings.app.ts +4 -5
  385. package/src/system-apps/network-viewer.app.ts +5 -5
  386. package/src/system-apps/packages.app.ts +5 -5
  387. package/src/system-apps/search.app.ts +6 -6
  388. package/src/system-apps/settings.app.ts +5 -5
  389. package/src/system-apps/threads.app.ts +5 -5
  390. package/src/system-apps/tools.app.ts +5 -5
  391. package/src/system-apps/types.app.ts +5 -5
  392. package/src/system-apps/variables.app.ts +5 -5
  393. package/src/system-apps/workflows.app.ts +5 -5
  394. package/src/tabs-layout/tabs-layout.tsx +345 -254
  395. package/src/tabs-layout/tabs-state.ts +100 -81
  396. package/src/ui-defaults/index.ts +2 -3
  397. package/src/ui-defaults/list-screen.tsx +45 -40
  398. package/src/ui-defaults/markdown-field.tsx +22 -26
  399. package/src/ui-router/routes-loader.ts +40 -24
  400. package/src/ui-router/ui-loader.tsx +312 -214
  401. package/src/utils.ts +68 -81
  402. package/tsconfig.json +5 -10
  403. package/dist/components/input-datetime.d.ts +0 -7
  404. package/dist/components/input-datetime.js +0 -35
  405. package/dist/components/lazy-sortable-list.d.ts +0 -29
  406. package/dist/components/lazy-sortable-list.js +0 -12
  407. package/dist/components/left-bar.d.ts +0 -5
  408. package/dist/components/left-bar.js +0 -207
  409. package/dist/components/main-content-container.d.ts +0 -2
  410. package/dist/components/main-content-container.js +0 -92
  411. package/dist/components/messages/thread-view.d.ts +0 -6
  412. package/dist/components/messages/thread-view.js +0 -174
  413. package/dist/components/off-canvas.d.ts +0 -13
  414. package/dist/components/off-canvas.js +0 -89
  415. package/dist/components/text-list-editor.tsx/text-list-editor.d.ts +0 -6
  416. package/dist/components/text-list-editor.tsx/text-list-editor.js +0 -13
  417. package/dist/components/top-bar.d.ts +0 -2
  418. package/dist/components/top-bar.js +0 -51
  419. package/dist/components/typeahead/mentions-plugin.d.ts +0 -7
  420. package/dist/components/typeahead/mentions-plugin.js +0 -203
  421. package/dist/components/typeahead/typeahead-editor.d.ts +0 -15
  422. package/dist/components/typeahead/typeahead-editor.js +0 -134
  423. package/dist/components/typeahead/typeahead.d.ts +0 -12
  424. package/dist/components/typeahead/typeahead.js +0 -94
  425. package/dist/screens/profile.d.ts +0 -2
  426. package/dist/screens/profile.js +0 -76
  427. package/src/components/input-datetime.tsx +0 -41
  428. package/src/components/lazy-sortable-list.tsx +0 -51
  429. package/src/components/left-bar.tsx +0 -322
  430. package/src/components/main-content-container.tsx +0 -79
  431. package/src/components/messages/thread-view.tsx +0 -214
  432. package/src/components/off-canvas.tsx +0 -83
  433. package/src/components/text-list-editor.tsx/text-list-editor.tsx +0 -13
  434. package/src/components/top-bar.tsx +0 -119
  435. package/src/components/typeahead/mentions-plugin.tsx +0 -265
  436. package/src/components/typeahead/typeahead-editor.tsx +0 -140
  437. package/src/components/typeahead/typeahead.tsx +0 -77
  438. package/src/screens/profile.tsx +0 -75
@@ -1,101 +1,118 @@
1
1
  /**
2
2
  * Voice Indicator Component
3
- *
3
+ *
4
4
  * Floating UI element showing voice input state.
5
5
  * Supports manual recording trigger via click.
6
6
  */
7
7
 
8
- import React, { useState, useEffect, useCallback } from 'react';
9
- import { rpcServerCalls, subscribe } from '@peers-app/peers-sdk';
8
+ import { rpcServerCalls, subscribe } from "@peers-app/peers-sdk";
9
+ import React, { useCallback, useEffect, useState } from "react";
10
+ import type {
11
+ VoiceErrorPayload,
12
+ VoicePlayAudioPayload,
13
+ VoiceSpeakPayload,
14
+ VoiceStatePayload,
15
+ VoiceSubscribeEvent,
16
+ VoiceTranscriptionPayload,
17
+ VoiceVolumePayload,
18
+ } from "./voice-subscribe-events";
10
19
 
11
- type VoiceState = 'disabled' | 'idle' | 'listening' | 'recording' | 'processing' | 'speaking';
20
+ type VoiceState = "disabled" | "idle" | "listening" | "recording" | "processing" | "speaking";
12
21
 
13
22
  interface VoiceIndicatorProps {
14
23
  /** Position of the indicator */
15
- position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
24
+ position?: "bottom-right" | "bottom-left" | "top-right" | "top-left";
16
25
  /** Show expanded view with transcription */
17
26
  showTranscription?: boolean;
18
27
  }
19
28
 
20
29
  export const VoiceIndicator: React.FC<VoiceIndicatorProps> = ({
21
- position = 'bottom-right',
30
+ position = "bottom-right",
22
31
  showTranscription = true,
23
32
  }) => {
24
- const [state, setState] = useState<VoiceState>('disabled');
25
- const [transcription, setTranscription] = useState<string>('');
33
+ const [state, setState] = useState<VoiceState>("disabled");
34
+ const [transcription, setTranscription] = useState<string>("");
26
35
  const [volumeLevel, setVolumeLevel] = useState<number>(0);
27
36
  const [error, setError] = useState<string | null>(null);
28
37
  const [isExpanded, setIsExpanded] = useState(false);
29
-
38
+
30
39
  // Track current audio element for cloud TTS so we can stop it
31
40
  const currentAudioRef = React.useRef<HTMLAudioElement | null>(null);
32
41
 
33
42
  // Subscribe to voice events
34
43
  useEffect(() => {
35
44
  const subscriptions = [
36
- subscribe('voice:stateChanged', (event: any) => {
37
- setState(event.data.state);
38
- if (event.data.state === 'idle') {
39
- setTranscription('');
45
+ subscribe("voice:stateChanged", (event: VoiceSubscribeEvent<VoiceStatePayload>) => {
46
+ setState(event.data.state as VoiceState);
47
+ if (event.data.state === "idle") {
48
+ setTranscription("");
40
49
  setError(null);
41
50
  }
42
- if (event.data.state === 'recording') {
51
+ if (event.data.state === "recording") {
43
52
  setIsExpanded(true);
44
53
  }
45
54
  }),
46
- subscribe('voice:transcription', (event: any) => {
55
+ subscribe("voice:transcription", (event: VoiceSubscribeEvent<VoiceTranscriptionPayload>) => {
47
56
  setTranscription(event.data.text);
48
57
  }),
49
- subscribe('voice:volumeLevel', (event: any) => {
58
+ subscribe("voice:volumeLevel", (event: VoiceSubscribeEvent<VoiceVolumePayload>) => {
50
59
  setVolumeLevel(event.data.level);
51
60
  }),
52
- subscribe('voice:error', (event: any) => {
61
+ subscribe("voice:error", (event: VoiceSubscribeEvent<VoiceErrorPayload>) => {
53
62
  setError(event.data.message);
54
63
  }),
55
64
  ];
56
65
 
57
66
  // Load initial state
58
- rpcServerCalls.voiceGetState().then(({ state }) => {
59
- setState(state);
60
- }).catch(() => {
61
- // Voice service may not be initialized yet
62
- });
67
+ rpcServerCalls
68
+ .voiceGetState()
69
+ .then(({ state }) => {
70
+ setState(state);
71
+ })
72
+ .catch(() => {
73
+ // Voice service may not be initialized yet
74
+ });
63
75
 
64
76
  return () => {
65
- subscriptions.forEach(sub => sub.unsubscribe());
77
+ for (const sub of subscriptions) {
78
+ sub.unsubscribe();
79
+ }
66
80
  };
67
81
  }, []);
68
82
 
69
83
  // Handle browser TTS events
70
84
  useEffect(() => {
71
- const speakHandler = subscribe('voice:speakText', (event: any) => {
72
- const { text, voice, rate } = event.data;
73
- if ('speechSynthesis' in window) {
74
- const utterance = new SpeechSynthesisUtterance(text);
75
- if (voice) {
76
- const voices = speechSynthesis.getVoices();
77
- const selectedVoice = voices.find(v => v.name === voice);
78
- if (selectedVoice) utterance.voice = selectedVoice;
79
- }
80
- if (rate) utterance.rate = rate;
81
- // Notify server when speech ends
82
- utterance.onend = () => {
83
- rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => {});
84
- };
85
- utterance.onerror = () => {
86
- // Still notify on error so we don't hang
85
+ const speakHandler = subscribe(
86
+ "voice:speakText",
87
+ (event: VoiceSubscribeEvent<VoiceSpeakPayload>) => {
88
+ const { text, voice, rate } = event.data;
89
+ if ("speechSynthesis" in window) {
90
+ const utterance = new SpeechSynthesisUtterance(text);
91
+ if (voice) {
92
+ const voices = speechSynthesis.getVoices();
93
+ const selectedVoice = voices.find((v) => v.name === voice);
94
+ if (selectedVoice) utterance.voice = selectedVoice;
95
+ }
96
+ if (rate) utterance.rate = rate;
97
+ // Notify server when speech ends
98
+ utterance.onend = () => {
99
+ rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => {});
100
+ };
101
+ utterance.onerror = () => {
102
+ // Still notify on error so we don't hang
103
+ rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => {});
104
+ };
105
+ speechSynthesis.speak(utterance);
106
+ } else {
107
+ // No speech synthesis available, notify immediately
87
108
  rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => {});
88
- };
89
- speechSynthesis.speak(utterance);
90
- } else {
91
- // No speech synthesis available, notify immediately
92
- rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => {});
93
- }
94
- });
109
+ }
110
+ },
111
+ );
95
112
 
96
- const stopHandler = subscribe('voice:stopSpeaking', () => {
113
+ const stopHandler = subscribe("voice:stopSpeaking", () => {
97
114
  // Stop browser TTS
98
- if ('speechSynthesis' in window) {
115
+ if ("speechSynthesis" in window) {
99
116
  speechSynthesis.cancel();
100
117
  }
101
118
  // Stop cloud TTS audio if playing
@@ -105,31 +122,34 @@ export const VoiceIndicator: React.FC<VoiceIndicatorProps> = ({
105
122
  }
106
123
  });
107
124
 
108
- const playHandler = subscribe('voice:playAudio', async (event: any) => {
109
- const { audioBase64, mimeType } = event.data;
110
- try {
111
- const audioData = Uint8Array.from(atob(audioBase64), c => c.charCodeAt(0));
112
- const blob = new Blob([audioData], { type: mimeType });
113
- const url = URL.createObjectURL(blob);
114
- const audio = new Audio(url);
115
-
116
- // Track audio element so we can stop it
117
- currentAudioRef.current = audio;
118
-
119
- audio.onended = () => {
120
- URL.revokeObjectURL(url);
125
+ const playHandler = subscribe(
126
+ "voice:playAudio",
127
+ async (event: VoiceSubscribeEvent<VoicePlayAudioPayload>) => {
128
+ const { audioBase64, mimeType } = event.data;
129
+ try {
130
+ const audioData = Uint8Array.from(atob(audioBase64), (c) => c.charCodeAt(0));
131
+ const blob = new Blob([audioData], { type: mimeType });
132
+ const url = URL.createObjectURL(blob);
133
+ const audio = new Audio(url);
134
+
135
+ // Track audio element so we can stop it
136
+ currentAudioRef.current = audio;
137
+
138
+ audio.onended = () => {
139
+ URL.revokeObjectURL(url);
140
+ currentAudioRef.current = null;
141
+ // Notify server that audio playback has completed
142
+ rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => {});
143
+ };
144
+ await audio.play();
145
+ } catch (e) {
146
+ console.error("Failed to play audio:", e);
121
147
  currentAudioRef.current = null;
122
- // Notify server that audio playback has completed
148
+ // Still notify on error so we don't hang
123
149
  rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => {});
124
- };
125
- await audio.play();
126
- } catch (e) {
127
- console.error('Failed to play audio:', e);
128
- currentAudioRef.current = null;
129
- // Still notify on error so we don't hang
130
- rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => {});
131
- }
132
- });
150
+ }
151
+ },
152
+ );
133
153
 
134
154
  return () => {
135
155
  speakHandler.unsubscribe();
@@ -140,76 +160,76 @@ export const VoiceIndicator: React.FC<VoiceIndicatorProps> = ({
140
160
 
141
161
  const handleClick = useCallback(async () => {
142
162
  try {
143
- if (state === 'disabled') {
163
+ if (state === "disabled") {
144
164
  // Open settings
145
- window.location.hash = '#/settings/voice';
165
+ window.location.hash = "#/settings/voice";
146
166
  return;
147
167
  }
148
168
 
149
- if (state === 'recording') {
169
+ if (state === "recording") {
150
170
  await rpcServerCalls.voiceStopRecording();
151
- } else if (state === 'speaking') {
171
+ } else if (state === "speaking") {
152
172
  await rpcServerCalls.voiceStopPlayback();
153
- } else if (state === 'idle' || state === 'listening') {
173
+ } else if (state === "idle" || state === "listening") {
154
174
  await rpcServerCalls.voiceStartRecording();
155
175
  }
156
176
  } catch (e) {
157
- console.error('Voice action failed:', e);
177
+ console.error("Voice action failed:", e);
158
178
  }
159
179
  }, [state]);
160
180
 
161
181
  const getIcon = (): string => {
162
182
  switch (state) {
163
- case 'disabled':
164
- return 'bi-mic-mute';
165
- case 'idle':
166
- return 'bi-mic';
167
- case 'listening':
168
- return 'bi-ear';
169
- case 'recording':
170
- return 'bi-mic-fill';
171
- case 'processing':
172
- return 'bi-hourglass-split';
173
- case 'speaking':
174
- return 'bi-volume-up-fill';
183
+ case "disabled":
184
+ return "bi-mic-mute";
185
+ case "idle":
186
+ return "bi-mic";
187
+ case "listening":
188
+ return "bi-ear";
189
+ case "recording":
190
+ return "bi-mic-fill";
191
+ case "processing":
192
+ return "bi-hourglass-split";
193
+ case "speaking":
194
+ return "bi-volume-up-fill";
175
195
  default:
176
- return 'bi-mic';
196
+ return "bi-mic";
177
197
  }
178
198
  };
179
199
 
180
200
  const getStateText = (): string => {
181
201
  switch (state) {
182
- case 'disabled':
183
- return 'Voice disabled';
184
- case 'idle':
202
+ case "disabled":
203
+ return "Voice disabled";
204
+ case "idle":
185
205
  return 'Say "Porcupine" or click';
186
- case 'listening':
187
- return 'Listening...';
188
- case 'recording':
189
- return 'Recording...';
190
- case 'processing':
191
- return 'Processing...';
192
- case 'speaking':
193
- return 'Speaking... (click to stop)';
206
+ case "listening":
207
+ return "Listening...";
208
+ case "recording":
209
+ return "Recording...";
210
+ case "processing":
211
+ return "Processing...";
212
+ case "speaking":
213
+ return "Speaking... (click to stop)";
194
214
  default:
195
- return '';
215
+ return "";
196
216
  }
197
217
  };
198
218
 
199
219
  const getButtonClass = (): string => {
200
- const base = 'btn rounded-circle shadow';
220
+ const base = "btn rounded-circle shadow";
201
221
  switch (state) {
202
- case 'disabled':
222
+ case "disabled":
203
223
  return `${base} btn-secondary`;
204
- case 'idle':
224
+ case "idle":
205
225
  return `${base} btn-outline-primary`;
206
- case 'listening':
226
+ case "listening":
207
227
  return `${base} btn-info`;
208
- case 'recording':
228
+ case "recording":
209
229
  return `${base} btn-danger`;
210
- case 'processing':
230
+ case "processing":
211
231
  return `${base} btn-warning`;
212
- case 'speaking':
232
+ case "speaking":
213
233
  return `${base} btn-success`;
214
234
  default:
215
235
  return `${base} btn-secondary`;
@@ -217,42 +237,39 @@ export const VoiceIndicator: React.FC<VoiceIndicatorProps> = ({
217
237
  };
218
238
 
219
239
  const positionStyles: React.CSSProperties = {
220
- position: 'fixed',
240
+ position: "fixed",
221
241
  zIndex: 1050,
222
- ...(position.includes('bottom') ? { bottom: '20px' } : { top: '70px' }),
223
- ...(position.includes('right') ? { right: '20px' } : { left: '20px' }),
242
+ ...(position.includes("bottom") ? { bottom: "20px" } : { top: "70px" }),
243
+ ...(position.includes("right") ? { right: "20px" } : { left: "20px" }),
224
244
  };
225
245
 
226
246
  // Don't render if disabled and not showing
227
247
  // Actually, let's always show so users can click to enable
228
-
248
+
229
249
  return (
230
250
  <div style={positionStyles}>
231
251
  {/* Expanded panel */}
232
- {isExpanded && state !== 'disabled' && (
233
- <div
252
+ {isExpanded && state !== "disabled" && (
253
+ <div
234
254
  className="card shadow mb-2"
235
- style={{
236
- width: '280px',
237
- backgroundColor: 'var(--bs-body-bg)',
255
+ style={{
256
+ width: "280px",
257
+ backgroundColor: "var(--bs-body-bg)",
238
258
  }}
239
259
  >
240
260
  <div className="card-body py-2 px-3">
241
261
  <div className="d-flex justify-content-between align-items-center mb-2">
242
262
  <small className="text-muted">{getStateText()}</small>
243
- <button
244
- className="btn btn-sm btn-link p-0"
245
- onClick={() => setIsExpanded(false)}
246
- >
263
+ <button className="btn btn-sm btn-link p-0" onClick={() => setIsExpanded(false)}>
247
264
  <i className="bi bi-x"></i>
248
265
  </button>
249
266
  </div>
250
-
267
+
251
268
  {/* Volume meter */}
252
- {state === 'recording' && (
253
- <div className="progress mb-2" style={{ height: '4px' }}>
254
- <div
255
- className="progress-bar bg-danger"
269
+ {state === "recording" && (
270
+ <div className="progress mb-2" style={{ height: "4px" }}>
271
+ <div
272
+ className="progress-bar bg-danger"
256
273
  style={{ width: `${Math.min(100, volumeLevel * 500)}%` }}
257
274
  ></div>
258
275
  </div>
@@ -280,38 +297,38 @@ export const VoiceIndicator: React.FC<VoiceIndicatorProps> = ({
280
297
  {/* Main button */}
281
298
  <button
282
299
  className={getButtonClass()}
283
- style={{
284
- width: '56px',
285
- height: '56px',
286
- fontSize: '24px',
287
- transition: 'all 0.2s ease',
300
+ style={{
301
+ width: "56px",
302
+ height: "56px",
303
+ fontSize: "24px",
304
+ transition: "all 0.2s ease",
288
305
  }}
289
306
  onClick={handleClick}
290
307
  title={getStateText()}
291
308
  >
292
309
  <i className={`bi ${getIcon()}`}></i>
293
-
310
+
294
311
  {/* Pulsing animation for listening/recording */}
295
- {(state === 'listening' || state === 'recording') && (
296
- <span
312
+ {(state === "listening" || state === "recording") && (
313
+ <span
297
314
  className="position-absolute"
298
315
  style={{
299
316
  top: 0,
300
317
  left: 0,
301
318
  right: 0,
302
319
  bottom: 0,
303
- borderRadius: '50%',
304
- border: '2px solid currentColor',
305
- animation: 'pulse 1.5s ease-out infinite',
320
+ borderRadius: "50%",
321
+ border: "2px solid currentColor",
322
+ animation: "pulse 1.5s ease-out infinite",
306
323
  }}
307
324
  ></span>
308
325
  )}
309
326
 
310
327
  {/* Processing spinner */}
311
- {state === 'processing' && (
312
- <span
328
+ {state === "processing" && (
329
+ <span
313
330
  className="spinner-border spinner-border-sm position-absolute"
314
- style={{ top: '4px', right: '4px' }}
331
+ style={{ top: "4px", right: "4px" }}
315
332
  ></span>
316
333
  )}
317
334
  </button>
@@ -0,0 +1,20 @@
1
+ import type { IMessage } from "@peers-app/peers-sdk";
2
+
3
+ /** Shape passed to `subscribe` handlers for voice / chat IPC events */
4
+ export type VoiceSubscribeEvent<T> = { data: T };
5
+
6
+ export type ChatOpenWithMessagePayload = { message?: IMessage };
7
+
8
+ export type VoiceStatePayload = { state: string };
9
+
10
+ export type VoiceTranscriptionPayload = { text: string };
11
+
12
+ export type VoiceVolumePayload = { level: number };
13
+
14
+ export type VoiceErrorPayload = { message: string };
15
+
16
+ export type VoiceThreadPayload = { threadId: string };
17
+
18
+ export type VoiceSpeakPayload = { text: string; voice?: string; rate?: number };
19
+
20
+ export type VoicePlayAudioPayload = { audioBase64: string; mimeType: string };
package/src/globals.tsx CHANGED
@@ -1,10 +1,24 @@
1
- import { Groups, IGroup, IMessage, IUser, Messages, PersistentVar, computed, getMe, groupUserVar, observable, reloadPackagesOnPageRefresh, rpcClientCalls, rpcServerCalls, sleep } from "@peers-app/peers-sdk";
1
+ import {
2
+ computed,
3
+ Groups,
4
+ getMe,
5
+ groupUserVar,
6
+ type IGroup,
7
+ type IMessage,
8
+ type IUser,
9
+ Messages,
10
+ observable,
11
+ reloadPackagesOnPageRefresh,
12
+ rpcClientCalls,
13
+ rpcServerCalls,
14
+ sleep,
15
+ } from "@peers-app/peers-sdk";
2
16
  import { handleMainPathChanged, openNewTab } from "./tabs-layout/tabs-state";
3
17
  import { stripMentions } from "./utils";
4
18
 
5
19
  export const packageReloaded = observable(0);
6
20
 
7
- export const _mainContentPath = groupUserVar('mainContentPath', { defaultValue: '' });
21
+ export const _mainContentPath = groupUserVar("mainContentPath", { defaultValue: "" });
8
22
 
9
23
  export const mainContentPath = computed<string>({
10
24
  read: () => {
@@ -20,21 +34,21 @@ export const mainContentPath = computed<string>({
20
34
 
21
35
  const queryParams = computed<{ [key: string]: string }>({
22
36
  read: () => {
23
- const queryStr = mainContentPath()?.split('?')[1] || '';
37
+ const queryStr = mainContentPath()?.split("?")[1] || "";
24
38
  const params = new URLSearchParams(queryStr);
25
39
  const obj: { [key: string]: string } = {};
26
40
  for (const [key, value] of params.entries()) {
27
41
  obj[key] = value;
28
42
  }
29
- return obj
43
+ return obj;
30
44
  },
31
45
  write: (value: { [key: string]: string }) => {
32
- const queryStr = mainContentPath().split('?')[1] || '';
46
+ const queryStr = mainContentPath().split("?")[1] || "";
33
47
  const params = new URLSearchParams(queryStr);
34
48
  for (const key in value) {
35
49
  params.set(key, value[key]);
36
50
  }
37
- mainContentPath(mainContentPath().split('?')[0] + '?' + params.toString());
51
+ mainContentPath(`${mainContentPath().split("?")[0]}?${params.toString()}`);
38
52
  },
39
53
  });
40
54
 
@@ -44,7 +58,7 @@ export function queryParam(name: string, value?: string) {
44
58
  if (params[name] === value) {
45
59
  return value;
46
60
  }
47
- if (value === null || value === '') {
61
+ if (value === null || value === "") {
48
62
  delete params[name];
49
63
  } else {
50
64
  params[name] = value;
@@ -54,28 +68,16 @@ export function queryParam(name: string, value?: string) {
54
68
  return params[name];
55
69
  }
56
70
 
57
- export const openThreads: PersistentVar<(string | IMessage)[]> = groupUserVar('openThreads', { defaultValue: [] });
58
- export const threadViewOpen = groupUserVar<boolean>('threadViewOpen', { defaultValue: false });
59
-
60
71
  export async function openThread(thread: string | IMessage) {
61
72
  openThreadInTab(thread);
62
- // let threadId = typeof thread === 'string' ? thread : thread.messageId;
63
- // const message = await Messages().get(threadId);
64
- // if (message) {
65
- // thread = message.messageParentId || message.messageId;
66
- // }
67
- // const threadsWithout = openThreads().filter(t => (typeof t === 'string' && t !== threadId) || (typeof t === 'object' && t.messageId !== threadId));
68
- // openThreads([thread, ...threadsWithout]);
69
- // threadViewOpen(true);
70
73
  }
71
74
 
72
- // Thread opening function for tabs system
73
75
  export async function openThreadInTab(thread: string | IMessage) {
74
- let threadId = typeof thread === 'string' ? thread : thread.messageId;
76
+ const threadId = typeof thread === "string" ? thread : thread.messageId;
75
77
  const message = await Messages().get(threadId);
76
78
 
77
79
  if (!message) {
78
- console.warn('Thread message not found:', threadId);
80
+ console.warn("Thread message not found:", threadId);
79
81
  return;
80
82
  }
81
83
 
@@ -85,35 +87,35 @@ export async function openThreadInTab(thread: string | IMessage) {
85
87
  // Generate thread title from message content (strip mentions and clean formatting)
86
88
  const cleanMessage = stripMentions(message.message);
87
89
  const messagePreview = cleanMessage.slice(0, 30);
88
- const threadTitle = `${messagePreview}${cleanMessage.length > 30 ? '...' : ''}` || `Thread`;
90
+ const threadTitle = `${messagePreview}${cleanMessage.length > 30 ? "..." : ""}` || `Thread`;
89
91
 
90
92
  // // Import openNewTab dynamically to avoid circular dependency
91
93
  // const { openNewTab } = await import('./tabs-layout/tabs-layout');
92
94
 
93
95
  openNewTab({
94
- packageId: 'system-apps',
96
+ packageId: "system-apps",
95
97
  path: `threads/${actualThreadId}`,
96
98
  title: threadTitle,
97
- iconClassName: 'bi-chat-dots',
99
+ iconClassName: "bi-chat-dots",
98
100
  });
99
101
  }
100
102
 
101
103
  rpcClientCalls.setClientPath = async (url: string) => {
102
- mainContentPath(url && String(url).trim() || '');
104
+ mainContentPath((url && String(url).trim()) || "");
103
105
  };
104
106
 
105
107
  rpcClientCalls.openThread = async (threadId: string) => {
106
- console.warn('Opening thread:', threadId);
108
+ console.warn("Opening thread:", threadId);
107
109
  openThread(threadId);
108
110
  };
109
111
 
110
112
  export let me: IUser = null as unknown as IUser;
111
113
 
112
- export const windowWidth = observable(window.innerWidth);//.extend({ rateLimit: 500 });
113
- export const windowHeight = observable(window.innerHeight);//.extend({ rateLimit: 500 });
114
- window.addEventListener("resize", (ev) => {
115
- windowWidth(window.innerWidth)
116
- windowHeight(window.innerHeight)
114
+ export const windowWidth = observable(window.innerWidth); //.extend({ rateLimit: 500 });
115
+ export const windowHeight = observable(window.innerHeight); //.extend({ rateLimit: 500 });
116
+ window.addEventListener("resize", (_ev) => {
117
+ windowWidth(window.innerWidth);
118
+ windowHeight(window.innerHeight);
117
119
  });
118
120
 
119
121
  export const isDesktop = computed(() => {
@@ -131,19 +133,19 @@ export async function loadGlobals() {
131
133
  me = await getMe();
132
134
  await reloadPackagesOnPageRefresh.loadingPromise;
133
135
  if (reloadPackagesOnPageRefresh()) {
134
- await rpcServerCalls.addOrUpdatePackage('updateAll');
136
+ await rpcServerCalls.addOrUpdatePackage("updateAll");
135
137
  }
136
138
  await Promise.all([
137
- Groups().list().then(r => groups(r)),
139
+ Groups()
140
+ .list()
141
+ .then((r) => groups(r)),
138
142
  _mainContentPath.loadingPromise,
139
- openThreads.loadingPromise,
140
- threadViewOpen.loadingPromise,
141
143
  sleep(100),
142
144
  ]);
143
145
 
144
146
  function updateWindowHash() {
145
147
  const currentPath = window.location.hash.substring(1);
146
- const expectedPath = mainContentPath() || '';
148
+ const expectedPath = mainContentPath() || "";
147
149
  // console.log({ expectedPath, currentPath });
148
150
  if (currentPath !== expectedPath) {
149
151
  window.location.hash = expectedPath;
@@ -152,12 +154,12 @@ export async function loadGlobals() {
152
154
  }
153
155
  mainContentPath.subscribe(updateWindowHash);
154
156
  updateWindowHash();
155
- window.addEventListener('hashchange', () => mainContentPath(window.location.hash.substring(1)));
157
+ window.addEventListener("hashchange", () => mainContentPath(window.location.hash.substring(1)));
156
158
 
157
159
  return true;
158
160
  }
159
161
 
160
- if (typeof window !== 'undefined') {
161
- // @ts-ignore
162
+ if (typeof window !== "undefined") {
163
+ // @ts-expect-error
162
164
  window.globals = module.exports;
163
- }
165
+ }