@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
@@ -1,8 +1,14 @@
1
1
  export const ANALYTICS_NATIVE_MCP_PRESET_EXCLUSIONS = [
2
+ "amplitude",
3
+ "apollo",
2
4
  "atlassian",
5
+ "common-room",
3
6
  "github",
7
+ "gong",
8
+ "grafana",
4
9
  "hubspot",
5
10
  "notion",
11
+ "pylon",
6
12
  "sentry",
7
13
  "slack",
8
14
  "stripe",
@@ -59,6 +59,29 @@ function createAbortError(): Error {
59
59
  return error;
60
60
  }
61
61
 
62
+ function createDeadlineSignal(
63
+ parentSignal: AbortSignal | undefined,
64
+ timeoutMs: number,
65
+ ): { signal: AbortSignal; cleanup: () => void } {
66
+ const controller = new AbortController();
67
+ const abortFromParent = () => controller.abort(parentSignal?.reason);
68
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
69
+
70
+ if (parentSignal?.aborted) {
71
+ abortFromParent();
72
+ } else {
73
+ parentSignal?.addEventListener("abort", abortFromParent, { once: true });
74
+ }
75
+
76
+ return {
77
+ signal: controller.signal,
78
+ cleanup: () => {
79
+ clearTimeout(timer);
80
+ parentSignal?.removeEventListener("abort", abortFromParent);
81
+ },
82
+ };
83
+ }
84
+
62
85
  function createSqlQueryRelease(pool: SqlQuerySlotPool): () => void {
63
86
  let released = false;
64
87
  return () => {
@@ -117,21 +140,25 @@ export async function executeSqlQuery(
117
140
  signal?: AbortSignal,
118
141
  options?: { reportScreenshot?: boolean },
119
142
  ): Promise<SqlQueryResult> {
120
- const release = await acquireSqlQuerySlot(source, signal);
143
+ const deadline = createDeadlineSignal(
144
+ signal,
145
+ DASHBOARD_REPORT_ACTION_TIMEOUT_MS,
146
+ );
147
+ let release: (() => void) | undefined;
121
148
  let data: DashboardPanelQueryResponse;
122
149
  try {
150
+ release = await acquireSqlQuerySlot(source, deadline.signal);
123
151
  data = await callAction<DashboardPanelQueryResponse>(
124
152
  "query-dashboard-panel",
125
153
  { query: sql, source },
126
154
  {
127
- signal,
128
- ...(options?.reportScreenshot
129
- ? { timeoutMs: DASHBOARD_REPORT_ACTION_TIMEOUT_MS }
130
- : {}),
155
+ signal: deadline.signal,
156
+ timeoutMs: DASHBOARD_REPORT_ACTION_TIMEOUT_MS,
131
157
  },
132
158
  );
133
159
  } finally {
134
- release();
160
+ release?.();
161
+ deadline.cleanup();
135
162
  }
136
163
 
137
164
  if (typeof data?.error === "string") {
@@ -489,9 +489,6 @@ export default function AgentsPage() {
489
489
  </p>
490
490
  </div>
491
491
  <div className="flex shrink-0 items-center gap-2">
492
- <Button variant="outline" size="sm" asChild>
493
- <Link to="/catalog">{t("agents.openCatalog")}</Link>
494
- </Button>
495
492
  {canManageOrg ? (
496
493
  <DropdownMenu>
497
494
  <DropdownMenuTrigger asChild>
@@ -94,6 +94,8 @@ import {
94
94
  type WalkthroughStep,
95
95
  } from "@/lib/data-sources";
96
96
 
97
+ import { CustomApiCard } from "../components/CustomApiCard";
98
+
97
99
  interface AnalyticsPublicKeyRow {
98
100
  id: string;
99
101
  name: string;
@@ -2099,6 +2101,8 @@ export default function DataSources() {
2099
2101
 
2100
2102
  <GoogleSheetsExportCard statusData={statusData} />
2101
2103
 
2104
+ <CustomApiCard />
2105
+
2102
2106
  {unknownFocusedSourceId && (
2103
2107
  <div
2104
2108
  role="status"
@@ -41,7 +41,6 @@ import { buildAnalyticsGeneralSettingsSearchEntries } from "./settings/settings-
41
41
 
42
42
  export default function Settings() {
43
43
  const t = useT();
44
- const agentSettingsTabs = useAgentSettingsTabs();
45
44
  const replayStorageStatus = useReplayStorageStatus();
46
45
  const { data: analyticsPrefs, isLoading: analyticsPrefsLoading } =
47
46
  useActionQuery<AnalyticsUserPrefs>("get-user-pref", {
@@ -122,6 +121,23 @@ export default function Settings() {
122
121
  });
123
122
  };
124
123
 
124
+ const agentAdditionalContent = (
125
+ <SettingsRow
126
+ id="bell-sound"
127
+ label={t("settings.bellSound")}
128
+ description={t("settings.bellSoundDescription")}
129
+ control={
130
+ <Switch
131
+ aria-label={t("settings.bellSound")}
132
+ checked={bellSoundEnabled}
133
+ disabled={analyticsPrefsLoading || saveAnalyticsPrefs.isPending}
134
+ onCheckedChange={saveBellSoundPreference}
135
+ />
136
+ }
137
+ />
138
+ );
139
+ const agentSettingsTabs = useAgentSettingsTabs({ agentAdditionalContent });
140
+
125
141
  const extraTabs = useMemo<SettingsTabItem[]>(
126
142
  () => [
127
143
  {
@@ -130,7 +146,7 @@ export default function Settings() {
130
146
  icon: IconBell,
131
147
  keywords: "alerts rules notifications thresholds triggers monitoring",
132
148
  content: (
133
- <div className="mx-auto w-full max-w-5xl">
149
+ <div className="w-full">
134
150
  <AlertRulesSettingsCard />
135
151
  </div>
136
152
  ),
@@ -157,7 +173,7 @@ export default function Settings() {
157
173
  extraTabs={extraTabs}
158
174
  generalSearchEntries={generalSearchEntries}
159
175
  general={
160
- <div className="mx-auto w-full max-w-2xl space-y-6">
176
+ <div className="w-full space-y-6">
161
177
  <SettingsGroup className="bg-card border-border/50">
162
178
  <SettingsRow
163
179
  id="credentials"
@@ -171,18 +187,6 @@ export default function Settings() {
171
187
  </Button>
172
188
  }
173
189
  />
174
- <SettingsRow
175
- id="dashboard-templates"
176
- label={t("settings.dashboardTemplates")}
177
- description={t("settings.dashboardTemplatesDescription")}
178
- control={
179
- <Button variant="outline" size="sm" asChild>
180
- <Link to="/catalog">
181
- {t("settings.openDashboardTemplates")}
182
- </Link>
183
- </Button>
184
- }
185
- />
186
190
  <SettingsRow
187
191
  id="language"
188
192
  label={t("settings.languageTitle")}
@@ -207,21 +211,6 @@ export default function Settings() {
207
211
  />
208
212
  }
209
213
  />
210
- <SettingsRow
211
- id="bell-sound"
212
- label={t("settings.bellSound")}
213
- description={t("settings.bellSoundDescription")}
214
- control={
215
- <Switch
216
- aria-label={t("settings.bellSound")}
217
- checked={bellSoundEnabled}
218
- disabled={
219
- analyticsPrefsLoading || saveAnalyticsPrefs.isPending
220
- }
221
- onCheckedChange={saveBellSoundPreference}
222
- />
223
- }
224
- />
225
214
  </SettingsGroup>
226
215
 
227
216
  {replayStorageStatus.data?.configured ? (
@@ -242,29 +231,19 @@ export default function Settings() {
242
231
  </CardContent>
243
232
  </Card>
244
233
  ) : null}
245
-
246
- <Card id="about" className="bg-card border-border/50 scroll-mt-16">
247
- <CardHeader>
248
- <CardTitle className="text-base">{t("settings.about")}</CardTitle>
249
- </CardHeader>
250
- <CardContent className="space-y-2 text-sm text-muted-foreground">
251
- <p>{t("settings.aboutDescription")}</p>
252
- <p>{t("settings.aboutUsage")}</p>
253
- </CardContent>
254
- </Card>
255
234
  </div>
256
235
  }
257
236
  team={
258
- <div className="mx-auto w-full max-w-5xl">
237
+ <div className="w-full">
259
238
  <TeamPage
260
239
  showTitle={false}
261
240
  createOrgDescription="Set up a team to share dashboards and data sources with your colleagues."
262
- className="max-w-5xl"
241
+ className="w-full"
263
242
  />
264
243
  </div>
265
244
  }
266
245
  whatsNew={
267
- <div className="mx-auto w-full max-w-2xl">
246
+ <div className="w-full">
268
247
  <ChangelogSettingsCard markdown={changelog} />
269
248
  </div>
270
249
  }
@@ -2,6 +2,7 @@ import {
2
2
  getAgentSettingsSearchTabs,
3
3
  type SettingsSearchEntry,
4
4
  } from "@agent-native/core/client/settings";
5
+ import { buildSettingsRoute } from "@agent-native/core/navigation";
5
6
 
6
7
  interface SettingsCommandItem {
7
8
  id: string;
@@ -12,6 +13,20 @@ interface SettingsCommandItem {
12
13
 
13
14
  type Translate = (key: string) => string;
14
15
 
16
+ function buildSettingsEntryRoute(tabId: string, section?: string): string {
17
+ const normalizedSection = section?.replace(/^#/, "").trim();
18
+ if (!normalizedSection || normalizedSection === tabId) {
19
+ return buildSettingsRoute(tabId);
20
+ }
21
+ if (normalizedSection.startsWith("agent:")) {
22
+ return buildSettingsRoute(normalizedSection);
23
+ }
24
+ if (normalizedSection.startsWith(`${tabId}:`)) {
25
+ return buildSettingsRoute(normalizedSection);
26
+ }
27
+ return buildSettingsRoute(`${tabId}:${normalizedSection}`);
28
+ }
29
+
15
30
  export function buildAnalyticsGeneralSettingsSearchEntries(
16
31
  t: Translate,
17
32
  replayStorageConfigured: boolean,
@@ -21,6 +36,7 @@ export function buildAnalyticsGeneralSettingsSearchEntries(
21
36
  id: "analytics-account",
22
37
  label: t("settings.account"),
23
38
  keywords: "profile photo avatar email signed in identity",
39
+ tabId: "account",
24
40
  hash: "account",
25
41
  },
26
42
  {
@@ -29,12 +45,6 @@ export function buildAnalyticsGeneralSettingsSearchEntries(
29
45
  keywords: "data sources api keys manage credentials",
30
46
  hash: "credentials",
31
47
  },
32
- {
33
- id: "analytics-dashboard-templates",
34
- label: t("settings.dashboardTemplates"),
35
- keywords: "templates catalog dashboards",
36
- hash: "dashboard-templates",
37
- },
38
48
  ...(replayStorageConfigured
39
49
  ? [
40
50
  {
@@ -57,18 +67,6 @@ export function buildAnalyticsGeneralSettingsSearchEntries(
57
67
  keywords: "email notifications errors alerts javascript monitoring",
58
68
  hash: "error-email-notifications",
59
69
  },
60
- {
61
- id: "analytics-bell-sound",
62
- label: t("settings.bellSound"),
63
- keywords: "sound audio ding agent completion notification",
64
- hash: "bell-sound",
65
- },
66
- {
67
- id: "analytics-about",
68
- label: t("settings.about"),
69
- keywords: "about version info usage",
70
- hash: "about",
71
- },
72
70
  ];
73
71
  }
74
72
 
@@ -118,18 +116,23 @@ export function buildAnalyticsSettingsCommandItems(
118
116
  };
119
117
 
120
118
  for (const tab of tabs) {
119
+ const entryHref = (entry: SettingsSearchEntry, tabId: string) => {
120
+ const hash = entry.hash?.replace(/^#/, "");
121
+ return buildSettingsEntryRoute(tabId, hash);
122
+ };
121
123
  add({
122
124
  id: `tab:${tab.id}`,
123
125
  label: tab.label,
124
126
  keywords: `${tab.keywords} settings`,
125
- href: `/settings#${tab.id}`,
127
+ href: buildSettingsRoute(tab.id),
126
128
  });
127
129
  for (const entry of tab.searchEntries ?? []) {
130
+ const tabId = entry.tabId ?? tab.id;
128
131
  add({
129
132
  id: entry.id,
130
133
  label: entry.label,
131
134
  keywords: `${entry.keywords ?? ""} ${entry.description ?? ""} ${tab.label} settings`,
132
- href: `/settings#${entry.hash ?? entry.tabId ?? tab.id}`,
135
+ href: entryHref(entry, tabId),
133
136
  });
134
137
  }
135
138
  }
@@ -7,5 +7,5 @@ export function meta() {
7
7
  }
8
8
 
9
9
  export default function ExtensionsRoute() {
10
- return <Navigate to="/settings#extensions" replace />;
10
+ return <Navigate to="/settings/extensions" replace />;
11
11
  }
@@ -0,0 +1 @@
1
+ export { default, meta } from "./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: removed
3
+ date: 2026-08-05
4
+ ---
5
+
6
+ Settings no longer includes an unnecessary About section.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-06
4
+ ---
5
+
6
+ Analytics dashboards load reliably during background data sweeps
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-06
4
+ ---
5
+
6
+ Analytics dashboards remain responsive while historical data processing runs.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-08-06
4
+ ---
5
+
6
+ Analytics query results now render as a table with CSV download.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-08-06
4
+ ---
5
+
6
+ Connect public HTTPS Custom APIs and hand tested endpoints to refreshable data programs
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-06
4
+ ---
5
+
6
+ Durable Analytics agent runs now have the maximum supported Netlify function memory allocation to reduce worker deaths during long analyses.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-06
4
+ ---
5
+
6
+ Live dashboard panels now use the shared query timeout so slower charts fail more predictably.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-08-06
4
+ ---
5
+
6
+ On-demand billing is available as a native dashboard with tabs and built-in analytics panels.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-08-06
4
+ ---
5
+
6
+ Analytics rejects duplicate names when creating or renaming visible dashboards.
@@ -173,7 +173,7 @@ Agent Native observability panels belong in the canonical Agent Native dashboard
173
173
  (`agent-native-templates-first-party`), including generation metrics, explicit
174
174
  feedback sentiment, optional inferred message sentiment, and separate
175
175
  by-main-model breakdowns. Do not publish or install a separate observability
176
- dashboard template.
176
+ dashboard.
177
177
 
178
178
  Example dashboard panel:
179
179
 
@@ -25,6 +25,13 @@ AGENT_CHAT_DURABLE_BACKGROUND = "true"
25
25
  [functions."*"]
26
26
  timeout = 75
27
27
 
28
+ # Recent durable Analytics runs recorded failed-worker RSS above 4 GB while
29
+ # Netlify Functions default to 1 GB. Give the long-running agent worker the
30
+ # highest supported allocation so memory pressure does not masquerade as a
31
+ # stale heartbeat; query and connection bounds remain the primary safeguards.
32
+ [functions.server-agent-background]
33
+ memory = "4gb"
34
+
28
35
  [functions.dashboard-report-sweep-background]
29
36
  timeout = 300
30
37
  memory = "2gb"
@@ -83,6 +83,7 @@ function emitBackgroundWorker(token: string) {
83
83
  rmSync(path.join(dest, "server.mjs"), { force: true });
84
84
 
85
85
  const source = `globalThis.__AGENT_NATIVE_BACKGROUND_RUNTIME__ = true;
86
+ globalThis.__AGENT_NATIVE_LOW_CONNECTION_BACKGROUND_RUNTIME__ = true;
86
87
  globalThis.__AGENT_NATIVE_DASHBOARD_REPORT_SCHEDULED_RUNTIME__ = true;
87
88
 
88
89
  const CRON_TOKEN = ${JSON.stringify(token)};
@@ -227,6 +228,7 @@ function emitAlertBackgroundWorker(token: string) {
227
228
  rmSync(path.join(dest, "server.mjs"), { force: true });
228
229
 
229
230
  const source = `globalThis.__AGENT_NATIVE_BACKGROUND_RUNTIME__ = true;
231
+ globalThis.__AGENT_NATIVE_LOW_CONNECTION_BACKGROUND_RUNTIME__ = true;
230
232
  globalThis.__AGENT_NATIVE_ANALYTICS_ALERT_SCHEDULED_RUNTIME__ = true;
231
233
 
232
234
  const CRON_TOKEN = ${JSON.stringify(token)};
@@ -344,6 +346,7 @@ function emitUptimeBackgroundWorker(token: string) {
344
346
  rmSync(path.join(dest, "server.mjs"), { force: true });
345
347
 
346
348
  const source = `globalThis.__AGENT_NATIVE_BACKGROUND_RUNTIME__ = true;
349
+ globalThis.__AGENT_NATIVE_LOW_CONNECTION_BACKGROUND_RUNTIME__ = true;
347
350
  globalThis.__AGENT_NATIVE_UPTIME_MONITOR_SCHEDULED_RUNTIME__ = true;
348
351
 
349
352
  const CRON_TOKEN = ${JSON.stringify(token)};
@@ -443,6 +446,7 @@ function emitRollupBackgroundWorker(token: string) {
443
446
  rmSync(path.join(dest, "server.mjs"), { force: true });
444
447
 
445
448
  const source = `globalThis.__AGENT_NATIVE_BACKGROUND_RUNTIME__ = true;
449
+ globalThis.__AGENT_NATIVE_LOW_CONNECTION_BACKGROUND_RUNTIME__ = true;
446
450
  globalThis.__AGENT_NATIVE_ANALYTICS_ROLLUP_BACKFILL_SCHEDULED_RUNTIME__ = true;
447
451
 
448
452
  const CRON_TOKEN = ${JSON.stringify(token)};
@@ -0,0 +1,104 @@
1
+ -- Builder.io production first-party Analytics warehouse.
2
+ -- Run this once with the authenticated Builder Google Cloud account:
3
+ -- bq query --use_legacy_sql=false < templates/analytics/scripts/first-party-analytics-bigquery.sql
4
+ --
5
+ -- The raw table is append-only. The query view removes retry duplicates by the
6
+ -- stable Postgres event id, and the two aggregate views preserve the existing
7
+ -- dashboard SQL names without writing rollups back to Neon.
8
+
9
+ CREATE SCHEMA IF NOT EXISTS `builder-3b0a2.analytics`
10
+ OPTIONS (location = "US");
11
+
12
+ CREATE TABLE IF NOT EXISTS `builder-3b0a2.analytics.first_party_analytics_events_raw` (
13
+ id STRING NOT NULL,
14
+ public_key_id STRING,
15
+ event_name STRING NOT NULL,
16
+ user_id STRING,
17
+ anonymous_id STRING,
18
+ user_key STRING,
19
+ session_id STRING,
20
+ timestamp TIMESTAMP NOT NULL,
21
+ event_date DATE,
22
+ received_at TIMESTAMP NOT NULL,
23
+ url STRING,
24
+ path STRING,
25
+ hostname STRING,
26
+ referrer STRING,
27
+ app STRING,
28
+ template STRING,
29
+ signed_in STRING,
30
+ properties STRING NOT NULL,
31
+ context STRING NOT NULL,
32
+ owner_email STRING NOT NULL,
33
+ org_id STRING
34
+ )
35
+ PARTITION BY event_date
36
+ CLUSTER BY owner_email, org_id, event_name, app;
37
+
38
+ CREATE OR REPLACE VIEW `builder-3b0a2.analytics.first_party_analytics_events_raw_query` AS
39
+ SELECT * EXCEPT (_row_number)
40
+ FROM (
41
+ SELECT
42
+ raw.*,
43
+ ROW_NUMBER() OVER (PARTITION BY id ORDER BY received_at DESC) AS _row_number
44
+ FROM `builder-3b0a2.analytics.first_party_analytics_events_raw` AS raw
45
+ )
46
+ WHERE _row_number = 1;
47
+
48
+ CREATE OR REPLACE VIEW `builder-3b0a2.analytics.first_party_analytics_events_raw_daily_rollups` AS
49
+ WITH tenant_events AS (
50
+ SELECT
51
+ CASE
52
+ WHEN org_id IS NOT NULL AND org_id <> '' THEN CONCAT('org:', org_id)
53
+ ELSE CONCAT('user:', owner_email)
54
+ END AS tenant_key,
55
+ owner_email,
56
+ org_id,
57
+ event_date,
58
+ event_name,
59
+ COALESCE(app, '') AS app,
60
+ COALESCE(template, '') AS template
61
+ FROM `builder-3b0a2.analytics.first_party_analytics_events_raw_query`
62
+ WHERE event_date IS NOT NULL
63
+ )
64
+ SELECT
65
+ TO_HEX(SHA256(CONCAT(
66
+ tenant_key, '|', CAST(event_date AS STRING), '|', event_name, '|', app,
67
+ '|', template
68
+ ))) AS id,
69
+ tenant_key,
70
+ ANY_VALUE(owner_email) AS owner_email,
71
+ ANY_VALUE(org_id) AS org_id,
72
+ event_date,
73
+ event_name,
74
+ app,
75
+ template,
76
+ COUNT(*) AS event_count
77
+ FROM tenant_events
78
+ GROUP BY tenant_key, event_date, event_name, app, template;
79
+
80
+ CREATE OR REPLACE VIEW `builder-3b0a2.analytics.first_party_analytics_events_raw_user_days` AS
81
+ WITH tenant_user_days AS (
82
+ SELECT
83
+ CASE
84
+ WHEN org_id IS NOT NULL AND org_id <> '' THEN CONCAT('org:', org_id)
85
+ ELSE CONCAT('user:', owner_email)
86
+ END AS tenant_key,
87
+ owner_email,
88
+ org_id,
89
+ event_date,
90
+ user_key
91
+ FROM `builder-3b0a2.analytics.first_party_analytics_events_raw_query`
92
+ WHERE event_date IS NOT NULL AND user_key IS NOT NULL AND user_key <> ''
93
+ )
94
+ SELECT
95
+ TO_HEX(SHA256(CONCAT(
96
+ tenant_key, '|', CAST(event_date AS STRING), '|', user_key
97
+ ))) AS id,
98
+ tenant_key,
99
+ ANY_VALUE(owner_email) AS owner_email,
100
+ ANY_VALUE(org_id) AS org_id,
101
+ event_date,
102
+ user_key
103
+ FROM tenant_user_days
104
+ GROUP BY tenant_key, event_date, user_key;
@@ -29,6 +29,33 @@ registerShareableResource({
29
29
  resourceKind: ANALYTICS_DASHBOARD_AGENT_RESOURCE_KIND,
30
30
  getContextPath: () => ANALYTICS_DASHBOARD_AGENT_CONTEXT_ENDPOINT,
31
31
  },
32
+ persistVisibilityChange: async ({
33
+ resource,
34
+ resourceId,
35
+ visibility,
36
+ update,
37
+ userEmail,
38
+ orgId,
39
+ }) => {
40
+ const { persistDashboardVisibilityChange } =
41
+ await import("../lib/dashboards-store.js");
42
+ await persistDashboardVisibilityChange(
43
+ {
44
+ id: resourceId,
45
+ title: resource.title,
46
+ orgId: resource.orgId ?? null,
47
+ },
48
+ visibility,
49
+ update,
50
+ {
51
+ email: userEmail ?? resource.ownerEmail,
52
+ orgId:
53
+ typeof update.orgId === "string"
54
+ ? update.orgId
55
+ : (orgId ?? resource.orgId ?? null),
56
+ },
57
+ );
58
+ },
32
59
  getDb,
33
60
  });
34
61
 
@@ -43,6 +43,16 @@ export const dashboards = table("dashboards", {
43
43
  ...ownableColumns(),
44
44
  });
45
45
 
46
+ /**
47
+ * Persistent per-name rows serialize concurrent create/rename checks. The row
48
+ * is deliberately independent of dashboard visibility: callers acquire the
49
+ * same lock before applying their access-scoped collision check.
50
+ */
51
+ export const dashboardNameLocks = table("dashboard_name_locks", {
52
+ nameKey: text("name_key").primaryKey(),
53
+ createdAt: text("created_at").notNull().default(now()),
54
+ });
55
+
46
56
  export const dashboardShares = createSharesTable("dashboard_shares");
47
57
 
48
58
  /**
@@ -18,13 +18,11 @@ export const INITIAL_TOOL_NAMES = [
18
18
  // while the agent lazily discovers the next mutating action.
19
19
  "get-sql-dashboard",
20
20
  "list-sql-dashboards",
21
- "list-dashboard-templates",
22
21
  "list-extensions",
23
22
  "get-extension",
24
23
  "update-dashboard",
25
24
  "mutate-dashboard",
26
25
  "compose-dashboard",
27
- "install-dashboard-template",
28
26
  "create-extension",
29
27
  "update-extension",
30
28
  "extension-data-set",