@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,40 +1,8 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
3
  exports.Typeahead = Typeahead;
37
- const react_1 = __importStar(require("react"));
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
38
6
  // CSS for hover effects that work with both light and dark themes
39
7
  const typeaheadStyles = `
40
8
  .typeahead-item:not(.bg-primary):hover {
@@ -88,8 +56,8 @@ const typeaheadStyles = `
88
56
  }
89
57
  `;
90
58
  function Typeahead(props) {
91
- const { placeholder = "Search...", searchFn, onSelectionChange, renderItem, renderBadge, selectedItems = [], multiSelect = false, maxSelections, className = "form-control", disabled = false, minSearchLength = 1, debounceMs = 300, maxResults = 10 } = props;
92
- const [query, setQuery] = (0, react_1.useState)('');
59
+ const { placeholder = "Search...", searchFn, onSelectionChange, renderItem, renderBadge, selectedItems = [], multiSelect = false, maxSelections, className = "form-control", disabled = false, minSearchLength = 1, debounceMs = 300, maxResults = 10, } = props;
60
+ const [query, setQuery] = (0, react_1.useState)("");
93
61
  const [results, setResults] = (0, react_1.useState)([]);
94
62
  const [selectedIndex, setSelectedIndex] = (0, react_1.useState)(-1);
95
63
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
@@ -100,9 +68,9 @@ function Typeahead(props) {
100
68
  const debounceRef = (0, react_1.useRef)();
101
69
  // Inject styles once
102
70
  (0, react_1.useEffect)(() => {
103
- const styleId = 'typeahead-styles';
71
+ const styleId = "typeahead-styles";
104
72
  if (!document.getElementById(styleId)) {
105
- const style = document.createElement('style');
73
+ const style = document.createElement("style");
106
74
  style.id = styleId;
107
75
  style.textContent = typeaheadStyles;
108
76
  document.head.appendChild(style);
@@ -119,14 +87,14 @@ function Typeahead(props) {
119
87
  try {
120
88
  const searchResults = await searchFn(query);
121
89
  // Filter out already selected items
122
- const selectedIds = selectedItems.map(item => item.id);
123
- const filteredResults = searchResults.filter(item => !selectedIds.includes(item.id));
90
+ const selectedIds = selectedItems.map((item) => item.id);
91
+ const filteredResults = searchResults.filter((item) => !selectedIds.includes(item.id));
124
92
  setResults(filteredResults.slice(0, maxResults));
125
93
  setIsOpen(filteredResults.length > 0);
126
94
  setSelectedIndex(-1);
127
95
  }
128
96
  catch (error) {
129
- console.error('Search error:', error);
97
+ console.error("Search error:", error);
130
98
  setResults([]);
131
99
  }
132
100
  finally {
@@ -153,19 +121,19 @@ function Typeahead(props) {
153
121
  setSelectedIndex(-1);
154
122
  }
155
123
  }
156
- document.addEventListener('mousedown', handleClickOutside);
157
- return () => document.removeEventListener('mousedown', handleClickOutside);
124
+ document.addEventListener("mousedown", handleClickOutside);
125
+ return () => document.removeEventListener("mousedown", handleClickOutside);
158
126
  }, []);
159
127
  const handleKeyDown = (e) => {
160
128
  // Handle backspace to remove last selected item when input is empty
161
- if (e.key === 'Backspace' && query === '' && selectedItems.length > 0) {
129
+ if (e.key === "Backspace" && query === "" && selectedItems.length > 0) {
162
130
  e.preventDefault();
163
131
  const lastItem = selectedItems[selectedItems.length - 1];
164
132
  handleRemove(lastItem);
165
133
  return;
166
134
  }
167
135
  // Handle tab to auto-select highlighted result (or first result if none highlighted)
168
- if (e.key === 'Tab' && isOpen && results.length > 0) {
136
+ if (e.key === "Tab" && isOpen && results.length > 0) {
169
137
  e.preventDefault();
170
138
  const indexToSelect = selectedIndex >= 0 ? selectedIndex : 0;
171
139
  handleSelect(results[indexToSelect]);
@@ -174,21 +142,21 @@ function Typeahead(props) {
174
142
  if (!isOpen || results.length === 0)
175
143
  return;
176
144
  switch (e.key) {
177
- case 'ArrowDown':
145
+ case "ArrowDown":
178
146
  e.preventDefault();
179
- setSelectedIndex(prev => prev < results.length - 1 ? prev + 1 : 0);
147
+ setSelectedIndex((prev) => (prev < results.length - 1 ? prev + 1 : 0));
180
148
  break;
181
- case 'ArrowUp':
149
+ case "ArrowUp":
182
150
  e.preventDefault();
183
- setSelectedIndex(prev => prev > 0 ? prev - 1 : results.length - 1);
151
+ setSelectedIndex((prev) => (prev > 0 ? prev - 1 : results.length - 1));
184
152
  break;
185
- case 'Enter':
153
+ case "Enter":
186
154
  e.preventDefault();
187
155
  if (selectedIndex >= 0 && selectedIndex < results.length) {
188
156
  handleSelect(results[selectedIndex]);
189
157
  }
190
158
  break;
191
- case 'Escape':
159
+ case "Escape":
192
160
  e.preventDefault();
193
161
  setIsOpen(false);
194
162
  setSelectedIndex(-1);
@@ -210,21 +178,24 @@ function Typeahead(props) {
210
178
  newSelectedItems = [item];
211
179
  }
212
180
  onSelectionChange(newSelectedItems);
213
- setQuery('');
181
+ setQuery("");
214
182
  setResults([]);
215
183
  setIsOpen(false);
216
184
  setSelectedIndex(-1);
217
185
  inputRef.current?.focus();
218
186
  };
219
187
  const handleRemove = (itemToRemove) => {
220
- const newSelectedItems = selectedItems.filter(item => item.id !== itemToRemove.id);
188
+ const newSelectedItems = selectedItems.filter((item) => item.id !== itemToRemove.id);
221
189
  onSelectionChange(newSelectedItems);
222
190
  inputRef.current?.focus();
223
191
  };
224
192
  const defaultRenderBadge = (item) => {
225
- // Extract display text - try common properties
226
- const displayText = item.name || item.title || item.label || item.id;
227
- return displayText;
193
+ const r = item;
194
+ const str = (k) => {
195
+ const v = r[k];
196
+ return typeof v === "string" ? v : undefined;
197
+ };
198
+ return str("name") || str("title") || str("label") || item.id;
228
199
  };
229
200
  const handleInputChange = (e) => {
230
201
  setQuery(e.target.value);
@@ -234,37 +205,25 @@ function Typeahead(props) {
234
205
  setIsOpen(true);
235
206
  }
236
207
  };
237
- return (react_1.default.createElement("div", { ref: containerRef, className: "position-relative" },
238
- react_1.default.createElement("div", { className: "typeahead-input-container", onClick: () => inputRef.current?.focus() },
239
- selectedItems.map((item) => (react_1.default.createElement("div", { key: item.id, className: "badge bg-primary typeahead-badge d-flex align-items-center position-relative pe-4" },
240
- react_1.default.createElement("span", null, renderBadge ? renderBadge(item) : defaultRenderBadge(item)),
241
- react_1.default.createElement("button", { type: "button", className: "btn-close btn-close-white position-absolute", style: {
242
- right: '2px',
243
- top: '50%',
244
- transform: 'translateY(-50%)',
245
- fontSize: '0.5rem',
246
- width: '10px',
247
- height: '10px'
248
- }, onClick: (e) => {
249
- e.stopPropagation();
250
- handleRemove(item);
251
- }, disabled: disabled, "aria-label": "Remove" })))),
252
- react_1.default.createElement("input", { ref: inputRef, type: "text", className: "typeahead-input", placeholder: selectedItems.length > 0 && !multiSelect ? "Selection made" : placeholder, value: query, onChange: handleInputChange, onKeyDown: handleKeyDown, onFocus: handleInputFocus, disabled: disabled || (!multiSelect && selectedItems.length > 0) }),
253
- isLoading && (react_1.default.createElement("div", { className: "position-absolute", style: {
254
- right: '8px',
255
- top: '50%',
256
- transform: 'translateY(-50%)'
257
- } },
258
- react_1.default.createElement("div", { className: "spinner-border spinner-border-sm text-secondary", role: "status" },
259
- react_1.default.createElement("span", { className: "visually-hidden" }, "Loading..."))))),
260
- isOpen && results.length > 0 && (react_1.default.createElement("div", { ref: resultsRef, className: "position-absolute w-100 bg-body border border-top-0 rounded-bottom shadow-lg", style: {
261
- zIndex: 1000,
262
- maxHeight: '300px',
263
- overflowY: 'auto'
264
- } }, results.map((item, index) => (react_1.default.createElement("div", { key: item.id, className: `px-3 py-2 border-bottom typeahead-item ${index === selectedIndex
265
- ? 'bg-primary text-white'
266
- : 'bg-body text-body'}`, style: {
267
- cursor: 'pointer'
268
- }, onClick: () => handleSelect(item), onMouseEnter: () => setSelectedIndex(index) }, renderItem(item, index === selectedIndex)))))),
269
- isOpen && query.length >= minSearchLength && results.length === 0 && !isLoading && (react_1.default.createElement("div", { className: "position-absolute w-100 bg-body border border-top-0 rounded-bottom shadow-lg px-3 py-2 text-muted", style: { zIndex: 1000 } }, "No results found"))));
208
+ return ((0, jsx_runtime_1.jsxs)("div", { ref: containerRef, className: "position-relative", children: [(0, jsx_runtime_1.jsxs)("div", { className: "typeahead-input-container", onClick: () => inputRef.current?.focus(), children: [selectedItems.map((item) => ((0, jsx_runtime_1.jsxs)("div", { className: "badge bg-primary typeahead-badge d-flex align-items-center position-relative pe-4", children: [(0, jsx_runtime_1.jsx)("span", { children: renderBadge ? renderBadge(item) : defaultRenderBadge(item) }), (0, jsx_runtime_1.jsx)("button", { type: "button", className: "btn-close btn-close-white position-absolute", style: {
209
+ right: "2px",
210
+ top: "50%",
211
+ transform: "translateY(-50%)",
212
+ fontSize: "0.5rem",
213
+ width: "10px",
214
+ height: "10px",
215
+ }, onClick: (e) => {
216
+ e.stopPropagation();
217
+ handleRemove(item);
218
+ }, disabled: disabled, "aria-label": "Remove" })] }, item.id))), (0, jsx_runtime_1.jsx)("input", { ref: inputRef, type: "text", className: `typeahead-input ${className}`, placeholder: selectedItems.length > 0 && !multiSelect ? "Selection made" : placeholder, value: query, onChange: handleInputChange, onKeyDown: handleKeyDown, onFocus: handleInputFocus, disabled: disabled || (!multiSelect && selectedItems.length > 0) }), isLoading && ((0, jsx_runtime_1.jsx)("div", { className: "position-absolute", style: {
219
+ right: "8px",
220
+ top: "50%",
221
+ transform: "translateY(-50%)",
222
+ }, children: (0, jsx_runtime_1.jsx)("div", { className: "spinner-border spinner-border-sm text-secondary", role: "status", children: (0, jsx_runtime_1.jsx)("span", { className: "visually-hidden", children: "Loading..." }) }) }))] }), isOpen && results.length > 0 && ((0, jsx_runtime_1.jsx)("div", { ref: resultsRef, className: "position-absolute w-100 bg-body border border-top-0 rounded-bottom shadow-lg", style: {
223
+ zIndex: 1000,
224
+ maxHeight: "300px",
225
+ overflowY: "auto",
226
+ }, children: results.map((item, index) => ((0, jsx_runtime_1.jsx)("div", { className: `px-3 py-2 border-bottom typeahead-item ${index === selectedIndex ? "bg-primary text-white" : "bg-body text-body"}`, style: {
227
+ cursor: "pointer",
228
+ }, onClick: () => handleSelect(item), onMouseEnter: () => setSelectedIndex(index), children: renderItem(item, index === selectedIndex) }, item.id))) })), isOpen && query.length >= minSearchLength && results.length === 0 && !isLoading && ((0, jsx_runtime_1.jsx)("div", { className: "position-absolute w-100 bg-body border border-top-0 rounded-bottom shadow-lg px-3 py-2 text-muted", style: { zIndex: 1000 }, children: "No results found" }))] }));
270
229
  }
@@ -4,10 +4,10 @@
4
4
  * Floating UI element showing voice input state.
5
5
  * Supports manual recording trigger via click.
6
6
  */
7
- import React from 'react';
7
+ import React from "react";
8
8
  interface VoiceIndicatorProps {
9
9
  /** Position of the indicator */
10
- position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
10
+ position?: "bottom-right" | "bottom-left" | "top-right" | "top-left";
11
11
  /** Show expanded view with transcription */
12
12
  showTranscription?: boolean;
13
13
  }
@@ -1,10 +1,4 @@
1
1
  "use strict";
2
- /**
3
- * Voice Indicator Component
4
- *
5
- * Floating UI element showing voice input state.
6
- * Supports manual recording trigger via click.
7
- */
8
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
3
  if (k2 === undefined) k2 = k;
10
4
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -40,11 +34,18 @@ var __importStar = (this && this.__importStar) || (function () {
40
34
  })();
41
35
  Object.defineProperty(exports, "__esModule", { value: true });
42
36
  exports.VoiceIndicator = void 0;
43
- const react_1 = __importStar(require("react"));
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
38
+ /**
39
+ * Voice Indicator Component
40
+ *
41
+ * Floating UI element showing voice input state.
42
+ * Supports manual recording trigger via click.
43
+ */
44
44
  const peers_sdk_1 = require("@peers-app/peers-sdk");
45
- const VoiceIndicator = ({ position = 'bottom-right', showTranscription = true, }) => {
46
- const [state, setState] = (0, react_1.useState)('disabled');
47
- const [transcription, setTranscription] = (0, react_1.useState)('');
45
+ const react_1 = __importStar(require("react"));
46
+ const VoiceIndicator = ({ position = "bottom-right", showTranscription = true, }) => {
47
+ const [state, setState] = (0, react_1.useState)("disabled");
48
+ const [transcription, setTranscription] = (0, react_1.useState)("");
48
49
  const [volumeLevel, setVolumeLevel] = (0, react_1.useState)(0);
49
50
  const [error, setError] = (0, react_1.useState)(null);
50
51
  const [isExpanded, setIsExpanded] = (0, react_1.useState)(false);
@@ -53,45 +54,50 @@ const VoiceIndicator = ({ position = 'bottom-right', showTranscription = true, }
53
54
  // Subscribe to voice events
54
55
  (0, react_1.useEffect)(() => {
55
56
  const subscriptions = [
56
- (0, peers_sdk_1.subscribe)('voice:stateChanged', (event) => {
57
+ (0, peers_sdk_1.subscribe)("voice:stateChanged", (event) => {
57
58
  setState(event.data.state);
58
- if (event.data.state === 'idle') {
59
- setTranscription('');
59
+ if (event.data.state === "idle") {
60
+ setTranscription("");
60
61
  setError(null);
61
62
  }
62
- if (event.data.state === 'recording') {
63
+ if (event.data.state === "recording") {
63
64
  setIsExpanded(true);
64
65
  }
65
66
  }),
66
- (0, peers_sdk_1.subscribe)('voice:transcription', (event) => {
67
+ (0, peers_sdk_1.subscribe)("voice:transcription", (event) => {
67
68
  setTranscription(event.data.text);
68
69
  }),
69
- (0, peers_sdk_1.subscribe)('voice:volumeLevel', (event) => {
70
+ (0, peers_sdk_1.subscribe)("voice:volumeLevel", (event) => {
70
71
  setVolumeLevel(event.data.level);
71
72
  }),
72
- (0, peers_sdk_1.subscribe)('voice:error', (event) => {
73
+ (0, peers_sdk_1.subscribe)("voice:error", (event) => {
73
74
  setError(event.data.message);
74
75
  }),
75
76
  ];
76
77
  // Load initial state
77
- peers_sdk_1.rpcServerCalls.voiceGetState().then(({ state }) => {
78
+ peers_sdk_1.rpcServerCalls
79
+ .voiceGetState()
80
+ .then(({ state }) => {
78
81
  setState(state);
79
- }).catch(() => {
82
+ })
83
+ .catch(() => {
80
84
  // Voice service may not be initialized yet
81
85
  });
82
86
  return () => {
83
- subscriptions.forEach(sub => sub.unsubscribe());
87
+ for (const sub of subscriptions) {
88
+ sub.unsubscribe();
89
+ }
84
90
  };
85
91
  }, []);
86
92
  // Handle browser TTS events
87
93
  (0, react_1.useEffect)(() => {
88
- const speakHandler = (0, peers_sdk_1.subscribe)('voice:speakText', (event) => {
94
+ const speakHandler = (0, peers_sdk_1.subscribe)("voice:speakText", (event) => {
89
95
  const { text, voice, rate } = event.data;
90
- if ('speechSynthesis' in window) {
96
+ if ("speechSynthesis" in window) {
91
97
  const utterance = new SpeechSynthesisUtterance(text);
92
98
  if (voice) {
93
99
  const voices = speechSynthesis.getVoices();
94
- const selectedVoice = voices.find(v => v.name === voice);
100
+ const selectedVoice = voices.find((v) => v.name === voice);
95
101
  if (selectedVoice)
96
102
  utterance.voice = selectedVoice;
97
103
  }
@@ -112,9 +118,9 @@ const VoiceIndicator = ({ position = 'bottom-right', showTranscription = true, }
112
118
  peers_sdk_1.rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => { });
113
119
  }
114
120
  });
115
- const stopHandler = (0, peers_sdk_1.subscribe)('voice:stopSpeaking', () => {
121
+ const stopHandler = (0, peers_sdk_1.subscribe)("voice:stopSpeaking", () => {
116
122
  // Stop browser TTS
117
- if ('speechSynthesis' in window) {
123
+ if ("speechSynthesis" in window) {
118
124
  speechSynthesis.cancel();
119
125
  }
120
126
  // Stop cloud TTS audio if playing
@@ -123,10 +129,10 @@ const VoiceIndicator = ({ position = 'bottom-right', showTranscription = true, }
123
129
  currentAudioRef.current = null;
124
130
  }
125
131
  });
126
- const playHandler = (0, peers_sdk_1.subscribe)('voice:playAudio', async (event) => {
132
+ const playHandler = (0, peers_sdk_1.subscribe)("voice:playAudio", async (event) => {
127
133
  const { audioBase64, mimeType } = event.data;
128
134
  try {
129
- const audioData = Uint8Array.from(atob(audioBase64), c => c.charCodeAt(0));
135
+ const audioData = Uint8Array.from(atob(audioBase64), (c) => c.charCodeAt(0));
130
136
  const blob = new Blob([audioData], { type: mimeType });
131
137
  const url = URL.createObjectURL(blob);
132
138
  const audio = new Audio(url);
@@ -141,7 +147,7 @@ const VoiceIndicator = ({ position = 'bottom-right', showTranscription = true, }
141
147
  await audio.play();
142
148
  }
143
149
  catch (e) {
144
- console.error('Failed to play audio:', e);
150
+ console.error("Failed to play audio:", e);
145
151
  currentAudioRef.current = null;
146
152
  // Still notify on error so we don't hang
147
153
  peers_sdk_1.rpcServerCalls.voiceNotifyPlaybackComplete?.().catch(() => { });
@@ -155,124 +161,105 @@ const VoiceIndicator = ({ position = 'bottom-right', showTranscription = true, }
155
161
  }, []);
156
162
  const handleClick = (0, react_1.useCallback)(async () => {
157
163
  try {
158
- if (state === 'disabled') {
164
+ if (state === "disabled") {
159
165
  // Open settings
160
- window.location.hash = '#/settings/voice';
166
+ window.location.hash = "#/settings/voice";
161
167
  return;
162
168
  }
163
- if (state === 'recording') {
169
+ if (state === "recording") {
164
170
  await peers_sdk_1.rpcServerCalls.voiceStopRecording();
165
171
  }
166
- else if (state === 'speaking') {
172
+ else if (state === "speaking") {
167
173
  await peers_sdk_1.rpcServerCalls.voiceStopPlayback();
168
174
  }
169
- else if (state === 'idle' || state === 'listening') {
175
+ else if (state === "idle" || state === "listening") {
170
176
  await peers_sdk_1.rpcServerCalls.voiceStartRecording();
171
177
  }
172
178
  }
173
179
  catch (e) {
174
- console.error('Voice action failed:', e);
180
+ console.error("Voice action failed:", e);
175
181
  }
176
182
  }, [state]);
177
183
  const getIcon = () => {
178
184
  switch (state) {
179
- case 'disabled':
180
- return 'bi-mic-mute';
181
- case 'idle':
182
- return 'bi-mic';
183
- case 'listening':
184
- return 'bi-ear';
185
- case 'recording':
186
- return 'bi-mic-fill';
187
- case 'processing':
188
- return 'bi-hourglass-split';
189
- case 'speaking':
190
- return 'bi-volume-up-fill';
185
+ case "disabled":
186
+ return "bi-mic-mute";
187
+ case "idle":
188
+ return "bi-mic";
189
+ case "listening":
190
+ return "bi-ear";
191
+ case "recording":
192
+ return "bi-mic-fill";
193
+ case "processing":
194
+ return "bi-hourglass-split";
195
+ case "speaking":
196
+ return "bi-volume-up-fill";
191
197
  default:
192
- return 'bi-mic';
198
+ return "bi-mic";
193
199
  }
194
200
  };
195
201
  const getStateText = () => {
196
202
  switch (state) {
197
- case 'disabled':
198
- return 'Voice disabled';
199
- case 'idle':
203
+ case "disabled":
204
+ return "Voice disabled";
205
+ case "idle":
200
206
  return 'Say "Porcupine" or click';
201
- case 'listening':
202
- return 'Listening...';
203
- case 'recording':
204
- return 'Recording...';
205
- case 'processing':
206
- return 'Processing...';
207
- case 'speaking':
208
- return 'Speaking... (click to stop)';
207
+ case "listening":
208
+ return "Listening...";
209
+ case "recording":
210
+ return "Recording...";
211
+ case "processing":
212
+ return "Processing...";
213
+ case "speaking":
214
+ return "Speaking... (click to stop)";
209
215
  default:
210
- return '';
216
+ return "";
211
217
  }
212
218
  };
213
219
  const getButtonClass = () => {
214
- const base = 'btn rounded-circle shadow';
220
+ const base = "btn rounded-circle shadow";
215
221
  switch (state) {
216
- case 'disabled':
222
+ case "disabled":
217
223
  return `${base} btn-secondary`;
218
- case 'idle':
224
+ case "idle":
219
225
  return `${base} btn-outline-primary`;
220
- case 'listening':
226
+ case "listening":
221
227
  return `${base} btn-info`;
222
- case 'recording':
228
+ case "recording":
223
229
  return `${base} btn-danger`;
224
- case 'processing':
230
+ case "processing":
225
231
  return `${base} btn-warning`;
226
- case 'speaking':
232
+ case "speaking":
227
233
  return `${base} btn-success`;
228
234
  default:
229
235
  return `${base} btn-secondary`;
230
236
  }
231
237
  };
232
238
  const positionStyles = {
233
- position: 'fixed',
239
+ position: "fixed",
234
240
  zIndex: 1050,
235
- ...(position.includes('bottom') ? { bottom: '20px' } : { top: '70px' }),
236
- ...(position.includes('right') ? { right: '20px' } : { left: '20px' }),
241
+ ...(position.includes("bottom") ? { bottom: "20px" } : { top: "70px" }),
242
+ ...(position.includes("right") ? { right: "20px" } : { left: "20px" }),
237
243
  };
238
244
  // Don't render if disabled and not showing
239
245
  // Actually, let's always show so users can click to enable
240
- return (react_1.default.createElement("div", { style: positionStyles },
241
- isExpanded && state !== 'disabled' && (react_1.default.createElement("div", { className: "card shadow mb-2", style: {
242
- width: '280px',
243
- backgroundColor: 'var(--bs-body-bg)',
244
- } },
245
- react_1.default.createElement("div", { className: "card-body py-2 px-3" },
246
- react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-center mb-2" },
247
- react_1.default.createElement("small", { className: "text-muted" }, getStateText()),
248
- react_1.default.createElement("button", { className: "btn btn-sm btn-link p-0", onClick: () => setIsExpanded(false) },
249
- react_1.default.createElement("i", { className: "bi bi-x" }))),
250
- state === 'recording' && (react_1.default.createElement("div", { className: "progress mb-2", style: { height: '4px' } },
251
- react_1.default.createElement("div", { className: "progress-bar bg-danger", style: { width: `${Math.min(100, volumeLevel * 500)}%` } }))),
252
- showTranscription && transcription && (react_1.default.createElement("div", { className: "small" },
253
- react_1.default.createElement("i", { className: "bi bi-quote me-1" }),
254
- transcription)),
255
- error && (react_1.default.createElement("div", { className: "small text-danger" },
256
- react_1.default.createElement("i", { className: "bi bi-exclamation-triangle me-1" }),
257
- error))))),
258
- react_1.default.createElement("button", { className: getButtonClass(), style: {
259
- width: '56px',
260
- height: '56px',
261
- fontSize: '24px',
262
- transition: 'all 0.2s ease',
263
- }, onClick: handleClick, title: getStateText() },
264
- react_1.default.createElement("i", { className: `bi ${getIcon()}` }),
265
- (state === 'listening' || state === 'recording') && (react_1.default.createElement("span", { className: "position-absolute", style: {
266
- top: 0,
267
- left: 0,
268
- right: 0,
269
- bottom: 0,
270
- borderRadius: '50%',
271
- border: '2px solid currentColor',
272
- animation: 'pulse 1.5s ease-out infinite',
273
- } })),
274
- state === 'processing' && (react_1.default.createElement("span", { className: "spinner-border spinner-border-sm position-absolute", style: { top: '4px', right: '4px' } }))),
275
- react_1.default.createElement("style", null, `
246
+ return ((0, jsx_runtime_1.jsxs)("div", { style: positionStyles, children: [isExpanded && state !== "disabled" && ((0, jsx_runtime_1.jsx)("div", { className: "card shadow mb-2", style: {
247
+ width: "280px",
248
+ backgroundColor: "var(--bs-body-bg)",
249
+ }, children: (0, jsx_runtime_1.jsxs)("div", { className: "card-body py-2 px-3", children: [(0, jsx_runtime_1.jsxs)("div", { className: "d-flex justify-content-between align-items-center mb-2", children: [(0, jsx_runtime_1.jsx)("small", { className: "text-muted", children: getStateText() }), (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-x" }) })] }), state === "recording" && ((0, jsx_runtime_1.jsx)("div", { className: "progress mb-2", style: { height: "4px" }, children: (0, jsx_runtime_1.jsx)("div", { className: "progress-bar bg-danger", style: { width: `${Math.min(100, volumeLevel * 500)}%` } }) })), showTranscription && transcription && ((0, jsx_runtime_1.jsxs)("div", { className: "small", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi bi-quote me-1" }), transcription] })), error && ((0, jsx_runtime_1.jsxs)("div", { className: "small text-danger", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi bi-exclamation-triangle me-1" }), error] }))] }) })), (0, jsx_runtime_1.jsxs)("button", { className: getButtonClass(), style: {
250
+ width: "56px",
251
+ height: "56px",
252
+ fontSize: "24px",
253
+ transition: "all 0.2s ease",
254
+ }, onClick: handleClick, title: getStateText(), children: [(0, jsx_runtime_1.jsx)("i", { className: `bi ${getIcon()}` }), (state === "listening" || state === "recording") && ((0, jsx_runtime_1.jsx)("span", { className: "position-absolute", style: {
255
+ top: 0,
256
+ left: 0,
257
+ right: 0,
258
+ bottom: 0,
259
+ borderRadius: "50%",
260
+ border: "2px solid currentColor",
261
+ animation: "pulse 1.5s ease-out infinite",
262
+ } })), state === "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)("style", { children: `
276
263
  @keyframes pulse {
277
264
  0% {
278
265
  transform: scale(1);
@@ -283,7 +270,7 @@ const VoiceIndicator = ({ position = 'bottom-right', showTranscription = true, }
283
270
  opacity: 0;
284
271
  }
285
272
  }
286
- `)));
273
+ ` })] }));
287
274
  };
288
275
  exports.VoiceIndicator = VoiceIndicator;
289
276
  exports.default = exports.VoiceIndicator;
@@ -0,0 +1,32 @@
1
+ import type { IMessage } from "@peers-app/peers-sdk";
2
+ /** Shape passed to `subscribe` handlers for voice / chat IPC events */
3
+ export type VoiceSubscribeEvent<T> = {
4
+ data: T;
5
+ };
6
+ export type ChatOpenWithMessagePayload = {
7
+ message?: IMessage;
8
+ };
9
+ export type VoiceStatePayload = {
10
+ state: string;
11
+ };
12
+ export type VoiceTranscriptionPayload = {
13
+ text: string;
14
+ };
15
+ export type VoiceVolumePayload = {
16
+ level: number;
17
+ };
18
+ export type VoiceErrorPayload = {
19
+ message: string;
20
+ };
21
+ export type VoiceThreadPayload = {
22
+ threadId: string;
23
+ };
24
+ export type VoiceSpeakPayload = {
25
+ text: string;
26
+ voice?: string;
27
+ rate?: number;
28
+ };
29
+ export type VoicePlayAudioPayload = {
30
+ audioBase64: string;
31
+ mimeType: string;
32
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/dist/globals.d.ts CHANGED
@@ -1,10 +1,8 @@
1
- import { IMessage, IUser, PersistentVar } from "@peers-app/peers-sdk";
1
+ import { type IMessage, type IUser } from "@peers-app/peers-sdk";
2
2
  export declare const packageReloaded: import("@peers-app/peers-sdk").Observable<number>;
3
- export declare const _mainContentPath: PersistentVar<string>;
3
+ export declare const _mainContentPath: import("@peers-app/peers-sdk").PersistentVar<string>;
4
4
  export declare const mainContentPath: import("@peers-app/peers-sdk").Observable<string>;
5
5
  export declare function queryParam(name: string, value?: string): string;
6
- export declare const openThreads: PersistentVar<(string | IMessage)[]>;
7
- export declare const threadViewOpen: PersistentVar<boolean>;
8
6
  export declare function openThread(thread: string | IMessage): Promise<void>;
9
7
  export declare function openThreadInTab(thread: string | IMessage): Promise<void>;
10
8
  export declare let me: IUser;
@@ -16,9 +14,9 @@ export declare const groups: import("@peers-app/peers-sdk").Observable<{
16
14
  description: string;
17
15
  publicKey: string;
18
16
  signature: string;
19
- publicBoxKey: string;
20
17
  groupId: string;
21
18
  founderUserId: string;
19
+ publicBoxKey: string;
22
20
  disabled?: boolean | undefined;
23
21
  iconClassName?: string | undefined;
24
22
  publicRole?: import("@peers-app/peers-sdk").GroupMemberRole | undefined;