@elizaos/ui 2.0.3-beta.2 → 2.0.3-beta.4

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 (1719) hide show
  1. package/App.d.ts +6 -1
  2. package/App.d.ts.map +1 -1
  3. package/App.js +250 -49
  4. package/agent-surface/AgentSurfaceContext.d.ts +1 -1
  5. package/agent-surface/AgentSurfaceContext.hooks.d.ts +2 -2
  6. package/agent-surface/__e2e__/real-view-fixture.d.ts +21 -0
  7. package/agent-surface/__e2e__/real-view-fixture.d.ts.map +1 -0
  8. package/agent-surface/__e2e__/real-view-fixture.js +54 -0
  9. package/agent-surface/capabilities.d.ts +2 -2
  10. package/agent-surface/components.d.ts +1 -1
  11. package/agent-surface/element-reporter.hooks.d.ts +1 -1
  12. package/agent-surface/index.d.ts +10 -10
  13. package/agent-surface/registry.d.ts +1 -1
  14. package/agent-surface/useAgentElement.d.ts +1 -1
  15. package/api/android-native-agent-transport.d.ts +1 -1
  16. package/api/client-agent.d.ts +16 -2
  17. package/api/client-agent.d.ts.map +1 -1
  18. package/api/client-agent.js +13 -3
  19. package/api/client-approvals.d.ts +16 -0
  20. package/api/client-approvals.d.ts.map +1 -0
  21. package/api/client-approvals.js +4 -0
  22. package/api/client-automations.d.ts +1 -1
  23. package/api/client-background.d.ts +15 -0
  24. package/api/client-background.d.ts.map +1 -0
  25. package/api/client-background.js +10 -0
  26. package/api/client-base.d.ts +13 -3
  27. package/api/client-base.d.ts.map +1 -1
  28. package/api/client-base.js +99 -6
  29. package/api/client-browser-workspace.d.ts +1 -1
  30. package/api/client-chat.d.ts +8 -3
  31. package/api/client-chat.d.ts.map +1 -1
  32. package/api/client-chat.js +13 -4
  33. package/api/client-cloud.d.ts +3 -3
  34. package/api/client-cloud.d.ts.map +1 -1
  35. package/api/client-cloud.js +19 -13
  36. package/api/client-files.d.ts +36 -0
  37. package/api/client-files.d.ts.map +1 -0
  38. package/api/client-files.js +19 -0
  39. package/api/client-local-inference.d.ts +52 -6
  40. package/api/client-local-inference.d.ts.map +1 -1
  41. package/api/client-local-inference.js +78 -5
  42. package/api/client-skills.d.ts +3 -3
  43. package/api/client-transcripts.d.ts +8 -0
  44. package/api/client-transcripts.d.ts.map +1 -1
  45. package/api/client-transcripts.js +6 -0
  46. package/api/client-types-chat.d.ts +53 -2
  47. package/api/client-types-chat.d.ts.map +1 -1
  48. package/api/client-types-cloud.d.ts +3 -151
  49. package/api/client-types-cloud.d.ts.map +1 -1
  50. package/api/client-types-config.d.ts +13 -6
  51. package/api/client-types-config.d.ts.map +1 -1
  52. package/api/client-types-core.d.ts +1 -1
  53. package/api/client-types-feed.d.ts +0 -14
  54. package/api/client-types-feed.d.ts.map +1 -1
  55. package/api/client-types.d.ts +8 -8
  56. package/api/client-wallet.d.ts +3 -3
  57. package/api/client-workflow.d.ts +1 -1
  58. package/api/client.d.ts +31 -27
  59. package/api/client.d.ts.map +1 -1
  60. package/api/client.js +3 -0
  61. package/api/desktop-http-transport.d.ts +1 -1
  62. package/api/desktop-http-transport.d.ts.map +1 -1
  63. package/api/desktop-http-transport.js +29 -1
  64. package/api/i18n-locale-client.d.ts +1 -1
  65. package/api/index.d.ts +2 -2
  66. package/api/ios-local-agent-kernel.d.ts +1 -1
  67. package/api/ios-local-agent-kernel.d.ts.map +1 -1
  68. package/api/ios-local-agent-kernel.js +97 -22
  69. package/api/ios-local-agent-transport.d.ts +1 -1
  70. package/api/ios-local-agent-transport.d.ts.map +1 -1
  71. package/api/ios-local-agent-transport.js +1 -7
  72. package/api/ittp-agent-transport.d.ts +1 -1
  73. package/api/native-cloud-http-transport.d.ts +1 -1
  74. package/api/native-cloud-http-transport.d.ts.map +1 -1
  75. package/api/native-cloud-http-transport.js +7 -0
  76. package/app-navigate-view.d.ts +1 -1
  77. package/app-navigate-view.d.ts.map +1 -1
  78. package/app-navigate-view.js +1 -4
  79. package/app-shell-components.d.ts +26 -27
  80. package/app-shell-components.d.ts.map +1 -1
  81. package/app-shell-components.js +3 -1
  82. package/app-shell-registry.d.ts +12 -1
  83. package/app-shell-registry.d.ts.map +1 -1
  84. package/backgrounds/AppBackground.d.ts +16 -0
  85. package/backgrounds/AppBackground.d.ts.map +1 -0
  86. package/backgrounds/AppBackground.js +30 -0
  87. package/backgrounds/ImageBackground.d.ts +12 -0
  88. package/backgrounds/ImageBackground.d.ts.map +1 -0
  89. package/backgrounds/ImageBackground.js +15 -0
  90. package/backgrounds/ShaderBackground.d.ts +12 -0
  91. package/backgrounds/ShaderBackground.d.ts.map +1 -0
  92. package/backgrounds/ShaderBackground.js +39 -0
  93. package/backgrounds/index.d.ts +7 -3
  94. package/backgrounds/index.d.ts.map +1 -1
  95. package/backgrounds/index.js +4 -0
  96. package/backgrounds/useBackgroundApplyChannel.d.ts +21 -0
  97. package/backgrounds/useBackgroundApplyChannel.d.ts.map +1 -0
  98. package/backgrounds/useBackgroundApplyChannel.js +53 -0
  99. package/bridge/capacitor-bridge.d.ts +1 -1
  100. package/bridge/index.d.ts +6 -6
  101. package/bridge/native-notifications.d.ts.map +1 -1
  102. package/bridge/native-notifications.js +6 -1
  103. package/bridge/native-plugins.d.ts +20 -1
  104. package/bridge/native-plugins.d.ts.map +1 -1
  105. package/bridge/plugin-bridge.d.ts +1 -1
  106. package/browser.d.ts +131 -131
  107. package/cache-telemetry.d.ts +2 -0
  108. package/cache-telemetry.d.ts.map +1 -1
  109. package/character/character-draft-helpers.d.ts +1 -1
  110. package/character-catalog.d.ts +1 -1
  111. package/chat/coding-agent-session-state.d.ts +1 -1
  112. package/chat/index.d.ts +24 -4
  113. package/chat/index.d.ts.map +1 -1
  114. package/chat/index.js +59 -6
  115. package/chat/slash-menu.d.ts +37 -2
  116. package/chat/slash-menu.d.ts.map +1 -1
  117. package/chat/slash-menu.js +220 -0
  118. package/chat/useSlashCommandController.d.ts +35 -2
  119. package/chat/useSlashCommandController.d.ts.map +1 -1
  120. package/chat/useSlashCommandController.js +64 -8
  121. package/cloud/account-security/AccountRoute.js +1 -1
  122. package/cloud/account-security/PermissionsRoute.js +1 -1
  123. package/cloud/account-security/SecurityRoute.js +1 -1
  124. package/cloud/account-security/components/account-details.d.ts +1 -1
  125. package/cloud/account-security/components/account-page-client.d.ts +1 -1
  126. package/cloud/account-security/components/organization-info.d.ts +1 -1
  127. package/cloud/account-security/components/profile-form.d.ts +1 -1
  128. package/cloud/account-security/components/profile-form.js +2 -2
  129. package/cloud/account-security/data/use-session-auth.d.ts +1 -1
  130. package/cloud/account-security/index.d.ts +8 -8
  131. package/cloud/admin/ModerationPage.js +1 -1
  132. package/cloud/admin/RedemptionsPage.js +2 -2
  133. package/cloud/admin/RpcStatusPage.js +1 -1
  134. package/cloud/admin/index.d.ts +6 -6
  135. package/cloud/analytics/_components/filters.js +1 -1
  136. package/cloud/analytics/_components/model-breakdown.js +2 -2
  137. package/cloud/analytics/_components/projections-chart.js +2 -2
  138. package/cloud/analytics/_components/provider-breakdown.js +2 -2
  139. package/cloud/analytics/index.d.ts +3 -3
  140. package/cloud/api-explorer/ApiExplorerPage.js +2 -2
  141. package/cloud/api-explorer/api-tester.d.ts.map +1 -1
  142. package/cloud/api-explorer/api-tester.js +15 -8
  143. package/cloud/api-explorer/auth-manager.d.ts +1 -1
  144. package/cloud/api-explorer/auth-manager.js +1 -1
  145. package/cloud/api-explorer/index.d.ts +5 -5
  146. package/cloud/api-explorer/use-session-auth.d.ts +1 -1
  147. package/cloud/api-keys/ApiKeysRoute.js +1 -1
  148. package/cloud/api-keys/ApiKeysView.d.ts +1 -1
  149. package/cloud/api-keys/ApiKeysView.js +5 -5
  150. package/cloud/api-keys/index.d.ts +6 -6
  151. package/cloud/applications/ApplicationDetailPage.js +1 -1
  152. package/cloud/applications/ApplicationsPage.js +1 -1
  153. package/cloud/applications/components/app-analytics.d.ts.map +1 -1
  154. package/cloud/applications/components/app-analytics.js +12 -20
  155. package/cloud/applications/components/app-details-tabs.d.ts +1 -1
  156. package/cloud/applications/components/app-details-tabs.js +1 -1
  157. package/cloud/applications/components/app-domains.d.ts.map +1 -1
  158. package/cloud/applications/components/app-domains.js +5 -2
  159. package/cloud/applications/components/app-overview.d.ts +1 -1
  160. package/cloud/applications/components/app-overview.d.ts.map +1 -1
  161. package/cloud/applications/components/app-overview.js +120 -3
  162. package/cloud/applications/components/app-promote.d.ts +1 -1
  163. package/cloud/applications/components/app-promote.d.ts.map +1 -1
  164. package/cloud/applications/components/app-promote.js +13 -4
  165. package/cloud/applications/components/app-settings.d.ts +1 -1
  166. package/cloud/applications/components/app-settings.js +5 -5
  167. package/cloud/applications/components/apps-table.d.ts +1 -1
  168. package/cloud/applications/components/create-app-dialog.js +1 -1
  169. package/cloud/applications/components/withdraw-dialog.js +1 -1
  170. package/cloud/applications/index.d.ts +5 -5
  171. package/cloud/applications/lib/apps.d.ts +25 -0
  172. package/cloud/applications/lib/apps.d.ts.map +1 -1
  173. package/cloud/applications/lib/apps.js +17 -1
  174. package/cloud/approvals/ApprovalsRoute.js +1 -1
  175. package/cloud/approvals/index.d.ts +3 -3
  176. package/cloud/approvals/lib/approvals.d.ts.map +1 -1
  177. package/cloud/approvals/lib/approvals.js +1 -1
  178. package/cloud/billing/components/billing-tab.d.ts +1 -1
  179. package/cloud/billing/components/direct-crypto-credit-card.d.ts +1 -1
  180. package/cloud/billing/components/direct-crypto-credit-card.js +1 -1
  181. package/cloud/billing/components/invoice-detail-client.d.ts +1 -1
  182. package/cloud/billing/components/payment-waiting-overlay.js +1 -1
  183. package/cloud/billing/data/billing-data.d.ts +2 -2
  184. package/cloud/billing/index.d.ts +9 -9
  185. package/cloud/billing/use-session-auth.d.ts +1 -1
  186. package/cloud/connectors/index.d.ts +10 -10
  187. package/cloud/documents/DocumentsRoute.js +2 -2
  188. package/cloud/documents/index.d.ts +7 -7
  189. package/cloud/documents/lib/agents.d.ts.map +1 -1
  190. package/cloud/documents/lib/agents.js +1 -1
  191. package/cloud/handoff/cloud-handoff-supervisor.d.ts +1 -1
  192. package/cloud/handoff/run-cloud-agent-handoff.d.ts +18 -0
  193. package/cloud/handoff/run-cloud-agent-handoff.d.ts.map +1 -0
  194. package/cloud/handoff/run-cloud-agent-handoff.js +51 -0
  195. package/cloud/index.d.ts +4 -4
  196. package/cloud/instances/AgentChatPage.js +2 -2
  197. package/cloud/instances/AgentDetailPage.js +1 -1
  198. package/cloud/instances/AgentsPage.js +1 -1
  199. package/cloud/instances/MyAgentsPage.js +1 -1
  200. package/cloud/instances/components/agent-actions.js +1 -1
  201. package/cloud/instances/components/agent-card.d.ts +3 -1
  202. package/cloud/instances/components/agent-card.d.ts.map +1 -1
  203. package/cloud/instances/components/agent-card.js +10 -6
  204. package/cloud/instances/components/character-filters.d.ts +1 -1
  205. package/cloud/instances/components/character-filters.js +1 -1
  206. package/cloud/instances/components/character-library-grid.d.ts +1 -1
  207. package/cloud/instances/components/create-eliza-agent-dialog.js +3 -3
  208. package/cloud/instances/components/docker-logs-viewer.d.ts.map +1 -1
  209. package/cloud/instances/components/docker-logs-viewer.js +13 -12
  210. package/cloud/instances/components/eliza-agent-backups-panel.js +2 -2
  211. package/cloud/instances/components/eliza-agents-table.js +1 -1
  212. package/cloud/instances/components/eliza-wallet-section.d.ts.map +1 -1
  213. package/cloud/instances/components/eliza-wallet-section.js +3 -5
  214. package/cloud/instances/components/my-agents.d.ts.map +1 -1
  215. package/cloud/instances/components/my-agents.js +5 -5
  216. package/cloud/instances/index.d.ts +6 -6
  217. package/cloud/instances/lib/i18n.d.ts +1 -1
  218. package/cloud/instances/lib/use-job-poller.d.ts.map +1 -1
  219. package/cloud/instances/lib/use-job-poller.js +4 -0
  220. package/cloud/instances/lib/use-sandbox-status-poll.d.ts.map +1 -1
  221. package/cloud/instances/lib/use-sandbox-status-poll.js +6 -0
  222. package/cloud/instances/lib/use-session-auth.d.ts +1 -1
  223. package/cloud/join/index.d.ts +5 -5
  224. package/cloud/lib/auth-query.d.ts +19 -0
  225. package/cloud/lib/auth-query.d.ts.map +1 -0
  226. package/cloud/{documents/lib → lib}/auth-query.js +7 -5
  227. package/cloud/lib/format-usd.d.ts +9 -0
  228. package/cloud/lib/format-usd.d.ts.map +1 -0
  229. package/cloud/lib/format-usd.js +16 -0
  230. package/cloud/lib/use-copy-feedback.d.ts +5 -0
  231. package/cloud/lib/use-copy-feedback.d.ts.map +1 -0
  232. package/cloud/{instances/lib → lib}/use-copy-feedback.js +2 -0
  233. package/cloud/lib/use-document-title.d.ts +2 -0
  234. package/cloud/lib/use-document-title.d.ts.map +1 -0
  235. package/cloud/{admin → lib}/use-document-title.js +4 -5
  236. package/cloud/lib/use-session-auth.d.ts +31 -0
  237. package/cloud/lib/use-session-auth.d.ts.map +1 -0
  238. package/cloud/{applications/lib → lib}/use-session-auth.js +14 -11
  239. package/cloud/mcps/McpDetailDrawer.d.ts +1 -1
  240. package/cloud/mcps/McpEditorDialog.d.ts +1 -1
  241. package/cloud/mcps/McpsView.d.ts.map +1 -1
  242. package/cloud/mcps/McpsView.js +20 -13
  243. package/cloud/mcps/index.d.ts +10 -10
  244. package/cloud/mcps/lib/mcp-mutations.d.ts +1 -1
  245. package/cloud/mcps/lib/use-mcps.d.ts +1 -1
  246. package/cloud/monetization/affiliates/AffiliatesRoute.js +1 -1
  247. package/cloud/monetization/affiliates/use-dashboard-referral-me.d.ts +1 -1
  248. package/cloud/monetization/earnings/EarningsPageClient.js +1 -1
  249. package/cloud/monetization/earnings/EarningsRoute.js +1 -1
  250. package/cloud/monetization/index.d.ts +8 -8
  251. package/cloud/organization/data/use-organization.d.ts +1 -1
  252. package/cloud/organization/index.d.ts +11 -11
  253. package/cloud/organization/members-list.d.ts +1 -1
  254. package/cloud/organization/members-tab.d.ts +1 -1
  255. package/cloud/organization/organization-general-tab.d.ts +1 -1
  256. package/cloud/organization/organization-tab.d.ts +1 -1
  257. package/cloud/organization/pending-invites-list.d.ts +1 -1
  258. package/cloud/public-pages/index.d.ts +21 -21
  259. package/cloud/public-pages/lib/use-session-auth.d.ts +1 -1
  260. package/cloud/public-pages/pages/auth/cli-login-page.d.ts.map +1 -1
  261. package/cloud/public-pages/pages/auth/cli-login-page.js +46 -9
  262. package/cloud/public-pages/pages/bsc-page.js +5 -5
  263. package/cloud/public-pages/pages/login/steward-login-section.js +2 -2
  264. package/cloud/public-pages/pages/payment/app-charge-page.js +1 -1
  265. package/cloud/public-pages/pages/payment/payment-request-page.js +1 -1
  266. package/cloud/register-all.d.ts +5 -5
  267. package/cloud/settings/index.d.ts +4 -4
  268. package/cloud/settings/sections.js +1 -1
  269. package/cloud/shell/CloudI18nProvider.d.ts +1 -1
  270. package/cloud/shell/StewardProvider.d.ts +1 -31
  271. package/cloud/shell/StewardProvider.d.ts.map +1 -1
  272. package/cloud/shell/StewardProvider.js +3 -122
  273. package/cloud/shell/StewardProviderRuntime.d.ts.map +1 -1
  274. package/cloud/shell/StewardProviderRuntime.js +17 -7
  275. package/cloud/shell/StewardProviderShared.d.ts +27 -0
  276. package/cloud/shell/StewardProviderShared.d.ts.map +1 -0
  277. package/cloud/shell/StewardProviderShared.js +112 -0
  278. package/cloud-ui/components/ai-elements/index.d.ts +3 -3
  279. package/cloud-ui/components/ai-elements/memoized-chat-message.d.ts +1 -1
  280. package/cloud-ui/components/ai-elements/memoized-chat-message.d.ts.map +1 -1
  281. package/cloud-ui/components/ai-elements/memoized-chat-message.js +162 -139
  282. package/cloud-ui/components/analytics/cost-alerts.d.ts +1 -1
  283. package/cloud-ui/components/analytics/cost-insights-card.d.ts +1 -1
  284. package/cloud-ui/components/analytics/index.d.ts +3 -3
  285. package/cloud-ui/components/auth/authorize-content.js +1 -1
  286. package/cloud-ui/components/brand/brand-button.d.ts +1 -1
  287. package/cloud-ui/components/brand/brand-button.js +1 -1
  288. package/cloud-ui/components/brand/brand-tabs-responsive.d.ts.map +1 -1
  289. package/cloud-ui/components/brand/brand-tabs-responsive.js +1 -1
  290. package/cloud-ui/components/brand/brand-tabs.d.ts.map +1 -1
  291. package/cloud-ui/components/brand/brand-tabs.js +2 -2
  292. package/cloud-ui/components/brand/index.d.ts +21 -21
  293. package/cloud-ui/components/brand/lock-on-button.d.ts +2 -2
  294. package/cloud-ui/components/brand/lock-on-button.variants.d.ts +1 -1
  295. package/cloud-ui/components/brand/lock-on-button.variants.js +1 -1
  296. package/cloud-ui/components/code/code-display.d.ts +1 -1
  297. package/cloud-ui/components/code/code-display.d.ts.map +1 -1
  298. package/cloud-ui/components/code/code-display.js +11 -9
  299. package/cloud-ui/components/code/index.d.ts +3 -3
  300. package/cloud-ui/components/data-list/apps-list-view.js +1 -1
  301. package/cloud-ui/components/data-list/index.d.ts +8 -8
  302. package/cloud-ui/components/data-list/list-action-menu.js +1 -1
  303. package/cloud-ui/components/docs/api-parameter-select.js +1 -1
  304. package/cloud-ui/components/docs/api-route-explorer-client.d.ts +1 -1
  305. package/cloud-ui/components/docs/api-route-explorer-client.js +1 -1
  306. package/cloud-ui/components/docs/docs-layout.d.ts +1 -1
  307. package/cloud-ui/components/docs/index.d.ts +11 -11
  308. package/cloud-ui/components/drawer.js +1 -1
  309. package/cloud-ui/components/image-gen/index.d.ts +4 -4
  310. package/cloud-ui/components/image-gen/prompt-input.js +1 -1
  311. package/cloud-ui/components/layout/dashboard-route-page.d.ts +1 -1
  312. package/cloud-ui/components/layout/dashboard-sidebar-item.d.ts +1 -1
  313. package/cloud-ui/components/layout/dashboard-sidebar-section.d.ts +1 -1
  314. package/cloud-ui/components/layout/dashboard-sidebar.d.ts +1 -1
  315. package/cloud-ui/components/layout/dashboard-sidebar.js +1 -1
  316. package/cloud-ui/components/layout/index.d.ts +11 -11
  317. package/cloud-ui/components/log-viewer.d.ts +1 -1
  318. package/cloud-ui/components/log-viewer.d.ts.map +1 -1
  319. package/cloud-ui/components/log-viewer.js +5 -2
  320. package/cloud-ui/components/monetization/animated-counter.d.ts.map +1 -1
  321. package/cloud-ui/components/monetization/animated-counter.js +4 -2
  322. package/cloud-ui/components/monetization/index.d.ts +4 -4
  323. package/cloud-ui/components/primitives.d.ts +57 -57
  324. package/cloud-ui/components/product-switcher.js +1 -1
  325. package/cloud-ui/components/resizable.d.ts.map +1 -1
  326. package/cloud-ui/components/resizable.js +23 -3
  327. package/cloud-ui/components/share/index.d.ts +1 -1
  328. package/cloud-ui/components/theme/index.d.ts +3 -3
  329. package/cloud-ui/components/theme/theme-provider.d.ts +2 -2
  330. package/cloud-ui/components/timeline.d.ts.map +1 -1
  331. package/cloud-ui/components/timeline.js +6 -6
  332. package/cloud-ui/components/voice/index.d.ts +8 -8
  333. package/cloud-ui/index.d.ts +30 -30
  334. package/cloud-ui/lib/utils.d.ts +1 -1
  335. package/companion/desktop-bar/CompanionBar.d.ts +1 -1
  336. package/companion/desktop-bar/CompanionBar.d.ts.map +1 -1
  337. package/companion/desktop-bar/CompanionBar.js +11 -8
  338. package/companion/desktop-bar/index.d.ts +6 -6
  339. package/companion/desktop-bar/platform/electrobun-tray.d.ts +19 -0
  340. package/companion/desktop-bar/platform/electrobun-tray.d.ts.map +1 -1
  341. package/companion/desktop-bar/platform/index.d.ts +2 -2
  342. package/companion/desktop-bar/platform/index.d.ts.map +1 -1
  343. package/companion/desktop-bar/platform/web-fallback.d.ts +1 -1
  344. package/companion/desktop-bar/useKeyboardShortcuts.d.ts +1 -1
  345. package/components/accounts/AccountCard.d.ts +1 -1
  346. package/components/accounts/AccountCard.js +2 -2
  347. package/components/accounts/AccountList.js +2 -2
  348. package/components/accounts/AddAccountDialog.d.ts.map +1 -1
  349. package/components/accounts/AddAccountDialog.js +11 -3
  350. package/components/accounts/RotationStrategyPicker.d.ts +1 -1
  351. package/components/accounts/RotationStrategyPicker.js +2 -2
  352. package/components/apps/AppWindowRenderer.d.ts.map +1 -1
  353. package/components/apps/AppWindowRenderer.helpers.d.ts +1 -1
  354. package/components/apps/AppWindowRenderer.js +23 -10
  355. package/components/apps/AppsCatalogGrid.d.ts +1 -1
  356. package/components/apps/AppsCatalogGrid.d.ts.map +1 -1
  357. package/components/apps/AppsCatalogGrid.js +16 -23
  358. package/components/apps/AppsSidebar.d.ts +1 -1
  359. package/components/apps/AppsSidebar.d.ts.map +1 -1
  360. package/components/apps/AppsSidebar.js +22 -11
  361. package/components/apps/GameView.d.ts.map +1 -1
  362. package/components/apps/GameView.helpers.d.ts +1 -1
  363. package/components/apps/GameView.js +55 -20
  364. package/components/apps/GameViewOverlay.d.ts.map +1 -1
  365. package/components/apps/GameViewOverlay.js +38 -4
  366. package/components/apps/RunningAppsRow.d.ts +1 -1
  367. package/components/apps/RunningAppsRow.d.ts.map +1 -1
  368. package/components/apps/RunningAppsRow.js +12 -10
  369. package/components/apps/app-identity.helpers.d.ts +1 -1
  370. package/components/apps/app-identity.js +1 -1
  371. package/components/apps/catalog-loader.d.ts +1 -1
  372. package/components/apps/extensions/registry.d.ts +2 -2
  373. package/components/apps/extensions/surface.d.ts +2 -2
  374. package/components/apps/extensions/surface.d.ts.map +1 -1
  375. package/components/apps/extensions/surface.helpers.d.ts +2 -2
  376. package/components/apps/extensions/surface.js +9 -9
  377. package/components/apps/extensions/types.d.ts +1 -1
  378. package/components/apps/helpers.d.ts +8 -5
  379. package/components/apps/helpers.d.ts.map +1 -1
  380. package/components/apps/helpers.js +5 -10
  381. package/components/apps/home-grid-apps.d.ts +2 -2
  382. package/components/apps/internal-tool-apps.d.ts +2 -2
  383. package/components/apps/internal-tool-apps.d.ts.map +1 -1
  384. package/components/apps/internal-tool-apps.js +18 -8
  385. package/components/apps/launch-history.d.ts +1 -1
  386. package/components/apps/load-apps-catalog.d.ts +1 -1
  387. package/components/apps/overlay-app-registry.d.ts +5 -2
  388. package/components/apps/overlay-app-registry.d.ts.map +1 -1
  389. package/components/apps/overlay-app-registry.js +3 -6
  390. package/components/apps/run-attention.d.ts +1 -1
  391. package/components/apps/surfaces/registry.d.ts +1 -1
  392. package/components/apps/useRegistryCatalog.d.ts +1 -1
  393. package/components/apps/viewer-auth.d.ts +1 -1
  394. package/components/auth/LoginView.d.ts +1 -1
  395. package/components/auth/LoginView.js +1 -1
  396. package/components/character/CharacterEditor.d.ts +4 -1
  397. package/components/character/CharacterEditor.d.ts.map +1 -1
  398. package/components/character/CharacterEditor.js +54 -14
  399. package/components/character/CharacterEditorPanels.d.ts +1 -1
  400. package/components/character/CharacterEditorPanels.d.ts.map +1 -1
  401. package/components/character/CharacterEditorPanels.js +10 -12
  402. package/components/character/CharacterExperienceWorkspace.d.ts +1 -1
  403. package/components/character/CharacterExperienceWorkspace.d.ts.map +1 -1
  404. package/components/character/CharacterExperienceWorkspace.js +10 -10
  405. package/components/character/CharacterHubView.d.ts +4 -2
  406. package/components/character/CharacterHubView.d.ts.map +1 -1
  407. package/components/character/CharacterHubView.js +57 -201
  408. package/components/character/CharacterOverviewSection.d.ts +1 -1
  409. package/components/character/CharacterOverviewSection.js +1 -1
  410. package/components/character/CharacterPersonalityTimeline.d.ts +1 -1
  411. package/components/character/CharacterRoster.d.ts.map +1 -1
  412. package/components/character/CharacterRoster.helpers.d.ts +1 -1
  413. package/components/character/CharacterRoster.js +2 -10
  414. package/components/character/MusicLibraryCharacterWidget.d.ts +1 -1
  415. package/components/character/character-editor-helpers.d.ts +2 -2
  416. package/components/character/character-hub-helpers.d.ts +2 -2
  417. package/components/character/character-voice-config.d.ts +2 -2
  418. package/components/character/useCharacterHubData.d.ts +41 -0
  419. package/components/character/useCharacterHubData.d.ts.map +1 -0
  420. package/components/character/useCharacterHubData.js +112 -0
  421. package/components/chat/AccountRequiredCard.d.ts +1 -1
  422. package/components/chat/AgentActivityBox.d.ts +1 -1
  423. package/components/chat/AgentActivityBox.d.ts.map +1 -1
  424. package/components/chat/AgentActivityBox.js +28 -17
  425. package/components/chat/AppsSection.d.ts.map +1 -1
  426. package/components/chat/AppsSection.js +13 -14
  427. package/components/chat/ConnectorAccountPicker.d.ts +1 -1
  428. package/components/chat/InlineWidgetText.d.ts +6 -0
  429. package/components/chat/InlineWidgetText.d.ts.map +1 -0
  430. package/components/chat/InlineWidgetText.js +99 -0
  431. package/components/chat/MessageAttachments.d.ts +22 -3
  432. package/components/chat/MessageAttachments.d.ts.map +1 -1
  433. package/components/chat/MessageAttachments.js +381 -14
  434. package/components/chat/MessageContent.d.ts +17 -2
  435. package/components/chat/MessageContent.d.ts.map +1 -1
  436. package/components/chat/MessageContent.js +163 -467
  437. package/components/chat/SaveCommandModal.js +2 -2
  438. package/components/chat/TasksEventsPanel.d.ts +1 -1
  439. package/components/chat/TasksEventsPanel.js +2 -2
  440. package/components/chat/TranscriptViewerOverlay.d.ts +32 -0
  441. package/components/chat/TranscriptViewerOverlay.d.ts.map +1 -0
  442. package/components/chat/TranscriptViewerOverlay.js +329 -0
  443. package/components/chat/WidgetVisibilityPanel.d.ts +3 -3
  444. package/components/chat/WidgetVisibilityPanel.d.ts.map +1 -1
  445. package/components/chat/WidgetVisibilityPanel.helpers.d.ts +1 -1
  446. package/components/chat/connector-send-as.d.ts +1 -1
  447. package/components/chat/message-choice-parser.d.ts +1 -1
  448. package/components/chat/message-choice-parser.d.ts.map +1 -1
  449. package/components/chat/message-choice-parser.js +1 -1
  450. package/components/chat/message-parser-helpers.d.ts +139 -0
  451. package/components/chat/message-parser-helpers.d.ts.map +1 -0
  452. package/components/chat/message-parser-helpers.js +490 -0
  453. package/components/chat/widgets/ChoiceWidget.js +1 -1
  454. package/components/chat/widgets/agent-orchestrator-accounts-view.d.ts +3 -3
  455. package/components/chat/widgets/agent-orchestrator.d.ts +1 -1
  456. package/components/chat/widgets/agent-orchestrator.d.ts.map +1 -1
  457. package/components/chat/widgets/agent-orchestrator.js +60 -39
  458. package/components/chat/widgets/browser-launch-widget.d.ts +19 -0
  459. package/components/chat/widgets/browser-launch-widget.d.ts.map +1 -0
  460. package/components/chat/widgets/browser-launch-widget.js +38 -0
  461. package/components/chat/widgets/browser-status.d.ts +1 -1
  462. package/components/chat/widgets/browser-status.d.ts.map +1 -1
  463. package/components/chat/widgets/browser-status.helpers.d.ts +1 -1
  464. package/components/chat/widgets/browser-status.js +17 -27
  465. package/components/chat/widgets/calendar-upcoming.d.ts +17 -0
  466. package/components/chat/widgets/calendar-upcoming.d.ts.map +1 -0
  467. package/components/chat/widgets/calendar-upcoming.js +149 -0
  468. package/components/chat/widgets/credential-request-widget.d.ts +40 -0
  469. package/components/chat/widgets/credential-request-widget.d.ts.map +1 -0
  470. package/components/chat/widgets/credential-request-widget.js +52 -0
  471. package/components/chat/widgets/finances-alerts.d.ts +17 -0
  472. package/components/chat/widgets/finances-alerts.d.ts.map +1 -0
  473. package/components/chat/widgets/finances-alerts.js +214 -0
  474. package/components/chat/widgets/followups.d.ts +1 -1
  475. package/components/chat/widgets/form-request.d.ts +1 -1
  476. package/components/chat/widgets/goals-attention.d.ts +17 -0
  477. package/components/chat/widgets/goals-attention.d.ts.map +1 -0
  478. package/components/chat/widgets/goals-attention.js +155 -0
  479. package/components/chat/widgets/health-sleep.d.ts +18 -0
  480. package/components/chat/widgets/health-sleep.d.ts.map +1 -0
  481. package/components/chat/widgets/health-sleep.js +159 -0
  482. package/components/chat/widgets/home-widget-card.d.ts +47 -0
  483. package/components/chat/widgets/home-widget-card.d.ts.map +1 -0
  484. package/components/chat/widgets/home-widget-card.js +62 -0
  485. package/components/chat/widgets/inbox-unread.d.ts +10 -0
  486. package/components/chat/widgets/inbox-unread.d.ts.map +1 -0
  487. package/components/chat/widgets/inbox-unread.js +119 -0
  488. package/components/chat/widgets/inline-registry.d.ts +1 -1
  489. package/components/chat/widgets/messages.d.ts +8 -0
  490. package/components/chat/widgets/messages.d.ts.map +1 -0
  491. package/components/chat/widgets/messages.js +38 -0
  492. package/components/chat/widgets/music-player.d.ts +1 -1
  493. package/components/chat/widgets/music-player.helpers.d.ts +1 -1
  494. package/components/chat/widgets/needs-attention.d.ts +22 -0
  495. package/components/chat/widgets/needs-attention.d.ts.map +1 -0
  496. package/components/chat/widgets/needs-attention.js +109 -0
  497. package/components/chat/widgets/notifications.d.ts +9 -0
  498. package/components/chat/widgets/notifications.d.ts.map +1 -0
  499. package/components/chat/widgets/notifications.js +42 -0
  500. package/components/chat/widgets/orchestrator-grilling-card.d.ts +24 -0
  501. package/components/chat/widgets/orchestrator-grilling-card.d.ts.map +1 -0
  502. package/components/chat/widgets/orchestrator-grilling-card.js +57 -0
  503. package/components/chat/widgets/relationships-attention.d.ts +18 -0
  504. package/components/chat/widgets/relationships-attention.d.ts.map +1 -0
  505. package/components/chat/widgets/relationships-attention.js +135 -0
  506. package/components/chat/widgets/shared.js +2 -2
  507. package/components/chat/widgets/task-widget.js +1 -1
  508. package/components/chat/widgets/todo.d.ts +1 -1
  509. package/components/chat/widgets/todo.d.ts.map +1 -1
  510. package/components/chat/widgets/todo.js +39 -10
  511. package/components/chat/widgets/topic-chips-bar.d.ts +23 -0
  512. package/components/chat/widgets/topic-chips-bar.d.ts.map +1 -0
  513. package/components/chat/widgets/topic-chips-bar.js +22 -0
  514. package/components/chat/widgets/topic-grouped-transcript.d.ts +20 -0
  515. package/components/chat/widgets/topic-grouped-transcript.d.ts.map +1 -0
  516. package/components/chat/widgets/topic-grouped-transcript.js +45 -0
  517. package/components/chat/widgets/types.d.ts +5 -2
  518. package/components/chat/widgets/types.d.ts.map +1 -1
  519. package/components/chat/widgets/use-inline-widget-context.d.ts +18 -0
  520. package/components/chat/widgets/use-inline-widget-context.d.ts.map +1 -0
  521. package/components/chat/widgets/use-inline-widget-context.js +46 -0
  522. package/components/cloud/CloudSourceControls.js +2 -2
  523. package/components/cloud/CloudStatusBadge.js +2 -2
  524. package/components/cloud/FlaminaGuide.d.ts +1 -1
  525. package/components/cloud/FlaminaGuide.d.ts.map +1 -1
  526. package/components/cloud/FlaminaGuide.js +10 -5
  527. package/components/companion/injected.d.ts +1 -1
  528. package/components/companion/injected.hooks.d.ts +1 -1
  529. package/components/composites/chat/ChatVoiceStatusBar.d.ts +2 -2
  530. package/components/composites/chat/ChatVoiceStatusBar.js +1 -1
  531. package/components/composites/chat/ContinuousChatToggle.d.ts +1 -1
  532. package/components/composites/chat/ContinuousChatToggle.js +1 -1
  533. package/components/composites/chat/chat-attachment-strip.d.ts +1 -1
  534. package/components/composites/chat/chat-attachment-strip.js +1 -1
  535. package/components/composites/chat/chat-composer-shell.d.ts +1 -1
  536. package/components/composites/chat/chat-composer.d.ts +10 -4
  537. package/components/composites/chat/chat-composer.d.ts.map +1 -1
  538. package/components/composites/chat/chat-composer.js +14 -14
  539. package/components/composites/chat/chat-conversation-item.d.ts +2 -2
  540. package/components/composites/chat/chat-conversation-item.d.ts.map +1 -1
  541. package/components/composites/chat/chat-conversation-item.js +8 -8
  542. package/components/composites/chat/chat-empty-state.d.ts +1 -1
  543. package/components/composites/chat/chat-message-actions.d.ts +1 -1
  544. package/components/composites/chat/chat-message.d.ts +10 -2
  545. package/components/composites/chat/chat-message.d.ts.map +1 -1
  546. package/components/composites/chat/chat-message.js +4 -2
  547. package/components/composites/chat/chat-source.d.ts +2 -2
  548. package/components/composites/chat/chat-source.helpers.d.ts +1 -1
  549. package/components/composites/chat/chat-thread-layout.d.ts +1 -1
  550. package/components/composites/chat/chat-thread-layout.d.ts.map +1 -1
  551. package/components/composites/chat/chat-thread-layout.js +2 -2
  552. package/components/composites/chat/chat-transcript.d.ts +6 -2
  553. package/components/composites/chat/chat-transcript.d.ts.map +1 -1
  554. package/components/composites/chat/chat-transcript.js +18 -3
  555. package/components/composites/chat/chat-types.d.ts +2 -0
  556. package/components/composites/chat/chat-types.d.ts.map +1 -1
  557. package/components/composites/chat/chat-typing-indicator.d.ts +1 -1
  558. package/components/composites/chat/index.d.ts +16 -16
  559. package/components/composites/chat/permission-card.d.ts +1 -1
  560. package/components/composites/chat/permission-card.render.d.ts +2 -2
  561. package/components/composites/code/DiffReviewPanel.d.ts +1 -1
  562. package/components/composites/code/index.d.ts +1 -1
  563. package/components/composites/form-field/index.d.ts +1 -1
  564. package/components/composites/index.d.ts +29 -29
  565. package/components/composites/page-panel/index.d.ts +19 -19
  566. package/components/composites/page-panel/page-panel-collapsible-section.d.ts +1 -1
  567. package/components/composites/page-panel/page-panel-collapsible-section.d.ts.map +1 -1
  568. package/components/composites/page-panel/page-panel-collapsible-section.js +2 -2
  569. package/components/composites/page-panel/page-panel-empty.d.ts +1 -1
  570. package/components/composites/page-panel/page-panel-empty.d.ts.map +1 -1
  571. package/components/composites/page-panel/page-panel-empty.js +4 -4
  572. package/components/composites/page-panel/page-panel-feature-empty.d.ts +1 -1
  573. package/components/composites/page-panel/page-panel-frame.d.ts +1 -1
  574. package/components/composites/page-panel/page-panel-frame.d.ts.map +1 -1
  575. package/components/composites/page-panel/page-panel-frame.js +1 -1
  576. package/components/composites/page-panel/page-panel-header.d.ts +1 -1
  577. package/components/composites/page-panel/page-panel-header.d.ts.map +1 -1
  578. package/components/composites/page-panel/page-panel-header.js +9 -9
  579. package/components/composites/page-panel/page-panel-loading.d.ts +1 -1
  580. package/components/composites/page-panel/page-panel-loading.d.ts.map +1 -1
  581. package/components/composites/page-panel/page-panel-loading.js +3 -3
  582. package/components/composites/page-panel/page-panel-root.d.ts +2 -2
  583. package/components/composites/page-panel/page-panel-root.js +7 -7
  584. package/components/composites/page-panel/page-panel-toolbar.d.ts +1 -1
  585. package/components/composites/page-panel/page-panel-types.d.ts +1 -1
  586. package/components/composites/search/index.d.ts +1 -1
  587. package/components/composites/search/searchbar.js +1 -1
  588. package/components/composites/sidebar/index.d.ts +10 -10
  589. package/components/composites/sidebar/sidebar-auto-rail.d.ts +1 -1
  590. package/components/composites/sidebar/sidebar-body.d.ts +1 -1
  591. package/components/composites/sidebar/sidebar-collapsed-rail.d.ts +1 -1
  592. package/components/composites/sidebar/sidebar-content.js +3 -3
  593. package/components/composites/sidebar/sidebar-header-stack.d.ts +1 -1
  594. package/components/composites/sidebar/sidebar-header.d.ts +1 -1
  595. package/components/composites/sidebar/sidebar-panel.d.ts +1 -1
  596. package/components/composites/sidebar/sidebar-root.d.ts +1 -1
  597. package/components/composites/sidebar/sidebar-root.d.ts.map +1 -1
  598. package/components/composites/sidebar/sidebar-root.js +34 -8
  599. package/components/composites/sidebar/sidebar-scroll-region.d.ts +1 -1
  600. package/components/composites/skills/index.d.ts +1 -1
  601. package/components/composites/trajectories/index.d.ts +7 -7
  602. package/components/composites/trajectories/trajectory-code-block.d.ts.map +1 -1
  603. package/components/composites/trajectories/trajectory-code-block.js +3 -2
  604. package/components/composites/trajectories/trajectory-pipeline-graph.js +3 -3
  605. package/components/config-ui/config-control-primitives.helpers.js +2 -2
  606. package/components/config-ui/config-field.d.ts +1 -1
  607. package/components/config-ui/config-field.helpers.d.ts +1 -1
  608. package/components/config-ui/config-field.helpers.d.ts.map +1 -1
  609. package/components/config-ui/config-field.helpers.js +33 -20
  610. package/components/config-ui/config-field.js +2 -2
  611. package/components/config-ui/config-renderer.d.ts +2 -2
  612. package/components/config-ui/config-renderer.helpers.d.ts +2 -2
  613. package/components/config-ui/config-renderer.js +6 -6
  614. package/components/config-ui/index.d.ts +7 -7
  615. package/components/config-ui/ui-renderer.d.ts +1 -1
  616. package/components/config-ui/ui-renderer.d.ts.map +1 -1
  617. package/components/config-ui/ui-renderer.helpers.d.ts +1 -1
  618. package/components/config-ui/ui-renderer.js +15 -8
  619. package/components/connectors/BlueBubblesStatusPanel.d.ts.map +1 -1
  620. package/components/connectors/BlueBubblesStatusPanel.js +11 -24
  621. package/components/connectors/ConnectorAccountAuditList.d.ts.map +1 -1
  622. package/components/connectors/ConnectorAccountAuditList.js +19 -32
  623. package/components/connectors/ConnectorAccountCard.d.ts +1 -1
  624. package/components/connectors/ConnectorAccountList.d.ts +2 -2
  625. package/components/connectors/ConnectorAccountPrivacySelector.d.ts +1 -1
  626. package/components/connectors/ConnectorAccountPurposeSelector.d.ts +1 -1
  627. package/components/connectors/ConnectorModeSelector.d.ts +1 -1
  628. package/components/connectors/ConnectorModeSelector.helpers.d.ts +1 -1
  629. package/components/connectors/ConnectorModeSelector.hooks.d.ts +1 -1
  630. package/components/connectors/ConnectorModeSelector.js +2 -2
  631. package/components/connectors/ConnectorQrPairingOverlay.js +2 -2
  632. package/components/connectors/DiscordLocalConnectorPanel.js +2 -2
  633. package/components/connectors/IMessageStatusPanel.js +2 -2
  634. package/components/connectors/SignalQrOverlay.js +2 -2
  635. package/components/connectors/TelegramAccountConnectorPanel.js +4 -4
  636. package/components/connectors/TelegramBotSetupPanel.js +3 -3
  637. package/components/connectors/WhatsAppQrOverlay.js +2 -2
  638. package/components/connectors/XRPairingPanel.d.ts.map +1 -1
  639. package/components/connectors/XRPairingPanel.js +6 -3
  640. package/components/connectors/connector-account-options.d.ts +1 -1
  641. package/components/conversations/ConversationRenameDialog.d.ts.map +1 -1
  642. package/components/conversations/ConversationRenameDialog.js +4 -2
  643. package/components/conversations/ConversationsSidebar.d.ts.map +1 -1
  644. package/components/conversations/ConversationsSidebar.js +18 -3
  645. package/components/conversations/conversation-sidebar-model.d.ts +2 -2
  646. package/components/conversations/conversation-utils.d.ts +1 -1
  647. package/components/custom-actions/CustomActionEditor.js +2 -2
  648. package/components/custom-actions/CustomActionsPanel.d.ts.map +1 -1
  649. package/components/custom-actions/CustomActionsPanel.js +16 -5
  650. package/components/custom-actions/CustomActionsView.js +3 -3
  651. package/components/custom-actions/custom-action-form.d.ts +4 -4
  652. package/components/custom-actions/custom-action-form.d.ts.map +1 -1
  653. package/components/custom-actions/custom-action-form.js +2 -2
  654. package/components/desktop/DesktopTabBar.d.ts +2 -2
  655. package/components/desktop/DesktopTabBar.js +4 -4
  656. package/components/index.d.ts +161 -156
  657. package/components/index.d.ts.map +1 -1
  658. package/components/index.js +9 -1
  659. package/components/local-inference/ActiveModelBar.d.ts +1 -1
  660. package/components/local-inference/DeviceBridgeStatus.d.ts +1 -1
  661. package/components/local-inference/DevicesPanel.d.ts +1 -1
  662. package/components/local-inference/DownloadProgress.d.ts +1 -1
  663. package/components/local-inference/DownloadProgress.d.ts.map +1 -1
  664. package/components/local-inference/DownloadProgress.js +1 -3
  665. package/components/local-inference/DownloadQueue.d.ts +8 -2
  666. package/components/local-inference/DownloadQueue.d.ts.map +1 -1
  667. package/components/local-inference/DownloadQueue.js +3 -3
  668. package/components/local-inference/FirstRunOffer.d.ts +1 -1
  669. package/components/local-inference/HardwareBadge.d.ts +1 -1
  670. package/components/local-inference/LocalInferencePanel.d.ts +1 -1
  671. package/components/local-inference/LocalInferencePanel.d.ts.map +1 -1
  672. package/components/local-inference/LocalInferencePanel.js +18 -51
  673. package/components/local-inference/ModelCard.d.ts +1 -1
  674. package/components/local-inference/ModelCard.d.ts.map +1 -1
  675. package/components/local-inference/ModelCard.js +6 -5
  676. package/components/local-inference/ModelHubView.d.ts +1 -1
  677. package/components/local-inference/ModelHubView.d.ts.map +1 -1
  678. package/components/local-inference/ModelHubView.js +10 -6
  679. package/components/local-inference/RoutingMatrix.d.ts.map +1 -1
  680. package/components/local-inference/RoutingMatrix.js +115 -40
  681. package/components/local-inference/SlotAssignments.d.ts +1 -1
  682. package/components/local-inference/SlotAssignments.d.ts.map +1 -1
  683. package/components/local-inference/SlotAssignments.js +27 -10
  684. package/components/local-inference/hub-utils.d.ts +2 -1
  685. package/components/local-inference/hub-utils.d.ts.map +1 -1
  686. package/components/local-inference/hub-utils.js +2 -0
  687. package/components/local-inference/runtime-class-ui.d.ts +44 -0
  688. package/components/local-inference/runtime-class-ui.d.ts.map +1 -0
  689. package/components/local-inference/runtime-class-ui.js +61 -0
  690. package/components/local-inference/slot-metadata.d.ts +1 -1
  691. package/components/local-inference/useDeviceBridgeStatus.d.ts +1 -1
  692. package/components/local-inference/useDeviceBridgeStatus.d.ts.map +1 -1
  693. package/components/local-inference/useDeviceBridgeStatus.js +17 -12
  694. package/components/local-inference/useHomeModelStatus.d.ts +1 -1
  695. package/components/local-inference/useHomeModelStatus.d.ts.map +1 -1
  696. package/components/local-inference/useHomeModelStatus.js +15 -10
  697. package/components/pages/AppDetailsView.d.ts +1 -1
  698. package/components/pages/AppDetailsView.d.ts.map +1 -1
  699. package/components/pages/AppDetailsView.helpers.d.ts +1 -1
  700. package/components/pages/AppDetailsView.js +15 -3
  701. package/components/pages/AppsPageView.d.ts.map +1 -1
  702. package/components/pages/AppsPageView.js +7 -2
  703. package/components/pages/AppsView.d.ts.map +1 -1
  704. package/components/pages/AppsView.js +35 -8
  705. package/components/pages/AutomationsFeed.d.ts +1 -1
  706. package/components/pages/AutomationsFeed.d.ts.map +1 -1
  707. package/components/pages/AutomationsFeed.js +3 -7
  708. package/components/pages/BackgroundView.d.ts +10 -0
  709. package/components/pages/BackgroundView.d.ts.map +1 -0
  710. package/components/pages/BackgroundView.js +14 -0
  711. package/components/pages/BrowserWorkspaceView.d.ts.map +1 -1
  712. package/components/pages/BrowserWorkspaceView.js +13 -8
  713. package/components/pages/CameraPageView.js +2 -2
  714. package/components/pages/ChatView.d.ts +1 -1
  715. package/components/pages/ChatView.d.ts.map +1 -1
  716. package/components/pages/ChatView.js +186 -29
  717. package/components/pages/ConfigPageView.d.ts.map +1 -1
  718. package/components/pages/ConfigPageView.js +11 -2
  719. package/components/pages/DatabasePageView.d.ts.map +1 -1
  720. package/components/pages/DatabasePageView.js +4 -2
  721. package/components/pages/DatabaseView.d.ts.map +1 -1
  722. package/components/pages/DatabaseView.js +14 -12
  723. package/components/pages/DocumentsView.d.ts +2 -2
  724. package/components/pages/DocumentsView.d.ts.map +1 -1
  725. package/components/pages/DocumentsView.js +20 -20
  726. package/components/pages/ElizaCloudDashboard.d.ts.map +1 -1
  727. package/components/pages/ElizaCloudDashboard.js +20 -2
  728. package/components/pages/ElizaOsAppsView.d.ts.map +1 -1
  729. package/components/pages/ElizaOsAppsView.js +29 -22
  730. package/components/pages/FilesView.d.ts +15 -0
  731. package/components/pages/FilesView.d.ts.map +1 -0
  732. package/components/pages/FilesView.js +201 -0
  733. package/components/pages/GeneratedViewHero.js +1 -1
  734. package/components/pages/HeartbeatForm.d.ts +3 -3
  735. package/components/pages/HeartbeatsView.d.ts.map +1 -1
  736. package/components/pages/HeartbeatsView.js +21 -6
  737. package/components/pages/LogsView.d.ts +0 -6
  738. package/components/pages/LogsView.d.ts.map +1 -1
  739. package/components/pages/LogsView.js +41 -25
  740. package/components/pages/MediaGalleryView.d.ts.map +1 -1
  741. package/components/pages/MediaGalleryView.js +59 -11
  742. package/components/pages/MemoryDetailPanel.d.ts +1 -1
  743. package/components/pages/MemoryDetailPanel.d.ts.map +1 -1
  744. package/components/pages/MemoryDetailPanel.js +8 -3
  745. package/components/pages/MemoryViewerView.d.ts.map +1 -1
  746. package/components/pages/MemoryViewerView.js +33 -24
  747. package/components/pages/PluginCard.d.ts +2 -2
  748. package/components/pages/PluginCard.d.ts.map +1 -1
  749. package/components/pages/PluginCard.js +6 -5
  750. package/components/pages/PluginConfigForm.d.ts +1 -1
  751. package/components/pages/PluginConfigForm.js +2 -2
  752. package/components/pages/PluginVisual.d.ts +1 -1
  753. package/components/pages/PluginsView.d.ts +1 -1
  754. package/components/pages/PluginsView.d.ts.map +1 -1
  755. package/components/pages/PluginsView.js +33 -13
  756. package/components/pages/RelationshipsGraphPanel.d.ts +1 -1
  757. package/components/pages/RelationshipsGraphPanel.js +2 -2
  758. package/components/pages/RelationshipsIdentityCluster.d.ts +1 -1
  759. package/components/pages/ReleaseCenterView.d.ts.map +1 -1
  760. package/components/pages/ReleaseCenterView.js +11 -9
  761. package/components/pages/RuntimeView.d.ts.map +1 -1
  762. package/components/pages/RuntimeView.js +13 -12
  763. package/components/pages/SecretsView.d.ts.map +1 -1
  764. package/components/pages/SecretsView.js +21 -18
  765. package/components/pages/SettingsView.d.ts.map +1 -1
  766. package/components/pages/SettingsView.js +34 -14
  767. package/components/pages/SkillsView.d.ts.map +1 -1
  768. package/components/pages/SkillsView.js +47 -11
  769. package/components/pages/Springboard.d.ts +49 -0
  770. package/components/pages/Springboard.d.ts.map +1 -0
  771. package/components/pages/Springboard.js +238 -0
  772. package/components/pages/SpringboardSurface.d.ts +6 -0
  773. package/components/pages/SpringboardSurface.d.ts.map +1 -0
  774. package/components/pages/SpringboardSurface.js +120 -0
  775. package/components/pages/SqlEditorPanel.d.ts +1 -1
  776. package/components/pages/SqlEditorPanel.js +5 -5
  777. package/components/pages/StreamView.d.ts.map +1 -1
  778. package/components/pages/StreamView.js +6 -7
  779. package/components/pages/TaskEditor.d.ts +3 -3
  780. package/components/pages/TrajectoriesView.d.ts.map +1 -1
  781. package/components/pages/TrajectoriesView.js +9 -9
  782. package/components/pages/TrajectoryDetailView.d.ts.map +1 -1
  783. package/components/pages/TrajectoryDetailView.js +58 -39
  784. package/components/pages/WorkflowEditor.d.ts +1 -1
  785. package/components/pages/WorkflowEditor.d.ts.map +1 -1
  786. package/components/pages/WorkflowEditor.js +13 -22
  787. package/components/pages/WorkflowGraphViewer.d.ts +1 -1
  788. package/components/pages/WorkflowGraphViewer.d.ts.map +1 -1
  789. package/components/pages/WorkflowGraphViewer.js +9 -11
  790. package/components/pages/__e2e__/background-fixture.d.ts +2 -0
  791. package/components/pages/__e2e__/background-fixture.d.ts.map +1 -0
  792. package/components/pages/__e2e__/background-fixture.js +84 -0
  793. package/components/pages/__e2e__/springboard-fixture.d.ts +2 -0
  794. package/components/pages/__e2e__/springboard-fixture.d.ts.map +1 -0
  795. package/components/pages/__e2e__/springboard-fixture.js +103 -0
  796. package/components/pages/automation-conversations.d.ts +1 -1
  797. package/components/pages/automations-missing-creds.d.ts +1 -1
  798. package/components/pages/background-image.d.ts +10 -0
  799. package/components/pages/background-image.d.ts.map +1 -0
  800. package/components/pages/background-image.js +61 -0
  801. package/components/pages/browser-workspace-wallet.d.ts +1 -1
  802. package/components/pages/chat-view-hooks.d.ts +5 -5
  803. package/components/pages/cloud-dashboard-utils.d.ts +1 -1
  804. package/components/pages/config-page-sections.d.ts +1 -1
  805. package/components/pages/config-page-sections.d.ts.map +1 -1
  806. package/components/pages/config-page-sections.js +4 -3
  807. package/components/pages/database-utils.d.ts +2 -1
  808. package/components/pages/database-utils.d.ts.map +1 -1
  809. package/components/pages/database-utils.js +38 -25
  810. package/components/pages/documents-detail.d.ts.map +1 -1
  811. package/components/pages/documents-detail.helpers.d.ts +1 -1
  812. package/components/pages/documents-detail.js +55 -8
  813. package/components/pages/documents-upload.d.ts +1 -1
  814. package/components/pages/documents-upload.d.ts.map +1 -1
  815. package/components/pages/documents-upload.helpers.d.ts +1 -1
  816. package/components/pages/documents-upload.js +5 -3
  817. package/components/pages/heartbeat-utils.d.ts +2 -2
  818. package/components/pages/help/HelpView.js +2 -2
  819. package/components/pages/help/help-content.d.ts.map +1 -1
  820. package/components/pages/help/help-content.js +7 -5
  821. package/components/pages/page-scoped-conversations.d.ts +3 -3
  822. package/components/pages/page-scoped-conversations.d.ts.map +1 -1
  823. package/components/pages/page-scoped-conversations.js +1 -18
  824. package/components/pages/plugin-list-utils.d.ts +3 -3
  825. package/components/pages/plugin-list-utils.d.ts.map +1 -1
  826. package/components/pages/plugin-list-utils.js +6 -2
  827. package/components/pages/plugin-view-connectors.d.ts +2 -2
  828. package/components/pages/plugin-view-connectors.d.ts.map +1 -1
  829. package/components/pages/plugin-view-connectors.js +7 -2
  830. package/components/pages/plugin-view-dialogs.d.ts +3 -9
  831. package/components/pages/plugin-view-dialogs.d.ts.map +1 -1
  832. package/components/pages/plugin-view-dialogs.js +1 -1
  833. package/components/pages/plugin-view-modal.d.ts +2 -2
  834. package/components/pages/plugin-view-sidebar.d.ts +2 -2
  835. package/components/pages/relationships/RelationshipsCandidateMergesPanel.d.ts +1 -1
  836. package/components/pages/relationships/RelationshipsPersonPanels.d.ts +1 -1
  837. package/components/pages/relationships/RelationshipsPersonPanels.js +1 -1
  838. package/components/pages/relationships/RelationshipsSidebar.d.ts +1 -1
  839. package/components/pages/relationships/RelationshipsWorkspaceView.d.ts.map +1 -1
  840. package/components/pages/relationships/RelationshipsWorkspaceView.js +5 -4
  841. package/components/pages/relationships/relationships-utils.d.ts +1 -1
  842. package/components/pages/skill-detail-panel.d.ts.map +1 -1
  843. package/components/pages/skill-detail-panel.js +25 -3
  844. package/components/pages/skill-marketplace.d.ts +2 -2
  845. package/components/pages/skill-marketplace.d.ts.map +1 -1
  846. package/components/pages/skill-marketplace.js +3 -3
  847. package/components/pages/tutorial/TutorialNarrator.d.ts.map +1 -1
  848. package/components/pages/tutorial/TutorialNarrator.js +3 -2
  849. package/components/pages/tutorial/TutorialOverlay.d.ts.map +1 -1
  850. package/components/pages/tutorial/TutorialOverlay.js +3 -2
  851. package/components/pages/tutorial/TutorialSpotlight.js +3 -3
  852. package/components/pages/tutorial/TutorialView.d.ts.map +1 -1
  853. package/components/pages/tutorial/TutorialView.js +3 -5
  854. package/components/pages/useBrowserWorkspaceWalletBridge.d.ts +2 -2
  855. package/components/pages/workflow-action-handoff.d.ts +1 -1
  856. package/components/permissions/StreamingPermissions.d.ts +1 -1
  857. package/components/permissions/StreamingPermissions.d.ts.map +1 -1
  858. package/components/permissions/StreamingPermissions.js +5 -6
  859. package/components/plugins/showcase-data.d.ts +1 -1
  860. package/components/policy-controls/ApprovedAddressesSection.d.ts +1 -1
  861. package/components/policy-controls/ApprovedAddressesSection.helpers.d.ts +1 -1
  862. package/components/policy-controls/AutoApproveSection.d.ts +1 -1
  863. package/components/policy-controls/AutoApproveSection.helpers.d.ts +1 -1
  864. package/components/policy-controls/RateLimitSection.d.ts +1 -1
  865. package/components/policy-controls/RateLimitSection.helpers.d.ts +1 -1
  866. package/components/policy-controls/SpendingLimitSection.d.ts +1 -1
  867. package/components/policy-controls/SpendingLimitSection.helpers.d.ts +1 -1
  868. package/components/policy-controls/TimeWindowSection.d.ts +1 -1
  869. package/components/policy-controls/TimeWindowSection.helpers.d.ts +1 -1
  870. package/components/policy-controls/constants.d.ts +1 -1
  871. package/components/policy-controls/helpers.d.ts +1 -1
  872. package/components/policy-controls/index.d.ts +14 -14
  873. package/components/primitives/index.d.ts +27 -27
  874. package/components/release-center/sections.d.ts +1 -1
  875. package/components/release-center/sections.js +7 -7
  876. package/components/release-center/shared.js +2 -2
  877. package/components/settings/AdvancedSection.d.ts.map +1 -1
  878. package/components/settings/AdvancedSection.js +20 -4
  879. package/components/settings/AdvancedToggle.js +1 -1
  880. package/components/settings/ApiKeyConfig.d.ts +2 -2
  881. package/components/settings/ApiKeyConfig.js +2 -2
  882. package/components/settings/AppPermissionsSection.d.ts.map +1 -1
  883. package/components/settings/AppPermissionsSection.js +7 -12
  884. package/components/settings/AppearanceSettingsSection.d.ts.map +1 -1
  885. package/components/settings/AppearanceSettingsSection.js +34 -5
  886. package/components/settings/AppsManagementSection.d.ts.map +1 -1
  887. package/components/settings/AppsManagementSection.js +42 -33
  888. package/components/settings/BackgroundSettingsControls.d.ts +5 -0
  889. package/components/settings/BackgroundSettingsControls.d.ts.map +1 -0
  890. package/components/settings/BackgroundSettingsControls.js +118 -0
  891. package/components/settings/CapabilitiesSection.d.ts.map +1 -1
  892. package/components/settings/CapabilitiesSection.js +115 -13
  893. package/components/settings/CloudAgentsSection.d.ts.map +1 -1
  894. package/components/settings/CloudAgentsSection.js +33 -13
  895. package/components/settings/ConnectorsSection.d.ts.map +1 -1
  896. package/components/settings/ConnectorsSection.js +8 -6
  897. package/components/settings/DesktopWorkspaceDisplay.d.ts +2 -3
  898. package/components/settings/DesktopWorkspaceDisplay.d.ts.map +1 -1
  899. package/components/settings/DesktopWorkspaceDisplay.hooks.d.ts +3 -4
  900. package/components/settings/DesktopWorkspaceDisplay.hooks.d.ts.map +1 -1
  901. package/components/settings/DesktopWorkspaceSection.d.ts.map +1 -1
  902. package/components/settings/DesktopWorkspaceSection.js +4 -2
  903. package/components/settings/IdentitySettingsSection.d.ts.map +1 -1
  904. package/components/settings/IdentitySettingsSection.js +13 -3
  905. package/components/settings/LoadContentPackForm.js +2 -2
  906. package/components/settings/LoadedPacksList.d.ts.map +1 -1
  907. package/components/settings/LoadedPacksList.js +8 -10
  908. package/components/settings/PermissionsSection.d.ts.map +1 -1
  909. package/components/settings/PermissionsSection.js +10 -32
  910. package/components/settings/PolicyControlsView.d.ts.map +1 -1
  911. package/components/settings/PolicyControlsView.js +8 -10
  912. package/components/settings/ProviderCard.d.ts +3 -5
  913. package/components/settings/ProviderCard.d.ts.map +1 -1
  914. package/components/settings/ProviderCard.js +4 -6
  915. package/components/settings/ProviderPanels.d.ts +4 -15
  916. package/components/settings/ProviderPanels.d.ts.map +1 -1
  917. package/components/settings/ProviderPanels.js +11 -17
  918. package/components/settings/ProviderRoutingPanel.d.ts +1 -1
  919. package/components/settings/ProviderRoutingPanel.d.ts.map +1 -1
  920. package/components/settings/ProviderRoutingPanel.js +4 -8
  921. package/components/settings/ProviderSwitcher.d.ts +1 -1
  922. package/components/settings/ProviderSwitcher.d.ts.map +1 -1
  923. package/components/settings/ProviderSwitcher.js +31 -32
  924. package/components/settings/RemotePluginHostSection.d.ts.map +1 -1
  925. package/components/settings/RemotePluginHostSection.js +13 -27
  926. package/components/settings/RuntimeSettingsSection.d.ts.map +1 -1
  927. package/components/settings/RuntimeSettingsSection.js +7 -18
  928. package/components/settings/SecretsManagerSection.d.ts +1 -1
  929. package/components/settings/SecretsManagerSection.d.ts.map +1 -1
  930. package/components/settings/SecretsManagerSection.js +3 -3
  931. package/components/settings/SecuritySettingsSection.d.ts.map +1 -1
  932. package/components/settings/SecuritySettingsSection.js +49 -57
  933. package/components/settings/SubscriptionStatus.d.ts +1 -1
  934. package/components/settings/SubscriptionStatus.js +4 -4
  935. package/components/settings/VaultInventoryPanel.d.ts +1 -1
  936. package/components/settings/VaultInventoryPanel.d.ts.map +1 -1
  937. package/components/settings/VaultInventoryPanel.js +26 -22
  938. package/components/settings/VoiceConfigView.d.ts.map +1 -1
  939. package/components/settings/VoiceConfigView.helpers.d.ts +1 -1
  940. package/components/settings/VoiceConfigView.js +25 -21
  941. package/components/settings/VoiceProfileSection.d.ts +2 -4
  942. package/components/settings/VoiceProfileSection.d.ts.map +1 -1
  943. package/components/settings/VoiceProfileSection.js +57 -34
  944. package/components/settings/VoiceSection.d.ts +8 -7
  945. package/components/settings/VoiceSection.d.ts.map +1 -1
  946. package/components/settings/VoiceSection.helpers.d.ts +1 -1
  947. package/components/settings/VoiceSection.helpers.d.ts.map +1 -1
  948. package/components/settings/VoiceSection.helpers.js +0 -1
  949. package/components/settings/VoiceSection.js +21 -57
  950. package/components/settings/VoiceSectionMount.d.ts.map +1 -1
  951. package/components/settings/VoiceSectionMount.js +16 -7
  952. package/components/settings/VoiceTierBanner.d.ts.map +1 -1
  953. package/components/settings/VoiceTierBanner.helpers.d.ts +1 -1
  954. package/components/settings/VoiceTierBanner.js +13 -19
  955. package/components/settings/WalletKeysSection.d.ts.map +1 -1
  956. package/components/settings/WalletKeysSection.js +3 -9
  957. package/components/settings/cloud-model-schema.d.ts +3 -3
  958. package/components/settings/desktop-workspace-audit-config.d.ts +1 -1
  959. package/components/settings/permission-controls.d.ts +2 -2
  960. package/components/settings/permission-controls.hooks.d.ts +1 -1
  961. package/components/settings/permission-controls.js +3 -3
  962. package/components/settings/permission-types.d.ts +1 -1
  963. package/components/settings/permission-types.js +8 -8
  964. package/components/settings/settings-agent-rows.d.ts +26 -2
  965. package/components/settings/settings-agent-rows.d.ts.map +1 -1
  966. package/components/settings/settings-agent-rows.js +29 -1
  967. package/components/settings/settings-control-primitives.d.ts +1 -1
  968. package/components/settings/settings-layout.d.ts +9 -3
  969. package/components/settings/settings-layout.d.ts.map +1 -1
  970. package/components/settings/settings-layout.js +8 -6
  971. package/components/settings/settings-section-registry.d.ts +19 -1
  972. package/components/settings/settings-section-registry.d.ts.map +1 -1
  973. package/components/settings/settings-sections.d.ts +3 -3
  974. package/components/settings/settings-sections.d.ts.map +1 -1
  975. package/components/settings/settings-sections.js +11 -4
  976. package/components/settings/useCloudModelConfig.d.ts +2 -2
  977. package/components/settings/useDesktopWindowControls.d.ts +3 -4
  978. package/components/settings/useDesktopWindowControls.d.ts.map +1 -1
  979. package/components/settings/useProviderBootstrap.d.ts +2 -2
  980. package/components/settings/useProviderEntries.d.ts +4 -4
  981. package/components/settings/useProviderSelection.d.ts +1 -1
  982. package/components/settings/useProviderSelection.d.ts.map +1 -1
  983. package/components/settings/useProviderSelection.js +9 -5
  984. package/components/settings/vault-tabs/OverviewTab.d.ts +1 -1
  985. package/components/settings/vault-tabs/OverviewTab.d.ts.map +1 -1
  986. package/components/settings/vault-tabs/OverviewTab.js +7 -1
  987. package/components/settings/vault-tabs/RoutingTab.d.ts +1 -1
  988. package/components/settings/vault-tabs/RoutingTab.d.ts.map +1 -1
  989. package/components/settings/vault-tabs/RoutingTab.js +41 -14
  990. package/components/settings/vault-tabs/SecretsTab.d.ts +1 -1
  991. package/components/settings/vault-tabs/SecretsTab.d.ts.map +1 -1
  992. package/components/settings/vault-tabs/SecretsTab.js +3 -1
  993. package/components/setup/BootstrapStep.d.ts +1 -1
  994. package/components/setup/BootstrapStep.d.ts.map +1 -1
  995. package/components/setup/BootstrapStep.js +1 -2
  996. package/components/setup/setup-classes.d.ts +2 -2
  997. package/components/setup/setup-classes.d.ts.map +1 -1
  998. package/components/setup/setup-classes.js +2 -2
  999. package/components/shared/AppPageSidebar.d.ts +1 -1
  1000. package/components/shared/AppPageSidebar.js +1 -1
  1001. package/components/shared/CollapsibleSidebarSection.js +1 -1
  1002. package/components/shared/LanguageDropdown.d.ts +1 -1
  1003. package/components/shared/LanguageDropdown.d.ts.map +1 -1
  1004. package/components/shared/LanguageDropdown.helpers.d.ts +1 -1
  1005. package/components/shared/LanguageDropdown.js +4 -7
  1006. package/components/shared/ThemeToggle.d.ts +1 -1
  1007. package/components/shared/ThemeToggle.js +2 -2
  1008. package/components/shared/confirm-delete-control.js +2 -2
  1009. package/components/shell/ActionBanner.d.ts.map +1 -1
  1010. package/components/shell/ActionBanner.js +3 -2
  1011. package/components/shell/AssistantOverlay.d.ts +1 -1
  1012. package/components/shell/AssistantOverlay.js +3 -3
  1013. package/components/shell/BugReportModal.d.ts.map +1 -1
  1014. package/components/shell/BugReportModal.js +6 -5
  1015. package/components/shell/ChatSurface.d.ts +1 -1
  1016. package/components/shell/ChatSurface.d.ts.map +1 -1
  1017. package/components/shell/ChatSurface.js +7 -2
  1018. package/components/shell/CloudHandoffBanner.d.ts +3 -2
  1019. package/components/shell/CloudHandoffBanner.d.ts.map +1 -1
  1020. package/components/shell/CloudHandoffBanner.js +9 -10
  1021. package/components/shell/CommandPalette.d.ts.map +1 -1
  1022. package/components/shell/CommandPalette.js +57 -5
  1023. package/components/shell/ComputerUseApprovalOverlay.d.ts.map +1 -1
  1024. package/components/shell/ComputerUseApprovalOverlay.js +10 -8
  1025. package/components/shell/ConnectionFailedBanner.d.ts.map +1 -1
  1026. package/components/shell/ConnectionFailedBanner.js +8 -3
  1027. package/components/shell/ConnectionLostOverlay.d.ts.map +1 -1
  1028. package/components/shell/ConnectionLostOverlay.js +7 -2
  1029. package/components/shell/ContinuousChatOverlay.d.ts +2 -2
  1030. package/components/shell/ContinuousChatOverlay.d.ts.map +1 -1
  1031. package/components/shell/ContinuousChatOverlay.js +620 -168
  1032. package/components/shell/HomePill.d.ts +1 -1
  1033. package/components/shell/HomePill.js +1 -1
  1034. package/components/shell/HomeScreen.d.ts +18 -6
  1035. package/components/shell/HomeScreen.d.ts.map +1 -1
  1036. package/components/shell/HomeScreen.js +84 -94
  1037. package/components/shell/HomeSpringboardSurface.d.ts +21 -0
  1038. package/components/shell/HomeSpringboardSurface.d.ts.map +1 -0
  1039. package/components/shell/HomeSpringboardSurface.js +134 -0
  1040. package/components/shell/KioskViewCanvas.d.ts +1 -1
  1041. package/components/shell/LoadingScreen.d.ts +1 -1
  1042. package/components/shell/LoadingScreen.d.ts.map +1 -1
  1043. package/components/shell/LoadingScreen.js +29 -6
  1044. package/components/shell/NotificationCenter.d.ts.map +1 -1
  1045. package/components/shell/NotificationCenter.js +52 -20
  1046. package/components/shell/PairingCommandHint.d.ts.map +1 -1
  1047. package/components/shell/PairingCommandHint.js +4 -2
  1048. package/components/shell/PairingView.d.ts.map +1 -1
  1049. package/components/shell/PairingView.js +11 -2
  1050. package/components/shell/RestartBanner.d.ts.map +1 -1
  1051. package/components/shell/RestartBanner.js +9 -3
  1052. package/components/shell/ShellControllerContext.hooks.d.ts +1 -1
  1053. package/components/shell/ShellHeaderControls.d.ts +3 -3
  1054. package/components/shell/ShellHeaderControls.d.ts.map +1 -1
  1055. package/components/shell/ShellHeaderControls.js +2 -2
  1056. package/components/shell/ShellOverlays.d.ts +1 -1
  1057. package/components/shell/ShellOverlays.d.ts.map +1 -1
  1058. package/components/shell/ShellOverlays.js +19 -4
  1059. package/components/shell/ShortcutsOverlay.d.ts.map +1 -1
  1060. package/components/shell/ShortcutsOverlay.js +10 -3
  1061. package/components/shell/SlashCommandMenu.d.ts +2 -2
  1062. package/components/shell/SlashCommandMenu.d.ts.map +1 -1
  1063. package/components/shell/SlashCommandMenu.js +2 -2
  1064. package/components/shell/StartupFailureView.d.ts +1 -1
  1065. package/components/shell/StartupFailureView.js +3 -3
  1066. package/components/shell/StartupShell.d.ts +1 -1
  1067. package/components/shell/StartupShell.d.ts.map +1 -1
  1068. package/components/shell/StartupShell.js +18 -6
  1069. package/components/shell/SystemWarningBanner.d.ts.map +1 -1
  1070. package/components/shell/SystemWarningBanner.js +5 -3
  1071. package/components/shell/TopicChipsBar.d.ts +14 -0
  1072. package/components/shell/TopicChipsBar.d.ts.map +1 -0
  1073. package/components/shell/TopicChipsBar.js +18 -0
  1074. package/components/shell/TopicGroup.d.ts +21 -0
  1075. package/components/shell/TopicGroup.d.ts.map +1 -0
  1076. package/components/shell/TopicGroup.js +30 -0
  1077. package/components/shell/__e2e__/chat-ambient-fixture.js +2 -2
  1078. package/components/shell/__e2e__/chat-sheet-fixture.js +13 -1
  1079. package/components/shell/__e2e__/chatux-gesture-fixture.d.ts +13 -0
  1080. package/components/shell/__e2e__/chatux-gesture-fixture.d.ts.map +1 -0
  1081. package/components/shell/__e2e__/chatux-gesture-fixture.js +65 -0
  1082. package/components/shell/__e2e__/home-screen-fixture.api-stub.d.ts +97 -9
  1083. package/components/shell/__e2e__/home-screen-fixture.api-stub.d.ts.map +1 -1
  1084. package/components/shell/__e2e__/home-screen-fixture.api-stub.js +30 -9
  1085. package/components/shell/__e2e__/home-screen-fixture.catalog-stub.d.ts +20 -0
  1086. package/components/shell/__e2e__/home-screen-fixture.catalog-stub.d.ts.map +1 -0
  1087. package/components/shell/__e2e__/home-screen-fixture.catalog-stub.js +23 -0
  1088. package/components/shell/__e2e__/home-screen-fixture.core-stub.d.ts +3 -0
  1089. package/components/shell/__e2e__/home-screen-fixture.core-stub.d.ts.map +1 -0
  1090. package/components/shell/__e2e__/home-screen-fixture.core-stub.js +6 -0
  1091. package/components/shell/__e2e__/home-screen-fixture.js +10 -2
  1092. package/components/shell/__e2e__/home-screen-fixture.platform-stub.d.ts +3 -0
  1093. package/components/shell/__e2e__/home-screen-fixture.platform-stub.d.ts.map +1 -0
  1094. package/components/shell/__e2e__/home-screen-fixture.platform-stub.js +6 -0
  1095. package/components/shell/__e2e__/home-screen-fixture.view-kinds-stub.d.ts +5 -0
  1096. package/components/shell/__e2e__/home-screen-fixture.view-kinds-stub.d.ts.map +1 -0
  1097. package/components/shell/__e2e__/home-screen-fixture.view-kinds-stub.js +3 -0
  1098. package/components/shell/__e2e__/home-screen-fixture.views-stub.d.ts +7 -0
  1099. package/components/shell/__e2e__/home-screen-fixture.views-stub.d.ts.map +1 -1
  1100. package/components/shell/__e2e__/home-screen-fixture.views-stub.js +68 -3
  1101. package/components/shell/first-run-theme.d.ts +1 -1
  1102. package/components/shell/glass-composer.helpers.d.ts +2 -2
  1103. package/components/shell/glass-composer.helpers.d.ts.map +1 -1
  1104. package/components/shell/glass-composer.helpers.js +2 -2
  1105. package/components/shell/glass-composer.js +1 -1
  1106. package/components/shell/home-springboard-events.d.ts +7 -0
  1107. package/components/shell/home-springboard-events.d.ts.map +1 -0
  1108. package/components/shell/home-springboard-events.js +6 -0
  1109. package/components/shell/shell-state.d.ts +24 -1
  1110. package/components/shell/shell-state.d.ts.map +1 -1
  1111. package/components/shell/shell-state.js +19 -1
  1112. package/components/shell/startup-shell-types.d.ts +1 -1
  1113. package/components/shell/topic-grouping.d.ts +39 -0
  1114. package/components/shell/topic-grouping.d.ts.map +1 -0
  1115. package/components/shell/topic-grouping.js +81 -0
  1116. package/components/shell/use-conversation-reset.d.ts +14 -0
  1117. package/components/shell/use-conversation-reset.d.ts.map +1 -0
  1118. package/components/shell/use-conversation-reset.js +25 -0
  1119. package/components/shell/use-pull-gesture.d.ts +32 -7
  1120. package/components/shell/use-pull-gesture.d.ts.map +1 -1
  1121. package/components/shell/use-pull-gesture.js +146 -21
  1122. package/components/shell/usePromptSuggestions.d.ts +3 -3
  1123. package/components/shell/usePromptSuggestions.js +1 -1
  1124. package/components/shell/useShellController.d.ts +42 -19
  1125. package/components/shell/useShellController.d.ts.map +1 -1
  1126. package/components/shell/useShellController.js +189 -15
  1127. package/components/shell/useShellVoiceOutput.d.ts +1 -1
  1128. package/components/steward/injected.d.ts +1 -1
  1129. package/components/stream/StatusBar.js +5 -7
  1130. package/components/tool-events/ToolCallEventLog.d.ts +1 -1
  1131. package/components/tool-events/ToolCallEventLog.helpers.d.ts +2 -2
  1132. package/components/training/JobDetailPanel.js +2 -2
  1133. package/components/training/TrainingDashboard.js +1 -1
  1134. package/components/training/hooks/useTrainingApi.d.ts +1 -1
  1135. package/components/training/injected.d.ts +1 -1
  1136. package/components/transcripts/TranscriptBody.d.ts.map +1 -1
  1137. package/components/transcripts/TranscriptBody.js +14 -6
  1138. package/components/transcripts/index.d.ts +4 -4
  1139. package/components/ui/admin-dialog.d.ts +2 -2
  1140. package/components/ui/admin-dialog.js +2 -2
  1141. package/components/ui/badge.js +1 -1
  1142. package/components/ui/button.js +1 -1
  1143. package/components/ui/calendar.d.ts +1 -1
  1144. package/components/ui/calendar.js +3 -3
  1145. package/components/ui/carousel.d.ts +1 -1
  1146. package/components/ui/chart.js +1 -1
  1147. package/components/ui/checkbox.js +1 -1
  1148. package/components/ui/code-block.js +1 -1
  1149. package/components/ui/confirm-dialog.hooks.d.ts +1 -1
  1150. package/components/ui/connection-status.d.ts.map +1 -1
  1151. package/components/ui/connection-status.js +6 -6
  1152. package/components/ui/copy-button.d.ts.map +1 -1
  1153. package/components/ui/copy-button.js +10 -1
  1154. package/components/ui/dialog.js +1 -1
  1155. package/components/ui/dropdown-menu.js +4 -4
  1156. package/components/ui/field-switch.js +1 -1
  1157. package/components/ui/form-select.d.ts +1 -1
  1158. package/components/ui/form-select.js +2 -2
  1159. package/components/ui/grid.d.ts +1 -1
  1160. package/components/ui/input-group.d.ts +1 -1
  1161. package/components/ui/input-group.js +4 -4
  1162. package/components/ui/input.js +3 -3
  1163. package/components/ui/new-action-button.d.ts +1 -1
  1164. package/components/ui/pagination.d.ts +1 -1
  1165. package/components/ui/scroll-area.js +1 -1
  1166. package/components/ui/select.js +2 -2
  1167. package/components/ui/settings-controls.d.ts +6 -6
  1168. package/components/ui/settings-controls.d.ts.map +1 -1
  1169. package/components/ui/settings-controls.js +9 -9
  1170. package/components/ui/slider.js +1 -1
  1171. package/components/ui/stack.d.ts +2 -2
  1172. package/components/ui/status-badge.helpers.d.ts +1 -1
  1173. package/components/ui/switch.js +1 -1
  1174. package/components/ui/tabs.d.ts.map +1 -1
  1175. package/components/ui/tabs.js +2 -2
  1176. package/components/ui/textarea.js +3 -3
  1177. package/components/ui/toggle.js +1 -1
  1178. package/components/ui/tooltip-extended.js +1 -1
  1179. package/components/views/DynamicViewLoader.d.ts +12 -0
  1180. package/components/views/DynamicViewLoader.d.ts.map +1 -1
  1181. package/components/views/DynamicViewLoader.js +82 -18
  1182. package/components/views/ShellViewAgentSurface.d.ts +1 -1
  1183. package/components/views/TerminalPluginView.d.ts.map +1 -1
  1184. package/components/views/TerminalPluginView.js +0 -1
  1185. package/components/views/ViewIcon.d.ts.map +1 -1
  1186. package/components/views/ViewIcon.js +22 -4
  1187. package/components/views/ViewTileImage.d.ts +25 -0
  1188. package/components/views/ViewTileImage.d.ts.map +1 -0
  1189. package/components/views/ViewTileImage.js +52 -0
  1190. package/components/views/view-interact-registry.d.ts +1 -1
  1191. package/components/workspace/AppWorkspaceChrome.d.ts +12 -1
  1192. package/components/workspace/AppWorkspaceChrome.d.ts.map +1 -1
  1193. package/components/workspace/AppWorkspaceChrome.js +3 -3
  1194. package/config/boot-config-store.d.ts +9 -8
  1195. package/config/boot-config-store.d.ts.map +1 -1
  1196. package/config/boot-config-store.js +1 -50
  1197. package/config/branding-react.hooks.d.ts +1 -1
  1198. package/config/branding.d.ts +2 -2
  1199. package/config/config-catalog.d.ts +10 -366
  1200. package/config/config-catalog.d.ts.map +1 -1
  1201. package/config/config-catalog.js +10 -705
  1202. package/config/index.d.ts +7 -7
  1203. package/content-packs/index.d.ts +3 -3
  1204. package/events/index.d.ts +33 -63
  1205. package/events/index.d.ts.map +1 -1
  1206. package/events/index.js +41 -37
  1207. package/first-run/AgentPicker.d.ts +8 -2
  1208. package/first-run/AgentPicker.d.ts.map +1 -1
  1209. package/first-run/AgentPicker.js +4 -4
  1210. package/first-run/CompactOnboarding.d.ts.map +1 -1
  1211. package/first-run/CompactOnboarding.js +2 -2
  1212. package/first-run/deep-link-handler.d.ts +1 -1
  1213. package/first-run/ensure-store-build-workspace-folder.d.ts +1 -1
  1214. package/first-run/first-run-config.d.ts +1 -1
  1215. package/first-run/first-run.d.ts +3 -3
  1216. package/first-run/mobile-runtime-mode.d.ts +1 -1
  1217. package/first-run/pre-seed-local-runtime.d.ts +1 -1
  1218. package/first-run/setup-steps.d.ts +1 -1
  1219. package/first-run/use-first-run-controller.d.ts +3 -3
  1220. package/first-run/use-first-run-controller.d.ts.map +1 -1
  1221. package/first-run/use-first-run-controller.js +64 -68
  1222. package/genui/actions.d.ts +1 -1
  1223. package/genui/index.d.ts +8 -8
  1224. package/genui/modes.d.ts +1 -1
  1225. package/genui/pipe.d.ts +1 -1
  1226. package/genui/renderer.d.ts +1 -1
  1227. package/genui/starter-pack-demo.d.ts +1 -1
  1228. package/genui/streaming.d.ts +1 -1
  1229. package/genui/use-json-render-message.d.ts +1 -1
  1230. package/genui/use-ui-stream.d.ts +1 -1
  1231. package/genui/use-ui-stream.d.ts.map +1 -1
  1232. package/genui/use-ui-stream.js +5 -5
  1233. package/genui/validator.d.ts +1 -1
  1234. package/hooks/BugReportProvider.d.ts +1 -1
  1235. package/hooks/frame-budget.d.ts +124 -0
  1236. package/hooks/frame-budget.d.ts.map +1 -0
  1237. package/hooks/frame-budget.js +183 -0
  1238. package/hooks/index.d.ts +27 -24
  1239. package/hooks/index.d.ts.map +1 -1
  1240. package/hooks/index.js +3 -0
  1241. package/hooks/resource-cache.d.ts.map +1 -1
  1242. package/hooks/resource-cache.js +36 -0
  1243. package/hooks/useAccounts.d.ts +2 -4
  1244. package/hooks/useAccounts.d.ts.map +1 -1
  1245. package/hooks/useAccounts.js +6 -4
  1246. package/hooks/useActivityEvents.d.ts +12 -0
  1247. package/hooks/useActivityEvents.d.ts.map +1 -1
  1248. package/hooks/useActivityEvents.js +48 -69
  1249. package/hooks/useAuthStatus.d.ts +1 -1
  1250. package/hooks/useAuthStatus.d.ts.map +1 -1
  1251. package/hooks/useAuthStatus.js +19 -1
  1252. package/hooks/useAvailableViews.d.ts +17 -3
  1253. package/hooks/useAvailableViews.d.ts.map +1 -1
  1254. package/hooks/useAvailableViews.js +89 -10
  1255. package/hooks/useCachedResource.d.ts +1 -1
  1256. package/hooks/useCloudHandoffPhase.d.ts +1 -1
  1257. package/hooks/useCloudHandoffPhase.d.ts.map +1 -1
  1258. package/hooks/useCloudHandoffPhase.js +15 -9
  1259. package/hooks/useConnectorAccounts.d.ts +2 -4
  1260. package/hooks/useConnectorAccounts.d.ts.map +1 -1
  1261. package/hooks/useConnectorAccounts.js +1 -1
  1262. package/hooks/useConnectorReconnect.d.ts +1 -1
  1263. package/hooks/useConnectorSendAsAccount.d.ts +3 -5
  1264. package/hooks/useConnectorSendAsAccount.d.ts.map +1 -1
  1265. package/hooks/useContextMenu.d.ts +1 -1
  1266. package/hooks/useContextMenu.d.ts.map +1 -1
  1267. package/hooks/useContextMenu.js +6 -2
  1268. package/hooks/useContinuousChat.d.ts +2 -2
  1269. package/hooks/useDefaultProviderPresets.d.ts +1 -1
  1270. package/hooks/useDesktopTabs.d.ts +1 -1
  1271. package/hooks/useDesktopTabs.d.ts.map +1 -1
  1272. package/hooks/useDesktopTabs.js +27 -9
  1273. package/hooks/useFrameBudgetMonitor.d.ts +30 -0
  1274. package/hooks/useFrameBudgetMonitor.d.ts.map +1 -0
  1275. package/hooks/useFrameBudgetMonitor.js +105 -0
  1276. package/hooks/useKeyboardShortcuts.d.ts +4 -0
  1277. package/hooks/useKeyboardShortcuts.d.ts.map +1 -1
  1278. package/hooks/useKeyboardShortcuts.js +19 -11
  1279. package/hooks/useLayoutShiftMonitor.d.ts +43 -0
  1280. package/hooks/useLayoutShiftMonitor.d.ts.map +1 -0
  1281. package/hooks/useLayoutShiftMonitor.js +128 -0
  1282. package/hooks/useNow.d.ts +10 -0
  1283. package/hooks/useNow.d.ts.map +1 -0
  1284. package/hooks/useNow.js +18 -0
  1285. package/hooks/useRuntimeMode.d.ts +1 -1
  1286. package/hooks/useSignalPairing.d.ts +2 -2
  1287. package/hooks/useViewCatalog.d.ts +2 -2
  1288. package/hooks/useViewCatalog.js +5 -5
  1289. package/hooks/useViewEvent.d.ts +1 -1
  1290. package/hooks/useVoiceChat.d.ts +17 -6
  1291. package/hooks/useVoiceChat.d.ts.map +1 -1
  1292. package/hooks/useVoiceChat.js +49 -2
  1293. package/hooks/useWhatsAppPairing.d.ts +2 -2
  1294. package/hooks/view-catalog.d.ts +37 -5
  1295. package/hooks/view-catalog.d.ts.map +1 -1
  1296. package/hooks/view-catalog.js +75 -5
  1297. package/i18n/index.d.ts +1 -1
  1298. package/i18n/locales/en.json +65 -21
  1299. package/i18n/locales/es.json +15 -16
  1300. package/i18n/locales/ja.json +15 -16
  1301. package/i18n/locales/ko.json +15 -16
  1302. package/i18n/locales/pt.json +15 -16
  1303. package/i18n/locales/tl.json +15 -16
  1304. package/i18n/locales/vi.json +15 -16
  1305. package/i18n/locales/zh-CN.json +15 -16
  1306. package/i18n/region.d.ts +1 -1
  1307. package/index.d.ts +146 -138
  1308. package/index.d.ts.map +1 -1
  1309. package/index.js +12 -2
  1310. package/layouts/chat-panel-layout/index.d.ts +1 -1
  1311. package/layouts/content-layout/index.d.ts +1 -1
  1312. package/layouts/index.d.ts +4 -4
  1313. package/layouts/page-layout/index.d.ts +4 -4
  1314. package/layouts/page-layout/page-layout-mobile-drawer.d.ts +1 -1
  1315. package/layouts/page-layout/page-layout-types.d.ts +2 -2
  1316. package/layouts/page-layout/page-layout.d.ts +1 -1
  1317. package/layouts/workspace-layout/index.d.ts +3 -3
  1318. package/layouts/workspace-layout/workspace-layout-types.d.ts +1 -1
  1319. package/layouts/workspace-layout/workspace-layout.d.ts +1 -1
  1320. package/layouts/workspace-layout/workspace-layout.d.ts.map +1 -1
  1321. package/layouts/workspace-layout/workspace-layout.js +2 -1
  1322. package/navigation/index.d.ts +4 -4
  1323. package/navigation/index.d.ts.map +1 -1
  1324. package/navigation/index.js +26 -16
  1325. package/package.json +26 -10
  1326. package/perf/PerfOverlay.d.ts +21 -0
  1327. package/perf/PerfOverlay.d.ts.map +1 -0
  1328. package/perf/PerfOverlay.js +90 -0
  1329. package/perf/perf-hud-control.d.ts +21 -0
  1330. package/perf/perf-hud-control.d.ts.map +1 -0
  1331. package/perf/perf-hud-control.js +98 -0
  1332. package/platform/assistant-launch-payload.d.ts.map +1 -1
  1333. package/platform/assistant-launch-payload.js +0 -3
  1334. package/platform/cloud-preference-patch.d.ts +1 -1
  1335. package/platform/desktop-permissions-client.d.ts +1 -1
  1336. package/platform/first-run-reset.d.ts +1 -1
  1337. package/platform/index.d.ts +14 -14
  1338. package/platform/init.d.ts +1 -1
  1339. package/platform/mobile-permissions-client.d.ts +1 -1
  1340. package/platform/platform-guards.d.ts +8 -0
  1341. package/platform/platform-guards.d.ts.map +1 -1
  1342. package/platform/platform-guards.js +2 -4
  1343. package/platform/types.d.ts +1 -1
  1344. package/platform/window-shell.d.ts +1 -1
  1345. package/retained-lazy.d.ts +1 -2
  1346. package/retained-lazy.d.ts.map +1 -1
  1347. package/services/app-updates/update-policy.d.ts +1 -1
  1348. package/services/app-updates/update-policy.d.ts.map +1 -1
  1349. package/services/app-updates/update-policy.js +1 -1
  1350. package/services/local-inference/active-model.d.ts +3 -3
  1351. package/services/local-inference/assignments.d.ts +6 -8
  1352. package/services/local-inference/assignments.d.ts.map +1 -1
  1353. package/services/local-inference/assignments.js +31 -14
  1354. package/services/local-inference/catalog-policy.d.ts +2 -1
  1355. package/services/local-inference/catalog-policy.d.ts.map +1 -1
  1356. package/services/local-inference/catalog-policy.js +6 -0
  1357. package/services/local-inference/catalog.d.ts +1 -1
  1358. package/services/local-inference/catalog.d.ts.map +1 -1
  1359. package/services/local-inference/catalog.js +1 -1
  1360. package/services/local-inference/custom-search.d.ts +2 -1
  1361. package/services/local-inference/custom-search.d.ts.map +1 -1
  1362. package/services/local-inference/custom-search.js +13 -21
  1363. package/services/local-inference/device-bridge.d.ts +1 -1
  1364. package/services/local-inference/downloader.d.ts +6 -5
  1365. package/services/local-inference/downloader.d.ts.map +1 -1
  1366. package/services/local-inference/downloader.js +9 -5
  1367. package/services/local-inference/engine.d.ts +1 -1
  1368. package/services/local-inference/external-scanner.d.ts +1 -1
  1369. package/services/local-inference/hardware.d.ts +2 -2
  1370. package/services/local-inference/hf-search.d.ts +5 -20
  1371. package/services/local-inference/hf-search.d.ts.map +1 -1
  1372. package/services/local-inference/hf-search.js +14 -272
  1373. package/services/local-inference/home-model-status.d.ts +1 -1
  1374. package/services/local-inference/index.d.ts +10 -10
  1375. package/services/local-inference/readiness.d.ts +1 -1
  1376. package/services/local-inference/recommendation.d.ts +1 -1
  1377. package/services/local-inference/registry.d.ts +11 -13
  1378. package/services/local-inference/registry.d.ts.map +1 -1
  1379. package/services/local-inference/registry.js +18 -17
  1380. package/services/local-inference/routing-policy.d.ts +6 -2
  1381. package/services/local-inference/routing-policy.d.ts.map +1 -1
  1382. package/services/local-inference/routing-policy.js +36 -8
  1383. package/services/local-inference/service.d.ts +6 -6
  1384. package/services/local-inference/service.d.ts.map +1 -1
  1385. package/services/local-inference/service.js +19 -8
  1386. package/services/local-inference/token-tree.d.ts +1 -1
  1387. package/slots/task-coordinator-slots.d.ts +2 -2
  1388. package/spatial/context.d.ts +1 -1
  1389. package/spatial/dom.d.ts +9 -3
  1390. package/spatial/dom.d.ts.map +1 -1
  1391. package/spatial/dom.js +13 -3
  1392. package/spatial/evaluate.d.ts +1 -1
  1393. package/spatial/index.d.ts +6 -6
  1394. package/spatial/primitives.d.ts +3 -3
  1395. package/spatial/primitives.d.ts.map +1 -1
  1396. package/spatial/primitives.js +10 -7
  1397. package/spatial/tui/engine.d.ts +1 -1
  1398. package/spatial/tui/index.d.ts +3 -3
  1399. package/spatial/tui/index.d.ts.map +1 -1
  1400. package/spatial/tui/index.js +2 -2
  1401. package/spatial/tui/renderer.d.ts +9 -2
  1402. package/spatial/tui/renderer.d.ts.map +1 -1
  1403. package/spatial/tui/renderer.js +47 -2
  1404. package/state/AppContext.d.ts +1 -1
  1405. package/state/AppContext.d.ts.map +1 -1
  1406. package/state/AppContext.js +83 -30
  1407. package/state/ChatComposerContext.hooks.d.ts +1 -1
  1408. package/state/ChatTurnStatusContext.hooks.d.ts +27 -0
  1409. package/state/ChatTurnStatusContext.hooks.d.ts.map +1 -0
  1410. package/state/ChatTurnStatusContext.hooks.js +24 -0
  1411. package/state/CompanionSceneConfigContext.hooks.d.ts +3 -3
  1412. package/state/ConversationMessagesContext.hooks.d.ts +26 -0
  1413. package/state/ConversationMessagesContext.hooks.d.ts.map +1 -0
  1414. package/state/ConversationMessagesContext.hooks.js +22 -0
  1415. package/state/PtySessionsContext.hooks.d.ts +1 -1
  1416. package/state/TranslationContext.hooks.d.ts +1 -1
  1417. package/state/TranslationProvider.d.ts +2 -2
  1418. package/state/action-notice.d.ts +31 -1
  1419. package/state/action-notice.d.ts.map +1 -1
  1420. package/state/action-notice.js +27 -1
  1421. package/state/agent-profiles.d.ts +10 -2
  1422. package/state/agent-profiles.d.ts.map +1 -1
  1423. package/state/agent-profiles.js +20 -0
  1424. package/state/agent-runtime-target.d.ts +2 -2
  1425. package/state/app-store.d.ts +52 -0
  1426. package/state/app-store.d.ts.map +1 -0
  1427. package/state/app-store.js +169 -0
  1428. package/state/autonomy.d.ts +1 -1
  1429. package/state/chat-conversation-guards.d.ts +1 -1
  1430. package/state/chat-conversation-guards.d.ts.map +1 -1
  1431. package/state/chat-conversation-guards.js +0 -1
  1432. package/state/complete-reset-local-state-after-wipe.d.ts +1 -1
  1433. package/state/conversation-message-filter.d.ts +1 -1
  1434. package/state/first-run-bootstrap.d.ts +1 -1
  1435. package/state/first-run-restart.d.ts +1 -1
  1436. package/state/handle-reset-applied-from-main.d.ts +2 -2
  1437. package/state/index.d.ts +24 -18
  1438. package/state/index.d.ts.map +1 -1
  1439. package/state/index.js +6 -0
  1440. package/state/internal.d.ts +11 -11
  1441. package/state/notifications/navigate-deep-link.d.ts +27 -0
  1442. package/state/notifications/navigate-deep-link.d.ts.map +1 -0
  1443. package/state/notifications/navigate-deep-link.js +48 -0
  1444. package/state/notifications/notification-store.d.ts +2 -2
  1445. package/state/notifications/notification-store.d.ts.map +1 -1
  1446. package/state/notifications/notification-store.js +4 -4
  1447. package/state/parsers.d.ts +3 -3
  1448. package/state/parsers.d.ts.map +1 -1
  1449. package/state/parsers.js +9 -3
  1450. package/state/persistence.d.ts +23 -8
  1451. package/state/persistence.d.ts.map +1 -1
  1452. package/state/persistence.js +86 -4
  1453. package/state/screen-capture-bridge.d.ts +8 -0
  1454. package/state/screen-capture-bridge.d.ts.map +1 -0
  1455. package/state/screen-capture-bridge.js +124 -0
  1456. package/state/setup-resume.d.ts +2 -2
  1457. package/state/shell-routing.d.ts +3 -3
  1458. package/state/shell-surface-store.d.ts +50 -0
  1459. package/state/shell-surface-store.d.ts.map +1 -0
  1460. package/state/shell-surface-store.js +130 -0
  1461. package/state/springboard-layout.d.ts +85 -0
  1462. package/state/springboard-layout.d.ts.map +1 -0
  1463. package/state/springboard-layout.js +180 -0
  1464. package/state/startup-coordinator.d.ts +1 -1
  1465. package/state/startup-phase-hydrate.d.ts +5 -5
  1466. package/state/startup-phase-hydrate.d.ts.map +1 -1
  1467. package/state/startup-phase-hydrate.js +6 -0
  1468. package/state/startup-phase-poll.d.ts +8 -8
  1469. package/state/startup-phase-restore.d.ts +22 -6
  1470. package/state/startup-phase-restore.d.ts.map +1 -1
  1471. package/state/startup-phase-restore.js +91 -1
  1472. package/state/startup-phase-runtime.d.ts +3 -3
  1473. package/state/startup-telemetry.d.ts +73 -0
  1474. package/state/startup-telemetry.d.ts.map +1 -0
  1475. package/state/startup-telemetry.js +139 -0
  1476. package/state/types.d.ts +36 -12
  1477. package/state/types.d.ts.map +1 -1
  1478. package/state/types.js +13 -0
  1479. package/state/ui-preferences.d.ts +39 -0
  1480. package/state/ui-preferences.d.ts.map +1 -1
  1481. package/state/ui-preferences.js +30 -1
  1482. package/state/use-startup-shell-controller.d.ts +8 -1
  1483. package/state/use-startup-shell-controller.d.ts.map +1 -1
  1484. package/state/use-startup-shell-controller.js +63 -3
  1485. package/state/useApp.d.ts +1 -1
  1486. package/state/useAppLifecycleEvents.d.ts +1 -1
  1487. package/state/useAppProviderEffects.d.ts +3 -3
  1488. package/state/useBackgroundConfig.d.ts +16 -0
  1489. package/state/useBackgroundConfig.d.ts.map +1 -0
  1490. package/state/useBackgroundConfig.js +21 -0
  1491. package/state/useCharacterState.d.ts +2 -2
  1492. package/state/useChatCallbacks.d.ts +40 -7
  1493. package/state/useChatCallbacks.d.ts.map +1 -1
  1494. package/state/useChatCallbacks.js +218 -132
  1495. package/state/useChatLifecycle.d.ts +12 -4
  1496. package/state/useChatLifecycle.d.ts.map +1 -1
  1497. package/state/useChatLifecycle.js +26 -2
  1498. package/state/useChatSend.d.ts +7 -4
  1499. package/state/useChatSend.d.ts.map +1 -1
  1500. package/state/useChatSend.js +126 -21
  1501. package/state/useChatState.d.ts +4 -4
  1502. package/state/useContentPack.d.ts.map +1 -1
  1503. package/state/useContentPack.js +12 -2
  1504. package/state/useDataLoaders.d.ts +6 -5
  1505. package/state/useDataLoaders.d.ts.map +1 -1
  1506. package/state/useDataLoaders.js +99 -5
  1507. package/state/useDeveloperMode.d.ts.map +1 -1
  1508. package/state/useDeveloperMode.js +48 -8
  1509. package/state/useDisplayPreferences.d.ts +6 -2
  1510. package/state/useDisplayPreferences.d.ts.map +1 -1
  1511. package/state/useDisplayPreferences.js +40 -2
  1512. package/state/useFirstRunCallbacks.d.ts +8 -8
  1513. package/state/useFirstRunState.d.ts +3 -3
  1514. package/state/useLifecycleState.d.ts +9 -2
  1515. package/state/useLifecycleState.d.ts.map +1 -1
  1516. package/state/useLifecycleState.js +26 -1
  1517. package/state/useLogsState.d.ts +1 -1
  1518. package/state/useMiscUiState.d.ts +1 -1
  1519. package/state/useNavigationState.d.ts +2 -2
  1520. package/state/usePluginsSkillsState.d.ts +3 -3
  1521. package/state/usePreviewMode.d.ts +4 -0
  1522. package/state/usePreviewMode.d.ts.map +1 -0
  1523. package/state/usePreviewMode.js +93 -0
  1524. package/state/useStartupCoordinator.d.ts +5 -5
  1525. package/state/useStartupCoordinator.d.ts.map +1 -1
  1526. package/state/useStartupCoordinator.js +9 -0
  1527. package/state/useStreamingText.d.ts +1 -1
  1528. package/state/useTriggersState.d.ts +1 -1
  1529. package/state/useViewKinds.d.ts +19 -0
  1530. package/state/useViewKinds.d.ts.map +1 -0
  1531. package/state/useViewKinds.js +28 -0
  1532. package/state/useWalletState.d.ts +3 -3
  1533. package/state/vrm.d.ts +1 -1
  1534. package/storybook/home-widget-decorator.d.ts +21 -0
  1535. package/storybook/home-widget-decorator.d.ts.map +1 -0
  1536. package/storybook/home-widget-decorator.js +53 -0
  1537. package/storybook/mock-providers.d.ts +2 -2
  1538. package/storybook/mock-providers.d.ts.map +1 -1
  1539. package/storybook/mock-providers.helpers.d.ts +1 -1
  1540. package/storybook/mock-providers.js +20 -1
  1541. package/styles/base.css +66 -32
  1542. package/styles/brand-gold.css +0 -7
  1543. package/styles/styles.css +10 -5
  1544. package/testing/layout-stability.d.ts +67 -0
  1545. package/testing/layout-stability.d.ts.map +1 -0
  1546. package/testing/layout-stability.js +106 -0
  1547. package/testing/render-counter.d.ts +56 -0
  1548. package/testing/render-counter.d.ts.map +1 -0
  1549. package/testing/render-counter.js +62 -0
  1550. package/themes/presets.d.ts.map +1 -1
  1551. package/themes/presets.js +17 -15
  1552. package/utils/attachment-url.d.ts +42 -0
  1553. package/utils/attachment-url.d.ts.map +1 -0
  1554. package/utils/attachment-url.js +130 -0
  1555. package/utils/cloud-agent-base.d.ts +0 -1
  1556. package/utils/cloud-agent-base.d.ts.map +1 -1
  1557. package/utils/cloud-agent-base.js +0 -8
  1558. package/utils/download-share.d.ts +65 -0
  1559. package/utils/download-share.d.ts.map +1 -0
  1560. package/utils/download-share.js +292 -0
  1561. package/utils/event-source.d.ts +17 -0
  1562. package/utils/event-source.d.ts.map +1 -0
  1563. package/utils/event-source.js +36 -0
  1564. package/utils/image-attachment.d.ts +156 -4
  1565. package/utils/image-attachment.d.ts.map +1 -1
  1566. package/utils/image-attachment.js +193 -4
  1567. package/utils/index.d.ts +33 -33
  1568. package/utils/workflow-executions.d.ts +1 -1
  1569. package/utils/workflow-json.d.ts +1 -1
  1570. package/view-telemetry.d.ts +30 -0
  1571. package/view-telemetry.d.ts.map +1 -0
  1572. package/view-telemetry.js +47 -0
  1573. package/views/view-interact-protocol.d.ts +6 -0
  1574. package/views/view-interact-protocol.d.ts.map +1 -1
  1575. package/views/view-interact-protocol.js +6 -0
  1576. package/voice/audio-frame-diarization-harness.d.ts +5 -0
  1577. package/voice/audio-frame-diarization-harness.d.ts.map +1 -1
  1578. package/voice/audio-frame-pump.d.ts +1 -1
  1579. package/voice/character-voice-config.d.ts +2 -2
  1580. package/voice/end-of-turn.d.ts +14 -11
  1581. package/voice/end-of-turn.d.ts.map +1 -1
  1582. package/voice/end-of-turn.js +14 -119
  1583. package/voice/index.d.ts +11 -10
  1584. package/voice/index.d.ts.map +1 -1
  1585. package/voice/index.js +1 -0
  1586. package/voice/jni-voice-harness.d.ts +19 -4
  1587. package/voice/jni-voice-harness.d.ts.map +1 -1
  1588. package/voice/jni-voice-harness.js +45 -10
  1589. package/voice/jni-voice-pipeline.d.ts +27 -3
  1590. package/voice/jni-voice-pipeline.d.ts.map +1 -1
  1591. package/voice/jni-voice-pipeline.js +40 -2
  1592. package/voice/local-asr-capture.js +1 -1
  1593. package/voice/local-asr-transcribe.d.ts +2 -2
  1594. package/voice/local-asr-transcribe.d.ts.map +1 -1
  1595. package/voice/local-asr-transcribe.js +3 -3
  1596. package/voice/playback-frame-pump.d.ts +49 -0
  1597. package/voice/playback-frame-pump.d.ts.map +1 -0
  1598. package/voice/playback-frame-pump.js +387 -0
  1599. package/voice/should-respond.d.ts +7 -32
  1600. package/voice/should-respond.d.ts.map +1 -1
  1601. package/voice/should-respond.js +7 -68
  1602. package/voice/useVoiceConfig.d.ts +1 -1
  1603. package/voice/voice-capture-factory.d.ts +2 -2
  1604. package/voice/voice-capture-factory.js +3 -3
  1605. package/voice/voice-chat-playback.d.ts +1 -1
  1606. package/voice/voice-chat-types.d.ts +2 -2
  1607. package/voice/voice-provider-defaults.d.ts +8 -5
  1608. package/voice/voice-provider-defaults.d.ts.map +1 -1
  1609. package/voice/voice-provider-defaults.js +17 -10
  1610. package/voice/voice-selftest/VoiceSelfTestShell.d.ts +11 -0
  1611. package/voice/voice-selftest/VoiceSelfTestShell.d.ts.map +1 -1
  1612. package/voice/voice-selftest/VoiceSelfTestShell.js +1 -4
  1613. package/voice/voice-selftest/VoiceWorkbenchShell.d.ts +29 -0
  1614. package/voice/voice-selftest/VoiceWorkbenchShell.d.ts.map +1 -0
  1615. package/voice/voice-selftest/VoiceWorkbenchShell.js +133 -0
  1616. package/voice/voice-selftest/timing.d.ts +8 -0
  1617. package/voice/voice-selftest/timing.d.ts.map +1 -0
  1618. package/voice/voice-selftest/timing.js +7 -0
  1619. package/voice/voice-selftest/voice-selftest-harness.d.ts +1 -1
  1620. package/voice/voice-selftest/voice-selftest-harness.d.ts.map +1 -1
  1621. package/voice/voice-selftest/voice-selftest-harness.js +1 -2
  1622. package/voice/voice-selftest/voice-workbench-player.d.ts +139 -0
  1623. package/voice/voice-selftest/voice-workbench-player.d.ts.map +1 -0
  1624. package/voice/voice-selftest/voice-workbench-player.js +401 -0
  1625. package/voice/voice-turn-signal.d.ts +15 -26
  1626. package/voice/voice-turn-signal.d.ts.map +1 -1
  1627. package/voice/voice-turn-signal.js +7 -51
  1628. package/widgets/WidgetHost.d.ts +10 -4
  1629. package/widgets/WidgetHost.d.ts.map +1 -1
  1630. package/widgets/WidgetHost.js +149 -30
  1631. package/widgets/__fixtures__/home-widget-mock-data.d.ts +89 -0
  1632. package/widgets/__fixtures__/home-widget-mock-data.d.ts.map +1 -0
  1633. package/widgets/__fixtures__/home-widget-mock-data.js +388 -0
  1634. package/widgets/home-attention-store.d.ts +40 -0
  1635. package/widgets/home-attention-store.d.ts.map +1 -0
  1636. package/widgets/home-attention-store.js +84 -0
  1637. package/widgets/home-priority.d.ts +136 -0
  1638. package/widgets/home-priority.d.ts.map +1 -0
  1639. package/widgets/home-priority.js +276 -0
  1640. package/widgets/index.d.ts +10 -7
  1641. package/widgets/index.d.ts.map +1 -1
  1642. package/widgets/index.js +4 -2
  1643. package/widgets/registry-store.d.ts +9 -11
  1644. package/widgets/registry-store.d.ts.map +1 -1
  1645. package/widgets/registry-store.js +8 -12
  1646. package/widgets/registry.d.ts +16 -4
  1647. package/widgets/registry.d.ts.map +1 -1
  1648. package/widgets/registry.js +432 -8
  1649. package/widgets/types.d.ts +12 -4
  1650. package/widgets/types.d.ts.map +1 -1
  1651. package/widgets/types.js +7 -1
  1652. package/widgets/useChatSidebarVisibility.d.ts +6 -3
  1653. package/widgets/useChatSidebarVisibility.d.ts.map +1 -1
  1654. package/widgets/useChatSidebarVisibility.js +15 -11
  1655. package/widgets/visibility.d.ts +16 -10
  1656. package/widgets/visibility.d.ts.map +1 -1
  1657. package/widgets/visibility.js +25 -13
  1658. package/api/agent-client-type-shim.d.ts +0 -24
  1659. package/api/agent-client-type-shim.d.ts.map +0 -1
  1660. package/api/agent-client-type-shim.js +0 -1
  1661. package/cloud/account-security/use-document-title.d.ts +0 -10
  1662. package/cloud/account-security/use-document-title.d.ts.map +0 -1
  1663. package/cloud/account-security/use-document-title.js +0 -20
  1664. package/cloud/admin/lib/format-usd.d.ts +0 -11
  1665. package/cloud/admin/lib/format-usd.d.ts.map +0 -1
  1666. package/cloud/admin/lib/format-usd.js +0 -18
  1667. package/cloud/admin/use-document-title.d.ts +0 -10
  1668. package/cloud/admin/use-document-title.d.ts.map +0 -1
  1669. package/cloud/api-explorer/use-document-title.d.ts +0 -11
  1670. package/cloud/api-explorer/use-document-title.d.ts.map +0 -1
  1671. package/cloud/api-explorer/use-document-title.js +0 -21
  1672. package/cloud/api-keys/use-document-title.d.ts +0 -10
  1673. package/cloud/api-keys/use-document-title.d.ts.map +0 -1
  1674. package/cloud/api-keys/use-document-title.js +0 -20
  1675. package/cloud/applications/lib/auth-query.d.ts +0 -14
  1676. package/cloud/applications/lib/auth-query.d.ts.map +0 -1
  1677. package/cloud/applications/lib/auth-query.js +0 -18
  1678. package/cloud/applications/lib/use-copy-feedback.d.ts +0 -9
  1679. package/cloud/applications/lib/use-copy-feedback.d.ts.map +0 -1
  1680. package/cloud/applications/lib/use-copy-feedback.js +0 -13
  1681. package/cloud/applications/lib/use-session-auth.d.ts +0 -28
  1682. package/cloud/applications/lib/use-session-auth.d.ts.map +0 -1
  1683. package/cloud/approvals/lib/auth-query.d.ts +0 -18
  1684. package/cloud/approvals/lib/auth-query.d.ts.map +0 -1
  1685. package/cloud/approvals/lib/auth-query.js +0 -22
  1686. package/cloud/approvals/lib/use-session-auth.d.ts +0 -28
  1687. package/cloud/approvals/lib/use-session-auth.d.ts.map +0 -1
  1688. package/cloud/approvals/lib/use-session-auth.js +0 -97
  1689. package/cloud/documents/lib/auth-query.d.ts +0 -17
  1690. package/cloud/documents/lib/auth-query.d.ts.map +0 -1
  1691. package/cloud/documents/lib/use-session-auth.d.ts +0 -27
  1692. package/cloud/documents/lib/use-session-auth.d.ts.map +0 -1
  1693. package/cloud/documents/lib/use-session-auth.js +0 -96
  1694. package/cloud/documents/use-document-title.d.ts +0 -11
  1695. package/cloud/documents/use-document-title.d.ts.map +0 -1
  1696. package/cloud/documents/use-document-title.js +0 -21
  1697. package/cloud/instances/lib/format-bytes.d.ts +0 -19
  1698. package/cloud/instances/lib/format-bytes.d.ts.map +0 -1
  1699. package/cloud/instances/lib/format-bytes.js +0 -25
  1700. package/cloud/instances/lib/use-copy-feedback.d.ts +0 -9
  1701. package/cloud/instances/lib/use-copy-feedback.d.ts.map +0 -1
  1702. package/cloud/instances/lib/use-document-title.d.ts +0 -13
  1703. package/cloud/instances/lib/use-document-title.d.ts.map +0 -1
  1704. package/cloud/instances/lib/use-document-title.js +0 -23
  1705. package/cloud/monetization/lib/format-usd.d.ts +0 -12
  1706. package/cloud/monetization/lib/format-usd.d.ts.map +0 -1
  1707. package/cloud/monetization/lib/format-usd.js +0 -19
  1708. package/cloud/monetization/use-document-title.d.ts +0 -10
  1709. package/cloud/monetization/use-document-title.d.ts.map +0 -1
  1710. package/cloud/monetization/use-document-title.js +0 -20
  1711. package/components/local-inference/CustomModelSearch.d.ts +0 -19
  1712. package/components/local-inference/CustomModelSearch.d.ts.map +0 -1
  1713. package/components/local-inference/CustomModelSearch.js +0 -128
  1714. package/components/pages/ViewCatalog.d.ts +0 -10
  1715. package/components/pages/ViewCatalog.d.ts.map +0 -1
  1716. package/components/pages/ViewCatalog.js +0 -600
  1717. package/components/shell/ChatAmbientBackground.d.ts +0 -8
  1718. package/components/shell/ChatAmbientBackground.d.ts.map +0 -1
  1719. package/components/shell/ChatAmbientBackground.js +0 -51
@@ -1,25 +1,34 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { transcriptPlainText } from "@elizaos/shared/transcripts";
3
- import { FileText, Film, Home, LayoutGrid, Loader2, Maximize2, Mic, Minimize2, Music, RotateCcw, SendHorizontal, Settings as SettingsIcon, } from "lucide-react";
3
+ import { Check, Copy, FileText, Film, LayoutGrid, Loader2, Maximize2, Mic, Minimize2, Music, RotateCcw, SendHorizontal, } from "lucide-react";
4
4
  import { AnimatePresence, animate, motion, useMotionValue, useMotionValueEvent, useReducedMotion, useTransform, } from "motion/react";
5
5
  import * as React from "react";
6
6
  import { client } from "../../api/client.js";
7
- import { parseSlashDraft, runSlashExecution, splitLeadingSlashCommand, } from "../../chat/slash-menu.js";
8
- import { TUTORIAL_CHAT_CONTROL_EVENT, } from "../../events/index.js";
7
+ import { parseSlashDraft, resolveClientShortcutExecution, runSlashExecution, splitLeadingSlashCommand, } from "../../chat/slash-menu.js";
8
+ import { CHAT_PREFILL_EVENT, TUTORIAL_CHAT_CONTROL_EVENT, } from "../../events/index.js";
9
9
  import { Z_SHELL_OVERLAY } from "../../lib/floating-layers.js";
10
10
  import { cn } from "../../lib/utils.js";
11
11
  import { useViewChatBinding } from "../../state/view-chat-binding.js";
12
12
  import { copyTextToClipboard } from "../../utils/clipboard.js";
13
- import { CHAT_UPLOAD_ACCEPT, chatUploadKind, filesToImageAttachments, MAX_CHAT_IMAGES, } from "../../utils/image-attachment.js";
13
+ import { CHAT_UPLOAD_ACCEPT, chatUploadKind, classifyComposerPaste, intakeAttachmentFiles, MAX_CHAT_IMAGES, summarizeDroppedAttachments, } from "../../utils/image-attachment.js";
14
+ import { InlineWidgetText } from "../chat/InlineWidgetText.js";
14
15
  import { MessageAttachments } from "../chat/MessageAttachments.js";
16
+ import { SensitiveRequestBlock } from "../chat/MessageContent.js";
17
+ import { conversationTranscriptText } from "../chat/message-parser-helpers.js";
15
18
  import { ThinkingBlock } from "../chat/ThinkingBlock.js";
19
+ import { withTranscriptMarker } from "../chat/TranscriptViewerOverlay.js";
16
20
  import { SlashCommandMenu, useSlashMenu } from "./SlashCommandMenu.js";
21
+ import { selectVisibleShellMessages } from "./shell-state.js";
22
+ import { TopicChipsBar } from "./TopicChipsBar.js";
23
+ import { TopicGroup } from "./TopicGroup.js";
24
+ import { deriveChannelTopics, groupMessagesByTopic } from "./topic-grouping.js";
17
25
  import { usePullGesture } from "./use-pull-gesture.js";
18
26
  import { usePromptSuggestions } from "./usePromptSuggestions.js";
19
27
  /** No-op slash controller so the overlay renders without a provider (stories). */
20
28
  const EMPTY_SLASH_CONTROLLER = {
21
29
  commands: [],
22
30
  loading: false,
31
+ naturalShortcutsEnabled: false,
23
32
  resolveChoices: () => [],
24
33
  resolveSection: () => undefined,
25
34
  navigateTab: () => { },
@@ -74,10 +83,6 @@ const SHEET_TOP_MARGIN = 72;
74
83
  // of resting free — so near-detent releases are deterministic + clean, and only
75
84
  // the clear gaps between detents keep the free-drag rest height.
76
85
  const SHEET_DETENT_MAGNET = 64;
77
- // Cap how many turns are actually rendered. Older messages stay in state (the
78
- // agent's context is untouched) — this only bounds DOM nodes so a long thread
79
- // can't jank scrolling on a phone, without pulling in a virtualizer.
80
- const MAX_RENDERED_MESSAGES = 80;
81
86
  // Feature flag: the resting one-tap prompt-suggestion strip. Off for now so the
82
87
  // composer can be tested without it; flip to true to bring the strip back.
83
88
  const SHOW_PROMPT_SUGGESTIONS = false;
@@ -128,7 +133,7 @@ function wavBytesToBase64(bytes) {
128
133
  let binary = "";
129
134
  const chunk = 0x8000;
130
135
  for (let i = 0; i < bytes.length; i += chunk) {
131
- binary += String.fromCharCode(...bytes.subarray(i, i + chunk));
136
+ binary += String.fromCharCode(...Array.from(bytes.subarray(i, i + chunk)));
132
137
  }
133
138
  return btoa(binary);
134
139
  }
@@ -146,7 +151,7 @@ function SoftButton({ glyph, icon: Icon, label, onClick, onPointerDown, onPointe
146
151
  return (_jsx("button", { type: "button", "data-testid": testId, "aria-label": label, "aria-pressed": active, "aria-disabled": disabled, onClick: disabled ? undefined : onClick, onPointerDown: disabled ? undefined : onPointerDown, onPointerUp: disabled ? undefined : onPointerUp, onPointerCancel: disabled ? undefined : onPointerCancel, className: cn(
147
152
  // 44×44 hit target (WCAG 2.5.5) — comfortably thumb-tappable without
148
153
  // crowding the bar (split the difference back down from 48).
149
- "grid h-11 w-11 shrink-0 place-items-center rounded-full border transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/70", active
154
+ "grid h-11 w-11 shrink-0 place-items-center rounded-full border transition-colors", " ", active
150
155
  ? "border-white/40 bg-white/85 text-black"
151
156
  : "border-white/15 bg-white/10 text-white/75 hover:bg-white/20 hover:text-white", disabled && "opacity-40"), children: Icon ? (_jsx(Icon, { className: "h-[22px] w-[22px]", "aria-hidden": true })) : glyph ? (_jsx(Glyph, { d: glyph })) : null }));
152
157
  }
@@ -154,13 +159,37 @@ function SoftButton({ glyph, icon: Icon, label, onClick, onPointerDown, onPointe
154
159
  * settings). Smaller than SoftButton; same neutral resting → neutral-hover
155
160
  * language (no blue), `active` gets the white fill. Renders a lucide icon. */
156
161
  function HeaderButton({ icon: Icon, label, onClick, active, disabled, testId, }) {
157
- return (_jsx("button", { type: "button", "data-testid": testId, "aria-label": label, "aria-pressed": active, disabled: disabled, "aria-disabled": disabled || undefined, onClick: onClick, className: cn("grid h-9 w-9 shrink-0 place-items-center rounded-full border transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/70", disabled
162
+ return (_jsx("button", { type: "button", "data-testid": testId, "aria-label": label, "aria-pressed": active, disabled: disabled, "aria-disabled": disabled || undefined, onClick: onClick, className: cn("grid h-9 w-9 shrink-0 place-items-center rounded-full border transition-colors", " ", disabled
158
163
  ? // On the view it targets: shown but inert + dimmed (we disable, not hide).
159
164
  "cursor-default border-white/10 bg-white/[0.05] text-white/35"
160
165
  : active
161
166
  ? "border-white/40 bg-white/85 text-black"
162
167
  : "border-white/15 bg-white/10 text-white/75 hover:bg-white/20 hover:text-white"), children: _jsx(Icon, { className: "h-[18px] w-[18px]", "aria-hidden": true }) }));
163
168
  }
169
+ /** Horizontal travel (px) at which a conversation-swipe edge hint is fully lit. */
170
+ const SWIPE_HINT_FULL = 96;
171
+ /** Inert conversation-nav fallback for minimal mock controllers. */
172
+ const EMPTY_CONVERSATION_NAV = {
173
+ hasPrev: false,
174
+ hasNext: false,
175
+ goPrev: () => { },
176
+ goNext: () => { },
177
+ };
178
+ /**
179
+ * A soft glass glow on the sheet edge the next/previous conversation will slide
180
+ * in from during a horizontal swipe (#8929). Brightens with the drag distance;
181
+ * inert and non-interactive.
182
+ */
183
+ function SwipeEdgeHint({ side, active, amount, }) {
184
+ if (!active)
185
+ return null;
186
+ const opacity = Math.min(1, Math.max(0, amount) / SWIPE_HINT_FULL);
187
+ if (opacity <= 0)
188
+ return null;
189
+ return (_jsx("div", { "aria-hidden": true, "data-testid": `conversation-swipe-hint-${side}`, className: cn("pointer-events-none absolute inset-y-0 z-20 w-16", side === "left"
190
+ ? "left-0 bg-gradient-to-r from-white/25 to-transparent"
191
+ : "right-0 bg-gradient-to-l from-white/25 to-transparent"), style: { opacity } }));
192
+ }
164
193
  /**
165
194
  * The drag handle at the top of the chat sheet — pull UP to open the history,
166
195
  * pull DOWN to close it. It is also keyboard-operable (Enter/Space toggles,
@@ -205,9 +234,13 @@ function SheetGrabber({ open, onOpen, onClose, binding, glow, opacity, pilled, }
205
234
  // vertically-centered textarea, so a tap on the composer lands natively
206
235
  // on the textarea and raises the keyboard (a programmatic focus from the
207
236
  // handle wouldn't). Pull gestures start from the bar / the upward zone.
208
- "before:absolute before:-inset-x-6 before:-top-16 before:bottom-0 before:content-['']", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/50 focus-visible:rounded-full"), children: _jsx("span", { "aria-hidden": "true", className: cn(
209
- // 30% wider bar (w-11 w-14), a touch taller, brighter.
210
- "h-2.5 w-16 rounded-full transition-colors duration-300", glow ? "bg-[rgba(255,180,120,0.8)]" : "bg-white/45") }) }));
237
+ "before:absolute before:-inset-x-6 before:-top-16 before:bottom-0 before:content-['']", " "), children: _jsx("span", { "aria-hidden": "true", className: cn(
238
+ // The visible grabber line. Its show/hide is driven by the WRAPPER's
239
+ // `grabberOpacity` crossfade (fades in over [0.55, 0.95] of the open),
240
+ // strictly anti-phase with the pill bar so the two are never on screen
241
+ // together. The bar paints at full opacity — a prior regression pinned
242
+ // it to `opacity-0`, leaving the handle grabbable but invisible (#9142).
243
+ "h-2.5 w-16 rounded-full opacity-100 transition-colors duration-300", glow ? "bg-[rgba(255,180,120,0.8)]" : "bg-white/45") }) }));
211
244
  }
212
245
  /**
213
246
  * The fully-collapsed PILL — the chat reduced to a small glass capsule at the
@@ -234,22 +267,121 @@ function PillHandle({ binding, onOpen, glow, pilled, }) {
234
267
  // Interactive only while pilled. When NOT pilled the (faded) handle must
235
268
  // let taps fall through to the composer textarea below it — otherwise its
236
269
  // tall hit zone steals the tap and the keyboard never opens.
237
- pilled ? "pointer-events-auto" : "pointer-events-none", "focus-visible:rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/50"), children: _jsx("span", { "aria-hidden": "true", className: cn(
238
- // Identical to the SheetGrabber bar — the handle keeps the same white
239
- // shape + color whether the chat is open or fully collapsed to the pill.
240
- "h-2.5 w-16 rounded-full transition-colors duration-300", glow ? "bg-[rgba(255,180,120,0.8)]" : "bg-white/45") }) }));
270
+ pilled ? "pointer-events-auto" : "pointer-events-none", " "), children: _jsx("span", { "aria-hidden": "true", className: cn(
271
+ // Identical to the SheetGrabber bar — same white shape + color whether
272
+ // the chat is open or collapsed to the pill. Its show/hide is driven by
273
+ // the WRAPPER's `pillOpacity` crossfade (anti-phase with the grabber).
274
+ // The bar paints at full opacity — a prior regression pinned it to
275
+ // `opacity-0`, leaving the pill handle grabbable but invisible (#9142).
276
+ "h-2.5 w-16 rounded-full opacity-100 transition-colors duration-300", glow ? "bg-[rgba(255,180,120,0.8)]" : "bg-white/45") }) }));
277
+ }
278
+ /** Humanize an action/tool symbol ("SEND_MESSAGE" → "Send message") for the
279
+ * status label so it reads as prose, not a constant. */
280
+ function humanizeStatusName(name) {
281
+ const cleaned = name.trim().replace(/[_-]+/g, " ").toLowerCase();
282
+ if (!cleaned)
283
+ return "";
284
+ return cleaned.charAt(0).toUpperCase() + cleaned.slice(1);
285
+ }
286
+ /** The phase label shown beside the breathing dots. Server-provided `label`
287
+ * always wins; otherwise derive a concise phrase from the kind (+ action/tool
288
+ * name when present). */
289
+ function turnStatusLabel(status) {
290
+ if (status.label?.trim())
291
+ return status.label.trim();
292
+ switch (status.kind) {
293
+ case "thinking":
294
+ return "Thinking";
295
+ case "streaming":
296
+ return "Replying";
297
+ case "running_action":
298
+ return status.actionName
299
+ ? `Running ${humanizeStatusName(status.actionName)}`
300
+ : "Working";
301
+ case "running_tool":
302
+ return status.toolName
303
+ ? `Using ${humanizeStatusName(status.toolName)}`
304
+ : "Using a tool";
305
+ case "evaluating":
306
+ return "Reflecting";
307
+ case "waking":
308
+ return "Waking the agent";
309
+ case "speaking":
310
+ return "Speaking";
311
+ }
312
+ }
313
+ // Min time (ms) a phase label must stay on screen before the next one replaces
314
+ // it. Without this, a fast thinking→action→streaming sequence flickers through
315
+ // labels faster than the eye can read. The text content the user sees is
316
+ // debounced; the dots animate continuously throughout.
317
+ const STATUS_MIN_DWELL_MS = 320;
318
+ /** Debounce a fast-changing status to a min on-screen dwell so a rapid
319
+ * thinking→action→streaming sequence doesn't strobe the label. The dots animate
320
+ * continuously; only the words wait their turn. Returns null when status is
321
+ * null (between turns). */
322
+ function useDebouncedTurnStatus(status) {
323
+ const [shown, setShown] = React.useState(status);
324
+ const lastChangeRef = React.useRef(0);
325
+ const timerRef = React.useRef(null);
326
+ React.useEffect(() => {
327
+ if (!status) {
328
+ setShown(null);
329
+ return;
330
+ }
331
+ const now = Date.now();
332
+ const elapsed = now - lastChangeRef.current;
333
+ if (elapsed >= STATUS_MIN_DWELL_MS) {
334
+ lastChangeRef.current = now;
335
+ setShown(status);
336
+ return;
337
+ }
338
+ if (timerRef.current !== null)
339
+ window.clearTimeout(timerRef.current);
340
+ timerRef.current = window.setTimeout(() => {
341
+ lastChangeRef.current = Date.now();
342
+ setShown(status);
343
+ timerRef.current = null;
344
+ }, STATUS_MIN_DWELL_MS - elapsed);
345
+ return () => {
346
+ if (timerRef.current !== null) {
347
+ window.clearTimeout(timerRef.current);
348
+ timerRef.current = null;
349
+ }
350
+ };
351
+ }, [status]);
352
+ return shown;
241
353
  }
242
- /** Three quiet, borderless dots that breathe while the assistant is replying. */
243
- // Just the three breathing dots rendered INSIDE a bubble (the in-flight
244
- // assistant turn, so "thinking" is anchored where the reply will appear) or
245
- // wrapped in its own bubble by TypingDots for the pre-placeholder gap.
246
- function TypingDotsInner() {
247
- return (_jsx("span", { className: "flex gap-1.5 py-1", "data-testid": "typing-dots", role: "status", "aria-label": "assistant is responding", children: [0, 1, 2].map((i) => (_jsx("span", { className: "h-1.5 w-1.5 animate-pulse rounded-full bg-white/70 motion-reduce:animate-none", style: { animationDelay: `${i * 180}ms` } }, i))) }));
354
+ /**
355
+ * The breathing dots + phase label content of the status indicator, WITHOUT a
356
+ * bubble/motion wrapper used both standalone (wrapped by TurnStatusIndicator)
357
+ * and inline inside the in-flight assistant bubble.
358
+ *
359
+ * Mirrors ChatVoiceStatusBar's a11y (`role="status"` + `aria-live="polite"`).
360
+ * Honors reduced motion (no pulse). Brand-safe: orange (the accent) ONLY for
361
+ * `speaking`; every other phase is neutral white. No blue anywhere. Degrades to
362
+ * plain dots when no status has arrived.
363
+ */
364
+ function TurnStatusInner({ status, }) {
365
+ const shown = useDebouncedTurnStatus(status);
366
+ const speaking = shown?.kind === "speaking";
367
+ const label = shown ? turnStatusLabel(shown) : null;
368
+ return (_jsxs("span", { className: "inline-flex items-center gap-2", "data-testid": "turn-status-indicator", "data-status-kind": shown?.kind ?? "none", role: "status", "aria-live": "polite", children: [_jsx("span", { className: "flex gap-1.5", "data-testid": "typing-dots", "aria-hidden": "true", children: [0, 1, 2].map((i) => (_jsx("span", { className: cn("h-1.5 w-1.5 animate-pulse rounded-full motion-reduce:animate-none", speaking ? "bg-[rgba(255,190,140,0.9)]" : "bg-white/70"), style: { animationDelay: `${i * 180}ms` } }, i))) }), label ? (_jsx("span", { className: cn("text-[13px] font-medium", speaking ? "text-[rgba(255,200,150,0.95)]" : "text-white/90"), "data-testid": "turn-status-label", children: label })) : null] }));
248
369
  }
249
- function TypingDots({ reduce }) {
370
+ /**
371
+ * The rich, phase-aware status row shown while the assistant works (#8813),
372
+ * replacing the bare typing dots in the pre-placeholder gap. Wraps
373
+ * TurnStatusInner in its own glass bubble + fade so it reads as a turn.
374
+ */
375
+ function TurnStatusIndicator({ status, reduce, }) {
376
+ const speaking = status?.kind === "speaking";
250
377
  return (_jsx(motion.div, { className: "mb-2.5 flex w-full justify-start",
251
- // Fade in/out so the dots dissolve with the reply rather than popping.
252
- initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: reduce ? 0 : 0.45, ease: OVERLAY_EASE }, children: _jsx("div", { className: cn("rounded-2xl rounded-bl-md border border-white/10 bg-black/45 px-3.5 py-2 text-white/90", FLOAT_SHADOW), children: _jsx(TypingDotsInner, {}) }) }));
378
+ // Fade in/out so the row dissolves with the reply rather than popping.
379
+ initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: reduce ? 0 : 0.45, ease: OVERLAY_EASE }, children: _jsx("div", { className: cn("rounded-2xl rounded-bl-md border px-3.5 py-2", FLOAT_SHADOW,
380
+ // Orange (the accent) ONLY for spoken replies; every other phase is
381
+ // neutral white glass. No blue anywhere.
382
+ speaking
383
+ ? "border-[rgba(255,180,120,0.45)] bg-black/55"
384
+ : "border-white/10 bg-black/45"), children: _jsx(TurnStatusInner, { status: status }) }) }));
253
385
  }
254
386
  /**
255
387
  * One turn of the transcript as a chat bubble — assistant on the left, user on
@@ -271,7 +403,7 @@ function ThreadLineText({ content }) {
271
403
  return content;
272
404
  return (_jsxs(_Fragment, { children: [_jsx("span", { className: "font-bold", "data-testid": "slash-command-token", children: slash.command }), slash.rest] }));
273
405
  }
274
- const ThreadLine = React.memo(function ThreadLine({ message, floating, reduce, onCopy, onOpenSettings, }) {
406
+ const ThreadLine = React.memo(function ThreadLine({ message, floating, reduce, onCopy, onOpenSettings, turnStatus, }) {
275
407
  const isUser = message.role === "user";
276
408
  const isAssistant = message.role === "assistant";
277
409
  // Press-and-hold to copy an assistant answer — the only extraction affordance
@@ -325,7 +457,7 @@ const ThreadLine = React.memo(function ThreadLine({ message, floating, reduce, o
325
457
  // A failed turn the user can't recover from without wiring a provider: render
326
458
  // a structured gate (not the raw error text) with a one-tap jump to Settings.
327
459
  if (isAssistant && message.failureKind === "no_provider") {
328
- return (_jsx(motion.div, { "data-testid": "thread-line", "data-role": message.role, "data-failure": "no_provider", initial: reduce ? { opacity: 0 } : { opacity: 0, y: 14 }, animate: reduce ? { opacity: 1 } : { opacity: 1, y: 0 }, exit: reduce ? { opacity: 0 } : { opacity: 0, y: -8 }, transition: { duration: reduce ? 0.15 : 0.52, ease: OVERLAY_EASE }, className: cn("flex w-full justify-start", floating ? "mb-1.5" : "mb-2.5"), children: _jsxs("div", { className: cn("max-w-[85%] rounded-2xl rounded-bl-md border border-amber-300/30 bg-black/60 px-3.5 py-3 text-white", FLOAT_SHADOW), children: [_jsx("div", { className: "mb-1 text-[14px] font-medium", children: "Connect a provider to chat" }), _jsx("div", { className: "mb-2.5 whitespace-pre-wrap text-[13px] leading-relaxed text-white/80 [overflow-wrap:anywhere]", children: message.content }), _jsx("button", { type: "button", "data-testid": "chat-no-provider-settings", onClick: () => onOpenSettings?.(), className: "rounded-full border border-white/20 bg-white/15 px-3 py-1.5 text-[13px] font-medium text-white transition-colors hover:bg-white/25 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60", children: "Open Settings" })] }) }));
460
+ return (_jsx(motion.div, { "data-testid": "thread-line", "data-role": message.role, "data-failure": "no_provider", initial: reduce ? { opacity: 0 } : { opacity: 0, y: 14 }, animate: reduce ? { opacity: 1 } : { opacity: 1, y: 0 }, exit: reduce ? { opacity: 0 } : { opacity: 0, y: -8 }, transition: { duration: reduce ? 0.15 : 0.52, ease: OVERLAY_EASE }, className: cn("flex w-full justify-start", floating ? "mb-1.5" : "mb-2.5"), children: _jsxs("div", { className: cn("max-w-[85%] rounded-2xl rounded-bl-md border border-amber-300/30 bg-black/60 px-3.5 py-3 text-white", FLOAT_SHADOW), children: [_jsx("div", { className: "mb-1 text-[14px] font-medium", children: "Connect a provider to chat" }), _jsx("div", { className: "mb-2.5 whitespace-pre-wrap text-[13px] leading-relaxed text-white/80 [overflow-wrap:anywhere]", children: message.content }), _jsx("button", { type: "button", "data-testid": "chat-no-provider-settings", onClick: () => onOpenSettings?.(), className: "rounded-full border border-white/20 bg-white/15 px-3 py-1.5 text-[13px] font-medium text-white transition-colors hover:bg-white/25 ", children: "Open Settings" })] }) }));
329
461
  }
330
462
  return (_jsx(motion.div, { "data-testid": "thread-line", "data-role": message.role,
331
463
  // New turns rise+fade in. Transform/opacity only; reduced motion collapses
@@ -339,28 +471,43 @@ const ThreadLine = React.memo(function ThreadLine({ message, floating, reduce, o
339
471
  // behind. The light tone is for any embedding that supplies its own
340
472
  // surrounding scrim.
341
473
  isUser ? "rounded-br-md" : "rounded-bl-md",
342
- // Assistant bubbles own the press-and-hold copy gesture, so suppress
343
- // the native long-press selection/callout that would fight it.
344
- canCopy && "select-none [-webkit-touch-callout:none]", floating
474
+ // Message text must remain selectable for normal highlight/copy.
475
+ // Assistant bubbles still keep the press-and-hold copy shortcut.
476
+ "select-text [-webkit-touch-callout:default]", floating
345
477
  ? cn("border", isUser
346
478
  ? "border-white/15 bg-black/55 text-white"
347
479
  : "border-white/10 bg-black/45 text-white/90", FLOAT_SHADOW)
348
480
  : isUser
349
481
  ? "bg-white/20 text-white"
350
- : "bg-white/10 text-white/90"), children: [isAssistant &&
351
- !message.content.trim() &&
352
- !message.attachments?.length ? (_jsx(TypingDotsInner, {})) : isUser ? (_jsx(ThreadLineText, { content: message.content })) : (message.content), message.attachments?.length ? (_jsx(MessageAttachments, { attachments: message.attachments })) : null, isAssistant && message.reasoning?.trim() ? (_jsx(ThinkingBlock, { reasoning: message.reasoning })) : null, _jsx(AnimatePresence, { children: copied ? (_jsx(motion.span, { "data-testid": "thread-line-copied", initial: { opacity: 0, y: 4 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0 }, transition: { duration: 0.18 }, className: "pointer-events-none absolute -top-2 right-2 rounded-full bg-white/90 px-2 py-0.5 text-[11px] font-medium text-black shadow", children: "Copied" }, "copied")) : null })] }) }));
482
+ : "bg-white/10 text-white/90"), children: [_jsx("div", { "data-chat-selectable": "true", children: isAssistant &&
483
+ !message.content.trim() &&
484
+ !message.attachments?.length ? (_jsxs(_Fragment, { children: [_jsx(TurnStatusInner, { status: turnStatus ?? null }), message.attachments?.length ? (_jsx(MessageAttachments, { attachments: message.attachments })) : null] })) : isUser ? (_jsxs(_Fragment, { children: [_jsx(ThreadLineText, { content: message.content }), message.attachments?.length ? (_jsx(MessageAttachments, { attachments: message.attachments })) : null] })) : (_jsxs(_Fragment, { children: [_jsx(InlineWidgetText, { content: message.content }), message.attachments?.length ? (_jsx(MessageAttachments, { attachments: message.attachments })) : null, message.secretRequest ? (_jsx("div", { className: "pointer-events-auto", children: _jsx(SensitiveRequestBlock, { request: message.secretRequest }) })) : null, message.reasoning?.trim() ? (_jsx(ThinkingBlock, { reasoning: message.reasoning })) : null] })) }), _jsx(AnimatePresence, { children: copied ? (_jsx(motion.span, { "data-testid": "thread-line-copied", initial: reduce ? { opacity: 0 } : { opacity: 0, y: 4 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0 }, transition: { duration: reduce ? 0 : 0.18 }, className: "pointer-events-none absolute -top-2 right-2 rounded-full bg-white/90 px-2 py-0.5 text-[11px] font-medium text-black", children: "Copied" }, "copied")) : null })] }) }));
353
485
  });
354
486
  export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash: slashProp, }) {
355
- const { messages, phase, responding, send, canSend, recording, startRecording, stopRecording, handsFree, toggleHandsFree, transcriptionMode, toggleTranscriptionMode, setDictationSink, setTranscriptSessionSink, setComposerHasDraft, transcript, needsAudioUnlock, unlockAudio, openSettings, navigateHome, navigateToViews, currentTab, clearConversation, stop, modelStatus, } = controller;
356
- // The transcribe control is a voice feature, so it only belongs in the header
357
- // while voice is actually on — a hands-free conversation, the mic open, or an
358
- // in-progress transcription. When voice is off it's hidden (the `/transcribe`
359
- // command still starts transcription from cold). `transcriptionMode` is part
360
- // of the predicate so the button (then "stop transcription") and its badge
361
- // stay put across the re-listen gaps where `recording` momentarily drops
362
- // between utterances.
363
- const voiceActive = Boolean(recording || handsFree || transcriptionMode);
487
+ const { messages, phase, responding, turnStatus, send, canSend, recording, startRecording, stopRecording, handsFree, toggleHandsFree, transcriptionMode, toggleTranscriptionMode, stopTranscriptionAndMic, setDictationSink, setTranscriptSessionSink, setComposerHasDraft, transcript, needsAudioUnlock, unlockAudio, openSettings, navigateHome, currentTab, clearConversation, stop, modelStatus, } = controller;
488
+ // Defensive default so a minimal mock controller (stories/tests) that predates
489
+ // the swipe-nav surface still renders without crashing.
490
+ const conversationNav = controller.conversationNav ?? EMPTY_CONVERSATION_NAV;
491
+ // True while a clear/swipe is fetching an uncached thread — gates the empty
492
+ // thread's loading spinner. Defaulted for minimal mock controllers.
493
+ const conversationLoading = controller.conversationLoading ?? false;
494
+ // Horizontal swipe between conversations (#8929). `swipeDx` is the live
495
+ // horizontal drag (+left toward the next/older chat, -right toward the
496
+ // newer/previous chat) and drives the edge hint. The gesture defers pointer
497
+ // capture until a horizontal commit, so vertical thread scrolling is
498
+ // unaffected; it is only bound while the sheet is open (below).
499
+ const [swipeDx, setSwipeDx] = React.useState(0);
500
+ const conversationSwipe = usePullGesture({
501
+ onDragX: setSwipeDx,
502
+ onSwipeLeft: () => {
503
+ setSwipeDx(0);
504
+ conversationNav.goNext();
505
+ },
506
+ onSwipeRight: () => {
507
+ setSwipeDx(0);
508
+ conversationNav.goPrev();
509
+ },
510
+ });
364
511
  // Copy an assistant answer (press-and-hold on its bubble). Stable identity so
365
512
  // the memoized ThreadLine isn't re-rendered every parent tick.
366
513
  const handleCopyMessage = React.useCallback((text) => {
@@ -431,6 +578,52 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
431
578
  // re-render. Drives the glass/content crossfade + scale; `threadHeight` stays
432
579
  // 0 until the input is fully formed, then takes over for input → chat.
433
580
  const openProgress = useMotionValue(pilled ? 0 : 1);
581
+ // Imperative animations triggered from gesture callbacks are outside React's
582
+ // effect cleanup, so keep one owner per motion value and stop stale springs
583
+ // before starting another.
584
+ const threadAnimationRef = React.useRef(null);
585
+ const openProgressAnimationRef = React.useRef(null);
586
+ const delayedNavigationTimerRef = React.useRef(null);
587
+ const prefillFocusFrameRef = React.useRef(null);
588
+ const prefillFocusTimerRef = React.useRef(null);
589
+ const stopThreadAnimation = React.useCallback(() => {
590
+ threadAnimationRef.current?.stop();
591
+ threadAnimationRef.current = null;
592
+ }, []);
593
+ const stopOpenProgressAnimation = React.useCallback(() => {
594
+ openProgressAnimationRef.current?.stop();
595
+ openProgressAnimationRef.current = null;
596
+ }, []);
597
+ const animateThreadHeight = React.useCallback((target) => {
598
+ stopThreadAnimation();
599
+ threadAnimationRef.current = animate(threadHeight, target, SHEET_SPRING);
600
+ }, [stopThreadAnimation, threadHeight]);
601
+ const animateOpenProgress = React.useCallback((target) => {
602
+ stopOpenProgressAnimation();
603
+ openProgressAnimationRef.current = animate(openProgress, target, OPEN_SPRING);
604
+ }, [openProgress, stopOpenProgressAnimation]);
605
+ const clearPrefillFocusSchedule = React.useCallback(() => {
606
+ if (prefillFocusFrameRef.current !== null &&
607
+ typeof window !== "undefined" &&
608
+ typeof window.cancelAnimationFrame === "function") {
609
+ window.cancelAnimationFrame(prefillFocusFrameRef.current);
610
+ }
611
+ if (prefillFocusTimerRef.current !== null &&
612
+ typeof window !== "undefined") {
613
+ window.clearTimeout(prefillFocusTimerRef.current);
614
+ }
615
+ prefillFocusFrameRef.current = null;
616
+ prefillFocusTimerRef.current = null;
617
+ }, []);
618
+ React.useEffect(() => () => {
619
+ stopThreadAnimation();
620
+ stopOpenProgressAnimation();
621
+ if (delayedNavigationTimerRef.current !== null) {
622
+ window.clearTimeout(delayedNavigationTimerRef.current);
623
+ delayedNavigationTimerRef.current = null;
624
+ }
625
+ clearPrefillFocusSchedule();
626
+ }, [stopThreadAnimation, stopOpenProgressAnimation, clearPrefillFocusSchedule]);
434
627
  // Latest `settleDrag` (defined below) exposed to the viewport-resize effect
435
628
  // (which runs earlier). A rotation can orphan an in-flight drag — re-settling
436
629
  // the morph keeps the pill↔input crossfade from stranding both bars visible.
@@ -460,22 +653,88 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
460
653
  // fling a history thread open to half instead of resting on the input bar).
461
654
  const suppressExpandOnFocusRef = React.useRef(false);
462
655
  const focusThreadRef = React.useRef(false);
463
- // Recomputed only when the thread changes — NOT on every drag/draft re-render.
464
- // Filter empty turns, then keep only the most recent window (cap DOM nodes).
465
- const visibleMessages = React.useMemo(() => messages
466
- // Drop empty turns EXCEPT the in-flight assistant turn while a reply is
467
- // streaming, so its bubble can show the breathing dots anchored where the
468
- // text fills in (then the text replaces them). It's dropped again the
469
- // moment we leave `responding`, so a failed/empty turn never lingers.
470
- .filter((m) => m.content.trim() ||
471
- (m.role === "assistant" && phase === "responding"))
472
- .slice(-MAX_RENDERED_MESSAGES), [messages, phase]);
656
+ // Recomputed only when the thread or phase changes — NOT on every drag/draft
657
+ // re-render. Pure windowing (empty-turn filter + most-recent cap, with the
658
+ // streaming-assistant exception) lives in shell-state so it's unit-tested.
659
+ const visibleMessages = React.useMemo(() => selectVisibleShellMessages(messages, phase), [messages, phase]);
473
660
  const lastId = visibleMessages.at(-1)?.id ?? null;
474
661
  const lastContent = visibleMessages.at(-1)?.content ?? "";
662
+ // Copy the whole thread as a plain-text transcript from the full-state header
663
+ // — parity with the desktop ChatView header. Flashes a check on success.
664
+ const [conversationCopied, setConversationCopied] = React.useState(false);
665
+ const conversationCopiedTimerRef = React.useRef(null);
666
+ React.useEffect(() => () => {
667
+ if (conversationCopiedTimerRef.current) {
668
+ clearTimeout(conversationCopiedTimerRef.current);
669
+ }
670
+ }, []);
671
+ const handleCopyConversation = React.useCallback(() => {
672
+ const transcript = conversationTranscriptText(visibleMessages.map((m) => ({ role: m.role, text: m.content })), { agentName });
673
+ if (!transcript)
674
+ return;
675
+ void copyTextToClipboard(transcript);
676
+ setConversationCopied(true);
677
+ if (conversationCopiedTimerRef.current) {
678
+ clearTimeout(conversationCopiedTimerRef.current);
679
+ }
680
+ conversationCopiedTimerRef.current = setTimeout(() => setConversationCopied(false), 2000);
681
+ }, [agentName, visibleMessages]);
475
682
  // The last line id the scroll effect pinned to — lets it tell a NEW line
476
683
  // (always pin to bottom) from streaming growth of the current line (follow
477
684
  // only when the reader is already at the bottom).
478
685
  const scrollPinnedIdRef = React.useRef(lastId);
686
+ // Topic grouping + chips bar (#8928). Derived from the per-message Stage-1
687
+ // topic tags; when no message is tagged the transcript renders flat (the
688
+ // chips bar and groups simply don't appear), preserving the prior behavior.
689
+ const channelTopics = React.useMemo(() => deriveChannelTopics(visibleMessages), [visibleMessages]);
690
+ const topicSegments = React.useMemo(() => groupMessagesByTopic(visibleMessages), [visibleMessages]);
691
+ const hasTopics = channelTopics.length > 0;
692
+ const [collapsedTopics, setCollapsedTopics] = React.useState(() => new Set());
693
+ const setTopicCollapsed = React.useCallback((key, collapsed) => {
694
+ setCollapsedTopics((prev) => {
695
+ if (collapsed === prev.has(key))
696
+ return prev;
697
+ const next = new Set(prev);
698
+ if (collapsed)
699
+ next.add(key);
700
+ else
701
+ next.delete(key);
702
+ return next;
703
+ });
704
+ }, []);
705
+ // Tapping a chip expands its group and scrolls its header into view.
706
+ const scrollToTopic = React.useCallback((topic) => {
707
+ setCollapsedTopics((prev) => {
708
+ if (!prev.has(topic))
709
+ return prev;
710
+ const next = new Set(prev);
711
+ next.delete(topic);
712
+ return next;
713
+ });
714
+ if (typeof requestAnimationFrame === "undefined")
715
+ return;
716
+ requestAnimationFrame(() => {
717
+ const escaped = typeof CSS !== "undefined" && typeof CSS.escape === "function"
718
+ ? CSS.escape(topic)
719
+ : topic.replace(/"/g, '\\"');
720
+ const el = threadRef.current?.querySelector(`[data-topic="${escaped}"]`);
721
+ el?.scrollIntoView({ behavior: "smooth", block: "start" });
722
+ });
723
+ }, []);
724
+ // Render one transcript line; shared by the flat and topic-grouped paths so
725
+ // the in-flight-turn detection stays identical.
726
+ const renderThreadLine = React.useCallback((m, index) => {
727
+ const isInFlight = index === visibleMessages.length - 1 &&
728
+ m.role === "assistant" &&
729
+ !m.content.trim();
730
+ return (_jsx(ThreadLine, { message: m, floating: true, reduce: reduce, onCopy: handleCopyMessage, onOpenSettings: openSettings, turnStatus: isInFlight ? turnStatus : undefined }, m.id));
731
+ }, [
732
+ visibleMessages.length,
733
+ reduce,
734
+ handleCopyMessage,
735
+ openSettings,
736
+ turnStatus,
737
+ ]);
479
738
  const booting = phase === "booting";
480
739
  const listening = phase === "listening";
481
740
  const hasDraft = draft.trim().length > 0;
@@ -516,6 +775,14 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
516
775
  // only when the reader is already resting at the bottom, so scrolling up to
517
776
  // read history is never yanked down.
518
777
  const wasOpenRef = React.useRef(false);
778
+ // Coalesces the per-token streaming-follow scroll into one rAF so a burst of
779
+ // tokens landing within a frame triggers at most one measure+write instead of
780
+ // a forced reflow per token. New-line / first-open pins stay synchronous below.
781
+ const followRafRef = React.useRef(null);
782
+ React.useEffect(() => () => {
783
+ if (followRafRef.current != null)
784
+ cancelAnimationFrame(followRafRef.current);
785
+ }, []);
519
786
  // biome-ignore lint/correctness/useExhaustiveDependencies: lastId/lastContent/sheetOpen are the triggers; the body reads refs
520
787
  React.useLayoutEffect(() => {
521
788
  const el = threadRef.current;
@@ -537,17 +804,43 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
537
804
  // more reliable than scrollIntoView inside this clipped flex column.
538
805
  const justOpened = !wasOpenRef.current;
539
806
  wasOpenRef.current = true;
540
- const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 80;
541
- if (isNewLine && !justOpened && !reduce && atBottom) {
542
- endRef.current?.scrollIntoView({ behavior: "smooth", block: "end" });
543
- }
544
- else if (justOpened || isNewLine || atBottom) {
545
- el.scrollTop = el.scrollHeight;
546
- }
547
- if (justOpened && focusThreadRef.current) {
548
- el.focus();
549
- focusThreadRef.current = false;
807
+ // New line or first open: pin synchronously (pre-paint) so the thread never
808
+ // flashes at the top. Infrequent once per turn, not per token.
809
+ if (isNewLine || justOpened) {
810
+ const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 80;
811
+ // Pin to the latest line ONLY on first open, or when the reader is already
812
+ // resting at the bottom. If they have scrolled UP to read history, a new
813
+ // line must NOT yank them down — the previous code force-pinned on every
814
+ // new line (the `else` ran whenever !atBottom), which is exactly the
815
+ // "scroll up to the first message and get snapped back to the bottom" bug.
816
+ if (justOpened || atBottom) {
817
+ if (isNewLine && !justOpened && !reduce) {
818
+ endRef.current?.scrollIntoView({ behavior: "smooth", block: "end" });
819
+ }
820
+ else {
821
+ el.scrollTop = el.scrollHeight;
822
+ }
823
+ }
824
+ if (justOpened && focusThreadRef.current) {
825
+ el.focus();
826
+ focusThreadRef.current = false;
827
+ }
828
+ return;
550
829
  }
830
+ // Streaming growth of the current line: coalesce the bottom-follow into a
831
+ // single rAF (measure atBottom + write scrollTop at most once per frame).
832
+ // Same semantics as before — only follows when the reader is at the bottom.
833
+ if (followRafRef.current != null)
834
+ return;
835
+ followRafRef.current = requestAnimationFrame(() => {
836
+ followRafRef.current = null;
837
+ const node = threadRef.current;
838
+ if (!node)
839
+ return;
840
+ const atBottom = node.scrollHeight - node.scrollTop - node.clientHeight < 80;
841
+ if (atBottom)
842
+ node.scrollTop = node.scrollHeight;
843
+ });
551
844
  }, [lastId, lastContent, sheetOpen]);
552
845
  // The closed peek must always whisper the NEWEST line, but closing is an
553
846
  // animated height collapse: a one-shot scroll set runs before the height
@@ -600,9 +893,6 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
600
893
  detentHaptic();
601
894
  inputRef.current?.focus();
602
895
  }, [canSend, send]);
603
- const submit = React.useCallback(() => {
604
- submitText(draft, pendingImages);
605
- }, [submitText, draft, pendingImages]);
606
896
  // Tapping a suggestion sends it immediately (same path as submit), so the
607
897
  // strip is a one-tap shortcut, not just a draft pre-fill.
608
898
  const pickSuggestion = React.useCallback((text) => {
@@ -617,12 +907,22 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
617
907
  inputRef.current?.focus();
618
908
  }, [canSend, send]);
619
909
  const addImageFiles = React.useCallback((files) => {
620
- void filesToImageAttachments(files)
621
- .then((attachments) => {
622
- if (!attachments.length)
623
- return;
624
- setImageError(null);
625
- setPendingImages((prev) => [...prev, ...attachments].slice(0, MAX_CHAT_IMAGES));
910
+ void intakeAttachmentFiles(files)
911
+ .then(({ attachments, droppedTooLarge }) => {
912
+ // The overlay is a pure component without an i18n translator, so it
913
+ // surfaces the "kept N, dropped M" notice inline in English (matching
914
+ // its other hardcoded strings) via the existing imageError channel.
915
+ const summary = summarizeDroppedAttachments({
916
+ acceptedCount: attachments.length,
917
+ droppedTooLarge,
918
+ droppedOverCount: [],
919
+ });
920
+ setImageError(summary
921
+ ? `Kept ${summary.kept}, dropped ${summary.dropped} (too large — max ${summary.maxMb}MB)`
922
+ : null);
923
+ if (attachments.length) {
924
+ setPendingImages((prev) => [...prev, ...attachments].slice(0, MAX_CHAT_IMAGES));
925
+ }
626
926
  })
627
927
  .catch((err) => {
628
928
  // Surface the failure inline rather than silently dropping the image —
@@ -647,6 +947,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
647
947
  event.button !== 0 ||
648
948
  hasDraft ||
649
949
  recording ||
950
+ transcriptionMode ||
650
951
  // Voice input is gated while a reply is in flight; type + send to queue
651
952
  // another turn instead. Re-enabled the instant the reply finishes.
652
953
  responding)
@@ -669,7 +970,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
669
970
  startRecording("dictate");
670
971
  }, 200);
671
972
  pttRef.current = { kind: "pending", pointerId, timer };
672
- }, [hasDraft, recording, responding, startRecording]);
973
+ }, [hasDraft, recording, responding, startRecording, transcriptionMode]);
673
974
  // One funnel for BOTH pointerup (cancelled=false) and pointercancel
674
975
  // (cancelled=true). Always clears the pending timer + releases pointer capture
675
976
  // FIRST — before any early return — so a quick tap can never leak a stuck timer
@@ -678,7 +979,8 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
678
979
  const phase = pttRef.current;
679
980
  if (phase.kind === "pending")
680
981
  window.clearTimeout(phase.timer);
681
- if (event.currentTarget.hasPointerCapture(event.pointerId)) {
982
+ if (typeof event.currentTarget.hasPointerCapture === "function" &&
983
+ event.currentTarget.hasPointerCapture(event.pointerId)) {
682
984
  event.currentTarget.releasePointerCapture(event.pointerId);
683
985
  }
684
986
  pttRef.current = { kind: "idle" };
@@ -701,11 +1003,13 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
701
1003
  // turn finishes), but an active hands-free session can always be turned OFF.
702
1004
  if (responding && !handsFree)
703
1005
  return;
704
- // While transcribing, the mic is the master voice control: a tap ENDS the
705
- // transcription (which drops the transcript into the composer as an
706
- // attachment) instead of starting a second, conflicting capture.
1006
+ // While transcribing, the mic is the master voice control: a tap turns the
1007
+ // mic OFF, which also ends transcription (mic = parent turning off the mic
1008
+ // turns off transcript). This is distinct from the transcript button, which
1009
+ // turns transcript off but LEAVES THE MIC ON. The finished transcript still
1010
+ // drops into the composer as an attachment.
707
1011
  if (transcriptionMode) {
708
- toggleTranscriptionMode();
1012
+ stopTranscriptionAndMic();
709
1013
  return;
710
1014
  }
711
1015
  // Quick tap = hands-free conversation: the agent speaks its replies back and
@@ -716,7 +1020,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
716
1020
  handsFree,
717
1021
  toggleHandsFree,
718
1022
  transcriptionMode,
719
- toggleTranscriptionMode,
1023
+ stopTranscriptionAndMic,
720
1024
  ]);
721
1025
  const hasThread = visibleMessages.length > 0;
722
1026
  // Track the VISUAL viewport so the chat sizes to — and sits above — whatever
@@ -744,13 +1048,35 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
744
1048
  React.useEffect(() => {
745
1049
  if (typeof window === "undefined")
746
1050
  return undefined;
747
- const sync = () => {
748
- setViewport(readViewport());
1051
+ const commit = () => {
1052
+ // Bail out of the re-render when the viewport values are unchanged — vv
1053
+ // `scroll` fires constantly while the keyboard animates but the height/
1054
+ // inset frequently don't actually move between events.
1055
+ setViewport((prev) => {
1056
+ const next = readViewport();
1057
+ return prev.height === next.height &&
1058
+ prev.keyboardInset === next.keyboardInset &&
1059
+ prev.innerHeight === next.innerHeight
1060
+ ? prev
1061
+ : next;
1062
+ });
749
1063
  const el = overlayRef.current;
750
1064
  if (el) {
751
- setBottomPad(Number.parseFloat(getComputedStyle(el).paddingBottom) || 0);
1065
+ const pad = Number.parseFloat(getComputedStyle(el).paddingBottom) || 0;
1066
+ setBottomPad((prev) => (prev === pad ? prev : pad));
752
1067
  }
753
1068
  };
1069
+ // Coalesce the high-rate vv `scroll` to at most one commit per frame so the
1070
+ // keyboard-animation storm can't drive >60 forced style reads + setStates/s.
1071
+ let rafId = 0;
1072
+ const sync = () => {
1073
+ if (rafId !== 0)
1074
+ return;
1075
+ rafId = requestAnimationFrame(() => {
1076
+ rafId = 0;
1077
+ commit();
1078
+ });
1079
+ };
754
1080
  // A viewport SIZE change (rotation) must never strand the pill↔input morph
755
1081
  // mid-crossfade — rotation often cancels the in-flight pointer with no
756
1082
  // pointerup, leaving the drag orphaned (openProgress frozen mid-range = BOTH
@@ -767,8 +1093,10 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
767
1093
  const vv = window.visualViewport;
768
1094
  window.addEventListener("resize", syncAndSettle);
769
1095
  vv?.addEventListener("resize", syncAndSettle);
770
- vv?.addEventListener("scroll", sync);
1096
+ vv?.addEventListener("scroll", sync, { passive: true });
771
1097
  return () => {
1098
+ if (rafId !== 0)
1099
+ cancelAnimationFrame(rafId);
772
1100
  window.removeEventListener("resize", syncAndSettle);
773
1101
  vv?.removeEventListener("resize", syncAndSettle);
774
1102
  vv?.removeEventListener("scroll", sync);
@@ -918,8 +1246,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
918
1246
  // thread's flex-basis is the live height as a px string.
919
1247
  const revealed = useTransform(threadHeight, (h) => Math.min(1, Math.max(0, h / Math.max(1, openH))));
920
1248
  // At rest (threadHeight 0 = INPUT/CLOSED) the full-viewport dimming scrim sits
921
- // at opacity 0 but stays a live composited layer the glass backdrop-filter
922
- // samples through. Drive `visibility` off the SAME motion value so it drops out
1249
+ // at opacity 0. Drive `visibility` off the SAME motion value so it drops out
923
1250
  // of compositing/paint at rest (no reflow, compositor-only, zero re-render) and
924
1251
  // flips back the instant the thread opens.
925
1252
  const scrimVisibility = useTransform(threadHeight, (h) => h > 0 ? "visible" : "hidden");
@@ -932,9 +1259,9 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
932
1259
  clamp: true,
933
1260
  });
934
1261
  // --- Liquid-glass pill → input morph (driven by openProgress) ---------------
935
- // The panel is ONE persistent element; the pill capsule and the full glass
936
- // input crossfade by opacity (compositor-cheap never tween backdrop-blur)
937
- // while the whole panel scales up from a capsule. transform + opacity only.
1262
+ // The panel is ONE persistent element; the pill capsule and the full
1263
+ // input crossfade by opacity (compositor-cheap) while the whole panel scales
1264
+ // up from a capsule. transform + opacity only.
938
1265
  const panelScale = useTransform(openProgress, [0, 1], [0.9, 1]);
939
1266
  // Glass surface + its content crossfade IN as the input forms (one wrapper, so
940
1267
  // sheen/glow/thread/composer resolve together with the glass).
@@ -988,38 +1315,58 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
988
1315
  draggingRef.current = false;
989
1316
  const open = pilled ? 0 : 1;
990
1317
  if (reduce) {
1318
+ stopThreadAnimation();
1319
+ stopOpenProgressAnimation();
991
1320
  threadHeight.set(baseH);
992
1321
  openProgress.set(open);
993
1322
  }
994
1323
  else {
995
- animate(threadHeight, baseH, SHEET_SPRING);
996
- animate(openProgress, open, OPEN_SPRING);
1324
+ animateThreadHeight(baseH);
1325
+ animateOpenProgress(open);
997
1326
  }
998
- }, [threadHeight, openProgress, baseH, pilled, reduce]);
1327
+ }, [
1328
+ threadHeight,
1329
+ openProgress,
1330
+ baseH,
1331
+ pilled,
1332
+ reduce,
1333
+ stopThreadAnimation,
1334
+ stopOpenProgressAnimation,
1335
+ animateThreadHeight,
1336
+ animateOpenProgress,
1337
+ ]);
999
1338
  // Keep the ref the (earlier-declared) viewport-resize effect calls pointing at
1000
1339
  // the latest settleDrag, so a rotation re-settles with current pilled/baseH.
1001
1340
  settleDragRef.current = settleDrag;
1002
1341
  // Drive openProgress from the pilled flag for NON-drag transitions (tap the
1003
1342
  // pill, programmatic open/close): a live finger drag owns openProgress itself
1004
1343
  // (draggingRef gates this so it never fights the gesture).
1005
- // biome-ignore lint/correctness/useExhaustiveDependencies: openProgress is a stable motion value ref
1006
1344
  React.useEffect(() => {
1007
1345
  if (draggingRef.current)
1008
1346
  return;
1009
1347
  const open = pilled ? 0 : 1;
1010
1348
  if (reduce) {
1349
+ stopOpenProgressAnimation();
1011
1350
  openProgress.set(open);
1012
1351
  return;
1013
1352
  }
1014
- const controls = animate(openProgress, open, OPEN_SPRING);
1015
- return () => controls.stop();
1016
- }, [pilled, reduce]);
1353
+ animateOpenProgress(open);
1354
+ return stopOpenProgressAnimation;
1355
+ }, [
1356
+ pilled,
1357
+ reduce,
1358
+ openProgress,
1359
+ animateOpenProgress,
1360
+ stopOpenProgressAnimation,
1361
+ ]);
1017
1362
  const closeSheet = React.useCallback(() => {
1018
1363
  draggingRef.current = false;
1364
+ stopThreadAnimation();
1365
+ stopOpenProgressAnimation();
1019
1366
  setFreeH(null);
1020
1367
  setMaximized(false);
1021
1368
  setMode("input");
1022
- }, []);
1369
+ }, [stopThreadAnimation, stopOpenProgressAnimation]);
1023
1370
  // Leaving the chat for Settings/Home: animate OUT of maximize and collapse the
1024
1371
  // sheet (closeSheet un-maximizes + springs the thread height down) BEFORE
1025
1372
  // swapping the page underneath, so it reads as the chat closing into the new
@@ -1029,7 +1376,13 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1029
1376
  const navigateAndClose = React.useCallback((go) => {
1030
1377
  const wasMaximized = maximized;
1031
1378
  closeSheet();
1032
- window.setTimeout(go, reduce ? 0 : wasMaximized ? 260 : 190);
1379
+ if (delayedNavigationTimerRef.current !== null) {
1380
+ window.clearTimeout(delayedNavigationTimerRef.current);
1381
+ }
1382
+ delayedNavigationTimerRef.current = window.setTimeout(() => {
1383
+ delayedNavigationTimerRef.current = null;
1384
+ go();
1385
+ }, reduce ? 0 : wasMaximized ? 260 : 190);
1033
1386
  }, [closeSheet, maximized, reduce]);
1034
1387
  // Maximize toggle. Maximizing from ANY open detent (half or a free rest) first
1035
1388
  // rises to the FULL detent, then drops the inset — so the height spring
@@ -1038,32 +1391,35 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1038
1391
  // nothing). Un-maximizing drops back to the inset FULL detent.
1039
1392
  const toggleMaximize = React.useCallback(() => {
1040
1393
  if (maximized) {
1394
+ stopThreadAnimation();
1041
1395
  setMaximized(false);
1042
1396
  return;
1043
1397
  }
1044
1398
  // Snap the morph fully open BEFORE flipping to full-bleed so no in-flight
1045
1399
  // pill-open spring can leak a sub-1 scale into the maximized frame (top gap).
1046
1400
  draggingRef.current = false;
1401
+ stopThreadAnimation();
1402
+ stopOpenProgressAnimation();
1047
1403
  openProgress.set(1);
1048
1404
  setFreeH(null);
1049
1405
  setMode("full");
1050
1406
  setMaximized(true);
1051
- }, [maximized, openProgress]);
1407
+ }, [maximized, openProgress, stopThreadAnimation, stopOpenProgressAnimation]);
1052
1408
  // The single detent→detent animator: whenever the settled detent (or viewport)
1053
1409
  // changes and we're not mid finger-drag, spring the history height to it. The
1054
1410
  // gesture / open paths just flip sheetOpen/expanded and this reacts — no
1055
1411
  // per-frame React state, so the live drag stays buttery.
1056
- // biome-ignore lint/correctness/useExhaustiveDependencies: baseH already encodes sheetOpen/expanded/freeH/viewportH; threadHeight is a stable ref
1057
1412
  React.useEffect(() => {
1058
1413
  if (draggingRef.current)
1059
1414
  return;
1060
1415
  if (reduce) {
1416
+ stopThreadAnimation();
1061
1417
  threadHeight.set(baseH);
1062
1418
  return;
1063
1419
  }
1064
- const controls = animate(threadHeight, baseH, SHEET_SPRING);
1065
- return () => controls.stop();
1066
- }, [baseH, reduce]);
1420
+ animateThreadHeight(baseH);
1421
+ return stopThreadAnimation;
1422
+ }, [baseH, reduce, threadHeight, animateThreadHeight, stopThreadAnimation]);
1067
1423
  // Snap to one of the three iOS-style detents and settle the live drag. A
1068
1424
  // detent change fires a light haptic so the snap feels physical on device.
1069
1425
  // "collapsed" hides the history entirely (just the input); "half" is the
@@ -1073,6 +1429,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1073
1429
  // A detent always clears any free-drag rest height and (since only FULL
1074
1430
  // can be maximized) drops full-bleed when stepping anywhere else.
1075
1431
  draggingRef.current = false;
1432
+ stopThreadAnimation();
1076
1433
  setFreeH(null);
1077
1434
  if (to !== "full")
1078
1435
  setMaximized(false);
@@ -1082,7 +1439,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1082
1439
  if (to === "collapsed")
1083
1440
  inputRef.current?.blur();
1084
1441
  detentHaptic();
1085
- }, []);
1442
+ }, [stopThreadAnimation]);
1086
1443
  // Collapsing always drops input focus, so the mobile keyboard goes away the
1087
1444
  // moment the chat is dismissed (pull-down, Escape, or click-out) — the chat is
1088
1445
  // no longer "focused". Blurring (rather than the old refocus dance) also means
@@ -1194,6 +1551,37 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1194
1551
  window.addEventListener(TUTORIAL_CHAT_CONTROL_EVENT, onControl);
1195
1552
  return () => window.removeEventListener(TUTORIAL_CHAT_CONTROL_EVENT, onControl);
1196
1553
  }, [goToDetent]);
1554
+ React.useEffect(() => {
1555
+ if (typeof window === "undefined")
1556
+ return undefined;
1557
+ const onPrefill = (event) => {
1558
+ const detail = event.detail;
1559
+ const text = typeof detail?.text === "string" ? detail.text : "";
1560
+ if (!text.trim())
1561
+ return;
1562
+ setMode((m) => (m === "pill" ? "input" : m));
1563
+ setDraft(text);
1564
+ const focusComposer = () => {
1565
+ prefillFocusFrameRef.current = null;
1566
+ prefillFocusTimerRef.current = null;
1567
+ const input = inputRef.current;
1568
+ input?.focus();
1569
+ if (detail?.select) {
1570
+ input?.setSelectionRange(0, text.length);
1571
+ }
1572
+ };
1573
+ clearPrefillFocusSchedule();
1574
+ if (typeof window.requestAnimationFrame === "function") {
1575
+ prefillFocusFrameRef.current =
1576
+ window.requestAnimationFrame(focusComposer);
1577
+ }
1578
+ else {
1579
+ prefillFocusTimerRef.current = window.setTimeout(focusComposer, 0);
1580
+ }
1581
+ };
1582
+ window.addEventListener(CHAT_PREFILL_EVENT, onPrefill);
1583
+ return () => window.removeEventListener(CHAT_PREFILL_EVENT, onPrefill);
1584
+ }, [clearPrefillFocusSchedule]);
1197
1585
  // Push-to-talk dictation drops its final transcript into the composer draft
1198
1586
  // (no send): register the sink with the controller while this overlay is
1199
1587
  // mounted, appending to whatever the user has already typed.
@@ -1216,15 +1604,16 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1216
1604
  if (segments.length === 0)
1217
1605
  return;
1218
1606
  const text = transcriptPlainText(segments);
1607
+ const stamp = new Date(startedAtMs)
1608
+ .toISOString()
1609
+ .slice(0, 16)
1610
+ .replace("T", " ");
1611
+ const attachmentName = `Transcript ${stamp}.md`;
1219
1612
  if (text) {
1220
- const stamp = new Date(startedAtMs)
1221
- .toISOString()
1222
- .slice(0, 16)
1223
- .replace("T", " ");
1224
1613
  const attachment = {
1225
1614
  data: textToBase64(text),
1226
1615
  mimeType: "text/markdown",
1227
- name: `Transcript ${stamp}.md`,
1616
+ name: attachmentName,
1228
1617
  };
1229
1618
  setPendingImages((prev) => [...prev, attachment].slice(0, MAX_CHAT_IMAGES));
1230
1619
  expand();
@@ -1240,6 +1629,23 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1240
1629
  audioContentType: "audio/wav",
1241
1630
  }
1242
1631
  : {}),
1632
+ })
1633
+ .then(({ transcript }) => {
1634
+ // Link the pending attachment to the saved record so tapping it opens
1635
+ // the editable viewer and edits persist — both via the client-only
1636
+ // `transcriptId` field and a durable marker embedded in the markdown
1637
+ // (which survives the server round-trip in the attachment's text).
1638
+ if (!text)
1639
+ return;
1640
+ setPendingImages((prev) => prev.map((a) => a.name === attachmentName &&
1641
+ a.mimeType === "text/markdown" &&
1642
+ !a.transcriptId
1643
+ ? {
1644
+ ...a,
1645
+ transcriptId: transcript.id,
1646
+ data: textToBase64(withTranscriptMarker(transcript.id, text)),
1647
+ }
1648
+ : a));
1243
1649
  })
1244
1650
  .catch(() => {
1245
1651
  /* archival is best-effort; a failed save just skips the record */
@@ -1304,6 +1710,19 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1304
1710
  setSlashDismissed(true);
1305
1711
  inputRef.current?.focus();
1306
1712
  }, [slash, controller, submitText, toggleMaximize, toggleTranscriptionMode]);
1713
+ const submit = React.useCallback(() => {
1714
+ const shortcut = pendingImages.length === 0
1715
+ ? resolveClientShortcutExecution(slash.commands, draft, slash.resolveSection, {
1716
+ allowNatural: slash.naturalShortcutsEnabled,
1717
+ resolveChoices: slash.resolveChoices,
1718
+ })
1719
+ : null;
1720
+ if (shortcut) {
1721
+ runExecution(shortcut);
1722
+ return;
1723
+ }
1724
+ submitText(draft, pendingImages);
1725
+ }, [draft, pendingImages, runExecution, slash, submitText]);
1307
1726
  const pickSlashItem = React.useCallback((index) => {
1308
1727
  const exec = slashMenu.resolve(index);
1309
1728
  if (exec)
@@ -1393,10 +1812,12 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1393
1812
  preFocusCollapsedRef.current = true;
1394
1813
  detentHaptic();
1395
1814
  }
1396
- if (reduce)
1815
+ if (reduce) {
1816
+ stopOpenProgressAnimation();
1397
1817
  openProgress.set(1);
1818
+ }
1398
1819
  else
1399
- animate(openProgress, 1, OPEN_SPRING);
1820
+ animateOpenProgress(1);
1400
1821
  // Raise the keyboard on the SAME tap that opens the pill. While pilled, the
1401
1822
  // composer content is `inert`, and React only clears that on the next
1402
1823
  // render — too late for iOS WebKit, which honors focus() only synchronously
@@ -1410,13 +1831,24 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1410
1831
  contentRef.current?.removeAttribute("inert");
1411
1832
  suppressExpandOnFocusRef.current = true;
1412
1833
  inputRef.current?.focus();
1413
- }, [openProgress, reduce, hasThread, goToDetent]);
1834
+ }, [
1835
+ openProgress,
1836
+ reduce,
1837
+ hasThread,
1838
+ goToDetent,
1839
+ stopOpenProgressAnimation,
1840
+ animateOpenProgress,
1841
+ ]);
1414
1842
  // --- Pull gesture --------------------------------------------------------
1415
1843
  // The grabber is the draggable handle. A live drag sets the threadHeight motion
1416
1844
  // value DIRECTLY (no React state → no re-render per frame, so it tracks the
1417
1845
  // finger 1:1); release fires onPullUp/onPullDown (distance OR velocity, via
1418
1846
  // usePullGesture) to snap to a detent.
1419
1847
  const onDragOffset = React.useCallback((offset) => {
1848
+ if (!draggingRef.current) {
1849
+ stopThreadAnimation();
1850
+ stopOpenProgressAnimation();
1851
+ }
1420
1852
  draggingRef.current = true;
1421
1853
  // PILL drag: map the upward travel to the pill→input morph (openProgress).
1422
1854
  // The thread stays at 0 until the input is fully formed; only the EXCESS
@@ -1458,6 +1890,8 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1458
1890
  clampHeight,
1459
1891
  threadHeight,
1460
1892
  openProgress,
1893
+ stopThreadAnimation,
1894
+ stopOpenProgressAnimation,
1461
1895
  ]);
1462
1896
  const pullBinding = usePullGesture({
1463
1897
  onDrag: onDragOffset,
@@ -1478,10 +1912,12 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1478
1912
  else {
1479
1913
  // Pill → bare input bar (no thread to open into).
1480
1914
  setMode("input");
1481
- if (reduce)
1915
+ if (reduce) {
1916
+ stopThreadAnimation();
1482
1917
  threadHeight.set(0);
1918
+ }
1483
1919
  else
1484
- animate(threadHeight, 0, SHEET_SPRING);
1920
+ animateThreadHeight(0);
1485
1921
  detentHaptic();
1486
1922
  }
1487
1923
  return;
@@ -1652,9 +2088,9 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1652
2088
  opacity: revealed,
1653
2089
  visibility: scrimVisibility,
1654
2090
  pointerEvents: sheetOpen ? "auto" : "none",
1655
- } }), recording && transcript ? (_jsxs("div", { role: "status", "aria-live": "polite", "aria-atomic": "true", className: cn("pointer-events-none relative mb-2 w-full max-w-3xl text-center text-sm italic text-white/85", FLOAT_SHADOW), children: [transcript, _jsx("span", { "aria-hidden": "true", children: "\u2026" })] })) : null, needsAudioUnlock ? (_jsx("div", { role: "status", "aria-live": "polite", className: "pointer-events-none relative mb-2 flex w-full justify-center", children: _jsxs("button", { type: "button", onClick: unlockAudio, "data-testid": "overlay-voice-audio-unlock", className: cn("pointer-events-auto inline-flex items-center gap-1.5 rounded-full border px-3 py-1.5 text-sm font-medium transition-colors", "border-warn/40 bg-warn/15 text-warn hover:bg-warn/25", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-warn/70", FLOAT_SHADOW), children: [_jsx(Glyph, { d: SPEAKER_MUTED_GLYPH }), _jsx("span", { children: "Tap to enable sound" })] }) })) : null, modelStatus.kind === "downloading" || modelStatus.kind === "loading" ? (_jsx("div", { role: "status", "aria-live": "polite", "aria-atomic": "true", "data-testid": "overlay-model-download-status", className: "pointer-events-none relative mb-2 flex w-full justify-center", children: _jsxs("span", { className: cn("inline-flex items-center gap-2 rounded-full border border-white/15 bg-white/10 px-3 py-1.5 text-sm font-medium text-white/85 backdrop-blur-sm", FLOAT_SHADOW), children: [_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin text-[#FF5800]" }), modelStatus.kind === "downloading" ? (_jsxs("span", { children: ["Downloading ", modelStatus.modelName ?? "local model", typeof modelStatus.percent === "number"
2091
+ } }), recording && transcript ? (_jsxs("div", { role: "status", "aria-live": "polite", "aria-atomic": "true", className: cn("pointer-events-none relative mb-2 w-full max-w-3xl text-center text-sm italic text-white/85", FLOAT_SHADOW), children: [transcript, _jsx("span", { "aria-hidden": "true", children: "\u2026" })] })) : null, needsAudioUnlock ? (_jsx("div", { role: "status", "aria-live": "polite", className: "pointer-events-none relative mb-2 flex w-full justify-center", children: _jsxs("button", { type: "button", onClick: unlockAudio, "data-testid": "overlay-voice-audio-unlock", className: cn("pointer-events-auto inline-flex items-center gap-1.5 rounded-full border px-3 py-1.5 text-sm font-medium transition-colors", "border-warn/40 bg-warn/15 text-warn hover:bg-warn/25", " ", FLOAT_SHADOW), children: [_jsx(Glyph, { d: SPEAKER_MUTED_GLYPH }), _jsx("span", { children: "Tap to enable sound" })] }) })) : null, modelStatus.kind === "downloading" || modelStatus.kind === "loading" ? (_jsx("div", { role: "status", "aria-live": "polite", "aria-atomic": "true", "data-testid": "overlay-model-download-status", className: "pointer-events-none relative mb-2 flex w-full justify-center", children: _jsxs("span", { className: cn("inline-flex items-center gap-2 rounded-full border border-white/15 bg-white/10 px-3 py-1.5 text-sm font-medium text-white/85", FLOAT_SHADOW), children: [_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin text-[#FF5800]" }), modelStatus.kind === "downloading" ? (_jsxs("span", { children: ["Downloading ", modelStatus.modelName ?? "local model", typeof modelStatus.percent === "number"
1656
2092
  ? ` — ${Math.round(modelStatus.percent)}%`
1657
- : "…"] })) : (_jsxs("span", { children: ["Loading ", modelStatus.modelName ?? "local model", "\u2026"] }))] }) })) : null, suggestionsVisible ? (_jsx(motion.fieldset, { "aria-label": "Suggested prompts", className: cn("pointer-events-auto relative m-0 mb-2 flex w-full max-w-3xl flex-wrap items-center justify-center gap-2 border-0 p-0"), style: { order: -1, opacity: suggestionsOpacity }, "data-testid": "chat-suggestions", children: suggestions.map((s, i) => (_jsx("button", { type: "button", "data-testid": `chat-suggestion-${i}`, "aria-label": s, onClick: () => pickSuggestion(s), className: cn("max-w-full truncate rounded-full border border-white/15 bg-black/40 px-3 py-1.5", "text-[12px] text-white/80 backdrop-blur-xl transition-colors", "shadow-[inset_0_1px_0_rgba(255,255,255,0.12),0_10px_30px_-12px_rgba(0,0,0,0.6)]", "hover:border-white/30 hover:bg-white/15 hover:text-white", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/60"), children: s }, s))) })) : null, _jsxs("div", { className: cn("pointer-events-none relative flex w-full flex-col items-center", fullBleed ? "max-w-none" : "max-w-3xl"), children: [!fullBleed ? (_jsx(SheetGrabber, { open: sheetOpen, onOpen: () => {
2093
+ : "…"] })) : (_jsxs("span", { children: ["Loading ", modelStatus.modelName ?? "local model", "\u2026"] }))] }) })) : null, suggestionsVisible ? (_jsx(motion.fieldset, { "aria-label": "Suggested prompts", className: cn("pointer-events-auto relative m-0 mb-2 flex w-full max-w-3xl flex-wrap items-center justify-center gap-2 border-0 p-0"), style: { order: -1, opacity: suggestionsOpacity }, "data-testid": "chat-suggestions", children: suggestions.map((s, i) => (_jsx("button", { type: "button", "data-testid": `chat-suggestion-${i}`, "aria-label": s, onClick: () => pickSuggestion(s), className: cn("max-w-full truncate rounded-full border border-white/15 bg-black/40 px-3 py-1.5", "text-[12px] text-white/80 transition-colors", "hover:border-white/30 hover:bg-white/15 hover:text-white", " "), children: s }, s))) })) : null, _jsxs("div", { className: cn("pointer-events-none relative flex w-full flex-col items-center", fullBleed ? "max-w-none" : "max-w-3xl"), children: [!fullBleed ? (_jsx(SheetGrabber, { open: sheetOpen, onOpen: () => {
1658
2094
  if (!hasThread)
1659
2095
  return;
1660
2096
  goToDetent("half");
@@ -1687,23 +2123,14 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1687
2123
  // home screen — only the pill-capsule child re-enables pointer events.
1688
2124
  pointerEvents: pilled ? "none" : "auto",
1689
2125
  }, className: cn(
1690
- // overflow-VISIBLE on the outer fieldset: the glass layer's soft drop
1691
- // shadow + the pill's tall grab zone must bleed past the box. The
1692
- // rounded thread-clip lives on the inner content wrapper instead, so
1693
- // clipping the scroll never clips the shadow into a hard square edge.
2126
+ // overflow-VISIBLE on the outer fieldset: the pill's tall grab zone
2127
+ // must bleed past the box. The rounded thread-clip lives on the inner
2128
+ // content wrapper instead, so clipping the scroll never clips a hard
2129
+ // square edge over the content.
1694
2130
  "relative m-0 flex w-full min-w-0 flex-col overflow-visible border-0 p-0"), children: [_jsx(motion.div, { "aria-hidden": "true", className: cn("pointer-events-none absolute inset-0 z-0", fullBleed ? "border-0" : "border border-white/[0.16]",
1695
- // Liquid glass: a near-clear tint that lets the backdrop show
1696
- // through, BLURRED + over-saturated + brightness-knocked-down so
1697
- // bright content (the orange ambient) stops white text from washing
1698
- // out — instead of a heavy dark fill. blur(16px)+saturate+brightness
1699
- // compose into ONE backdrop-filter pass (blur radius never animated,
1700
- // so it stays cheap on the per-frame-resizing surface). The base
1701
- // bg-black/45 is the legible fallback when backdrop-filter is
1702
- // unavailable; the supports- rule thins it to glass once the filter
1703
- // is doing the darkening.
1704
- "bg-black/45 backdrop-blur-lg backdrop-saturate-[1.8] backdrop-brightness-[0.68] supports-[backdrop-filter]:bg-black/[0.12]", fullBleed
1705
- ? "shadow-none"
1706
- : "shadow-[inset_0_1px_0_rgba(255,255,255,0.26),inset_0_0_0_0.5px_rgba(255,255,255,0.08),0_18px_50px_-16px_rgba(0,0,0,0.72)]"), style: {
2131
+ // A solid dark fill so white text stays legible over any view
2132
+ // behind (a bright view, a dark view, or the warm ambient field).
2133
+ "bg-black/45"), style: {
1707
2134
  opacity: glassOpacity,
1708
2135
  borderRadius: fullBleed ? 0 : panelRadius,
1709
2136
  // Full-bleed: extend the glass UP through the safe-area-top so the
@@ -1725,7 +2152,7 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1725
2152
  opacity: glassOpacity,
1726
2153
  pointerEvents: pilled ? "none" : "auto",
1727
2154
  borderRadius: fullBleed ? 0 : panelRadius,
1728
- }, children: [_jsx("div", { "aria-hidden": "true", className: "pointer-events-none absolute inset-x-0 top-0 z-0 h-20 bg-gradient-to-b from-white/[0.07] to-transparent" }), _jsx(motion.div, { "aria-hidden": "true", className: "pointer-events-none absolute inset-x-0 bottom-0 z-0 h-28 blur-xl bg-[rgba(255,180,120,0.30)]", initial: false, animate: { opacity: listening ? 1 : 0 }, transition: { duration: reduce ? 0 : 1.1, ease: "easeInOut" } }), _jsx(motion.div, { "aria-hidden": "true", className: "pointer-events-none absolute inset-x-0 bottom-0 z-0 h-28 blur-xl bg-[rgba(255,140,80,0.18)]", initial: false, animate: { opacity: responding ? 1 : 0 }, transition: { duration: reduce ? 0 : 1.1, ease: "easeInOut" } }), !pilled ? (_jsxs(motion.div
2155
+ }, children: [sheetOpen ? (_jsxs(_Fragment, { children: [_jsx(SwipeEdgeHint, { side: "left", active: swipeDx < 0 && conversationNav.hasPrev, amount: -swipeDx }), _jsx(SwipeEdgeHint, { side: "right", active: swipeDx > 0 && conversationNav.hasNext, amount: swipeDx })] })) : null, _jsx("div", { "aria-hidden": "true", className: "pointer-events-none absolute inset-x-0 top-0 z-0 h-20 bg-gradient-to-b from-white/[0.07] to-transparent" }), !pilled ? (_jsxs(motion.div
1729
2156
  // Always mounted (when not pilled) so it can FADE + LERP its
1730
2157
  // space open/closed with the live height instead of popping in
1731
2158
  // on a mount. `headerVisible` (live-height boolean) gates
@@ -1756,7 +2183,9 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1756
2183
  paddingTop: fullBleed
1757
2184
  ? "calc(var(--safe-area-top, 0px) + 0.5rem)"
1758
2185
  : headerPadTop,
1759
- }, className: cn("relative z-10 flex shrink-0 items-center justify-between gap-1.5 overflow-hidden px-3"), children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(HeaderButton, { icon: maximized ? Minimize2 : Maximize2, label: maximized ? "exit full screen" : "full screen", active: maximized, onClick: toggleMaximize, testId: "chat-full-maximize" }), _jsx(HeaderButton, { icon: RotateCcw, label: "clear conversation", onClick: () => clearConversation(), testId: "chat-full-clear" })] }), transcriptionMode ? (_jsx("div", { "data-testid": "chat-transcribing-badge", className: "pointer-events-none absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 whitespace-nowrap rounded-full bg-[var(--brand-orange,#ff6a00)]/15 px-2.5 py-0.5 text-[11px] font-medium text-[var(--brand-orange,#ff6a00)]", children: "Transcribing \u2014 say \u201Cexit transcription mode\u201D to stop" })) : null, _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(HeaderButton, { icon: Home, label: "home", disabled: currentTab === "chat", onClick: () => navigateAndClose(() => navigateHome?.()), testId: "chat-full-home" }), _jsx(HeaderButton, { icon: LayoutGrid, label: "views", disabled: currentTab === "views", onClick: () => navigateAndClose(() => navigateToViews?.()), testId: "chat-full-views" }), _jsx(HeaderButton, { icon: SettingsIcon, label: "settings", disabled: currentTab === "settings", onClick: () => navigateAndClose(() => openSettings()), testId: "chat-full-settings" })] })] })) : null, hasThread ? (_jsx(motion.div, { "data-testid": "chat-thread", className: cn("relative z-10 min-h-0 w-full shrink grow-0 overflow-hidden",
2186
+ }, className: cn("relative z-10 flex shrink-0 items-center justify-between gap-1.5 overflow-hidden px-3"), children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(HeaderButton, { icon: maximized ? Minimize2 : Maximize2, label: maximized ? "exit full screen" : "full screen", active: maximized, onClick: toggleMaximize, testId: "chat-full-maximize" }), hasThread ? (_jsx(HeaderButton, { icon: conversationCopied ? Check : Copy, label: conversationCopied
2187
+ ? "conversation copied"
2188
+ : "copy conversation", onClick: handleCopyConversation, testId: "chat-full-copy-conversation" })) : null, _jsx(HeaderButton, { icon: RotateCcw, label: "clear conversation", onClick: () => clearConversation(), testId: "chat-full-clear" })] }), transcriptionMode ? (_jsx("div", { "data-testid": "chat-transcribing-badge", className: "pointer-events-none absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 whitespace-nowrap rounded-full bg-[var(--brand-orange,#ff6a00)]/15 px-2.5 py-0.5 text-[11px] font-medium text-[var(--brand-orange,#ff6a00)]", children: "Transcribing \u2014 say \u201Cexit transcription mode\u201D to stop" })) : null, _jsx("div", { className: "flex items-center gap-1.5", children: _jsx(HeaderButton, { icon: LayoutGrid, label: "springboard", onClick: () => navigateAndClose(() => navigateHome?.()), testId: "chat-full-springboard" }) })] })) : null, hasThread || sheetOpen ? (_jsx(motion.div, { "data-testid": "chat-thread", className: cn("relative z-10 min-h-0 w-full shrink grow-0 overflow-hidden",
1760
2189
  // When open, fade the top edge into the glass so the topmost
1761
2190
  // message dissolves under the drag handle instead of butting
1762
2191
  // against it.
@@ -1772,20 +2201,34 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1772
2201
  style: {
1773
2202
  flexBasis: threadFlexBasis,
1774
2203
  paddingTop: threadGrabberClearance,
1775
- }, children: _jsx("div", { id: "continuous-thread", ref: threadRef, role: "log", "aria-label": "conversation history", "aria-live": "polite", "aria-hidden": !sheetOpen ? true : undefined, tabIndex: sheetOpen ? 0 : -1, onKeyDown: (e) => {
2204
+ }, children: _jsxs("div", { id: "continuous-thread", ref: threadRef, role: "log", "aria-label": "conversation history", "aria-live": "polite", "aria-hidden": !sheetOpen ? true : undefined, tabIndex: sheetOpen ? 0 : -1, onKeyDown: (e) => {
1776
2205
  if (e.key === "Escape") {
1777
2206
  e.preventDefault();
1778
2207
  collapse();
1779
2208
  }
1780
- }, className: "relative flex h-full w-full touch-pan-y flex-col overflow-y-auto px-5 [scrollbar-width:none] focus-visible:outline-none [&::-webkit-scrollbar]:hidden", children: _jsxs("div", { className: "mt-auto flex flex-col pb-3 pt-1", children: [_jsx(AnimatePresence, { initial: false, children: visibleMessages.map((m) => (_jsx(ThreadLine, { message: m, floating: true, reduce: reduce, onCopy: handleCopyMessage, onOpenSettings: openSettings }, m.id))) }), _jsx(AnimatePresence, { children: responding &&
1781
- !(visibleMessages.at(-1)?.role === "assistant" &&
1782
- !visibleMessages.at(-1)?.content.trim()) ? (_jsx(TypingDots, { reduce: reduce })) : null }), _jsx("div", { ref: endRef })] }) }) })) : null, hasImages || imageError ? (_jsxs("div", { className: "relative z-10 flex shrink-0 flex-col gap-1.5 px-3 pt-2", children: [hasImages ? (_jsx("div", { className: "flex flex-wrap gap-2", children: pendingImages.map((img, i) => {
2209
+ }, ...(sheetOpen ? conversationSwipe : {}), className: "relative flex h-full w-full touch-pan-y flex-col overflow-y-auto px-5 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", children: [visibleMessages.length === 0 && conversationLoading ? (_jsx("div", { "data-testid": "chat-thread-loading", className: "pointer-events-none absolute inset-0 grid place-items-center", children: _jsx(Loader2, { className: "h-6 w-6 animate-spin text-[#FF5800]" }) })) : null, hasTopics ? (_jsx(TopicChipsBar, { topics: channelTopics, onSelectTopic: scrollToTopic, className: "sticky top-0 z-[2] -mx-5 mb-1 bg-gradient-to-b from-black/40 to-transparent px-5" })) : null, _jsxs("div", { className: "mt-auto flex flex-col pb-3 pt-1", children: [hasTopics
2210
+ ? // Topic-grouped transcript: each cluster collapses via a
2211
+ // gesture on its header (no visible buttons).
2212
+ (() => {
2213
+ let lineIndex = 0;
2214
+ return topicSegments.map((segment) => {
2215
+ const lines = segment.messages.map((m) => renderThreadLine(m, lineIndex++));
2216
+ return (_jsx(TopicGroup, { topic: segment.topic, count: segment.messages.length, collapsed: collapsedTopics.has(segment.key), onCollapsedChange: (collapsed) => setTopicCollapsed(segment.key, collapsed), children: _jsx(AnimatePresence, { initial: false, children: lines }) }, segment.messages[0]?.id ?? segment.key));
2217
+ });
2218
+ })()
2219
+ : // Flat transcript (no topic tags) — unchanged behavior.
2220
+ // Only the LAST, content-less assistant turn (the
2221
+ // in-flight one) reads turnStatus — every settled bubble
2222
+ // gets undefined so its memo identity is unchanged.
2223
+ null, hasTopics ? null : (_jsx(AnimatePresence, { initial: false, children: visibleMessages.map((m, i) => renderThreadLine(m, i)) })), _jsx(AnimatePresence, { children: responding &&
2224
+ !(visibleMessages.at(-1)?.role === "assistant" &&
2225
+ !visibleMessages.at(-1)?.content.trim()) ? (_jsx(TurnStatusIndicator, { status: turnStatus, reduce: reduce })) : null }), _jsx("div", { ref: endRef })] })] }) })) : null, hasImages || imageError ? (_jsxs("div", { className: "relative z-10 flex shrink-0 flex-col gap-1.5 px-3 pt-2", children: [hasImages ? (_jsx("div", { className: "flex flex-wrap gap-2", children: pendingImages.map((img, i) => {
1783
2226
  const kind = chatUploadKind(img.mimeType);
1784
2227
  const removeButton = (_jsx("button", { type: "button", "aria-label": `remove ${img.name}`, onClick: () => removeImage(i),
1785
2228
  // Small visual disc, but a 44px-class hit zone via the
1786
2229
  // invisible `before` overlay so it's thumb-tappable
1787
2230
  // without crowding the tile.
1788
- className: "absolute -right-1.5 -top-1.5 grid h-5 w-5 place-items-center rounded-full border border-white/20 bg-black/70 text-xs text-white/90 backdrop-blur transition-colors before:absolute before:-inset-3 before:content-[''] hover:bg-black/90", children: "\u00D7" }));
2231
+ className: "absolute -right-1.5 -top-1.5 grid h-5 w-5 place-items-center rounded-full border border-white/20 bg-black/70 text-xs text-white/90 transition-colors before:absolute before:-inset-3 before:content-[''] hover:bg-black/90", children: "\u00D7" }));
1789
2232
  const tileKey = `${img.name}-${img.mimeType}-${img.data.length}`;
1790
2233
  if (kind === "image") {
1791
2234
  return (_jsxs("div", { className: "group relative h-14 w-14 shrink-0", children: [_jsx("img", { src: `data:${img.mimeType};base64,${img.data}`, alt: img.name, className: "h-14 w-14 rounded-lg border border-white/20 object-cover" }), removeButton] }, tileKey));
@@ -1835,11 +2278,22 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1835
2278
  expand();
1836
2279
  }
1837
2280
  }, onBlur: () => setComposerFocused(false), onPaste: (e) => {
1838
- // Paste images/files straight into the composer (cmd/ctrl+V).
1839
- const files = Array.from(e.clipboardData?.files ?? []);
1840
- if (files.length > 0) {
2281
+ // Shared with the desktop composer: a pasted image/file
2282
+ // attaches, a large plain-text paste becomes a collapsed
2283
+ // text-attachment chip, and small text falls through to the
2284
+ // textarea as normal.
2285
+ const intent = classifyComposerPaste({
2286
+ files: Array.from(e.clipboardData?.files ?? []),
2287
+ text: e.clipboardData?.getData("text") ?? "",
2288
+ });
2289
+ if (intent.kind === "files") {
2290
+ e.preventDefault();
2291
+ addImageFiles(intent.files);
2292
+ return;
2293
+ }
2294
+ if (intent.kind === "text-attachment") {
1841
2295
  e.preventDefault();
1842
- addImageFiles(files);
2296
+ setPendingImages((prev) => [...prev, intent.attachment].slice(0, MAX_CHAT_IMAGES));
1843
2297
  }
1844
2298
  }, onKeyDown: (e) => {
1845
2299
  // The slash menu intercepts navigation/commit keys when open.
@@ -1888,30 +2342,28 @@ export function ContinuousChatOverlay({ controller, agentName = "Eliza", slash:
1888
2342
  }
1889
2343
  }, placeholder: booting
1890
2344
  ? `Ask ${agentName} — waking up…`
1891
- : (viewChatBinding?.placeholder ?? `Ask ${agentName}`), "aria-label": "message", "data-testid": "chat-composer-textarea", "aria-describedby": booting ? "cc-booting-hint" : undefined, ...comboboxAria, className: "max-h-[8.5rem] min-h-8 min-w-0 flex-1 resize-none self-center border-none bg-transparent px-1.5 py-1 text-left text-sm leading-relaxed text-white/[0.92] outline-none [scrollbar-width:none] placeholder:text-white/45 [&::-webkit-scrollbar]:hidden" }), _jsxs("span", { id: "cc-booting-hint", className: "sr-only", children: [agentName, " is waking up \u2014 you can type now; your message sends and the reply arrives in a moment."] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1.5 sm:gap-2", children: [voiceActive ? (_jsx(SoftButton, { icon: FileText, label: transcriptionMode
1892
- ? "stop transcription"
1893
- : "transcription mode", active: transcriptionMode, onClick: toggleTranscriptionMode, testId: "chat-composer-transcribe" })) : null, _jsx("div", { className: "shrink-0", children: (hasDraft || hasImages) && !recording ? (_jsx(SoftButton, { icon: SendHorizontal, label: !canSend
1894
- ? "send (agent stopped)"
1895
- : responding
1896
- ? "send another"
1897
- : "send", disabled: !canSend,
1898
- // Keep focus in the textarea on tap: without this the
1899
- // button steals focus, the textarea blurs, the keyboard
1900
- // retracts and the composer relayouts between pointerdown
1901
- // and click so the first tap only dismissed the keyboard
1902
- // and a second tap was needed to actually send. Chromium
1903
- // still dispatches click after a preventDefaulted
1904
- // pointerdown, so onClick fires on the first tap and the
1905
- // keyboard stays up for the next message.
1906
- onPointerDown: (e) => e.preventDefault(), onClick: submit, testId: "chat-composer-action" })) : !recording && responding ? (_jsx(SoftButton, { glyph: STOP_GLYPH, label: "stop generating", onClick: () => stop(), testId: "chat-composer-stop" })) : (_jsx(SoftButton, { icon: Mic, label: pttHolding
1907
- ? "release to send"
1908
- : transcriptionMode
1909
- ? "stop transcription"
1910
- : handsFree
1911
- ? "end conversation"
1912
- : recording
1913
- ? "stop listening"
1914
- : "talk", active: recording || handsFree || transcriptionMode, onClick: handleMicClick, onPointerDown: beginPushToTalkPress, onPointerUp: (e) => finishPushToTalkPress(e, false), onPointerCancel: (e) => finishPushToTalkPress(e, true), testId: "chat-composer-mic" })) })] })] })] }), _jsx(motion.div, { className: "absolute inset-x-0 bottom-0 z-30 flex justify-center", style: {
2345
+ : (viewChatBinding?.placeholder ?? `Ask ${agentName}`), "aria-label": "message", "data-testid": "chat-composer-textarea", "aria-describedby": booting ? "cc-booting-hint" : undefined, ...comboboxAria, className: "max-h-[8.5rem] min-h-8 min-w-0 flex-1 resize-none self-center border-none bg-transparent px-1.5 py-1 text-left text-sm leading-relaxed text-white/[0.92] outline-none [scrollbar-width:none] placeholder:text-white/45 [&::-webkit-scrollbar]:hidden" }), _jsxs("span", { id: "cc-booting-hint", className: "sr-only", children: [agentName, " is waking up \u2014 you can type now; your message sends and the reply arrives in a moment."] }), _jsx("div", { className: "flex shrink-0 items-center gap-1.5 sm:gap-2", children: _jsx("div", { className: "shrink-0", children: (hasDraft || hasImages) && !recording ? (_jsx(SoftButton, { icon: SendHorizontal, label: !canSend
2346
+ ? "send (agent stopped)"
2347
+ : responding
2348
+ ? "send another"
2349
+ : "send", disabled: !canSend,
2350
+ // Keep focus in the textarea on tap: without this the
2351
+ // button steals focus, the textarea blurs, the keyboard
2352
+ // retracts and the composer relayouts between pointerdown
2353
+ // and click so the first tap only dismissed the keyboard
2354
+ // and a second tap was needed to actually send. Chromium
2355
+ // still dispatches click after a preventDefaulted
2356
+ // pointerdown, so onClick fires on the first tap and the
2357
+ // keyboard stays up for the next message.
2358
+ onPointerDown: (e) => e.preventDefault(), onClick: submit, testId: "chat-composer-action" })) : !recording && responding ? (_jsx(SoftButton, { glyph: STOP_GLYPH, label: "stop generating", onClick: () => stop(), testId: "chat-composer-stop" })) : (_jsx(SoftButton, { icon: Mic, label: pttHolding
2359
+ ? "release to send"
2360
+ : transcriptionMode
2361
+ ? "stop transcription"
2362
+ : handsFree
2363
+ ? "end conversation"
2364
+ : recording
2365
+ ? "stop listening"
2366
+ : "talk", active: recording || handsFree || transcriptionMode, onClick: handleMicClick, onPointerDown: beginPushToTalkPress, onPointerUp: (e) => finishPushToTalkPress(e, false), onPointerCancel: (e) => finishPushToTalkPress(e, true), testId: "chat-composer-mic" })) }) })] })] }), _jsx(motion.div, { className: "absolute inset-x-0 bottom-0 z-30 flex justify-center", style: {
1915
2367
  opacity: pillOpacity,
1916
2368
  pointerEvents: pilled ? "auto" : "none",
1917
2369
  }, children: _jsx(PillHandle, { binding: pullBinding, onOpen: openFromPill, glow: listening || responding, pilled: pilled }) })] })] })] }));