@agent-native/core 0.141.6 → 0.144.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/agent-native.eject.json +9 -0
  2. package/corpus/README.md +1 -1
  3. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +3 -14
  4. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +11 -6
  5. package/corpus/templates/analytics/.agents/skills/prometheus/SKILL.md +5 -5
  6. package/corpus/templates/analytics/.agents/skills/provider-api/SKILL.md +19 -0
  7. package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +296 -0
  8. package/corpus/templates/analytics/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  9. package/corpus/templates/analytics/.agents/skills/turn-into-skill/SKILL.md +112 -0
  10. package/corpus/templates/analytics/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  11. package/corpus/templates/analytics/AGENTS.md +37 -40
  12. package/corpus/templates/analytics/actions/compose-dashboard.ts +1 -1
  13. package/corpus/templates/analytics/actions/ensure-native-v2-dashboards.ts +1 -1
  14. package/corpus/templates/analytics/actions/list-dashboard-usage-stats.ts +17 -22
  15. package/corpus/templates/analytics/actions/migrate-first-party-analytics-to-bigquery.ts +135 -0
  16. package/corpus/templates/analytics/actions/navigate.ts +5 -6
  17. package/corpus/templates/analytics/actions/provider-api-register.ts +50 -0
  18. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +46 -13
  19. package/corpus/templates/analytics/actions/test-custom-api-connection.ts +106 -0
  20. package/corpus/templates/analytics/actions/update-dashboard.ts +0 -1
  21. package/corpus/templates/analytics/actions/view-screen.ts +0 -20
  22. package/corpus/templates/analytics/app/components/CustomApiCard.tsx +430 -0
  23. package/corpus/templates/analytics/app/components/layout/Header.tsx +0 -1
  24. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +5 -5
  25. package/corpus/templates/analytics/app/i18n-data.ts +682 -90
  26. package/corpus/templates/analytics/app/lib/native-mcp-exclusions.ts +6 -0
  27. package/corpus/templates/analytics/app/lib/sql-query.ts +33 -6
  28. package/corpus/templates/analytics/app/pages/Agents.tsx +0 -3
  29. package/corpus/templates/analytics/app/pages/DataSources.tsx +4 -0
  30. package/corpus/templates/analytics/app/pages/Settings.tsx +22 -43
  31. package/corpus/templates/analytics/app/pages/settings/settings-search.ts +23 -20
  32. package/corpus/templates/analytics/app/routes/extensions._index.tsx +1 -1
  33. package/corpus/templates/analytics/app/routes/settings.$.tsx +1 -0
  34. package/corpus/templates/analytics/app/routes/team.tsx +1 -1
  35. package/corpus/templates/analytics/changelog/2026-08-05-settings-no-longer-includes-an-unnecessary-about-section.md +6 -0
  36. package/corpus/templates/analytics/changelog/2026-08-06-analytics-dashboards-load-reliably-during-background-data-sw.md +6 -0
  37. package/corpus/templates/analytics/changelog/2026-08-06-analytics-dashboards-remain-responsive-while-historical-data.md +6 -0
  38. package/corpus/templates/analytics/changelog/2026-08-06-analytics-query-results-now-render-as-a-table-with-csv-downl.md +6 -0
  39. package/corpus/templates/analytics/changelog/2026-08-06-connect-public-https-custom-apis-and-hand-tested-endpoints-t.md +6 -0
  40. package/corpus/templates/analytics/changelog/2026-08-06-durable-agent-worker-memory.md +6 -0
  41. package/corpus/templates/analytics/changelog/2026-08-06-live-dashboard-panels-use-the-shared-query-timeout.md +6 -0
  42. package/corpus/templates/analytics/changelog/2026-08-06-on-demand-billing-is-available-as-a-native-dashboard-with-ta.md +6 -0
  43. package/corpus/templates/analytics/changelog/2026-08-06-visible-dashboard-names-are-unique.md +6 -0
  44. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +1 -1
  45. package/corpus/templates/analytics/netlify.toml +7 -0
  46. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +4 -0
  47. package/corpus/templates/analytics/scripts/first-party-analytics-bigquery.sql +104 -0
  48. package/corpus/templates/analytics/server/db/index.ts +27 -0
  49. package/corpus/templates/analytics/server/db/schema.ts +10 -0
  50. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +0 -2
  51. package/corpus/templates/analytics/server/lib/dashboards-store.ts +227 -60
  52. package/corpus/templates/analytics/server/lib/first-party-analytics-backend.ts +1147 -0
  53. package/corpus/templates/analytics/server/lib/first-party-analytics-health.ts +34 -15
  54. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +57 -4
  55. package/corpus/templates/analytics/server/lib/native-v2-dashboards.ts +227 -1
  56. package/corpus/templates/analytics/server/lib/real-data-actions.ts +1 -3
  57. package/corpus/templates/analytics/server/plugins/agent-chat.ts +7 -4
  58. package/corpus/templates/analytics/server/plugins/analytics-rollup-backfill-jobs.ts +1 -0
  59. package/corpus/templates/analytics/server/plugins/db.ts +52 -18
  60. package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +36 -8
  61. package/corpus/templates/assets/.agents/skills/image-generation/SKILL.md +16 -1
  62. package/corpus/templates/assets/.agents/skills/library-management/SKILL.md +16 -1
  63. package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +296 -0
  64. package/corpus/templates/assets/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  65. package/corpus/templates/assets/.agents/skills/turn-into-skill/SKILL.md +112 -0
  66. package/corpus/templates/assets/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  67. package/corpus/templates/assets/AGENTS.md +1 -0
  68. package/corpus/templates/assets/actions/_helpers.ts +12 -0
  69. package/corpus/templates/assets/actions/generate-image.ts +9 -3
  70. package/corpus/templates/assets/actions/import-style-from-url.ts +115 -0
  71. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +3 -1
  72. package/corpus/templates/assets/app/routes/extensions._index.tsx +1 -1
  73. package/corpus/templates/assets/app/routes/settings.$.tsx +1 -0
  74. package/corpus/templates/assets/app/routes/settings.tsx +5 -0
  75. package/corpus/templates/assets/app/routes/team.tsx +1 -1
  76. package/corpus/templates/assets/changelog/2026-08-05-brand-kits-can-import-a-website-s-hydrated-visual-language-a.md +6 -0
  77. package/corpus/templates/assets/changelog/2026-08-05-generated-images-now-hand-off-embeddable-previews-to-other-w.md +6 -0
  78. package/corpus/templates/assets/server/lib/generation.ts +58 -0
  79. package/corpus/templates/assets/shared/api.ts +12 -0
  80. package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +296 -0
  81. package/corpus/templates/brain/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  82. package/corpus/templates/brain/.agents/skills/turn-into-skill/SKILL.md +112 -0
  83. package/corpus/templates/brain/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  84. package/corpus/templates/brain/actions/list-connection-providers.ts +24 -3
  85. package/corpus/templates/brain/app/lib/dispatch-links.ts +44 -0
  86. package/corpus/templates/brain/app/routes/extensions._index.tsx +1 -1
  87. package/corpus/templates/brain/app/routes/sources.tsx +15 -7
  88. package/corpus/templates/brain/app/routes/team.tsx +1 -1
  89. package/corpus/templates/brain/app/routes.ts +1 -1
  90. package/corpus/templates/brain/changelog/2026-08-06-brain-provider-setup-links-open-dispatch-correctly-in-standa.md +6 -0
  91. package/corpus/templates/brain/server/plugins/agent-chat.ts +1 -0
  92. package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +26 -0
  93. package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +296 -0
  94. package/corpus/templates/calendar/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  95. package/corpus/templates/calendar/.agents/skills/turn-into-skill/SKILL.md +112 -0
  96. package/corpus/templates/calendar/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  97. package/corpus/templates/calendar/AGENTS.md +11 -32
  98. package/corpus/templates/calendar/actions/update-event.ts +107 -1
  99. package/corpus/templates/calendar/app/components/calendar/EventCalendarSelect.tsx +83 -0
  100. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +57 -0
  101. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +59 -73
  102. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +3 -1
  103. package/corpus/templates/calendar/app/hooks/use-events.ts +4 -1
  104. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  105. package/corpus/templates/calendar/app/routes/_app.extensions._index.tsx +1 -1
  106. package/corpus/templates/calendar/app/routes/_app.settings.$.tsx +1 -0
  107. package/corpus/templates/calendar/app/routes/_app.team.tsx +1 -1
  108. package/corpus/templates/calendar/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
  109. package/corpus/templates/calendar/changelog/2026-08-06-existing-events-can-move-between-connected-google-account-ca.md +6 -0
  110. package/corpus/templates/calendar/server/lib/google-calendar.ts +101 -0
  111. package/corpus/templates/calendar/server/plugins/agent-chat.ts +7 -1
  112. package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
  113. package/corpus/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  114. package/corpus/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
  115. package/corpus/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  116. package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -1
  117. package/corpus/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  118. package/corpus/templates/chat/app/root.tsx +1 -1
  119. package/corpus/templates/chat/app/routes/agent.tsx +7 -7
  120. package/corpus/templates/chat/app/routes/extensions._index.tsx +1 -1
  121. package/corpus/templates/chat/app/routes/settings.$.tsx +1 -0
  122. package/corpus/templates/chat/app/routes/team.tsx +1 -1
  123. package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +296 -0
  124. package/corpus/templates/clips/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  125. package/corpus/templates/clips/.agents/skills/turn-into-skill/SKILL.md +112 -0
  126. package/corpus/templates/clips/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  127. package/corpus/templates/clips/app/components/editor/editor-layout.tsx +9 -24
  128. package/corpus/templates/clips/app/components/editor/timeline-geometry.ts +15 -0
  129. package/corpus/templates/clips/app/components/editor/waveform.tsx +4 -17
  130. package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
  131. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +14 -3
  132. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +1 -1
  133. package/corpus/templates/clips/app/components/recorder/storage-setup-card.tsx +1 -1
  134. package/corpus/templates/clips/app/routes/_app.extensions._index.tsx +1 -1
  135. package/corpus/templates/clips/app/routes/_app.settings.$.tsx +1 -0
  136. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +28 -38
  137. package/corpus/templates/clips/app/routes/share.$shareId.tsx +21 -27
  138. package/corpus/templates/clips/changelog/2026-08-06-clips-recovers-from-stalled-recording-setup-without-requirin.md +6 -0
  139. package/corpus/templates/clips/changelog/2026-08-06-clips-starts-faster-after-a-deploy-or-idle-period-startup-no.md +6 -0
  140. package/corpus/templates/clips/changelog/2026-08-06-deleting-a-recording-returns-cleanly-to-the-library-and-fit-.md +6 -0
  141. package/corpus/templates/clips/changelog/2026-08-06-hide-clip-insights-from-viewers-without-analytics-access.md +6 -0
  142. package/corpus/templates/clips/desktop/src/app.tsx +48 -20
  143. package/corpus/templates/clips/desktop/src/lib/recorder.ts +275 -74
  144. package/corpus/templates/clips/desktop/src/lib/recording-start-guard.ts +84 -0
  145. package/corpus/templates/clips/desktop/src/overlays/toolbar.tsx +14 -4
  146. package/corpus/templates/clips/server/plugins/db.ts +214 -26
  147. package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +296 -0
  148. package/corpus/templates/content/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  149. package/corpus/templates/content/.agents/skills/turn-into-skill/SKILL.md +112 -0
  150. package/corpus/templates/content/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  151. package/corpus/templates/content/app/routes/_app.extensions._index.tsx +1 -1
  152. package/corpus/templates/content/app/routes/_app.settings.$.tsx +1 -0
  153. package/corpus/templates/content/app/routes/_app.team.tsx +1 -1
  154. package/corpus/templates/content/e2e/global-setup.ts +1 -1
  155. package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +296 -0
  156. package/corpus/templates/crm/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  157. package/corpus/templates/crm/.agents/skills/turn-into-skill/SKILL.md +112 -0
  158. package/corpus/templates/crm/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  159. package/corpus/templates/crm/changelog/2026-08-06-crm-starts-faster-after-a-deploy-or-idle-period-one-time-dat.md +6 -0
  160. package/corpus/templates/crm/server/plugins/db.ts +11 -8
  161. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +36 -1
  162. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +6 -1
  163. package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +296 -0
  164. package/corpus/templates/design/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  165. package/corpus/templates/design/.agents/skills/turn-into-skill/SKILL.md +112 -0
  166. package/corpus/templates/design/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  167. package/corpus/templates/design/actions/analyze-brand-assets.ts +7 -7
  168. package/corpus/templates/design/actions/import-from-url.ts +6 -5
  169. package/corpus/templates/design/app/components/design/LayersPanel.tsx +27 -18
  170. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +2 -2
  171. package/corpus/templates/design/app/pages/Index.tsx +6 -2
  172. package/corpus/templates/design/app/routes/extensions._index.tsx +1 -1
  173. package/corpus/templates/design/app/routes/settings.$.tsx +1 -0
  174. package/corpus/templates/design/app/routes/team.tsx +1 -1
  175. package/corpus/templates/design/changelog/2026-08-05-deleting-a-design-from-the-home-page-no-longer-leaves-the-ap.md +6 -0
  176. package/corpus/templates/design/changelog/2026-08-05-renaming-a-layer-now-focuses-its-name-field-automatically.md +6 -0
  177. package/corpus/templates/design/changelog/2026-08-05-website-url-imports-now-capture-hydrated-browser-computed-de.md +6 -0
  178. package/corpus/templates/design/e2e/global-setup.ts +1 -1
  179. package/corpus/templates/design/server/plugins/agent-chat.ts +2 -0
  180. package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +296 -0
  181. package/corpus/templates/dispatch/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  182. package/corpus/templates/dispatch/.agents/skills/turn-into-skill/SKILL.md +112 -0
  183. package/corpus/templates/dispatch/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  184. package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +1 -1
  185. package/corpus/templates/dispatch/app/routes/settings.$.tsx +1 -0
  186. package/corpus/templates/dispatch/app/routes/team.tsx +1 -1
  187. package/corpus/templates/dispatch/changelog/2026-08-06-ready-workspace-apps-stay-one-click-away-in-a-compact-dispat.md +6 -0
  188. package/corpus/templates/dispatch/changelog/2026-08-06-shared-vault-values-and-management-are-now-restricted-to-wor.md +6 -0
  189. package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +296 -0
  190. package/corpus/templates/factory/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  191. package/corpus/templates/factory/.agents/skills/turn-into-skill/SKILL.md +112 -0
  192. package/corpus/templates/factory/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  193. package/corpus/templates/factory/app/hooks/use-navigation-state.ts +1 -1
  194. package/corpus/templates/factory/app/routes/extensions._index.tsx +1 -1
  195. package/corpus/templates/factory/app/routes/settings.$.tsx +1 -0
  196. package/corpus/templates/factory/app/routes/team.tsx +1 -1
  197. package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +296 -0
  198. package/corpus/templates/forms/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  199. package/corpus/templates/forms/.agents/skills/turn-into-skill/SKILL.md +112 -0
  200. package/corpus/templates/forms/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  201. package/corpus/templates/forms/app/routes/_app.extensions._index.tsx +1 -1
  202. package/corpus/templates/forms/app/routes/_app.settings.$.tsx +1 -0
  203. package/corpus/templates/forms/app/routes/_app.team.tsx +1 -1
  204. package/corpus/templates/forms/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
  205. package/corpus/templates/forms/server/plugins/agent-chat.ts +4 -0
  206. package/corpus/templates/forms/shared/navigation.ts +1 -1
  207. package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +296 -0
  208. package/corpus/templates/macros/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  209. package/corpus/templates/macros/.agents/skills/turn-into-skill/SKILL.md +112 -0
  210. package/corpus/templates/macros/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  211. package/corpus/templates/macros/app/routes/extensions._index.tsx +1 -1
  212. package/corpus/templates/macros/app/routes/settings.$.tsx +1 -0
  213. package/corpus/templates/macros/app/routes/team.tsx +1 -1
  214. package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +296 -0
  215. package/corpus/templates/mail/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  216. package/corpus/templates/mail/.agents/skills/turn-into-skill/SKILL.md +112 -0
  217. package/corpus/templates/mail/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  218. package/corpus/templates/mail/app/routes/extensions._index.tsx +1 -1
  219. package/corpus/templates/mail/app/routes/settings.$.tsx +1 -0
  220. package/corpus/templates/mail/changelog/2026-08-06-delegated-requests-continue-in-the-background.md +6 -0
  221. package/corpus/templates/mail/server/plugins/agent-chat.ts +6 -0
  222. package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +296 -0
  223. package/corpus/templates/plan/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  224. package/corpus/templates/plan/.agents/skills/turn-into-skill/SKILL.md +112 -0
  225. package/corpus/templates/plan/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  226. package/corpus/templates/plan/app/hooks/use-navigation-state.ts +1 -1
  227. package/corpus/templates/plan/app/routes/extensions._index.tsx +1 -1
  228. package/corpus/templates/plan/app/routes/settings.$.tsx +1 -0
  229. package/corpus/templates/plan/app/routes/team.tsx +1 -1
  230. package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +48 -5
  231. package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +40 -2
  232. package/corpus/templates/slides/.agents/skills/image-generation-via-a2a/SKILL.md +6 -0
  233. package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +15 -2
  234. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +29 -24
  235. package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +296 -0
  236. package/corpus/templates/slides/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  237. package/corpus/templates/slides/.agents/skills/turn-into-skill/SKILL.md +112 -0
  238. package/corpus/templates/slides/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  239. package/corpus/templates/slides/AGENTS.md +7 -9
  240. package/corpus/templates/slides/_gitignore +1 -0
  241. package/corpus/templates/slides/actions/analyze-brand-assets.ts +7 -7
  242. package/corpus/templates/slides/actions/export-pptx.ts +402 -36
  243. package/corpus/templates/slides/actions/import-file.ts +46 -85
  244. package/corpus/templates/slides/actions/import-from-url.ts +6 -6
  245. package/corpus/templates/slides/actions/import-google-slides-reference.ts +271 -12
  246. package/corpus/templates/slides/actions/import-pptx.ts +85 -60
  247. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +10 -13
  248. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +1 -1
  249. package/corpus/templates/slides/app/components/editor/AddSlidePopover.tsx +5 -1
  250. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +25 -12
  251. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +112 -57
  252. package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +202 -0
  253. package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +26 -14
  254. package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +176 -0
  255. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +182 -141
  256. package/corpus/templates/slides/app/components/editor/canvas-interactions/index.ts +1 -0
  257. package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +18 -0
  258. package/corpus/templates/slides/app/components/editor/slide-text-targets.ts +85 -0
  259. package/corpus/templates/slides/app/components/layout/Layout.tsx +3 -0
  260. package/corpus/templates/slides/app/components/onboarding/FirstDeckOnboardingFlow.tsx +13 -3
  261. package/corpus/templates/slides/app/components/presentation/PresentationView.tsx +27 -1
  262. package/corpus/templates/slides/app/context/DeckContext.tsx +71 -20
  263. package/corpus/templates/slides/app/global.css +6 -0
  264. package/corpus/templates/slides/app/i18n/en-US.ts +1 -0
  265. package/corpus/templates/slides/app/lib/create-deck-generation.ts +10 -6
  266. package/corpus/templates/slides/app/lib/deck-preview-frame.ts +15 -0
  267. package/corpus/templates/slides/app/lib/deck-share-links.ts +9 -0
  268. package/corpus/templates/slides/app/lib/export-pptx-client.ts +89 -0
  269. package/corpus/templates/slides/app/lib/slide-animation-elements.ts +3 -0
  270. package/corpus/templates/slides/app/pages/DeckEditor.tsx +17 -0
  271. package/corpus/templates/slides/app/pages/Index.tsx +107 -6
  272. package/corpus/templates/slides/app/routes/extensions._index.tsx +1 -1
  273. package/corpus/templates/slides/app/routes/settings.$.tsx +1 -0
  274. package/corpus/templates/slides/app/routes/team.tsx +1 -1
  275. package/corpus/templates/slides/changelog/2026-08-05-failed-deck-creation-and-reference-uploads-now-recover-clean.md +6 -0
  276. package/corpus/templates/slides/changelog/2026-08-05-slides-recover-completed-generation-results-after-a-sync-hic.md +6 -0
  277. package/corpus/templates/slides/changelog/2026-08-05-website-url-imports-now-capture-hydrated-browser-computed-st.md +6 -0
  278. package/corpus/templates/slides/changelog/2026-08-06-clicking-the-gray-canvas-around-a-slide-clears-its-selection.md +6 -0
  279. package/corpus/templates/slides/changelog/2026-08-06-deck-thumbnails-keep-a-consistent-listing-frame-across-aspec.md +6 -0
  280. package/corpus/templates/slides/changelog/2026-08-06-deep-linked-decks-open-directly-instead-of-being-interrupted.md +6 -0
  281. package/corpus/templates/slides/changelog/2026-08-06-google-slides-exports-now-show-clear-import-steps-when-direc.md +6 -0
  282. package/corpus/templates/slides/changelog/2026-08-06-import-pdf-google-slides-and-powerpoint-decks-directly-from-.md +6 -0
  283. package/corpus/templates/slides/changelog/2026-08-06-imported-powerpoint-exports-keep-text-and-images-editable-an.md +6 -0
  284. package/corpus/templates/slides/changelog/2026-08-06-presentation-prompts-continue-adding-rendered-slides-until-t.md +6 -0
  285. package/corpus/templates/slides/changelog/2026-08-06-public-decks-now-share-read-only-presentation-links-by-defau.md +6 -0
  286. package/corpus/templates/slides/changelog/2026-08-06-slides-offers-a-direct-connect-google-button-when-a-drive-co.md +6 -0
  287. package/corpus/templates/slides/changelog/2026-08-06-slides-preserve-uploaded-pdf-layouts-accept-larger-reference.md +6 -0
  288. package/corpus/templates/slides/changelog/2026-08-06-styled-words-stay-part-of-their-text-box-instead-of-becoming.md +6 -0
  289. package/corpus/templates/slides/server/handlers/google-docs-auth.ts +7 -20
  290. package/corpus/templates/slides/server/handlers/import/html-converter.ts +236 -13
  291. package/corpus/templates/slides/server/handlers/import/pptx-assets.ts +67 -0
  292. package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +2 -0
  293. package/corpus/templates/slides/server/handlers/uploads.ts +7 -3
  294. package/corpus/templates/slides/server/lib/chat-attachments.ts +6 -3
  295. package/corpus/templates/slides/server/lib/emails.ts +7 -2
  296. package/corpus/templates/slides/server/lib/google-docs-error.ts +50 -0
  297. package/corpus/templates/slides/server/lib/google-docs-oauth.ts +1 -0
  298. package/corpus/templates/slides/server/lib/import-asset-storage.ts +127 -0
  299. package/corpus/templates/slides/server/plugins/agent-chat.ts +4 -3
  300. package/corpus/templates/slides/server/routes/api/import-assets/[token].get.ts +70 -0
  301. package/corpus/templates/slides/shared/upload-types.ts +3 -0
  302. package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +296 -0
  303. package/corpus/templates/tasks/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  304. package/corpus/templates/tasks/.agents/skills/turn-into-skill/SKILL.md +112 -0
  305. package/corpus/templates/tasks/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  306. package/corpus/templates/tasks/app/components/layout/Header.tsx +3 -1
  307. package/corpus/templates/tasks/app/routes/extensions._index.tsx +1 -1
  308. package/corpus/templates/tasks/app/routes/settings.$.tsx +1 -0
  309. package/dist/agent/engine/ai-sdk-engine.js +49 -3
  310. package/dist/agent/production-agent.d.ts +18 -0
  311. package/dist/agent/production-agent.js +80 -1
  312. package/dist/agent/types.d.ts +7 -0
  313. package/dist/cli/agent-plugin.d.ts +112 -0
  314. package/dist/cli/agent-plugin.js +1081 -0
  315. package/dist/cli/app-skill.js +39 -1
  316. package/dist/cli/code-agent-executor.d.ts +3 -0
  317. package/dist/cli/code-agent-executor.js +51 -13
  318. package/dist/cli/index.js +13 -0
  319. package/dist/cli/templates-meta.js +1 -1
  320. package/dist/client/AgentPanel.d.ts +3 -1
  321. package/dist/client/AgentPanel.js +9 -2
  322. package/dist/client/AssistantChat.d.ts +8 -0
  323. package/dist/client/AssistantChat.js +23 -8
  324. package/dist/client/NewWorkspaceAppFlow.js +1 -0
  325. package/dist/client/agent-chat-adapter.d.ts +1 -1
  326. package/dist/client/agent-chat-adapter.js +153 -7
  327. package/dist/client/agent-page/AgentWorkspaceContent.d.ts +1 -1
  328. package/dist/client/agent-page/AgentWorkspaceContent.js +13 -13
  329. package/dist/client/assistant-ui-recovery.d.ts +2 -1
  330. package/dist/client/assistant-ui-recovery.js +7 -3
  331. package/dist/client/chat/run-recovery.js +5 -1
  332. package/dist/client/embed-auth.js +6 -2
  333. package/dist/client/error-format.js +12 -0
  334. package/dist/client/integrations/IntegrationsPanel.js +40 -6
  335. package/dist/client/onboarding/FirstRunOnboarding.js +11 -4
  336. package/dist/client/org/OrgSwitcher.js +2 -2
  337. package/dist/client/org/TeamPage.js +92 -72
  338. package/dist/client/require-session.d.ts +1 -1
  339. package/dist/client/require-session.js +4 -4
  340. package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
  341. package/dist/client/resources/McpConnectionSuggestion.js +27 -10
  342. package/dist/client/resources/McpIntegrationDialog.js +77 -45
  343. package/dist/client/resources/mcp-integration-catalog.d.ts +13 -1
  344. package/dist/client/resources/mcp-integration-catalog.js +255 -2
  345. package/dist/client/resources/mcp-integration-logos.js +18 -2
  346. package/dist/client/resources/use-mcp-servers.d.ts +5 -0
  347. package/dist/client/resources/use-mcp-servers.js +36 -0
  348. package/dist/client/settings/AccountSettingsCard.js +42 -36
  349. package/dist/client/settings/AutomationsSection.js +1 -1
  350. package/dist/client/settings/DemoModeSection.d.ts +3 -1
  351. package/dist/client/settings/DemoModeSection.js +4 -1
  352. package/dist/client/settings/ExtensionsSettingsContent.js +1 -1
  353. package/dist/client/settings/SchedulingTimezoneField.d.ts +3 -1
  354. package/dist/client/settings/SchedulingTimezoneField.js +9 -5
  355. package/dist/client/settings/SettingsPanel.d.ts +4 -1
  356. package/dist/client/settings/SettingsPanel.js +21 -21
  357. package/dist/client/settings/SettingsTabsPage.d.ts +2 -2
  358. package/dist/client/settings/SettingsTabsPage.js +98 -45
  359. package/dist/client/settings/VoiceTranscriptionSection.js +6 -1
  360. package/dist/client/settings/useSettingsPanelController.js +47 -8
  361. package/dist/collab/routes.d.ts +1 -1
  362. package/dist/db/client.d.ts +9 -0
  363. package/dist/db/client.js +51 -16
  364. package/dist/db/create-get-db.js +2 -2
  365. package/dist/db/ddl-guard.d.ts +11 -10
  366. package/dist/db/ddl-guard.js +40 -12
  367. package/dist/deploy/build.d.ts +2 -0
  368. package/dist/deploy/build.js +97 -4
  369. package/dist/deploy/workspace-deploy.js +0 -2
  370. package/dist/guards/no-env-credentials.js +9 -0
  371. package/dist/ingestion/index.d.ts +1 -1
  372. package/dist/ingestion/pptx.d.ts +68 -0
  373. package/dist/ingestion/pptx.js +660 -213
  374. package/dist/ingestion/website.d.ts +30 -0
  375. package/dist/integrations/plugin.js +9 -6
  376. package/dist/localization/default-messages.d.ts +59 -0
  377. package/dist/localization/default-messages.js +62 -2
  378. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  379. package/dist/mcp-client/oauth-routes.d.ts +2 -0
  380. package/dist/mcp-client/oauth-routes.js +74 -7
  381. package/dist/mcp-client/routes.d.ts +1 -0
  382. package/dist/mcp-client/routes.js +49 -0
  383. package/dist/navigation/index.js +16 -5
  384. package/dist/notifications/routes.d.ts +1 -1
  385. package/dist/observability/routes.d.ts +3 -3
  386. package/dist/onboarding/app-profile.js +11 -0
  387. package/dist/progress/routes.d.ts +1 -1
  388. package/dist/provider-api/actions/custom-provider-registration.d.ts +13 -13
  389. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  390. package/dist/resources/store.js +15 -1
  391. package/dist/scripts/call-agent.js +45 -4
  392. package/dist/secrets/routes.d.ts +6 -6
  393. package/dist/server/agent-chat/action-filters-a2a.d.ts +1 -1
  394. package/dist/server/agent-chat/action-filters-a2a.js +36 -1
  395. package/dist/server/agent-chat-plugin.js +29 -8
  396. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  397. package/dist/server/auth.js +55 -17
  398. package/dist/server/better-auth-instance.js +5 -3
  399. package/dist/server/core-routes-plugin.d.ts +8 -1
  400. package/dist/server/core-routes-plugin.js +28 -3
  401. package/dist/server/credential-provider.d.ts +3 -3
  402. package/dist/server/credential-provider.js +90 -4
  403. package/dist/server/identity-sso.js +2 -1
  404. package/dist/server/onboarding-html.d.ts +2 -0
  405. package/dist/server/onboarding-html.js +171 -62
  406. package/dist/server/realtime-token.d.ts +1 -1
  407. package/dist/server/self-dispatch.d.ts +5 -4
  408. package/dist/server/self-dispatch.js +25 -14
  409. package/dist/server/ssr-handler.d.ts +1 -1
  410. package/dist/server/ssr-handler.js +1 -1
  411. package/dist/server/workspace-provider-oauth.js +1 -1
  412. package/dist/setup-connections/onboarding.js +1 -1
  413. package/dist/shared/cache-control.d.ts +26 -2
  414. package/dist/shared/cache-control.js +43 -2
  415. package/dist/shared/index.d.ts +1 -1
  416. package/dist/shared/index.js +1 -1
  417. package/dist/shared/password-policy.d.ts +3 -0
  418. package/dist/shared/password-policy.js +3 -0
  419. package/dist/shared/sign-in-journey.d.ts +5 -2
  420. package/dist/shared/sign-in-journey.js +10 -4
  421. package/dist/sharing/actions/set-resource-visibility.js +16 -4
  422. package/dist/sharing/registry.d.ts +14 -0
  423. package/dist/styles/agent-native.css +6 -0
  424. package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
  425. package/dist/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  426. package/dist/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
  427. package/dist/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  428. package/dist/templates/chat/app/components/layout/Layout.tsx +1 -1
  429. package/dist/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  430. package/dist/templates/chat/app/root.tsx +1 -1
  431. package/dist/templates/chat/app/routes/agent.tsx +7 -7
  432. package/dist/templates/chat/app/routes/extensions._index.tsx +1 -1
  433. package/dist/templates/chat/app/routes/settings.$.tsx +1 -0
  434. package/dist/templates/chat/app/routes/team.tsx +1 -1
  435. package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +296 -0
  436. package/dist/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  437. package/dist/templates/default/.agents/skills/turn-into-skill/SKILL.md +112 -0
  438. package/dist/templates/default/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  439. package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +296 -0
  440. package/dist/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  441. package/dist/templates/headless/.agents/skills/turn-into-skill/SKILL.md +112 -0
  442. package/dist/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  443. package/dist/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +6 -0
  444. package/dist/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +37 -6
  445. package/dist/templates/workspace-core/.agents/skills/authentication/SKILL.md +4 -2
  446. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +51 -0
  447. package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +296 -0
  448. package/dist/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  449. package/dist/templates/workspace-core/.agents/skills/turn-into-skill/SKILL.md +112 -0
  450. package/dist/templates/workspace-core/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  451. package/dist/templates/workspace-root/AGENTS.md +7 -0
  452. package/dist/user-profile/actions/change-password.js +8 -3
  453. package/dist/user-profile/actions/set-password.js +5 -1
  454. package/dist/vite/action-types-plugin.js +59 -0
  455. package/docs/content/authentication.mdx +4 -5
  456. package/docs/content/skills-guide.mdx +13 -0
  457. package/docs/content/template-analytics-developers.mdx +1 -1
  458. package/docs/content/template-calendar-developers.mdx +1 -1
  459. package/docs/content/template-chat-developers.mdx +2 -2
  460. package/docs/content/template-content-developers.mdx +1 -1
  461. package/docs/content/template-mail-developers.mdx +1 -1
  462. package/docs/content/template-plan-developers.mdx +1 -1
  463. package/docs/content/toolkit-command-navigation.mdx +6 -6
  464. package/docs/content/toolkit-org-team.mdx +1 -1
  465. package/docs/content/toolkit-settings.mdx +8 -8
  466. package/docs/content/toolkit-setup-connections.mdx +1 -1
  467. package/package.json +6 -2
  468. package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +296 -0
  469. package/src/templates/chat/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  470. package/src/templates/chat/.agents/skills/turn-into-skill/SKILL.md +112 -0
  471. package/src/templates/chat/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  472. package/src/templates/chat/app/components/layout/Layout.tsx +1 -1
  473. package/src/templates/chat/app/hooks/use-navigation-state.ts +1 -1
  474. package/src/templates/chat/app/root.tsx +1 -1
  475. package/src/templates/chat/app/routes/agent.tsx +7 -7
  476. package/src/templates/chat/app/routes/extensions._index.tsx +1 -1
  477. package/src/templates/chat/app/routes/settings.$.tsx +1 -0
  478. package/src/templates/chat/app/routes/team.tsx +1 -1
  479. package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +296 -0
  480. package/src/templates/default/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  481. package/src/templates/default/.agents/skills/turn-into-skill/SKILL.md +112 -0
  482. package/src/templates/default/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  483. package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +296 -0
  484. package/src/templates/headless/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  485. package/src/templates/headless/.agents/skills/turn-into-skill/SKILL.md +112 -0
  486. package/src/templates/headless/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  487. package/src/templates/workspace-core/.agents/skills/adding-workspace-apps/SKILL.md +6 -0
  488. package/src/templates/workspace-core/.agents/skills/address-feedback/SKILL.md +37 -6
  489. package/src/templates/workspace-core/.agents/skills/authentication/SKILL.md +4 -2
  490. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +51 -0
  491. package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +296 -0
  492. package/src/templates/workspace-core/.agents/skills/turn-into-app/agents/openai.yaml +4 -0
  493. package/src/templates/workspace-core/.agents/skills/turn-into-skill/SKILL.md +112 -0
  494. package/src/templates/workspace-core/.agents/skills/turn-into-skill/agents/openai.yaml +4 -0
  495. package/src/templates/workspace-root/AGENTS.md +7 -0
  496. package/corpus/templates/analytics/.agents/skills/dashboard-management/references/template-catalog-and-demo.md +0 -62
  497. package/corpus/templates/analytics/actions/install-dashboard-template.ts +0 -369
  498. package/corpus/templates/analytics/actions/list-dashboard-templates.ts +0 -47
  499. package/corpus/templates/analytics/actions/list-native-v2-dashboard-templates.ts +0 -34
  500. package/corpus/templates/analytics/app/routes/catalog.tsx +0 -240
  501. package/src/templates/default/actions/navigate.spec.ts +0 -53
@@ -79,7 +79,7 @@ function workingLocationTitle(
79
79
 
80
80
  export default defineAction({
81
81
  description:
82
- "Update a Google Calendar event. Supports title, description, location, time, event color, attachments, reminders, and recurrence rules such as RRULE:FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR.",
82
+ "Update a Google Calendar event. Supports moving an existing event between connected Google account calendars, as well as title, description, location, time, event color, attachments, reminders, and recurrence rules such as RRULE:FREQ=DAILY;BYDAY=MO,TU,WE,TH,FR.",
83
83
  schema: z.object({
84
84
  id: z
85
85
  .string()
@@ -90,6 +90,12 @@ export default defineAction({
90
90
  .describe(
91
91
  "Connected Google account email from list-events/search-events",
92
92
  ),
93
+ targetAccountEmail: z
94
+ .string()
95
+ .optional()
96
+ .describe(
97
+ "Move this event to another connected Google account's primary calendar. Pass accountEmail as the current event account. Moving creates the event on the destination and removes it from the source.",
98
+ ),
93
99
  title: z.string().optional().describe("New event title"),
94
100
  description: z.string().optional().describe("New event description"),
95
101
  location: z.string().optional().describe("New event location"),
@@ -205,6 +211,11 @@ export default defineAction({
205
211
  args.accountEmail,
206
212
  ownerEmail,
207
213
  );
214
+ const targetAccountEmail =
215
+ args.targetAccountEmail !== undefined
216
+ ? await resolveOwnedAccountEmail(args.targetAccountEmail, ownerEmail)
217
+ : undefined;
218
+ const hasAccountMove = targetAccountEmail !== undefined;
208
219
  const recurrence = normalizeRecurrence(args.recurrence);
209
220
  const guestNotificationMessage = normalizeGuestNotificationMessage(
210
221
  args.notificationMessage,
@@ -227,6 +238,7 @@ export default defineAction({
227
238
  let attendees = normalizeAttendees(args.attendees);
228
239
 
229
240
  const hasPatch =
241
+ hasAccountMove ||
230
242
  args.title !== undefined ||
231
243
  args.description !== undefined ||
232
244
  args.location !== undefined ||
@@ -283,6 +295,100 @@ export default defineAction({
283
295
  return existingEvent;
284
296
  };
285
297
 
298
+ if (hasAccountMove) {
299
+ if (
300
+ targetAccountEmail!.trim().toLowerCase() ===
301
+ accountEmail.trim().toLowerCase()
302
+ ) {
303
+ throw new Error(
304
+ "The destination calendar must be different from the current calendar.",
305
+ );
306
+ }
307
+ if (args.scope === "all") {
308
+ throw new Error(
309
+ "Move a recurring event occurrence with scope single; moving an entire recurring series is not supported.",
310
+ );
311
+ }
312
+
313
+ const existingEvent = await loadExistingEvent();
314
+ const hasOtherEventPatch =
315
+ args.title !== undefined ||
316
+ args.description !== undefined ||
317
+ args.location !== undefined ||
318
+ args.start !== undefined ||
319
+ args.end !== undefined ||
320
+ args.startTimeZone !== undefined ||
321
+ args.endTimeZone !== undefined ||
322
+ args.allDay !== undefined ||
323
+ args.transparency !== undefined ||
324
+ args.visibility !== undefined ||
325
+ args.status !== undefined ||
326
+ args.remindersUseDefault !== undefined ||
327
+ args.reminders !== undefined ||
328
+ args.attachments !== undefined ||
329
+ args.colorId !== undefined ||
330
+ args.reminderMinutes !== undefined ||
331
+ args.reminderMethod !== undefined ||
332
+ args.addGoogleMeet !== undefined ||
333
+ args.addZoom !== undefined ||
334
+ args.recurrence !== undefined ||
335
+ args.attendees !== undefined ||
336
+ args.addAttendees !== undefined ||
337
+ args.workingLocationType !== undefined ||
338
+ args.workingLocationLabel !== undefined;
339
+ if (hasOtherEventPatch) {
340
+ throw new Error(
341
+ "Move the event separately from other event field changes.",
342
+ );
343
+ }
344
+
345
+ const sendUpdates =
346
+ args.sendUpdates ??
347
+ (existingEvent.attendees?.some((attendee) => !attendee.self)
348
+ ? "all"
349
+ : "none");
350
+ const result = await googleCalendar.moveEvent(googleEventId, {
351
+ sourceAccount: { ownerEmail, accountEmail },
352
+ destinationAccount: {
353
+ ownerEmail,
354
+ accountEmail: targetAccountEmail!,
355
+ },
356
+ sendUpdates,
357
+ });
358
+ if (!result.id) {
359
+ throw new Error("Google did not return an id for the moved event.");
360
+ }
361
+
362
+ const guestNotification = guestNotificationMessage
363
+ ? await sendEventGuestNotificationNote({
364
+ event: {
365
+ ...existingEvent,
366
+ id: `google-${result.id}`,
367
+ googleEventId: result.id,
368
+ accountEmail: targetAccountEmail,
369
+ htmlLink: result.htmlLink,
370
+ hangoutLink: result.meetLink,
371
+ conferenceData: result.conferenceData,
372
+ },
373
+ organizerEmail: ownerEmail,
374
+ message: guestNotificationMessage,
375
+ kind: "update",
376
+ })
377
+ : undefined;
378
+
379
+ return {
380
+ success: true,
381
+ id: `google-${result.id}`,
382
+ replacedId: `google-${googleEventId}`,
383
+ accountEmail: targetAccountEmail,
384
+ updated: ["accountEmail"],
385
+ htmlLink: result.htmlLink,
386
+ hangoutLink: result.meetLink,
387
+ conferenceData: result.conferenceData,
388
+ ...(guestNotification ? { guestNotification } : {}),
389
+ };
390
+ }
391
+
286
392
  if (args.location !== undefined && !hasWorkingLocationPatch) {
287
393
  const existingEvent = await loadExistingEvent();
288
394
  if (existingEvent.eventType === "workingLocation") {
@@ -0,0 +1,83 @@
1
+ import { useT } from "@agent-native/core/client/i18n";
2
+ import { IconCalendarTime } from "@tabler/icons-react";
3
+ import { useMemo } from "react";
4
+
5
+ import {
6
+ Select,
7
+ SelectContent,
8
+ SelectGroup,
9
+ SelectItem,
10
+ SelectTrigger,
11
+ SelectValue,
12
+ } from "@/components/ui/select";
13
+ import { useGoogleAuthStatus } from "@/hooks/use-google-auth";
14
+ import { useViewPreferences } from "@/hooks/use-view-preferences";
15
+ import { defaultColorForAccount } from "@/lib/calendar-view-preferences";
16
+ import { shouldShowEventAccountSelector } from "@/lib/event-account-selection";
17
+
18
+ const EMPTY_CONNECTED_ACCOUNTS: Array<{ email: string }> = [];
19
+
20
+ export function EventCalendarSelect({
21
+ accountEmail,
22
+ onAccountChange,
23
+ disabled = false,
24
+ }: {
25
+ accountEmail?: string;
26
+ onAccountChange: (accountEmail: string) => void;
27
+ disabled?: boolean;
28
+ }) {
29
+ const t = useT();
30
+ const googleStatus = useGoogleAuthStatus();
31
+ const connectedAccounts =
32
+ googleStatus.data?.accounts ?? EMPTY_CONNECTED_ACCOUNTS;
33
+ const connectedAccountEmails = useMemo(
34
+ () => connectedAccounts.map((account) => account.email),
35
+ [connectedAccounts],
36
+ );
37
+ const { prefs: viewPrefs } = useViewPreferences();
38
+
39
+ if (!shouldShowEventAccountSelector(connectedAccounts) || !accountEmail) {
40
+ return null;
41
+ }
42
+
43
+ return (
44
+ <div className="flex items-center gap-3 py-1.5">
45
+ <IconCalendarTime className="h-4 w-4 shrink-0 text-muted-foreground" />
46
+ <Select
47
+ value={accountEmail}
48
+ onValueChange={onAccountChange}
49
+ disabled={disabled}
50
+ >
51
+ <SelectTrigger
52
+ aria-label={t("navigation.calendar")}
53
+ className="h-8 flex-1 text-sm"
54
+ >
55
+ <SelectValue />
56
+ </SelectTrigger>
57
+ <SelectContent>
58
+ <SelectGroup>
59
+ {connectedAccounts.map((account) => (
60
+ <SelectItem key={account.email} value={account.email}>
61
+ <span className="flex min-w-0 items-center gap-2">
62
+ <span
63
+ className="size-2.5 shrink-0 rounded-full"
64
+ style={{
65
+ backgroundColor:
66
+ viewPrefs.accountColors[account.email] ??
67
+ viewPrefs.singleColor ??
68
+ defaultColorForAccount(
69
+ account.email,
70
+ connectedAccountEmails,
71
+ ),
72
+ }}
73
+ />
74
+ <span className="truncate">{account.email}</span>
75
+ </span>
76
+ </SelectItem>
77
+ ))}
78
+ </SelectGroup>
79
+ </SelectContent>
80
+ </Select>
81
+ </div>
82
+ );
83
+ }
@@ -18,6 +18,7 @@ import { toast } from "sonner";
18
18
 
19
19
  import { ResearchMeetingButton } from "@/components/calendar/ApolloPanel";
20
20
  import { EventAttendeesSection } from "@/components/calendar/EventAttendeesSection";
21
+ import { EventCalendarSelect } from "@/components/calendar/EventCalendarSelect";
21
22
  import {
22
23
  RenderedDescription,
23
24
  AutoGrowTextarea,
@@ -133,6 +134,9 @@ export function EventDetailPanel({
133
134
  );
134
135
  const titleInputRef = useRef<HTMLInputElement>(null);
135
136
  const updateEvent = useUpdateEvent();
137
+ const [selectedAccountEmail, setSelectedAccountEmail] = useState(
138
+ event?.accountEmail,
139
+ );
136
140
  const { promptGuestNotification, guestNotificationDialog } =
137
141
  useGuestNotificationPrompt();
138
142
  const isOverlay = !!event?.overlayEmail;
@@ -157,6 +161,10 @@ export function EventDetailPanel({
157
161
  lastSavedDescriptionRef.current = event?.description || "";
158
162
  }, [event?.id]);
159
163
 
164
+ useEffect(() => {
165
+ setSelectedAccountEmail(event?.accountEmail);
166
+ }, [event?.id, event?.accountEmail]);
167
+
160
168
  useEffect(() => {
161
169
  if (isEditingTitle) {
162
170
  requestAnimationFrame(() => titleInputRef.current?.focus());
@@ -203,6 +211,47 @@ export function EventDetailPanel({
203
211
  onClose();
204
212
  };
205
213
 
214
+ const handleAccountChange = useCallback(
215
+ (targetAccountEmail: string) => {
216
+ if (
217
+ !event ||
218
+ !event.accountEmail ||
219
+ targetAccountEmail === event.accountEmail ||
220
+ updateEvent.isPending
221
+ ) {
222
+ return;
223
+ }
224
+
225
+ setSelectedAccountEmail(targetAccountEmail);
226
+ void (async () => {
227
+ const guestNotification = await promptGuestNotification({
228
+ event,
229
+ action: "update",
230
+ });
231
+ if (!guestNotification) {
232
+ setSelectedAccountEmail(event.accountEmail);
233
+ return;
234
+ }
235
+ updateEvent.mutate(
236
+ {
237
+ id: event.id,
238
+ accountEmail: event.accountEmail,
239
+ targetAccountEmail,
240
+ ...guestNotification,
241
+ },
242
+ {
243
+ onSuccess: () => toast.success(t("eventForm.eventUpdated")),
244
+ onError: () => {
245
+ setSelectedAccountEmail(event.accountEmail);
246
+ toast.error(t("eventForm.updateFailed"));
247
+ },
248
+ },
249
+ );
250
+ })();
251
+ },
252
+ [event, promptGuestNotification, t, updateEvent],
253
+ );
254
+
206
255
  const handleAddGoogleMeet = useCallback(() => {
207
256
  if (!event || updateEvent.isPending) return;
208
257
  void (async () => {
@@ -378,6 +427,14 @@ export function EventDetailPanel({
378
427
  </h2>
379
428
  )}
380
429
 
430
+ {!isOverlay && event.source === "google" && (
431
+ <EventCalendarSelect
432
+ accountEmail={selectedAccountEmail}
433
+ onAccountChange={handleAccountChange}
434
+ disabled={updateEvent.isPending}
435
+ />
436
+ )}
437
+
381
438
  {/* Time */}
382
439
  <div className="flex items-start gap-2.5 text-sm text-muted-foreground">
383
440
  <IconClock className="mt-0.5 h-4 w-4 shrink-0" />
@@ -31,6 +31,7 @@ import {
31
31
  type AttendeeRecipient,
32
32
  } from "@/components/calendar/AttendeeAutocomplete";
33
33
  import { EventAttendeesSection } from "@/components/calendar/EventAttendeesSection";
34
+ import { EventCalendarSelect } from "@/components/calendar/EventCalendarSelect";
34
35
  import {
35
36
  RenderedDescription,
36
37
  AutoGrowTextarea,
@@ -58,7 +59,6 @@ import {
58
59
  import {
59
60
  Select,
60
61
  SelectContent,
61
- SelectGroup,
62
62
  SelectItem,
63
63
  SelectTrigger,
64
64
  SelectValue,
@@ -71,12 +71,8 @@ import {
71
71
  TooltipProvider,
72
72
  } from "@/components/ui/tooltip";
73
73
  import { useEvent, useUpdateEvent } from "@/hooks/use-events";
74
- import { useGoogleAuthStatus } from "@/hooks/use-google-auth";
75
74
  import { useIsMobile } from "@/hooks/use-mobile";
76
- import { useViewPreferences } from "@/hooks/use-view-preferences";
77
75
  import { useConnectZoom, useZoomStatus } from "@/hooks/use-zoom-auth";
78
- import { defaultColorForAccount } from "@/lib/calendar-view-preferences";
79
- import { shouldShowEventAccountSelector } from "@/lib/event-account-selection";
80
76
  import {
81
77
  attachmentsToDrafts,
82
78
  buildRecurrenceRules,
@@ -113,7 +109,6 @@ import {
113
109
 
114
110
  const ZOOM_AFTER_CONNECT_EVENT_ID_KEY = "calendar.zoomAfterConnectEventId";
115
111
  const ZOOM_AFTER_CONNECT_MAX_AGE_MS = 10 * 60 * 1000;
116
- const EMPTY_CONNECTED_ACCOUNTS: Array<{ email: string }> = [];
117
112
 
118
113
  function buildEventDetailSlotContext(event: CalendarEvent) {
119
114
  return {
@@ -306,6 +301,7 @@ type EventUpdatePatch = Partial<CalendarEvent> & {
306
301
  addGoogleMeet?: boolean;
307
302
  addZoom?: boolean;
308
303
  addAttendees?: CalendarEvent["attendees"];
304
+ targetAccountEmail?: string;
309
305
  scope?: UpdateEventScope;
310
306
  workingLocationType?: "homeOffice" | "officeLocation" | "customLocation";
311
307
  workingLocationLabel?: string;
@@ -425,68 +421,6 @@ function formatEventDateRange(start: string, end: string, allDay?: boolean) {
425
421
  return startLabel === endLabel ? startLabel : `${startLabel} - ${endLabel}`;
426
422
  }
427
423
 
428
- function DraftEventAccountSelect({
429
- event,
430
- onAccountChange,
431
- }: {
432
- event: CalendarEvent;
433
- onAccountChange: (accountEmail: string) => void;
434
- }) {
435
- const t = useT();
436
- const googleStatus = useGoogleAuthStatus();
437
- const connectedAccounts =
438
- googleStatus.data?.accounts ?? EMPTY_CONNECTED_ACCOUNTS;
439
- const connectedAccountEmails = useMemo(
440
- () => connectedAccounts.map((account) => account.email),
441
- [connectedAccounts],
442
- );
443
- const { prefs: viewPrefs } = useViewPreferences();
444
-
445
- if (
446
- !shouldShowEventAccountSelector(connectedAccounts) ||
447
- !event.accountEmail
448
- ) {
449
- return null;
450
- }
451
-
452
- return (
453
- <div className="flex items-center gap-3 py-1.5">
454
- <IconCalendarTime className="h-4 w-4 shrink-0 text-muted-foreground" />
455
- <Select value={event.accountEmail} onValueChange={onAccountChange}>
456
- <SelectTrigger
457
- aria-label={t("navigation.calendar")}
458
- className="h-8 flex-1 text-sm"
459
- >
460
- <SelectValue />
461
- </SelectTrigger>
462
- <SelectContent>
463
- <SelectGroup>
464
- {connectedAccounts.map((account) => (
465
- <SelectItem key={account.email} value={account.email}>
466
- <span className="flex min-w-0 items-center gap-2">
467
- <span
468
- className="size-2.5 shrink-0 rounded-full"
469
- style={{
470
- backgroundColor:
471
- viewPrefs.accountColors[account.email] ??
472
- viewPrefs.singleColor ??
473
- defaultColorForAccount(
474
- account.email,
475
- connectedAccountEmails,
476
- ),
477
- }}
478
- />
479
- <span className="truncate">{account.email}</span>
480
- </span>
481
- </SelectItem>
482
- ))}
483
- </SelectGroup>
484
- </SelectContent>
485
- </Select>
486
- </div>
487
- );
488
- }
489
-
490
424
  interface EventDetailPopoverProps {
491
425
  event: CalendarEvent;
492
426
  children: React.ReactNode;
@@ -590,6 +524,9 @@ export function EventDetailPopover({
590
524
  () => attachmentsToDrafts(event.attachments),
591
525
  );
592
526
  const [editMeetingLink, setEditMeetingLink] = useState("");
527
+ const [selectedAccountEmail, setSelectedAccountEmail] = useState(
528
+ event.accountEmail,
529
+ );
593
530
  const [editTimeScope, setEditTimeScope] =
594
531
  useState<UpdateEventScope>("single");
595
532
  const [pendingVideoProvider, setPendingVideoProvider] = useState<
@@ -620,6 +557,54 @@ export function EventDetailPopover({
620
557
  const locationRef = useRef<HTMLInputElement>(null);
621
558
  const meetingLinkRef = useRef<HTMLInputElement>(null);
622
559
 
560
+ useEffect(() => {
561
+ setSelectedAccountEmail(event.accountEmail);
562
+ }, [event.id, event.accountEmail]);
563
+
564
+ const handleAccountChange = useCallback(
565
+ (targetAccountEmail: string) => {
566
+ if (isDraft) {
567
+ onDraftUpdate?.(event.id, { accountEmail: targetAccountEmail });
568
+ return;
569
+ }
570
+ if (
571
+ !event.accountEmail ||
572
+ targetAccountEmail === event.accountEmail ||
573
+ updateEvent.isPending
574
+ ) {
575
+ return;
576
+ }
577
+
578
+ setSelectedAccountEmail(targetAccountEmail);
579
+ void (async () => {
580
+ const guestNotification = await promptGuestNotification({
581
+ event,
582
+ action: "update",
583
+ });
584
+ if (!guestNotification) {
585
+ setSelectedAccountEmail(event.accountEmail);
586
+ return;
587
+ }
588
+ updateEvent.mutate(
589
+ {
590
+ id: event.id,
591
+ accountEmail: event.accountEmail,
592
+ targetAccountEmail,
593
+ ...guestNotification,
594
+ },
595
+ {
596
+ onSuccess: () => toast.success(t("eventForm.eventUpdated")),
597
+ onError: () => {
598
+ setSelectedAccountEmail(event.accountEmail);
599
+ toast.error(t("eventForm.updateFailed"));
600
+ },
601
+ },
602
+ );
603
+ })();
604
+ },
605
+ [event, isDraft, onDraftUpdate, promptGuestNotification, t, updateEvent],
606
+ );
607
+
623
608
  // Sync editing state when the event changes (incl. live agent/other-user
624
609
  // edits picked up by polling). Skip the field the user is actively editing so
625
610
  // an incoming update never yanks text out from under in-progress typing —
@@ -1587,12 +1572,13 @@ export function EventDetailPopover({
1587
1572
  </div>
1588
1573
 
1589
1574
  <div className="px-4 space-y-1">
1590
- {isDraft && (
1591
- <DraftEventAccountSelect
1592
- event={event}
1593
- onAccountChange={(accountEmail) =>
1594
- onDraftUpdate?.(event.id, { accountEmail })
1575
+ {(isDraft || (!isOverlay && event.source === "google")) && (
1576
+ <EventCalendarSelect
1577
+ accountEmail={
1578
+ isDraft ? event.accountEmail : selectedAccountEmail
1595
1579
  }
1580
+ onAccountChange={handleAccountChange}
1581
+ disabled={updateEvent.isPending}
1596
1582
  />
1597
1583
  )}
1598
1584
 
@@ -227,7 +227,9 @@ export function AppLayout({ children }: AppLayoutProps) {
227
227
  const queryClient = useQueryClient();
228
228
  const googleStatus = useGoogleAuthStatus();
229
229
  const hasAccounts = (googleStatus.data?.accounts?.length ?? 0) > 0;
230
- const isSettingsPage = location.pathname === "/settings";
230
+ const isSettingsPage =
231
+ location.pathname === "/settings" ||
232
+ location.pathname.startsWith("/settings/");
231
233
  const isCalendarPage = location.pathname === "/";
232
234
  const [sidebarOpen, setSidebarOpen] = useState(false);
233
235
  const [sidebarCollapsed, setSidebarCollapsed] =
@@ -45,6 +45,7 @@ type CreateEventInput = Omit<
45
45
 
46
46
  type UpdateEventInput = Partial<CalendarEvent> & {
47
47
  id: string;
48
+ targetAccountEmail?: string;
48
49
  addGoogleMeet?: boolean;
49
50
  addZoom?: boolean;
50
51
  addAttendees?: CalendarEvent["attendees"];
@@ -379,6 +380,7 @@ export function useUpdateEvent() {
379
380
  addGoogleMeet,
380
381
  addZoom,
381
382
  addAttendees,
383
+ targetAccountEmail,
382
384
  sendUpdates,
383
385
  notificationMessage,
384
386
  scope,
@@ -386,6 +388,7 @@ export function useUpdateEvent() {
386
388
  workingLocationLabel,
387
389
  ...optimisticData
388
390
  } = newData;
391
+ const optimisticPatch = targetAccountEmail ? {} : optimisticData;
389
392
  const hasWorkingLocationUpdate =
390
393
  workingLocationType !== undefined ||
391
394
  workingLocationLabel !== undefined;
@@ -413,7 +416,7 @@ export function useUpdateEvent() {
413
416
  workingLocationLabel ?? getWorkingLocationEditableLabel(e);
414
417
  return {
415
418
  ...e,
416
- ...optimisticData,
419
+ ...optimisticPatch,
417
420
  ...(hasWorkingLocationUpdate
418
421
  ? {
419
422
  workingLocationProperties: buildWorkingLocationProperties(
@@ -762,6 +762,8 @@ const enUS = {
762
762
  end: "End",
763
763
  endDate: "End date",
764
764
  event: "Event",
765
+ eventUpdated: "Event updated",
766
+ updateFailed: "Failed to update event",
765
767
  eventAlerts: "Event alerts",
766
768
  eventOptions: "Event options",
767
769
  autoDecline: "Automatically decline",
@@ -8110,6 +8112,8 @@ const translatedCalendarRawBurnDown = {
8110
8112
  },
8111
8113
  eventForm: {
8112
8114
  addCalendar: "添加日历",
8115
+ eventUpdated: "事件已更新",
8116
+ updateFailed: "更新事件失败",
8113
8117
  addCalendarFailed: "添加日历失败",
8114
8118
  addCalendarFromUrl: "从 URL 添加日历",
8115
8119
  added: "已添加",
@@ -8281,6 +8285,8 @@ const translatedCalendarRawBurnDown = {
8281
8285
  },
8282
8286
  eventForm: {
8283
8287
  addCalendar: "Añadir calendario",
8288
+ eventUpdated: "Evento actualizado",
8289
+ updateFailed: "No se pudo actualizar el evento",
8284
8290
  addCalendarFailed: "No se pudo añadir el calendario",
8285
8291
  addCalendarFromUrl: "Añadir calendario desde URL",
8286
8292
  added: "Añadido",
@@ -8454,6 +8460,8 @@ const translatedCalendarRawBurnDown = {
8454
8460
  },
8455
8461
  eventForm: {
8456
8462
  addCalendar: "Ajouter un calendrier",
8463
+ eventUpdated: "Événement mis à jour",
8464
+ updateFailed: "Échec de la mise à jour de l'événement",
8457
8465
  addCalendarFailed: "Échec de l’ajout du calendrier",
8458
8466
  addCalendarFromUrl: "Ajouter un calendrier depuis une URL",
8459
8467
  added: "Ajouté",
@@ -8633,6 +8641,8 @@ const translatedCalendarRawBurnDown = {
8633
8641
  },
8634
8642
  eventForm: {
8635
8643
  addCalendar: "Kalender hinzufügen",
8644
+ eventUpdated: "Ereignis aktualisiert",
8645
+ updateFailed: "Ereignis konnte nicht aktualisiert werden",
8636
8646
  addCalendarFailed: "Kalender konnte nicht hinzugefügt werden",
8637
8647
  addCalendarFromUrl: "Kalender per URL hinzufügen",
8638
8648
  added: "Hinzugefügt",
@@ -8808,6 +8818,8 @@ const translatedCalendarRawBurnDown = {
8808
8818
  },
8809
8819
  eventForm: {
8810
8820
  addCalendar: "カレンダーを追加",
8821
+ eventUpdated: "予定を更新しました",
8822
+ updateFailed: "予定を更新できませんでした",
8811
8823
  addCalendarFailed: "カレンダーを追加できませんでした",
8812
8824
  addCalendarFromUrl: "URL からカレンダーを追加",
8813
8825
  added: "追加済み",
@@ -8978,6 +8990,8 @@ const translatedCalendarRawBurnDown = {
8978
8990
  },
8979
8991
  eventForm: {
8980
8992
  addCalendar: "캘린더 추가",
8993
+ eventUpdated: "이벤트가 업데이트되었습니다",
8994
+ updateFailed: "이벤트를 업데이트하지 못했습니다",
8981
8995
  addCalendarFailed: "캘린더를 추가하지 못했습니다",
8982
8996
  addCalendarFromUrl: "URL에서 캘린더 추가",
8983
8997
  added: "추가됨",
@@ -9151,6 +9165,8 @@ const translatedCalendarRawBurnDown = {
9151
9165
  },
9152
9166
  eventForm: {
9153
9167
  addCalendar: "Adicionar calendário",
9168
+ eventUpdated: "Evento atualizado",
9169
+ updateFailed: "Falha ao atualizar evento",
9154
9170
  addCalendarFailed: "Falha ao adicionar calendário",
9155
9171
  addCalendarFromUrl: "Adicionar calendário por URL",
9156
9172
  added: "Adicionado",
@@ -9323,6 +9339,8 @@ const translatedCalendarRawBurnDown = {
9323
9339
  },
9324
9340
  eventForm: {
9325
9341
  addCalendar: "कैलेंडर जोड़ें",
9342
+ eventUpdated: "इवेंट अपडेट हो गया",
9343
+ updateFailed: "इवेंट अपडेट नहीं हो सका",
9326
9344
  addCalendarFailed: "कैलेंडर जोड़ने में विफल",
9327
9345
  addCalendarFromUrl: "URL से कैलेंडर जोड़ें",
9328
9346
  added: "जोड़ा गया",
@@ -9494,6 +9512,8 @@ const translatedCalendarRawBurnDown = {
9494
9512
  },
9495
9513
  eventForm: {
9496
9514
  addCalendar: "إضافة تقويم",
9515
+ eventUpdated: "تم تحديث الحدث",
9516
+ updateFailed: "فشل تحديث الحدث",
9497
9517
  addCalendarFailed: "فشلت إضافة التقويم",
9498
9518
  addCalendarFromUrl: "إضافة تقويم من URL",
9499
9519
  added: "تمت الإضافة",
@@ -1,5 +1,5 @@
1
1
  import { Navigate } from "react-router";
2
2
 
3
3
  export default function ExtensionsRoute() {
4
- return <Navigate to="/settings#extensions" replace />;
4
+ return <Navigate to="/settings/extensions" replace />;
5
5
  }
@@ -0,0 +1 @@
1
+ export { default, meta } from "./_app.settings.js";
@@ -7,5 +7,5 @@ export function meta() {
7
7
  }
8
8
 
9
9
  export default function TeamRoute() {
10
- return <Navigate to="/settings#organization" replace />;
10
+ return <Navigate to="/settings/organization" replace />;
11
11
  }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-08-06
4
+ ---
5
+
6
+ Long-running calendar requests now continue in the background instead of stopping at the foreground time limit.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-08-06
4
+ ---
5
+
6
+ Existing events can move between connected Google account calendars