@elizaos/ui 2.0.0-alpha.385 → 2.0.0-alpha.392

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 (369) hide show
  1. package/apps/app-companion/src/components/companion/CompanionAppView.d.ts.map +1 -1
  2. package/apps/app-companion/src/components/companion/CompanionAppView.js +6 -4
  3. package/apps/app-companion/src/components/companion/CompanionView.d.ts.map +1 -1
  4. package/apps/app-companion/src/components/companion/CompanionView.js +6 -4
  5. package/apps/app-lifeops/src/api/client-lifeops.js +6 -0
  6. package/apps/app-lifeops/src/components/AppBlockerSettingsCard.d.ts +3 -0
  7. package/apps/app-lifeops/src/components/AppBlockerSettingsCard.d.ts.map +1 -0
  8. package/apps/app-lifeops/src/components/AppBlockerSettingsCard.js +189 -0
  9. package/apps/app-lifeops/src/components/BrowserBridgeSetupPanel.d.ts +2 -0
  10. package/apps/app-lifeops/src/components/BrowserBridgeSetupPanel.d.ts.map +1 -0
  11. package/apps/app-lifeops/src/components/BrowserBridgeSetupPanel.js +1065 -0
  12. package/apps/app-lifeops/src/components/BrowserBridgeStatusChip.d.ts +7 -0
  13. package/apps/app-lifeops/src/components/BrowserBridgeStatusChip.d.ts.map +1 -0
  14. package/apps/app-lifeops/src/components/BrowserBridgeStatusChip.js +71 -0
  15. package/apps/app-lifeops/src/components/DataSourcesStrip.d.ts +14 -0
  16. package/apps/app-lifeops/src/components/DataSourcesStrip.d.ts.map +1 -0
  17. package/apps/app-lifeops/src/components/DataSourcesStrip.js +36 -0
  18. package/apps/app-lifeops/src/components/EventEditorDrawer.d.ts +23 -0
  19. package/apps/app-lifeops/src/components/EventEditorDrawer.d.ts.map +1 -0
  20. package/apps/app-lifeops/src/components/EventEditorDrawer.js +514 -0
  21. package/apps/app-lifeops/src/components/LifeOpsActivitySignalsEffect.d.ts +2 -0
  22. package/apps/app-lifeops/src/components/LifeOpsActivitySignalsEffect.d.ts.map +1 -0
  23. package/apps/app-lifeops/src/components/LifeOpsActivitySignalsEffect.js +10 -0
  24. package/apps/app-lifeops/src/components/LifeOpsCalendarSection.d.ts +15 -0
  25. package/apps/app-lifeops/src/components/LifeOpsCalendarSection.d.ts.map +1 -0
  26. package/apps/app-lifeops/src/components/LifeOpsCalendarSection.js +515 -0
  27. package/apps/app-lifeops/src/components/LifeOpsChatAdapter.d.ts +34 -0
  28. package/apps/app-lifeops/src/components/LifeOpsChatAdapter.d.ts.map +1 -0
  29. package/apps/app-lifeops/src/components/LifeOpsChatAdapter.js +175 -0
  30. package/apps/app-lifeops/src/components/LifeOpsFeatureTogglesSection.d.ts +2 -0
  31. package/apps/app-lifeops/src/components/LifeOpsFeatureTogglesSection.d.ts.map +1 -0
  32. package/apps/app-lifeops/src/components/LifeOpsFeatureTogglesSection.js +99 -0
  33. package/apps/app-lifeops/src/components/LifeOpsHabitVisuals.d.ts +37 -0
  34. package/apps/app-lifeops/src/components/LifeOpsHabitVisuals.d.ts.map +1 -0
  35. package/apps/app-lifeops/src/components/LifeOpsHabitVisuals.js +88 -0
  36. package/apps/app-lifeops/src/components/LifeOpsInboxSection.d.ts +13 -0
  37. package/apps/app-lifeops/src/components/LifeOpsInboxSection.d.ts.map +1 -0
  38. package/apps/app-lifeops/src/components/LifeOpsInboxSection.js +490 -0
  39. package/apps/app-lifeops/src/components/LifeOpsLinkBankButton.d.ts +12 -0
  40. package/apps/app-lifeops/src/components/LifeOpsLinkBankButton.d.ts.map +1 -0
  41. package/apps/app-lifeops/src/components/LifeOpsLinkBankButton.js +92 -0
  42. package/apps/app-lifeops/src/components/LifeOpsLinkPaypalButton.d.ts +12 -0
  43. package/apps/app-lifeops/src/components/LifeOpsLinkPaypalButton.d.ts.map +1 -0
  44. package/apps/app-lifeops/src/components/LifeOpsLinkPaypalButton.js +160 -0
  45. package/apps/app-lifeops/src/components/LifeOpsMoneySection.d.ts +3 -0
  46. package/apps/app-lifeops/src/components/LifeOpsMoneySection.d.ts.map +1 -0
  47. package/apps/app-lifeops/src/components/LifeOpsMoneySection.js +373 -0
  48. package/apps/app-lifeops/src/components/LifeOpsNavRail.d.ts +9 -0
  49. package/apps/app-lifeops/src/components/LifeOpsNavRail.d.ts.map +1 -0
  50. package/apps/app-lifeops/src/components/LifeOpsNavRail.js +93 -0
  51. package/apps/app-lifeops/src/components/LifeOpsOperationalPanels.d.ts +4 -0
  52. package/apps/app-lifeops/src/components/LifeOpsOperationalPanels.d.ts.map +1 -0
  53. package/apps/app-lifeops/src/components/LifeOpsOperationalPanels.js +274 -0
  54. package/apps/app-lifeops/src/components/LifeOpsOverviewSection.d.ts +7 -0
  55. package/apps/app-lifeops/src/components/LifeOpsOverviewSection.d.ts.map +1 -0
  56. package/apps/app-lifeops/src/components/LifeOpsOverviewSection.js +657 -0
  57. package/apps/app-lifeops/src/components/LifeOpsPageSections.d.ts +42 -0
  58. package/apps/app-lifeops/src/components/LifeOpsPageSections.d.ts.map +1 -0
  59. package/apps/app-lifeops/src/components/LifeOpsPageSections.js +166 -0
  60. package/apps/app-lifeops/src/components/LifeOpsPageView.d.ts +2 -0
  61. package/apps/app-lifeops/src/components/LifeOpsPageView.d.ts.map +1 -0
  62. package/apps/app-lifeops/src/components/LifeOpsPageView.js +566 -0
  63. package/apps/app-lifeops/src/components/LifeOpsRemindersSection.d.ts +2 -0
  64. package/apps/app-lifeops/src/components/LifeOpsRemindersSection.d.ts.map +1 -0
  65. package/apps/app-lifeops/src/components/LifeOpsRemindersSection.js +749 -0
  66. package/apps/app-lifeops/src/components/LifeOpsResizableSidebar.d.ts +27 -0
  67. package/apps/app-lifeops/src/components/LifeOpsResizableSidebar.d.ts.map +1 -0
  68. package/apps/app-lifeops/src/components/LifeOpsResizableSidebar.js +106 -0
  69. package/apps/app-lifeops/src/components/LifeOpsScreenTimeSection.d.ts +2 -0
  70. package/apps/app-lifeops/src/components/LifeOpsScreenTimeSection.d.ts.map +1 -0
  71. package/apps/app-lifeops/src/components/LifeOpsScreenTimeSection.js +373 -0
  72. package/apps/app-lifeops/src/components/LifeOpsSectionContent.d.ts +10 -0
  73. package/apps/app-lifeops/src/components/LifeOpsSectionContent.d.ts.map +1 -0
  74. package/apps/app-lifeops/src/components/LifeOpsSectionContent.js +30 -0
  75. package/apps/app-lifeops/src/components/LifeOpsSelectionContext.d.ts +21 -0
  76. package/apps/app-lifeops/src/components/LifeOpsSelectionContext.d.ts.map +1 -0
  77. package/apps/app-lifeops/src/components/LifeOpsSelectionContext.js +30 -0
  78. package/apps/app-lifeops/src/components/LifeOpsSettingsSection.d.ts +20 -0
  79. package/apps/app-lifeops/src/components/LifeOpsSettingsSection.d.ts.map +1 -0
  80. package/apps/app-lifeops/src/components/LifeOpsSettingsSection.js +597 -0
  81. package/apps/app-lifeops/src/components/LifeOpsSetupGate.d.ts +13 -0
  82. package/apps/app-lifeops/src/components/LifeOpsSetupGate.d.ts.map +1 -0
  83. package/apps/app-lifeops/src/components/LifeOpsSetupGate.js +134 -0
  84. package/apps/app-lifeops/src/components/LifeOpsSleepSection.d.ts +10 -0
  85. package/apps/app-lifeops/src/components/LifeOpsSleepSection.d.ts.map +1 -0
  86. package/apps/app-lifeops/src/components/LifeOpsSleepSection.js +425 -0
  87. package/apps/app-lifeops/src/components/LifeOpsWorkspaceShell.d.ts +11 -0
  88. package/apps/app-lifeops/src/components/LifeOpsWorkspaceShell.d.ts.map +1 -0
  89. package/apps/app-lifeops/src/components/LifeOpsWorkspaceShell.js +49 -0
  90. package/apps/app-lifeops/src/components/LifeOpsWorkspaceView.d.ts +2 -0
  91. package/apps/app-lifeops/src/components/LifeOpsWorkspaceView.d.ts.map +1 -0
  92. package/apps/app-lifeops/src/components/LifeOpsWorkspaceView.js +1041 -0
  93. package/apps/app-lifeops/src/components/MessagingConnectorCards.d.ts +7 -0
  94. package/apps/app-lifeops/src/components/MessagingConnectorCards.d.ts.map +1 -0
  95. package/apps/app-lifeops/src/components/MessagingConnectorCards.js +643 -0
  96. package/apps/app-lifeops/src/components/MissingSourceCard.d.ts +9 -0
  97. package/apps/app-lifeops/src/components/MissingSourceCard.d.ts.map +1 -0
  98. package/apps/app-lifeops/src/components/MissingSourceCard.js +5 -0
  99. package/apps/app-lifeops/src/components/MobileSignalsSetupCard.d.ts +2 -0
  100. package/apps/app-lifeops/src/components/MobileSignalsSetupCard.d.ts.map +1 -0
  101. package/apps/app-lifeops/src/components/MobileSignalsSetupCard.js +163 -0
  102. package/apps/app-lifeops/src/components/SleepInspectionPanel.d.ts +8 -0
  103. package/apps/app-lifeops/src/components/SleepInspectionPanel.d.ts.map +1 -0
  104. package/apps/app-lifeops/src/components/SleepInspectionPanel.js +59 -0
  105. package/apps/app-lifeops/src/components/WebsiteBlockerSettingsCard.d.ts +3 -0
  106. package/apps/app-lifeops/src/components/WebsiteBlockerSettingsCard.d.ts.map +1 -0
  107. package/apps/app-lifeops/src/components/WebsiteBlockerSettingsCard.js +75 -0
  108. package/apps/app-lifeops/src/components/WhatsAppQrOverlay.d.ts +8 -0
  109. package/apps/app-lifeops/src/components/WhatsAppQrOverlay.d.ts.map +1 -0
  110. package/apps/app-lifeops/src/components/WhatsAppQrOverlay.js +48 -0
  111. package/apps/app-lifeops/src/components/lifeops-labels.d.ts +2 -0
  112. package/apps/app-lifeops/src/components/lifeops-labels.d.ts.map +1 -0
  113. package/apps/app-lifeops/src/components/lifeops-labels.js +5 -0
  114. package/apps/app-lifeops/src/events/index.d.ts +34 -0
  115. package/apps/app-lifeops/src/events/index.d.ts.map +1 -0
  116. package/apps/app-lifeops/src/events/index.js +23 -0
  117. package/apps/app-lifeops/src/hooks/useCalendarWeek.d.ts +28 -0
  118. package/apps/app-lifeops/src/hooks/useCalendarWeek.d.ts.map +1 -0
  119. package/apps/app-lifeops/src/hooks/useCalendarWeek.js +93 -0
  120. package/apps/app-lifeops/src/hooks/useDiscordConnector.d.ts +14 -0
  121. package/apps/app-lifeops/src/hooks/useDiscordConnector.d.ts.map +1 -0
  122. package/apps/app-lifeops/src/hooks/useDiscordConnector.js +126 -0
  123. package/apps/app-lifeops/src/hooks/useGoogleLifeOpsConnector.d.ts +29 -0
  124. package/apps/app-lifeops/src/hooks/useGoogleLifeOpsConnector.d.ts.map +1 -0
  125. package/apps/app-lifeops/src/hooks/useGoogleLifeOpsConnector.js +481 -0
  126. package/apps/app-lifeops/src/hooks/useIMessageConnector.d.ts +10 -0
  127. package/apps/app-lifeops/src/hooks/useIMessageConnector.d.ts.map +1 -0
  128. package/apps/app-lifeops/src/hooks/useIMessageConnector.js +50 -0
  129. package/apps/app-lifeops/src/hooks/useInbox.d.ts +34 -0
  130. package/apps/app-lifeops/src/hooks/useInbox.d.ts.map +1 -0
  131. package/apps/app-lifeops/src/hooks/useInbox.js +98 -0
  132. package/apps/app-lifeops/src/hooks/useLifeOpsActivitySignals.d.ts +2 -0
  133. package/apps/app-lifeops/src/hooks/useLifeOpsActivitySignals.d.ts.map +1 -0
  134. package/apps/app-lifeops/src/hooks/useLifeOpsActivitySignals.js +383 -0
  135. package/apps/app-lifeops/src/hooks/useLifeOpsAppState.d.ts +9 -0
  136. package/apps/app-lifeops/src/hooks/useLifeOpsAppState.d.ts.map +1 -0
  137. package/apps/app-lifeops/src/hooks/useLifeOpsAppState.js +83 -0
  138. package/apps/app-lifeops/src/hooks/useLifeOpsCapabilitiesStatus.d.ts +8 -0
  139. package/apps/app-lifeops/src/hooks/useLifeOpsCapabilitiesStatus.d.ts.map +1 -0
  140. package/apps/app-lifeops/src/hooks/useLifeOpsCapabilitiesStatus.js +60 -0
  141. package/apps/app-lifeops/src/hooks/useLifeOpsScheduleInspection.d.ts +18 -0
  142. package/apps/app-lifeops/src/hooks/useLifeOpsScheduleInspection.d.ts.map +1 -0
  143. package/apps/app-lifeops/src/hooks/useLifeOpsScheduleInspection.js +66 -0
  144. package/apps/app-lifeops/src/hooks/useLifeOpsScheduleState.d.ts +14 -0
  145. package/apps/app-lifeops/src/hooks/useLifeOpsScheduleState.d.ts.map +1 -0
  146. package/apps/app-lifeops/src/hooks/useLifeOpsScheduleState.js +79 -0
  147. package/apps/app-lifeops/src/hooks/useLifeOpsSection.d.ts +18 -0
  148. package/apps/app-lifeops/src/hooks/useLifeOpsSection.d.ts.map +1 -0
  149. package/apps/app-lifeops/src/hooks/useLifeOpsSection.js +78 -0
  150. package/apps/app-lifeops/src/hooks/useLifeOpsXConnector.d.ts +14 -0
  151. package/apps/app-lifeops/src/hooks/useLifeOpsXConnector.d.ts.map +1 -0
  152. package/apps/app-lifeops/src/hooks/useLifeOpsXConnector.js +160 -0
  153. package/apps/app-lifeops/src/hooks/useSignalConnector.d.ts +16 -0
  154. package/apps/app-lifeops/src/hooks/useSignalConnector.d.ts.map +1 -0
  155. package/apps/app-lifeops/src/hooks/useSignalConnector.js +198 -0
  156. package/apps/app-lifeops/src/hooks/useTelegramConnector.d.ts +21 -0
  157. package/apps/app-lifeops/src/hooks/useTelegramConnector.d.ts.map +1 -0
  158. package/apps/app-lifeops/src/hooks/useTelegramConnector.js +177 -0
  159. package/apps/app-lifeops/src/hooks/useWhatsAppConnector.d.ts +8 -0
  160. package/apps/app-lifeops/src/hooks/useWhatsAppConnector.d.ts.map +1 -0
  161. package/apps/app-lifeops/src/hooks/useWhatsAppConnector.js +58 -0
  162. package/apps/app-lifeops/src/hooks/useWhatsAppPairing.d.ts +12 -0
  163. package/apps/app-lifeops/src/hooks/useWhatsAppPairing.d.ts.map +1 -0
  164. package/apps/app-lifeops/src/hooks/useWhatsAppPairing.js +152 -0
  165. package/apps/app-lifeops/src/lifeops/discord-browser-scraper.js +1 -1
  166. package/apps/app-lifeops/src/lifeops/google-gmail.d.ts.map +1 -1
  167. package/apps/app-lifeops/src/lifeops/google-gmail.js +74 -26
  168. package/apps/app-lifeops/src/lifeops/google-managed-client.d.ts.map +1 -1
  169. package/apps/app-lifeops/src/lifeops/google-managed-client.js +4 -5
  170. package/apps/app-lifeops/src/lifeops/google-oauth.d.ts.map +1 -1
  171. package/apps/app-lifeops/src/lifeops/google-oauth.js +2 -2
  172. package/apps/app-lifeops/src/lifeops/owner-profile.d.ts.map +1 -1
  173. package/apps/app-lifeops/src/lifeops/owner-profile.js +1 -1
  174. package/apps/app-lifeops/src/lifeops/paypal-managed-client.d.ts.map +1 -1
  175. package/apps/app-lifeops/src/lifeops/paypal-managed-client.js +4 -5
  176. package/apps/app-lifeops/src/lifeops/plaid-managed-client.d.ts.map +1 -1
  177. package/apps/app-lifeops/src/lifeops/plaid-managed-client.js +4 -5
  178. package/apps/app-lifeops/src/lifeops/schedule-sync-client.js +2 -2
  179. package/apps/app-lifeops/src/lifeops/service-constants.d.ts +1 -0
  180. package/apps/app-lifeops/src/lifeops/service-constants.d.ts.map +1 -1
  181. package/apps/app-lifeops/src/lifeops/service-constants.js +1 -0
  182. package/apps/app-lifeops/src/lifeops/service-mixin-core.d.ts +1 -1
  183. package/apps/app-lifeops/src/lifeops/service-mixin-core.d.ts.map +1 -1
  184. package/apps/app-lifeops/src/lifeops/service-mixin-core.js +2 -1
  185. package/apps/app-lifeops/src/lifeops/service-mixin-imessage.js +1 -1
  186. package/apps/app-lifeops/src/lifeops/service-mixin-inbox.d.ts +3 -1
  187. package/apps/app-lifeops/src/lifeops/service-mixin-inbox.d.ts.map +1 -1
  188. package/apps/app-lifeops/src/lifeops/service-mixin-inbox.js +42 -13
  189. package/apps/app-lifeops/src/lifeops/service-mixin-reminders.d.ts.map +1 -1
  190. package/apps/app-lifeops/src/lifeops/service-mixin-reminders.js +3 -2
  191. package/apps/app-lifeops/src/lifeops/service-mixin-workflows.d.ts.map +1 -1
  192. package/apps/app-lifeops/src/lifeops/service-mixin-workflows.js +1 -1
  193. package/apps/app-lifeops/src/lifeops/service-normalize-calendar.d.ts.map +1 -1
  194. package/apps/app-lifeops/src/lifeops/service-normalize-calendar.js +3 -3
  195. package/apps/app-lifeops/src/lifeops/service-normalize-connector.d.ts +1 -1
  196. package/apps/app-lifeops/src/lifeops/service-normalize-connector.d.ts.map +1 -1
  197. package/apps/app-lifeops/src/lifeops/service-normalize-connector.js +2 -2
  198. package/apps/app-lifeops/src/lifeops/signal-auth.d.ts.map +1 -1
  199. package/apps/app-lifeops/src/lifeops/signal-auth.js +6 -3
  200. package/apps/app-lifeops/src/lifeops/telegram-auth.js +1 -1
  201. package/apps/app-lifeops/src/lifeops/travel-adapters/duffel.d.ts.map +1 -1
  202. package/apps/app-lifeops/src/lifeops/travel-adapters/duffel.js +31 -6
  203. package/apps/app-lifeops/src/lifeops/twilio.js +1 -1
  204. package/apps/app-lifeops/src/lifeops/x-poster.d.ts.map +1 -1
  205. package/apps/app-lifeops/src/lifeops/x-poster.js +13 -3
  206. package/apps/app-lifeops/src/lifeops-route.d.ts +74 -0
  207. package/apps/app-lifeops/src/lifeops-route.d.ts.map +1 -0
  208. package/apps/app-lifeops/src/lifeops-route.js +204 -0
  209. package/apps/app-lifeops/src/platform/lifeops-github.d.ts +15 -0
  210. package/apps/app-lifeops/src/platform/lifeops-github.d.ts.map +1 -0
  211. package/apps/app-lifeops/src/platform/lifeops-github.js +135 -0
  212. package/apps/app-lifeops/src/routes/cloud-features-routes.d.ts +2 -2
  213. package/apps/app-lifeops/src/routes/cloud-features-routes.d.ts.map +1 -1
  214. package/apps/app-lifeops/src/routes/cloud-features-routes.js +5 -3
  215. package/apps/app-lifeops/src/routes/lifeops-routes.d.ts.map +1 -1
  216. package/apps/app-lifeops/src/routes/lifeops-routes.js +15 -3
  217. package/apps/app-lifeops/src/routes/plugin.d.ts.map +1 -1
  218. package/apps/app-lifeops/src/routes/plugin.js +10 -1
  219. package/apps/app-lifeops/src/routes/travel-provider-relay-routes.d.ts +1 -1
  220. package/apps/app-lifeops/src/routes/travel-provider-relay-routes.d.ts.map +1 -1
  221. package/apps/app-lifeops/src/routes/travel-provider-relay-routes.js +4 -2
  222. package/apps/app-lifeops/src/routes/website-blocker-routes.d.ts +1 -1
  223. package/apps/app-lifeops/src/routes/website-blocker-routes.d.ts.map +1 -1
  224. package/apps/app-lifeops/src/ui.d.ts +11 -0
  225. package/apps/app-lifeops/src/ui.d.ts.map +1 -0
  226. package/apps/app-lifeops/src/ui.js +9 -0
  227. package/apps/app-lifeops/src/utils/lifeops-url.d.ts +5 -0
  228. package/apps/app-lifeops/src/utils/lifeops-url.d.ts.map +1 -0
  229. package/apps/app-lifeops/src/utils/lifeops-url.js +35 -0
  230. package/apps/app-lifeops/src/website-blocker/access.d.ts.map +1 -1
  231. package/apps/app-lifeops/src/website-blocker/access.js +1 -1
  232. package/apps/app-steward/src/routes/steward-compat-routes.d.ts +1 -1
  233. package/apps/app-steward/src/routes/steward-compat-routes.d.ts.map +1 -1
  234. package/apps/app-steward/src/routes/steward-compat-routes.js +3 -1
  235. package/apps/app-steward/src/routes/wallet-browser-compat-routes.d.ts +1 -1
  236. package/apps/app-steward/src/routes/wallet-browser-compat-routes.d.ts.map +1 -1
  237. package/apps/app-steward/src/routes/wallet-browser-compat-routes.js +3 -1
  238. package/apps/app-steward/src/routes/wallet-bsc-core-routes.d.ts.map +1 -1
  239. package/apps/app-steward/src/routes/wallet-bsc-core-routes.js +2 -1
  240. package/apps/app-steward/src/routes/wallet-compat-routes.d.ts +1 -1
  241. package/apps/app-steward/src/routes/wallet-compat-routes.d.ts.map +1 -1
  242. package/apps/app-steward/src/routes/wallet-compat-routes.js +3 -1
  243. package/apps/app-steward/src/routes/wallet-core-routes.d.ts.map +1 -1
  244. package/apps/app-steward/src/routes/wallet-core-routes.js +2 -1
  245. package/apps/app-steward/src/routes/wallet-trade-compat-routes.d.ts +1 -1
  246. package/apps/app-steward/src/routes/wallet-trade-compat-routes.d.ts.map +1 -1
  247. package/apps/app-steward/src/routes/wallet-trade-compat-routes.js +3 -1
  248. package/apps/app-training/src/core/dataset-generator.d.ts +1 -1
  249. package/apps/app-training/src/core/dataset-generator.d.ts.map +1 -1
  250. package/apps/app-training/src/core/roleplay-executor.d.ts +1 -1
  251. package/apps/app-training/src/core/roleplay-executor.d.ts.map +1 -1
  252. package/apps/app-training/src/core/trajectory-task-datasets.d.ts +1 -1
  253. package/apps/app-training/src/core/trajectory-task-datasets.d.ts.map +1 -1
  254. package/apps/app-training/src/index.d.ts +1 -2
  255. package/apps/app-training/src/index.d.ts.map +1 -1
  256. package/apps/app-training/src/index.js +1 -2
  257. package/apps/app-training/src/routes/training-routes.d.ts +1 -1
  258. package/apps/app-training/src/routes/training-routes.d.ts.map +1 -1
  259. package/apps/app-training/src/routes/training-routes.js +1 -1
  260. package/apps/app-training/src/routes/trajectory-routes.d.ts +1 -1
  261. package/apps/app-training/src/routes/trajectory-routes.d.ts.map +1 -1
  262. package/apps/app-training/src/routes/trajectory-routes.js +3 -1
  263. package/apps/app-training/src/services/training-service-like.d.ts +1 -1
  264. package/apps/app-training/src/services/training-service-like.d.ts.map +1 -1
  265. package/apps/app-training/src/services/training-service.d.ts +1 -1
  266. package/apps/app-training/src/services/training-service.d.ts.map +1 -1
  267. package/package.json +1 -1
  268. package/packages/agent/src/api/provider-switch-config.js +1 -1
  269. package/packages/agent/src/api/server-helpers-auth.d.ts.map +1 -1
  270. package/packages/agent/src/api/server-helpers-auth.js +5 -4
  271. package/packages/agent/src/providers/media-provider.d.ts +1 -1
  272. package/packages/agent/src/providers/media-provider.d.ts.map +1 -1
  273. package/packages/app-core/src/App.d.ts.map +1 -1
  274. package/packages/app-core/src/App.js +20 -12
  275. package/packages/app-core/src/api/auth.d.ts.map +1 -1
  276. package/packages/app-core/src/api/auth.js +5 -5
  277. package/packages/app-core/src/api/client-types-experience.d.ts +7 -0
  278. package/packages/app-core/src/api/client-types-experience.d.ts.map +1 -1
  279. package/packages/app-core/src/components/apps/helpers.d.ts +1 -1
  280. package/packages/app-core/src/components/apps/helpers.d.ts.map +1 -1
  281. package/packages/app-core/src/components/apps/helpers.js +1 -0
  282. package/packages/app-core/src/components/apps/internal-tool-apps.d.ts +11 -0
  283. package/packages/app-core/src/components/apps/internal-tool-apps.d.ts.map +1 -1
  284. package/packages/app-core/src/components/apps/internal-tool-apps.js +31 -0
  285. package/packages/app-core/src/components/apps/launch-history.d.ts +16 -0
  286. package/packages/app-core/src/components/apps/launch-history.d.ts.map +1 -0
  287. package/packages/app-core/src/components/apps/launch-history.js +77 -0
  288. package/packages/app-core/src/components/apps/per-app-config.d.ts +19 -0
  289. package/packages/app-core/src/components/apps/per-app-config.d.ts.map +1 -0
  290. package/packages/app-core/src/components/apps/per-app-config.js +99 -0
  291. package/packages/app-core/src/components/apps/useRegistryCatalog.d.ts +14 -0
  292. package/packages/app-core/src/components/apps/useRegistryCatalog.d.ts.map +1 -0
  293. package/packages/app-core/src/components/apps/useRegistryCatalog.js +52 -0
  294. package/packages/app-core/src/components/auth/LoginView.d.ts +1 -19
  295. package/packages/app-core/src/components/auth/LoginView.d.ts.map +1 -1
  296. package/packages/app-core/src/components/auth/LoginView.js +4 -99
  297. package/packages/app-core/src/components/character/CharacterExperienceWorkspace.d.ts.map +1 -1
  298. package/packages/app-core/src/components/character/CharacterExperienceWorkspace.js +14 -2
  299. package/packages/app-core/src/components/character/character-hub-helpers.d.ts.map +1 -1
  300. package/packages/app-core/src/components/character/character-hub-helpers.js +7 -0
  301. package/packages/app-core/src/components/character/character-hub-types.d.ts +7 -0
  302. package/packages/app-core/src/components/character/character-hub-types.d.ts.map +1 -1
  303. package/packages/app-core/src/components/onboarding/BootstrapStep.d.ts.map +1 -1
  304. package/packages/app-core/src/components/onboarding/BootstrapStep.js +3 -2
  305. package/packages/app-core/src/components/pages/AppDetailsView.d.ts +36 -0
  306. package/packages/app-core/src/components/pages/AppDetailsView.d.ts.map +1 -0
  307. package/packages/app-core/src/components/pages/AppDetailsView.js +289 -0
  308. package/packages/app-core/src/components/pages/AppsView.d.ts.map +1 -1
  309. package/packages/app-core/src/components/pages/AppsView.js +134 -42
  310. package/packages/app-core/src/components/shell/StartupShell.d.ts.map +1 -1
  311. package/packages/app-core/src/components/shell/StartupShell.js +2 -5
  312. package/packages/app-core/src/i18n/locales/en.json +256 -205
  313. package/packages/app-core/src/i18n/locales/es.json +256 -205
  314. package/packages/app-core/src/i18n/locales/ko.json +256 -205
  315. package/packages/app-core/src/i18n/locales/pt.json +256 -205
  316. package/packages/app-core/src/i18n/locales/tl.json +256 -205
  317. package/packages/app-core/src/i18n/locales/vi.json +256 -205
  318. package/packages/app-core/src/i18n/locales/zh-CN.json +256 -205
  319. package/packages/app-core/src/navigation/index.d.ts.map +1 -1
  320. package/packages/app-core/src/navigation/index.js +6 -0
  321. package/packages/app-core/src/shell/AppWindowRenderer.d.ts +17 -0
  322. package/packages/app-core/src/shell/AppWindowRenderer.d.ts.map +1 -0
  323. package/packages/app-core/src/shell/AppWindowRenderer.js +337 -0
  324. package/packages/app-core/src/shell/DetachedShellRoot.js +4 -1
  325. package/packages/app-core/src/shell/index.d.ts +1 -0
  326. package/packages/app-core/src/shell/index.d.ts.map +1 -1
  327. package/packages/app-core/src/shell/index.js +1 -0
  328. package/packages/app-core/src/state/startup-coordinator.d.ts.map +1 -1
  329. package/packages/app-core/src/state/startup-coordinator.js +0 -3
  330. package/packages/app-core/src/state/startup-phase-poll.d.ts.map +1 -1
  331. package/packages/app-core/src/state/startup-phase-poll.js +2 -4
  332. package/packages/app-core/src/state/usePluginsSkillsState.d.ts +6 -6
  333. package/packages/native-plugins/mobile-signals/src/definitions.d.ts +162 -0
  334. package/packages/native-plugins/mobile-signals/src/definitions.d.ts.map +1 -0
  335. package/packages/native-plugins/mobile-signals/src/definitions.js +1 -0
  336. package/packages/native-plugins/mobile-signals/src/index.d.ts +4 -0
  337. package/packages/native-plugins/mobile-signals/src/index.d.ts.map +1 -0
  338. package/packages/native-plugins/mobile-signals/src/index.js +6 -0
  339. package/packages/native-plugins/mobile-signals/src/web.d.ts +29 -0
  340. package/packages/native-plugins/mobile-signals/src/web.d.ts.map +1 -0
  341. package/packages/native-plugins/mobile-signals/src/web.js +269 -0
  342. package/packages/shared/src/app-hero-art.d.ts.map +1 -1
  343. package/packages/shared/src/app-hero-art.js +13 -0
  344. package/packages/shared/src/contracts/lifeops.d.ts +10 -0
  345. package/packages/shared/src/contracts/lifeops.d.ts.map +1 -1
  346. package/packages/shared/src/contracts/lifeops.js +5 -0
  347. package/packages/typescript/src/features/advanced-capabilities/experience/actions/record-experience.d.ts.map +1 -1
  348. package/packages/typescript/src/features/advanced-capabilities/experience/actions/record-experience.js +46 -4
  349. package/packages/typescript/src/features/advanced-capabilities/experience/evaluators/experienceEvaluator.d.ts.map +1 -1
  350. package/packages/typescript/src/features/advanced-capabilities/experience/evaluators/experienceEvaluator.js +34 -124
  351. package/packages/typescript/src/features/advanced-capabilities/experience/service.d.ts.map +1 -1
  352. package/packages/typescript/src/features/advanced-capabilities/experience/service.js +56 -0
  353. package/packages/typescript/src/features/advanced-capabilities/experience/types.d.ts +7 -0
  354. package/packages/typescript/src/features/advanced-capabilities/experience/types.d.ts.map +1 -1
  355. package/packages/typescript/src/features/advanced-capabilities/experience/utils/experienceText.d.ts +7 -0
  356. package/packages/typescript/src/features/advanced-capabilities/experience/utils/experienceText.d.ts.map +1 -0
  357. package/packages/typescript/src/features/advanced-capabilities/experience/utils/experienceText.js +123 -0
  358. package/apps/app-training/src/ui/FineTuningView.d.ts +0 -5
  359. package/apps/app-training/src/ui/FineTuningView.d.ts.map +0 -1
  360. package/apps/app-training/src/ui/FineTuningView.js +0 -388
  361. package/apps/app-training/src/ui/fine-tuning-panels.d.ts +0 -111
  362. package/apps/app-training/src/ui/fine-tuning-panels.d.ts.map +0 -1
  363. package/apps/app-training/src/ui/fine-tuning-panels.js +0 -130
  364. package/apps/app-training/src/ui/index.d.ts +0 -3
  365. package/apps/app-training/src/ui/index.d.ts.map +0 -1
  366. package/apps/app-training/src/ui/index.js +0 -2
  367. package/packages/app-core/src/api/trusted-local-request.d.ts +0 -4
  368. package/packages/app-core/src/api/trusted-local-request.d.ts.map +0 -1
  369. package/packages/app-core/src/api/trusted-local-request.js +0 -176
@@ -0,0 +1,289 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * AppDetailsView — config + diagnostics + widgets + Launch button page
4
+ * for apps that need it (those with `hasDetailsPage: true` in their
5
+ * descriptor, or any registry/catalog app with launch params).
6
+ *
7
+ * Mounted by AppsView when the apps sub-path is `/apps/<slug>/details`.
8
+ */
9
+ import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
10
+ import { Pin, PinOff, Settings as SettingsIcon, TriangleAlert, } from "lucide-react";
11
+ import { useRegistryCatalog } from "../apps/useRegistryCatalog";
12
+ import { invokeDesktopBridgeRequest } from "../../bridge";
13
+ import { useApp } from "../../state/useApp";
14
+ import { findAppBySlug, getAppSlug } from "../apps/helpers";
15
+ import { getInternalToolAppDescriptors, getInternalToolAppHasDetailsPage, getInternalToolAppTargetTab, getInternalToolApps, isInternalToolApp, } from "../apps/internal-tool-apps";
16
+ import { getAllOverlayApps, isOverlayApp, overlayAppToRegistryInfo, } from "../apps/overlay-app-registry";
17
+ import { loadPerAppConfig, savePerAppConfig, subscribePerAppConfig, } from "../apps/per-app-config";
18
+ import { getLaunchHistoryForApp, recordLaunchAttempt, } from "../apps/launch-history";
19
+ import { isWidgetVisible, loadChatSidebarVisibility, saveChatSidebarVisibility, widgetVisibilityKey, } from "../../widgets/visibility";
20
+ import { getWidgetComponent } from "../../widgets/registry";
21
+ function pluginIdFromName(name) {
22
+ return name.replace(/^@elizaos\/app-/, "");
23
+ }
24
+ function resolveAppFromSlug(slug, catalog) {
25
+ // Internal tool by slug
26
+ const internal = getInternalToolAppDescriptors().find((d) => d.windowPath === `/apps/${slug}`);
27
+ if (internal) {
28
+ const info = getInternalToolApps().find((a) => a.name === internal.name);
29
+ if (info) {
30
+ return {
31
+ source: "internal-tool",
32
+ info,
33
+ pluginId: pluginIdFromName(internal.name),
34
+ windowPath: internal.windowPath ?? `/apps/${slug}`,
35
+ };
36
+ }
37
+ }
38
+ // Overlay app by slug
39
+ const overlay = getAllOverlayApps().find((a) => getAppSlug(a.name) === slug && isOverlayApp(a.name));
40
+ if (overlay) {
41
+ return {
42
+ source: "overlay",
43
+ info: overlayAppToRegistryInfo(overlay),
44
+ pluginId: pluginIdFromName(overlay.name),
45
+ windowPath: `/apps/${slug}`,
46
+ };
47
+ }
48
+ // Catalog/registry app by slug
49
+ const catalogHit = findAppBySlug(catalog, slug);
50
+ if (catalogHit) {
51
+ return {
52
+ source: "catalog",
53
+ info: catalogHit,
54
+ pluginId: pluginIdFromName(catalogHit.name),
55
+ windowPath: `/apps/${slug}`,
56
+ };
57
+ }
58
+ return null;
59
+ }
60
+ function sourceLabel(source) {
61
+ switch (source) {
62
+ case "internal-tool":
63
+ return "Internal Tool";
64
+ case "overlay":
65
+ return "Overlay App";
66
+ case "catalog":
67
+ return "Catalog App";
68
+ default:
69
+ return "Unknown";
70
+ }
71
+ }
72
+ function formatTimestamp(value) {
73
+ try {
74
+ return new Date(value).toLocaleString();
75
+ }
76
+ catch {
77
+ return String(value);
78
+ }
79
+ }
80
+ function SectionHeader({ children }) {
81
+ return (_jsx("h3", { className: "text-xs-tight font-semibold uppercase tracking-[0.18em] text-accent", children: children }));
82
+ }
83
+ function ChipList({ items }) {
84
+ if (items.length === 0) {
85
+ return _jsx("span", { className: "text-xs text-muted", children: "None declared" });
86
+ }
87
+ return (_jsx("div", { className: "flex flex-wrap gap-1.5", children: items.map((item) => (_jsx("span", { className: "rounded-full border border-border/60 bg-card/50 px-2 py-0.5 text-xs text-muted", children: item }, item))) }));
88
+ }
89
+ function WidgetPreview({ declaration, pluginId, }) {
90
+ const Component = useMemo(() => getWidgetComponent(pluginId, declaration.id), [declaration.id, pluginId]);
91
+ if (!Component) {
92
+ return (_jsx("div", { className: "rounded-md border border-border/40 bg-card/30 px-3 py-2 text-xs text-muted", children: "No bundled component for this widget \u2014 preview unavailable." }));
93
+ }
94
+ return (_jsx("div", { className: "rounded-md border border-border/40 bg-card/30 p-3", children: _jsx(Component, { pluginId: pluginId, events: [], clearEvents: () => { } }) }));
95
+ }
96
+ export function AppDetailsView({ slug, onLaunched, }) {
97
+ const { plugins, appRuns, t, setTab, setState, setActionNotice } = useApp();
98
+ // Catalog of registry apps for slug → app resolution.
99
+ const { catalog: registryCatalog, error: catalogError } = useRegistryCatalog();
100
+ const catalog = registryCatalog ?? [];
101
+ const resolved = useMemo(() => resolveAppFromSlug(slug, catalog), [catalog, slug]);
102
+ // Per-app config (launch mode, alwaysOnTop, free-form settings).
103
+ const [config, setConfig] = useState(() => loadPerAppConfig(slug));
104
+ useEffect(() => {
105
+ setConfig(loadPerAppConfig(slug));
106
+ return subscribePerAppConfig(slug, setConfig);
107
+ }, [slug]);
108
+ const updateConfig = useCallback((next) => {
109
+ const merged = {
110
+ launchMode: next.launchMode ?? config.launchMode,
111
+ alwaysOnTop: next.alwaysOnTop !== undefined ? next.alwaysOnTop : config.alwaysOnTop,
112
+ settings: next.settings ?? config.settings,
113
+ };
114
+ setConfig(merged);
115
+ savePerAppConfig(slug, merged);
116
+ }, [config, slug]);
117
+ // Widget visibility — re-uses the existing chat-sidebar visibility store.
118
+ const [visibility, setVisibility] = useState(() => loadChatSidebarVisibility());
119
+ const toggleWidget = useCallback((decl, enabled) => {
120
+ const key = widgetVisibilityKey(decl.pluginId, decl.id);
121
+ const nextOverrides = { ...visibility.overrides, [key]: enabled };
122
+ const next = { overrides: nextOverrides };
123
+ setVisibility(next);
124
+ saveChatSidebarVisibility(next);
125
+ }, [visibility]);
126
+ // Widgets owned by this app's plugin. Server-declared widgets carry
127
+ // `slot: string`; narrow to the WidgetSlot literal union here so the
128
+ // rest of the component can rely on it.
129
+ const widgets = useMemo(() => {
130
+ if (!resolved)
131
+ return [];
132
+ const ownPlugin = plugins?.find((p) => p.id === resolved.pluginId);
133
+ const raw = ownPlugin?.widgets ?? [];
134
+ return raw.map((decl) => ({
135
+ ...decl,
136
+ slot: decl.slot,
137
+ }));
138
+ }, [plugins, resolved]);
139
+ const [expandedWidget, setExpandedWidget] = useState(null);
140
+ // Launch history for diagnostics.
141
+ const [history, setHistory] = useState([]);
142
+ useEffect(() => {
143
+ if (resolved)
144
+ setHistory(getLaunchHistoryForApp(resolved.info.name));
145
+ }, [resolved]);
146
+ // Recent runs (live).
147
+ const recentRuns = useMemo(() => {
148
+ if (!resolved || !appRuns)
149
+ return [];
150
+ return appRuns.filter((r) => r.appName === resolved.info.name).slice(0, 5);
151
+ }, [appRuns, resolved]);
152
+ // Launch action.
153
+ const [launching, setLaunching] = useState(false);
154
+ const launchedRef = useRef(false);
155
+ const handleLaunch = useCallback(async () => {
156
+ if (!resolved || launching)
157
+ return;
158
+ setLaunching(true);
159
+ launchedRef.current = false;
160
+ try {
161
+ if (config.launchMode === "inline") {
162
+ // Inline: for internal tools, switch the main shell tab; for
163
+ // overlays, set activeOverlayApp; otherwise fall back to window.
164
+ if (resolved.source === "internal-tool") {
165
+ const tab = getInternalToolAppTargetTab(resolved.info.name);
166
+ if (tab) {
167
+ setTab(tab);
168
+ launchedRef.current = true;
169
+ recordLaunchAttempt({
170
+ appName: resolved.info.name,
171
+ timestamp: Date.now(),
172
+ succeeded: true,
173
+ diagnostics: [],
174
+ });
175
+ setHistory(getLaunchHistoryForApp(resolved.info.name));
176
+ onLaunched?.({ mode: "inline", slug });
177
+ return;
178
+ }
179
+ }
180
+ if (resolved.source === "overlay") {
181
+ setState("activeOverlayApp", resolved.info.name);
182
+ launchedRef.current = true;
183
+ recordLaunchAttempt({
184
+ appName: resolved.info.name,
185
+ timestamp: Date.now(),
186
+ succeeded: true,
187
+ diagnostics: [],
188
+ });
189
+ setHistory(getLaunchHistoryForApp(resolved.info.name));
190
+ onLaunched?.({ mode: "inline", slug });
191
+ return;
192
+ }
193
+ // Fall through to window mode — inline not supported for this app.
194
+ }
195
+ // Window mode (default).
196
+ const created = await invokeDesktopBridgeRequest({
197
+ rpcMethod: "desktopOpenAppWindow",
198
+ ipcChannel: "desktop:openAppWindow",
199
+ params: {
200
+ slug,
201
+ title: resolved.info.displayName ?? resolved.info.name,
202
+ path: resolved.windowPath,
203
+ alwaysOnTop: config.alwaysOnTop,
204
+ },
205
+ });
206
+ if (!created?.id) {
207
+ throw new Error("Desktop bridge declined to open the window.");
208
+ }
209
+ launchedRef.current = true;
210
+ recordLaunchAttempt({
211
+ appName: resolved.info.name,
212
+ timestamp: Date.now(),
213
+ succeeded: true,
214
+ diagnostics: [],
215
+ });
216
+ setHistory(getLaunchHistoryForApp(resolved.info.name));
217
+ onLaunched?.({ mode: "window", slug });
218
+ }
219
+ catch (err) {
220
+ const message = err instanceof Error ? err.message : String(err);
221
+ recordLaunchAttempt({
222
+ appName: resolved.info.name,
223
+ timestamp: Date.now(),
224
+ succeeded: false,
225
+ diagnostics: [],
226
+ errorMessage: message,
227
+ });
228
+ setHistory(getLaunchHistoryForApp(resolved.info.name));
229
+ setActionNotice(t("appdetails.LaunchFailed", {
230
+ defaultValue: `Could not launch ${resolved.info.displayName}: ${message}`,
231
+ }), "error", 4000);
232
+ }
233
+ finally {
234
+ setLaunching(false);
235
+ }
236
+ }, [
237
+ config.alwaysOnTop,
238
+ config.launchMode,
239
+ launching,
240
+ onLaunched,
241
+ resolved,
242
+ setActionNotice,
243
+ setState,
244
+ setTab,
245
+ slug,
246
+ t,
247
+ ]);
248
+ if (catalogError && !resolved) {
249
+ return (_jsxs("div", { className: "flex h-full min-h-0 w-full flex-col items-center justify-center gap-2 p-6 text-center text-sm text-muted", children: [_jsx(TriangleAlert, { className: "h-5 w-5 text-accent" }), _jsx("span", { children: catalogError })] }));
250
+ }
251
+ if (!resolved) {
252
+ return (_jsxs("div", { className: "flex h-full min-h-0 w-full items-center justify-center text-sm text-muted", children: ["Loading ", slug, "\u2026"] }));
253
+ }
254
+ const isInternal = resolved.source === "internal-tool";
255
+ const supportsInlineMode = isInternal || resolved.source === "overlay";
256
+ return (_jsxs("div", { className: "device-layout mx-auto flex w-full max-w-4xl flex-col gap-6 px-4 py-6 lg:px-6", children: [_jsxs("header", { className: "flex flex-col gap-3 border-b border-border/35 pb-5 sm:flex-row sm:items-center sm:justify-between", children: [_jsxs("div", { className: "flex items-center gap-4", children: [resolved.info.heroImage ? (_jsx("img", { src: resolved.info.heroImage, alt: "", className: "h-14 w-14 rounded-lg border border-border/40 object-cover" })) : (_jsx("div", { className: "flex h-14 w-14 items-center justify-center rounded-lg border border-border/40 bg-card/40 text-xs uppercase text-muted", children: (resolved.info.displayName ?? resolved.info.name)
257
+ .slice(0, 2)
258
+ .toUpperCase() })), _jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "truncate text-base font-semibold text-foreground", children: resolved.info.displayName ?? resolved.info.name }), _jsx("p", { className: "truncate text-xs text-muted", children: resolved.info.name }), _jsxs("div", { className: "mt-1 flex flex-wrap items-center gap-2 text-[10px] uppercase tracking-[0.16em] text-muted", children: [_jsx("span", { children: sourceLabel(resolved.source) }), recentRuns.length > 0 ? (_jsxs("span", { className: "rounded-full bg-accent/15 px-2 py-0.5 text-accent", children: [recentRuns.length, " running"] })) : null] })] })] }), _jsx("button", { type: "button", onClick: handleLaunch, disabled: launching, className: "rounded-full bg-accent px-5 py-2 text-xs font-semibold uppercase tracking-[0.16em] text-accent-foreground transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-60", children: launching
259
+ ? "Launching…"
260
+ : `Launch ${resolved.info.displayName ?? "App"}` })] }), _jsxs("section", { className: "flex flex-col gap-3", children: [_jsx(SectionHeader, { children: "About" }), resolved.info.description ? (_jsx("p", { className: "text-sm text-muted", children: resolved.info.description })) : null, _jsx(ChipList, { items: resolved.info.capabilities ?? [] })] }), recentRuns.length > 0 ? (_jsxs("section", { className: "flex flex-col gap-2", children: [_jsx(SectionHeader, { children: "Recent Runs" }), _jsx("ul", { className: "flex flex-col gap-1 text-xs text-muted", children: recentRuns.map((run) => (_jsxs("li", { className: "flex items-center justify-between rounded-md border border-border/40 bg-card/30 px-3 py-1.5", children: [_jsx("span", { className: "truncate", children: run.runId }), _jsx("span", { className: "ml-2 shrink-0 uppercase tracking-[0.14em]", children: run.status })] }, run.runId))) })] })) : null, _jsxs("section", { className: "flex flex-col gap-2", children: [_jsx(SectionHeader, { children: "Launch Diagnostics" }), history.length === 0 ? (_jsx("p", { className: "text-xs text-muted", children: "No launch history yet." })) : (_jsx("ul", { className: "flex flex-col gap-1 text-xs", children: history.slice(0, 5).map((entry) => (_jsxs("li", { className: "rounded-md border border-border/40 bg-card/30 px-3 py-1.5", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted", children: formatTimestamp(entry.timestamp) }), _jsx("span", { className: entry.succeeded
261
+ ? "text-accent"
262
+ : "text-destructive", children: entry.succeeded ? "OK" : "FAILED" })] }), entry.errorMessage ? (_jsx("p", { className: "mt-1 text-muted", children: entry.errorMessage })) : null] }, entry.timestamp))) }))] }), widgets.length > 0 ? (_jsxs("section", { className: "flex flex-col gap-2", children: [_jsx(SectionHeader, { children: "Widgets" }), _jsx("ul", { className: "flex flex-col gap-2", children: widgets.map((decl) => {
263
+ const visible = isWidgetVisible(decl, visibility.overrides);
264
+ const widgetKey = widgetVisibilityKey(decl.pluginId, decl.id);
265
+ const expanded = expandedWidget === widgetKey;
266
+ return (_jsxs("li", { className: "rounded-md border border-border/40 bg-card/30", children: [_jsxs("div", { className: "flex items-center justify-between gap-3 px-3 py-2", children: [_jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "truncate text-sm font-medium text-foreground", children: decl.label }), _jsx("div", { className: "truncate text-[10px] uppercase tracking-[0.14em] text-muted", children: decl.slot })] }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [_jsx("button", { type: "button", onClick: () => setExpandedWidget(expanded ? null : widgetKey), className: "rounded-full border border-border/60 px-2 py-0.5 text-[10px] uppercase tracking-[0.14em] text-muted transition-colors hover:text-foreground", children: expanded ? "Hide" : "Preview" }), _jsxs("label", { className: "inline-flex cursor-pointer items-center gap-1.5 text-xs", children: [_jsx("input", { type: "checkbox", checked: visible, onChange: (event) => toggleWidget(decl, event.currentTarget.checked), className: "h-3.5 w-3.5 accent-accent" }), _jsx("span", { className: "text-muted", children: "Show" })] })] })] }), expanded ? (_jsx("div", { className: "border-t border-border/40 p-3", children: _jsx(WidgetPreview, { declaration: decl, pluginId: resolved.pluginId }) })) : null] }, widgetKey));
267
+ }) })] })) : null, _jsxs("section", { className: "flex flex-col gap-3", children: [_jsx(SectionHeader, { children: "Config" }), _jsxs("fieldset", { className: "flex flex-col gap-2 rounded-md border border-border/40 bg-card/30 p-3", children: [_jsxs("legend", { className: "px-1 text-xs uppercase tracking-[0.14em] text-muted", children: [_jsx(SettingsIcon, { className: "mr-1 inline h-3 w-3" }), " Launch Mode"] }), _jsxs("label", { className: "flex cursor-pointer items-center gap-2 text-sm", children: [_jsx("input", { type: "radio", checked: config.launchMode === "window", onChange: () => updateConfig({ launchMode: "window" }), className: "h-3.5 w-3.5 accent-accent" }), _jsx("span", { children: "Open in dedicated window" })] }), _jsxs("label", { className: `flex items-center gap-2 text-sm ${supportsInlineMode
268
+ ? "cursor-pointer"
269
+ : "cursor-not-allowed opacity-50"}`, children: [_jsx("input", { type: "radio", checked: config.launchMode === "inline", disabled: !supportsInlineMode, onChange: () => updateConfig({ launchMode: "inline" }), className: "h-3.5 w-3.5 accent-accent" }), _jsxs("span", { children: ["Replace current view in main window", !supportsInlineMode ? " (not supported for this app)" : ""] })] })] }), _jsxs("label", { className: `inline-flex items-center gap-2 self-start rounded-full border border-border/60 bg-card/40 px-3 py-1.5 text-xs ${config.launchMode === "window"
270
+ ? "cursor-pointer"
271
+ : "cursor-not-allowed opacity-50"}`, children: [_jsx("input", { type: "checkbox", checked: config.alwaysOnTop, disabled: config.launchMode !== "window", onChange: (event) => updateConfig({ alwaysOnTop: event.currentTarget.checked }), className: "h-3.5 w-3.5 accent-accent" }), config.alwaysOnTop ? (_jsx(Pin, { className: "h-3.5 w-3.5", "aria-hidden": "true" })) : (_jsx(PinOff, { className: "h-3.5 w-3.5", "aria-hidden": "true" })), _jsx("span", { children: "Keep this app's window on top" })] })] })] }));
272
+ }
273
+ /**
274
+ * Convenience: does this slug resolve to an app that wants the details
275
+ * page? Used by AppsView.handleLaunch to decide whether to navigate to
276
+ * /apps/<slug>/details or call openAppRouteWindow directly.
277
+ *
278
+ * Only apps that explicitly declare `hasDetailsPage: true` (today: a
279
+ * handful of internal tools with real config / runtime knobs) route
280
+ * through the details page. Catalog and overlay apps launch directly —
281
+ * launching is the primary action; the user only needs the extra step
282
+ * when there's config worth touching first.
283
+ */
284
+ export function appNeedsDetailsPage(name) {
285
+ if (isInternalToolApp(name)) {
286
+ return getInternalToolAppHasDetailsPage(name);
287
+ }
288
+ return false;
289
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"AppsView.d.ts","sourceRoot":"","sources":["../../../../../../../app-core/src/components/pages/AppsView.tsx"],"names":[],"mappings":"AAyCA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AA4J1D,wBAAgB,QAAQ,4CAo/BvB"}
1
+ {"version":3,"file":"AppsView.d.ts","sourceRoot":"","sources":["../../../../../../../app-core/src/components/pages/AppsView.tsx"],"names":[],"mappings":"AA0CA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAoJ1D,wBAAgB,QAAQ,4CAolCvB"}
@@ -1,4 +1,4 @@
1
- import { jsx as _jsx, 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 { PageLayout } from "@elizaos/ui";
3
3
  import { Pin, PinOff } from "lucide-react";
4
4
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
@@ -10,10 +10,11 @@ import { openExternalUrl } from "../../utils";
10
10
  import { AppsCatalogGrid } from "../apps/AppsCatalogGrid";
11
11
  import { AppsSidebar } from "../apps/AppsSidebar";
12
12
  import { filterAppsForCatalog, findAppBySlug, getAppSlug, } from "../apps/helpers";
13
- import { getInternalToolApps, getInternalToolAppTargetTab, } from "../apps/internal-tool-apps";
13
+ import { getInternalToolApps, getInternalToolAppTargetTab, getInternalToolAppWindowPath, } from "../apps/internal-tool-apps";
14
14
  import { getAllOverlayApps, isOverlayApp, overlayAppToRegistryInfo, } from "../apps/overlay-app-registry";
15
15
  import { RunningAppsRow } from "../apps/RunningAppsRow";
16
16
  import { resolveEmbeddedViewerUrl, shouldUseEmbeddedAppViewer, } from "../apps/viewer-auth";
17
+ import { AppDetailsView, appNeedsDetailsPage } from "./AppDetailsView";
17
18
  export { shouldShowAppInAppsView } from "../apps/helpers";
18
19
  /** Max items retained in launch history. */
19
20
  const RECENT_APPS_LIMIT = 10;
@@ -25,21 +26,6 @@ const APPS_SIDEBAR_MAX_WIDTH = 520;
25
26
  const APP_WINDOW_LAUNCH_ENABLED_KEY = "milady:apps:window:launch-enabled";
26
27
  const APP_WINDOW_ALWAYS_ON_TOP_KEY = "milady:apps:window:always-on-top";
27
28
  const APP_WINDOW_HEARTBEAT_MS = 15_000;
28
- function nativeSurfaceForInternalToolTab(tab) {
29
- switch (tab) {
30
- case "plugins":
31
- return "plugins";
32
- case "connectors":
33
- return "connectors";
34
- case "browser":
35
- return "browser";
36
- case "automations":
37
- case "triggers":
38
- return "triggers";
39
- default:
40
- return null;
41
- }
42
- }
43
29
  function clampWidth(value) {
44
30
  return Math.min(Math.max(value, APPS_SIDEBAR_MIN_WIDTH), APPS_SIDEBAR_MAX_WIDTH);
45
31
  }
@@ -90,6 +76,23 @@ function loadInitialAppWindowLaunchEnabled() {
90
76
  function getCurrentAppsPath() {
91
77
  return getWindowNavigationPath();
92
78
  }
79
+ /**
80
+ * Parse the current apps sub-path into `{slug, action}`. Action recognizes
81
+ * `details` for `/apps/<slug>/details`. Anything else is treated as a
82
+ * direct app surface (`action: null`).
83
+ */
84
+ function parseAppsRoute(path) {
85
+ if (!path.startsWith("/apps/"))
86
+ return { slug: null, action: null };
87
+ const after = path.slice("/apps/".length).replace(/[?#].*$/, "");
88
+ if (!after)
89
+ return { slug: null, action: null };
90
+ const [slug, sub] = after.split("/");
91
+ return {
92
+ slug: slug || null,
93
+ action: sub === "details" ? "details" : null,
94
+ };
95
+ }
93
96
  function resolveDesktopViewerUrl(viewerUrl) {
94
97
  const resolved = resolveEmbeddedViewerUrl(viewerUrl);
95
98
  if (!resolved)
@@ -140,7 +143,7 @@ export function AppsView() {
140
143
  const [sidebarCollapsed, setSidebarCollapsed] = useState(loadInitialSidebarCollapsed);
141
144
  const [sidebarWidth, setSidebarWidth] = useState(loadInitialSidebarWidth);
142
145
  const [appWindowLaunchEnabled, setAppWindowLaunchEnabled] = useState(loadInitialAppWindowLaunchEnabled);
143
- const [appWindowAlwaysOnTop, setAppWindowAlwaysOnTop] = useState(loadInitialAppWindowAlwaysOnTop);
146
+ const [appWindowAlwaysOnTop] = useState(loadInitialAppWindowAlwaysOnTop);
144
147
  const [isAppWindow] = useState(isAppWindowRoute);
145
148
  const [appWindows, setAppWindows] = useState([]);
146
149
  const [busyAppWindowId, setBusyAppWindowId] = useState(null);
@@ -165,15 +168,9 @@ export function AppsView() {
165
168
  /* ignore */
166
169
  }
167
170
  }, []);
168
- const handleAppWindowAlwaysOnTopChange = useCallback((next) => {
169
- setAppWindowAlwaysOnTop(next);
170
- try {
171
- window.localStorage.setItem(APP_WINDOW_ALWAYS_ON_TOP_KEY, String(next));
172
- }
173
- catch {
174
- /* ignore */
175
- }
176
- }, []);
171
+ // Upstream re-added handleAppWindowAlwaysOnTopChange but we removed the
172
+ // global toggle UI on this branch — keep only the launch-enabled handler
173
+ // upstream added (which still has UI in the catalog grid header).
177
174
  const handleAppWindowLaunchEnabledChange = useCallback((next) => {
178
175
  setAppWindowLaunchEnabled(next);
179
176
  try {
@@ -234,10 +231,18 @@ export function AppsView() {
234
231
  const hasActiveRun = Boolean(activeGameRun);
235
232
  const hasCurrentGame = currentGameViewerUrl.length > 0 &&
236
233
  activeGameRun?.viewerAttachment === "attached";
237
- /** Push or replace the browser URL to reflect the active app (or browse). */
238
- const pushAppsUrl = useCallback((slug) => {
234
+ /**
235
+ * Push or replace the browser URL to reflect the active app (or browse).
236
+ * `subPath` is appended after the slug so `/apps/<slug>/details` shows
237
+ * the details page instead of launching directly.
238
+ */
239
+ const pushAppsUrl = useCallback((slug, subPath) => {
239
240
  try {
240
- const path = slug ? `/apps/${slug}` : "/apps";
241
+ const path = slug
242
+ ? subPath
243
+ ? `/apps/${slug}/${subPath}`
244
+ : `/apps/${slug}`
245
+ : "/apps";
241
246
  if (shouldUseHashNavigation()) {
242
247
  window.location.hash = path;
243
248
  }
@@ -249,6 +254,50 @@ export function AppsView() {
249
254
  /* ignore — sandboxed iframe or SSR */
250
255
  }
251
256
  }, []);
257
+ // Track the current `/apps/<slug>/details` slug for the details-page
258
+ // routing. Listens to hashchange + popstate so back/forward navigation
259
+ // unmounts AppDetailsView correctly.
260
+ const [appsDetailsSlug, setAppsDetailsSlug] = useState(() => parseAppsRoute(getCurrentAppsPath()).action === "details"
261
+ ? parseAppsRoute(getCurrentAppsPath()).slug
262
+ : null);
263
+ useEffect(() => {
264
+ const handle = () => {
265
+ const parsed = parseAppsRoute(getCurrentAppsPath());
266
+ setAppsDetailsSlug(parsed.action === "details" ? parsed.slug : null);
267
+ };
268
+ window.addEventListener("hashchange", handle);
269
+ window.addEventListener("popstate", handle);
270
+ return () => {
271
+ window.removeEventListener("hashchange", handle);
272
+ window.removeEventListener("popstate", handle);
273
+ };
274
+ }, []);
275
+ // Bun side fires this when a menu/tray click hits an app that declares
276
+ // `hasDetailsPage: true`. We switch to the apps tab and navigate the
277
+ // hash to /apps/<slug>/details so AppDetailsView mounts.
278
+ useEffect(() => {
279
+ return subscribeDesktopBridgeEvent({
280
+ rpcMessage: "desktopAppDetailsRequested",
281
+ ipcChannel: "desktop:appDetailsRequested",
282
+ listener: (payload) => {
283
+ if (!payload ||
284
+ typeof payload !== "object" ||
285
+ typeof payload.slug !== "string") {
286
+ return;
287
+ }
288
+ const slug = payload.slug;
289
+ if (!slug)
290
+ return;
291
+ setTab("apps");
292
+ setState("appsSubTab", "browse");
293
+ // Update state directly: pushAppsUrl uses replaceState in non-hash
294
+ // routing mode, which fires no event, so the hashchange/popstate
295
+ // listener wouldn't pick it up.
296
+ setAppsDetailsSlug(slug);
297
+ pushAppsUrl(slug, "details");
298
+ },
299
+ });
300
+ }, [pushAppsUrl, setState, setTab]);
252
301
  const sortedRuns = useMemo(() => [...appRuns].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt)), [appRuns]);
253
302
  const mergeRun = useCallback((run) => {
254
303
  const nextRuns = [
@@ -387,16 +436,27 @@ export function AppsView() {
387
436
  setState("recentApps", next);
388
437
  }, [recentApps, setState]);
389
438
  const openAppRouteWindow = useCallback(async (app) => {
439
+ // Upstream gate: opt-in toggle for the per-app native window
440
+ // experience (lives in the catalog grid header).
390
441
  if (!appWindowLaunchEnabled || isAppWindow || !isElectrobunRuntime()) {
391
442
  return false;
392
443
  }
393
- const nativeSurface = nativeSurfaceForInternalToolTab(getInternalToolAppTargetTab(app.name));
394
- if (nativeSurface) {
444
+ // Internal tools that have an explicit windowPath open as their own
445
+ // app window (Ghost-style). The renderer parses `appWindow=1` + the
446
+ // hash route and renders the matching tab. This supersedes upstream's
447
+ // `desktopOpenSurfaceWindow` + `nativeSurfaceForInternalToolTab` path
448
+ // (the surface-bridge approach was removed when AppWindowRenderer
449
+ // landed — see the apps-as-windows refactor).
450
+ const internalWindowPath = getInternalToolAppWindowPath(app.name);
451
+ if (internalWindowPath) {
452
+ const slug = getAppSlug(app.name);
395
453
  const created = await invokeDesktopBridgeRequest({
396
- rpcMethod: "desktopOpenSurfaceWindow",
397
- ipcChannel: "desktop:openSurfaceWindow",
454
+ rpcMethod: "desktopOpenAppWindow",
455
+ ipcChannel: "desktop:openAppWindow",
398
456
  params: {
399
- surface: nativeSurface,
457
+ slug,
458
+ title: app.displayName ?? app.name,
459
+ path: internalWindowPath,
400
460
  alwaysOnTop: appWindowAlwaysOnTop,
401
461
  },
402
462
  });
@@ -415,7 +475,7 @@ export function AppsView() {
415
475
  ]);
416
476
  pushRecentApp(app.name);
417
477
  setState("appsSubTab", "browse");
418
- pushAppsUrl(getAppSlug(app.name));
478
+ pushAppsUrl(slug);
419
479
  setActionNotice(t("appsview.OpenedInDesktopWindow", {
420
480
  defaultValue: `${app.displayName ?? app.name} opened in a desktop window.`,
421
481
  name: app.displayName ?? app.name,
@@ -427,6 +487,7 @@ export function AppsView() {
427
487
  rpcMethod: "desktopOpenAppWindow",
428
488
  ipcChannel: "desktop:openAppWindow",
429
489
  params: {
490
+ slug,
430
491
  title: app.displayName ?? app.name,
431
492
  path: `/apps/${encodeURIComponent(slug)}`,
432
493
  alwaysOnTop: appWindowAlwaysOnTop,
@@ -518,16 +579,42 @@ export function AppsView() {
518
579
  }, [appWindowAlwaysOnTop, mergeRun, pushAppsUrl, setActionNotice, setState, t]);
519
580
  const handleLaunch = useCallback(async (app) => {
520
581
  slugAutoLaunchDone.current = true;
521
- const openedRouteWindow = await openAppRouteWindow(app).catch(() => false);
522
- if (openedRouteWindow)
582
+ // Apps that declare config / runtime / widgets show a Details page
583
+ // first so the user can review settings before launching. The Launch
584
+ // button on AppDetailsView is what eventually calls the bridge or
585
+ // navigates inline. Skip when we're already inside an app window
586
+ // (the slug lives there, not in the main shell).
587
+ if (!isAppWindow && appNeedsDetailsPage(app.name)) {
588
+ const slug = getAppSlug(app.name);
589
+ pushRecentApp(app.name);
590
+ setState("appsSubTab", "browse");
591
+ pushAppsUrl(slug, "details");
523
592
  return;
593
+ }
594
+ // In Electrobun, try to open the app's dedicated native window via
595
+ // `openAppRouteWindow` — slug-deduped + per-app bounds, Ghost-style.
596
+ // The helper itself respects the user's `appWindowLaunchEnabled`
597
+ // toggle: when off it returns false, and we fall through to the
598
+ // web-style launch path (catalog → client.launchApp + iframe-attach;
599
+ // internal tool → setTab; overlay → activeOverlayApp). That gives
600
+ // the toggle a real opt-out semantics instead of bricking launches.
601
+ if (isElectrobunRuntime()) {
602
+ const openedRouteWindow = await openAppRouteWindow(app).catch(() => false);
603
+ if (openedRouteWindow)
604
+ return;
605
+ // openAppRouteWindow returned false → either the toggle is off,
606
+ // we're already inside an app window, or the bridge declined.
607
+ // Continue to the web-fallback paths below so the click isn't a
608
+ // dead-end.
609
+ }
610
+ // Web fallback: internal tools switch tabs in the shell.
524
611
  const internalToolTab = getInternalToolAppTargetTab(app.name);
525
612
  if (internalToolTab) {
526
613
  pushRecentApp(app.name);
527
614
  setTab(internalToolTab);
528
615
  return;
529
616
  }
530
- // Overlay apps (e.g. companion) are local-only launch without server round-trip
617
+ // Web fallback: overlay apps (e.g. companion) mount inside the shell.
531
618
  if (isOverlayApp(app.name)) {
532
619
  pushRecentApp(app.name);
533
620
  setState("activeOverlayApp", app.name);
@@ -611,7 +698,12 @@ export function AppsView() {
611
698
  useEffect(() => {
612
699
  if (slugAutoLaunchDone.current || apps.length === 0)
613
700
  return;
614
- const slug = getAppSlugFromPath(getCurrentAppsPath());
701
+ const parsed = parseAppsRoute(getCurrentAppsPath());
702
+ // /apps/<slug>/details is handled by the details renderer below; never
703
+ // auto-launch from it (would loop straight back to details).
704
+ if (parsed.action === "details")
705
+ return;
706
+ const slug = parsed.slug ?? getAppSlugFromPath(getCurrentAppsPath());
615
707
  slugAutoLaunchDone.current = true;
616
708
  if (!slug)
617
709
  return;
@@ -801,10 +893,10 @@ export function AppsView() {
801
893
  }
802
894
  }, [busyAppWindowId, setActionNotice, t]);
803
895
  const appsSidebar = (_jsx(AppsSidebar, { apps: apps, browseApps: browseApps, runs: sortedRuns, activeAppNames: activeAppNames, favoriteAppNames: favoriteAppNames, selectedAppName: activeGameRun?.appName ?? null, collapsed: sidebarCollapsed, onCollapsedChange: handleSidebarCollapsedChange, width: sidebarWidth, onWidthChange: handleSidebarWidthChange, minWidth: APPS_SIDEBAR_MIN_WIDTH, maxWidth: APPS_SIDEBAR_MAX_WIDTH, onLaunchApp: (app) => void handleLaunch(app), onOpenRun: (run) => void handleOpenRun(run) }));
804
- return (_jsx(PageLayout, { className: "h-full bg-transparent", "data-testid": "apps-shell", sidebar: appsSidebar, contentInnerClassName: "w-full", contentClassName: "![scrollbar-width:none] [&::-webkit-scrollbar]:!hidden", children: _jsxs("div", { className: "device-layout mx-auto flex w-full max-w-6xl flex-col gap-4 px-4 py-4 lg:px-6", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 border-b border-border/35 pb-3", children: [_jsx("div", { className: "min-w-0", children: _jsx("h2", { className: "text-xs-tight font-semibold uppercase tracking-[0.18em] text-accent", children: "App Windows" }) }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("label", { className: "inline-flex cursor-pointer items-center gap-2 rounded-full border border-border/60 bg-card/60 px-3 py-1.5 text-xs font-medium text-muted transition-colors hover:text-foreground", children: [_jsx("input", { type: "checkbox", "aria-label": "Open apps in windows", className: "h-3.5 w-3.5 accent-accent", checked: appWindowLaunchEnabled, onChange: (event) => handleAppWindowLaunchEnabledChange(event.currentTarget.checked) }), _jsx("span", { children: "Open apps in windows" })] }), _jsxs("label", { className: "inline-flex cursor-pointer items-center gap-2 rounded-full border border-border/60 bg-card/60 px-3 py-1.5 text-xs font-medium text-muted transition-colors hover:text-foreground", children: [_jsx("input", { type: "checkbox", "aria-label": "Keep new windows on top", className: "h-3.5 w-3.5 accent-accent", checked: appWindowAlwaysOnTop, onChange: (event) => handleAppWindowAlwaysOnTopChange(event.currentTarget.checked) }), appWindowAlwaysOnTop ? (_jsx(Pin, { className: "h-3.5 w-3.5", "aria-hidden": "true" })) : (_jsx(PinOff, { className: "h-3.5 w-3.5", "aria-hidden": "true" })), _jsx("span", { children: "Keep new windows on top" })] })] })] }), appWindows.length > 0 ? (_jsx("section", { "data-testid": "app-window-controls", className: "flex flex-wrap items-center gap-2", children: appWindows.map((windowRecord) => {
896
+ return (_jsx(PageLayout, { className: "h-full bg-transparent", "data-testid": "apps-shell", sidebar: appsSidebar, contentInnerClassName: "w-full", contentClassName: "![scrollbar-width:none] [&::-webkit-scrollbar]:!hidden", children: _jsxs("div", { className: "device-layout mx-auto flex w-full max-w-6xl flex-col gap-4 px-4 py-4 lg:px-6", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 border-b border-border/35 pb-3", children: [_jsx("div", { className: "min-w-0", children: _jsx("h2", { className: "text-xs-tight font-semibold uppercase tracking-[0.18em] text-accent", children: "App Windows" }) }), _jsxs("label", { className: "inline-flex cursor-pointer items-center gap-2 rounded-full border border-border/60 bg-card/60 px-3 py-1.5 text-xs font-medium text-muted transition-colors hover:text-foreground", children: [_jsx("input", { type: "checkbox", "aria-label": "Open apps in windows", className: "h-3.5 w-3.5 accent-accent", checked: appWindowLaunchEnabled, onChange: (event) => handleAppWindowLaunchEnabledChange(event.currentTarget.checked) }), _jsx("span", { children: "Open apps in windows" })] })] }), appWindows.length > 0 ? (_jsx("section", { "data-testid": "app-window-controls", className: "flex flex-wrap items-center gap-2", children: appWindows.map((windowRecord) => {
805
897
  const busy = busyAppWindowId === windowRecord.id;
806
898
  return (_jsxs("div", { className: "inline-flex min-w-0 items-center gap-2 rounded-full border border-border/55 bg-card/70 px-3 py-1.5 text-xs text-muted", children: [_jsx("span", { className: "max-w-44 truncate font-medium text-foreground", children: windowRecord.displayName }), _jsxs("button", { type: "button", className: "inline-flex items-center gap-1.5 rounded-full border border-border/60 px-2 py-1 text-[0.68rem] font-semibold uppercase tracking-[0.16em] text-muted transition-colors hover:border-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-60", onClick: () => void handleToggleAppWindowAlwaysOnTop(windowRecord), disabled: busy, "aria-label": windowRecord.alwaysOnTop
807
899
  ? `Let ${windowRecord.displayName} act like a normal window`
808
900
  : `Keep ${windowRecord.displayName} on top`, children: [windowRecord.alwaysOnTop ? (_jsx(PinOff, { className: "h-3.5 w-3.5", "aria-hidden": "true" })) : (_jsx(Pin, { className: "h-3.5 w-3.5", "aria-hidden": "true" })), windowRecord.alwaysOnTop ? "Normal" : "On top"] })] }, windowRecord.id));
809
- }) })) : null, hasActiveRun ? (_jsx("div", { className: "flex flex-wrap items-center justify-between gap-3", children: _jsx("button", { type: "button", className: "rounded-full border border-ok/35 bg-ok/10 px-3 py-1.5 text-xs-tight font-medium text-ok transition-colors hover:bg-ok/15", onClick: handleOpenCurrentGame, children: hasCurrentGame ? "Live viewer" : "Active run" }) })) : null, _jsx(RunningAppsRow, { runs: sortedRuns, catalogApps: apps, busyRunId: busyRunId, onOpenRun: (run) => void handleOpenRun(run), onStopRun: (run) => void handleStopRun(run), stoppingRunId: stoppingRunId }), _jsx(AppsCatalogGrid, { activeAppNames: activeAppNames, error: error, favoriteAppNames: favoriteAppNames, loading: loading, searchQuery: searchQuery, visibleApps: visibleApps, onLaunch: (app) => void handleLaunch(app), onToggleFavorite: handleToggleFavorite })] }) }));
901
+ }) })) : null, hasActiveRun ? (_jsx("div", { className: "flex flex-wrap items-center justify-between gap-3", children: _jsx("button", { type: "button", className: "rounded-full border border-ok/35 bg-ok/10 px-3 py-1.5 text-xs-tight font-medium text-ok transition-colors hover:bg-ok/15", onClick: handleOpenCurrentGame, children: hasCurrentGame ? "Live viewer" : "Active run" }) })) : null, appsDetailsSlug ? (_jsx(AppDetailsView, { slug: appsDetailsSlug, onLaunched: () => pushAppsUrl() })) : (_jsxs(_Fragment, { children: [_jsx(RunningAppsRow, { runs: sortedRuns, catalogApps: apps, busyRunId: busyRunId, onOpenRun: (run) => void handleOpenRun(run), onStopRun: (run) => void handleStopRun(run), stoppingRunId: stoppingRunId }), _jsx(AppsCatalogGrid, { activeAppNames: activeAppNames, error: error, favoriteAppNames: favoriteAppNames, loading: loading, searchQuery: searchQuery, visibleApps: visibleApps, onLaunch: (app) => void handleLaunch(app), onToggleFavorite: handleToggleFavorite })] }))] }) }));
810
902
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StartupShell.d.ts","sourceRoot":"","sources":["../../../../../../../app-core/src/components/shell/StartupShell.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAkEH,wBAAgB,YAAY,mDAkP3B"}
1
+ {"version":3,"file":"StartupShell.d.ts","sourceRoot":"","sources":["../../../../../../../app-core/src/components/shell/StartupShell.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiEH,wBAAgB,YAAY,mDA4O3B"}
@@ -49,9 +49,8 @@ function phaseToStatusKey(phase) {
49
49
  /**
50
50
  * Returns true when the cloud-provisioned bootstrap session has NOT yet been
51
51
  * established for this page load. After a successful exchange the UI writes
52
- * sessionStorage["milady_session"] we treat presence of that key as
53
- * "bootstrap done" for P0. P1 will retire sessionStorage in favour of an
54
- * HttpOnly cookie set by the server.
52
+ * sessionStorage["milady_session"] as a renderer-side marker; the server-owned
53
+ * HttpOnly cookie remains the actual auth boundary.
55
54
  */
56
55
  function needsBootstrapSession() {
57
56
  try {
@@ -148,12 +147,10 @@ export function StartupShell() {
148
147
  if (needsBootstrapSession()) {
149
148
  // Cloud-provisioned but no session yet. Lock the dashboard and show
150
149
  // the bootstrap wizard step. Fail closed: we do NOT advance.
151
- console.log("[eliza][startup] Cloud-provisioned container — bootstrap session required");
152
150
  setShowBootstrap(true);
153
151
  return;
154
152
  }
155
153
  // Cloud-provisioned and session already established — skip the wizard.
156
- console.log("[eliza][startup] Cloud-provisioned container with session — skipping wizard");
157
154
  setState("onboardingComplete", true);
158
155
  coordinatorDispatchRef.current({ type: "ONBOARDING_COMPLETE" });
159
156
  })