@agent-native/core 0.137.7 → 0.138.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 (446) hide show
  1. package/agent-native.eject.json +2 -0
  2. package/corpus/README.md +1 -1
  3. package/corpus/templates/analytics/.agents/skills/agent-native-docs/SKILL.md +23 -3
  4. package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  5. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +15 -0
  6. package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +23 -2
  7. package/corpus/templates/analytics/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  8. package/corpus/templates/analytics/AGENTS.md +2 -2
  9. package/corpus/templates/analytics/actions/get-first-party-analytics-health.ts +65 -0
  10. package/corpus/templates/analytics/actions/provider-api-catalog.ts +3 -6
  11. package/corpus/templates/analytics/actions/provider-api-docs.ts +3 -6
  12. package/corpus/templates/analytics/actions/provider-api-request.ts +3 -6
  13. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +3 -3
  14. package/corpus/templates/analytics/agent-native.json +12 -0
  15. package/corpus/templates/analytics/app/i18n-data.ts +162 -0
  16. package/corpus/templates/analytics/app/pages/DataSources.tsx +126 -1
  17. package/corpus/templates/analytics/changelog/2026-08-05-analytics-now-flags-neon-pressure-and-guides-high-volume-tra.md +6 -0
  18. package/corpus/templates/analytics/changelog/2026-08-05-first-party-analytics-uses-compact-rollups-for-faster-usage-.md +6 -0
  19. package/corpus/templates/analytics/server/db/schema.ts +52 -0
  20. package/corpus/templates/analytics/server/lib/credential-keys.ts +3 -0
  21. package/corpus/templates/analytics/server/lib/first-party-analytics-health.ts +397 -0
  22. package/corpus/templates/analytics/server/lib/first-party-analytics-rollups.ts +182 -0
  23. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +86 -15
  24. package/corpus/templates/analytics/server/lib/provider-api.ts +20 -1
  25. package/corpus/templates/analytics/server/lib/replay-storage.ts +1 -1
  26. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
  27. package/corpus/templates/analytics/server/plugins/db.ts +60 -0
  28. package/corpus/templates/assets/.agents/skills/agent-native-docs/SKILL.md +23 -3
  29. package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  30. package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +23 -2
  31. package/corpus/templates/assets/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  32. package/corpus/templates/assets/agent-native.json +12 -0
  33. package/corpus/templates/assets/server/lib/generation.ts +8 -8
  34. package/corpus/templates/assets/server/lib/storage.ts +1 -1
  35. package/corpus/templates/assets/server/plugins/onboarding.ts +1 -1
  36. package/corpus/templates/brain/.agents/skills/agent-native-docs/SKILL.md +23 -3
  37. package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  38. package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +23 -2
  39. package/corpus/templates/brain/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  40. package/corpus/templates/brain/agent-native.json +12 -0
  41. package/corpus/templates/calendar/.agents/skills/agent-native-docs/SKILL.md +23 -3
  42. package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  43. package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +23 -2
  44. package/corpus/templates/calendar/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  45. package/corpus/templates/calendar/agent-native.json +12 -0
  46. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +23 -3
  47. package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  48. package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +23 -2
  49. package/corpus/templates/chat/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  50. package/corpus/templates/chat/AGENTS.md +3 -0
  51. package/corpus/templates/chat/DESIGN.md +28 -0
  52. package/corpus/templates/chat/agent-native.json +12 -0
  53. package/corpus/templates/clips/.agents/skills/agent-native-docs/SKILL.md +23 -3
  54. package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  55. package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +23 -2
  56. package/corpus/templates/clips/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  57. package/corpus/templates/clips/actions/cleanup-transcript.ts +2 -2
  58. package/corpus/templates/clips/actions/delete-recording-permanent.ts +3 -0
  59. package/corpus/templates/clips/actions/get-playback-position.ts +68 -0
  60. package/corpus/templates/clips/actions/import-loom-recording.ts +2 -2
  61. package/corpus/templates/clips/actions/save-playback-position.ts +80 -0
  62. package/corpus/templates/clips/actions/set-thumbnail.ts +1 -1
  63. package/corpus/templates/clips/agent-native.json +12 -0
  64. package/corpus/templates/clips/app/components/player/video-player.tsx +54 -5
  65. package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +65 -18
  66. package/corpus/templates/clips/app/hooks/use-playback-position.ts +188 -0
  67. package/corpus/templates/clips/app/hooks/use-view-tracking.ts +6 -24
  68. package/corpus/templates/clips/app/i18n/en-US.ts +4 -0
  69. package/corpus/templates/clips/app/lib/playback-position.ts +99 -0
  70. package/corpus/templates/clips/app/lib/viewer-session.ts +29 -0
  71. package/corpus/templates/clips/changelog/2026-08-05-clip-buffering-now-uses-buffering-copy-after-playback.md +6 -0
  72. package/corpus/templates/clips/changelog/2026-08-05-clips-remembers-your-playback-position-when-you-reopen-a-cli.md +6 -0
  73. package/corpus/templates/clips/desktop/package.json +1 -0
  74. package/corpus/templates/clips/desktop/src/app.tsx +70 -6
  75. package/corpus/templates/clips/desktop/src/components/AlertDialog.tsx +131 -0
  76. package/corpus/templates/clips/desktop/src/styles.css +129 -0
  77. package/corpus/templates/clips/learnings.defaults.md +1 -1
  78. package/corpus/templates/clips/server/db/schema.ts +18 -0
  79. package/corpus/templates/clips/server/lib/public-agent-context.ts +1 -1
  80. package/corpus/templates/clips/server/lib/video-storage.ts +1 -1
  81. package/corpus/templates/clips/server/plugins/db.ts +15 -0
  82. package/corpus/templates/clips/server/routes/api/media/index.post.ts +1 -1
  83. package/corpus/templates/content/.agents/skills/agent-native-docs/SKILL.md +23 -3
  84. package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  85. package/corpus/templates/content/.agents/skills/document-editing/references/databases.md +13 -0
  86. package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +23 -2
  87. package/corpus/templates/content/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  88. package/corpus/templates/content/AGENTS.md +1 -0
  89. package/corpus/templates/content/actions/_content-database-mutation-lock.ts +41 -0
  90. package/corpus/templates/content/actions/_content-database-row-migration.ts +569 -0
  91. package/corpus/templates/content/actions/_database-source-utils.ts +82 -36
  92. package/corpus/templates/content/actions/_database-utils.ts +5 -0
  93. package/corpus/templates/content/actions/_delete-content-space.ts +25 -11
  94. package/corpus/templates/content/actions/add-database-item.ts +60 -42
  95. package/corpus/templates/content/actions/attach-content-database-source.ts +2 -0
  96. package/corpus/templates/content/actions/configure-document-property.ts +99 -104
  97. package/corpus/templates/content/actions/delete-content-database.ts +19 -7
  98. package/corpus/templates/content/actions/delete-document-property.ts +47 -58
  99. package/corpus/templates/content/actions/delete-document.ts +390 -167
  100. package/corpus/templates/content/actions/disconnect-content-database-source.ts +41 -24
  101. package/corpus/templates/content/actions/duplicate-database-item.ts +63 -31
  102. package/corpus/templates/content/actions/duplicate-database-items.ts +86 -43
  103. package/corpus/templates/content/actions/duplicate-document-property.ts +37 -14
  104. package/corpus/templates/content/actions/migrate-content-database-rows.ts +830 -0
  105. package/corpus/templates/content/actions/move-database-item.ts +14 -0
  106. package/corpus/templates/content/actions/permanently-delete-document.ts +27 -6
  107. package/corpus/templates/content/actions/remove-database-items.ts +13 -0
  108. package/corpus/templates/content/actions/reorder-document-property.ts +45 -46
  109. package/corpus/templates/content/actions/set-document-property.ts +68 -28
  110. package/corpus/templates/content/actions/submit-content-database-form.ts +49 -0
  111. package/corpus/templates/content/actions/transcribe-media.ts +1 -1
  112. package/corpus/templates/content/agent-native.json +12 -0
  113. package/corpus/templates/content/app/components/editor/image-upload.ts +2 -2
  114. package/corpus/templates/content/app/i18n-data.ts +1 -1
  115. package/corpus/templates/content/changelog/2026-08-01-content-can-reorganize-every-row-in-an-existing-database-as-.md +6 -0
  116. package/corpus/templates/content/parity/matrix.md +1 -1
  117. package/corpus/templates/content/parity/matrix.ts +4 -2
  118. package/corpus/templates/content/server/db/schema.ts +30 -0
  119. package/corpus/templates/content/server/plugins/db.ts +24 -0
  120. package/corpus/templates/content/server/plugins/onboarding.ts +2 -2
  121. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +23 -3
  122. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  123. package/corpus/templates/crm/agent-native.json +12 -0
  124. package/corpus/templates/design/.agents/skills/agent-native-docs/SKILL.md +23 -3
  125. package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  126. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +2 -0
  127. package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +23 -2
  128. package/corpus/templates/design/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  129. package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +2 -2
  130. package/corpus/templates/design/DESIGN-STUDIO-PLAN.md +2 -2
  131. package/corpus/templates/design/actions/apply-design-token-edit.ts +1 -1
  132. package/corpus/templates/design/actions/capture-design-state.ts +1 -1
  133. package/corpus/templates/design/actions/connect-builder-app.ts +2 -2
  134. package/corpus/templates/design/actions/create-design-branch.ts +1 -1
  135. package/corpus/templates/design/actions/create-fusion-app.ts +3 -3
  136. package/corpus/templates/design/actions/deploy-design-preview.ts +1 -1
  137. package/corpus/templates/design/actions/generate-design.ts +3 -2
  138. package/corpus/templates/design/actions/get-component-details.ts +1 -1
  139. package/corpus/templates/design/actions/get-design-branch-diff.ts +1 -1
  140. package/corpus/templates/design/actions/index-components.ts +3 -3
  141. package/corpus/templates/design/actions/index-design-system-with-builder.ts +1 -1
  142. package/corpus/templates/design/actions/migrate-inline-design-to-app.ts +3 -3
  143. package/corpus/templates/design/actions/open-component-source.ts +1 -1
  144. package/corpus/templates/design/actions/update-design.ts +96 -14
  145. package/corpus/templates/design/agent-native.json +12 -0
  146. package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +7 -2
  147. package/corpus/templates/design/app/components/design/FigmaHydrationDialog.tsx +11 -2
  148. package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +1 -1
  149. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +8 -1
  150. package/corpus/templates/design/app/i18n-data.ts +53 -22
  151. package/corpus/templates/design/app/lib/design-file-upload.ts +2 -3
  152. package/corpus/templates/design/app/lib/upload-limits.ts +4 -0
  153. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +1 -1
  154. package/corpus/templates/design/changelog/2026-08-05-chat-attachments-now-warn-before-upload-when-they-exceed-the.md +6 -0
  155. package/corpus/templates/design/changelog/2026-08-05-figma-fig-uploads-now-show-a-clear-4-mb-limit-up-front-inste.md +6 -0
  156. package/corpus/templates/design/scripts/qa-figma-stress-import.ts +1 -1
  157. package/corpus/templates/design/server/handlers/import-design-file.ts +9 -5
  158. package/corpus/templates/design/server/handlers/uploads.ts +13 -9
  159. package/corpus/templates/design/server/lib/fig-file-limits.ts +2 -1
  160. package/corpus/templates/design/server/lib/figma-image-hydration.ts +1 -1
  161. package/corpus/templates/design/server/lib/figma-node-import.ts +1 -1
  162. package/corpus/templates/design/server/lib/request-body-limits.ts +11 -0
  163. package/corpus/templates/design/shared/canvas-frames.ts +81 -0
  164. package/corpus/templates/design/shared/design-source-capabilities.ts +25 -9
  165. package/corpus/templates/dispatch/.agents/skills/agent-native-docs/SKILL.md +23 -3
  166. package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  167. package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +23 -2
  168. package/corpus/templates/dispatch/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  169. package/corpus/templates/dispatch/agent-native.json +12 -0
  170. package/corpus/templates/factory/.agents/skills/agent-native-docs/SKILL.md +23 -3
  171. package/corpus/templates/factory/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  172. package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +23 -2
  173. package/corpus/templates/factory/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  174. package/corpus/templates/factory/agent-native.json +12 -0
  175. package/corpus/templates/forms/.agents/skills/agent-native-docs/SKILL.md +23 -3
  176. package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  177. package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +23 -2
  178. package/corpus/templates/forms/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  179. package/corpus/templates/forms/actions/export-responses.ts +1 -1
  180. package/corpus/templates/forms/agent-native.json +12 -0
  181. package/corpus/templates/macros/.agents/skills/agent-native-docs/SKILL.md +23 -3
  182. package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  183. package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +23 -2
  184. package/corpus/templates/macros/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  185. package/corpus/templates/macros/agent-native.json +12 -0
  186. package/corpus/templates/mail/.agents/skills/agent-native-docs/SKILL.md +23 -3
  187. package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  188. package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +23 -2
  189. package/corpus/templates/mail/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  190. package/corpus/templates/mail/agent-native.json +12 -0
  191. package/corpus/templates/mail/app/i18n/en-US.ts +1 -1
  192. package/corpus/templates/mail/server/lib/media-upload.ts +1 -1
  193. package/corpus/templates/plan/.agents/skills/agent-native-docs/SKILL.md +23 -3
  194. package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  195. package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +23 -2
  196. package/corpus/templates/plan/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  197. package/corpus/templates/plan/agent-native.json +12 -0
  198. package/corpus/templates/plan/server/lib/plan-assets.ts +1 -1
  199. package/corpus/templates/slides/.agents/skills/agent-native-docs/SKILL.md +23 -3
  200. package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  201. package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +23 -2
  202. package/corpus/templates/slides/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  203. package/corpus/templates/slides/actions/generate-image-api.ts +1 -1
  204. package/corpus/templates/slides/actions/generate-slides-ai.ts +1 -1
  205. package/corpus/templates/slides/actions/import-file.ts +2 -2
  206. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
  207. package/corpus/templates/slides/agent-native.json +12 -0
  208. package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +1 -1
  209. package/corpus/templates/slides/app/i18n/en-US.ts +2 -2
  210. package/corpus/templates/slides/app/lib/deck-sorting.ts +19 -0
  211. package/corpus/templates/slides/app/lib/image-drop-to-agent.ts +1 -1
  212. package/corpus/templates/slides/app/pages/Index.tsx +7 -2
  213. package/corpus/templates/slides/changelog/2026-08-05-decks-are-now-sorted-by-most-recently-updated.md +6 -0
  214. package/corpus/templates/slides/server/handlers/assets.ts +1 -1
  215. package/corpus/templates/slides/server/handlers/uploads.ts +1 -1
  216. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +23 -3
  217. package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  218. package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +23 -2
  219. package/corpus/templates/tasks/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  220. package/corpus/templates/tasks/agent-native.json +12 -0
  221. package/dist/action.d.ts +6 -0
  222. package/dist/agent/engine/builder-engine.js +2 -2
  223. package/dist/agent/engine/credential-errors.d.ts +1 -1
  224. package/dist/agent/engine/credential-errors.js +2 -2
  225. package/dist/agent/production-agent.js +3 -2
  226. package/dist/brand-kit/fig/index.js +1 -1
  227. package/dist/cli/agent.js +45 -3
  228. package/dist/cli/code-agent-executor.js +2 -1
  229. package/dist/cli/create.d.ts +9 -1
  230. package/dist/cli/create.js +94 -1
  231. package/dist/cli/doctor.d.ts +8 -11
  232. package/dist/cli/doctor.js +92 -24
  233. package/dist/cli/index.js +6 -5
  234. package/dist/client/AgentAskPopover.d.ts +3 -1
  235. package/dist/client/AgentAskPopover.js +2 -2
  236. package/dist/client/AgentPanel.js +9 -3
  237. package/dist/client/AssistantChat.js +54 -33
  238. package/dist/client/MultiTabAssistantChat.js +1 -1
  239. package/dist/client/RouteTransitionIndicator.d.ts +7 -0
  240. package/dist/client/RouteTransitionIndicator.js +31 -0
  241. package/dist/client/agent-engine-key.js +1 -1
  242. package/dist/client/app-providers.js +11 -2
  243. package/dist/client/chat/message-components.js +1 -1
  244. package/dist/client/chat/run-recovery.js +1 -1
  245. package/dist/client/chat/tool-call-display.d.ts +3 -1
  246. package/dist/client/chat/tool-call-display.js +4 -3
  247. package/dist/client/chat-model-groups.d.ts +6 -0
  248. package/dist/client/chat-model-groups.js +11 -0
  249. package/dist/client/error-format.js +1 -1
  250. package/dist/client/i18n.js +1 -1
  251. package/dist/client/onboarding/FirstRunOnboarding.d.ts +5 -1
  252. package/dist/client/onboarding/FirstRunOnboarding.js +29 -13
  253. package/dist/client/onboarding/first-run-enabled.d.ts +6 -1
  254. package/dist/client/onboarding/first-run-enabled.js +33 -3
  255. package/dist/client/onboarding/use-onboarding.js +16 -11
  256. package/dist/client/require-session.js +13 -4
  257. package/dist/client/resources/mcp-integration-catalog.js +26 -0
  258. package/dist/client/resources/mcp-integration-logos.js +4 -0
  259. package/dist/client/route-warmup.js +56 -10
  260. package/dist/client/settings/AccountSettingsCard.js +78 -3
  261. package/dist/client/settings/SettingsPanel.js +1 -1
  262. package/dist/client/settings/VoiceTranscriptionSection.js +2 -2
  263. package/dist/client/settings/useBuilderStatus.js +1 -1
  264. package/dist/client/setup-connections/useBuilderConnectCardController.js +1 -1
  265. package/dist/client/ui/index.d.ts +1 -0
  266. package/dist/client/ui/index.js +1 -0
  267. package/dist/client/uploads/upload-editor-image.js +1 -1
  268. package/dist/client/use-chat-threads.js +3 -0
  269. package/dist/client/use-session.d.ts +11 -0
  270. package/dist/client/use-session.js +34 -6
  271. package/dist/collab/routes.d.ts +2 -2
  272. package/dist/config.d.ts +48 -0
  273. package/dist/config.js +111 -0
  274. package/dist/db/migrations.js +5 -0
  275. package/dist/eject/provider-api-definitions.d.ts +1 -1
  276. package/dist/eject/provider-api-definitions.js +1 -0
  277. package/dist/eject/remote-mcp-presets.js +1 -0
  278. package/dist/extensions/web-search-tool.js +2 -2
  279. package/dist/file-upload/actions/upload-image.js +1 -1
  280. package/dist/file-upload/registry.js +1 -1
  281. package/dist/guards/index.d.ts +3 -0
  282. package/dist/guards/index.js +2 -0
  283. package/dist/guards/no-empty-migrations.d.ts +14 -0
  284. package/dist/guards/no-empty-migrations.js +126 -0
  285. package/dist/index.browser.d.ts +1 -0
  286. package/dist/index.browser.js +3 -0
  287. package/dist/index.d.ts +1 -0
  288. package/dist/index.js +1 -0
  289. package/dist/localization/default-messages.d.ts +24 -0
  290. package/dist/localization/default-messages.js +26 -2
  291. package/dist/notifications/routes.d.ts +6 -6
  292. package/dist/onboarding/app-profile.js +1 -1
  293. package/dist/onboarding/plugin.d.ts +2 -0
  294. package/dist/onboarding/plugin.js +29 -2
  295. package/dist/progress/routes.d.ts +1 -1
  296. package/dist/provider-api/actions/custom-provider-registration.d.ts +16 -16
  297. package/dist/provider-api/actions/provider-api.d.ts +13 -13
  298. package/dist/provider-api/index.d.ts +4 -4
  299. package/dist/provider-api/index.js +35 -0
  300. package/dist/resources/handlers.d.ts +1 -1
  301. package/dist/resources/handlers.js +1 -1
  302. package/dist/scripts/docs/framework-search.d.ts +9 -0
  303. package/dist/scripts/docs/framework-search.js +239 -0
  304. package/dist/scripts/docs/index.js +1 -0
  305. package/dist/scripts/docs/search.d.ts +10 -0
  306. package/dist/scripts/docs/search.js +1 -1
  307. package/dist/scripts/docs/source-search.d.ts +10 -2
  308. package/dist/scripts/docs/source-search.js +108 -41
  309. package/dist/search-utils/index.d.ts +11 -0
  310. package/dist/search-utils/index.js +72 -0
  311. package/dist/server/action-change.d.ts +6 -0
  312. package/dist/server/action-change.js +28 -14
  313. package/dist/server/action-discovery.js +9 -0
  314. package/dist/server/action-routes.js +1 -0
  315. package/dist/server/agent-chat/browser-team-tools.js +1 -1
  316. package/dist/server/agent-chat/script-entries.js +43 -2
  317. package/dist/server/auth-login-mode.d.ts +8 -0
  318. package/dist/server/auth-login-mode.js +17 -0
  319. package/dist/server/auth.js +100 -15
  320. package/dist/server/better-auth-instance.d.ts +36 -0
  321. package/dist/server/better-auth-instance.js +25 -3
  322. package/dist/server/builder-design-systems.js +1 -1
  323. package/dist/server/core-routes-plugin.js +17 -14
  324. package/dist/server/credential-provider.js +3 -3
  325. package/dist/server/email-templates.d.ts +7 -0
  326. package/dist/server/email-templates.js +24 -0
  327. package/dist/server/email.d.ts +17 -0
  328. package/dist/server/email.js +22 -1
  329. package/dist/server/framework-request-handler.js +6 -0
  330. package/dist/server/onboarding-html.d.ts +2 -0
  331. package/dist/server/onboarding-html.js +169 -8
  332. package/dist/server/realtime-token.d.ts +1 -1
  333. package/dist/server/realtime-voice.js +1 -1
  334. package/dist/server/sentry.d.ts +1 -1
  335. package/dist/server/transcribe-voice.js +3 -3
  336. package/dist/shared/first-run-onboarding.d.ts +1 -0
  337. package/dist/shared/first-run-onboarding.js +1 -0
  338. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +23 -3
  339. package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  340. package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +23 -2
  341. package/dist/templates/chat/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  342. package/dist/templates/chat/AGENTS.md +3 -0
  343. package/dist/templates/chat/DESIGN.md +28 -0
  344. package/dist/templates/chat/agent-native.json +12 -0
  345. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +23 -3
  346. package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  347. package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +23 -2
  348. package/dist/templates/default/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  349. package/dist/templates/default/AGENTS.md +4 -0
  350. package/dist/templates/default/DESIGN.md +30 -0
  351. package/dist/templates/default/agent-native.json +9 -0
  352. package/dist/templates/default/app/i18n/ar-SA.ts +2 -2
  353. package/dist/templates/default/app/i18n/de-DE.ts +2 -2
  354. package/dist/templates/default/app/i18n/en-US.ts +2 -2
  355. package/dist/templates/default/app/i18n/es-ES.ts +2 -2
  356. package/dist/templates/default/app/i18n/fr-FR.ts +2 -2
  357. package/dist/templates/default/app/i18n/hi-IN.ts +2 -2
  358. package/dist/templates/default/app/i18n/ja-JP.ts +2 -2
  359. package/dist/templates/default/app/i18n/ko-KR.ts +2 -2
  360. package/dist/templates/default/app/i18n/pt-BR.ts +2 -2
  361. package/dist/templates/default/app/i18n/zh-CN.ts +2 -2
  362. package/dist/templates/default/app/i18n/zh-TW.ts +1 -1
  363. package/dist/templates/default/package.json +1 -0
  364. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +23 -3
  365. package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  366. package/dist/templates/headless/agent-native.json +9 -0
  367. package/dist/templates/headless/package.json +2 -0
  368. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +23 -3
  369. package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  370. package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +23 -2
  371. package/dist/templates/workspace-core/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  372. package/dist/templates/workspace-core/AGENTS.md +3 -0
  373. package/dist/templates/workspace-core/DESIGN.md +35 -0
  374. package/dist/templates/workspace-root/AGENTS.md +3 -0
  375. package/dist/templates/workspace-root/DESIGN.md +35 -0
  376. package/dist/templates/workspace-root/agent-native.json +9 -0
  377. package/dist/templates/workspace-root/package.json +3 -0
  378. package/dist/transcription/builder-transcription.js +1 -1
  379. package/dist/user-profile/actions/change-password.d.ts +8 -0
  380. package/dist/user-profile/actions/change-password.js +24 -0
  381. package/dist/user-profile/actions/get-auth-methods.d.ts +6 -0
  382. package/dist/user-profile/actions/get-auth-methods.js +23 -0
  383. package/dist/user-profile/actions/set-password.d.ts +7 -0
  384. package/dist/user-profile/actions/set-password.js +23 -0
  385. package/dist/vite/client.d.ts +8 -1
  386. package/dist/vite/client.js +63 -12
  387. package/dist/vite/index.d.ts +1 -0
  388. package/dist/vite/index.js +1 -0
  389. package/docs/AGENTS.md +7 -2
  390. package/docs/SKILL.md +7 -5
  391. package/docs/content/agent-native-config.mdx +165 -0
  392. package/docs/content/agent-native-toolkit.mdx +1 -1
  393. package/docs/content/deployment.mdx +7 -2
  394. package/docs/content/doctor.mdx +21 -13
  395. package/docs/content/environment-variables.mdx +158 -0
  396. package/docs/content/file-uploads.mdx +1 -1
  397. package/docs/content/getting-started.mdx +1 -1
  398. package/docs/content/key-concepts.mdx +1 -1
  399. package/docs/content/multi-app-workspace.mdx +1 -1
  400. package/docs/content/template-clips-ai-and-editing.mdx +6 -6
  401. package/docs/content/template-clips-developers.mdx +3 -3
  402. package/docs/content/toolkit-settings.mdx +1 -1
  403. package/docs/content/voice-input.mdx +4 -4
  404. package/package.json +6 -2
  405. package/src/eject/provider-api-definitions.ts +1 -0
  406. package/src/eject/remote-mcp-presets.ts +1 -0
  407. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +23 -3
  408. package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  409. package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +23 -2
  410. package/src/templates/chat/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  411. package/src/templates/chat/AGENTS.md +3 -0
  412. package/src/templates/chat/DESIGN.md +28 -0
  413. package/src/templates/chat/agent-native.json +12 -0
  414. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +23 -3
  415. package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  416. package/src/templates/default/.agents/skills/frontend-design/SKILL.md +23 -2
  417. package/src/templates/default/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  418. package/src/templates/default/AGENTS.md +4 -0
  419. package/src/templates/default/DESIGN.md +30 -0
  420. package/src/templates/default/agent-native.json +9 -0
  421. package/src/templates/default/app/i18n/ar-SA.ts +2 -2
  422. package/src/templates/default/app/i18n/de-DE.ts +2 -2
  423. package/src/templates/default/app/i18n/en-US.ts +2 -2
  424. package/src/templates/default/app/i18n/es-ES.ts +2 -2
  425. package/src/templates/default/app/i18n/fr-FR.ts +2 -2
  426. package/src/templates/default/app/i18n/hi-IN.ts +2 -2
  427. package/src/templates/default/app/i18n/ja-JP.ts +2 -2
  428. package/src/templates/default/app/i18n/ko-KR.ts +2 -2
  429. package/src/templates/default/app/i18n/pt-BR.ts +2 -2
  430. package/src/templates/default/app/i18n/zh-CN.ts +2 -2
  431. package/src/templates/default/app/i18n/zh-TW.ts +1 -1
  432. package/src/templates/default/package.json +1 -0
  433. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +23 -3
  434. package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  435. package/src/templates/headless/agent-native.json +9 -0
  436. package/src/templates/headless/package.json +2 -0
  437. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +23 -3
  438. package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
  439. package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +23 -2
  440. package/src/templates/workspace-core/.agents/skills/frontend-design/references/visual-direction.md +99 -0
  441. package/src/templates/workspace-core/AGENTS.md +3 -0
  442. package/src/templates/workspace-core/DESIGN.md +35 -0
  443. package/src/templates/workspace-root/AGENTS.md +3 -0
  444. package/src/templates/workspace-root/DESIGN.md +35 -0
  445. package/src/templates/workspace-root/agent-native.json +9 -0
  446. package/src/templates/workspace-root/package.json +3 -0
@@ -45,6 +45,13 @@ export interface RenderVerifySignupEmailArgs {
45
45
  verifyUrl: string;
46
46
  }
47
47
  export declare function renderVerifySignupEmail(args: RenderVerifySignupEmailArgs): RenderedEmailMessage;
48
+ export interface RenderMagicLinkEmailArgs {
49
+ /** The account email receiving the one-time sign-in link. */
50
+ email: string;
51
+ /** The full Better Auth URL containing the one-time token. */
52
+ magicLinkUrl: string;
53
+ }
54
+ export declare function renderMagicLinkEmail(args: RenderMagicLinkEmailArgs): RenderedEmailMessage;
48
55
  export interface RenderResetPasswordEmailArgs {
49
56
  /** The account email the reset is for. */
50
57
  email: string;
@@ -103,6 +103,30 @@ export function renderVerifySignupEmail(args) {
103
103
  : undefined,
104
104
  };
105
105
  }
106
+ export function renderMagicLinkEmail(args) {
107
+ const email = stripCrlf(args.email);
108
+ const slug = getAppSlug();
109
+ const brand = resolveBrand(slug);
110
+ const { html, text } = renderEmail({
111
+ brandName: brand,
112
+ preheader: `Sign in to ${brand} with your secure one-time link.`,
113
+ heading: `Sign in to ${brand}`,
114
+ paragraphs: [
115
+ `Use the button below to sign in as ${emailStrong(email)}. This link expires in 5 minutes and can only be used once.`,
116
+ `If you didn't request this email, you can safely ignore it.`,
117
+ ],
118
+ cta: { label: "Sign in securely", url: args.magicLinkUrl },
119
+ footer: `For your security, never forward this email or share the link.`,
120
+ });
121
+ return {
122
+ subject: `Your sign-in link for ${brand}`,
123
+ html,
124
+ text,
125
+ appSender: slug
126
+ ? { name: brand, slug, replyTo: AGENT_NATIVE_REPLY_TO }
127
+ : undefined,
128
+ };
129
+ }
106
130
  export function renderResetPasswordEmail(args) {
107
131
  const email = stripCrlf(args.email);
108
132
  // Match the verification email branding so password resets are clearly tied
@@ -10,6 +10,16 @@
10
10
  * so the reset-password flow still works end-to-end for local development.
11
11
  */
12
12
  export type EmailProvider = "resend" | "sendgrid" | "dev";
13
+ export type EmailReadiness = {
14
+ status: "ready";
15
+ provider: Exclude<EmailProvider, "dev">;
16
+ } | {
17
+ status: "not-configured";
18
+ provider: "dev";
19
+ } | {
20
+ status: "misconfigured" | "unavailable";
21
+ provider: EmailProvider | "unknown";
22
+ };
13
23
  export interface EmailAttachment {
14
24
  filename: string;
15
25
  content: string | Buffer;
@@ -50,6 +60,13 @@ export interface SendEmailArgs {
50
60
  timeoutMs?: number;
51
61
  }
52
62
  export declare function isEmailConfigured(): Promise<boolean>;
63
+ /**
64
+ * Auth must only offer magic links when sending can succeed. In particular,
65
+ * SendGrid needs EMAIL_FROM while Resend can use its sandbox sender. Keep
66
+ * unreadable credential stores distinct from an unconfigured deployment so
67
+ * callers can fail closed without claiming setup is absent.
68
+ */
69
+ export declare function getEmailReadiness(): Promise<EmailReadiness>;
53
70
  export declare function getEmailProvider(): Promise<EmailProvider>;
54
71
  export declare function sendEmail(args: SendEmailArgs): Promise<void>;
55
72
  //# sourceMappingURL=email.d.ts.map
@@ -56,7 +56,28 @@ async function resolveEmailTransport() {
56
56
  return { provider: "dev", from: resolvedFrom };
57
57
  }
58
58
  export async function isEmailConfigured() {
59
- return (await resolveEmailTransport()).provider !== "dev";
59
+ return (await getEmailReadiness()).status === "ready";
60
+ }
61
+ /**
62
+ * Auth must only offer magic links when sending can succeed. In particular,
63
+ * SendGrid needs EMAIL_FROM while Resend can use its sandbox sender. Keep
64
+ * unreadable credential stores distinct from an unconfigured deployment so
65
+ * callers can fail closed without claiming setup is absent.
66
+ */
67
+ export async function getEmailReadiness() {
68
+ try {
69
+ const config = await resolveEmailTransport();
70
+ if (config.provider === "dev") {
71
+ return { status: "not-configured", provider: "dev" };
72
+ }
73
+ if (config.provider === "sendgrid" && !config.from) {
74
+ return { status: "misconfigured", provider: "sendgrid" };
75
+ }
76
+ return { status: "ready", provider: config.provider };
77
+ }
78
+ catch {
79
+ return { status: "unavailable", provider: "unknown" };
80
+ }
60
81
  }
61
82
  export async function getEmailProvider() {
62
83
  return (await resolveEmailTransport()).provider;
@@ -265,6 +265,12 @@ export async function awaitBootstrap(nitroApp) {
265
265
  async function awaitFrameworkRoutesReadyForRequest(nitroApp, reqPath) {
266
266
  if (!nitroApp)
267
267
  return true;
268
+ // This route is mounted synchronously by core-routes before bootstrap. It
269
+ // must not wait on optional plugins or a database just because the browser
270
+ // asks for the SSR shell's empty speculation rules during a cold start.
271
+ if (resolveMountMatch(reqPath, `${FRAMEWORK_PREFIX}/speculation-rules.json`)) {
272
+ return true;
273
+ }
268
274
  let timer;
269
275
  try {
270
276
  return await Promise.race([
@@ -23,6 +23,8 @@ export interface OnboardingHtmlOptions {
23
23
  * If Google OAuth env vars are not configured, an error message is shown.
24
24
  */
25
25
  googleOnly?: boolean;
26
+ /** Authentication surface to render. Defaults to the existing password flow. */
27
+ authMode?: "magic-link" | "password";
26
28
  /**
27
29
  * Product marketing content shown alongside the sign-in form.
28
30
  * When provided, the page uses a split layout: marketing on the left,
@@ -72,6 +72,14 @@ const EN_AUTH_COPY = {
72
72
  passwordMinPlaceholder: "At least 8 characters",
73
73
  confirmPasswordPlaceholder: "Confirm password",
74
74
  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",
78
+ magicLinkSent: "Check your email",
79
+ magicLinkSentCopy: "We sent a secure sign-in link to",
80
+ magicLinkFailed: "Could not send sign-in link.",
81
+ usePasswordInstead: "Use a password instead",
82
+ backToMagicLink: "Use a sign-in link instead",
75
83
  signupProgress: "Signup progress",
76
84
  progressAccount: "Account",
77
85
  progressVerify: "Verify",
@@ -160,6 +168,14 @@ const AUTH_LOCALE_COPY = {
160
168
  passwordMinPlaceholder: "至少 8 个字符",
161
169
  confirmPasswordPlaceholder: "确认密码",
162
170
  enterPasswordPlaceholder: "输入密码",
171
+ magicLinkTitle: "使用链接登录",
172
+ magicLinkSubtitle: "输入邮箱,我们会发送安全登录链接",
173
+ sendMagicLink: "发送登录链接到邮箱",
174
+ magicLinkSent: "检查你的邮箱",
175
+ magicLinkSentCopy: "我们已向以下邮箱发送安全登录链接:",
176
+ magicLinkFailed: "无法发送登录链接。",
177
+ usePasswordInstead: "改用密码",
178
+ backToMagicLink: "改用登录链接",
163
179
  signupProgress: "注册进度",
164
180
  progressAccount: "账户",
165
181
  progressVerify: "验证",
@@ -246,6 +262,14 @@ const AUTH_LOCALE_COPY = {
246
262
  passwordMinPlaceholder: "至少 8 個字元",
247
263
  confirmPasswordPlaceholder: "確認密碼",
248
264
  enterPasswordPlaceholder: "輸入密碼",
265
+ magicLinkTitle: "使用連結登入",
266
+ magicLinkSubtitle: "輸入電子郵件,我們會寄送安全登入連結",
267
+ sendMagicLink: "寄送登入連結",
268
+ magicLinkSent: "檢查你的電子郵件",
269
+ magicLinkSentCopy: "我們已向以下電子郵件寄送安全登入連結:",
270
+ magicLinkFailed: "無法寄送登入連結。",
271
+ usePasswordInstead: "改用密碼",
272
+ backToMagicLink: "改用登入連結",
249
273
  signupProgress: "註冊進度",
250
274
  progressAccount: "帳號",
251
275
  progressVerify: "驗證",
@@ -332,6 +356,14 @@ const AUTH_LOCALE_COPY = {
332
356
  passwordMinPlaceholder: "Al menos 8 caracteres",
333
357
  confirmPasswordPlaceholder: "Confirmar contraseña",
334
358
  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",
362
+ magicLinkSent: "Revisa tu email",
363
+ magicLinkSentCopy: "Enviamos un enlace seguro a",
364
+ magicLinkFailed: "No se pudo enviar el enlace de inicio de sesión.",
365
+ usePasswordInstead: "Usar una contraseña",
366
+ backToMagicLink: "Usar un enlace de inicio de sesión",
335
367
  signupProgress: "Progreso de registro",
336
368
  progressAccount: "Cuenta",
337
369
  progressVerify: "Verificar",
@@ -418,6 +450,14 @@ const AUTH_LOCALE_COPY = {
418
450
  passwordMinPlaceholder: "Au moins 8 caractères",
419
451
  confirmPasswordPlaceholder: "Confirmer le mot de passe",
420
452
  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",
456
+ magicLinkSent: "Vérifiez votre e-mail",
457
+ magicLinkSentCopy: "Nous avons envoyé un lien sécurisé à",
458
+ magicLinkFailed: "Impossible d'envoyer le lien de connexion.",
459
+ usePasswordInstead: "Utiliser un mot de passe",
460
+ backToMagicLink: "Utiliser un lien de connexion",
421
461
  signupProgress: "Progression de l'inscription",
422
462
  progressAccount: "Compte",
423
463
  progressVerify: "Vérifier",
@@ -504,6 +544,14 @@ const AUTH_LOCALE_COPY = {
504
544
  passwordMinPlaceholder: "Mindestens 8 Zeichen",
505
545
  confirmPasswordPlaceholder: "Passwort bestätigen",
506
546
  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",
550
+ magicLinkSent: "Prüfe deine E-Mail",
551
+ magicLinkSentCopy: "Wir haben einen sicheren Anmeldelink gesendet an",
552
+ magicLinkFailed: "Anmeldelink konnte nicht gesendet werden.",
553
+ usePasswordInstead: "Stattdessen Passwort verwenden",
554
+ backToMagicLink: "Stattdessen Anmeldelink verwenden",
507
555
  signupProgress: "Registrierungsfortschritt",
508
556
  progressAccount: "Konto",
509
557
  progressVerify: "Prüfen",
@@ -590,6 +638,14 @@ const AUTH_LOCALE_COPY = {
590
638
  passwordMinPlaceholder: "8 文字以上",
591
639
  confirmPasswordPlaceholder: "パスワードを確認",
592
640
  enterPasswordPlaceholder: "パスワードを入力",
641
+ magicLinkTitle: "リンクでサインイン",
642
+ magicLinkSubtitle: "メールアドレスを入力すると、安全なサインインリンクを送信します",
643
+ sendMagicLink: "サインインリンクをメールで送信",
644
+ magicLinkSent: "メールを確認してください",
645
+ magicLinkSentCopy: "安全なサインインリンクを送信しました:",
646
+ magicLinkFailed: "サインインリンクを送信できませんでした。",
647
+ usePasswordInstead: "パスワードを使用する",
648
+ backToMagicLink: "サインインリンクを使用する",
593
649
  signupProgress: "登録の進行状況",
594
650
  progressAccount: "アカウント",
595
651
  progressVerify: "確認",
@@ -676,6 +732,14 @@ const AUTH_LOCALE_COPY = {
676
732
  passwordMinPlaceholder: "8자 이상",
677
733
  confirmPasswordPlaceholder: "비밀번호 확인",
678
734
  enterPasswordPlaceholder: "비밀번호 입력",
735
+ magicLinkTitle: "링크로 로그인",
736
+ magicLinkSubtitle: "이메일을 입력하면 안전한 로그인 링크를 보내드립니다",
737
+ sendMagicLink: "로그인 링크 이메일 받기",
738
+ magicLinkSent: "이메일을 확인하세요",
739
+ magicLinkSentCopy: "안전한 로그인 링크를 보냈습니다:",
740
+ magicLinkFailed: "로그인 링크를 보낼 수 없습니다.",
741
+ usePasswordInstead: "비밀번호 사용",
742
+ backToMagicLink: "로그인 링크 사용",
679
743
  signupProgress: "가입 진행 상황",
680
744
  progressAccount: "계정",
681
745
  progressVerify: "확인",
@@ -762,6 +826,14 @@ const AUTH_LOCALE_COPY = {
762
826
  passwordMinPlaceholder: "Pelo menos 8 caracteres",
763
827
  confirmPasswordPlaceholder: "Confirmar senha",
764
828
  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",
832
+ magicLinkSent: "Confira seu email",
833
+ magicLinkSentCopy: "Enviamos um link seguro para",
834
+ magicLinkFailed: "Não foi possível enviar o link de acesso.",
835
+ usePasswordInstead: "Usar uma senha",
836
+ backToMagicLink: "Usar um link de acesso",
765
837
  signupProgress: "Progresso do cadastro",
766
838
  progressAccount: "Conta",
767
839
  progressVerify: "Verificar",
@@ -848,6 +920,14 @@ const AUTH_LOCALE_COPY = {
848
920
  passwordMinPlaceholder: "कम से कम 8 अक्षर",
849
921
  confirmPasswordPlaceholder: "पासवर्ड की पुष्टि करें",
850
922
  enterPasswordPlaceholder: "पासवर्ड दर्ज करें",
923
+ magicLinkTitle: "लिंक से साइन इन करें",
924
+ magicLinkSubtitle: "अपना ईमेल दर्ज करें और हम सुरक्षित साइन-इन लिंक भेजेंगे",
925
+ sendMagicLink: "मुझे साइन-इन लिंक ईमेल करें",
926
+ magicLinkSent: "अपना ईमेल देखें",
927
+ magicLinkSentCopy: "हमने सुरक्षित साइन-इन लिंक यहां भेजा है:",
928
+ magicLinkFailed: "साइन-इन लिंक नहीं भेजा जा सका।",
929
+ usePasswordInstead: "पासवर्ड का उपयोग करें",
930
+ backToMagicLink: "साइन-इन लिंक का उपयोग करें",
851
931
  signupProgress: "साइनअप प्रगति",
852
932
  progressAccount: "खाता",
853
933
  progressVerify: "सत्यापित करें",
@@ -934,6 +1014,14 @@ const AUTH_LOCALE_COPY = {
934
1014
  passwordMinPlaceholder: "8 أحرف على الأقل",
935
1015
  confirmPasswordPlaceholder: "تأكيد كلمة المرور",
936
1016
  enterPasswordPlaceholder: "أدخل كلمة المرور",
1017
+ magicLinkTitle: "تسجيل الدخول باستخدام رابط",
1018
+ magicLinkSubtitle: "أدخل بريدك الإلكتروني وسنرسل لك رابط تسجيل دخول آمنًا",
1019
+ sendMagicLink: "إرسال رابط تسجيل الدخول إلى بريدي",
1020
+ magicLinkSent: "تحقق من بريدك الإلكتروني",
1021
+ magicLinkSentCopy: "أرسلنا رابط تسجيل دخول آمنًا إلى",
1022
+ magicLinkFailed: "تعذر إرسال رابط تسجيل الدخول.",
1023
+ usePasswordInstead: "استخدام كلمة مرور بدلًا من ذلك",
1024
+ backToMagicLink: "استخدام رابط تسجيل الدخول بدلًا من ذلك",
937
1025
  signupProgress: "تقدم التسجيل",
938
1026
  progressAccount: "الحساب",
939
1027
  progressVerify: "التحقق",
@@ -1126,6 +1214,8 @@ function isAgentNativeHostedHost(host) {
1126
1214
  export function getOnboardingHtml(opts = {}) {
1127
1215
  const showGoogle = hasGoogleOAuth();
1128
1216
  const googleOnly = !!opts.googleOnly;
1217
+ const authMode = opts.authMode ?? "password";
1218
+ const magicLinkMode = authMode === "magic-link";
1129
1219
  // In a Google-only app, Google is the sole sign-in method, so always render
1130
1220
  // a working button — never gate it on env vars detected at render time. The
1131
1221
  // login page is a public, CDN-cacheable shell served to everyone (per-user
@@ -2239,8 +2329,8 @@ ${marketingStyles}
2239
2329
  ${localePickerHtml}
2240
2330
  ${marketingPanelHtml}
2241
2331
  <div class="card">
2242
- <h1 id="heading"${i18nAttr(googleOnly ? "signInTitle" : "welcomeTitle")}>${esc(t(googleOnly ? "signInTitle" : "welcomeTitle"))}</h1>
2243
- <p class="subtitle" id="subtitle"${i18nAttr(googleOnly ? "googleOnlySubtitle" : "createAccountSubtitle")}>${esc(t(googleOnly ? "googleOnlySubtitle" : "createAccountSubtitle"))}</p>
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>
2244
2334
  <p
2245
2335
  class="upgrade-note"
2246
2336
  id="upgrade-note"
@@ -2264,7 +2354,7 @@ ${googleOnly ? "" : `\n <div class="divider" id="auth-divider"${i18nAttr("divid
2264
2354
  : ""}
2265
2355
  ${googleOnly
2266
2356
  ? ""
2267
- : ` <div class="tabs">
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" : ""}>
2268
2358
  <button class="tab" data-tab="signup"${i18nAttr("createAccount")}>${esc(t("createAccount"))}</button>
2269
2359
  <button class="tab" data-tab="login"${i18nAttr("signIn")}>${esc(t("signIn"))}</button>
2270
2360
  </div>
@@ -2311,6 +2401,7 @@ ${signupLocalModeNoteHtml}
2311
2401
  <p style="margin-top:0.75rem;font-size:0.75rem;text-align:right">
2312
2402
  <a href="#" id="forgot-link" style="color:#888;text-decoration:underline;text-underline-offset:2px"${i18nAttr("forgotPassword")}>${esc(t("forgotPassword"))}</a>
2313
2403
  </p>
2404
+ ${magicLinkMode ? `<p style="margin-top:0.5rem;font-size:0.75rem;text-align:center"><a href="#" id="back-to-magic-link" class="link-button"${i18nAttr("backToMagicLink")}>${esc(t("backToMagicLink"))}</a></p>` : ""}
2314
2405
  </form>
2315
2406
 
2316
2407
  <form id="forgot-form" class="form">
@@ -2361,7 +2452,8 @@ ${signInJourneyInlineScript()}
2361
2452
  var __AN_AUTH_MARKETING_LOCALES = ${JSON.stringify(AUTH_MARKETING_LOCALE_COPY)};
2362
2453
  var __anAuthLocale = __AN_AUTH_DEFAULT_LOCALE;
2363
2454
  var __anAuthLocalePreference = 'system';
2364
- var __anAuthView = ${JSON.stringify(googleOnly ? "googleOnly" : "signup")};
2455
+ var __AN_AUTH_MODE = ${JSON.stringify(authMode)};
2456
+ var __anAuthView = ${JSON.stringify(googleOnly ? "googleOnly" : magicLinkMode ? "magicLink" : "signup")};
2365
2457
  function __anAuthLocaleIsSupported(value) {
2366
2458
  return __AN_AUTH_SUPPORTED_LOCALES.indexOf(value) !== -1;
2367
2459
  }
@@ -2429,6 +2521,7 @@ ${signInJourneyInlineScript()}
2429
2521
  if (view === 'forgot') return { heading: 'resetPasswordTitle', subtitle: 'resetPasswordSubtitle' };
2430
2522
  if (view === 'verification') return { heading: 'checkEmailTitle', subtitle: 'finishAccountSubtitle' };
2431
2523
  if (view === 'googleOnly') return { heading: 'signInTitle', subtitle: 'googleOnlySubtitle' };
2524
+ if (view === 'magicLink') return { heading: 'magicLinkTitle', subtitle: 'magicLinkSubtitle' };
2432
2525
  return { heading: 'welcomeTitle', subtitle: 'createAccountSubtitle' };
2433
2526
  }
2434
2527
  function __anRefreshAuthViewCopy() {
@@ -3049,7 +3142,14 @@ ${googleOnly
3049
3142
  function clearRememberedPendingSignupEmail() {
3050
3143
  rememberPendingSignupEmail('');
3051
3144
  }
3052
- function setActiveTab(name, opts) {
3145
+ function showMagicLinkForm() {
3146
+ var form = document.getElementById('magic-link-form');
3147
+ if (!form) return;
3148
+ forms.forEach(function(x) { x.classList.remove('active'); });
3149
+ form.classList.add('active');
3150
+ __anSetAuthView('magicLink');
3151
+ }
3152
+ function setActiveTab(name, opts) {
3053
3153
  if (name !== 'signup' && name !== 'login') return;
3054
3154
  var form = document.getElementById(name + '-form');
3055
3155
  if (!form) return;
@@ -3156,7 +3256,10 @@ ${googleOnly
3156
3256
  __anRedirectToSignedInApp();
3157
3257
  return { ok: true };
3158
3258
  }
3159
- var data = await res.json().catch(function() { return {}; });
3259
+ var data = await res.json().catch(function(error) {
3260
+ console.warn('[auth] Could not parse sign-in response', error);
3261
+ return null;
3262
+ });
3160
3263
  var error = (data && (data.error || data.message)) || __anT('finishSignInFailed');
3161
3264
  return {
3162
3265
  ok: false,
@@ -3299,7 +3402,7 @@ ${googleOnly
3299
3402
  }
3300
3403
  }
3301
3404
  (function initActiveTab() {
3302
- var initial = 'signup';
3405
+ var initial = __AN_AUTH_MODE === 'magic-link' ? 'magicLink' : 'signup';
3303
3406
  try {
3304
3407
  var params = new URLSearchParams(location.search);
3305
3408
  var qp = params.get('tab');
@@ -3318,7 +3421,8 @@ ${googleOnly
3318
3421
  if (stored === 'login' || stored === 'signup') initial = stored;
3319
3422
  }
3320
3423
  } catch (e) {}
3321
- setActiveTab(initial, { persist: false });
3424
+ if (initial === 'magicLink') showMagicLinkForm();
3425
+ else setActiveTab(initial, { persist: false });
3322
3426
  try {
3323
3427
  if (__anIsVerifiedRedirectSuccess()) {
3324
3428
  var rememberedEmail = readRememberedPendingSignupEmail();
@@ -3338,6 +3442,63 @@ ${googleOnly
3338
3442
  setActiveTab(t.dataset.tab, { persist: true });
3339
3443
  }); });
3340
3444
 
3445
+ var usePasswordLink = document.getElementById('use-password-link');
3446
+ if (usePasswordLink) usePasswordLink.addEventListener('click', function(e) {
3447
+ e.preventDefault();
3448
+ setActiveTab('login', { persist: false });
3449
+ var magicEmail = document.getElementById('m-email');
3450
+ var loginEmail = document.getElementById('l-email');
3451
+ if (magicEmail && loginEmail && magicEmail.value) loginEmail.value = magicEmail.value;
3452
+ });
3453
+ var backToMagicLink = document.getElementById('back-to-magic-link');
3454
+ if (backToMagicLink) backToMagicLink.addEventListener('click', function(e) {
3455
+ e.preventDefault();
3456
+ showMagicLinkForm();
3457
+ });
3458
+
3459
+ var magicLinkForm = document.getElementById('magic-link-form');
3460
+ if (magicLinkForm) magicLinkForm.addEventListener('submit', async function(e) {
3461
+ e.preventDefault();
3462
+ var btn = magicLinkForm.querySelector('button[type="submit"]');
3463
+ var msg = document.getElementById('m-msg');
3464
+ var emailInput = document.getElementById('m-email');
3465
+ var email = __anNormalizeAuthEmail(emailInput && emailInput.value);
3466
+ msg.classList.remove('show', 'error', 'success');
3467
+ if (!__anIsValidAuthEmail(email)) {
3468
+ __anShowEmailValidationError(emailInput, msg);
3469
+ return;
3470
+ }
3471
+ var originalLabel = btn.textContent;
3472
+ btn.disabled = true;
3473
+ btn.textContent = __anT('sending');
3474
+ try {
3475
+ var res = await fetch(__anPath('/_agent-native/auth/magic-link'), {
3476
+ method: 'POST',
3477
+ headers: { 'Content-Type': 'application/json' },
3478
+ body: JSON.stringify({ email: email, callbackURL: __anResumeHref() }),
3479
+ });
3480
+ var data = await res.json().catch(function(error) {
3481
+ console.warn('[auth] Could not parse magic-link response', error);
3482
+ return null;
3483
+ });
3484
+ if (res.ok) {
3485
+ msg.textContent = __anT('magicLinkSent') + '. ' + __anT('magicLinkSentCopy') + ' ' + email + '.';
3486
+ msg.classList.add('show', 'success');
3487
+ btn.textContent = __anT('sent');
3488
+ return;
3489
+ }
3490
+ msg.textContent = (data && (data.error || data.message)) || __anT('magicLinkFailed');
3491
+ msg.classList.add('show', 'error');
3492
+ btn.disabled = false;
3493
+ btn.textContent = originalLabel;
3494
+ } catch (err) {
3495
+ msg.textContent = __anT('networkErrorDashRetry');
3496
+ msg.classList.add('show', 'error');
3497
+ btn.disabled = false;
3498
+ btn.textContent = originalLabel;
3499
+ }
3500
+ });
3501
+
3341
3502
  document.getElementById('signup-form').addEventListener('submit', async function(e) {
3342
3503
  e.preventDefault();
3343
3504
  var form = e.currentTarget;
@@ -26,9 +26,9 @@ 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
  }>>;
34
34
  //# sourceMappingURL=realtime-token.d.ts.map
@@ -412,7 +412,7 @@ function createSessionHandler(tools, capabilities, options) {
412
412
  if (!builderConfigured && !apiKey) {
413
413
  setResponseStatus(event, 409);
414
414
  return {
415
- error: "Connect Builder or configure an OpenAI API key to use realtime voice.",
415
+ error: "Connect Builder (free tier available) or configure an OpenAI API key to use realtime voice.",
416
416
  code: "realtime_voice_setup_required",
417
417
  };
418
418
  }
@@ -57,7 +57,7 @@ export declare function setSentryRequestContext(ctx: {
57
57
  * this just records the error for observability.
58
58
  */
59
59
  export declare function captureAuthError(error: unknown, context: {
60
- route: "login" | "signup" | "logout";
60
+ route: "login" | "signup" | "logout" | "magic-link";
61
61
  email?: string;
62
62
  }): string | undefined;
63
63
  export interface RouteErrorContext {
@@ -269,7 +269,7 @@ export function createTranscribeVoiceHandler() {
269
269
  if (!(await hasBuilderPrivateKey())) {
270
270
  setResponseStatus(event, 400);
271
271
  return {
272
- error: `${label} is selected but Builder.io is not connected. Connect Builder.io in Settings, or change the provider preference.`,
272
+ error: `${label} is selected but Builder.io is not connected. Connect Builder.io (free tier available) in Settings, or change the provider preference.`,
273
273
  };
274
274
  }
275
275
  try {
@@ -403,7 +403,7 @@ export function createTranscribeVoiceHandler() {
403
403
  return {
404
404
  error: builderError
405
405
  ? `Builder transcription failed: ${builderError}. Add GEMINI_API_KEY, GROQ_API_KEY, or OPENAI_API_KEY in Settings → API Keys to enable a fallback provider.`
406
- : "No voice transcription provider configured. Connect Builder.io or add GEMINI_API_KEY / GROQ_API_KEY / OPENAI_API_KEY in Settings → API Keys.",
406
+ : "No voice transcription provider configured. Connect Builder.io (free tier available) or add GEMINI_API_KEY / GROQ_API_KEY / OPENAI_API_KEY in Settings → API Keys.",
407
407
  };
408
408
  }
409
409
  return await callWhisperCompat({
@@ -489,7 +489,7 @@ async function cleanupTranscriptText({ event, text, instructions, contextPack, p
489
489
  if (!(await hasBuilderPrivateKey())) {
490
490
  setResponseStatus(event, 400);
491
491
  return {
492
- error: "Builder.io cleanup is selected but Builder.io is not connected. Connect Builder.io in Settings, or change the provider preference.",
492
+ error: "Builder.io cleanup is selected but Builder.io is not connected. Connect Builder.io (free tier available) in Settings, or change the provider preference.",
493
493
  };
494
494
  }
495
495
  try {
@@ -1,3 +1,4 @@
1
1
  export declare const FIRST_RUN_ONBOARDING_COOKIE = "agent-native-first-run";
2
2
  export declare const FIRST_RUN_ONBOARDING_MAX_AGE: number;
3
+ export declare const FIRST_RUN_ONBOARDING_COMPLETED_KEY = "onboarding:first-run-completed";
3
4
  //# sourceMappingURL=first-run-onboarding.d.ts.map
@@ -1,3 +1,4 @@
1
1
  export const FIRST_RUN_ONBOARDING_COOKIE = "agent-native-first-run";
2
2
  export const FIRST_RUN_ONBOARDING_MAX_AGE = 24 * 60 * 60;
3
+ export const FIRST_RUN_ONBOARDING_COMPLETED_KEY = "onboarding:first-run-completed";
3
4
  //# sourceMappingURL=first-run-onboarding.js.map
@@ -31,6 +31,26 @@ the framework monorepo checkout.
31
31
 
32
32
  From a generated app directory:
33
33
 
34
+ ```bash
35
+ pnpm action framework-search --pattern "defineAction"
36
+ pnpm action framework-search --pattern "templates/*/actions/*.ts" --mode glob --scope source
37
+ pnpm action framework-search --pattern "Agent(?:Panel|Sidebar)" --mode regex --scope source
38
+ ```
39
+
40
+ Use `framework-search` first when a question may cross the docs and source
41
+ boundary. It searches the version-matched framework docs, runtime-visible
42
+ skills, readable Core or Toolkit package source, and first-party template
43
+ corpus in one bounded read-only call. Use `scope: docs` or `scope: source` to
44
+ narrow it, then use the existing focused readers for the page or file you need.
45
+
46
+ The same tool is available in the headless `pnpm agent` loop and every built-in
47
+ app agent. Its default substring mode is safest for ordinary questions; use
48
+ `glob` for wildcard paths, `sql-like` for `%` and `_` wildcards, and `regex`
49
+ for precise structural matches. Results are bounded, so refine the pattern or
50
+ path instead of treating a truncated result as exhaustive.
51
+
52
+ From a generated app directory, the lower-level readers remain available:
53
+
34
54
  ```bash
35
55
  pnpm action docs-search --query "<feature>"
36
56
  pnpm action docs-search --slug <slug>
@@ -41,9 +61,9 @@ pnpm action source-search --path templates/chat/actions/hello.ts
41
61
  pnpm action source-search --list
42
62
  ```
43
63
 
44
- The headless `pnpm agent` loop and built-in app agent also expose a read-only
45
- `docs-search` tool with the same `query`, `slug`, and `list` options, plus a
46
- read-only `source-search` tool with `query`, `path`, and `list`.
64
+ The headless `pnpm agent` loop and built-in app agent also expose read-only
65
+ `framework-search`, `docs-search`, and `source-search` tools. Use the unified
66
+ tool for discovery, then the focused tools for full page or file reads.
47
67
 
48
68
  If the action runner is unavailable, search the package directly:
49
69
 
@@ -65,6 +65,22 @@ Contextual agent UI is not a reason to expose every option at once. Start with
65
65
  the domain task's primary action, reveal review or configuration only when the
66
66
  current state needs it, and let the sidebar carry conversational depth.
67
67
 
68
+ ## Visual Direction And Workspace Variety
69
+
70
+ Shared workspace behavior should be consistent without forcing every app into
71
+ the same visual skin. Keep shell and component tokens semantic, then let each
72
+ app declare a named direction in `DESIGN.md` before styling. A new app should
73
+ choose its palette family and composition from the product context, compare
74
+ nearby apps, and avoid inheriting their accent by default. Use the
75
+ `frontend-design` visual-direction reference for mode, palette, type, density,
76
+ shape, anti-references, and the `distill` / `typeset` / `colorize` / `layout` /
77
+ `polish` / `audit` review vocabulary.
78
+
79
+ Do not make warm beige plus terracotta the workspace fallback. Preserve a
80
+ workspace-level brand when one exists; otherwise keep shared chrome neutral and
81
+ allow app-owned accents to distinguish products while retaining accessible
82
+ semantic states and the shared AgentSidebar contract.
83
+
68
84
  ## Discover Before Building
69
85
 
70
86
  Before creating an app-local version of repeated workspace or agent UI: