@agent-native/core 0.169.1 → 0.171.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 (463) 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/query-agent-native-analytics.ts +1 -1
  6. package/corpus/templates/analytics/app/i18n-data.ts +28 -0
  7. package/corpus/templates/analytics/app/pages/Agents.tsx +25 -1
  8. package/corpus/templates/analytics/app/routes/$.tsx +10 -0
  9. package/corpus/templates/analytics/app/routes.ts +3 -1
  10. package/corpus/templates/analytics/changelog/2026-08-22-fixed-the-agent-native-templates-first-party-dashboard-panel.md +6 -0
  11. package/corpus/templates/analytics/changelog/2026-08-22-org-admin-panels-no-longer-report-a-database-error-as-a-per.md +9 -0
  12. package/corpus/templates/analytics/changelog/2026-08-22-slack-requests-report-invalid-inputs.md +6 -0
  13. package/corpus/templates/analytics/changelog/2026-08-22-unknown-analytics-links-now-return-a-real-not-found-status.md +6 -0
  14. package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +2 -1
  15. package/corpus/templates/analytics/docs/schemas/tracked-events.md +2 -0
  16. package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +29 -7
  17. package/corpus/templates/analytics/server/handlers/slack.ts +59 -5
  18. package/corpus/templates/analytics/server/lib/db-admin-connections.ts +11 -6
  19. package/corpus/templates/analytics/server/lib/first-party-analytics.ts +132 -2
  20. package/corpus/templates/analytics/server/lib/slack.ts +4 -2
  21. package/corpus/templates/analytics/vitest.config.ts +6 -1
  22. package/corpus/templates/assets/.agents/skills/secrets/SKILL.md +11 -4
  23. package/corpus/templates/assets/app/routes/library.tsx +5 -3
  24. package/corpus/templates/assets/app/routes.ts +3 -1
  25. package/corpus/templates/assets/changelog/2026-08-22-library-page-loads-again-instead-of-crashing-on-open.md +6 -0
  26. package/corpus/templates/assets/vitest.config.ts +6 -1
  27. package/corpus/templates/brain/.agents/skills/secrets/SKILL.md +11 -4
  28. package/corpus/templates/brain/app/components/ui/pointer-lock.ts +1 -0
  29. package/corpus/templates/brain/app/routes/sources.tsx +8 -3
  30. package/corpus/templates/brain/changelog/2026-08-22-tuning-or-adding-a-source-no-longer-leaves-the-sources-page.md +6 -0
  31. package/corpus/templates/brain/vitest.config.ts +1 -0
  32. package/corpus/templates/calendar/.agents/skills/secrets/SKILL.md +11 -4
  33. package/corpus/templates/calendar/actions/list-booking-links.ts +83 -4
  34. package/corpus/templates/calendar/actions/update-booking-link.ts +4 -3
  35. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +11 -3
  36. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +1 -1
  37. package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +103 -44
  38. package/corpus/templates/calendar/app/components/calendar/OutOfOfficeEvent.tsx +28 -24
  39. package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +9 -2
  40. package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +47 -58
  41. package/corpus/templates/calendar/app/hooks/use-booking-links.ts +5 -1
  42. package/corpus/templates/calendar/app/lib/event-layout.ts +52 -26
  43. package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +126 -98
  44. package/corpus/templates/calendar/app/pages/CalendarView.tsx +1 -0
  45. package/corpus/templates/calendar/app/pages/Settings.tsx +88 -81
  46. package/corpus/templates/calendar/app/routes.ts +3 -1
  47. package/corpus/templates/calendar/changelog/2026-08-22-booking-link-visibility-respects-shared-access.md +6 -0
  48. package/corpus/templates/calendar/changelog/2026-08-22-clicking-an-out-of-office-event-s-marker-no-longer-creates-a.md +6 -0
  49. package/corpus/templates/calendar/changelog/2026-08-22-event-detail-views-now-show-your-calendar-timezone.md +6 -0
  50. package/corpus/templates/calendar/changelog/2026-08-22-google-calendar-can-now-connect-with-the-shared-google-oauth.md +6 -0
  51. package/corpus/templates/calendar/changelog/2026-08-22-overlapping-events-now-show-each-others-boundaries.md +6 -0
  52. package/corpus/templates/calendar/changelog/2026-08-22-public-booking-pages-now-offer-time-slots-from-the-host-s-we.md +6 -0
  53. package/corpus/templates/calendar/server/handlers/bookings.ts +5 -7
  54. package/corpus/templates/calendar/server/handlers/google-auth.ts +10 -2
  55. package/corpus/templates/calendar/server/lib/google-calendar.ts +139 -14
  56. package/corpus/templates/calendar/server/onboarding.ts +85 -0
  57. package/corpus/templates/calendar/server/plugins/agent-chat.ts +2 -0
  58. package/corpus/templates/calendar/shared/api.ts +9 -1
  59. package/corpus/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  60. package/corpus/templates/chat/app/routes.ts +3 -1
  61. package/corpus/templates/chat/vitest.config.ts +8 -0
  62. package/corpus/templates/clips/.agents/skills/secrets/SKILL.md +11 -4
  63. package/corpus/templates/clips/actions/get-meeting.ts +9 -4
  64. package/corpus/templates/clips/actions/list-recordings.ts +16 -3
  65. package/corpus/templates/clips/actions/search-meetings.ts +1 -0
  66. package/corpus/templates/clips/actions/view-screen.ts +8 -1
  67. package/corpus/templates/clips/app/components/meetings/meeting-history-row.tsx +32 -1
  68. package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +1 -1
  69. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +29 -1
  70. package/corpus/templates/clips/app/i18n/en-US.ts +5 -0
  71. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +33 -4
  72. package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +1 -0
  73. package/corpus/templates/clips/app/routes/access-request.approve.tsx +16 -9
  74. package/corpus/templates/clips/app/routes/embed.$shareId.tsx +17 -7
  75. package/corpus/templates/clips/app/routes/share.$shareId.tsx +17 -7
  76. package/corpus/templates/clips/changelog/2026-08-21-camera-bubble-black-circle.md +6 -0
  77. package/corpus/templates/clips/changelog/2026-08-22-screen-recordings-respect-the-microphone-toggle.md +6 -0
  78. package/corpus/templates/clips/changelog/2026-08-22-the-recordings-library-no-longer-fails-right-after-server-start.md +6 -0
  79. package/corpus/templates/clips/changelog/2026-08-23-the-agent-can-see-your-library-right-after-server-start.md +6 -0
  80. package/corpus/templates/clips/chrome-extension/src/background.ts +1 -2
  81. package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +39 -7
  82. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +21 -25
  83. package/corpus/templates/clips/desktop/src/app.tsx +53 -24
  84. package/corpus/templates/clips/desktop/src/lib/bubble-playback.ts +68 -0
  85. package/corpus/templates/clips/desktop/src/lib/recorder.ts +3 -0
  86. package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +72 -14
  87. package/corpus/templates/clips/desktop/src/lib/updater.ts +8 -3
  88. package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +162 -20
  89. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +43 -6
  90. package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +150 -13
  91. package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +12 -0
  92. package/corpus/templates/clips/server/lib/calendar-event-meetings.ts +28 -3
  93. package/corpus/templates/clips/server/lib/emails.ts +17 -33
  94. package/corpus/templates/content/.agents/skills/secrets/SKILL.md +11 -4
  95. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +140 -15
  96. package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +12 -14
  97. package/corpus/templates/content/app/components/ui/pointer-lock.ts +1 -0
  98. package/corpus/templates/content/app/hooks/use-content-database.ts +18 -2
  99. package/corpus/templates/content/app/hooks/use-local-storage.ts +38 -22
  100. package/corpus/templates/content/app/i18n-data.ts +25 -0
  101. package/corpus/templates/content/app/routes.ts +3 -1
  102. package/corpus/templates/content/changelog/2026-08-22-code-blocks-inserted-from-the-slash-menu-no-longer-get-stuck.md +6 -0
  103. package/corpus/templates/content/changelog/2026-08-22-the-sidebar-page-tree-no-longer-flashes-empty-after-creating-a-page.md +6 -0
  104. package/corpus/templates/content/docs/solutions/2026-08-21-content-mermaid-rendering-shape.md +233 -0
  105. package/corpus/templates/content/server/plugins/agent-chat.ts +9 -2
  106. package/corpus/templates/content/vitest.config.ts +7 -1
  107. package/corpus/templates/crm/.agents/skills/secrets/SKILL.md +11 -4
  108. package/corpus/templates/design/.agents/skills/secrets/SKILL.md +11 -4
  109. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +1383 -88
  110. package/corpus/templates/design/actions/generate-design.ts +98 -47
  111. package/corpus/templates/design/actions/get-design-system.ts +6 -1
  112. package/corpus/templates/design/actions/refresh-design-system-with-builder.ts +146 -0
  113. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +70 -26
  114. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +284 -136
  115. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +2057 -141
  116. package/corpus/templates/design/app/components/design/editor/DesignBottomToolbar.tsx +6 -2
  117. package/corpus/templates/design/app/components/design/editor/DesignWorkspaceRail.tsx +4 -4
  118. package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +10 -1
  119. package/corpus/templates/design/app/components/design/multi-screen/alt-hover-measurement.ts +19 -2
  120. package/corpus/templates/design/app/components/design/multi-screen/types.ts +9 -2
  121. package/corpus/templates/design/app/components/layout/Header.tsx +15 -0
  122. package/corpus/templates/design/app/components/layout/Layout.tsx +7 -2
  123. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +11 -4
  124. package/corpus/templates/design/app/i18n-data.ts +1 -0
  125. package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +12 -0
  126. package/corpus/templates/design/app/lib/design-system-data.ts +68 -0
  127. package/corpus/templates/design/app/pages/DesignEditor.tsx +77 -35
  128. package/corpus/templates/design/app/pages/DesignSystems.tsx +136 -42
  129. package/corpus/templates/design/app/pages/Index.tsx +2 -0
  130. package/corpus/templates/design/app/pages/Templates.tsx +0 -10
  131. package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +10 -0
  132. package/corpus/templates/design/app/pages/design-editor/collab-sync.ts +50 -0
  133. package/corpus/templates/design/app/pages/design-editor/commands/apply-design-editor-command.ts +1 -1
  134. package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +10 -8
  135. package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +6 -6
  136. package/corpus/templates/design/app/pages/design-editor/commands/apply-pending-visual-styles-with-agent.ts +1 -1
  137. package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +18 -7
  138. package/corpus/templates/design/app/pages/design-editor/commands/escape-hotkey.ts +4 -90
  139. package/corpus/templates/design/app/pages/design-editor/commands/layer-marquee-selection-change.ts +2 -1
  140. package/corpus/templates/design/app/pages/design-editor/commands/layer-selection-change.ts +4 -3
  141. package/corpus/templates/design/app/pages/design-editor/commands/screen-element-select.ts +12 -2
  142. package/corpus/templates/design/app/pages/design-editor/commands/screen-visual-style-change.ts +9 -2
  143. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-move-semantic-handoff.ts +1 -1
  144. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-semantic-handoff.ts +1 -1
  145. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-state-semantic-handoff.ts +1 -1
  146. package/corpus/templates/design/app/pages/design-editor/commands/start-sidebar-resize.ts +1 -1
  147. package/corpus/templates/design/app/pages/design-editor/editor-state.ts +11 -1
  148. package/corpus/templates/design/app/pages/design-editor/effects/adopt-db-file-content.ts +11 -19
  149. package/corpus/templates/design/app/pages/design-editor/effects/observe-collab-text.ts +6 -6
  150. package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +1 -1
  151. package/corpus/templates/design/app/pages/design-editor/effects/seed-collab-content.ts +12 -15
  152. package/corpus/templates/design/app/pages/design-editor/selection-state.ts +5 -59
  153. package/corpus/templates/design/app/pages/design-editor/tool-state.ts +8 -0
  154. package/corpus/templates/design/app/pages/design-editor/types.ts +3 -3
  155. package/corpus/templates/design/app/routes.ts +3 -1
  156. package/corpus/templates/design/changelog/2026-08-20-canvas-edits-patch-the-frame-instead-of-rebuilding-it.md +6 -0
  157. package/corpus/templates/design/changelog/2026-08-21-builder-design-system-imports-reconcile-after-indexing.md +6 -0
  158. package/corpus/templates/design/changelog/2026-08-21-draw-mode-needs-shift-y.md +6 -0
  159. package/corpus/templates/design/changelog/2026-08-21-eyedropper-shortcut.md +6 -0
  160. package/corpus/templates/design/changelog/2026-08-21-figma-style-alignment-guides-and-snapping.md +6 -0
  161. package/corpus/templates/design/changelog/2026-08-21-group-transforms-keep-the-selection.md +6 -0
  162. package/corpus/templates/design/changelog/2026-08-21-inspector-fields-keep-focus-on-enter.md +6 -0
  163. package/corpus/templates/design/changelog/2026-08-21-pen-alt-keeps-the-incoming-handle.md +6 -0
  164. package/corpus/templates/design/changelog/2026-08-21-pen-on-the-board-creates-one-vector.md +6 -0
  165. package/corpus/templates/design/changelog/2026-08-21-scale-a-multi-selection-from-the-group-handles.md +6 -0
  166. package/corpus/templates/design/changelog/2026-08-21-scale-resizes-text-with-the-object.md +6 -0
  167. package/corpus/templates/design/changelog/2026-08-21-selecting-another-object-keeps-the-scale-tool-armed.md +6 -0
  168. package/corpus/templates/design/changelog/2026-08-21-the-shape-tool-remembers-the-shape-you-picked.md +6 -0
  169. package/corpus/templates/design/changelog/2026-08-21-vectors-drawn-in-a-frame-land-where-you-drew-them.md +6 -0
  170. package/corpus/templates/design/changelog/2026-08-22-multi-screen-generation-no-longer-loses-a-saved-screens-layo.md +6 -0
  171. package/corpus/templates/design/changelog/2026-08-22-rename-and-search-fields-are-labeled-for-screen-readers.md +6 -0
  172. package/corpus/templates/design/package.json +2 -0
  173. package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +311 -0
  174. package/corpus/templates/design/shared/canvas-math.ts +612 -206
  175. package/corpus/templates/design/shared/pen-path.ts +37 -0
  176. package/corpus/templates/design/vitest.config.ts +7 -1
  177. package/corpus/templates/dispatch/.agents/skills/secrets/SKILL.md +11 -4
  178. package/corpus/templates/dispatch/actions/list-workspace-connections.ts +34 -3
  179. package/corpus/templates/dispatch/app/routes/integrations.tsx +55 -21
  180. package/corpus/templates/dispatch/app/routes.ts +3 -1
  181. package/corpus/templates/factory/.agents/skills/secrets/SKILL.md +11 -4
  182. package/corpus/templates/factory/.env.example +2 -7
  183. package/corpus/templates/factory/AGENTS.md +3 -0
  184. package/corpus/templates/factory/README.md +5 -3
  185. package/corpus/templates/factory/actions/create-factory.ts +16 -3
  186. package/corpus/templates/factory/actions/get-slack-feedback-context.ts +2 -0
  187. package/corpus/templates/factory/actions/get-triage-item.ts +2 -0
  188. package/corpus/templates/factory/actions/list-factory-audit.ts +116 -36
  189. package/corpus/templates/factory/actions/list-factory-automations.ts +2 -1
  190. package/corpus/templates/factory/actions/list-triage-items.ts +22 -19
  191. package/corpus/templates/factory/actions/run-factory-automation.ts +7 -3
  192. package/corpus/templates/factory/actions/save-factory-automation.ts +5 -2
  193. package/corpus/templates/factory/actions/save-triage-config.ts +2 -8
  194. package/corpus/templates/factory/actions/start-builder-for-item.ts +21 -0
  195. package/corpus/templates/factory/app/components/factory/FactoryAuditView.tsx +229 -297
  196. package/corpus/templates/factory/app/components/factory/FactorySettingsView.tsx +397 -247
  197. package/corpus/templates/factory/app/components/factory/FactorySourceSettingsGroup.tsx +33 -0
  198. package/corpus/templates/factory/app/components/factory/NewFactoryForm.tsx +202 -162
  199. package/corpus/templates/factory/app/i18n/en-US.ts +32 -4
  200. package/corpus/templates/factory/app/routes/factory.tsx +84 -11
  201. package/corpus/templates/factory/app/routes.ts +3 -1
  202. package/corpus/templates/factory/changelog/2026-08-21-activity-runs-use-automation-display-names.md +6 -0
  203. package/corpus/templates/factory/changelog/2026-08-21-create-and-settings-source-cards.md +6 -0
  204. package/corpus/templates/factory/changelog/2026-08-21-keep-automations-visible-while-running.md +6 -0
  205. package/corpus/templates/factory/changelog/2026-08-21-nested-factory-automations-can-poll.md +6 -0
  206. package/corpus/templates/factory/changelog/2026-08-21-settings-sticky-unsaved-bar.md +6 -0
  207. package/corpus/templates/factory/server/connectors/credentials.ts +10 -5
  208. package/corpus/templates/factory/server/lib/factory-audit-report.ts +412 -0
  209. package/corpus/templates/factory/server/lib/factory-config-reconcile.ts +321 -0
  210. package/corpus/templates/factory/server/lib/factory-scope.ts +25 -2
  211. package/corpus/templates/factory/server/lib/require-factory-automation.ts +13 -4
  212. package/corpus/templates/factory/server/plugins/factory-migrations.ts +148 -4
  213. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +4 -6
  214. package/corpus/templates/factory/vitest.config.ts +17 -2
  215. package/corpus/templates/forms/.agents/skills/secrets/SKILL.md +11 -4
  216. package/corpus/templates/forms/app/routes/_app.settings.tsx +4 -1
  217. package/corpus/templates/forms/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  218. package/corpus/templates/forms/server/lib/public-form-ssr.ts +11 -1
  219. package/corpus/templates/forms/vitest.config.ts +1 -0
  220. package/corpus/templates/macros/.agents/skills/secrets/SKILL.md +11 -4
  221. package/corpus/templates/macros/app/routes.ts +3 -1
  222. package/corpus/templates/macros/vitest.config.ts +6 -1
  223. package/corpus/templates/mail/.agents/skills/secrets/SKILL.md +11 -4
  224. package/corpus/templates/mail/actions/manage-gmail-filters.ts +10 -2
  225. package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +100 -37
  226. package/corpus/templates/mail/app/components/email/IntegrationsSidebar.tsx +14 -2
  227. package/corpus/templates/mail/app/components/layout/AppLayout.tsx +66 -36
  228. package/corpus/templates/mail/app/hooks/use-google-auth.ts +2 -0
  229. package/corpus/templates/mail/app/lib/google-oauth-setup.ts +17 -0
  230. package/corpus/templates/mail/app/pages/InboxPage.tsx +69 -9
  231. package/corpus/templates/mail/app/routes/$.tsx +9 -0
  232. package/corpus/templates/mail/app/routes/$view.$threadId.tsx +23 -1
  233. package/corpus/templates/mail/app/routes/$view.tsx +47 -1
  234. package/corpus/templates/mail/app/routes.ts +3 -1
  235. package/corpus/templates/mail/changelog/2026-08-22-gmail-can-now-connect-with-the-shared-google-oauth.md +6 -0
  236. package/corpus/templates/mail/changelog/2026-08-22-gmail-filters-now-shows-the-real-error.md +6 -0
  237. package/corpus/templates/mail/changelog/2026-08-22-unknown-mail-urls-now-show-the-404-page.md +6 -0
  238. package/corpus/templates/mail/server/handlers/google-auth.ts +11 -2
  239. package/corpus/templates/mail/server/lib/google-auth.ts +92 -12
  240. package/corpus/templates/mail/server/onboarding.ts +66 -18
  241. package/corpus/templates/mail/vitest.config.ts +6 -1
  242. package/corpus/templates/plan/.agents/skills/secrets/SKILL.md +11 -4
  243. package/corpus/templates/plan/app/routes/settings.tsx +4 -1
  244. package/corpus/templates/plan/app/routes.ts +3 -1
  245. package/corpus/templates/plan/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  246. package/corpus/templates/plan/netlify.toml +1 -1
  247. package/corpus/templates/slides/.agents/skills/secrets/SKILL.md +11 -4
  248. package/corpus/templates/slides/actions/patch-deck.ts +79 -10
  249. package/corpus/templates/slides/actions/update-slide.ts +11 -1
  250. package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +14 -4
  251. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +10 -52
  252. package/corpus/templates/slides/app/components/editor/GoogleDocImportHint.tsx +8 -53
  253. package/corpus/templates/slides/app/components/editor/GoogleDriveConnectionCta.tsx +9 -75
  254. package/corpus/templates/slides/app/components/editor/GoogleSlidesReferenceImport.tsx +8 -60
  255. package/corpus/templates/slides/app/components/editor/SlideContextToolbar.tsx +10 -2
  256. package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +19 -7
  257. package/corpus/templates/slides/app/lib/sanitize-slide-html.ts +49 -36
  258. package/corpus/templates/slides/app/routes/access-request.approve.tsx +16 -9
  259. package/corpus/templates/slides/app/routes.ts +3 -1
  260. package/corpus/templates/slides/changelog/2026-08-22-already-uploaded-chat-images-are-no-longer-dropped.md +6 -0
  261. package/corpus/templates/slides/changelog/2026-08-22-google-drive-and-slides-can-now-connect-with-the-shared-google-oauth.md +6 -0
  262. package/corpus/templates/slides/changelog/2026-08-22-multi-slide-repairs-now-report-slides-that-still-overflow.md +6 -0
  263. package/corpus/templates/slides/changelog/2026-08-22-update-slide-now-reports-which-batched-edit-was-skipped.md +6 -0
  264. package/corpus/templates/slides/server/handlers/google-docs-auth.ts +52 -1
  265. package/corpus/templates/slides/server/lib/chat-attachments.ts +29 -3
  266. package/corpus/templates/slides/server/lib/google-docs-oauth.ts +66 -16
  267. package/corpus/templates/slides/server/lib/slide-content-patch.ts +13 -2
  268. package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -2
  269. package/corpus/templates/slides/tsconfig.json +5 -0
  270. package/corpus/templates/slides/vitest.config.ts +6 -1
  271. package/corpus/templates/tasks/.agents/skills/secrets/SKILL.md +11 -4
  272. package/corpus/templates/tasks/app/routes/settings.tsx +4 -1
  273. package/corpus/templates/tasks/app/routes.ts +3 -1
  274. package/corpus/templates/tasks/changelog/2026-08-22-the-extensions-link-now-opens-the-extensions-tab-instead-o.md +6 -0
  275. package/corpus/templates/tasks/vitest.config.ts +7 -1
  276. package/dist/action.d.ts +91 -0
  277. package/dist/action.js +50 -0
  278. package/dist/agent/abort-reasons.d.ts +38 -0
  279. package/dist/agent/abort-reasons.js +49 -0
  280. package/dist/agent/engine/ai-sdk-engine.js +8 -5
  281. package/dist/agent/engine/anthropic-engine.js +7 -5
  282. package/dist/agent/engine/first-event-timeout.d.ts +42 -17
  283. package/dist/agent/engine/first-event-timeout.js +67 -25
  284. package/dist/agent/production-agent.d.ts +23 -0
  285. package/dist/agent/production-agent.js +107 -102
  286. package/dist/agent/run-loop-with-resume.d.ts +2 -28
  287. package/dist/agent/run-loop-with-resume.js +25 -40
  288. package/dist/agent/run-manager.js +5 -4
  289. package/dist/agent/run-store.d.ts +55 -0
  290. package/dist/agent/run-store.js +124 -1
  291. package/dist/agent/tool-search.js +2 -1
  292. package/dist/agent/types.d.ts +9 -4
  293. package/dist/app-config/auth.d.ts +1 -0
  294. package/dist/app-config/auth.js +7 -0
  295. package/dist/app-config/configuration-error.d.ts +11 -0
  296. package/dist/app-config/configuration-error.js +14 -0
  297. package/dist/app-config/index.d.ts +1 -0
  298. package/dist/app-config/index.js +1 -0
  299. package/dist/app-config/integrations.d.ts +1 -0
  300. package/dist/app-config/integrations.js +10 -0
  301. package/dist/app-config/plugins.d.ts +34 -0
  302. package/dist/app-config/plugins.js +39 -0
  303. package/dist/app-config/run-lifecycle-invariants.d.ts +18 -9
  304. package/dist/app-config/run-lifecycle-invariants.js +18 -25
  305. package/dist/app-config/schema.d.ts +17 -0
  306. package/dist/app-config/schema.js +2 -0
  307. package/dist/chat-threads/schema-migrations.js +20 -0
  308. package/dist/chat-threads/store.js +21 -4
  309. package/dist/cli/native-dependencies.d.ts +4 -0
  310. package/dist/cli/native-dependencies.js +15 -0
  311. package/dist/client/EnvironmentBadge.d.ts +1 -1
  312. package/dist/client/EnvironmentBadge.js +40 -5
  313. package/dist/client/MultiTabAssistantChat.d.ts +1 -1
  314. package/dist/client/MultiTabAssistantChat.js +35 -14
  315. package/dist/client/agent-chat/index.d.ts +1 -1
  316. package/dist/client/agent-chat/index.js +1 -1
  317. package/dist/client/agent-page/use-jobs.d.ts +2 -1
  318. package/dist/client/agent-page/use-jobs.js +3 -5
  319. package/dist/client/agent-sidebar-state.js +3 -1
  320. package/dist/client/blocks/library/code-tabs.js +5 -0
  321. package/dist/client/blocks/library/code.js +1 -0
  322. package/dist/client/chat-first/apps-rail.js +2 -2
  323. package/dist/client/chat-model-groups.d.ts +12 -0
  324. package/dist/client/chat-model-groups.js +3 -2
  325. package/dist/client/integrations/GoogleProductLogo.d.ts +5 -0
  326. package/dist/client/integrations/GoogleProductLogo.js +45 -0
  327. package/dist/client/integrations/index.d.ts +2 -0
  328. package/dist/client/integrations/index.js +2 -0
  329. package/dist/client/integrations/workspace-provider-oauth.d.ts +8 -0
  330. package/dist/client/integrations/workspace-provider-oauth.js +13 -0
  331. package/dist/client/resources/mcp-integration-catalog.js +0 -29
  332. package/dist/client/settings/SettingsTabsPage.js +10 -6
  333. package/dist/client/sharing/ShareButton.js +11 -2
  334. package/dist/client/use-chat-models.d.ts +6 -0
  335. package/dist/client/use-chat-models.js +10 -0
  336. package/dist/client/use-db-sync.js +27 -9
  337. package/dist/collab/routes.d.ts +1 -1
  338. package/dist/collab/struct-routes.d.ts +1 -1
  339. package/dist/connections/catalog.d.ts +111 -9
  340. package/dist/connections/catalog.js +86 -30
  341. package/dist/db/create-get-db.js +18 -0
  342. package/dist/db/ddl-guard.d.ts +0 -4
  343. package/dist/db/ddl-guard.js +46 -0
  344. package/dist/deploy/build.d.ts +19 -0
  345. package/dist/deploy/build.js +190 -16
  346. package/dist/deploy/function-bundle.d.ts +45 -0
  347. package/dist/deploy/function-bundle.js +337 -0
  348. package/dist/deploy/workspace-deploy.js +19 -1
  349. package/dist/eject/workspace-connections.js +4 -0
  350. package/dist/email-catalog/registry.d.ts +4 -0
  351. package/dist/email-catalog/registry.js +79 -14
  352. package/dist/extensions/content-patch.js +14 -2
  353. package/dist/integrations/plugin.d.ts +10 -0
  354. package/dist/integrations/plugin.js +40 -6
  355. package/dist/jobs/actions/run-automation-now.d.ts +2 -1
  356. package/dist/jobs/actions/run-automation-now.js +11 -5
  357. package/dist/jobs/frontmatter.js +53 -2
  358. package/dist/jobs/run-now.d.ts +11 -1
  359. package/dist/jobs/run-now.js +42 -7
  360. package/dist/jobs/scheduler.d.ts +1 -0
  361. package/dist/jobs/scheduler.js +2 -1
  362. package/dist/localization/core-messages/ar-SA.js +3 -0
  363. package/dist/localization/core-messages/de-DE.js +3 -0
  364. package/dist/localization/core-messages/en-US.d.ts +3 -0
  365. package/dist/localization/core-messages/en-US.js +3 -0
  366. package/dist/localization/core-messages/es-ES.js +3 -0
  367. package/dist/localization/core-messages/fr-FR.js +3 -0
  368. package/dist/localization/core-messages/hi-IN.js +3 -0
  369. package/dist/localization/core-messages/ja-JP.js +3 -0
  370. package/dist/localization/core-messages/ko-KR.js +3 -0
  371. package/dist/localization/core-messages/pt-BR.js +3 -0
  372. package/dist/localization/core-messages/zh-CN.js +3 -0
  373. package/dist/localization/core-messages/zh-TW.js +3 -0
  374. package/dist/localization/core-messages.d.ts +3 -0
  375. package/dist/localization/default-messages.d.ts +2 -5
  376. package/dist/localization/default-messages.js +2 -5
  377. package/dist/mcp/build-server.d.ts +9 -0
  378. package/dist/mcp/build-server.js +37 -8
  379. package/dist/mcp-client/oauth-client.d.ts +7 -0
  380. package/dist/mcp-client/oauth-client.js +12 -1
  381. package/dist/oauth-tokens/index.d.ts +1 -1
  382. package/dist/oauth-tokens/index.js +1 -1
  383. package/dist/oauth-tokens/lifecycle.d.ts +11 -0
  384. package/dist/oauth-tokens/lifecycle.js +17 -0
  385. package/dist/oauth-tokens/store.js +7 -0
  386. package/dist/observability/posthog-ai.d.ts +15 -1
  387. package/dist/observability/posthog-ai.js +24 -12
  388. package/dist/observability/traces.js +158 -28
  389. package/dist/onboarding/app-profile.js +2 -2
  390. package/dist/onboarding/plugin.js +10 -2
  391. package/dist/onboarding/types.d.ts +2 -0
  392. package/dist/provider-api/actions/custom-provider-registration.d.ts +1 -1
  393. package/dist/provider-api/actions/provider-api.d.ts +2 -2
  394. package/dist/provider-api/index.js +2 -0
  395. package/dist/resources/handlers.d.ts +2 -2
  396. package/dist/resources/store.js +13 -4
  397. package/dist/scripts/agent-engines/list-agent-engines.js +29 -3
  398. package/dist/secrets/register-framework-secrets.js +1 -1
  399. package/dist/server/action-discovery.js +5 -0
  400. package/dist/server/agent-chat/action-filters-a2a.d.ts +27 -3
  401. package/dist/server/agent-chat/action-filters-a2a.js +48 -9
  402. package/dist/server/agent-chat-plugin.js +36 -9
  403. package/dist/server/agent-discovery.js +43 -20
  404. package/dist/server/auth.js +18 -16
  405. package/dist/server/beta-opt-out-html.js +45 -4
  406. package/dist/server/better-auth-instance.d.ts +2 -1
  407. package/dist/server/better-auth-instance.js +37 -7
  408. package/dist/server/builder-design-systems.d.ts +4 -1
  409. package/dist/server/builder-design-systems.js +87 -6
  410. package/dist/server/builder-oauth.d.ts +1 -7
  411. package/dist/server/builder-oauth.js +80 -163
  412. package/dist/server/core-routes-plugin.d.ts +29 -0
  413. package/dist/server/core-routes-plugin.js +100 -20
  414. package/dist/server/default-plugins.d.ts +18 -0
  415. package/dist/server/default-plugins.js +22 -0
  416. package/dist/server/edge.d.ts +1 -0
  417. package/dist/server/edge.js +1 -0
  418. package/dist/server/framework-request-handler.js +31 -3
  419. package/dist/server/google-oauth.d.ts +3 -0
  420. package/dist/server/google-oauth.js +3 -0
  421. package/dist/server/index.d.ts +4 -4
  422. package/dist/server/index.js +3 -3
  423. package/dist/server/onboarding-html.js +37 -3
  424. package/dist/server/realtime-token.d.ts +1 -1
  425. package/dist/server/workspace-provider-oauth.d.ts +6 -1
  426. package/dist/server/workspace-provider-oauth.js +72 -20
  427. package/dist/shared/agent-sidebar-url.d.ts +1 -0
  428. package/dist/shared/agent-sidebar-url.js +1 -0
  429. package/dist/shared/environment-lanes.d.ts +2 -0
  430. package/dist/shared/environment-lanes.js +3 -1
  431. package/dist/shared/index.d.ts +3 -1
  432. package/dist/shared/index.js +3 -1
  433. package/dist/shared/surface-visibility.d.ts +31 -0
  434. package/dist/shared/surface-visibility.js +57 -0
  435. package/dist/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  436. package/dist/templates/chat/app/routes.ts +3 -1
  437. package/dist/templates/chat/vitest.config.ts +8 -0
  438. package/dist/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  439. package/dist/templates/default/app/routes.ts +3 -1
  440. package/dist/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  441. package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
  442. package/dist/tracking/registry.d.ts +11 -0
  443. package/dist/tracking/registry.js +5 -2
  444. package/dist/triggers/actions.js +10 -3
  445. package/dist/usage/store.js +23 -3
  446. package/dist/user-profile/actions/get-auth-methods.js +18 -5
  447. package/dist/vite/client.js +33 -7
  448. package/docs/content/actions-access-control.mdx +43 -4
  449. package/docs/content/actions-defining.mdx +16 -0
  450. package/docs/content/authentication.mdx +40 -21
  451. package/docs/content/environment-variables.mdx +1 -0
  452. package/docs/content/template-clips-capture-everywhere.mdx +29 -30
  453. package/docs/content/template-clips-developers.mdx +4 -4
  454. package/docs/content/template-clips.mdx +3 -1
  455. package/package.json +2 -2
  456. package/src/eject/workspace-connections.ts +4 -0
  457. package/src/templates/chat/.agents/skills/secrets/SKILL.md +11 -4
  458. package/src/templates/chat/app/routes.ts +3 -1
  459. package/src/templates/chat/vitest.config.ts +8 -0
  460. package/src/templates/default/.agents/skills/secrets/SKILL.md +11 -4
  461. package/src/templates/default/app/routes.ts +3 -1
  462. package/src/templates/headless/.agents/skills/secrets/SKILL.md +11 -4
  463. package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +11 -4
@@ -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
  }),
@@ -415,6 +415,15 @@ export const DESIGN_SHORTCUTS: readonly DesignShortcutDefinition[] = [
415
415
  labelKey: "designEditor.keyboardShortcuts.commands.swapFillStroke",
416
416
  handler: "onSwapFillStroke",
417
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
+ }),
418
427
 
419
428
  shortcut({
420
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
@@ -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",
@@ -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
+ }