@agent-native/core 0.169.0 → 0.170.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 (496) hide show
  1. package/agent-native.eject.json +4 -1
  2. package/bin/agent-native.js +23 -5
  3. package/corpus/README.md +1 -1
  4. package/corpus/templates/analytics/.agents/skills/secrets/SKILL.md +11 -4
  5. package/corpus/templates/analytics/actions/bigquery-table-info.ts +3 -2
  6. package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
  7. package/corpus/templates/analytics/actions/search-bigquery-schema.ts +130 -4
  8. package/corpus/templates/analytics/agent-native.config.ts +1 -0
  9. package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +36 -23
  10. package/corpus/templates/analytics/app/i18n-data.ts +28 -0
  11. package/corpus/templates/analytics/app/lib/dashboard-visibility.ts +41 -0
  12. package/corpus/templates/analytics/app/pages/Agents.tsx +25 -1
  13. package/corpus/templates/analytics/app/pages/DashboardOverview.tsx +34 -9
  14. package/corpus/templates/analytics/app/routes/$.tsx +10 -0
  15. package/corpus/templates/analytics/app/routes.ts +3 -1
  16. package/corpus/templates/analytics/changelog/2026-08-21-dashboard-filters-keep-other-users-dashboards-out-of-mine.md +6 -0
  17. package/corpus/templates/analytics/changelog/2026-08-22-fixed-the-agent-native-templates-first-party-dashboard-panel.md +6 -0
  18. package/corpus/templates/analytics/changelog/2026-08-22-org-admin-panels-no-longer-report-a-database-error-as-a-per.md +9 -0
  19. package/corpus/templates/analytics/changelog/2026-08-22-slack-requests-report-invalid-inputs.md +6 -0
  20. package/corpus/templates/analytics/changelog/2026-08-22-unknown-analytics-links-now-return-a-real-not-found-status.md +6 -0
  21. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +2 -1
  22. package/corpus/templates/analytics/docs/schemas/tracked-events.md +2 -0
  23. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +29 -7
  24. package/corpus/templates/analytics/server/handlers/slack.ts +59 -5
  25. package/corpus/templates/analytics/server/lib/db-admin-connections.ts +11 -6
  26. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +132 -2
  27. package/corpus/templates/analytics/server/lib/real-data-actions.ts +14 -3
  28. package/corpus/templates/analytics/server/lib/slack.ts +4 -2
  29. package/corpus/templates/analytics/server/plugins/agent-chat.ts +33 -3
  30. package/corpus/templates/analytics/vitest.config.ts +6 -1
  31. package/corpus/templates/assets/.agents/skills/secrets/SKILL.md +11 -4
  32. package/corpus/templates/assets/app/routes/library.tsx +5 -3
  33. package/corpus/templates/assets/app/routes.ts +3 -1
  34. package/corpus/templates/assets/changelog/2026-08-22-library-page-loads-again-instead-of-crashing-on-open.md +6 -0
  35. package/corpus/templates/assets/vitest.config.ts +6 -1
  36. package/corpus/templates/brain/.agents/skills/secrets/SKILL.md +11 -4
  37. package/corpus/templates/brain/app/components/ui/pointer-lock.ts +1 -0
  38. package/corpus/templates/brain/app/routes/sources.tsx +8 -3
  39. package/corpus/templates/brain/changelog/2026-08-22-tuning-or-adding-a-source-no-longer-leaves-the-sources-page.md +6 -0
  40. package/corpus/templates/brain/server/lib/brain.ts +27 -2
  41. package/corpus/templates/brain/vitest.config.ts +1 -0
  42. package/corpus/templates/calendar/.agents/skills/secrets/SKILL.md +11 -4
  43. package/corpus/templates/calendar/actions/list-booking-links.ts +83 -4
  44. package/corpus/templates/calendar/actions/update-booking-link.ts +4 -3
  45. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +11 -3
  46. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +1 -1
  47. package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +103 -44
  48. package/corpus/templates/calendar/app/components/calendar/OutOfOfficeEvent.tsx +28 -24
  49. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +9 -2
  50. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +47 -58
  51. package/corpus/templates/calendar/app/hooks/use-booking-links.ts +5 -1
  52. package/corpus/templates/calendar/app/lib/event-layout.ts +52 -26
  53. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +126 -98
  54. package/corpus/templates/calendar/app/pages/CalendarView.tsx +1 -0
  55. package/corpus/templates/calendar/app/pages/Settings.tsx +88 -81
  56. package/corpus/templates/calendar/app/routes.ts +3 -1
  57. package/corpus/templates/calendar/changelog/2026-08-22-booking-link-visibility-respects-shared-access.md +6 -0
  58. package/corpus/templates/calendar/changelog/2026-08-22-clicking-an-out-of-office-event-s-marker-no-longer-creates-a.md +6 -0
  59. package/corpus/templates/calendar/changelog/2026-08-22-event-detail-views-now-show-your-calendar-timezone.md +6 -0
  60. package/corpus/templates/calendar/changelog/2026-08-22-google-calendar-can-now-connect-with-the-shared-google-oauth.md +6 -0
  61. package/corpus/templates/calendar/changelog/2026-08-22-overlapping-events-now-show-each-others-boundaries.md +6 -0
  62. package/corpus/templates/calendar/changelog/2026-08-22-public-booking-pages-now-offer-time-slots-from-the-host-s-we.md +6 -0
  63. package/corpus/templates/calendar/server/handlers/bookings.ts +5 -7
  64. package/corpus/templates/calendar/server/handlers/google-auth.ts +10 -2
  65. package/corpus/templates/calendar/server/lib/google-calendar.ts +139 -14
  66. package/corpus/templates/calendar/server/onboarding.ts +85 -0
  67. package/corpus/templates/calendar/server/plugins/agent-chat.ts +2 -0
  68. package/corpus/templates/calendar/shared/api.ts +9 -1
  69. package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  70. package/corpus/templates/chat/app/routes.ts +3 -1
  71. package/corpus/templates/chat/vitest.config.ts +8 -0
  72. package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +11 -4
  73. package/corpus/templates/clips/actions/get-meeting.ts +9 -4
  74. package/corpus/templates/clips/actions/list-recordings.ts +16 -3
  75. package/corpus/templates/clips/actions/search-meetings.ts +1 -0
  76. package/corpus/templates/clips/actions/stop-meeting-recording.ts +87 -6
  77. package/corpus/templates/clips/actions/view-screen.ts +8 -1
  78. package/corpus/templates/clips/app/components/library/search-bar.tsx +1 -1
  79. package/corpus/templates/clips/app/components/meetings/meeting-history-row.tsx +32 -1
  80. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +1 -1
  81. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +29 -1
  82. package/corpus/templates/clips/app/i18n/en-US.ts +5 -0
  83. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +33 -4
  84. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +1 -0
  85. package/corpus/templates/clips/app/routes/access-request.approve.tsx +16 -9
  86. package/corpus/templates/clips/app/routes/embed.$shareId.tsx +17 -7
  87. package/corpus/templates/clips/app/routes/share.$shareId.tsx +17 -7
  88. package/corpus/templates/clips/changelog/2026-08-21-camera-bubble-black-circle.md +6 -0
  89. package/corpus/templates/clips/changelog/2026-08-22-screen-recordings-respect-the-microphone-toggle.md +6 -0
  90. package/corpus/templates/clips/changelog/2026-08-22-the-recordings-library-no-longer-fails-right-after-server-start.md +6 -0
  91. package/corpus/templates/clips/changelog/2026-08-23-the-agent-can-see-your-library-right-after-server-start.md +6 -0
  92. package/corpus/templates/clips/chrome-extension/src/background.ts +1 -2
  93. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +39 -7
  94. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +21 -25
  95. package/corpus/templates/clips/desktop/src/app.tsx +53 -24
  96. package/corpus/templates/clips/desktop/src/lib/bubble-playback.ts +68 -0
  97. package/corpus/templates/clips/desktop/src/lib/recorder.ts +3 -0
  98. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +72 -14
  99. package/corpus/templates/clips/desktop/src/lib/updater.ts +8 -3
  100. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +162 -20
  101. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +43 -6
  102. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +150 -13
  103. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +12 -0
  104. package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +28 -3
  105. package/corpus/templates/clips/server/lib/emails.ts +17 -33
  106. package/corpus/templates/content/.agents/skills/secrets/SKILL.md +11 -4
  107. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +140 -15
  108. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +12 -14
  109. package/corpus/templates/content/app/components/ui/pointer-lock.ts +1 -0
  110. package/corpus/templates/content/app/hooks/use-content-database.ts +18 -2
  111. package/corpus/templates/content/app/hooks/use-local-storage.ts +38 -22
  112. package/corpus/templates/content/app/i18n-data.ts +25 -0
  113. package/corpus/templates/content/app/routes.ts +3 -1
  114. package/corpus/templates/content/changelog/2026-08-22-code-blocks-inserted-from-the-slash-menu-no-longer-get-stuck.md +6 -0
  115. package/corpus/templates/content/changelog/2026-08-22-the-sidebar-page-tree-no-longer-flashes-empty-after-creating-a-page.md +6 -0
  116. package/corpus/templates/content/docs/solutions/2026-08-21-content-mermaid-rendering-shape.md +233 -0
  117. package/corpus/templates/content/server/plugins/agent-chat.ts +9 -2
  118. package/corpus/templates/content/vitest.config.ts +7 -1
  119. package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +11 -4
  120. package/corpus/templates/design/.agents/skills/secrets/SKILL.md +11 -4
  121. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +1386 -92
  122. package/corpus/templates/design/actions/generate-design.ts +98 -47
  123. package/corpus/templates/design/actions/get-design-system.ts +6 -1
  124. package/corpus/templates/design/actions/refresh-design-system-with-builder.ts +146 -0
  125. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +70 -26
  126. package/corpus/templates/design/app/components/design/EditPanel.tsx +15 -47
  127. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +284 -136
  128. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2060 -144
  129. package/corpus/templates/design/app/components/design/editor/DesignBottomToolbar.tsx +6 -2
  130. package/corpus/templates/design/app/components/design/editor/DesignWorkspaceRail.tsx +4 -4
  131. package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +10 -8
  132. package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +19 -2
  133. package/corpus/templates/design/app/components/design/multi-screen/types.ts +9 -2
  134. package/corpus/templates/design/app/components/layout/Header.tsx +15 -0
  135. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -2
  136. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +13 -8
  137. package/corpus/templates/design/app/i18n-data.ts +11 -10
  138. package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +12 -0
  139. package/corpus/templates/design/app/lib/design-system-data.ts +68 -0
  140. package/corpus/templates/design/app/pages/DesignEditor.tsx +99 -57
  141. package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +39 -8
  142. package/corpus/templates/design/app/pages/DesignSystems.tsx +137 -43
  143. package/corpus/templates/design/app/pages/Index.tsx +3 -1
  144. package/corpus/templates/design/app/pages/Templates.tsx +0 -10
  145. package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +10 -0
  146. package/corpus/templates/design/app/pages/design-editor/collab-sync.ts +50 -0
  147. package/corpus/templates/design/app/pages/design-editor/commands/apply-design-editor-command.ts +1 -1
  148. package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +10 -8
  149. package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +6 -6
  150. package/corpus/templates/design/app/pages/design-editor/commands/apply-pending-visual-styles-with-agent.ts +1 -1
  151. package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +18 -7
  152. package/corpus/templates/design/app/pages/design-editor/commands/escape-hotkey.ts +4 -90
  153. package/corpus/templates/design/app/pages/design-editor/commands/layer-marquee-selection-change.ts +2 -1
  154. package/corpus/templates/design/app/pages/design-editor/commands/layer-selection-change.ts +4 -3
  155. package/corpus/templates/design/app/pages/design-editor/commands/screen-element-select.ts +12 -2
  156. package/corpus/templates/design/app/pages/design-editor/commands/screen-visual-style-change.ts +9 -2
  157. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-move-semantic-handoff.ts +1 -1
  158. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-semantic-handoff.ts +1 -1
  159. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-state-semantic-handoff.ts +1 -1
  160. package/corpus/templates/design/app/pages/design-editor/commands/start-sidebar-resize.ts +1 -1
  161. package/corpus/templates/design/app/pages/design-editor/editor-state.ts +11 -1
  162. package/corpus/templates/design/app/pages/design-editor/effects/adopt-db-file-content.ts +11 -19
  163. package/corpus/templates/design/app/pages/design-editor/effects/observe-collab-text.ts +6 -6
  164. package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +1 -1
  165. package/corpus/templates/design/app/pages/design-editor/effects/seed-collab-content.ts +12 -15
  166. package/corpus/templates/design/app/pages/design-editor/preview-navigation.ts +25 -0
  167. package/corpus/templates/design/app/pages/design-editor/selection-state.ts +5 -59
  168. package/corpus/templates/design/app/pages/design-editor/tool-state.ts +8 -0
  169. package/corpus/templates/design/app/pages/design-editor/types.ts +3 -3
  170. package/corpus/templates/design/app/routes.ts +3 -1
  171. package/corpus/templates/design/changelog/2026-08-20-canvas-edits-patch-the-frame-instead-of-rebuilding-it.md +6 -0
  172. package/corpus/templates/design/changelog/2026-08-21-builder-design-system-imports-reconcile-after-indexing.md +6 -0
  173. package/corpus/templates/design/changelog/2026-08-21-draw-mode-needs-shift-y.md +6 -0
  174. package/corpus/templates/design/changelog/2026-08-21-eyedropper-shortcut.md +6 -0
  175. package/corpus/templates/design/changelog/2026-08-21-figma-style-alignment-guides-and-snapping.md +6 -0
  176. package/corpus/templates/design/changelog/2026-08-21-group-transforms-keep-the-selection.md +6 -0
  177. package/corpus/templates/design/changelog/2026-08-21-inspector-fields-keep-focus-on-enter.md +6 -0
  178. package/corpus/templates/design/changelog/2026-08-21-pen-alt-keeps-the-incoming-handle.md +6 -0
  179. package/corpus/templates/design/changelog/2026-08-21-pen-on-the-board-creates-one-vector.md +6 -0
  180. package/corpus/templates/design/changelog/2026-08-21-scale-a-multi-selection-from-the-group-handles.md +6 -0
  181. package/corpus/templates/design/changelog/2026-08-21-scale-resizes-text-with-the-object.md +6 -0
  182. package/corpus/templates/design/changelog/2026-08-21-selecting-another-object-keeps-the-scale-tool-armed.md +6 -0
  183. package/corpus/templates/design/changelog/2026-08-21-the-shape-tool-remembers-the-shape-you-picked.md +6 -0
  184. package/corpus/templates/design/changelog/2026-08-21-vectors-drawn-in-a-frame-land-where-you-drew-them.md +6 -0
  185. package/corpus/templates/design/changelog/2026-08-22-multi-screen-generation-no-longer-loses-a-saved-screens-layo.md +6 -0
  186. package/corpus/templates/design/changelog/2026-08-22-rename-and-search-fields-are-labeled-for-screen-readers.md +6 -0
  187. package/corpus/templates/design/package.json +2 -0
  188. package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +311 -0
  189. package/corpus/templates/design/shared/canvas-math.ts +612 -206
  190. package/corpus/templates/design/shared/pen-path.ts +37 -0
  191. package/corpus/templates/design/vitest.config.ts +7 -1
  192. package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +11 -4
  193. package/corpus/templates/dispatch/actions/list-workspace-connections.ts +34 -3
  194. package/corpus/templates/dispatch/app/routes/integrations.tsx +55 -21
  195. package/corpus/templates/dispatch/app/routes.ts +3 -1
  196. package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +11 -4
  197. package/corpus/templates/factory/.env.example +2 -7
  198. package/corpus/templates/factory/AGENTS.md +3 -0
  199. package/corpus/templates/factory/README.md +5 -3
  200. package/corpus/templates/factory/actions/create-factory.ts +16 -3
  201. package/corpus/templates/factory/actions/get-slack-feedback-context.ts +2 -0
  202. package/corpus/templates/factory/actions/get-triage-item.ts +2 -0
  203. package/corpus/templates/factory/actions/list-factory-audit.ts +116 -36
  204. package/corpus/templates/factory/actions/list-factory-automations.ts +2 -1
  205. package/corpus/templates/factory/actions/list-triage-items.ts +22 -19
  206. package/corpus/templates/factory/actions/run-factory-automation.ts +7 -3
  207. package/corpus/templates/factory/actions/save-factory-automation.ts +5 -2
  208. package/corpus/templates/factory/actions/save-triage-config.ts +2 -8
  209. package/corpus/templates/factory/actions/start-builder-for-item.ts +21 -0
  210. package/corpus/templates/factory/app/components/factory/FactoryAuditView.tsx +229 -297
  211. package/corpus/templates/factory/app/components/factory/FactorySettingsView.tsx +397 -247
  212. package/corpus/templates/factory/app/components/factory/FactorySourceSettingsGroup.tsx +33 -0
  213. package/corpus/templates/factory/app/components/factory/NewFactoryForm.tsx +202 -162
  214. package/corpus/templates/factory/app/i18n/en-US.ts +32 -4
  215. package/corpus/templates/factory/app/routes/factory.tsx +84 -11
  216. package/corpus/templates/factory/app/routes.ts +3 -1
  217. package/corpus/templates/factory/changelog/2026-08-21-activity-runs-use-automation-display-names.md +6 -0
  218. package/corpus/templates/factory/changelog/2026-08-21-create-and-settings-source-cards.md +6 -0
  219. package/corpus/templates/factory/changelog/2026-08-21-keep-automations-visible-while-running.md +6 -0
  220. package/corpus/templates/factory/changelog/2026-08-21-nested-factory-automations-can-poll.md +6 -0
  221. package/corpus/templates/factory/changelog/2026-08-21-settings-sticky-unsaved-bar.md +6 -0
  222. package/corpus/templates/factory/server/connectors/credentials.ts +10 -5
  223. package/corpus/templates/factory/server/lib/factory-audit-report.ts +412 -0
  224. package/corpus/templates/factory/server/lib/factory-config-reconcile.ts +321 -0
  225. package/corpus/templates/factory/server/lib/factory-scope.ts +25 -2
  226. package/corpus/templates/factory/server/lib/require-factory-automation.ts +13 -4
  227. package/corpus/templates/factory/server/plugins/factory-migrations.ts +148 -4
  228. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +4 -6
  229. package/corpus/templates/factory/vitest.config.ts +17 -2
  230. package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +11 -4
  231. package/corpus/templates/forms/app/routes/_app.settings.tsx +4 -1
  232. package/corpus/templates/forms/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  233. package/corpus/templates/forms/server/lib/public-form-ssr.ts +11 -1
  234. package/corpus/templates/forms/vitest.config.ts +1 -0
  235. package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +11 -4
  236. package/corpus/templates/macros/app/routes.ts +3 -1
  237. package/corpus/templates/macros/vitest.config.ts +6 -1
  238. package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +11 -4
  239. package/corpus/templates/mail/actions/manage-gmail-filters.ts +10 -2
  240. package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +100 -37
  241. package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +14 -2
  242. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +66 -36
  243. package/corpus/templates/mail/app/hooks/use-emails.ts +13 -3
  244. package/corpus/templates/mail/app/hooks/use-google-auth.ts +2 -0
  245. package/corpus/templates/mail/app/lib/google-oauth-setup.ts +17 -0
  246. package/corpus/templates/mail/app/pages/InboxPage.tsx +69 -9
  247. package/corpus/templates/mail/app/routes/$.tsx +9 -0
  248. package/corpus/templates/mail/app/routes/$view.$threadId.tsx +23 -1
  249. package/corpus/templates/mail/app/routes/$view.tsx +47 -1
  250. package/corpus/templates/mail/app/routes.ts +3 -1
  251. package/corpus/templates/mail/changelog/2026-08-22-gmail-can-now-connect-with-the-shared-google-oauth.md +6 -0
  252. package/corpus/templates/mail/changelog/2026-08-22-gmail-filters-now-shows-the-real-error.md +6 -0
  253. package/corpus/templates/mail/changelog/2026-08-22-unknown-mail-urls-now-show-the-404-page.md +6 -0
  254. package/corpus/templates/mail/server/handlers/google-auth.ts +11 -2
  255. package/corpus/templates/mail/server/lib/google-auth.ts +92 -12
  256. package/corpus/templates/mail/server/onboarding.ts +66 -18
  257. package/corpus/templates/mail/vitest.config.ts +6 -1
  258. package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +11 -4
  259. package/corpus/templates/plan/app/routes/settings.tsx +4 -1
  260. package/corpus/templates/plan/app/routes.ts +3 -1
  261. package/corpus/templates/plan/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  262. package/corpus/templates/plan/netlify.toml +1 -1
  263. package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +11 -4
  264. package/corpus/templates/slides/actions/patch-deck.ts +79 -10
  265. package/corpus/templates/slides/actions/update-slide.ts +11 -1
  266. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +14 -4
  267. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +10 -52
  268. package/corpus/templates/slides/app/components/editor/GoogleDocImportHint.tsx +8 -53
  269. package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +9 -75
  270. package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +8 -60
  271. package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +10 -2
  272. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +19 -7
  273. package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +49 -36
  274. package/corpus/templates/slides/app/routes/access-request.approve.tsx +16 -9
  275. package/corpus/templates/slides/app/routes.ts +3 -1
  276. package/corpus/templates/slides/changelog/2026-08-22-already-uploaded-chat-images-are-no-longer-dropped.md +6 -0
  277. package/corpus/templates/slides/changelog/2026-08-22-google-drive-and-slides-can-now-connect-with-the-shared-google-oauth.md +6 -0
  278. package/corpus/templates/slides/changelog/2026-08-22-multi-slide-repairs-now-report-slides-that-still-overflow.md +6 -0
  279. package/corpus/templates/slides/changelog/2026-08-22-update-slide-now-reports-which-batched-edit-was-skipped.md +6 -0
  280. package/corpus/templates/slides/server/handlers/google-docs-auth.ts +52 -1
  281. package/corpus/templates/slides/server/lib/chat-attachments.ts +29 -3
  282. package/corpus/templates/slides/server/lib/google-docs-oauth.ts +66 -16
  283. package/corpus/templates/slides/server/lib/slide-content-patch.ts +13 -2
  284. package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -2
  285. package/corpus/templates/slides/tsconfig.json +5 -0
  286. package/corpus/templates/slides/vitest.config.ts +6 -1
  287. package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +11 -4
  288. package/corpus/templates/tasks/app/routes/settings.tsx +4 -1
  289. package/corpus/templates/tasks/app/routes.ts +3 -1
  290. package/corpus/templates/tasks/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  291. package/corpus/templates/tasks/vitest.config.ts +7 -1
  292. package/dist/action.d.ts +91 -0
  293. package/dist/action.js +50 -0
  294. package/dist/agent/abort-reasons.d.ts +38 -0
  295. package/dist/agent/abort-reasons.js +49 -0
  296. package/dist/agent/engine/ai-sdk-engine.js +8 -5
  297. package/dist/agent/engine/anthropic-engine.js +7 -5
  298. package/dist/agent/engine/credential-errors.d.ts +1 -1
  299. package/dist/agent/engine/credential-errors.js +2 -2
  300. package/dist/agent/engine/first-event-timeout.d.ts +42 -17
  301. package/dist/agent/engine/first-event-timeout.js +67 -25
  302. package/dist/agent/production-agent.d.ts +23 -0
  303. package/dist/agent/production-agent.js +107 -102
  304. package/dist/agent/run-loop-with-resume.d.ts +2 -28
  305. package/dist/agent/run-loop-with-resume.js +25 -40
  306. package/dist/agent/run-manager.js +5 -4
  307. package/dist/agent/run-store.d.ts +55 -0
  308. package/dist/agent/run-store.js +124 -1
  309. package/dist/agent/tool-search.js +2 -1
  310. package/dist/agent/types.d.ts +9 -4
  311. package/dist/app-config/configuration-error.d.ts +11 -0
  312. package/dist/app-config/configuration-error.js +14 -0
  313. package/dist/app-config/index.d.ts +1 -0
  314. package/dist/app-config/index.js +1 -0
  315. package/dist/app-config/integrations.d.ts +1 -0
  316. package/dist/app-config/integrations.js +10 -0
  317. package/dist/app-config/plugins.d.ts +34 -0
  318. package/dist/app-config/plugins.js +39 -0
  319. package/dist/app-config/run-lifecycle-invariants.d.ts +18 -9
  320. package/dist/app-config/run-lifecycle-invariants.js +18 -25
  321. package/dist/app-config/schema.d.ts +16 -0
  322. package/dist/app-config/schema.js +2 -0
  323. package/dist/chat-threads/schema-migrations.js +20 -0
  324. package/dist/chat-threads/store.js +21 -4
  325. package/dist/cli/native-dependencies.d.ts +4 -0
  326. package/dist/cli/native-dependencies.js +15 -0
  327. package/dist/client/AssistantChat.js +47 -15
  328. package/dist/client/ConnectBuilderCard.d.ts +3 -1
  329. package/dist/client/ConnectBuilderCard.js +6 -3
  330. package/dist/client/EnvironmentBadge.d.ts +1 -1
  331. package/dist/client/EnvironmentBadge.js +40 -5
  332. package/dist/client/MultiTabAssistantChat.d.ts +1 -1
  333. package/dist/client/MultiTabAssistantChat.js +35 -14
  334. package/dist/client/agent-chat/index.d.ts +1 -1
  335. package/dist/client/agent-chat/index.js +1 -1
  336. package/dist/client/agent-page/use-jobs.d.ts +2 -1
  337. package/dist/client/agent-page/use-jobs.js +3 -5
  338. package/dist/client/agent-sidebar-state.js +3 -1
  339. package/dist/client/blocks/library/code-tabs.js +5 -0
  340. package/dist/client/blocks/library/code.js +1 -0
  341. package/dist/client/chat/message-components.d.ts +7 -0
  342. package/dist/client/chat/message-components.js +1 -1
  343. package/dist/client/chat/run-recovery.js +5 -2
  344. package/dist/client/chat/tool-call-display.js +9 -3
  345. package/dist/client/chat-first/apps-rail.js +2 -2
  346. package/dist/client/chat-model-groups.d.ts +12 -0
  347. package/dist/client/chat-model-groups.js +3 -2
  348. package/dist/client/error-format.js +12 -0
  349. package/dist/client/integrations/GoogleProductLogo.d.ts +5 -0
  350. package/dist/client/integrations/GoogleProductLogo.js +45 -0
  351. package/dist/client/integrations/index.d.ts +2 -0
  352. package/dist/client/integrations/index.js +2 -0
  353. package/dist/client/integrations/workspace-provider-oauth.d.ts +8 -0
  354. package/dist/client/integrations/workspace-provider-oauth.js +13 -0
  355. package/dist/client/navigation/index.d.ts +1 -0
  356. package/dist/client/navigation/index.js +1 -0
  357. package/dist/client/resources/mcp-integration-catalog.js +0 -29
  358. package/dist/client/route-state.js +6 -0
  359. package/dist/client/settings/SettingsTabsPage.js +10 -6
  360. package/dist/client/sharing/ShareButton.js +11 -2
  361. package/dist/client/use-chat-models.d.ts +6 -0
  362. package/dist/client/use-chat-models.js +10 -0
  363. package/dist/client/use-db-sync.js +27 -9
  364. package/dist/client/workspace-app-navigation.d.ts +10 -0
  365. package/dist/client/workspace-app-navigation.js +38 -0
  366. package/dist/collab/struct-routes.d.ts +1 -1
  367. package/dist/connections/catalog.d.ts +111 -9
  368. package/dist/connections/catalog.js +86 -30
  369. package/dist/db/create-get-db.js +18 -0
  370. package/dist/db/ddl-guard.d.ts +0 -4
  371. package/dist/db/ddl-guard.js +46 -0
  372. package/dist/deploy/build.d.ts +32 -0
  373. package/dist/deploy/build.js +241 -16
  374. package/dist/deploy/function-bundle.d.ts +45 -0
  375. package/dist/deploy/function-bundle.js +337 -0
  376. package/dist/deploy/workspace-deploy.js +19 -1
  377. package/dist/eject/workspace-connections.js +4 -0
  378. package/dist/email-catalog/registry.d.ts +4 -0
  379. package/dist/email-catalog/registry.js +79 -14
  380. package/dist/extensions/content-patch.js +14 -2
  381. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  382. package/dist/integrations/plugin.d.ts +10 -0
  383. package/dist/integrations/plugin.js +40 -6
  384. package/dist/jobs/actions/run-automation-now.d.ts +2 -1
  385. package/dist/jobs/actions/run-automation-now.js +11 -5
  386. package/dist/jobs/frontmatter.js +53 -2
  387. package/dist/jobs/run-now.d.ts +11 -1
  388. package/dist/jobs/run-now.js +42 -7
  389. package/dist/jobs/scheduler.d.ts +1 -0
  390. package/dist/jobs/scheduler.js +2 -1
  391. package/dist/localization/core-messages/ar-SA.js +4 -1
  392. package/dist/localization/core-messages/de-DE.js +4 -1
  393. package/dist/localization/core-messages/en-US.d.ts +4 -1
  394. package/dist/localization/core-messages/en-US.js +4 -1
  395. package/dist/localization/core-messages/es-ES.js +4 -1
  396. package/dist/localization/core-messages/fr-FR.js +4 -1
  397. package/dist/localization/core-messages/hi-IN.js +4 -1
  398. package/dist/localization/core-messages/ja-JP.js +4 -1
  399. package/dist/localization/core-messages/ko-KR.js +4 -1
  400. package/dist/localization/core-messages/pt-BR.js +4 -1
  401. package/dist/localization/core-messages/zh-CN.js +4 -1
  402. package/dist/localization/core-messages/zh-TW.js +4 -1
  403. package/dist/localization/core-messages.d.ts +4 -1
  404. package/dist/localization/default-messages.d.ts +2 -5
  405. package/dist/localization/default-messages.js +2 -5
  406. package/dist/mcp/build-server.d.ts +9 -0
  407. package/dist/mcp/build-server.js +37 -8
  408. package/dist/mcp-client/oauth-client.d.ts +7 -0
  409. package/dist/mcp-client/oauth-client.js +12 -1
  410. package/dist/notifications/routes.d.ts +1 -1
  411. package/dist/oauth-tokens/index.d.ts +1 -1
  412. package/dist/oauth-tokens/index.js +1 -1
  413. package/dist/oauth-tokens/lifecycle.d.ts +11 -0
  414. package/dist/oauth-tokens/lifecycle.js +17 -0
  415. package/dist/oauth-tokens/store.js +7 -0
  416. package/dist/observability/posthog-ai.d.ts +15 -1
  417. package/dist/observability/posthog-ai.js +24 -12
  418. package/dist/observability/traces.js +158 -28
  419. package/dist/onboarding/app-profile.js +2 -2
  420. package/dist/onboarding/plugin.js +10 -2
  421. package/dist/onboarding/types.d.ts +2 -0
  422. package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
  423. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  424. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  425. package/dist/provider-api/index.js +2 -0
  426. package/dist/resources/handlers.d.ts +1 -1
  427. package/dist/resources/store.js +13 -4
  428. package/dist/scripts/agent-engines/list-agent-engines.js +29 -3
  429. package/dist/scripts/db/check-scoping.js +9 -6
  430. package/dist/secrets/register-framework-secrets.js +1 -1
  431. package/dist/secrets/routes.d.ts +6 -6
  432. package/dist/server/action-discovery.js +5 -0
  433. package/dist/server/agent-chat/action-filters-a2a.d.ts +27 -3
  434. package/dist/server/agent-chat/action-filters-a2a.js +48 -9
  435. package/dist/server/agent-chat-plugin.js +36 -9
  436. package/dist/server/agent-discovery.js +43 -20
  437. package/dist/server/auth.js +18 -16
  438. package/dist/server/beta-opt-out-html.js +45 -4
  439. package/dist/server/better-auth-instance.d.ts +2 -1
  440. package/dist/server/better-auth-instance.js +23 -7
  441. package/dist/server/builder-browser.d.ts +4 -0
  442. package/dist/server/builder-browser.js +23 -1
  443. package/dist/server/builder-design-systems.d.ts +4 -1
  444. package/dist/server/builder-design-systems.js +87 -6
  445. package/dist/server/builder-oauth.d.ts +1 -7
  446. package/dist/server/builder-oauth.js +80 -163
  447. package/dist/server/core-routes-plugin.d.ts +29 -0
  448. package/dist/server/core-routes-plugin.js +113 -21
  449. package/dist/server/default-plugins.d.ts +18 -0
  450. package/dist/server/default-plugins.js +22 -0
  451. package/dist/server/edge.d.ts +1 -0
  452. package/dist/server/edge.js +1 -0
  453. package/dist/server/framework-request-handler.js +31 -3
  454. package/dist/server/google-oauth.d.ts +3 -0
  455. package/dist/server/google-oauth.js +3 -0
  456. package/dist/server/index.d.ts +4 -4
  457. package/dist/server/index.js +3 -3
  458. package/dist/server/onboarding-html.js +37 -3
  459. package/dist/server/workspace-provider-oauth.d.ts +6 -1
  460. package/dist/server/workspace-provider-oauth.js +72 -20
  461. package/dist/shared/agent-sidebar-url.d.ts +1 -0
  462. package/dist/shared/agent-sidebar-url.js +1 -0
  463. package/dist/shared/environment-lanes.d.ts +2 -0
  464. package/dist/shared/environment-lanes.js +3 -1
  465. package/dist/shared/index.d.ts +3 -1
  466. package/dist/shared/index.js +3 -1
  467. package/dist/shared/surface-visibility.d.ts +31 -0
  468. package/dist/shared/surface-visibility.js +57 -0
  469. package/dist/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  470. package/dist/templates/chat/app/routes.ts +3 -1
  471. package/dist/templates/chat/vitest.config.ts +8 -0
  472. package/dist/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  473. package/dist/templates/default/app/routes.ts +3 -1
  474. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  475. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
  476. package/dist/tracking/registry.d.ts +11 -0
  477. package/dist/tracking/registry.js +5 -2
  478. package/dist/triggers/actions.js +10 -3
  479. package/dist/usage/store.js +23 -3
  480. package/dist/user-profile/actions/get-auth-methods.js +18 -5
  481. package/dist/vite/client.js +24 -5
  482. package/docs/content/actions-access-control.mdx +43 -4
  483. package/docs/content/actions-defining.mdx +16 -0
  484. package/docs/content/template-clips-capture-everywhere.mdx +29 -30
  485. package/docs/content/template-clips-developers.mdx +4 -4
  486. package/docs/content/template-clips.mdx +3 -1
  487. package/package.json +3 -3
  488. package/src/eject/workspace-connections.ts +4 -0
  489. package/src/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  490. package/src/templates/chat/app/routes.ts +3 -1
  491. package/src/templates/chat/vitest.config.ts +8 -0
  492. package/src/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  493. package/src/templates/default/app/routes.ts +3 -1
  494. package/src/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  495. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
  496. /package/corpus/templates/dispatch/app/routes/{apps.$appId.tsx → apps.$appId.$.tsx} +0 -0
@@ -42,6 +42,7 @@ export function DesignBottomToolbar({
42
42
  pinMode,
43
43
  drawMode,
44
44
  activeTool,
45
+ shapeTool,
45
46
  isOverview,
46
47
  hasActiveFile,
47
48
  onMove,
@@ -62,6 +63,9 @@ export function DesignBottomToolbar({
62
63
  pinMode: boolean;
63
64
  drawMode: boolean;
64
65
  activeTool: DesignTool;
66
+ /** The shape the group button draws when pressed directly: the last one
67
+ * picked, since activeTool has already fallen back to move after a draw. */
68
+ shapeTool: ShapeTool;
65
69
  isOverview: boolean;
66
70
  hasActiveFile: boolean;
67
71
  onMove: () => void;
@@ -89,7 +93,7 @@ export function DesignBottomToolbar({
89
93
  ]);
90
94
  const activeShape = shapeTools.has(activeTool)
91
95
  ? (activeTool as ShapeTool)
92
- : "rect";
96
+ : shapeTool;
93
97
  const shapeIcon = (tool: ShapeTool, className: string) => {
94
98
  switch (tool) {
95
99
  case "line":
@@ -298,7 +302,7 @@ export function DesignBottomToolbar({
298
302
  key: "draw",
299
303
  label: t("designEditor.modes.draw"),
300
304
  icon: <IconBrush className="size-4" />,
301
- shortcut: "Y",
305
+ shortcut: "⇧Y",
302
306
  active: activeTool === "draw" && mode === "annotate" && drawMode,
303
307
  disabled: !hasActiveFile,
304
308
  onSelect: onDraw,
@@ -39,14 +39,14 @@ export function DesignWorkspaceRail({
39
39
  onMotionToggle,
40
40
  onPanelChange,
41
41
  }: {
42
- activePanel: DesignLeftPanel;
42
+ activePanel: DesignLeftPanel | null;
43
43
  disabledPanels?: ReadonlySet<DesignLeftPanel>;
44
44
  hiddenPanels?: ReadonlySet<DesignLeftPanel>;
45
45
  motionOpen?: boolean;
46
46
  motionDisabled?: boolean;
47
47
  projectMenu: ReactNode;
48
48
  onMotionToggle?: () => void;
49
- onPanelChange: (panel: DesignLeftPanel) => void;
49
+ onPanelChange: (panel: DesignLeftPanel | null) => void;
50
50
  }) {
51
51
  const t = useT();
52
52
  const items: Array<{
@@ -137,7 +137,7 @@ export function DesignWorkspaceRail({
137
137
  event.preventDefault();
138
138
  return;
139
139
  }
140
- onPanelChange(item.panel);
140
+ onPanelChange(active ? null : item.panel);
141
141
  }}
142
142
  onPointerEnter={() => {
143
143
  if (item.panel === "code") preloadCodeWorkbench();
@@ -175,7 +175,7 @@ export function DesignWorkspaceRail({
175
175
  );
176
176
  })}
177
177
  </div>
178
- {onMotionToggle ? (
178
+ {onMotionToggle && SHOW_DESIGN_SECONDARY_LEFT_PANELS ? (
179
179
  <div className="mt-4 flex w-full flex-col items-center border-t border-border/70 pt-3">
180
180
  <Tooltip>
181
181
  <TooltipTrigger asChild>
@@ -125,7 +125,7 @@ export const DESIGN_SHORTCUTS: readonly DesignShortcutDefinition[] = [
125
125
  shortcut({
126
126
  id: "draw-tool",
127
127
  category: "tools",
128
- bindings: ["y"],
128
+ bindings: ["shift+y"],
129
129
  labelKey: "designEditor.keyboardShortcuts.commands.drawTool",
130
130
  handler: "onDrawTool",
131
131
  }),
@@ -386,13 +386,6 @@ export const DESIGN_SHORTCUTS: readonly DesignShortcutDefinition[] = [
386
386
  labelKey: "designEditor.keyboardShortcuts.commands.delete",
387
387
  handler: "onDelete",
388
388
  }),
389
- shortcut({
390
- id: "rename",
391
- category: "edit",
392
- bindings: ["$mod+r"],
393
- labelKey: "designEditor.keyboardShortcuts.commands.rename",
394
- handler: "onRename",
395
- }),
396
389
  shortcut({
397
390
  id: "find",
398
391
  category: "edit",
@@ -422,6 +415,15 @@ export const DESIGN_SHORTCUTS: readonly DesignShortcutDefinition[] = [
422
415
  labelKey: "designEditor.keyboardShortcuts.commands.swapFillStroke",
423
416
  handler: "onSwapFillStroke",
424
417
  }),
418
+ shortcut({
419
+ id: "eyedropper",
420
+ category: "edit",
421
+ // Apple platforms also accept literal ctrl+c; only the cross-platform
422
+ // binding is advertised so the row reads the same everywhere.
423
+ bindings: ["i"],
424
+ labelKey: "designEditor.keyboardShortcuts.commands.eyedropper",
425
+ handler: "onEyedropper",
426
+ }),
425
427
 
426
428
  shortcut({
427
429
  id: "bring-forward",
@@ -2,6 +2,7 @@ import type {
2
2
  DistanceGuideBand,
3
3
  EqualGapGuide,
4
4
  FrameBounds,
5
+ ProximityMeasurement,
5
6
  } from "@shared/canvas-math";
6
7
 
7
8
  import type {
@@ -54,8 +55,10 @@ export function equalGapGuidesEqual(a: EqualGapGuide[], b: EqualGapGuide[]) {
54
55
  if (
55
56
  x.orientation !== y.orientation ||
56
57
  x.gap !== y.gap ||
57
- !distanceGuideBandEqual(x.bands[0], y.bands[0]) ||
58
- !distanceGuideBandEqual(x.bands[1], y.bands[1])
58
+ x.bands.length !== y.bands.length ||
59
+ x.bands.some(
60
+ (band, index) => !distanceGuideBandEqual(band, y.bands[index]),
61
+ )
59
62
  ) {
60
63
  return false;
61
64
  }
@@ -63,6 +66,20 @@ export function equalGapGuidesEqual(a: EqualGapGuide[], b: EqualGapGuide[]) {
63
66
  return true;
64
67
  }
65
68
 
69
+ export function proximityMeasurementsEqual(
70
+ a: ProximityMeasurement[],
71
+ b: ProximityMeasurement[],
72
+ ) {
73
+ if (a === b) return true;
74
+ if (a.length !== b.length) return false;
75
+ return a.every(
76
+ (measurement, index) =>
77
+ measurement.orientation === b[index].orientation &&
78
+ measurement.gap === b[index].gap &&
79
+ distanceGuideBandEqual(measurement.band, b[index].band),
80
+ );
81
+ }
82
+
66
83
  export function altHoverMeasurementLineEqual(
67
84
  a: AltHoverMeasurementLine | null,
68
85
  b: AltHoverMeasurementLine | null,
@@ -3,7 +3,7 @@ import type {
3
3
  EqualGapGuide,
4
4
  FrameBounds,
5
5
  } from "@shared/canvas-math";
6
- import type { PenPath } from "@shared/pen-path";
6
+ import type { PenCuspLatch, PenPath } from "@shared/pen-path";
7
7
  import type { ReactNode } from "react";
8
8
 
9
9
  import type {
@@ -344,7 +344,10 @@ export interface MultiScreenCanvasProps {
344
344
  *
345
345
  * Replaces the legacy onCreateBoardObject.
346
346
  */
347
- onBoardDrawPrimitive?: (primitive: CanvasPrimitiveInsert) => boolean | string;
347
+ onBoardDrawPrimitive?: (
348
+ primitive: CanvasPrimitiveInsert,
349
+ options?: { nextTool?: "move" | "pen" },
350
+ ) => boolean | string;
348
351
  // ── Board edit callbacks (active-target model) ───────────────────────────
349
352
  /**
350
353
  * When true the board <DesignCanvas> is in edit mode.
@@ -799,6 +802,7 @@ export interface PenNodeDragState {
799
802
  * being an instant, undraggable straight-line close.
800
803
  */
801
804
  closing?: boolean;
805
+ cuspLatch: PenCuspLatch;
802
806
  }
803
807
 
804
808
  /** Dragging an anchor square of a `vectorEdit` overlay path (P-VE1). Anchor
@@ -825,6 +829,9 @@ export interface VectorEditHandleDragState {
825
829
  which: "in" | "out";
826
830
  pathBefore: PenPath;
827
831
  hasMoved: boolean;
832
+ /** Alt is a one-way latch for the drag: releasing it must not re-mirror the
833
+ * pair the user just broke. */
834
+ symmetryBroken: boolean;
828
835
  }
829
836
 
830
837
  export interface DraftCreationPreview {
@@ -94,3 +94,18 @@ export function Header() {
94
94
  </header>
95
95
  );
96
96
  }
97
+
98
+ /**
99
+ * Mobile counterpart of the header actions slot: <Header> is `md:flex`, so
100
+ * without this every control a page publishes through `useSetHeaderActions`
101
+ * is unmounted below the `md` breakpoint.
102
+ */
103
+ export function MobileHeaderActions() {
104
+ const actions = useHeaderActions();
105
+ if (!actions) return null;
106
+ return (
107
+ <div className="flex h-12 shrink-0 items-center gap-2 overflow-x-auto border-b border-border bg-background px-4 md:hidden">
108
+ {actions}
109
+ </div>
110
+ );
111
+ }
@@ -31,7 +31,7 @@ import {
31
31
  FigmaLinkComposerBubble,
32
32
  useDetectedFigmaComposerLink,
33
33
  } from "../editor/FigmaLinkComposerBubble";
34
- import { Header } from "./Header";
34
+ import { Header, MobileHeaderActions } from "./Header";
35
35
  import { Sidebar } from "./Sidebar";
36
36
 
37
37
  interface LayoutProps {
@@ -236,7 +236,12 @@ export function Layout({ children }: LayoutProps) {
236
236
  </span>
237
237
  </div>
238
238
  )}
239
- {!hideHeader && <Header />}
239
+ {!hideHeader && (
240
+ <>
241
+ <MobileHeaderActions />
242
+ <Header />
243
+ </>
244
+ )}
240
245
  <main
241
246
  className={cn(
242
247
  "agent-native-app-main flex-1",
@@ -179,9 +179,9 @@ export interface UseDesignHotkeysProps {
179
179
  * internal canvas clipboard's contents. */
180
180
  onPasteToReplace?: DesignHotkeyHandler;
181
181
  /**
182
- * Figma's Control+C on Apple platforms — eyedropper: sample a color from
183
- * anywhere on screen and apply it to the current selection. A one-shot
184
- * action, not a persistent tool.
182
+ * Figma's I (and literal Control+C on Apple platforms) — eyedropper: sample
183
+ * a color from anywhere on screen and apply it to the current selection. A
184
+ * one-shot action, not a persistent tool.
185
185
  */
186
186
  onEyedropper?: DesignHotkeyHandler;
187
187
  /**
@@ -228,7 +228,6 @@ const TOOL_SHORTCUTS: Record<
228
228
  h: { tool: "hand", handler: "onHandTool" },
229
229
  k: { tool: "scale", handler: "onScaleTool" },
230
230
  c: { tool: "comment", handler: "onCommentTool" },
231
- y: { tool: "draw", handler: "onDrawTool" },
232
231
  };
233
232
 
234
233
  // H1: shift+key variants of a base tool shortcut (Figma muscle-memory), e.g.
@@ -240,6 +239,9 @@ const SHIFT_TOOL_SHORTCUTS: Record<
240
239
  { tool: DesignHotkeyTool; handler: keyof UseDesignHotkeysProps }
241
240
  > = {
242
241
  l: { tool: "arrow", handler: "onArrowTool" },
242
+ // Draw switches the whole editor into annotate mode, so it takes a
243
+ // modifier: a bare letter flips modes by accident.
244
+ y: { tool: "draw", handler: "onDrawTool" },
243
245
  };
244
246
 
245
247
  export function isDesignHotkeyEditableTarget(target: EventTarget | null) {
@@ -554,6 +556,11 @@ export function handleDesignHotkey(
554
556
  if (key === "v") return runDistribute("vertical");
555
557
  }
556
558
 
559
+ // Figma's I — the Control+C binding below is macOS-only.
560
+ if (!primary && !event.altKey && !event.shiftKey && key === "i") {
561
+ return run(props.onEyedropper);
562
+ }
563
+
557
564
  // On macOS Figma reserves literal Control+C for Pick color while Cmd+C
558
565
  // remains Copy. Keep Ctrl+C as Copy on non-Apple platforms, where Ctrl is
559
566
  // the platform's primary modifier and Figma presents platform-specific
@@ -582,13 +589,11 @@ export function handleDesignHotkey(
582
589
  if (primary && key === "d") {
583
590
  return runSharedCanvasCommand() || run(props.onDuplicate);
584
591
  }
585
- // Figma's Shift+Cmd+R — "Paste to replace" — must be checked BEFORE plain
586
- // Cmd+R (rename) so shift wins; onPasteToReplace absent falls through to
587
- // rename so existing behavior is unaffected until the handler is wired.
592
+ // Keep Shift+Cmd+R available for Figma's "Paste to replace" command. Bare
593
+ // Cmd/Ctrl+R stays native so browser refresh keeps its expected meaning.
588
594
  if (primary && event.shiftKey && key === "r") {
589
595
  return run(props.onPasteToReplace);
590
596
  }
591
- if (primary && key === "r") return run(props.onRename);
592
597
  // Cmd+Shift+H/L (hide/lock the current selection) must take precedence over
593
598
  // the unmodified/shift-only h/l transform and alignment families.
594
599
  if (primary && event.shiftKey && key === "h") {
@@ -119,7 +119,7 @@ const enUS = {
119
119
  color: "Color",
120
120
  align: "Align",
121
121
  lineHeight: "Line Height",
122
- tracking: "Tracking",
122
+ tracking: "Letter spacing",
123
123
  direction: "Direction",
124
124
  justify: "Justify",
125
125
  gap: "Gap",
@@ -809,6 +809,7 @@ const enUS = {
809
809
  penTool: "Pen tool",
810
810
  handTool: "Hand tool",
811
811
  scaleTool: "Scale tool",
812
+ eyedropper: "Eyedropper", // i18n-copy-ignore every keyboardShortcuts.commands.* translation lives in i18n-keyboard-shortcuts.ts
812
813
  commentTool: "Comment tool",
813
814
  drawTool: "Draw tool",
814
815
  showLayers: "Show layers",
@@ -1789,7 +1790,7 @@ const designLocaleOverrides = {
1789
1790
  color: "颜色",
1790
1791
  align: "对齐",
1791
1792
  lineHeight: "行高",
1792
- tracking: "追踪",
1793
+ tracking: "字间距",
1793
1794
  direction: "方向",
1794
1795
  justify: "证明合法",
1795
1796
  gap: "差距",
@@ -2212,7 +2213,7 @@ const designLocaleOverrides = {
2212
2213
  color: "Color",
2213
2214
  align: "Alinear",
2214
2215
  lineHeight: "Altura de línea",
2215
- tracking: "Seguimiento",
2216
+ tracking: "Espaciado entre letras",
2216
2217
  direction: "Dirección",
2217
2218
  justify: "Justificar",
2218
2219
  gap: "Brecha",
@@ -2659,7 +2660,7 @@ const designLocaleOverrides = {
2659
2660
  color: "Couleur",
2660
2661
  align: "Aligner",
2661
2662
  lineHeight: "Hauteur de ligne",
2662
- tracking: "Suivi",
2663
+ tracking: "Espacement des lettres",
2663
2664
  direction: "Direction",
2664
2665
  justify: "Justifier",
2665
2666
  gap: "Écart",
@@ -3111,7 +3112,7 @@ const designLocaleOverrides = {
3111
3112
  color: "Farbe",
3112
3113
  align: "Ausrichten",
3113
3114
  lineHeight: "Zeilenhöhe",
3114
- tracking: "Verfolgung",
3115
+ tracking: "Buchstabenabstand",
3115
3116
  direction: "Richtung",
3116
3117
  justify: "Rechtfertigen",
3117
3118
  gap: "Lücke",
@@ -3563,7 +3564,7 @@ const designLocaleOverrides = {
3563
3564
  color: "色",
3564
3565
  align: "整列",
3565
3566
  lineHeight: "線の高さ",
3566
- tracking: "トラッキング",
3567
+ tracking: "文字間隔",
3567
3568
  direction: "方向",
3568
3569
  justify: "正当化する",
3569
3570
  gap: "ギャップ",
@@ -4010,7 +4011,7 @@ const designLocaleOverrides = {
4010
4011
  color: "색상",
4011
4012
  align: "맞추다",
4012
4013
  lineHeight: "라인 높이",
4013
- tracking: "추적",
4014
+ tracking: "자간",
4014
4015
  direction: "방향",
4015
4016
  justify: "신이 옳다고 하다",
4016
4017
  gap: "갭",
@@ -4449,7 +4450,7 @@ const designLocaleOverrides = {
4449
4450
  color: "Cor",
4450
4451
  align: "Alinhar",
4451
4452
  lineHeight: "Altura da linha",
4452
- tracking: "Monitorando",
4453
+ tracking: "Espaçamento entre letras",
4453
4454
  direction: "Direção",
4454
4455
  justify: "Justificar",
4455
4456
  gap: "Brecha",
@@ -4896,7 +4897,7 @@ const designLocaleOverrides = {
4896
4897
  color: "रंग",
4897
4898
  align: "संरेखित",
4898
4899
  lineHeight: "ऊंची लाईन",
4899
- tracking: "ट्रैकिंग",
4900
+ tracking: "अक्षर रिक्ति",
4900
4901
  direction: "दिशा",
4901
4902
  justify: "औचित्य",
4902
4903
  gap: "अंतर",
@@ -5332,7 +5333,7 @@ const designLocaleOverrides = {
5332
5333
  color: "لون",
5333
5334
  align: "محاذاة",
5334
5335
  lineHeight: "ارتفاع الخط",
5335
- tracking: "تتبع",
5336
+ tracking: "تباعد الأحرف",
5336
5337
  direction: "اتجاه",
5337
5338
  justify: "يبرر",
5338
5339
  gap: "فجوة",
@@ -3,6 +3,7 @@ import { type LocaleCode } from "@agent-native/core/client/i18n";
3
3
  interface KeyboardShortcutLabels {
4
4
  title: string;
5
5
  essential: string;
6
+ eyedropper: string;
6
7
  shape: string;
7
8
  selection: string;
8
9
  cursor: string;
@@ -44,6 +45,7 @@ interface KeyboardKeyLabels {
44
45
  export const keyboardShortcutLabels = {
45
46
  "zh-TW": {
46
47
  title: "鍵盤快速鍵",
48
+ eyedropper: "取色器",
47
49
  essential: "基本",
48
50
  shape: "形狀",
49
51
  selection: "選取",
@@ -62,6 +64,7 @@ export const keyboardShortcutLabels = {
62
64
  },
63
65
  "zh-CN": {
64
66
  title: "键盘快捷键",
67
+ eyedropper: "取色器",
65
68
  essential: "基本",
66
69
  shape: "形状",
67
70
  selection: "选择",
@@ -80,6 +83,7 @@ export const keyboardShortcutLabels = {
80
83
  },
81
84
  "es-ES": {
82
85
  title: "Atajos de teclado",
86
+ eyedropper: "Cuentagotas",
83
87
  essential: "Esenciales",
84
88
  shape: "Formas",
85
89
  selection: "Selección",
@@ -99,6 +103,7 @@ export const keyboardShortcutLabels = {
99
103
  },
100
104
  "fr-FR": {
101
105
  title: "Raccourcis clavier",
106
+ eyedropper: "Pipette",
102
107
  essential: "Essentiels",
103
108
  shape: "Formes",
104
109
  selection: "Sélection",
@@ -119,6 +124,7 @@ export const keyboardShortcutLabels = {
119
124
  },
120
125
  "de-DE": {
121
126
  title: "Tastenkürzel",
127
+ eyedropper: "Pipette",
122
128
  essential: "Grundlagen",
123
129
  shape: "Formen",
124
130
  selection: "Auswahl",
@@ -139,6 +145,7 @@ export const keyboardShortcutLabels = {
139
145
  },
140
146
  "ja-JP": {
141
147
  title: "キーボードショートカット",
148
+ eyedropper: "スポイトツール",
142
149
  essential: "基本",
143
150
  shape: "シェイプ",
144
151
  selection: "選択",
@@ -157,6 +164,7 @@ export const keyboardShortcutLabels = {
157
164
  },
158
165
  "ko-KR": {
159
166
  title: "키보드 단축키",
167
+ eyedropper: "스포이드",
160
168
  essential: "필수",
161
169
  shape: "도형",
162
170
  selection: "선택",
@@ -175,6 +183,7 @@ export const keyboardShortcutLabels = {
175
183
  },
176
184
  "pt-BR": {
177
185
  title: "Atalhos de teclado",
186
+ eyedropper: "Conta-gotas",
178
187
  essential: "Essenciais",
179
188
  shape: "Formas",
180
189
  selection: "Seleção",
@@ -195,6 +204,7 @@ export const keyboardShortcutLabels = {
195
204
  },
196
205
  "hi-IN": {
197
206
  title: "कीबोर्ड शॉर्टकट",
207
+ eyedropper: "आई-ड्रॉपर",
198
208
  essential: "आवश्यक",
199
209
  shape: "आकृति",
200
210
  selection: "चयन",
@@ -213,6 +223,7 @@ export const keyboardShortcutLabels = {
213
223
  },
214
224
  "ar-SA": {
215
225
  title: "اختصارات لوحة المفاتيح",
226
+ eyedropper: "أداة القطارة",
216
227
  essential: "أساسي",
217
228
  shape: "الأشكال",
218
229
  selection: "التحديد",
@@ -575,6 +586,7 @@ export function attachLocalizedKeyboardShortcuts<
575
586
  penTool: d.tools.pen,
576
587
  handTool: d.tools.hand,
577
588
  scaleTool: d.tools.scale,
589
+ eyedropper: labels.eyedropper,
578
590
  commentTool: d.pinComment,
579
591
  drawTool: d.modes.draw,
580
592
  showLayers: layers.title,
@@ -0,0 +1,68 @@
1
+ export interface DesignSystemData {
2
+ source?: string;
3
+ builderJobId?: string;
4
+ builderStatus?: string;
5
+ builderSyncedAt?: string;
6
+ colors?: {
7
+ primary?: unknown;
8
+ secondary?: unknown;
9
+ accent?: unknown;
10
+ background?: unknown;
11
+ surface?: unknown;
12
+ text?: unknown;
13
+ textMuted?: unknown;
14
+ };
15
+ typography?: {
16
+ headingFont?: unknown;
17
+ bodyFont?: unknown;
18
+ headingWeight?: unknown;
19
+ bodyWeight?: unknown;
20
+ };
21
+ spacing?: Record<string, unknown>;
22
+ borders?: Record<string, unknown>;
23
+ logos?: Array<{ url?: string; name?: string; variant?: string }>;
24
+ defaults?: Record<string, unknown>;
25
+ notes?: unknown;
26
+ /** The source system's own named vocabulary; absent on kits predating it. */
27
+ tokens?: unknown;
28
+ }
29
+
30
+ export function parseDesignSystemData(
31
+ dataStr: string,
32
+ ): DesignSystemData | null {
33
+ try {
34
+ const parsed = JSON.parse(dataStr);
35
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
36
+ return null;
37
+ }
38
+ return parsed as DesignSystemData;
39
+ } catch (error) {
40
+ if (error instanceof SyntaxError) return null;
41
+ throw error;
42
+ }
43
+ }
44
+
45
+ export function shouldRefreshBuilderDesignSystem(
46
+ system: Pick<{ accessRole?: string; data: string }, "accessRole" | "data">,
47
+ ): boolean {
48
+ const parsed = parseDesignSystemData(system.data);
49
+ return (
50
+ (system.accessRole === "owner" ||
51
+ system.accessRole === "admin" ||
52
+ system.accessRole === "editor") &&
53
+ parsed?.source === "builder" &&
54
+ (parsed.builderStatus === "in-progress" ||
55
+ ((parsed.builderStatus === "ready" ||
56
+ parsed.builderStatus === "complete" ||
57
+ parsed.builderStatus === "completed") &&
58
+ typeof parsed.builderSyncedAt !== "string"))
59
+ );
60
+ }
61
+
62
+ export function builderRefreshKey(system: {
63
+ id: string;
64
+ data: string;
65
+ }): string {
66
+ const parsed = parseDesignSystemData(system.data);
67
+ return `${system.id}:${parsed?.builderJobId ?? "unknown"}`;
68
+ }