@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,7 +1,13 @@
1
- import React from "react";
2
- import { Assistants, IAssistant, ToolInclusionStrategy, IDoc, camelCaseToSpaces } from "@peers-app/peers-sdk";
3
- import { Tooltip } from "../../components/tooltip";
1
+ import {
2
+ Assistants,
3
+ camelCaseToSpaces,
4
+ type IAssistant,
5
+ type IDoc,
6
+ type Observable,
7
+ ToolInclusionStrategy,
8
+ } from "@peers-app/peers-sdk";
4
9
  import { MarkdownEditorInline } from "../../components/markdown-editor/editor-inline";
10
+ import { Tooltip } from "../../components/tooltip";
5
11
  import { useObservable } from "../../hooks";
6
12
 
7
13
  export const AssistantTools = (props: { assistant: IDoc<IAssistant> }) => {
@@ -9,53 +15,68 @@ export const AssistantTools = (props: { assistant: IDoc<IAssistant> }) => {
9
15
 
10
16
  return (
11
17
  <div>
12
-
13
- <div className='mt-2'>
18
+ <div className="mt-2">
14
19
  <small>
15
20
  Tool Inclusion Strategy:
16
21
  <small>
17
- <Tooltip markdownContent={Assistants().metaData.fields.find(f => f.name === 'toolInclusionStrategy')?.description ?? ''} />
22
+ <Tooltip
23
+ markdownContent={
24
+ Assistants().metaData.fields.find((f) => f.name === "toolInclusionStrategy")
25
+ ?.description ?? ""
26
+ }
27
+ />
18
28
  </small>
19
29
  </small>
20
30
  <ToolInclusionStrategyDropDown assistant={assistant} />
21
31
  </div>
22
32
 
23
- <div className='mt-2'>
33
+ <div className="mt-2">
24
34
  <small>
25
35
  Tools to Include:
26
36
  <small>
27
- <Tooltip markdownContent={Assistants().metaData.fields.find(f => f.name === 'toolsToInclude')?.description ?? ''} />
37
+ <Tooltip
38
+ markdownContent={
39
+ Assistants().metaData.fields.find((f) => f.name === "toolsToInclude")
40
+ ?.description ?? ""
41
+ }
42
+ />
28
43
  </small>
29
44
  </small>
30
- <MarkdownEditorInline
31
- value={assistant.qs.toolsToInclude as any}
32
- />
45
+ <MarkdownEditorInline value={assistant.qs.toolsToInclude as Observable<string>} />
33
46
  </div>
34
-
35
47
  </div>
36
48
  );
37
49
  };
38
50
 
39
-
40
51
  const ToolInclusionStrategyDropDown = (props: { assistant: IDoc<IAssistant> }) => {
41
- const { assistant } = props;
52
+ const { assistant } = props;
42
53
 
43
54
  useObservable(assistant.qs.toolInclusionStrategy);
44
-
55
+
45
56
  return (
46
57
  <div className="dropdown">
47
- <button className="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
58
+ <button
59
+ className="btn btn-secondary dropdown-toggle"
60
+ type="button"
61
+ data-bs-toggle="dropdown"
62
+ aria-expanded="false"
63
+ >
48
64
  {camelCaseToSpaces(assistant.toolInclusionStrategy)}
49
65
  </button>
50
66
  <ul className="dropdown-menu">
51
- {Object.values(ToolInclusionStrategy).map(strategy => {
67
+ {Object.values(ToolInclusionStrategy).map((strategy) => {
52
68
  return (
53
- <li key={strategy} onClick={() => assistant.toolInclusionStrategy = strategy}>
69
+ <li
70
+ key={strategy}
71
+ onClick={() => {
72
+ assistant.toolInclusionStrategy = strategy;
73
+ }}
74
+ >
54
75
  <span className="dropdown-item">{camelCaseToSpaces(strategy)}</span>
55
76
  </li>
56
- )
77
+ );
57
78
  })}
58
79
  </ul>
59
80
  </div>
60
81
  );
61
- }
82
+ };
@@ -1,16 +1,22 @@
1
- import { ConsoleLogs, DataFilter, IConsoleLog, ISubscriptionResult, newid, sleep } from "@peers-app/peers-sdk";
2
- import { min, sortBy, uniqBy } from 'lodash';
3
- import React, { Fragment, useEffect, useMemo, useState } from 'react';
4
- import InfiniteScroll from 'react-infinite-scroll-component';
5
- import { LoadingIndicator } from '../../components/loading-indicator';
1
+ import {
2
+ ConsoleLogs,
3
+ type DataFilter,
4
+ type IConsoleLog,
5
+ type ISubscriptionResult,
6
+ newid,
7
+ } from "@peers-app/peers-sdk";
8
+ import { min, sortBy, uniqBy } from "lodash";
9
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
10
+ import InfiniteScroll from "react-infinite-scroll-component";
11
+ import { LoadingIndicator } from "../../components/loading-indicator";
12
+ import { isDesktop } from "../../globals";
6
13
  import { useObservable, useObservableState } from "../../hooks";
7
14
  import { registerInternalPeersUI } from "../../ui-router/ui-loader";
8
- import { colorMode } from '../settings/color-mode-dropdown';
9
- import { LogDisplay } from './log-display';
10
- import { LogFilters } from './log-filters';
11
- import { ResizableTableHeader } from './resizable-table-header';
12
- import { isDesktop } from '../../globals';
13
- import { MobileLogCard } from './mobile-log-card';
15
+ import { colorMode } from "../settings/color-mode-dropdown";
16
+ import { LogDisplay } from "./log-display";
17
+ import { LogFilters } from "./log-filters";
18
+ import { MobileLogCard } from "./mobile-log-card";
19
+ import { ResizableTableHeader } from "./resizable-table-header";
14
20
 
15
21
  const windowHeight = () => window.innerHeight;
16
22
 
@@ -21,20 +27,22 @@ interface Column {
21
27
  }
22
28
 
23
29
  const DEFAULT_COLUMNS: Column[] = [
24
- { key: 'timestamp', label: 'Timestamp', width: 150 },
25
- { key: 'level', label: 'Level', width: 80 },
26
- { key: 'process', label: 'Process', width: 100 },
27
- { key: 'source', label: 'Source', width: 120 },
28
- { key: 'message', label: 'Message', width: 600 },
30
+ { key: "timestamp", label: "Timestamp", width: 150 },
31
+ { key: "level", label: "Level", width: 80 },
32
+ { key: "process", label: "Process", width: 100 },
33
+ { key: "source", label: "Source", width: 120 },
34
+ { key: "message", label: "Message", width: 600 },
29
35
  ];
30
36
 
31
37
  export const ConsoleLogsList = () => {
32
38
  const logs = useObservableState<IConsoleLog[]>([]);
33
39
  const [allLogsLoaded, setAllLogsLoaded] = useState(false);
34
40
  const loadMoreId = useObservableState<string>(newid(), true);
35
- const [levelFilter, setLevelFilter] = useState<string>('all');
36
- const [processFilter, setProcessFilter] = useState<string>('all');
37
- const searchText = useObservableState<string>('');
41
+ const [levelFilter, setLevelFilter] = useState<string>("all");
42
+ const [processFilter, setProcessFilter] = useState<string>("all");
43
+ const searchText = useObservableState<string>("");
44
+ /** Observable ref is stable — depend on this string in hooks so search changes refetch. */
45
+ const searchQuery = searchText();
38
46
  const [columns, setColumns] = useState<Column[]>(DEFAULT_COLUMNS);
39
47
  const [totalLogCount, setTotalLogCount] = useState<number>(0);
40
48
  const [_colorMode] = useObservable(colorMode);
@@ -46,169 +54,194 @@ export const ConsoleLogsList = () => {
46
54
  const batchSize = 50;
47
55
 
48
56
  // Track fixed column widths to trigger message column recalculation
49
- const fixedColumnsWidthKey = useMemo(() => {
57
+ const _fixedColumnsWidthKey = useMemo(() => {
50
58
  return columns
51
- .filter(col => col.key !== 'message')
52
- .map(col => `${col.key}:${col.width}`)
53
- .join(',');
59
+ .filter((col) => col.key !== "message")
60
+ .map((col) => `${col.key}:${col.width}`)
61
+ .join(",");
54
62
  }, [columns]);
55
63
 
56
- // Calculate message column width based on available space
64
+ // Calculate message column width based on available space.
65
+ // Do not depend on `columns` — updating the message column width changes `columns` and would re-enter this effect forever.
66
+ // Re-run when fixed (non-message) column widths change (`_fixedColumnsWidthKey`) or on window resize.
57
67
  useEffect(() => {
58
68
  const updateMessageColumnWidth = () => {
59
69
  if (!containerRef.current) return;
60
70
 
61
71
  const containerWidth = containerRef.current.offsetWidth;
62
- const fixedColumnsWidth = columns
63
- .filter(col => col.key !== 'message')
64
- .reduce((sum, col) => sum + col.width, 0);
65
72
 
66
- const messageWidth = Math.max(200, containerWidth - fixedColumnsWidth - 20); // 20px for scrollbar
73
+ setColumns((prev) => {
74
+ const fixedColumnsWidth = prev
75
+ .filter((col) => col.key !== "message")
76
+ .reduce((sum, col) => sum + col.width, 0);
67
77
 
68
- setColumns(prev => prev.map(col =>
69
- col.key === 'message' ? { ...col, width: messageWidth } : col
70
- ));
78
+ const messageWidth = Math.max(200, containerWidth - fixedColumnsWidth - 20); // 20px for scrollbar
79
+
80
+ return prev.map((col) => (col.key === "message" ? { ...col, width: messageWidth } : col));
81
+ });
71
82
  };
72
83
 
73
84
  updateMessageColumnWidth();
74
- window.addEventListener('resize', updateMessageColumnWidth);
85
+ window.addEventListener("resize", updateMessageColumnWidth);
75
86
 
76
87
  return () => {
77
- window.removeEventListener('resize', updateMessageColumnWidth);
88
+ window.removeEventListener("resize", updateMessageColumnWidth);
78
89
  };
79
- }, [fixedColumnsWidthKey]);
90
+ }, [_fixedColumnsWidthKey]);
80
91
 
81
92
  // Build filter from UI state
82
- const buildFilter = (): DataFilter<IConsoleLog> => {
93
+ const buildFilter = useCallback((): DataFilter<IConsoleLog> => {
83
94
  const filter: DataFilter<IConsoleLog> = {};
84
- if (levelFilter !== 'all') {
85
- filter.level = levelFilter as any;
95
+ if (levelFilter !== "all") {
96
+ filter.level = levelFilter as IConsoleLog["level"];
86
97
  }
87
- if (processFilter !== 'all') {
98
+ if (processFilter !== "all") {
88
99
  filter.process = processFilter;
89
100
  }
90
- if (searchText()) {
91
- filter.message = { $matchWords: searchText() }
101
+ if (searchQuery.trim()) {
102
+ filter.message = { $matchWords: searchQuery };
92
103
  }
93
104
  return filter;
94
- };
105
+ }, [levelFilter, processFilter, searchQuery]);
95
106
 
96
107
  // Update total log count
97
- async function updateLogCount() {
108
+ const updateLogCount = useCallback(async () => {
98
109
  const table = await ConsoleLogs();
99
110
  const filter = buildFilter();
100
- let count = await table.count(filter);
111
+ const count = await table.count(filter);
101
112
  setTotalLogCount(count);
102
- }
113
+ }, [buildFilter]);
103
114
 
104
115
  // Fetch logs using cursor-based pagination
105
- async function fetchLogs(lastLog?: IConsoleLog): Promise<IConsoleLog[]> {
106
- const table = await ConsoleLogs();
107
- const filter: any = buildFilter();
108
- if (lastLog) {
109
- filter.logId = { $lt: lastLog.logId };
110
- }
111
- const results = await table.list(filter, { pageSize: batchSize, sortBy: ['-timestamp', '-logId'] });
112
- return results;
113
- }
116
+ const fetchLogs = useCallback(
117
+ async (lastLog?: IConsoleLog): Promise<IConsoleLog[]> => {
118
+ const table = await ConsoleLogs();
119
+ const base = buildFilter();
120
+ const filter: DataFilter<IConsoleLog> = lastLog
121
+ ? { ...base, logId: { $lt: lastLog.logId } }
122
+ : base;
123
+ return table.list(filter, {
124
+ pageSize: batchSize,
125
+ sortBy: ["-timestamp", "-logId"],
126
+ });
127
+ },
128
+ [buildFilter],
129
+ );
130
+
131
+ const loadMoreLogsRef = useRef<(startLoadId?: string) => Promise<void>>(async () => {});
114
132
 
115
133
  // Load older logs (prepend to list)
116
- async function loadMoreLogs(startLoadId?: string) {
117
- if (startLoadId && startLoadId !== loadMoreId()) {
118
- return;
119
- }
120
- startLoadId ??= loadMoreId();
121
- const oldestLog = logs()[0];
122
- const fetchedLogs = await fetchLogs(oldestLog);
123
- if (loadMoreId() !== startLoadId) {
124
- loadMoreLogs(loadMoreId());
125
- return;
126
- }
127
- if (fetchedLogs.length === 0) {
128
- setAllLogsLoaded(true);
129
- }
130
- let _logs = sortBy([...logs(), ...fetchedLogs], 'timestamp');
131
- _logs = uniqBy(_logs, l => l.logId);
132
- logs(_logs);
133
- }
134
+ const loadMoreLogs = useCallback(
135
+ async (startLoadId?: string) => {
136
+ if (startLoadId && startLoadId !== loadMoreId()) {
137
+ return;
138
+ }
139
+ const sid = startLoadId ?? loadMoreId();
140
+ const oldestLog = logs()[0];
141
+ const fetchedLogs = await fetchLogs(oldestLog);
142
+ if (loadMoreId() !== sid) {
143
+ await loadMoreLogsRef.current(loadMoreId());
144
+ return;
145
+ }
146
+ if (fetchedLogs.length === 0) {
147
+ setAllLogsLoaded(true);
148
+ }
149
+ let _logs = sortBy([...logs(), ...fetchedLogs], "timestamp");
150
+ _logs = uniqBy(_logs, (l) => l.logId);
151
+ logs(_logs);
152
+ },
153
+ [fetchLogs, loadMoreId, logs],
154
+ );
155
+
156
+ loadMoreLogsRef.current = loadMoreLogs;
157
+
158
+ const scrollToBottom = useCallback((behavior: "instant" | "smooth", delay = 100) => {
159
+ setTimeout(() => {
160
+ logsEndRef.current?.scrollIntoView({ behavior });
161
+ }, delay);
162
+ }, []);
163
+
164
+ const logCount = logs().length;
134
165
 
135
166
  // Initial load and ensure screen is filled
136
167
  const minHeightOfLog = 30;
137
168
  useEffect(() => {
138
- if (!allLogsLoaded && (!logs.length || logs.length * minHeightOfLog < windowHeight())) {
139
- loadMoreLogs();
169
+ if (!allLogsLoaded && (!logCount || logCount * minHeightOfLog < windowHeight())) {
170
+ void loadMoreLogs();
140
171
  }
141
- }, [logs, levelFilter, processFilter, searchText()]);
172
+ }, [allLogsLoaded, loadMoreLogs, logCount]);
142
173
 
143
- // Reset when filters change
174
+ // Reset when filters change (`logs` is a stable observable setter; effect is driven by filter fields and callbacks).
144
175
  useEffect(() => {
145
176
  loadMoreId(newid());
146
177
  logs([]);
147
- updateLogCount();
148
- if (allLogsLoaded) {
149
- setAllLogsLoaded(false);
150
- loadMoreLogs()
151
- }
152
- }, [levelFilter, processFilter, searchText()]);
153
-
154
- // Subscribe to new logs
178
+ void updateLogCount();
179
+ setAllLogsLoaded(false);
180
+ void loadMoreLogs();
181
+ }, [levelFilter, processFilter, searchQuery, loadMoreId, loadMoreLogs, updateLogCount]);
182
+
183
+ // Subscribe to new logs (`searchText` ref is stable; handler calls searchText() per event for current query).
155
184
  useEffect(() => {
156
- let sub: ISubscriptionResult | undefined = undefined;
157
- ConsoleLogs().then(table => {
158
- sub = table.dataChanged.subscribe(evt => {
185
+ let sub: ISubscriptionResult | undefined;
186
+ ConsoleLogs().then((table) => {
187
+ sub = table.dataChanged.subscribe((evt) => {
159
188
  // Update count whenever data changes
160
- updateLogCount();
189
+ void updateLogCount();
161
190
 
162
191
  const log: IConsoleLog = evt.dataObject;
163
192
 
164
193
  // Check if log matches current filters
165
- if (levelFilter !== 'all' && log.level !== levelFilter) return;
166
- if (processFilter !== 'all' && log.process !== processFilter) return;
194
+ if (levelFilter !== "all" && log.level !== levelFilter) return;
195
+ if (processFilter !== "all" && log.process !== processFilter) return;
167
196
  if (searchText()) {
168
197
  const logMessage = log.message.toLowerCase();
169
- const filterOut = searchText().toLowerCase().split(' ').some(word => !logMessage.includes(word));
198
+ const filterOut = searchText()
199
+ .toLowerCase()
200
+ .split(" ")
201
+ .some((word) => !logMessage.includes(word));
170
202
  if (filterOut) return;
171
203
  }
172
204
 
173
205
  // Don't add we're only showing a limited batch and this is older
174
- if (logs().length > batchSize && min(logs().map(l => l.timestamp))! > log.timestamp) return;
206
+ const timestamps = logs().map((l) => l.timestamp);
207
+ const oldestTs = min(timestamps);
208
+ if (logs().length > batchSize && oldestTs !== undefined && oldestTs > log.timestamp) {
209
+ return;
210
+ }
175
211
 
176
- if (evt.op === 'insert') {
177
- let _logs = sortBy([...logs(), log], 'timestamp');
178
- _logs = uniqBy(_logs, l => l.logId);
212
+ if (evt.op === "insert") {
213
+ let _logs = sortBy([...logs(), log], "timestamp");
214
+ _logs = uniqBy(_logs, (l) => l.logId);
179
215
  logs(_logs);
180
- scrollToBottom('smooth');
216
+ scrollToBottom("smooth");
181
217
  }
182
218
  });
183
219
  });
184
220
  return () => {
185
221
  sub?.unsubscribe();
186
222
  };
187
- }, [levelFilter, processFilter]);
188
-
189
- function scrollToBottom(behavior: 'instant' | 'smooth', delay = 100) {
190
- setTimeout(() => {
191
- logsEndRef.current?.scrollIntoView({ behavior });
192
- }, delay);
193
- }
223
+ }, [levelFilter, processFilter, logs, scrollToBottom, searchText, updateLogCount]);
194
224
 
195
225
  async function handleClearLogs() {
196
- if (confirm('Are you sure you want to clear all console logs?')) {
226
+ if (confirm("Are you sure you want to clear all console logs?")) {
197
227
  try {
198
228
  const table = await ConsoleLogs();
199
229
  await table.deleteOldLogs(Date.now());
200
230
  logs([]);
201
231
  setTotalLogCount(0);
202
232
  } catch (err) {
203
- console.error('Failed to clear logs:', err);
233
+ console.error("Failed to clear logs:", err);
204
234
  }
205
235
  }
206
236
  }
207
237
 
208
- const _logs = uniqBy(logs(), l => l.logId);
238
+ const _logs = uniqBy(logs(), (l) => l.logId);
209
239
 
210
240
  return (
211
- <div className="container-fluid" style={{ height: 'calc(100vh - 100px)', display: 'flex', flexDirection: 'column' }}>
241
+ <div
242
+ className="container-fluid"
243
+ style={{ height: "calc(100vh - 100px)", display: "flex", flexDirection: "column" }}
244
+ >
212
245
  <LogFilters
213
246
  levelFilter={levelFilter}
214
247
  setLevelFilter={setLevelFilter}
@@ -222,12 +255,12 @@ export const ConsoleLogsList = () => {
222
255
  ref={containerRef}
223
256
  style={{
224
257
  flex: 1,
225
- display: 'flex',
226
- flexDirection: 'column',
227
- backgroundColor: _colorMode === 'dark' ? '#1a1a1a' : '#f8f9fa',
228
- borderRadius: '0.25rem',
229
- marginBottom: '50px',
230
- overflow: 'hidden',
258
+ display: "flex",
259
+ flexDirection: "column",
260
+ backgroundColor: _colorMode === "dark" ? "#1a1a1a" : "#f8f9fa",
261
+ borderRadius: "0.25rem",
262
+ marginBottom: "50px",
263
+ overflow: "hidden",
231
264
  }}
232
265
  >
233
266
  {/* Desktop: Resizable table header outside scroll area */}
@@ -244,27 +277,25 @@ export const ConsoleLogsList = () => {
244
277
  id="scrollableLogsDiv"
245
278
  style={{
246
279
  flex: 1,
247
- overflow: 'auto',
248
- display: 'flex',
249
- flexDirection: 'column-reverse',
280
+ overflow: "auto",
281
+ display: "flex",
282
+ flexDirection: "column-reverse",
250
283
  }}
251
284
  >
252
285
  <InfiniteScroll
253
286
  dataLength={_logs.length}
254
287
  next={loadMoreLogs}
255
- style={{ display: 'flex', flexDirection: 'column-reverse', overflow: 'hidden' }}
288
+ style={{ display: "flex", flexDirection: "column-reverse", overflow: "hidden" }}
256
289
  inverse={true}
257
290
  hasMore={!allLogsLoaded}
258
291
  loader={<LoadingIndicator />}
259
292
  scrollableTarget="scrollableLogsDiv"
260
293
  endMessage={
261
- <Fragment>
262
- <div className="d-flex justify-content-center p-3">
263
- <div className="text-muted">
264
- <i>beginning of logs</i>
265
- </div>
294
+ <div className="d-flex justify-content-center p-3">
295
+ <div className="text-muted">
296
+ <i>beginning of logs</i>
266
297
  </div>
267
- </Fragment>
298
+ </div>
268
299
  }
269
300
  >
270
301
  <div ref={logsEndRef} />
@@ -282,7 +313,10 @@ export const ConsoleLogsList = () => {
282
313
  </div>
283
314
  ) : (
284
315
  /* Desktop: Table layout */
285
- <table className="table table-sm table-hover mb-0" style={{ fontSize: '0.85rem', tableLayout: 'fixed', width: '100%' }}>
316
+ <table
317
+ className="table table-sm table-hover mb-0"
318
+ style={{ fontSize: "0.85rem", tableLayout: "fixed", width: "100%" }}
319
+ >
286
320
  <tbody>
287
321
  {_logs.map((log) => (
288
322
  <LogDisplay key={log.logId} log={log} columns={columns} />
@@ -296,33 +330,30 @@ export const ConsoleLogsList = () => {
296
330
 
297
331
  <div
298
332
  style={{
299
- position: 'fixed',
333
+ position: "fixed",
300
334
  bottom: 0,
301
335
  left: 0,
302
336
  right: 0,
303
- padding: '0.5rem 1rem',
304
- backgroundColor: _colorMode === 'dark' ? '#2a2a2a' : '#ffffff',
305
- borderTop: '1px solid #dee2e6',
337
+ padding: "0.5rem 1rem",
338
+ backgroundColor: _colorMode === "dark" ? "#2a2a2a" : "#ffffff",
339
+ borderTop: "1px solid #dee2e6",
306
340
  zIndex: 1000,
307
- display: 'flex',
308
- justifyContent: 'space-between',
309
- alignItems: 'center',
341
+ display: "flex",
342
+ justifyContent: "space-between",
343
+ alignItems: "center",
310
344
  }}
311
345
  >
312
346
  <div className="text-muted small">
313
347
  {totalLogCount > 0 ? (
314
348
  <>
315
349
  <i className="bi bi-list-ul me-1"></i>
316
- {totalLogCount} log{totalLogCount !== 1 ? 's' : ''}
350
+ {totalLogCount} log{totalLogCount !== 1 ? "s" : ""}
317
351
  </>
318
352
  ) : (
319
353
  <span>&nbsp;</span>
320
354
  )}
321
355
  </div>
322
- <button
323
- className="btn btn-sm btn-outline-danger"
324
- onClick={handleClearLogs}
325
- >
356
+ <button className="btn btn-sm btn-outline-danger" onClick={handleClearLogs}>
326
357
  <i className="bi bi-trash me-1"></i>
327
358
  Clear All
328
359
  </button>
@@ -333,9 +364,11 @@ export const ConsoleLogsList = () => {
333
364
 
334
365
  registerInternalPeersUI({
335
366
  component: ConsoleLogsList,
336
- routes: [{
337
- isMatch: (_props, context) => context.path === 'console-logs',
338
- uiCategory: 'screen',
339
- priority: 0,
340
- }]
367
+ routes: [
368
+ {
369
+ isMatch: (_props, context) => context.path === "console-logs",
370
+ uiCategory: "screen",
371
+ priority: 0,
372
+ },
373
+ ],
341
374
  });