@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,4 +1,7 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChatOverlay = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
2
5
  /**
3
6
  * Chat Overlay Component
4
7
  *
@@ -6,73 +9,44 @@
6
9
  * Shows minimized voice button that expands to full chat overlay.
7
10
  * Supports both voice and text input in the same thread.
8
11
  */
9
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- var desc = Object.getOwnPropertyDescriptor(m, k);
12
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
- desc = { enumerable: true, get: function() { return m[k]; } };
14
- }
15
- Object.defineProperty(o, k2, desc);
16
- }) : (function(o, m, k, k2) {
17
- if (k2 === undefined) k2 = k;
18
- o[k2] = m[k];
19
- }));
20
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
- Object.defineProperty(o, "default", { enumerable: true, value: v });
22
- }) : function(o, v) {
23
- o["default"] = v;
24
- });
25
- var __importStar = (this && this.__importStar) || (function () {
26
- var ownKeys = function(o) {
27
- ownKeys = Object.getOwnPropertyNames || function (o) {
28
- var ar = [];
29
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
- return ar;
31
- };
32
- return ownKeys(o);
33
- };
34
- return function (mod) {
35
- if (mod && mod.__esModule) return mod;
36
- var result = {};
37
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
- __setModuleDefault(result, mod);
39
- return result;
40
- };
41
- })();
42
- Object.defineProperty(exports, "__esModule", { value: true });
43
- exports.ChatOverlay = void 0;
44
- const react_1 = __importStar(require("react"));
45
12
  const peers_sdk_1 = require("@peers-app/peers-sdk");
13
+ const lodash_1 = require("lodash");
14
+ const react_1 = require("react");
15
+ const globals_1 = require("../globals");
46
16
  const message_compose_1 = require("./messages/message-compose");
47
17
  const message_display_1 = require("./messages/message-display");
48
- const globals_1 = require("../globals");
49
- const lodash_1 = require("lodash");
50
18
  const DEFAULT_VOICE_SETTINGS = {
51
19
  enabled: false,
52
20
  voiceOutputEnabled: true,
53
- wakeWord: 'COMPUTER',
21
+ wakeWord: "COMPUTER",
54
22
  wakeWordSensitivity: 0.5,
55
23
  speechSensitivity: 0.3,
56
- sttProvider: 'auto',
57
- ttsProvider: 'browser',
24
+ sttProvider: "auto",
25
+ ttsProvider: "browser",
58
26
  ttsSpeed: 1.0,
59
27
  };
60
28
  // Persistent var for tracking the chat overlay thread (synced across devices)
61
29
  let chatOverlayThreadPvar = null;
62
30
  function getChatOverlayThreadPvar() {
63
31
  if (!chatOverlayThreadPvar) {
64
- chatOverlayThreadPvar = (0, peers_sdk_1.groupUserVar)('chatOverlayThreadId', { defaultValue: null });
32
+ chatOverlayThreadPvar = (0, peers_sdk_1.groupUserVar)("chatOverlayThreadId", {
33
+ defaultValue: null,
34
+ });
65
35
  }
66
36
  return chatOverlayThreadPvar;
67
37
  }
68
- const voiceHubActive = (0, peers_sdk_1.deviceVar)('voiceHub:active', { defaultValue: false });
38
+ const voiceHubActive = (0, peers_sdk_1.deviceVar)("voiceHub:active", { defaultValue: false });
69
39
  // Voice settings pvar (shared with voice-settings.tsx and voice-service.ts)
70
- const voiceSettingsPvar = (0, peers_sdk_1.userVar)('voiceSettings', { defaultValue: DEFAULT_VOICE_SETTINGS });
40
+ const voiceSettingsPvar = (0, peers_sdk_1.userVar)("voiceSettings", {
41
+ defaultValue: DEFAULT_VOICE_SETTINGS,
42
+ });
71
43
  const DEFAULT_POSITION = { x: 20, y: 20 };
72
- const overlayPositionPvar = (0, peers_sdk_1.deviceVar)('chatOverlayPosition', { defaultValue: DEFAULT_POSITION });
73
- const ChatOverlay = ({ position = 'bottom-right', }) => {
74
- const [voiceState, setVoiceState] = (0, react_1.useState)('disabled');
75
- const [transcription, setTranscription] = (0, react_1.useState)('');
44
+ const overlayPositionPvar = (0, peers_sdk_1.deviceVar)("chatOverlayPosition", {
45
+ defaultValue: DEFAULT_POSITION,
46
+ });
47
+ const ChatOverlay = ({ position: _position = "bottom-right", }) => {
48
+ const [voiceState, setVoiceState] = (0, react_1.useState)("disabled");
49
+ const [_transcription, setTranscription] = (0, react_1.useState)("");
76
50
  const [volumeLevel, setVolumeLevel] = (0, react_1.useState)(0);
77
51
  const [error, setError] = (0, react_1.useState)(null);
78
52
  const [isExpanded, setIsExpanded] = (0, react_1.useState)(false);
@@ -88,6 +62,11 @@ const ChatOverlay = ({ position = 'bottom-right', }) => {
88
62
  const messagesContainerRef = (0, react_1.useRef)(null);
89
63
  const currentAudioRef = (0, react_1.useRef)(null);
90
64
  const dragStartRef = (0, react_1.useRef)(null);
65
+ const scrollToBottom = (0, react_1.useCallback)(() => {
66
+ setTimeout(() => {
67
+ messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
68
+ }, 100);
69
+ }, []);
91
70
  // Load thread from pvar on mount
92
71
  (0, react_1.useEffect)(() => {
93
72
  const pvar = getChatOverlayThreadPvar();
@@ -107,7 +86,7 @@ const ChatOverlay = ({ position = 'bottom-right', }) => {
107
86
  }
108
87
  });
109
88
  return () => sub.dispose();
110
- }, []);
89
+ }, [threadId]);
111
90
  // Load voice settings from pvar
112
91
  (0, react_1.useEffect)(() => {
113
92
  voiceSettingsPvar.loadingPromise.then(() => {
@@ -165,11 +144,11 @@ const ChatOverlay = ({ position = 'bottom-right', }) => {
165
144
  // Save position
166
145
  overlayPositionPvar(overlayPosition);
167
146
  };
168
- document.addEventListener('mousemove', handleMouseMove);
169
- document.addEventListener('mouseup', handleMouseUp);
147
+ document.addEventListener("mousemove", handleMouseMove);
148
+ document.addEventListener("mouseup", handleMouseUp);
170
149
  return () => {
171
- document.removeEventListener('mousemove', handleMouseMove);
172
- document.removeEventListener('mouseup', handleMouseUp);
150
+ document.removeEventListener("mousemove", handleMouseMove);
151
+ document.removeEventListener("mouseup", handleMouseUp);
173
152
  };
174
153
  }, [isDragging, overlayPosition]);
175
154
  // Scroll to bottom when expanded or messages change
@@ -182,38 +161,39 @@ const ChatOverlay = ({ position = 'bottom-right', }) => {
182
161
  }
183
162
  }, 50);
184
163
  }
185
- }, [isExpanded, messages, parentMessage]);
164
+ }, [isExpanded]);
186
165
  // Subscribe to voice events
187
166
  (0, react_1.useEffect)(() => {
188
167
  const subscriptions = [
189
- (0, peers_sdk_1.subscribe)('chat:openWithMessage', (event) => {
168
+ (0, peers_sdk_1.subscribe)("chat:openWithMessage", (event) => {
190
169
  const { message } = event.data || {};
191
170
  if (message) {
192
- setPendingInitialMessage(message);
171
+ const text = typeof message === "string" ? message : message.message;
172
+ setPendingInitialMessage(text);
193
173
  }
194
174
  setIsExpanded(true);
195
175
  setShowSettings(false);
196
176
  }),
197
- (0, peers_sdk_1.subscribe)('voice:stateChanged', (event) => {
177
+ (0, peers_sdk_1.subscribe)("voice:stateChanged", (event) => {
198
178
  setVoiceState(event.data.state);
199
- if (event.data.state === 'idle') {
200
- setTranscription('');
179
+ if (event.data.state === "idle") {
180
+ setTranscription("");
201
181
  setError(null);
202
182
  }
203
- if (event.data.state === 'recording' && !voiceHubActive()) {
183
+ if (event.data.state === "recording" && !voiceHubActive()) {
204
184
  setIsExpanded(true);
205
185
  }
206
186
  }),
207
- (0, peers_sdk_1.subscribe)('voice:transcription', (event) => {
187
+ (0, peers_sdk_1.subscribe)("voice:transcription", (event) => {
208
188
  setTranscription(event.data.text);
209
189
  }),
210
- (0, peers_sdk_1.subscribe)('voice:volumeLevel', (event) => {
190
+ (0, peers_sdk_1.subscribe)("voice:volumeLevel", (event) => {
211
191
  setVolumeLevel(event.data.level);
212
192
  }),
213
- (0, peers_sdk_1.subscribe)('voice:error', (event) => {
193
+ (0, peers_sdk_1.subscribe)("voice:error", (event) => {
214
194
  setError(event.data.message);
215
195
  }),
216
- (0, peers_sdk_1.subscribe)('voice:threadChanged', (event) => {
196
+ (0, peers_sdk_1.subscribe)("voice:threadChanged", (event) => {
217
197
  const newThreadId = event.data.threadId;
218
198
  setThreadId(newThreadId);
219
199
  // Sync to pvar
@@ -222,30 +202,38 @@ const ChatOverlay = ({ position = 'bottom-right', }) => {
222
202
  }),
223
203
  ];
224
204
  // Load initial state
225
- peers_sdk_1.rpcServerCalls.voiceGetState().then(({ state }) => {
205
+ peers_sdk_1.rpcServerCalls
206
+ .voiceGetState()
207
+ .then(({ state }) => {
226
208
  setVoiceState(state);
227
- }).catch(() => { });
209
+ })
210
+ .catch(() => { });
228
211
  // Load initial thread from voice service
229
- peers_sdk_1.rpcServerCalls.voiceGetThreadId?.().then((id) => {
212
+ peers_sdk_1.rpcServerCalls
213
+ .voiceGetThreadId?.()
214
+ .then((id) => {
230
215
  if (id) {
231
216
  setThreadId(id);
232
217
  const pvar = getChatOverlayThreadPvar();
233
218
  pvar(id);
234
219
  }
235
- }).catch(() => { });
220
+ })
221
+ .catch(() => { });
236
222
  return () => {
237
- subscriptions.forEach(sub => sub.unsubscribe());
223
+ for (const sub of subscriptions) {
224
+ sub.unsubscribe();
225
+ }
238
226
  };
239
227
  }, []);
240
228
  // Handle browser TTS events
241
229
  (0, react_1.useEffect)(() => {
242
- const speakHandler = (0, peers_sdk_1.subscribe)('voice:speakText', (event) => {
230
+ const speakHandler = (0, peers_sdk_1.subscribe)("voice:speakText", (event) => {
243
231
  const { text, voice, rate } = event.data;
244
- if ('speechSynthesis' in window) {
232
+ if ("speechSynthesis" in window) {
245
233
  const utterance = new SpeechSynthesisUtterance(text);
246
234
  if (voice) {
247
235
  const voices = speechSynthesis.getVoices();
248
- const selectedVoice = voices.find(v => v.name === voice);
236
+ const selectedVoice = voices.find((v) => v.name === voice);
249
237
  if (selectedVoice)
250
238
  utterance.voice = selectedVoice;
251
239
  }
@@ -263,8 +251,8 @@ const ChatOverlay = ({ position = 'bottom-right', }) => {
263
251
  peers_sdk_1.rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => { });
264
252
  }
265
253
  });
266
- const stopHandler = (0, peers_sdk_1.subscribe)('voice:stopSpeaking', () => {
267
- if ('speechSynthesis' in window) {
254
+ const stopHandler = (0, peers_sdk_1.subscribe)("voice:stopSpeaking", () => {
255
+ if ("speechSynthesis" in window) {
268
256
  speechSynthesis.cancel();
269
257
  }
270
258
  if (currentAudioRef.current) {
@@ -272,10 +260,10 @@ const ChatOverlay = ({ position = 'bottom-right', }) => {
272
260
  currentAudioRef.current = null;
273
261
  }
274
262
  });
275
- const playHandler = (0, peers_sdk_1.subscribe)('voice:playAudio', async (event) => {
263
+ const playHandler = (0, peers_sdk_1.subscribe)("voice:playAudio", async (event) => {
276
264
  const { audioBase64, mimeType } = event.data;
277
265
  try {
278
- const audioData = Uint8Array.from(atob(audioBase64), c => c.charCodeAt(0));
266
+ const audioData = Uint8Array.from(atob(audioBase64), (c) => c.charCodeAt(0));
279
267
  const blob = new Blob([audioData], { type: mimeType });
280
268
  const url = URL.createObjectURL(blob);
281
269
  const audio = new Audio(url);
@@ -288,7 +276,7 @@ const ChatOverlay = ({ position = 'bottom-right', }) => {
288
276
  await audio.play();
289
277
  }
290
278
  catch (e) {
291
- console.error('Failed to play audio:', e);
279
+ console.error("Failed to play audio:", e);
292
280
  currentAudioRef.current = null;
293
281
  peers_sdk_1.rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => { });
294
282
  }
@@ -306,27 +294,26 @@ const ChatOverlay = ({ position = 'bottom-right', }) => {
306
294
  setParentMessage(null);
307
295
  return;
308
296
  }
297
+ const currentThreadId = threadId;
309
298
  async function loadMessages() {
310
- const parent = await (0, peers_sdk_1.Messages)().get(threadId);
299
+ const parent = await (0, peers_sdk_1.Messages)().get(currentThreadId);
311
300
  setParentMessage(parent || null);
312
- const msgs = await (0, peers_sdk_1.Messages)().list({ messageParentId: threadId }, { sortBy: ['createdAt', 'messageId'] });
301
+ const msgs = await (0, peers_sdk_1.Messages)().list({ messageParentId: currentThreadId }, { sortBy: ["createdAt", "messageId"] });
313
302
  setMessages(msgs);
314
303
  scrollToBottom();
315
304
  }
316
- loadMessages();
305
+ void loadMessages();
317
306
  // Subscribe to message changes
318
307
  const sub = (0, peers_sdk_1.Messages)().dataChanged.subscribe((evt) => {
319
- if (evt.dataObject.messageParentId === threadId || evt.dataObject.messageId === threadId) {
320
- loadMessages();
308
+ if (evt.dataObject.messageParentId === currentThreadId ||
309
+ evt.dataObject.messageId === currentThreadId) {
310
+ void loadMessages();
321
311
  }
322
312
  });
323
- return () => { sub.unsubscribe(); };
324
- }, [threadId]);
325
- const scrollToBottom = () => {
326
- setTimeout(() => {
327
- messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
328
- }, 100);
329
- };
313
+ return () => {
314
+ sub.unsubscribe();
315
+ };
316
+ }, [threadId, scrollToBottom]);
330
317
  const updateVoiceSetting = (0, react_1.useCallback)((key, value) => {
331
318
  const newSettings = { ...voiceSettings, [key]: value };
332
319
  setVoiceSettings(newSettings);
@@ -334,22 +321,22 @@ const ChatOverlay = ({ position = 'bottom-right', }) => {
334
321
  }, [voiceSettings]);
335
322
  const handleVoiceClick = (0, react_1.useCallback)(async () => {
336
323
  try {
337
- if (voiceState === 'disabled') {
338
- window.location.hash = '#settings?tab=voice';
324
+ if (voiceState === "disabled") {
325
+ window.location.hash = "#settings?tab=voice";
339
326
  return;
340
327
  }
341
- if (voiceState === 'recording') {
328
+ if (voiceState === "recording") {
342
329
  await peers_sdk_1.rpcServerCalls.voiceStopRecording();
343
330
  }
344
- else if (voiceState === 'speaking') {
331
+ else if (voiceState === "speaking") {
345
332
  await peers_sdk_1.rpcServerCalls.voiceStopPlayback();
346
333
  }
347
- else if (voiceState === 'idle' || voiceState === 'listening') {
334
+ else if (voiceState === "idle" || voiceState === "listening") {
348
335
  await peers_sdk_1.rpcServerCalls.voiceStartRecording();
349
336
  }
350
337
  }
351
338
  catch (e) {
352
- console.error('Voice action failed:', e);
339
+ console.error("Voice action failed:", e);
353
340
  }
354
341
  }, [voiceState]);
355
342
  const startNewThread = (0, react_1.useCallback)(() => {
@@ -379,145 +366,101 @@ const ChatOverlay = ({ position = 'bottom-right', }) => {
379
366
  await (0, peers_sdk_1.Messages)().save(message);
380
367
  }
381
368
  // Add to local state immediately for responsiveness
382
- setMessages(prev => (0, lodash_1.sortBy)([...prev, message], 'createdAt'));
369
+ setMessages((prev) => (0, lodash_1.sortBy)([...prev, message], "createdAt"));
383
370
  scrollToBottom();
384
- }, [threadId]);
371
+ }, [threadId, scrollToBottom]);
385
372
  const getVoiceIcon = () => {
386
373
  switch (voiceState) {
387
- case 'disabled': return 'bi-mic-mute';
388
- case 'idle': return 'bi-mic';
389
- case 'listening': return 'bi-ear';
390
- case 'recording': return 'bi-mic-fill';
391
- case 'processing': return 'bi-hourglass-split';
392
- case 'speaking': return 'bi-volume-up-fill';
393
- default: return 'bi-mic';
374
+ case "disabled":
375
+ return "bi-mic-mute";
376
+ case "idle":
377
+ return "bi-mic";
378
+ case "listening":
379
+ return "bi-ear";
380
+ case "recording":
381
+ return "bi-mic-fill";
382
+ case "processing":
383
+ return "bi-hourglass-split";
384
+ case "speaking":
385
+ return "bi-volume-up-fill";
386
+ default:
387
+ return "bi-mic";
394
388
  }
395
389
  };
396
390
  const getStateText = () => {
397
391
  switch (voiceState) {
398
- case 'disabled': return 'Voice disabled';
399
- case 'idle': return 'Say wake word or click';
400
- case 'listening': return 'Listening...';
401
- case 'recording': return 'Recording...';
402
- case 'processing': return 'Processing...';
403
- case 'speaking': return 'Speaking... (click to stop)';
404
- default: return '';
392
+ case "disabled":
393
+ return "Voice disabled";
394
+ case "idle":
395
+ return "Say wake word or click";
396
+ case "listening":
397
+ return "Listening...";
398
+ case "recording":
399
+ return "Recording...";
400
+ case "processing":
401
+ return "Processing...";
402
+ case "speaking":
403
+ return "Speaking... (click to stop)";
404
+ default:
405
+ return "";
405
406
  }
406
407
  };
407
408
  const getButtonClass = () => {
408
- const base = 'btn rounded-circle shadow';
409
+ const base = "btn rounded-circle shadow";
409
410
  switch (voiceState) {
410
- case 'disabled': return `${base} btn-secondary`;
411
- case 'idle': return `${base} btn-outline-primary`;
412
- case 'listening': return `${base} btn-info`;
413
- case 'recording': return `${base} btn-danger`;
414
- case 'processing': return `${base} btn-warning`;
415
- case 'speaking': return `${base} btn-success`;
416
- default: return `${base} btn-secondary`;
411
+ case "disabled":
412
+ return `${base} btn-secondary`;
413
+ case "idle":
414
+ return `${base} btn-outline-primary`;
415
+ case "listening":
416
+ return `${base} btn-info`;
417
+ case "recording":
418
+ return `${base} btn-danger`;
419
+ case "processing":
420
+ return `${base} btn-warning`;
421
+ case "speaking":
422
+ return `${base} btn-success`;
423
+ default:
424
+ return `${base} btn-secondary`;
417
425
  }
418
426
  };
419
427
  const positionStyles = {
420
- position: 'fixed',
428
+ position: "fixed",
421
429
  zIndex: 1050,
422
430
  bottom: `${overlayPosition.y}px`,
423
431
  right: `${overlayPosition.x}px`,
424
- cursor: isDragging ? 'grabbing' : undefined,
432
+ cursor: isDragging ? "grabbing" : undefined,
425
433
  };
426
- return (react_1.default.createElement("div", { style: positionStyles },
427
- isExpanded && (react_1.default.createElement("div", { className: "card shadow mb-2", style: {
428
- width: '400px',
429
- maxHeight: '70vh',
430
- backgroundColor: 'var(--bs-body-bg)',
431
- display: 'flex',
432
- flexDirection: 'column',
433
- } },
434
- react_1.default.createElement("div", { className: "card-header py-2 px-3 d-flex justify-content-between align-items-center" },
435
- react_1.default.createElement("div", { className: "d-flex align-items-center gap-2" },
436
- react_1.default.createElement("button", { className: "btn btn-sm btn-outline-secondary", onClick: startNewThread, title: "Start new thread" },
437
- react_1.default.createElement("i", { className: "bi bi-plus-lg" })),
438
- react_1.default.createElement("button", { className: `btn btn-sm ${showSettings ? 'btn-secondary' : 'btn-outline-secondary'}`, onClick: () => setShowSettings(!showSettings), title: "Voice settings" },
439
- react_1.default.createElement("i", { className: "bi bi-gear" })),
440
- react_1.default.createElement("small", { className: "text-muted" }, showSettings ? 'Settings' : (threadId ? 'Thread' : 'New conversation'))),
441
- react_1.default.createElement("button", { className: "btn btn-sm btn-link p-0", onClick: () => setIsExpanded(false) },
442
- react_1.default.createElement("i", { className: "bi bi-chevron-down" }))),
443
- showSettings && (react_1.default.createElement("div", { className: "card-body p-3", style: { maxHeight: '50vh', overflowY: 'auto' } },
444
- react_1.default.createElement("div", { className: "d-flex align-items-center justify-content-between mb-2" },
445
- react_1.default.createElement("label", { className: "form-label mb-0" }, "Voice Input"),
446
- react_1.default.createElement("div", { className: "form-check form-switch mb-0" },
447
- react_1.default.createElement("input", { className: "form-check-input", type: "checkbox", id: "voiceEnabledToggle", checked: voiceSettings.enabled, onChange: (e) => updateVoiceSetting('enabled', e.target.checked), role: "switch" }),
448
- react_1.default.createElement("label", { className: "form-check-label", htmlFor: "voiceEnabledToggle" }, voiceSettings.enabled ? 'On' : 'Off'))),
449
- voiceSettings.enabled && (react_1.default.createElement("div", { className: "d-flex align-items-center justify-content-between mb-3 ms-2" },
450
- react_1.default.createElement("label", { className: "form-label mb-0 small text-muted" }, "Voice Output"),
451
- react_1.default.createElement("div", { className: "form-check form-switch mb-0" },
452
- react_1.default.createElement("input", { className: "form-check-input", type: "checkbox", id: "voiceOutputEnabledToggle", checked: voiceSettings.voiceOutputEnabled !== false, onChange: (e) => updateVoiceSetting('voiceOutputEnabled', e.target.checked), role: "switch" }),
453
- react_1.default.createElement("label", { className: "form-check-label", htmlFor: "voiceOutputEnabledToggle" }, voiceSettings.voiceOutputEnabled !== false ? 'On' : 'Off')))),
454
- react_1.default.createElement("div", { className: "mb-3" },
455
- react_1.default.createElement("label", { className: "form-label small mb-1" },
456
- "Wake Word Sensitivity: ",
457
- voiceSettings.wakeWordSensitivity.toFixed(2)),
458
- react_1.default.createElement("input", { type: "range", className: "form-range", min: "0", max: "1", step: "0.05", value: voiceSettings.wakeWordSensitivity, onChange: (e) => updateVoiceSetting('wakeWordSensitivity', parseFloat(e.target.value)) }),
459
- react_1.default.createElement("div", { className: "d-flex justify-content-between" },
460
- react_1.default.createElement("small", { className: "text-muted", style: { fontSize: '0.7rem' } }, "Less sensitive"),
461
- react_1.default.createElement("small", { className: "text-muted", style: { fontSize: '0.7rem' } }, "More sensitive"))),
462
- react_1.default.createElement("div", { className: "mb-2" },
463
- react_1.default.createElement("label", { className: "form-label small mb-1" },
464
- "Speech Detection: ",
465
- voiceSettings.speechSensitivity.toFixed(2)),
466
- react_1.default.createElement("input", { type: "range", className: "form-range", min: "0", max: "1", step: "0.05", value: voiceSettings.speechSensitivity, onChange: (e) => updateVoiceSetting('speechSensitivity', parseFloat(e.target.value)) }),
467
- react_1.default.createElement("div", { className: "d-flex justify-content-between" },
468
- react_1.default.createElement("small", { className: "text-muted", style: { fontSize: '0.7rem' } }, "Quiet (louder speech)"),
469
- react_1.default.createElement("small", { className: "text-muted", style: { fontSize: '0.7rem' } }, "Noisy (softer speech)"))),
470
- react_1.default.createElement("div", { className: "text-center mt-3" },
471
- react_1.default.createElement("a", { href: "#settings?tab=voice", className: "small text-muted" },
472
- "More voice settings ",
473
- react_1.default.createElement("i", { className: "bi bi-arrow-right" }))))),
474
- !showSettings && (react_1.default.createElement("div", { ref: messagesContainerRef, className: "card-body p-2", style: {
475
- flex: 1,
476
- overflowY: 'auto',
477
- maxHeight: '40vh',
478
- minHeight: '100px',
479
- } },
480
- parentMessage && (react_1.default.createElement(react_1.default.Fragment, null,
481
- react_1.default.createElement(message_display_1.MessageDisplay, { message: parentMessage, isThreadParent: true }),
482
- react_1.default.createElement("hr", { className: "my-2" }))),
483
- messages.map((message, index) => (react_1.default.createElement(message_display_1.MessageDisplay, { key: message.messageId, message: message, messageAbove: messages[index - 1] }))),
484
- error && (react_1.default.createElement("div", { className: "alert alert-danger py-1 px-2 small" },
485
- react_1.default.createElement("i", { className: "bi bi-exclamation-triangle me-1" }),
486
- error)),
487
- react_1.default.createElement("div", { ref: messagesEndRef }))),
488
- !showSettings && voiceState !== 'disabled' && voiceState !== 'idle' && (react_1.default.createElement("div", { className: "px-3 py-1 border-top" },
489
- react_1.default.createElement("div", { className: "d-flex align-items-center gap-2" },
490
- react_1.default.createElement("small", { className: "text-muted" }, getStateText()),
491
- voiceState === 'recording' && (react_1.default.createElement("div", { className: "progress flex-grow-1", style: { height: '4px' } },
492
- react_1.default.createElement("div", { className: "progress-bar bg-danger", style: { width: `${Math.min(100, volumeLevel * 500)}%` } })))))),
493
- !showSettings && (react_1.default.createElement("div", { className: "card-footer p-2" },
494
- react_1.default.createElement(message_compose_1.MessageCompose, { channelId: globals_1.me?.userId || 'default', threadId: threadId || (0, peers_sdk_1.newid)(), onMessageSubmit: handleMessageSubmit, initialMessage: pendingInitialMessage, key: pendingInitialMessage ? `pre-${pendingInitialMessage.slice(0, 20)}` : 'default' }))))),
495
- react_1.default.createElement("div", { className: "d-flex gap-2 justify-content-end", onMouseDown: handleDragStart, style: { userSelect: isDragging ? 'none' : undefined } },
496
- voiceSettings.enabled && isExpanded && (react_1.default.createElement("button", { className: getButtonClass(), style: {
497
- width: '56px',
498
- height: '56px',
499
- fontSize: '24px',
500
- transition: 'all 0.2s ease',
501
- position: 'relative',
502
- }, onClick: handleVoiceClick, title: getStateText() },
503
- react_1.default.createElement("i", { className: `bi ${getVoiceIcon()}` }),
504
- (voiceState === 'listening' || voiceState === 'recording') && (react_1.default.createElement("span", { className: "position-absolute", style: {
505
- top: 0,
506
- left: 0,
507
- right: 0,
508
- bottom: 0,
509
- borderRadius: '50%',
510
- border: '2px solid currentColor',
511
- animation: 'pulse 1.5s ease-out infinite',
512
- } })),
513
- voiceState === 'processing' && (react_1.default.createElement("span", { className: "spinner-border spinner-border-sm position-absolute", style: { top: '4px', right: '4px' } })))),
514
- react_1.default.createElement("button", { className: `btn rounded-circle shadow ${isExpanded ? 'btn-primary' : 'btn-light'}`, style: {
515
- width: '56px',
516
- height: '56px',
517
- fontSize: '20px',
518
- }, onClick: () => setIsExpanded(!isExpanded), title: isExpanded ? "Close chat (Shift+drag to move)" : "Open chat (Shift+drag to move)" },
519
- react_1.default.createElement("i", { className: `bi ${isExpanded ? 'bi-chat-dots-fill' : 'bi-chat-dots'}` }))),
520
- react_1.default.createElement("style", null, `
434
+ return ((0, jsx_runtime_1.jsxs)("div", { style: positionStyles, children: [isExpanded && ((0, jsx_runtime_1.jsxs)("div", { className: "card shadow mb-2", style: {
435
+ width: "400px",
436
+ maxHeight: "70vh",
437
+ backgroundColor: "var(--bs-body-bg)",
438
+ display: "flex",
439
+ flexDirection: "column",
440
+ }, children: [(0, jsx_runtime_1.jsxs)("div", { className: "card-header py-2 px-3 d-flex justify-content-between align-items-center", children: [(0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center gap-2", children: [(0, jsx_runtime_1.jsx)("button", { className: "btn btn-sm btn-outline-secondary", onClick: startNewThread, title: "Start new thread", children: (0, jsx_runtime_1.jsx)("i", { className: "bi bi-plus-lg" }) }), (0, jsx_runtime_1.jsx)("button", { className: `btn btn-sm ${showSettings ? "btn-secondary" : "btn-outline-secondary"}`, onClick: () => setShowSettings(!showSettings), title: "Voice settings", children: (0, jsx_runtime_1.jsx)("i", { className: "bi bi-gear" }) }), (0, jsx_runtime_1.jsx)("small", { className: "text-muted", children: showSettings ? "Settings" : threadId ? "Thread" : "New conversation" })] }), (0, jsx_runtime_1.jsx)("button", { className: "btn btn-sm btn-link p-0", onClick: () => setIsExpanded(false), children: (0, jsx_runtime_1.jsx)("i", { className: "bi bi-chevron-down" }) })] }), showSettings && ((0, jsx_runtime_1.jsxs)("div", { className: "card-body p-3", style: { maxHeight: "50vh", overflowY: "auto" }, children: [(0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center justify-content-between mb-2", children: [(0, jsx_runtime_1.jsx)("label", { className: "form-label mb-0", children: "Voice Input" }), (0, jsx_runtime_1.jsxs)("div", { className: "form-check form-switch mb-0", children: [(0, jsx_runtime_1.jsx)("input", { className: "form-check-input", type: "checkbox", id: "voiceEnabledToggle", checked: voiceSettings.enabled, onChange: (e) => updateVoiceSetting("enabled", e.target.checked), role: "switch" }), (0, jsx_runtime_1.jsx)("label", { className: "form-check-label", htmlFor: "voiceEnabledToggle", children: voiceSettings.enabled ? "On" : "Off" })] })] }), voiceSettings.enabled && ((0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center justify-content-between mb-3 ms-2", children: [(0, jsx_runtime_1.jsx)("label", { className: "form-label mb-0 small text-muted", children: "Voice Output" }), (0, jsx_runtime_1.jsxs)("div", { className: "form-check form-switch mb-0", children: [(0, jsx_runtime_1.jsx)("input", { className: "form-check-input", type: "checkbox", id: "voiceOutputEnabledToggle", checked: voiceSettings.voiceOutputEnabled !== false, onChange: (e) => updateVoiceSetting("voiceOutputEnabled", e.target.checked), role: "switch" }), (0, jsx_runtime_1.jsx)("label", { className: "form-check-label", htmlFor: "voiceOutputEnabledToggle", children: voiceSettings.voiceOutputEnabled !== false ? "On" : "Off" })] })] })), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsxs)("label", { className: "form-label small mb-1", children: ["Wake Word Sensitivity: ", voiceSettings.wakeWordSensitivity.toFixed(2)] }), (0, jsx_runtime_1.jsx)("input", { type: "range", className: "form-range", min: "0", max: "1", step: "0.05", value: voiceSettings.wakeWordSensitivity, onChange: (e) => updateVoiceSetting("wakeWordSensitivity", parseFloat(e.target.value)) }), (0, jsx_runtime_1.jsxs)("div", { className: "d-flex justify-content-between", children: [(0, jsx_runtime_1.jsx)("small", { className: "text-muted", style: { fontSize: "0.7rem" }, children: "Less sensitive" }), (0, jsx_runtime_1.jsx)("small", { className: "text-muted", style: { fontSize: "0.7rem" }, children: "More sensitive" })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-2", children: [(0, jsx_runtime_1.jsxs)("label", { className: "form-label small mb-1", children: ["Speech Detection: ", voiceSettings.speechSensitivity.toFixed(2)] }), (0, jsx_runtime_1.jsx)("input", { type: "range", className: "form-range", min: "0", max: "1", step: "0.05", value: voiceSettings.speechSensitivity, onChange: (e) => updateVoiceSetting("speechSensitivity", parseFloat(e.target.value)) }), (0, jsx_runtime_1.jsxs)("div", { className: "d-flex justify-content-between", children: [(0, jsx_runtime_1.jsx)("small", { className: "text-muted", style: { fontSize: "0.7rem" }, children: "Quiet (louder speech)" }), (0, jsx_runtime_1.jsx)("small", { className: "text-muted", style: { fontSize: "0.7rem" }, children: "Noisy (softer speech)" })] })] }), (0, jsx_runtime_1.jsx)("div", { className: "text-center mt-3", children: (0, jsx_runtime_1.jsxs)("a", { href: "#settings?tab=voice", className: "small text-muted", children: ["More voice settings ", (0, jsx_runtime_1.jsx)("i", { className: "bi bi-arrow-right" })] }) })] })), !showSettings && ((0, jsx_runtime_1.jsxs)("div", { ref: messagesContainerRef, className: "card-body p-2", style: {
441
+ flex: 1,
442
+ overflowY: "auto",
443
+ maxHeight: "40vh",
444
+ minHeight: "100px",
445
+ }, children: [parentMessage && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(message_display_1.MessageDisplay, { message: parentMessage, isThreadParent: true }), (0, jsx_runtime_1.jsx)("hr", { className: "my-2" })] })), messages.map((message, index) => ((0, jsx_runtime_1.jsx)(message_display_1.MessageDisplay, { message: message, messageAbove: messages[index - 1] }, message.messageId))), error && ((0, jsx_runtime_1.jsxs)("div", { className: "alert alert-danger py-1 px-2 small", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi bi-exclamation-triangle me-1" }), error] })), (0, jsx_runtime_1.jsx)("div", { ref: messagesEndRef })] })), !showSettings && voiceState !== "disabled" && voiceState !== "idle" && ((0, jsx_runtime_1.jsx)("div", { className: "px-3 py-1 border-top", children: (0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center gap-2", children: [(0, jsx_runtime_1.jsx)("small", { className: "text-muted", children: getStateText() }), voiceState === "recording" && ((0, jsx_runtime_1.jsx)("div", { className: "progress flex-grow-1", style: { height: "4px" }, children: (0, jsx_runtime_1.jsx)("div", { className: "progress-bar bg-danger", style: { width: `${Math.min(100, volumeLevel * 500)}%` } }) }))] }) })), !showSettings && ((0, jsx_runtime_1.jsx)("div", { className: "card-footer p-2", children: (0, jsx_runtime_1.jsx)(message_compose_1.MessageCompose, { channelId: globals_1.me?.userId || "default", threadId: threadId || (0, peers_sdk_1.newid)(), onMessageSubmit: handleMessageSubmit, initialMessage: pendingInitialMessage }, pendingInitialMessage ? `pre-${pendingInitialMessage.slice(0, 20)}` : "default") }))] })), (0, jsx_runtime_1.jsxs)("div", { className: "d-flex gap-2 justify-content-end", onMouseDown: handleDragStart, style: { userSelect: isDragging ? "none" : undefined }, children: [voiceSettings.enabled && isExpanded && ((0, jsx_runtime_1.jsxs)("button", { className: getButtonClass(), style: {
446
+ width: "56px",
447
+ height: "56px",
448
+ fontSize: "24px",
449
+ transition: "all 0.2s ease",
450
+ position: "relative",
451
+ }, onClick: handleVoiceClick, title: getStateText(), children: [(0, jsx_runtime_1.jsx)("i", { className: `bi ${getVoiceIcon()}` }), (voiceState === "listening" || voiceState === "recording") && ((0, jsx_runtime_1.jsx)("span", { className: "position-absolute", style: {
452
+ top: 0,
453
+ left: 0,
454
+ right: 0,
455
+ bottom: 0,
456
+ borderRadius: "50%",
457
+ border: "2px solid currentColor",
458
+ animation: "pulse 1.5s ease-out infinite",
459
+ } })), voiceState === "processing" && ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm position-absolute", style: { top: "4px", right: "4px" } }))] })), (0, jsx_runtime_1.jsx)("button", { className: `btn rounded-circle shadow ${isExpanded ? "btn-primary" : "btn-light"}`, style: {
460
+ width: "56px",
461
+ height: "56px",
462
+ fontSize: "20px",
463
+ }, onClick: () => setIsExpanded(!isExpanded), title: isExpanded ? "Close chat (Shift+drag to move)" : "Open chat (Shift+drag to move)", children: (0, jsx_runtime_1.jsx)("i", { className: `bi ${isExpanded ? "bi-chat-dots-fill" : "bi-chat-dots"}` }) })] }), (0, jsx_runtime_1.jsx)("style", { children: `
521
464
  @keyframes pulse {
522
465
  0% {
523
466
  transform: scale(1);
@@ -528,7 +471,7 @@ const ChatOverlay = ({ position = 'bottom-right', }) => {
528
471
  opacity: 0;
529
472
  }
530
473
  }
531
- `)));
474
+ ` })] }));
532
475
  };
533
476
  exports.ChatOverlay = ChatOverlay;
534
477
  exports.default = exports.ChatOverlay;
@@ -1,7 +1,8 @@
1
- import React from 'react';
2
- interface IProps extends React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> {
3
- checked: any;
1
+ import type { Observable } from "@peers-app/peers-sdk";
2
+ import type React from "react";
3
+ interface IProps extends Omit<React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>, "checked"> {
4
+ checked?: boolean | Observable<boolean | undefined>;
4
5
  type?: React.HTMLInputTypeAttribute;
5
6
  }
6
- export declare function Checkbox(props: IProps): React.JSX.Element;
7
+ export declare function Checkbox(props: IProps): import("react/jsx-runtime").JSX.Element;
7
8
  export {};
@@ -1,20 +1,17 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.Checkbox = Checkbox;
7
- const react_1 = __importDefault(require("react"));
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
5
  const hooks_1 = require("../hooks");
9
6
  function Checkbox(props) {
10
7
  const [checked, setChecked] = (0, hooks_1.useObservable)(props.checked);
11
- const type = props.type ?? 'checkbox';
8
+ const type = props.type ?? "checkbox";
12
9
  function onChange(evt) {
13
10
  let _value = evt.target.checked;
14
- if (type === 'checkbox') {
11
+ if (type === "checkbox") {
15
12
  _value = !!_value;
16
13
  }
17
14
  setChecked(_value);
18
15
  }
19
- return (react_1.default.createElement("input", { onChange: onChange, type: type, ...props, checked: checked }));
16
+ return (0, jsx_runtime_1.jsx)("input", { onChange: onChange, type: type, ...props, checked: checked });
20
17
  }