@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
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { getLocaleInitScript } from "../localization/server.js";
10
10
  import { DEFAULT_LOCALE, LOCALE_METADATA, LOCALE_STORAGE_KEY, SUPPORTED_LOCALES, } from "../localization/shared.js";
11
+ import { PASSWORD_MIN_LENGTH } from "../shared/password-policy.js";
11
12
  import { signInJourneyInlineScript } from "../shared/sign-in-journey.js";
12
13
  import { AGENT_NATIVE_SOCIAL_IMAGE_ALT, AGENT_NATIVE_SOCIAL_IMAGE_HEIGHT, AGENT_NATIVE_SOCIAL_IMAGE_PATH, AGENT_NATIVE_SOCIAL_IMAGE_TYPE, AGENT_NATIVE_SOCIAL_IMAGE_WIDTH, withAgentNativeSocialImageCacheBuster, } from "../shared/social-meta.js";
13
14
  import { normalizeAppBasePath } from "./app-base-path.js";
@@ -69,12 +70,12 @@ const EN_AUTH_COPY = {
69
70
  email: "Email",
70
71
  password: "Password",
71
72
  confirmPassword: "Confirm password",
72
- passwordMinPlaceholder: "At least 8 characters",
73
+ passwordMinPlaceholder: `At least ${PASSWORD_MIN_LENGTH} characters`,
73
74
  confirmPasswordPlaceholder: "Confirm password",
74
75
  enterPasswordPlaceholder: "Enter password",
75
- magicLinkTitle: "Sign in with a link",
76
- magicLinkSubtitle: "Enter your email and we'll send you a secure sign-in link",
77
- sendMagicLink: "Email me a sign-in link",
76
+ magicLinkTitle: "Welcome",
77
+ magicLinkSubtitle: "Create an account or sign in",
78
+ sendMagicLink: "Continue",
78
79
  magicLinkSent: "Check your email",
79
80
  magicLinkSentCopy: "We sent a secure sign-in link to",
80
81
  magicLinkFailed: "Could not send sign-in link.",
@@ -165,12 +166,12 @@ const AUTH_LOCALE_COPY = {
165
166
  email: "电子邮箱",
166
167
  password: "密码",
167
168
  confirmPassword: "确认密码",
168
- passwordMinPlaceholder: "至少 8 个字符",
169
+ passwordMinPlaceholder: `至少 ${PASSWORD_MIN_LENGTH} 个字符`,
169
170
  confirmPasswordPlaceholder: "确认密码",
170
171
  enterPasswordPlaceholder: "输入密码",
171
- magicLinkTitle: "使用链接登录",
172
- magicLinkSubtitle: "输入邮箱,我们会发送安全登录链接",
173
- sendMagicLink: "发送登录链接到邮箱",
172
+ magicLinkTitle: "欢迎",
173
+ magicLinkSubtitle: "创建账户或登录",
174
+ sendMagicLink: "继续",
174
175
  magicLinkSent: "检查你的邮箱",
175
176
  magicLinkSentCopy: "我们已向以下邮箱发送安全登录链接:",
176
177
  magicLinkFailed: "无法发送登录链接。",
@@ -259,12 +260,12 @@ const AUTH_LOCALE_COPY = {
259
260
  email: "電子郵件",
260
261
  password: "密碼",
261
262
  confirmPassword: "確認密碼",
262
- passwordMinPlaceholder: "至少 8 個字元",
263
+ passwordMinPlaceholder: `至少 ${PASSWORD_MIN_LENGTH} 個字元`,
263
264
  confirmPasswordPlaceholder: "確認密碼",
264
265
  enterPasswordPlaceholder: "輸入密碼",
265
- magicLinkTitle: "使用連結登入",
266
- magicLinkSubtitle: "輸入電子郵件,我們會寄送安全登入連結",
267
- sendMagicLink: "寄送登入連結",
266
+ magicLinkTitle: "歡迎",
267
+ magicLinkSubtitle: "建立帳戶或登入",
268
+ sendMagicLink: "繼續",
268
269
  magicLinkSent: "檢查你的電子郵件",
269
270
  magicLinkSentCopy: "我們已向以下電子郵件寄送安全登入連結:",
270
271
  magicLinkFailed: "無法寄送登入連結。",
@@ -353,12 +354,12 @@ const AUTH_LOCALE_COPY = {
353
354
  email: "Email",
354
355
  password: "Contraseña",
355
356
  confirmPassword: "Confirmar contraseña",
356
- passwordMinPlaceholder: "Al menos 8 caracteres",
357
+ passwordMinPlaceholder: `Al menos ${PASSWORD_MIN_LENGTH} caracteres`,
357
358
  confirmPasswordPlaceholder: "Confirmar contraseña",
358
359
  enterPasswordPlaceholder: "Introduce la contraseña",
359
- magicLinkTitle: "Inicia sesión con un enlace",
360
- magicLinkSubtitle: "Introduce tu email y te enviaremos un enlace seguro",
361
- sendMagicLink: "Enviarme un enlace de inicio de sesión",
360
+ magicLinkTitle: "Bienvenido",
361
+ magicLinkSubtitle: "Crea una cuenta o inicia sesión",
362
+ sendMagicLink: "Continuar",
362
363
  magicLinkSent: "Revisa tu email",
363
364
  magicLinkSentCopy: "Enviamos un enlace seguro a",
364
365
  magicLinkFailed: "No se pudo enviar el enlace de inicio de sesión.",
@@ -447,12 +448,12 @@ const AUTH_LOCALE_COPY = {
447
448
  email: "E-mail",
448
449
  password: "Mot de passe",
449
450
  confirmPassword: "Confirmer le mot de passe",
450
- passwordMinPlaceholder: "Au moins 8 caractères",
451
+ passwordMinPlaceholder: `Au moins ${PASSWORD_MIN_LENGTH} caractères`,
451
452
  confirmPasswordPlaceholder: "Confirmer le mot de passe",
452
453
  enterPasswordPlaceholder: "Saisir le mot de passe",
453
- magicLinkTitle: "Se connecter avec un lien",
454
- magicLinkSubtitle: "Saisissez votre e-mail et nous vous enverrons un lien sécurisé",
455
- sendMagicLink: "M'envoyer un lien de connexion",
454
+ magicLinkTitle: "Bienvenue",
455
+ magicLinkSubtitle: "Créez un compte ou connectez-vous",
456
+ sendMagicLink: "Continuer",
456
457
  magicLinkSent: "Vérifiez votre e-mail",
457
458
  magicLinkSentCopy: "Nous avons envoyé un lien sécurisé à",
458
459
  magicLinkFailed: "Impossible d'envoyer le lien de connexion.",
@@ -541,12 +542,12 @@ const AUTH_LOCALE_COPY = {
541
542
  email: "E-Mail",
542
543
  password: "Passwort",
543
544
  confirmPassword: "Passwort bestätigen",
544
- passwordMinPlaceholder: "Mindestens 8 Zeichen",
545
+ passwordMinPlaceholder: `Mindestens ${PASSWORD_MIN_LENGTH} Zeichen`,
545
546
  confirmPasswordPlaceholder: "Passwort bestätigen",
546
547
  enterPasswordPlaceholder: "Passwort eingeben",
547
- magicLinkTitle: "Mit einem Link anmelden",
548
- magicLinkSubtitle: "Gib deine E-Mail ein und wir senden dir einen sicheren Anmeldelink",
549
- sendMagicLink: "Anmeldelink per E-Mail senden",
548
+ magicLinkTitle: "Willkommen",
549
+ magicLinkSubtitle: "Konto erstellen oder anmelden",
550
+ sendMagicLink: "Weiter",
550
551
  magicLinkSent: "Prüfe deine E-Mail",
551
552
  magicLinkSentCopy: "Wir haben einen sicheren Anmeldelink gesendet an",
552
553
  magicLinkFailed: "Anmeldelink konnte nicht gesendet werden.",
@@ -635,12 +636,12 @@ const AUTH_LOCALE_COPY = {
635
636
  email: "メール",
636
637
  password: "パスワード",
637
638
  confirmPassword: "パスワードを確認",
638
- passwordMinPlaceholder: "8 文字以上",
639
+ passwordMinPlaceholder: `${PASSWORD_MIN_LENGTH} 文字以上`,
639
640
  confirmPasswordPlaceholder: "パスワードを確認",
640
641
  enterPasswordPlaceholder: "パスワードを入力",
641
- magicLinkTitle: "リンクでサインイン",
642
- magicLinkSubtitle: "メールアドレスを入力すると、安全なサインインリンクを送信します",
643
- sendMagicLink: "サインインリンクをメールで送信",
642
+ magicLinkTitle: "ようこそ",
643
+ magicLinkSubtitle: "アカウントを作成するかサインインしてください",
644
+ sendMagicLink: "続行",
644
645
  magicLinkSent: "メールを確認してください",
645
646
  magicLinkSentCopy: "安全なサインインリンクを送信しました:",
646
647
  magicLinkFailed: "サインインリンクを送信できませんでした。",
@@ -729,12 +730,12 @@ const AUTH_LOCALE_COPY = {
729
730
  email: "이메일",
730
731
  password: "비밀번호",
731
732
  confirmPassword: "비밀번호 확인",
732
- passwordMinPlaceholder: "8자 이상",
733
+ passwordMinPlaceholder: `${PASSWORD_MIN_LENGTH}자 이상`,
733
734
  confirmPasswordPlaceholder: "비밀번호 확인",
734
735
  enterPasswordPlaceholder: "비밀번호 입력",
735
- magicLinkTitle: "링크로 로그인",
736
- magicLinkSubtitle: "이메일을 입력하면 안전한 로그인 링크를 보내드립니다",
737
- sendMagicLink: "로그인 링크 이메일 받기",
736
+ magicLinkTitle: "환영합니다",
737
+ magicLinkSubtitle: "계정을 만들거나 로그인하세요",
738
+ sendMagicLink: "계속",
738
739
  magicLinkSent: "이메일을 확인하세요",
739
740
  magicLinkSentCopy: "안전한 로그인 링크를 보냈습니다:",
740
741
  magicLinkFailed: "로그인 링크를 보낼 수 없습니다.",
@@ -823,12 +824,12 @@ const AUTH_LOCALE_COPY = {
823
824
  email: "Email",
824
825
  password: "Senha",
825
826
  confirmPassword: "Confirmar senha",
826
- passwordMinPlaceholder: "Pelo menos 8 caracteres",
827
+ passwordMinPlaceholder: `Pelo menos ${PASSWORD_MIN_LENGTH} caracteres`,
827
828
  confirmPasswordPlaceholder: "Confirmar senha",
828
829
  enterPasswordPlaceholder: "Digite a senha",
829
- magicLinkTitle: "Entrar com um link",
830
- magicLinkSubtitle: "Digite seu email e enviaremos um link seguro de acesso",
831
- sendMagicLink: "Enviar link de acesso por email",
830
+ magicLinkTitle: "Bem-vindo",
831
+ magicLinkSubtitle: "Crie uma conta ou entre",
832
+ sendMagicLink: "Continuar",
832
833
  magicLinkSent: "Confira seu email",
833
834
  magicLinkSentCopy: "Enviamos um link seguro para",
834
835
  magicLinkFailed: "Não foi possível enviar o link de acesso.",
@@ -917,12 +918,12 @@ const AUTH_LOCALE_COPY = {
917
918
  email: "ईमेल",
918
919
  password: "पासवर्ड",
919
920
  confirmPassword: "पासवर्ड की पुष्टि करें",
920
- passwordMinPlaceholder: "कम से कम 8 अक्षर",
921
+ passwordMinPlaceholder: `कम से कम ${PASSWORD_MIN_LENGTH} अक्षर`,
921
922
  confirmPasswordPlaceholder: "पासवर्ड की पुष्टि करें",
922
923
  enterPasswordPlaceholder: "पासवर्ड दर्ज करें",
923
- magicLinkTitle: "लिंक से साइन इन करें",
924
- magicLinkSubtitle: "अपना ईमेल दर्ज करें और हम सुरक्षित साइन-इन लिंक भेजेंगे",
925
- sendMagicLink: "मुझे साइन-इन लिंक ईमेल करें",
924
+ magicLinkTitle: "स्वागत है",
925
+ magicLinkSubtitle: "खाता बनाएं या साइन इन करें",
926
+ sendMagicLink: "जारी रखें",
926
927
  magicLinkSent: "अपना ईमेल देखें",
927
928
  magicLinkSentCopy: "हमने सुरक्षित साइन-इन लिंक यहां भेजा है:",
928
929
  magicLinkFailed: "साइन-इन लिंक नहीं भेजा जा सका।",
@@ -1011,12 +1012,12 @@ const AUTH_LOCALE_COPY = {
1011
1012
  email: "البريد الإلكتروني",
1012
1013
  password: "كلمة المرور",
1013
1014
  confirmPassword: "تأكيد كلمة المرور",
1014
- passwordMinPlaceholder: "8 أحرف على الأقل",
1015
+ passwordMinPlaceholder: `${PASSWORD_MIN_LENGTH} أحرف على الأقل`,
1015
1016
  confirmPasswordPlaceholder: "تأكيد كلمة المرور",
1016
1017
  enterPasswordPlaceholder: "أدخل كلمة المرور",
1017
- magicLinkTitle: "تسجيل الدخول باستخدام رابط",
1018
- magicLinkSubtitle: "أدخل بريدك الإلكتروني وسنرسل لك رابط تسجيل دخول آمنًا",
1019
- sendMagicLink: "إرسال رابط تسجيل الدخول إلى بريدي",
1018
+ magicLinkTitle: "مرحبًا",
1019
+ magicLinkSubtitle: "أنشئ حسابًا أو سجّل الدخول",
1020
+ sendMagicLink: "متابعة",
1020
1021
  magicLinkSent: "تحقق من بريدك الإلكتروني",
1021
1022
  magicLinkSentCopy: "أرسلنا رابط تسجيل دخول آمنًا إلى",
1022
1023
  magicLinkFailed: "تعذر إرسال رابط تسجيل الدخول.",
@@ -1216,6 +1217,7 @@ export function getOnboardingHtml(opts = {}) {
1216
1217
  const googleOnly = !!opts.googleOnly;
1217
1218
  const authMode = opts.authMode ?? "password";
1218
1219
  const magicLinkMode = authMode === "magic-link";
1220
+ const simplifiedAuth = opts.initialPrompt === true;
1219
1221
  // In a Google-only app, Google is the sole sign-in method, so always render
1220
1222
  // a working button — never gate it on env vars detected at render time. The
1221
1223
  // login page is a public, CDN-cacheable shell served to everyone (per-user
@@ -1234,7 +1236,7 @@ export function getOnboardingHtml(opts = {}) {
1234
1236
  requestHost: opts.requestHost,
1235
1237
  requestPath: opts.requestPath,
1236
1238
  });
1237
- const hasMarketing = !!marketing;
1239
+ const hasMarketing = !!marketing && !simplifiedAuth;
1238
1240
  const marketingSlug = resolveBuiltInMarketingSlug(marketing);
1239
1241
  const defaultMarketingCopy = marketing
1240
1242
  ? {
@@ -1313,6 +1315,13 @@ ${localeMenuItemsHtml}
1313
1315
  const signupLegalNoteHtml = signupLegalNotice
1314
1316
  ? ` <p class="legal-note">${localizedValue(signupLegalNotice.prefix, "legalPrefix")} <a href="${esc(signupLegalNotice.termsUrl)}" target="_blank" rel="noreferrer"${localizedAnchorLabel(signupLegalNotice.termsLabel, "legalTerms")}</a> ${localizedValue(signupLegalNotice.connector, "legalConnector")} <a href="${esc(signupLegalNotice.privacyUrl)}" target="_blank" rel="noreferrer"${localizedAnchorLabel(signupLegalNotice.privacyLabel, "legalPrivacy")}</a>${localizedValue(signupLegalNotice.suffix, "legalSuffix")}</p>`
1315
1317
  : "";
1318
+ const magicLinkSuccessHtml = magicLinkMode
1319
+ ? ` <div class="magic-link-success" id="magic-link-success" aria-live="polite" hidden>
1320
+ <p class="magic-link-success-copy"><span${i18nAttr("magicLinkSentCopy")}>${esc(t("magicLinkSentCopy"))}</span> <strong id="magic-link-success-email"></strong>.</p>
1321
+ <button type="button" class="link-button magic-link-back" id="magic-link-back"${i18nAttr("back")}>${esc(t("back"))}</button>
1322
+ </div>
1323
+ `
1324
+ : "";
1316
1325
  const signupLocalModeNoteHtml = signupLocalModeNote
1317
1326
  ? ` <div class="signup-local-mode-note" id="signup-local-mode-note" data-command="${esc(signupLocalModeNote.command)}">
1318
1327
  <p>${esc(signupLocalModeNote.text)}</p>
@@ -1371,6 +1380,9 @@ ${googleNoticeRunLocalPanelHtml}
1371
1380
  </div>`
1372
1381
  : "";
1373
1382
  const identitySsoHtml = identitySsoLoginButtonHtml();
1383
+ const identitySsoMagicLinkSelector = identitySsoHtml
1384
+ ? " .card.magic-link-complete #identity-sso-btn,\n"
1385
+ : "";
1374
1386
  const identitySsoScript = identitySsoHtml
1375
1387
  ? `
1376
1388
  function __anIdentitySsoUrl() {
@@ -1914,6 +1926,7 @@ ${hasMarketing
1914
1926
  background: rgba(255,255,255,0.06);
1915
1927
  border-radius: 8px;
1916
1928
  }
1929
+ .tabs[hidden] { display: none; }
1917
1930
  .tab {
1918
1931
  flex: 1;
1919
1932
  padding: 0.5rem 0.75rem;
@@ -1981,11 +1994,12 @@ ${hasMarketing
1981
1994
  }
1982
1995
  .btn-secondary:hover { color: #bbb; border-color: rgba(255,255,255,0.2); }
1983
1996
  .legal-note {
1984
- margin-top: 0.625rem;
1997
+ margin-top: 0.375rem;
1998
+ margin-bottom: 0.875rem;
1985
1999
  color: #666;
1986
2000
  font-size: 0.6875rem;
1987
2001
  line-height: 1.45;
1988
- text-align: center;
2002
+ text-align: start;
1989
2003
  }
1990
2004
  .legal-note a {
1991
2005
  color: #777;
@@ -2124,8 +2138,45 @@ ${hasMarketing
2124
2138
  text-decoration: underline;
2125
2139
  text-underline-offset: 2px;
2126
2140
  }
2141
+ .auth-mode-link { text-decoration: none; }
2127
2142
  .link-button:hover { color: #bbb; }
2128
2143
  .link-button:disabled { cursor: wait; opacity: 0.5; }
2144
+ .magic-link-submit { display: none; }
2145
+ .magic-link-submit.is-visible { display: block; }
2146
+ .magic-link-success { display: none; }
2147
+ .magic-link-success.is-visible { display: block; }
2148
+ .magic-link-success-copy {
2149
+ margin: 0;
2150
+ color: rgba(255,255,255,0.62); /* guard:allow-raw-color - standalone auth HTML has no app theme token layer */
2151
+ font-size: 0.875rem;
2152
+ line-height: 1.5;
2153
+ }
2154
+ .magic-link-success-copy strong {
2155
+ color: inherit;
2156
+ font-weight: 600;
2157
+ overflow-wrap: anywhere;
2158
+ }
2159
+ .magic-link-back {
2160
+ margin-top: 1.5rem;
2161
+ text-decoration: none;
2162
+ }
2163
+ .btn-google.magic-link-secondary {
2164
+ background: transparent;
2165
+ color: inherit;
2166
+ border: 1px solid rgba(255,255,255,0.16); /* guard:allow-raw-color - standalone auth HTML has no app theme token layer */
2167
+ }
2168
+ .btn-google.magic-link-secondary:hover {
2169
+ background: rgba(255,255,255,0.05); /* guard:allow-raw-color - standalone auth HTML has no app theme token layer */
2170
+ }
2171
+ .card.magic-link-complete .subtitle,
2172
+ .card.magic-link-complete #google-signin,
2173
+ ${identitySsoMagicLinkSelector}
2174
+ .card.magic-link-complete #auth-divider,
2175
+ .card.magic-link-complete #auth-tabs,
2176
+ .card.magic-link-complete #upgrade-note,
2177
+ .card.magic-link-complete .form {
2178
+ display: none;
2179
+ }
2129
2180
  .divider {
2130
2181
  display: flex;
2131
2182
  align-items: center;
@@ -2323,14 +2374,18 @@ ${hasMarketing
2323
2374
  .local-note a { color: #888; text-decoration: none; }
2324
2375
  .local-note a:hover { color: #bbb; }
2325
2376
  ${marketingStyles}
2377
+ /* guard:allow-raw-color - standalone auth HTML has no app theme token layer */
2378
+ body.simplified-auth { background: #141414; }
2379
+ body.simplified-auth .card { border-color: transparent; box-shadow: none; }
2380
+ body.simplified-auth .local-note { display: none !important; }
2326
2381
  </style>
2327
2382
  </head>
2328
- <body${hasMarketing ? ' class="has-marketing"' : ""}>
2383
+ <body${simplifiedAuth ? ' class="simplified-auth"' : hasMarketing ? ' class="has-marketing"' : ""}>
2329
2384
  ${localePickerHtml}
2330
2385
  ${marketingPanelHtml}
2331
2386
  <div class="card">
2332
- <h1 id="heading"${i18nAttr(googleOnly ? "signInTitle" : magicLinkMode ? "magicLinkTitle" : "welcomeTitle")}>${esc(t(googleOnly ? "signInTitle" : magicLinkMode ? "magicLinkTitle" : "welcomeTitle"))}</h1>
2333
- <p class="subtitle" id="subtitle"${i18nAttr(googleOnly ? "googleOnlySubtitle" : magicLinkMode ? "magicLinkSubtitle" : "createAccountSubtitle")}>${esc(t(googleOnly ? "googleOnlySubtitle" : magicLinkMode ? "magicLinkSubtitle" : "createAccountSubtitle"))}</p>
2387
+ <h1 id="heading"${i18nAttr(googleOnly ? "signInTitle" : "welcomeTitle")}>${esc(t(googleOnly ? "signInTitle" : "welcomeTitle"))}</h1>
2388
+ <p class="subtitle" id="subtitle"${i18nAttr(googleOnly ? "googleOnlySubtitle" : "createAccountSubtitle")}>${esc(t(googleOnly ? "googleOnlySubtitle" : "createAccountSubtitle"))}</p>
2334
2389
  <p
2335
2390
  class="upgrade-note"
2336
2391
  id="upgrade-note"
@@ -2354,7 +2409,7 @@ ${googleOnly ? "" : `\n <div class="divider" id="auth-divider"${i18nAttr("divid
2354
2409
  : ""}
2355
2410
  ${googleOnly
2356
2411
  ? ""
2357
- : `${magicLinkMode ? '\n <form id="magic-link-form" class="form">\n <label for="m-email"' + i18nAttr("email") + ">" + esc(t("email")) + '</label>\n <input id="m-email" type="email" autocomplete="email" autofocus placeholder="you@example.com" required />\n <button type="submit"' + i18nAttr("sendMagicLink") + ">" + esc(t("sendMagicLink")) + '</button>\n <p class="msg" id="m-msg"></p>\n <p style="margin-top:0.75rem;font-size:0.75rem;text-align:center">\n <a href="#" id="use-password-link" class="link-button"' + i18nAttr("usePasswordInstead") + ">" + esc(t("usePasswordInstead")) + "</a>\n </p>\n </form>\n" : ""} <div class="tabs"${magicLinkMode ? " hidden" : ""}>
2412
+ : `${magicLinkMode ? '\n <form id="magic-link-form" class="form">\n <label for="m-email"' + i18nAttr("email") + ">" + esc(t("email")) + '</label>\n <input id="m-email" type="email" autocomplete="email" autofocus placeholder="you@example.com" required />\n <button type="submit" id="magic-link-submit" class="magic-link-submit"' + i18nAttr("sendMagicLink") + ">" + esc(t("sendMagicLink")) + '</button>\n <p class="msg" id="m-msg"></p>\n' + signupLegalNoteHtml + '\n <p style="margin-top:0.75rem;font-size:0.75rem;text-align:start">\n <a href="#" id="use-password-link" class="link-button auth-mode-link"' + i18nAttr("usePasswordInstead") + ">" + esc(t("usePasswordInstead")) + "</a>\n </p>\n </form>\n" : ""}${magicLinkSuccessHtml} <div class="tabs" id="auth-tabs">
2358
2413
  <button class="tab" data-tab="signup"${i18nAttr("createAccount")}>${esc(t("createAccount"))}</button>
2359
2414
  <button class="tab" data-tab="login"${i18nAttr("signIn")}>${esc(t("signIn"))}</button>
2360
2415
  </div>
@@ -2363,9 +2418,9 @@ ${googleOnly
2363
2418
  <label for="s-email"${i18nAttr("email")}>${esc(t("email"))}</label>
2364
2419
  <input id="s-email" type="email" autocomplete="email" autofocus placeholder="you@example.com" required />
2365
2420
  <label for="s-pass"${i18nAttr("password")}>${esc(t("password"))}</label>
2366
- <input id="s-pass" type="password" autocomplete="new-password" placeholder="${esc(t("passwordMinPlaceholder"))}"${i18nPlaceholderAttr("passwordMinPlaceholder")} required minlength="8" />
2421
+ <input id="s-pass" type="password" autocomplete="new-password" placeholder="${esc(t("passwordMinPlaceholder"))}"${i18nPlaceholderAttr("passwordMinPlaceholder")} required minlength="${PASSWORD_MIN_LENGTH}" />
2367
2422
  <label for="s-pass2"${i18nAttr("confirmPassword")}>${esc(t("confirmPassword"))}</label>
2368
- <input id="s-pass2" type="password" autocomplete="new-password" placeholder="${esc(t("confirmPasswordPlaceholder"))}"${i18nPlaceholderAttr("confirmPasswordPlaceholder")} required minlength="8" />
2423
+ <input id="s-pass2" type="password" autocomplete="new-password" placeholder="${esc(t("confirmPasswordPlaceholder"))}"${i18nPlaceholderAttr("confirmPasswordPlaceholder")} required minlength="${PASSWORD_MIN_LENGTH}" />
2369
2424
  <button type="submit"${i18nAttr("createAccount")}>${esc(t("createAccount"))}</button>
2370
2425
  ${signupLegalNoteHtml}
2371
2426
  ${signupLocalModeNoteHtml}
@@ -2453,7 +2508,7 @@ ${signInJourneyInlineScript()}
2453
2508
  var __anAuthLocale = __AN_AUTH_DEFAULT_LOCALE;
2454
2509
  var __anAuthLocalePreference = 'system';
2455
2510
  var __AN_AUTH_MODE = ${JSON.stringify(authMode)};
2456
- var __anAuthView = ${JSON.stringify(googleOnly ? "googleOnly" : magicLinkMode ? "magicLink" : "signup")};
2511
+ var __anAuthView = ${JSON.stringify(googleOnly ? "googleOnly" : "signup")};
2457
2512
  function __anAuthLocaleIsSupported(value) {
2458
2513
  return __AN_AUTH_SUPPORTED_LOCALES.indexOf(value) !== -1;
2459
2514
  }
@@ -2521,6 +2576,7 @@ ${signInJourneyInlineScript()}
2521
2576
  if (view === 'forgot') return { heading: 'resetPasswordTitle', subtitle: 'resetPasswordSubtitle' };
2522
2577
  if (view === 'verification') return { heading: 'checkEmailTitle', subtitle: 'finishAccountSubtitle' };
2523
2578
  if (view === 'googleOnly') return { heading: 'signInTitle', subtitle: 'googleOnlySubtitle' };
2579
+ if (view === 'magicLinkSent') return { heading: 'magicLinkSent', subtitle: 'magicLinkSentCopy' };
2524
2580
  if (view === 'magicLink') return { heading: 'magicLinkTitle', subtitle: 'magicLinkSubtitle' };
2525
2581
  return { heading: 'welcomeTitle', subtitle: 'createAccountSubtitle' };
2526
2582
  }
@@ -3142,19 +3198,59 @@ ${googleOnly
3142
3198
  function clearRememberedPendingSignupEmail() {
3143
3199
  rememberPendingSignupEmail('');
3144
3200
  }
3201
+ function hideMagicLinkSuccess() {
3202
+ var card = document.querySelector('.card');
3203
+ if (card) card.classList.remove('magic-link-complete');
3204
+ var success = document.getElementById('magic-link-success');
3205
+ if (success) {
3206
+ success.classList.remove('is-visible');
3207
+ success.setAttribute('hidden', '');
3208
+ }
3209
+ }
3210
+ function showMagicLinkSuccess(email) {
3211
+ var card = document.querySelector('.card');
3212
+ if (card) card.classList.add('magic-link-complete');
3213
+ var success = document.getElementById('magic-link-success');
3214
+ var successEmail = document.getElementById('magic-link-success-email');
3215
+ if (successEmail && typeof email === 'string') successEmail.textContent = email;
3216
+ if (success) {
3217
+ success.removeAttribute('hidden');
3218
+ success.classList.add('is-visible');
3219
+ }
3220
+ forms.forEach(function(x) { x.classList.remove('active'); });
3221
+ var authTabs = document.getElementById('auth-tabs');
3222
+ if (authTabs) authTabs.hidden = true;
3223
+ __anSetAuthView('magicLinkSent');
3224
+ }
3145
3225
  function showMagicLinkForm() {
3146
3226
  var form = document.getElementById('magic-link-form');
3147
3227
  if (!form) return;
3228
+ hideMagicLinkSuccess();
3148
3229
  forms.forEach(function(x) { x.classList.remove('active'); });
3149
3230
  form.classList.add('active');
3231
+ var authTabs = document.getElementById('auth-tabs');
3232
+ if (authTabs) authTabs.hidden = true;
3233
+ updateMagicLinkSubmitState();
3150
3234
  __anSetAuthView('magicLink');
3151
3235
  }
3236
+ function updateMagicLinkSubmitState() {
3237
+ var emailInput = document.getElementById('m-email');
3238
+ var button = document.getElementById('magic-link-submit');
3239
+ if (!emailInput || !button) return;
3240
+ var isValid = __anIsValidAuthEmail(emailInput.value);
3241
+ button.classList.toggle('is-visible', isValid);
3242
+ button.setAttribute('aria-hidden', isValid ? 'false' : 'true');
3243
+ var googleButton = document.getElementById('google-btn');
3244
+ if (googleButton) googleButton.classList.toggle('magic-link-secondary', isValid);
3245
+ }
3152
3246
  function setActiveTab(name, opts) {
3153
3247
  if (name !== 'signup' && name !== 'login') return;
3154
3248
  var form = document.getElementById(name + '-form');
3155
3249
  if (!form) return;
3156
3250
  var card = document.querySelector('.card');
3157
3251
  if (card) card.classList.remove('verifying');
3252
+ var authTabs = document.getElementById('auth-tabs');
3253
+ if (authTabs) authTabs.hidden = false;
3158
3254
  tabs.forEach(function(x) { x.classList.remove('active'); });
3159
3255
  forms.forEach(function(x) { x.classList.remove('active'); });
3160
3256
  var btn = document.querySelector('.tab[data-tab="' + name + '"]');
@@ -3402,7 +3498,7 @@ ${googleOnly
3402
3498
  }
3403
3499
  }
3404
3500
  (function initActiveTab() {
3405
- var initial = __AN_AUTH_MODE === 'magic-link' ? 'magicLink' : 'signup';
3501
+ var initial = 'signup';
3406
3502
  try {
3407
3503
  var params = new URLSearchParams(location.search);
3408
3504
  var qp = params.get('tab');
@@ -3421,8 +3517,7 @@ ${googleOnly
3421
3517
  if (stored === 'login' || stored === 'signup') initial = stored;
3422
3518
  }
3423
3519
  } catch (e) {}
3424
- if (initial === 'magicLink') showMagicLinkForm();
3425
- else setActiveTab(initial, { persist: false });
3520
+ setActiveTab(initial, { persist: false });
3426
3521
  try {
3427
3522
  if (__anIsVerifiedRedirectSuccess()) {
3428
3523
  var rememberedEmail = readRememberedPendingSignupEmail();
@@ -3455,8 +3550,22 @@ ${googleOnly
3455
3550
  e.preventDefault();
3456
3551
  showMagicLinkForm();
3457
3552
  });
3553
+ var magicLinkBack = document.getElementById('magic-link-back');
3554
+ if (magicLinkBack) magicLinkBack.addEventListener('click', function(e) {
3555
+ e.preventDefault();
3556
+ var magicLinkEmailInput = document.getElementById('m-email');
3557
+ if (magicLinkEmailInput) magicLinkEmailInput.value = '';
3558
+ showMagicLinkForm();
3559
+ if (magicLinkEmailInput) magicLinkEmailInput.focus();
3560
+ });
3458
3561
 
3459
3562
  var magicLinkForm = document.getElementById('magic-link-form');
3563
+ var magicLinkEmail = document.getElementById('m-email');
3564
+ if (magicLinkEmail) {
3565
+ magicLinkEmail.addEventListener('input', updateMagicLinkSubmitState);
3566
+ magicLinkEmail.addEventListener('change', updateMagicLinkSubmitState);
3567
+ updateMagicLinkSubmitState();
3568
+ }
3460
3569
  if (magicLinkForm) magicLinkForm.addEventListener('submit', async function(e) {
3461
3570
  e.preventDefault();
3462
3571
  var btn = magicLinkForm.querySelector('button[type="submit"]');
@@ -3482,9 +3591,9 @@ ${googleOnly
3482
3591
  return null;
3483
3592
  });
3484
3593
  if (res.ok) {
3485
- msg.textContent = __anT('magicLinkSent') + '. ' + __anT('magicLinkSentCopy') + ' ' + email + '.';
3486
- msg.classList.add('show', 'success');
3487
- btn.textContent = __anT('sent');
3594
+ btn.disabled = false;
3595
+ btn.textContent = originalLabel;
3596
+ showMagicLinkSuccess(email);
3488
3597
  return;
3489
3598
  }
3490
3599
  msg.textContent = (data && (data.error || data.message)) || __anT('magicLinkFailed');
@@ -3895,9 +4004,9 @@ export function getResetPasswordHtml() {
3895
4004
  <p class="subtitle">Set a new password for your account.</p>
3896
4005
  <form id="reset-form">
3897
4006
  <label for="p1">New password</label>
3898
- <input id="p1" type="password" autocomplete="new-password" autofocus placeholder="At least 8 characters" required minlength="8" />
4007
+ <input id="p1" type="password" autocomplete="new-password" autofocus placeholder="At least ${PASSWORD_MIN_LENGTH} characters" required minlength="${PASSWORD_MIN_LENGTH}" />
3899
4008
  <label for="p2">Confirm password</label>
3900
- <input id="p2" type="password" autocomplete="new-password" placeholder="Confirm password" required minlength="8" />
4009
+ <input id="p2" type="password" autocomplete="new-password" placeholder="Confirm password" required minlength="${PASSWORD_MIN_LENGTH}" />
3901
4010
  <button type="submit">Save new password</button>
3902
4011
  <p class="msg" id="msg"></p>
3903
4012
  </form>
@@ -26,8 +26,8 @@ export declare function createRealtimeTokenHandler(): import("h3").EventHandlerW
26
26
  expiresAt?: undefined;
27
27
  ttlSeconds?: undefined;
28
28
  } | {
29
- error?: undefined;
30
29
  token: string;
31
30
  expiresAt: string;
32
31
  ttlSeconds: number;
32
+ error?: undefined;
33
33
  }>>;
@@ -7,10 +7,11 @@
7
7
  */
8
8
  export declare const DEFAULT_DISPATCH_SETTLE_MS = 250;
9
9
  /**
10
- * Resolve the base URL to fire a self-dispatch request at. Prefers explicit env
11
- * vars (most reliable on serverless, where inbound host headers can be the
12
- * platform's internal hostname), falling back to the inbound request headers
13
- * and finally localhost in dev.
10
+ * Resolve the base URL to fire a self-dispatch request at. Prefer the URL for
11
+ * this exact deploy before stable app URLs: a preview or in-flight deploy must
12
+ * not send a token minted by its function fleet to a different deploy that
13
+ * happens to serve the same public hostname. Fall back to the inbound request
14
+ * headers and finally localhost in dev.
14
15
  *
15
16
  * Throws in production / shared deployments when no env var is set — a silent
16
17
  * fallback to a bad host there would drop background work invisibly.
@@ -47,23 +47,26 @@ function readHeader(event, name) {
47
47
  }
48
48
  }
49
49
  /**
50
- * Resolve the base URL to fire a self-dispatch request at. Prefers explicit env
51
- * vars (most reliable on serverless, where inbound host headers can be the
52
- * platform's internal hostname), falling back to the inbound request headers
53
- * and finally localhost in dev.
50
+ * Resolve the base URL to fire a self-dispatch request at. Prefer the URL for
51
+ * this exact deploy before stable app URLs: a preview or in-flight deploy must
52
+ * not send a token minted by its function fleet to a different deploy that
53
+ * happens to serve the same public hostname. Fall back to the inbound request
54
+ * headers and finally localhost in dev.
54
55
  *
55
56
  * Throws in production / shared deployments when no env var is set — a silent
56
57
  * fallback to a bad host there would drop background work invisibly.
57
58
  */
58
59
  export function resolveSelfDispatchBaseUrl(event) {
59
- const fromEnv = process.env.APP_URL ||
60
- process.env.URL ||
60
+ const fromEnv = process.env.DEPLOY_PRIME_URL ||
61
61
  process.env.DEPLOY_URL ||
62
+ process.env.URL ||
63
+ process.env.APP_URL ||
62
64
  process.env.BETTER_AUTH_URL;
63
65
  if (fromEnv)
64
66
  return withConfiguredAppBasePath(String(fromEnv));
65
67
  if (process.env.NODE_ENV === "production" || !isLocalDatabase()) {
66
- throw new Error("Self-dispatch requires APP_URL, URL, DEPLOY_URL, or BETTER_AUTH_URL in " +
68
+ throw new Error("Self-dispatch requires DEPLOY_PRIME_URL, DEPLOY_URL, URL, APP_URL, or " +
69
+ "BETTER_AUTH_URL in " +
67
70
  "production/shared deployments so background work can reach this " +
68
71
  "deployment's own URL.");
69
72
  }
@@ -88,9 +91,10 @@ async function dispatchResponseError(path, res) {
88
91
  * may take minutes); it is only raced against a short settle timer so the
89
92
  * request reliably leaves a serverless box before it freezes.
90
93
  *
91
- * When `A2A_SECRET` is unset (local dev), the request is sent unsigned — the
92
- * processor accepts unsigned dispatches in dev and relies on the SQL atomic
93
- * claim for double-processing protection, mirroring the A2A/webhook flow.
94
+ * When `A2A_SECRET` is unset in local SQLite development, the request is sent
95
+ * unsigned — the processor accepts unsigned dispatches in dev and relies on
96
+ * the SQL atomic claim for double-processing protection. Shared and production
97
+ * dispatches fail before sending an unauthenticated request.
94
98
  */
95
99
  /**
96
100
  * For host-root dispatch targets (`/.netlify/functions/*`), strip the configured
@@ -127,10 +131,17 @@ export async function fireInternalDispatch(options) {
127
131
  headers["Authorization"] = `Bearer ${signInternalToken(options.taskId)}`;
128
132
  }
129
133
  catch (err) {
130
- // Distinguish the documented "no A2A_SECRET in dev" path from a real
131
- // signing failure, so a malformed secret doesn't fail invisibly.
132
- if (err instanceof Error && !/A2A_SECRET/i.test(err.message)) {
133
- console.error(`[self-dispatch] signInternalToken failed unexpectedly for ${options.taskId}:`, err);
134
+ const detail = err instanceof Error ? err.message : String(err);
135
+ // Only local SQLite development has the loopback/unsigned exception. A
136
+ // shared database or production deployment must never turn a signing
137
+ // failure into an unauthenticated processor request.
138
+ if (process.env.NODE_ENV !== "production" &&
139
+ isLocalDatabase() &&
140
+ /A2A_SECRET/i.test(detail)) {
141
+ // The processor applies the matching trusted-local policy.
142
+ }
143
+ else {
144
+ throw new Error(`[self-dispatch] Cannot sign processor handoff for ${options.taskId}: ${detail}`, { cause: err });
134
145
  }
135
146
  }
136
147
  const awaitResponse = options.awaitResponse === true;
@@ -1,4 +1,4 @@
1
- export { DEFAULT_SSR_CACHE_HEADERS, DEFAULT_SPECULATION_RULES_HEADER, DEFAULT_SSR_CACHE_CONTROL, DISABLED_SSR_CACHE_HEADERS, isSsrCacheEnabled, resolveSsrCacheHeaders, SSR_CACHE_ENV_VAR, } from "../shared/cache-control.js";
1
+ export { DEFAULT_SSR_CACHE_HEADERS, DEFAULT_SPECULATION_RULES_HEADER, DEFAULT_SSR_CACHE_CONTROL, DISABLED_SSR_CACHE_HEADERS, isSsrCacheEnabled, resolveSsrCacheHeaders, resolveSsrCacheKeyHeaders, SSR_CACHE_ENV_VAR, } from "../shared/cache-control.js";
2
2
  /**
3
3
  * Create an h3 catch-all that hands page routes to React Router and
4
4
  * returns 404 for framework / asset paths that React Router doesn't own.
@@ -25,7 +25,7 @@ import { captureError } from "./capture-error.js";
25
25
  import { getPostHogClientConfigScript } from "./posthog-config.js";
26
26
  import { runWithRequestContext } from "./request-context.js";
27
27
  import { getRealtimeClientConfigScript, getSentryClientConfigScript, } from "./sentry-config.js";
28
- export { DEFAULT_SSR_CACHE_HEADERS, DEFAULT_SPECULATION_RULES_HEADER, DEFAULT_SSR_CACHE_CONTROL, DISABLED_SSR_CACHE_HEADERS, isSsrCacheEnabled, resolveSsrCacheHeaders, SSR_CACHE_ENV_VAR, } from "../shared/cache-control.js";
28
+ export { DEFAULT_SSR_CACHE_HEADERS, DEFAULT_SPECULATION_RULES_HEADER, DEFAULT_SSR_CACHE_CONTROL, DISABLED_SSR_CACHE_HEADERS, isSsrCacheEnabled, resolveSsrCacheHeaders, resolveSsrCacheKeyHeaders, SSR_CACHE_ENV_VAR, } from "../shared/cache-control.js";
29
29
  function getAppBasePath() {
30
30
  return getAppBasePathFromViteEnv();
31
31
  }
@@ -249,7 +249,7 @@ export async function handleWorkspaceProviderOAuthCallback(event, providerId) {
249
249
  });
250
250
  }
251
251
  const returnPath = state.returnUrl ??
252
- `/settings?connected=${encodeURIComponent(providerId)}#integrations`;
252
+ `/settings/integrations?connected=${encodeURIComponent(providerId)}`;
253
253
  return Response.redirect(getAppUrl(event, returnPath), 302);
254
254
  });
255
255
  }
@@ -1,5 +1,5 @@
1
1
  import { registerOnboardingStep } from "../onboarding/registry.js";
2
- export function registerWorkspaceConnectionOnboardingStep({ id, providerId, providerLabel, title, description, order = 50, required = false, settingsUrl = "/settings#integrations", isComplete, }) {
2
+ export function registerWorkspaceConnectionOnboardingStep({ id, providerId, providerLabel, title, description, order = 50, required = false, settingsUrl = "/settings/integrations", isComplete, }) {
3
3
  const label = providerLabel ?? providerId;
4
4
  registerOnboardingStep({
5
5
  id: id ?? `${providerId}-connection`,